diff --git a/force-app/main/default/classes/SummitEventsAdditionalQuestionsCtlr.cls b/force-app/main/default/classes/SummitEventsAdditionalQuestionsCtlr.cls index 357fc653..7520826a 100644 --- a/force-app/main/default/classes/SummitEventsAdditionalQuestionsCtlr.cls +++ b/force-app/main/default/classes/SummitEventsAdditionalQuestionsCtlr.cls @@ -21,7 +21,7 @@ public with sharing class SummitEventsAdditionalQuestionsCtlr { public List questionWrapper { get; set; } private Id incomingRegId { get; set; } public Map lookUpDisplayValue { get; set; } - + public String nextUrl { get; set; } public class questionItem { public String questionId { get; set; } @@ -85,6 +85,7 @@ public with sharing class SummitEventsAdditionalQuestionsCtlr { templateSelected = SummitEventsShared.getTemplate(eventPage.Template__c); pageFlow = SummitEventsShared.getPageFlow(eventInformation.eventId, eventInstance.Instance_Title__c, ApexPages.currentPage(), eventInstance.Instance_Start_Date__c, eventInstance.Instance_End_Date__c); + nextUrl = pageFlow.get('Next').getUrl().toLowerCase(); formattedNavDate = SummitEventsShared.navBreadcrumbBuilder(eventInstance); instanceName = eventInstance.Name; startTimeString = SummitEventsShared.formatTime(eventInstance.Instance_Start_Time__c, false); diff --git a/force-app/main/default/classes/SummitEventsRegistration.cls b/force-app/main/default/classes/SummitEventsRegistration.cls index 56ba94a6..56e764ec 100644 --- a/force-app/main/default/classes/SummitEventsRegistration.cls +++ b/force-app/main/default/classes/SummitEventsRegistration.cls @@ -87,26 +87,27 @@ public class SummitEventsRegistration { ]; List activityUpdates = new List(); + List emailsToSend = new List(); //loop through affected event registrations - have status change from old - for (Summit_Events_Registration__c areg : affectedRegs) { + for (Summit_Events_Registration__c registration : affectedRegs) { //Loop through gather email templates to get template and use registration fields to fill in hooks for (Summit_Events_Email__c em : matchEmail) { Boolean statusMatch = false; Boolean bccRegStatusMatch = false; List BCCsToGo = new List(); - if (em.Event__c.equals(areg.Event__c)) { + if (em.Event__c.equals(registration.Event__c)) { statusMatch = false; - if (String.isNotBlank(em.Action_Sub_status__c) && String.isNotBlank(areg.Substatus__c)) { - if (em.Action_Sub_status__c.equals(areg.Substatus__c) && em.Action_Status__c.equalsIgnoreCase(areg.Status__c)) { + if (String.isNotBlank(em.Action_Sub_status__c) && String.isNotBlank(registration.Substatus__c)) { + if (em.Action_Sub_status__c.equals(registration.Substatus__c) && em.Action_Status__c.equalsIgnoreCase(registration.Status__c)) { statusMatch = true; } - } else if (em.Action_Status__c.equals(areg.Status__c) && String.isBlank(em.Action_Sub_status__c) && String.isBlank(areg.Substatus__c)) { + } else if (em.Action_Status__c.equals(registration.Status__c) && String.isBlank(em.Action_Sub_status__c) && String.isBlank(registration.Substatus__c)) { statusMatch = true; - if (String.isNotBlank(areg.BCC_Transactional_Email_Statuses__c)) { - if (areg.BCC_Transactional_Email_Statuses__c.contains(em.Action_Status__c)) { + if (String.isNotBlank(registration.BCC_Transactional_Email_Statuses__c)) { + if (registration.BCC_Transactional_Email_Statuses__c.contains(em.Action_Status__c)) { bccRegStatusMatch = true; } } @@ -114,10 +115,10 @@ public class SummitEventsRegistration { //Build the BCC list. No duplicate emails. Split strings. BCCsToGo = addToEmailList(em.BCC_Email__c, BCCsToGo); - BCCsToGo = addToEmailList(areg.Registrant_Other_Email__c, BCCsToGo); - BCCsToGo = addToEmailList(areg.Registrant_Parent_Email__c, BCCsToGo); + BCCsToGo = addToEmailList(registration.Registrant_Other_Email__c, BCCsToGo); + BCCsToGo = addToEmailList(registration.Registrant_Parent_Email__c, BCCsToGo); if (bccRegStatusMatch) { - BCCsToGo = addToEmailList(areg.BCC_Transactional_Emails__c, BCCsToGo); + BCCsToGo = addToEmailList(registration.BCC_Transactional_Emails__c, BCCsToGo); } if (statusMatch) { @@ -147,7 +148,7 @@ public class SummitEventsRegistration { //Get the value for hook from registration have to remove any registration object names since we are already in the object String found = matcher2.group(1).replace(namespace + 'Summit_Events_Registration__c.', ''); try { - found = String.valueOf(areg.get(found)); + found = String.valueOf(registration.get(found)); } catch (Exception e) { found = ''; } @@ -156,8 +157,8 @@ public class SummitEventsRegistration { if (String.isBlank(found)) { found = ''; } - //replace all hooks with found values from regstration + //replace all hooks with found values from registration if (emailTags.contains(matcher2.group(1))) { found = found.replace('_HL_ENCODED_', ' 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEvents.page b/force-app/main/default/pages/SummitEvents.page index e2c500f4..e5781ce6 100644 --- a/force-app/main/default/pages/SummitEvents.page +++ b/force-app/main/default/pages/SummitEvents.page @@ -26,7 +26,7 @@ Created by Thaddaeus Dahlberg on 5/1/2018. const communityBaseURL = '{!communityBaseURL}'; - + diff --git a/force-app/main/default/pages/SummitEvents.page-meta.xml b/force-app/main/default/pages/SummitEvents.page-meta.xml index 859d3274..f89df55e 100644 --- a/force-app/main/default/pages/SummitEvents.page-meta.xml +++ b/force-app/main/default/pages/SummitEvents.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsAddToCalendar.page-meta.xml b/force-app/main/default/pages/SummitEventsAddToCalendar.page-meta.xml index cbfd6ff9..84df7547 100644 --- a/force-app/main/default/pages/SummitEventsAddToCalendar.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsAddToCalendar.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsAdditionalQuestions.page b/force-app/main/default/pages/SummitEventsAdditionalQuestions.page index d886d76a..68dd6ed7 100644 --- a/force-app/main/default/pages/SummitEventsAdditionalQuestions.page +++ b/force-app/main/default/pages/SummitEventsAdditionalQuestions.page @@ -277,7 +277,7 @@

- +

diff --git a/force-app/main/default/pages/SummitEventsAdditionalQuestions.page-meta.xml b/force-app/main/default/pages/SummitEventsAdditionalQuestions.page-meta.xml index 38640e07..cc0eb172 100644 --- a/force-app/main/default/pages/SummitEventsAdditionalQuestions.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsAdditionalQuestions.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsCancelReview.page b/force-app/main/default/pages/SummitEventsCancelReview.page index 1235dd07..a16e6a2a 100644 --- a/force-app/main/default/pages/SummitEventsCancelReview.page +++ b/force-app/main/default/pages/SummitEventsCancelReview.page @@ -30,7 +30,7 @@ Created by Thaddaeus Dahlberg on 5/1/2018.
- +
diff --git a/force-app/main/default/pages/SummitEventsCancelReview.page-meta.xml b/force-app/main/default/pages/SummitEventsCancelReview.page-meta.xml index deb7f91f..424ce7bb 100644 --- a/force-app/main/default/pages/SummitEventsCancelReview.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsCancelReview.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsConfirmation.page-meta.xml b/force-app/main/default/pages/SummitEventsConfirmation.page-meta.xml index a710ee06..64a6e60e 100644 --- a/force-app/main/default/pages/SummitEventsConfirmation.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsConfirmation.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsDonation.page-meta.xml b/force-app/main/default/pages/SummitEventsDonation.page-meta.xml index b368160e..9c1b7217 100644 --- a/force-app/main/default/pages/SummitEventsDonation.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsDonation.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsHostAssignment.page-meta.xml b/force-app/main/default/pages/SummitEventsHostAssignment.page-meta.xml index a6d27df2..3a3925ba 100644 --- a/force-app/main/default/pages/SummitEventsHostAssignment.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsHostAssignment.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsLetterheadLookup.page-meta.xml b/force-app/main/default/pages/SummitEventsLetterheadLookup.page-meta.xml index 694b2bb0..5e4566bd 100644 --- a/force-app/main/default/pages/SummitEventsLetterheadLookup.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsLetterheadLookup.page-meta.xml @@ -1,6 +1,6 @@ - 51.0 + 56.0 true false diff --git a/force-app/main/default/pages/SummitEventsParkingPass.page-meta.xml b/force-app/main/default/pages/SummitEventsParkingPass.page-meta.xml index 5ae880e7..ebf086e0 100644 --- a/force-app/main/default/pages/SummitEventsParkingPass.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsParkingPass.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsPrintItineraries.page-meta.xml b/force-app/main/default/pages/SummitEventsPrintItineraries.page-meta.xml index 7cc68946..2eee5a86 100644 --- a/force-app/main/default/pages/SummitEventsPrintItineraries.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsPrintItineraries.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsRegister.page-meta.xml b/force-app/main/default/pages/SummitEventsRegister.page-meta.xml index cd1fcb1e..8dc2c142 100644 --- a/force-app/main/default/pages/SummitEventsRegister.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsRegister.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsRegisterAppointments.page-meta.xml b/force-app/main/default/pages/SummitEventsRegisterAppointments.page-meta.xml index ad21ac4f..08f9ef1c 100644 --- a/force-app/main/default/pages/SummitEventsRegisterAppointments.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsRegisterAppointments.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsRegisterGuests.page-meta.xml b/force-app/main/default/pages/SummitEventsRegisterGuests.page-meta.xml index 3ec419b8..537f005e 100644 --- a/force-app/main/default/pages/SummitEventsRegisterGuests.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsRegisterGuests.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/SummitEventsSubmit.page-meta.xml b/force-app/main/default/pages/SummitEventsSubmit.page-meta.xml index c9bbdefb..6b3f0fc5 100644 --- a/force-app/main/default/pages/SummitEventsSubmit.page-meta.xml +++ b/force-app/main/default/pages/SummitEventsSubmit.page-meta.xml @@ -1,7 +1,7 @@ 56.0 - false + true false diff --git a/force-app/main/default/pages/crowncollege2020.page-meta.xml b/force-app/main/default/pages/crowncollege2020.page-meta.xml index e2d5c583..3b0964d7 100644 --- a/force-app/main/default/pages/crowncollege2020.page-meta.xml +++ b/force-app/main/default/pages/crowncollege2020.page-meta.xml @@ -1,6 +1,6 @@ - 49.0 + 56.0 false false diff --git a/force-app/main/default/staticresources/SummitEventsAssets/css/calendar.css b/force-app/main/default/staticresources/SummitEventsAssets/css/calendar.css index fbb87007..c02f8486 100644 --- a/force-app/main/default/staticresources/SummitEventsAssets/css/calendar.css +++ b/force-app/main/default/staticresources/SummitEventsAssets/css/calendar.css @@ -1,33 +1,40 @@ .SummitEventsItem { display: block; white-space: normal; - padding: 4px 2px; - font-size: 1.1em; - line-height: 1.4em !important; + padding: 4px 3px; + font-size: .9rem; + line-height: 1.2rem !important; width: 100%; z-index: 0; + border: none; } -.SummitEventsItem:hover { +.fc-daygrid-event-harness a:hover, .fc-list-event-title a:hover { text-decoration: none !important; } .fc-listMonth-view .SummitEventsItem { - font-size: 1.1em; - line-height: 1.4em !important; + /*font-size: 1.1rem;*/ + /*line-height: 1.4rem !important;*/ +} + +td.fc-list-event-graphic { + display: none; } .eventClosed .SummitEventsItem, .eventClosed .SummitEventsItem * { color: gray !important; } + .slds-popover__body { - display:block; + display: block; } + .SummitEventsItem .summitEventsTitle { z-index: 0; } .SummitEventsItem .summitEventsTimes { - font-size: .85em; + font-size: .75rem; z-index: 0; } \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/dist/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/dist/index.global.js deleted file mode 100644 index 238ebf69..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/dist/index.global.js +++ /dev/null @@ -1,14041 +0,0 @@ -/*! -FullCalendar Standard Bundle v6.0.1 -Docs & License: https://fullcalendar.io/docs/initialize-globals -(c) 2022 Adam Shaw -*/ -var FullCalendar = (function (exports) { - 'use strict'; - - var n,l$1,u$1,i$1,t,o,r$1,f$1={},e$1=[],c$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function a$1(n){var l=n.parentNode;l&&l.removeChild(n);}function h(l,u,i){var t,o,r,f={};for(r in u)"key"==r?t=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v$1(l,f,t,o,null)}function v$1(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u$1:r};return null==r&&null!=l$1.vnode&&l$1.vnode(f),f}function y(){return {current:null}}function p(n){return n.children}function d(n,l){this.props=n,this.context=l;}function _(n,l){if(null==l)return n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l0?v$1(k.type,k.props,k.key,k.ref?k.ref:null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y3;)e.pop()();if(e[1]>>1,1),e.i.removeChild(n);}}),P$1(h(P,{context:e.context},n.__v),e.l)):e.l&&e.componentWillUnmount();}function j(n,e){var r=h($,{__v:n,i:e});return r.containerInfo=e,r}(V.prototype=new d).__a=function(n){var t=this,e=F(t.__v),r=t.o.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),W(t,n,r)):u();};e?e(o):o();}},V.prototype.render=function(n){this.u=null,this.o=new Map;var t=x$1(n.children);n.revealOrder&&"b"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return n.children},V.prototype.componentDidUpdate=V.prototype.componentDidMount=function(){var n=this;this.o.forEach(function(t,e){W(n,e,t);});};var z="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,B=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,H="undefined"!=typeof document,Z=function(n){return ("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(n)};d.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(d.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n});}});});var G=l$1.event;function J(){}function K(){return this.cancelBubble}function Q(){return this.defaultPrevented}l$1.event=function(n){return G&&(n=G(n)),n.persist=J,n.isPropagationStopped=K,n.isDefaultPrevented=Q,n.nativeEvent=n};var nn={configurable:!0,get:function(){return this.class}},tn=l$1.vnode;l$1.vnode=function(n){var t=n.type,e=n.props,u=e;if("string"==typeof t){var o=-1===t.indexOf("-");for(var i in u={},e){var l=e[i];H&&"children"===i&&"noscript"===t||"value"===i&&"defaultValue"in e&&null==l||("defaultValue"===i&&"value"in e&&null==e.value?i="value":"download"===i&&!0===l?l="":/ondoubleclick/i.test(i)?i="ondblclick":/^onchange(textarea|input)/i.test(i+t)&&!Z(e.type)?i="oninput":/^onfocus$/i.test(i)?i="onfocusin":/^onblur$/i.test(i)?i="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i)?i=i.toLowerCase():o&&B.test(i)?i=i.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===l&&(l=void 0),/^oninput$/i.test(i)&&(i=i.toLowerCase(),u[i]&&(i="oninputCapture")),u[i]=l);}"select"==t&&u.multiple&&Array.isArray(u.value)&&(u.value=x$1(e.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value);})),"select"==t&&null!=u.defaultValue&&(u.value=x$1(e.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value;})),n.props=u,e.class!=e.className&&(nn.enumerable="className"in e,null!=e.className&&(u.class=e.className),Object.defineProperty(u,"className",nn));}n.$$typeof=z,tn&&tn(n);};var en=l$1.__r;l$1.__r=function(n){en&&en(n),n.__c;}; - - function injectStyles(css) { - if (!css || typeof document === 'undefined') { - return; - } - const head = document.head || document.getElementsByTagName('head')[0]; - const style = document.createElement('style'); - style.type = 'text/css'; - head.appendChild(style); - if (style.styleSheet) { - style.styleSheet.cssText = css; - } - else { - style.appendChild(document.createTextNode(css)); - } - } - - class DelayedRunner { - constructor(drainedOption) { - this.drainedOption = drainedOption; - this.isRunning = false; - this.isDirty = false; - this.pauseDepths = {}; - this.timeoutId = 0; - } - request(delay) { - this.isDirty = true; - if (!this.isPaused()) { - this.clearTimeout(); - if (delay == null) { - this.tryDrain(); - } - else { - this.timeoutId = setTimeout(// NOT OPTIMAL! TODO: look at debounce - this.tryDrain.bind(this), delay); - } - } - } - pause(scope = '') { - let { pauseDepths } = this; - pauseDepths[scope] = (pauseDepths[scope] || 0) + 1; - this.clearTimeout(); - } - resume(scope = '', force) { - let { pauseDepths } = this; - if (scope in pauseDepths) { - if (force) { - delete pauseDepths[scope]; - } - else { - pauseDepths[scope] -= 1; - let depth = pauseDepths[scope]; - if (depth <= 0) { - delete pauseDepths[scope]; - } - } - this.tryDrain(); - } - } - isPaused() { - return Object.keys(this.pauseDepths).length; - } - tryDrain() { - if (!this.isRunning && !this.isPaused()) { - this.isRunning = true; - while (this.isDirty) { - this.isDirty = false; - this.drained(); // might set isDirty to true again - } - this.isRunning = false; - } - } - clear() { - this.clearTimeout(); - this.isDirty = false; - this.pauseDepths = {}; - } - clearTimeout() { - if (this.timeoutId) { - clearTimeout(this.timeoutId); - this.timeoutId = 0; - } - } - drained() { - if (this.drainedOption) { - this.drainedOption(); - } - } - } - - const { hasOwnProperty } = Object.prototype; - // Merges an array of objects into a single object. - // The second argument allows for an array of property names who's object values will be merged together. - function mergeProps(propObjs, complexPropsMap) { - let dest = {}; - if (complexPropsMap) { - for (let name in complexPropsMap) { - let complexObjs = []; - // collect the trailing object values, stopping when a non-object is discovered - for (let i = propObjs.length - 1; i >= 0; i -= 1) { - let val = propObjs[i][name]; - if (typeof val === 'object' && val) { // non-null object - complexObjs.unshift(val); - } - else if (val !== undefined) { - dest[name] = val; // if there were no objects, this value will be used - break; - } - } - // if the trailing values were objects, use the merged value - if (complexObjs.length) { - dest[name] = mergeProps(complexObjs); - } - } - } - // copy values into the destination, going from last to first - for (let i = propObjs.length - 1; i >= 0; i -= 1) { - let props = propObjs[i]; - for (let name in props) { - if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign - dest[name] = props[name]; - } - } - } - return dest; - } - function filterHash(hash, func) { - let filtered = {}; - for (let key in hash) { - if (func(hash[key], key)) { - filtered[key] = hash[key]; - } - } - return filtered; - } - function mapHash(hash, func) { - let newHash = {}; - for (let key in hash) { - newHash[key] = func(hash[key], key); - } - return newHash; - } - function arrayToHash(a) { - let hash = {}; - for (let item of a) { - hash[item] = true; - } - return hash; - } - // TODO: reassess browser support - // https://caniuse.com/?search=object.values - function hashValuesToArray(obj) { - let a = []; - for (let key in obj) { - a.push(obj[key]); - } - return a; - } - function isPropsEqual(obj0, obj1) { - if (obj0 === obj1) { - return true; - } - for (let key in obj0) { - if (hasOwnProperty.call(obj0, key)) { - if (!(key in obj1)) { - return false; - } - } - } - for (let key in obj1) { - if (hasOwnProperty.call(obj1, key)) { - if (obj0[key] !== obj1[key]) { - return false; - } - } - } - return true; - } - function getUnequalProps(obj0, obj1) { - let keys = []; - for (let key in obj0) { - if (hasOwnProperty.call(obj0, key)) { - if (!(key in obj1)) { - keys.push(key); - } - } - } - for (let key in obj1) { - if (hasOwnProperty.call(obj1, key)) { - if (obj0[key] !== obj1[key]) { - keys.push(key); - } - } - } - return keys; - } - function compareObjs(oldProps, newProps, equalityFuncs = {}) { - if (oldProps === newProps) { - return true; - } - for (let key in newProps) { - if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ; - else { - return false; - } - } - // check for props that were omitted in the new - for (let key in oldProps) { - if (!(key in newProps)) { - return false; - } - } - return true; - } - /* - assumed "true" equality for handler names like "onReceiveSomething" - */ - function isObjValsEqual(val0, val1, comparator) { - if (val0 === val1 || comparator === true) { - return true; - } - if (comparator) { - return comparator(val0, val1); - } - return false; - } - function collectFromHash(hash, startIndex = 0, endIndex, step = 1) { - let res = []; - if (endIndex == null) { - endIndex = Object.keys(hash).length; - } - for (let i = startIndex; i < endIndex; i += step) { - let val = hash[i]; - if (val !== undefined) { // will disregard undefined for sparse arrays - res.push(val); - } - } - return res; - } - - // TODO: new util arrayify? - function removeExact(array, exactVal) { - let removeCnt = 0; - let i = 0; - while (i < array.length) { - if (array[i] === exactVal) { - array.splice(i, 1); - removeCnt += 1; - } - else { - i += 1; - } - } - return removeCnt; - } - function isArraysEqual(a0, a1, equalityFunc) { - if (a0 === a1) { - return true; - } - let len = a0.length; - let i; - if (len !== a1.length) { // not array? or not same length? - return false; - } - for (i = 0; i < len; i += 1) { - if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) { - return false; - } - } - return true; - } - - function memoize(workerFunc, resEquality, teardownFunc) { - let currentArgs; - let currentRes; - return function (...newArgs) { - if (!currentArgs) { - currentRes = workerFunc.apply(this, newArgs); - } - else if (!isArraysEqual(currentArgs, newArgs)) { - if (teardownFunc) { - teardownFunc(currentRes); - } - let res = workerFunc.apply(this, newArgs); - if (!resEquality || !resEquality(res, currentRes)) { - currentRes = res; - } - } - currentArgs = newArgs; - return currentRes; - }; - } - function memoizeObjArg(workerFunc, resEquality, teardownFunc) { - let currentArg; - let currentRes; - return (newArg) => { - if (!currentArg) { - currentRes = workerFunc.call(this, newArg); - } - else if (!isPropsEqual(currentArg, newArg)) { - if (teardownFunc) { - teardownFunc(currentRes); - } - let res = workerFunc.call(this, newArg); - if (!resEquality || !resEquality(res, currentRes)) { - currentRes = res; - } - } - currentArg = newArg; - return currentRes; - }; - } - function memoizeArraylike(// used at all? - workerFunc, resEquality, teardownFunc) { - let currentArgSets = []; - let currentResults = []; - return (newArgSets) => { - let currentLen = currentArgSets.length; - let newLen = newArgSets.length; - let i = 0; - for (; i < currentLen; i += 1) { - if (!newArgSets[i]) { // one of the old sets no longer exists - if (teardownFunc) { - teardownFunc(currentResults[i]); - } - } - else if (!isArraysEqual(currentArgSets[i], newArgSets[i])) { - if (teardownFunc) { - teardownFunc(currentResults[i]); - } - let res = workerFunc.apply(this, newArgSets[i]); - if (!resEquality || !resEquality(res, currentResults[i])) { - currentResults[i] = res; - } - } - } - for (; i < newLen; i += 1) { - currentResults[i] = workerFunc.apply(this, newArgSets[i]); - } - currentArgSets = newArgSets; - currentResults.splice(newLen); // remove excess - return currentResults; - }; - } - function memoizeHashlike(workerFunc, resEquality, teardownFunc) { - let currentArgHash = {}; - let currentResHash = {}; - return (newArgHash) => { - let newResHash = {}; - for (let key in newArgHash) { - if (!currentResHash[key]) { - newResHash[key] = workerFunc.apply(this, newArgHash[key]); - } - else if (!isArraysEqual(currentArgHash[key], newArgHash[key])) { - if (teardownFunc) { - teardownFunc(currentResHash[key]); - } - let res = workerFunc.apply(this, newArgHash[key]); - newResHash[key] = (resEquality && resEquality(res, currentResHash[key])) - ? currentResHash[key] - : res; - } - else { - newResHash[key] = currentResHash[key]; - } - } - currentArgHash = newArgHash; - currentResHash = newResHash; - return newResHash; - }; - } - - function removeElement(el) { - if (el.parentNode) { - el.parentNode.removeChild(el); - } - } - // Querying - // ---------------------------------------------------------------------------------------------------------------- - function elementClosest(el, selector) { - if (el.closest) { - return el.closest(selector); - // really bad fallback for IE - // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest - } - if (!document.documentElement.contains(el)) { - return null; - } - do { - if (elementMatches(el, selector)) { - return el; - } - el = (el.parentElement || el.parentNode); - } while (el !== null && el.nodeType === 1); - return null; - } - function elementMatches(el, selector) { - let method = el.matches || el.matchesSelector || el.msMatchesSelector; - return method.call(el, selector); - } - // accepts multiple subject els - // returns a real array. good for methods like forEach - // TODO: accept the document - function findElements(container, selector) { - let containers = container instanceof HTMLElement ? [container] : container; - let allMatches = []; - for (let i = 0; i < containers.length; i += 1) { - let matches = containers[i].querySelectorAll(selector); - for (let j = 0; j < matches.length; j += 1) { - allMatches.push(matches[j]); - } - } - return allMatches; - } - // accepts multiple subject els - // only queries direct child elements // TODO: rename to findDirectChildren! - function findDirectChildren(parent, selector) { - let parents = parent instanceof HTMLElement ? [parent] : parent; - let allMatches = []; - for (let i = 0; i < parents.length; i += 1) { - let childNodes = parents[i].children; // only ever elements - for (let j = 0; j < childNodes.length; j += 1) { - let childNode = childNodes[j]; - if (!selector || elementMatches(childNode, selector)) { - allMatches.push(childNode); - } - } - } - return allMatches; - } - // Style - // ---------------------------------------------------------------------------------------------------------------- - const PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i; - function applyStyle(el, props) { - for (let propName in props) { - applyStyleProp(el, propName, props[propName]); - } - } - function applyStyleProp(el, name, val) { - if (val == null) { - el.style[name] = ''; - } - else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) { - el.style[name] = `${val}px`; - } - else { - el.style[name] = val; - } - } - // Event Handling - // ---------------------------------------------------------------------------------------------------------------- - // if intercepting bubbled events at the document/window/body level, - // and want to see originating element (the 'target'), use this util instead - // of `ev.target` because it goes within web-component boundaries. - function getEventTargetViaRoot(ev) { - var _a, _b; - return (_b = (_a = ev.composedPath) === null || _a === void 0 ? void 0 : _a.call(ev)[0]) !== null && _b !== void 0 ? _b : ev.target; - } - // Shadow DOM consuderations - // ---------------------------------------------------------------------------------------------------------------- - function getElRoot(el) { - return el.getRootNode ? el.getRootNode() : document; - } - // Unique ID for DOM attribute - let guid$1 = 0; - function getUniqueDomId() { - guid$1 += 1; - return 'fc-dom-' + guid$1; - } - - // Stops a mouse/touch event from doing it's native browser action - function preventDefault(ev) { - ev.preventDefault(); - } - // Event Delegation - // ---------------------------------------------------------------------------------------------------------------- - function buildDelegationHandler(selector, handler) { - return (ev) => { - let matchedChild = elementClosest(ev.target, selector); - if (matchedChild) { - handler.call(matchedChild, ev, matchedChild); - } - }; - } - function listenBySelector(container, eventType, selector, handler) { - let attachedHandler = buildDelegationHandler(selector, handler); - container.addEventListener(eventType, attachedHandler); - return () => { - container.removeEventListener(eventType, attachedHandler); - }; - } - function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) { - let currentMatchedChild; - return listenBySelector(container, 'mouseover', selector, (mouseOverEv, matchedChild) => { - if (matchedChild !== currentMatchedChild) { - currentMatchedChild = matchedChild; - onMouseEnter(mouseOverEv, matchedChild); - let realOnMouseLeave = (mouseLeaveEv) => { - currentMatchedChild = null; - onMouseLeave(mouseLeaveEv, matchedChild); - matchedChild.removeEventListener('mouseleave', realOnMouseLeave); - }; - // listen to the next mouseleave, and then unattach - matchedChild.addEventListener('mouseleave', realOnMouseLeave); - } - }); - } - // Animation - // ---------------------------------------------------------------------------------------------------------------- - const transitionEventNames = [ - 'webkitTransitionEnd', - 'otransitionend', - 'oTransitionEnd', - 'msTransitionEnd', - 'transitionend', - ]; - // triggered only when the next single subsequent transition finishes - function whenTransitionDone(el, callback) { - let realCallback = (ev) => { - callback(ev); - transitionEventNames.forEach((eventName) => { - el.removeEventListener(eventName, realCallback); - }); - }; - transitionEventNames.forEach((eventName) => { - el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes - }); - } - // ARIA workarounds - // ---------------------------------------------------------------------------------------------------------------- - function createAriaClickAttrs(handler) { - return Object.assign({ onClick: handler }, createAriaKeyboardAttrs(handler)); - } - function createAriaKeyboardAttrs(handler) { - return { - tabIndex: 0, - onKeyDown(ev) { - if (ev.key === 'Enter' || ev.key === ' ') { - handler(ev); - ev.preventDefault(); // if space, don't scroll down page - } - }, - }; - } - - let guidNumber = 0; - function guid() { - guidNumber += 1; - return String(guidNumber); - } - /* FullCalendar-specific DOM Utilities - ----------------------------------------------------------------------------------------------------------------------*/ - // Make the mouse cursor express that an event is not allowed in the current area - function disableCursor() { - document.body.classList.add('fc-not-allowed'); - } - // Returns the mouse cursor to its original look - function enableCursor() { - document.body.classList.remove('fc-not-allowed'); - } - /* Selection - ----------------------------------------------------------------------------------------------------------------------*/ - function preventSelection(el) { - el.classList.add('fc-unselectable'); - el.addEventListener('selectstart', preventDefault); - } - function allowSelection(el) { - el.classList.remove('fc-unselectable'); - el.removeEventListener('selectstart', preventDefault); - } - /* Context Menu - ----------------------------------------------------------------------------------------------------------------------*/ - function preventContextMenu(el) { - el.addEventListener('contextmenu', preventDefault); - } - function allowContextMenu(el) { - el.removeEventListener('contextmenu', preventDefault); - } - function parseFieldSpecs(input) { - let specs = []; - let tokens = []; - let i; - let token; - if (typeof input === 'string') { - tokens = input.split(/\s*,\s*/); - } - else if (typeof input === 'function') { - tokens = [input]; - } - else if (Array.isArray(input)) { - tokens = input; - } - for (i = 0; i < tokens.length; i += 1) { - token = tokens[i]; - if (typeof token === 'string') { - specs.push(token.charAt(0) === '-' ? - { field: token.substring(1), order: -1 } : - { field: token, order: 1 }); - } - else if (typeof token === 'function') { - specs.push({ func: token }); - } - } - return specs; - } - function compareByFieldSpecs(obj0, obj1, fieldSpecs) { - let i; - let cmp; - for (i = 0; i < fieldSpecs.length; i += 1) { - cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]); - if (cmp) { - return cmp; - } - } - return 0; - } - function compareByFieldSpec(obj0, obj1, fieldSpec) { - if (fieldSpec.func) { - return fieldSpec.func(obj0, obj1); - } - return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field]) - * (fieldSpec.order || 1); - } - function flexibleCompare(a, b) { - if (!a && !b) { - return 0; - } - if (b == null) { - return -1; - } - if (a == null) { - return 1; - } - if (typeof a === 'string' || typeof b === 'string') { - return String(a).localeCompare(String(b)); - } - return a - b; - } - /* String Utilities - ----------------------------------------------------------------------------------------------------------------------*/ - function padStart(val, len) { - let s = String(val); - return '000'.substr(0, len - s.length) + s; - } - function formatWithOrdinals(formatter, args, fallbackText) { - if (typeof formatter === 'function') { - return formatter(...args); - } - if (typeof formatter === 'string') { // non-blank string - return args.reduce((str, arg, index) => (str.replace('$' + index, arg || '')), formatter); - } - return fallbackText; - } - /* Number Utilities - ----------------------------------------------------------------------------------------------------------------------*/ - function compareNumbers(a, b) { - return a - b; - } - function isInt(n) { - return n % 1 === 0; - } - /* FC-specific DOM dimension stuff - ----------------------------------------------------------------------------------------------------------------------*/ - function computeSmallestCellWidth(cellEl) { - let allWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-frame'); - let contentWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-cushion'); - if (!allWidthEl) { - throw new Error('needs fc-scrollgrid-shrink-frame className'); // TODO: use const - } - if (!contentWidthEl) { - throw new Error('needs fc-scrollgrid-shrink-cushion className'); - } - return cellEl.getBoundingClientRect().width - allWidthEl.getBoundingClientRect().width + // the cell padding+border - contentWidthEl.getBoundingClientRect().width; - } - - const DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; - // Adding - function addWeeks(m, n) { - let a = dateToUtcArray(m); - a[2] += n * 7; - return arrayToUtcDate(a); - } - function addDays(m, n) { - let a = dateToUtcArray(m); - a[2] += n; - return arrayToUtcDate(a); - } - function addMs(m, n) { - let a = dateToUtcArray(m); - a[6] += n; - return arrayToUtcDate(a); - } - // Diffing (all return floats) - // TODO: why not use ranges? - function diffWeeks(m0, m1) { - return diffDays(m0, m1) / 7; - } - function diffDays(m0, m1) { - return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24); - } - function diffHours(m0, m1) { - return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60); - } - function diffMinutes(m0, m1) { - return (m1.valueOf() - m0.valueOf()) / (1000 * 60); - } - function diffSeconds(m0, m1) { - return (m1.valueOf() - m0.valueOf()) / 1000; - } - function diffDayAndTime(m0, m1) { - let m0day = startOfDay(m0); - let m1day = startOfDay(m1); - return { - years: 0, - months: 0, - days: Math.round(diffDays(m0day, m1day)), - milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf()), - }; - } - // Diffing Whole Units - function diffWholeWeeks(m0, m1) { - let d = diffWholeDays(m0, m1); - if (d !== null && d % 7 === 0) { - return d / 7; - } - return null; - } - function diffWholeDays(m0, m1) { - if (timeAsMs(m0) === timeAsMs(m1)) { - return Math.round(diffDays(m0, m1)); - } - return null; - } - // Start-Of - function startOfDay(m) { - return arrayToUtcDate([ - m.getUTCFullYear(), - m.getUTCMonth(), - m.getUTCDate(), - ]); - } - function startOfHour(m) { - return arrayToUtcDate([ - m.getUTCFullYear(), - m.getUTCMonth(), - m.getUTCDate(), - m.getUTCHours(), - ]); - } - function startOfMinute(m) { - return arrayToUtcDate([ - m.getUTCFullYear(), - m.getUTCMonth(), - m.getUTCDate(), - m.getUTCHours(), - m.getUTCMinutes(), - ]); - } - function startOfSecond(m) { - return arrayToUtcDate([ - m.getUTCFullYear(), - m.getUTCMonth(), - m.getUTCDate(), - m.getUTCHours(), - m.getUTCMinutes(), - m.getUTCSeconds(), - ]); - } - // Week Computation - function weekOfYear(marker, dow, doy) { - let y = marker.getUTCFullYear(); - let w = weekOfGivenYear(marker, y, dow, doy); - if (w < 1) { - return weekOfGivenYear(marker, y - 1, dow, doy); - } - let nextW = weekOfGivenYear(marker, y + 1, dow, doy); - if (nextW >= 1) { - return Math.min(w, nextW); - } - return w; - } - function weekOfGivenYear(marker, year, dow, doy) { - let firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]); - let dayStart = startOfDay(marker); - let days = Math.round(diffDays(firstWeekStart, dayStart)); - return Math.floor(days / 7) + 1; // zero-indexed - } - // start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - // first-week day -- which january is always in the first week (4 for iso, 1 for other) - let fwd = 7 + dow - doy; - // first-week day local weekday -- which local weekday is fwd - let fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7; - return -fwdlw + fwd - 1; - } - // Array Conversion - function dateToLocalArray(date) { - return [ - date.getFullYear(), - date.getMonth(), - date.getDate(), - date.getHours(), - date.getMinutes(), - date.getSeconds(), - date.getMilliseconds(), - ]; - } - function arrayToLocalDate(a) { - return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month - a[3] || 0, a[4] || 0, a[5] || 0); - } - function dateToUtcArray(date) { - return [ - date.getUTCFullYear(), - date.getUTCMonth(), - date.getUTCDate(), - date.getUTCHours(), - date.getUTCMinutes(), - date.getUTCSeconds(), - date.getUTCMilliseconds(), - ]; - } - function arrayToUtcDate(a) { - // according to web standards (and Safari), a month index is required. - // massage if only given a year. - if (a.length === 1) { - a = a.concat([0]); - } - return new Date(Date.UTC(...a)); - } - // Other Utils - function isValidDate(m) { - return !isNaN(m.valueOf()); - } - function timeAsMs(m) { - return m.getUTCHours() * 1000 * 60 * 60 + - m.getUTCMinutes() * 1000 * 60 + - m.getUTCSeconds() * 1000 + - m.getUTCMilliseconds(); - } - - let calendarSystemClassMap = {}; - function registerCalendarSystem(name, theClass) { - calendarSystemClassMap[name] = theClass; - } - function createCalendarSystem(name) { - return new calendarSystemClassMap[name](); - } - class GregorianCalendarSystem { - getMarkerYear(d) { - return d.getUTCFullYear(); - } - getMarkerMonth(d) { - return d.getUTCMonth(); - } - getMarkerDay(d) { - return d.getUTCDate(); - } - arrayToMarker(arr) { - return arrayToUtcDate(arr); - } - markerToArray(marker) { - return dateToUtcArray(marker); - } - } - registerCalendarSystem('gregory', GregorianCalendarSystem); - - const INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds']; - const PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/; - // Parsing and Creation - function createDuration(input, unit) { - if (typeof input === 'string') { - return parseString(input); - } - if (typeof input === 'object' && input) { // non-null object - return parseObject(input); - } - if (typeof input === 'number') { - return parseObject({ [unit || 'milliseconds']: input }); - } - return null; - } - function parseString(s) { - let m = PARSE_RE.exec(s); - if (m) { - let sign = m[1] ? -1 : 1; - return { - years: 0, - months: 0, - days: sign * (m[2] ? parseInt(m[2], 10) : 0), - milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours - (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes - (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds - (m[6] ? parseInt(m[6], 10) : 0) // ms - ), - }; - } - return null; - } - function parseObject(obj) { - let duration = { - years: obj.years || obj.year || 0, - months: obj.months || obj.month || 0, - days: obj.days || obj.day || 0, - milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours - (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes - (obj.seconds || obj.second || 0) * 1000 + // seconds - (obj.milliseconds || obj.millisecond || obj.ms || 0), // ms - }; - let weeks = obj.weeks || obj.week; - if (weeks) { - duration.days += weeks * 7; - duration.specifiedWeeks = true; - } - return duration; - } - // Equality - function durationsEqual(d0, d1) { - return d0.years === d1.years && - d0.months === d1.months && - d0.days === d1.days && - d0.milliseconds === d1.milliseconds; - } - function asCleanDays(dur) { - if (!dur.years && !dur.months && !dur.milliseconds) { - return dur.days; - } - return 0; - } - // Simple Math - function addDurations(d0, d1) { - return { - years: d0.years + d1.years, - months: d0.months + d1.months, - days: d0.days + d1.days, - milliseconds: d0.milliseconds + d1.milliseconds, - }; - } - function subtractDurations(d1, d0) { - return { - years: d1.years - d0.years, - months: d1.months - d0.months, - days: d1.days - d0.days, - milliseconds: d1.milliseconds - d0.milliseconds, - }; - } - function multiplyDuration(d, n) { - return { - years: d.years * n, - months: d.months * n, - days: d.days * n, - milliseconds: d.milliseconds * n, - }; - } - // Conversions - // "Rough" because they are based on average-case Gregorian months/years - function asRoughYears(dur) { - return asRoughDays(dur) / 365; - } - function asRoughMonths(dur) { - return asRoughDays(dur) / 30; - } - function asRoughDays(dur) { - return asRoughMs(dur) / 864e5; - } - function asRoughMinutes(dur) { - return asRoughMs(dur) / (1000 * 60); - } - function asRoughSeconds(dur) { - return asRoughMs(dur) / 1000; - } - function asRoughMs(dur) { - return dur.years * (365 * 864e5) + - dur.months * (30 * 864e5) + - dur.days * 864e5 + - dur.milliseconds; - } - // Advanced Math - function wholeDivideDurations(numerator, denominator) { - let res = null; - for (let i = 0; i < INTERNAL_UNITS.length; i += 1) { - let unit = INTERNAL_UNITS[i]; - if (denominator[unit]) { - let localRes = numerator[unit] / denominator[unit]; - if (!isInt(localRes) || (res !== null && res !== localRes)) { - return null; - } - res = localRes; - } - else if (numerator[unit]) { - // needs to divide by something but can't! - return null; - } - } - return res; - } - function greatestDurationDenominator(dur) { - let ms = dur.milliseconds; - if (ms) { - if (ms % 1000 !== 0) { - return { unit: 'millisecond', value: ms }; - } - if (ms % (1000 * 60) !== 0) { - return { unit: 'second', value: ms / 1000 }; - } - if (ms % (1000 * 60 * 60) !== 0) { - return { unit: 'minute', value: ms / (1000 * 60) }; - } - if (ms) { - return { unit: 'hour', value: ms / (1000 * 60 * 60) }; - } - } - if (dur.days) { - if (dur.specifiedWeeks && dur.days % 7 === 0) { - return { unit: 'week', value: dur.days / 7 }; - } - return { unit: 'day', value: dur.days }; - } - if (dur.months) { - return { unit: 'month', value: dur.months }; - } - if (dur.years) { - return { unit: 'year', value: dur.years }; - } - return { unit: 'millisecond', value: 0 }; - } - - // timeZoneOffset is in minutes - function buildIsoString(marker, timeZoneOffset, stripZeroTime = false) { - let s = marker.toISOString(); - s = s.replace('.000', ''); - if (stripZeroTime) { - s = s.replace('T00:00:00Z', ''); - } - if (s.length > 10) { // time part wasn't stripped, can add timezone info - if (timeZoneOffset == null) { - s = s.replace('Z', ''); - } - else if (timeZoneOffset !== 0) { - s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); - } - // otherwise, its UTC-0 and we want to keep the Z - } - return s; - } - // formats the date, but with no time part - // TODO: somehow merge with buildIsoString and stripZeroTime - // TODO: rename. omit "string" - function formatDayString(marker) { - return marker.toISOString().replace(/T.*$/, ''); - } - // TODO: use Date::toISOString and use everything after the T? - function formatIsoTimeString(marker) { - return padStart(marker.getUTCHours(), 2) + ':' + - padStart(marker.getUTCMinutes(), 2) + ':' + - padStart(marker.getUTCSeconds(), 2); - } - function formatTimeZoneOffset(minutes, doIso = false) { - let sign = minutes < 0 ? '-' : '+'; - let abs = Math.abs(minutes); - let hours = Math.floor(abs / 60); - let mins = Math.round(abs % 60); - if (doIso) { - return `${sign + padStart(hours, 2)}:${padStart(mins, 2)}`; - } - return `GMT${sign}${hours}${mins ? `:${padStart(mins, 2)}` : ''}`; - } - - const ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/; - function parse(str) { - let m = ISO_RE.exec(str); - if (m) { - let marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number(`0.${m[12]}`) * 1000 : 0)); - if (isValidDate(marker)) { - let timeZoneOffset = null; - if (m[13]) { - timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 + - Number(m[18] || 0)); - } - return { - marker, - isTimeUnspecified: !m[6], - timeZoneOffset, - }; - } - } - return null; - } - - class DateEnv { - constructor(settings) { - let timeZone = this.timeZone = settings.timeZone; - let isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC'; - if (settings.namedTimeZoneImpl && isNamedTimeZone) { - this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone); - } - this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl); - this.calendarSystem = createCalendarSystem(settings.calendarSystem); - this.locale = settings.locale; - this.weekDow = settings.locale.week.dow; - this.weekDoy = settings.locale.week.doy; - if (settings.weekNumberCalculation === 'ISO') { - this.weekDow = 1; - this.weekDoy = 4; - } - if (typeof settings.firstDay === 'number') { - this.weekDow = settings.firstDay; - } - if (typeof settings.weekNumberCalculation === 'function') { - this.weekNumberFunc = settings.weekNumberCalculation; - } - this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText; - this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText; - this.cmdFormatter = settings.cmdFormatter; - this.defaultSeparator = settings.defaultSeparator; - } - // Creating / Parsing - createMarker(input) { - let meta = this.createMarkerMeta(input); - if (meta === null) { - return null; - } - return meta.marker; - } - createNowMarker() { - if (this.canComputeOffset) { - return this.timestampToMarker(new Date().valueOf()); - } - // if we can't compute the current date val for a timezone, - // better to give the current local date vals than UTC - return arrayToUtcDate(dateToLocalArray(new Date())); - } - createMarkerMeta(input) { - if (typeof input === 'string') { - return this.parse(input); - } - let marker = null; - if (typeof input === 'number') { - marker = this.timestampToMarker(input); - } - else if (input instanceof Date) { - input = input.valueOf(); - if (!isNaN(input)) { - marker = this.timestampToMarker(input); - } - } - else if (Array.isArray(input)) { - marker = arrayToUtcDate(input); - } - if (marker === null || !isValidDate(marker)) { - return null; - } - return { marker, isTimeUnspecified: false, forcedTzo: null }; - } - parse(s) { - let parts = parse(s); - if (parts === null) { - return null; - } - let { marker } = parts; - let forcedTzo = null; - if (parts.timeZoneOffset !== null) { - if (this.canComputeOffset) { - marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000); - } - else { - forcedTzo = parts.timeZoneOffset; - } - } - return { marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo }; - } - // Accessors - getYear(marker) { - return this.calendarSystem.getMarkerYear(marker); - } - getMonth(marker) { - return this.calendarSystem.getMarkerMonth(marker); - } - // Adding / Subtracting - add(marker, dur) { - let a = this.calendarSystem.markerToArray(marker); - a[0] += dur.years; - a[1] += dur.months; - a[2] += dur.days; - a[6] += dur.milliseconds; - return this.calendarSystem.arrayToMarker(a); - } - subtract(marker, dur) { - let a = this.calendarSystem.markerToArray(marker); - a[0] -= dur.years; - a[1] -= dur.months; - a[2] -= dur.days; - a[6] -= dur.milliseconds; - return this.calendarSystem.arrayToMarker(a); - } - addYears(marker, n) { - let a = this.calendarSystem.markerToArray(marker); - a[0] += n; - return this.calendarSystem.arrayToMarker(a); - } - addMonths(marker, n) { - let a = this.calendarSystem.markerToArray(marker); - a[1] += n; - return this.calendarSystem.arrayToMarker(a); - } - // Diffing Whole Units - diffWholeYears(m0, m1) { - let { calendarSystem } = this; - if (timeAsMs(m0) === timeAsMs(m1) && - calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && - calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) { - return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0); - } - return null; - } - diffWholeMonths(m0, m1) { - let { calendarSystem } = this; - if (timeAsMs(m0) === timeAsMs(m1) && - calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) { - return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) + - (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12; - } - return null; - } - // Range / Duration - greatestWholeUnit(m0, m1) { - let n = this.diffWholeYears(m0, m1); - if (n !== null) { - return { unit: 'year', value: n }; - } - n = this.diffWholeMonths(m0, m1); - if (n !== null) { - return { unit: 'month', value: n }; - } - n = diffWholeWeeks(m0, m1); - if (n !== null) { - return { unit: 'week', value: n }; - } - n = diffWholeDays(m0, m1); - if (n !== null) { - return { unit: 'day', value: n }; - } - n = diffHours(m0, m1); - if (isInt(n)) { - return { unit: 'hour', value: n }; - } - n = diffMinutes(m0, m1); - if (isInt(n)) { - return { unit: 'minute', value: n }; - } - n = diffSeconds(m0, m1); - if (isInt(n)) { - return { unit: 'second', value: n }; - } - return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() }; - } - countDurationsBetween(m0, m1, d) { - // TODO: can use greatestWholeUnit - let diff; - if (d.years) { - diff = this.diffWholeYears(m0, m1); - if (diff !== null) { - return diff / asRoughYears(d); - } - } - if (d.months) { - diff = this.diffWholeMonths(m0, m1); - if (diff !== null) { - return diff / asRoughMonths(d); - } - } - if (d.days) { - diff = diffWholeDays(m0, m1); - if (diff !== null) { - return diff / asRoughDays(d); - } - } - return (m1.valueOf() - m0.valueOf()) / asRoughMs(d); - } - // Start-Of - // these DON'T return zoned-dates. only UTC start-of dates - startOf(m, unit) { - if (unit === 'year') { - return this.startOfYear(m); - } - if (unit === 'month') { - return this.startOfMonth(m); - } - if (unit === 'week') { - return this.startOfWeek(m); - } - if (unit === 'day') { - return startOfDay(m); - } - if (unit === 'hour') { - return startOfHour(m); - } - if (unit === 'minute') { - return startOfMinute(m); - } - if (unit === 'second') { - return startOfSecond(m); - } - return null; - } - startOfYear(m) { - return this.calendarSystem.arrayToMarker([ - this.calendarSystem.getMarkerYear(m), - ]); - } - startOfMonth(m) { - return this.calendarSystem.arrayToMarker([ - this.calendarSystem.getMarkerYear(m), - this.calendarSystem.getMarkerMonth(m), - ]); - } - startOfWeek(m) { - return this.calendarSystem.arrayToMarker([ - this.calendarSystem.getMarkerYear(m), - this.calendarSystem.getMarkerMonth(m), - m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7), - ]); - } - // Week Number - computeWeekNumber(marker) { - if (this.weekNumberFunc) { - return this.weekNumberFunc(this.toDate(marker)); - } - return weekOfYear(marker, this.weekDow, this.weekDoy); - } - // TODO: choke on timeZoneName: long - format(marker, formatter, dateOptions = {}) { - return formatter.format({ - marker, - timeZoneOffset: dateOptions.forcedTzo != null ? - dateOptions.forcedTzo : - this.offsetForMarker(marker), - }, this); - } - formatRange(start, end, formatter, dateOptions = {}) { - if (dateOptions.isEndExclusive) { - end = addMs(end, -1); - } - return formatter.formatRange({ - marker: start, - timeZoneOffset: dateOptions.forcedStartTzo != null ? - dateOptions.forcedStartTzo : - this.offsetForMarker(start), - }, { - marker: end, - timeZoneOffset: dateOptions.forcedEndTzo != null ? - dateOptions.forcedEndTzo : - this.offsetForMarker(end), - }, this, dateOptions.defaultSeparator); - } - /* - DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that, - might as well use buildIsoString or some other util directly - */ - formatIso(marker, extraOptions = {}) { - let timeZoneOffset = null; - if (!extraOptions.omitTimeZoneOffset) { - if (extraOptions.forcedTzo != null) { - timeZoneOffset = extraOptions.forcedTzo; - } - else { - timeZoneOffset = this.offsetForMarker(marker); - } - } - return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime); - } - // TimeZone - timestampToMarker(ms) { - if (this.timeZone === 'local') { - return arrayToUtcDate(dateToLocalArray(new Date(ms))); - } - if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) { - return new Date(ms); - } - return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms)); - } - offsetForMarker(m) { - if (this.timeZone === 'local') { - return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset - } - if (this.timeZone === 'UTC') { - return 0; - } - if (this.namedTimeZoneImpl) { - return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)); - } - return null; - } - // Conversion - toDate(m, forcedTzo) { - if (this.timeZone === 'local') { - return arrayToLocalDate(dateToUtcArray(m)); - } - if (this.timeZone === 'UTC') { - return new Date(m.valueOf()); // make sure it's a copy - } - if (!this.namedTimeZoneImpl) { - return new Date(m.valueOf() - (forcedTzo || 0)); - } - return new Date(m.valueOf() - - this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60); - } - } - - class Theme { - constructor(calendarOptions) { - if (this.iconOverrideOption) { - this.setIconOverride(calendarOptions[this.iconOverrideOption]); - } - } - setIconOverride(iconOverrideHash) { - let iconClassesCopy; - let buttonName; - if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object - iconClassesCopy = Object.assign({}, this.iconClasses); - for (buttonName in iconOverrideHash) { - iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]); - } - this.iconClasses = iconClassesCopy; - } - else if (iconOverrideHash === false) { - this.iconClasses = {}; - } - } - applyIconOverridePrefix(className) { - let prefix = this.iconOverridePrefix; - if (prefix && className.indexOf(prefix) !== 0) { // if not already present - className = prefix + className; - } - return className; - } - getClass(key) { - return this.classes[key] || ''; - } - getIconClass(buttonName, isRtl) { - let className; - if (isRtl && this.rtlIconClasses) { - className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName]; - } - else { - className = this.iconClasses[buttonName]; - } - if (className) { - return `${this.baseIconClass} ${className}`; - } - return ''; - } - getCustomButtonIconClass(customButtonProps) { - let className; - if (this.iconOverrideCustomButtonOption) { - className = customButtonProps[this.iconOverrideCustomButtonOption]; - if (className) { - return `${this.baseIconClass} ${this.applyIconOverridePrefix(className)}`; - } - } - return ''; - } - } - Theme.prototype.classes = {}; - Theme.prototype.iconClasses = {}; - Theme.prototype.baseIconClass = ''; - Theme.prototype.iconOverridePrefix = ''; - - const EXTENDED_SETTINGS_AND_SEVERITIES = { - week: 3, - separator: 0, - omitZeroMinute: 0, - meridiem: 0, - omitCommas: 0, - }; - const STANDARD_DATE_PROP_SEVERITIES = { - timeZoneName: 7, - era: 6, - year: 5, - month: 4, - day: 2, - weekday: 2, - hour: 1, - minute: 1, - second: 1, - }; - const MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too - const COMMA_RE = /,/g; // we need re for globalness - const MULTI_SPACE_RE = /\s+/g; - const LTR_RE = /\u200e/g; // control character - const UTC_RE = /UTC|GMT/; - class NativeFormatter { - constructor(formatSettings) { - let standardDateProps = {}; - let extendedSettings = {}; - let severity = 0; - for (let name in formatSettings) { - if (name in EXTENDED_SETTINGS_AND_SEVERITIES) { - extendedSettings[name] = formatSettings[name]; - severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name], severity); - } - else { - standardDateProps[name] = formatSettings[name]; - if (name in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity - severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name], severity); - } - } - } - this.standardDateProps = standardDateProps; - this.extendedSettings = extendedSettings; - this.severity = severity; - this.buildFormattingFunc = memoize(buildFormattingFunc); - } - format(date, context) { - return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date); - } - formatRange(start, end, context, betterDefaultSeparator) { - let { standardDateProps, extendedSettings } = this; - let diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem); - if (!diffSeverity) { - return this.format(start, context); - } - let biggestUnitForPartial = diffSeverity; - if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time - (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') && - (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') && - (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) { - biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time - } - let full0 = this.format(start, context); - let full1 = this.format(end, context); - if (full0 === full1) { - return full0; - } - let partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial); - let partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context); - let partial0 = partialFormattingFunc(start); - let partial1 = partialFormattingFunc(end); - let insertion = findCommonInsertion(full0, partial0, full1, partial1); - let separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || ''; - if (insertion) { - return insertion.before + partial0 + separator + partial1 + insertion.after; - } - return full0 + separator + full1; - } - getLargestUnit() { - 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'; // really? - } - } - } - function buildFormattingFunc(standardDateProps, extendedSettings, context) { - let standardDatePropCnt = Object.keys(standardDateProps).length; - if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') { - return (date) => (formatTimeZoneOffset(date.timeZoneOffset)); - } - if (standardDatePropCnt === 0 && extendedSettings.week) { - return (date) => (formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week)); - } - return buildNativeFormattingFunc(standardDateProps, extendedSettings, context); - } - function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) { - standardDateProps = Object.assign({}, standardDateProps); // copy - extendedSettings = Object.assign({}, extendedSettings); // copy - sanitizeSettings(standardDateProps, extendedSettings); - standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers - let normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps); - let zeroFormat; // needed? - if (extendedSettings.omitZeroMinute) { - let zeroProps = Object.assign({}, standardDateProps); - delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings - zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps); - } - return (date) => { - let { marker } = date; - let format; - if (zeroFormat && !marker.getUTCMinutes()) { - format = zeroFormat; - } - else { - format = normalFormat; - } - let s = format.format(marker); - return postProcess(s, date, standardDateProps, extendedSettings, context); - }; - } - function sanitizeSettings(standardDateProps, extendedSettings) { - // deal with a browser inconsistency where formatting the timezone - // requires that the hour/minute be present. - if (standardDateProps.timeZoneName) { - if (!standardDateProps.hour) { - standardDateProps.hour = '2-digit'; - } - if (!standardDateProps.minute) { - standardDateProps.minute = '2-digit'; - } - } - // only support short timezone names - if (standardDateProps.timeZoneName === 'long') { - standardDateProps.timeZoneName = 'short'; - } - // if requesting to display seconds, MUST display minutes - if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) { - delete extendedSettings.omitZeroMinute; - } - } - function postProcess(s, date, standardDateProps, extendedSettings, context) { - s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes - if (standardDateProps.timeZoneName === 'short') { - s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ? - 'UTC' : // important to normalize for IE, which does "GMT" - formatTimeZoneOffset(date.timeZoneOffset)); - } - if (extendedSettings.omitCommas) { - s = s.replace(COMMA_RE, '').trim(); - } - if (extendedSettings.omitZeroMinute) { - s = s.replace(':00', ''); // zeroFormat doesn't always achieve this - } - // ^ do anything that might create adjacent spaces before this point, - // because MERIDIEM_RE likes to eat up loading spaces - if (extendedSettings.meridiem === false) { - s = s.replace(MERIDIEM_RE, '').trim(); - } - else if (extendedSettings.meridiem === 'narrow') { // a/p - s = s.replace(MERIDIEM_RE, (m0, m1) => m1.toLocaleLowerCase()); - } - else if (extendedSettings.meridiem === 'short') { // am/pm - s = s.replace(MERIDIEM_RE, (m0, m1) => `${m1.toLocaleLowerCase()}m`); - } - else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase - s = s.replace(MERIDIEM_RE, (m0) => m0.toLocaleLowerCase()); - } - s = s.replace(MULTI_SPACE_RE, ' '); - s = s.trim(); - return s; - } - function injectTzoStr(s, tzoStr) { - let replaced = false; - s = s.replace(UTC_RE, () => { - replaced = true; - return tzoStr; - }); - // IE11 doesn't include UTC/GMT in the original string, so append to end - if (!replaced) { - s += ` ${tzoStr}`; - } - return s; - } - function formatWeekNumber(num, weekText, weekTextLong, locale, display) { - let parts = []; - if (display === 'long') { - parts.push(weekTextLong); - } - else if (display === 'short' || display === 'narrow') { - parts.push(weekText); - } - if (display === 'long' || display === 'short') { - parts.push(' '); - } - parts.push(locale.simpleNumberFormat.format(num)); - if (locale.options.direction === 'rtl') { // TODO: use control characters instead? - parts.reverse(); - } - return parts.join(''); - } - // Range Formatting Utils - // 0 = exactly the same - // 1 = different by time - // and bigger - function computeMarkerDiffSeverity(d0, d1, ca) { - if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) { - return 5; - } - if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) { - return 4; - } - if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) { - return 2; - } - if (timeAsMs(d0) !== timeAsMs(d1)) { - return 1; - } - return 0; - } - function computePartialFormattingOptions(options, biggestUnit) { - let partialOptions = {}; - for (let name in options) { - if (!(name in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone) - STANDARD_DATE_PROP_SEVERITIES[name] <= biggestUnit) { - partialOptions[name] = options[name]; - } - } - return partialOptions; - } - function findCommonInsertion(full0, partial0, full1, partial1) { - let i0 = 0; - while (i0 < full0.length) { - let found0 = full0.indexOf(partial0, i0); - if (found0 === -1) { - break; - } - let before0 = full0.substr(0, found0); - i0 = found0 + partial0.length; - let after0 = full0.substr(i0); - let i1 = 0; - while (i1 < full1.length) { - let found1 = full1.indexOf(partial1, i1); - if (found1 === -1) { - break; - } - let before1 = full1.substr(0, found1); - i1 = found1 + partial1.length; - let after1 = full1.substr(i1); - if (before0 === before1 && after0 === after1) { - return { - before: before0, - after: after0, - }; - } - } - } - return null; - } - - function expandZonedMarker(dateInfo, calendarSystem) { - let a = calendarSystem.markerToArray(dateInfo.marker); - return { - marker: dateInfo.marker, - timeZoneOffset: dateInfo.timeZoneOffset, - array: a, - year: a[0], - month: a[1], - day: a[2], - hour: a[3], - minute: a[4], - second: a[5], - millisecond: a[6], - }; - } - - function createVerboseFormattingArg(start, end, context, betterDefaultSeparator) { - let startInfo = expandZonedMarker(start, context.calendarSystem); - let endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null; - return { - date: startInfo, - start: startInfo, - end: endInfo, - timeZone: context.timeZone, - localeCodes: context.locale.codes, - defaultSeparator: betterDefaultSeparator || context.defaultSeparator, - }; - } - - /* - TODO: fix the terminology of "formatter" vs "formatting func" - */ - /* - At the time of instantiation, this object does not know which cmd-formatting system it will use. - It receives this at the time of formatting, as a setting. - */ - class CmdFormatter { - constructor(cmdStr) { - this.cmdStr = cmdStr; - } - format(date, context, betterDefaultSeparator) { - return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); - } - formatRange(start, end, context, betterDefaultSeparator) { - return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); - } - } - - class FuncFormatter { - constructor(func) { - this.func = func; - } - format(date, context, betterDefaultSeparator) { - return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); - } - formatRange(start, end, context, betterDefaultSeparator) { - return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); - } - } - - function createFormatter(input) { - if (typeof input === 'object' && input) { // non-null object - return new NativeFormatter(input); - } - if (typeof input === 'string') { - return new CmdFormatter(input); - } - if (typeof input === 'function') { - return new FuncFormatter(input); - } - return null; - } - - // base options - // ------------ - const BASE_OPTION_REFINERS = { - navLinkDayClick: identity, - navLinkWeekClick: identity, - duration: createDuration, - bootstrapFontAwesome: identity, - buttonIcons: identity, - customButtons: identity, - defaultAllDayEventDuration: createDuration, - defaultTimedEventDuration: createDuration, - nextDayThreshold: createDuration, - scrollTime: createDuration, - scrollTimeReset: Boolean, - slotMinTime: createDuration, - slotMaxTime: createDuration, - dayPopoverFormat: createFormatter, - slotDuration: createDuration, - snapDuration: createDuration, - headerToolbar: identity, - footerToolbar: identity, - defaultRangeSeparator: String, - titleRangeSeparator: String, - forceEventDuration: Boolean, - dayHeaders: Boolean, - dayHeaderFormat: createFormatter, - dayHeaderClassNames: identity, - dayHeaderContent: identity, - dayHeaderDidMount: identity, - dayHeaderWillUnmount: identity, - dayCellClassNames: identity, - dayCellContent: identity, - dayCellDidMount: identity, - dayCellWillUnmount: identity, - initialView: String, - aspectRatio: Number, - weekends: Boolean, - weekNumberCalculation: identity, - weekNumbers: Boolean, - weekNumberClassNames: identity, - weekNumberContent: identity, - weekNumberDidMount: identity, - weekNumberWillUnmount: identity, - editable: Boolean, - viewClassNames: identity, - viewDidMount: identity, - viewWillUnmount: identity, - nowIndicator: Boolean, - nowIndicatorClassNames: identity, - nowIndicatorContent: identity, - nowIndicatorDidMount: identity, - nowIndicatorWillUnmount: identity, - showNonCurrentDates: Boolean, - lazyFetching: Boolean, - startParam: String, - endParam: String, - timeZoneParam: String, - timeZone: String, - locales: identity, - locale: identity, - themeSystem: String, - dragRevertDuration: Number, - dragScroll: Boolean, - allDayMaintainDuration: Boolean, - unselectAuto: Boolean, - dropAccept: identity, - eventOrder: parseFieldSpecs, - eventOrderStrict: Boolean, - handleWindowResize: Boolean, - windowResizeDelay: Number, - longPressDelay: Number, - eventDragMinDistance: Number, - expandRows: Boolean, - height: identity, - contentHeight: identity, - direction: String, - weekNumberFormat: createFormatter, - eventResizableFromStart: Boolean, - displayEventTime: Boolean, - displayEventEnd: Boolean, - weekText: String, - weekTextLong: String, - progressiveEventRendering: Boolean, - businessHours: identity, - initialDate: identity, - now: identity, - eventDataTransform: identity, - stickyHeaderDates: identity, - stickyFooterScrollbar: identity, - viewHeight: identity, - defaultAllDay: Boolean, - eventSourceFailure: identity, - eventSourceSuccess: identity, - eventDisplay: String, - eventStartEditable: Boolean, - eventDurationEditable: Boolean, - eventOverlap: identity, - eventConstraint: identity, - eventAllow: identity, - eventBackgroundColor: String, - eventBorderColor: String, - eventTextColor: String, - eventColor: String, - eventClassNames: identity, - eventContent: identity, - eventDidMount: identity, - eventWillUnmount: identity, - selectConstraint: identity, - selectOverlap: identity, - selectAllow: identity, - droppable: Boolean, - unselectCancel: String, - slotLabelFormat: identity, - slotLaneClassNames: identity, - slotLaneContent: identity, - slotLaneDidMount: identity, - slotLaneWillUnmount: identity, - slotLabelClassNames: identity, - slotLabelContent: identity, - slotLabelDidMount: identity, - slotLabelWillUnmount: identity, - dayMaxEvents: identity, - dayMaxEventRows: identity, - dayMinWidth: Number, - slotLabelInterval: createDuration, - allDayText: String, - allDayClassNames: identity, - allDayContent: identity, - allDayDidMount: identity, - allDayWillUnmount: identity, - slotMinWidth: Number, - navLinks: Boolean, - eventTimeFormat: createFormatter, - rerenderDelay: Number, - moreLinkText: identity, - moreLinkHint: identity, - selectMinDistance: Number, - selectable: Boolean, - selectLongPressDelay: Number, - eventLongPressDelay: Number, - selectMirror: Boolean, - eventMaxStack: Number, - eventMinHeight: Number, - eventMinWidth: Number, - eventShortHeight: Number, - slotEventOverlap: Boolean, - plugins: identity, - firstDay: Number, - dayCount: Number, - dateAlignment: String, - dateIncrement: createDuration, - hiddenDays: identity, - monthMode: Boolean, - fixedWeekCount: Boolean, - validRange: identity, - visibleRange: identity, - titleFormat: identity, - eventInteractive: Boolean, - // only used by list-view, but languages define the value, so we need it in base options - noEventsText: String, - viewHint: identity, - navLinkHint: identity, - closeHint: String, - timeHint: String, - eventHint: String, - moreLinkClick: identity, - moreLinkClassNames: identity, - moreLinkContent: identity, - moreLinkDidMount: identity, - moreLinkWillUnmount: identity, - // for connectors - // (can't be part of plugin system b/c must be provided at runtime) - handleCustomRendering: identity, - customRenderingMetaMap: identity, - customRenderingReplacesEl: Boolean, - }; - // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give real results. - // raw values. - const BASE_OPTION_DEFAULTS = { - eventDisplay: 'auto', - defaultRangeSeparator: ' - ', - titleRangeSeparator: ' \u2013 ', - defaultTimedEventDuration: '01:00:00', - defaultAllDayEventDuration: { day: 1 }, - forceEventDuration: false, - nextDayThreshold: '00:00:00', - dayHeaders: true, - initialView: '', - aspectRatio: 1.35, - headerToolbar: { - start: 'title', - center: '', - end: 'today prev,next', - }, - weekends: true, - weekNumbers: false, - weekNumberCalculation: 'local', - editable: false, - nowIndicator: false, - scrollTime: '06:00:00', - scrollTimeReset: true, - slotMinTime: '00:00:00', - slotMaxTime: '24:00:00', - showNonCurrentDates: true, - lazyFetching: true, - startParam: 'start', - endParam: 'end', - timeZoneParam: 'timeZone', - timeZone: 'local', - locales: [], - locale: '', - themeSystem: 'standard', - dragRevertDuration: 500, - dragScroll: true, - allDayMaintainDuration: false, - unselectAuto: true, - dropAccept: '*', - eventOrder: 'start,-duration,allDay,title', - dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' }, - handleWindowResize: true, - windowResizeDelay: 100, - longPressDelay: 1000, - eventDragMinDistance: 5, - expandRows: false, - navLinks: false, - selectable: false, - eventMinHeight: 15, - eventMinWidth: 30, - eventShortHeight: 30, - }; - // calendar listeners - // ------------------ - const CALENDAR_LISTENER_REFINERS = { - datesSet: identity, - eventsSet: identity, - eventAdd: identity, - eventChange: identity, - eventRemove: identity, - windowResize: identity, - eventClick: identity, - eventMouseEnter: identity, - eventMouseLeave: identity, - select: identity, - unselect: identity, - loading: identity, - // internal - _unmount: identity, - _beforeprint: identity, - _afterprint: identity, - _noEventDrop: identity, - _noEventResize: identity, - _resize: identity, - _scrollRequest: identity, - }; - // calendar-specific options - // ------------------------- - const CALENDAR_OPTION_REFINERS = { - buttonText: identity, - buttonHints: identity, - views: identity, - plugins: identity, - initialEvents: identity, - events: identity, - eventSources: identity, - }; - const COMPLEX_OPTION_COMPARATORS = { - headerToolbar: isMaybeObjectsEqual, - footerToolbar: isMaybeObjectsEqual, - buttonText: isMaybeObjectsEqual, - buttonHints: isMaybeObjectsEqual, - buttonIcons: isMaybeObjectsEqual, - dateIncrement: isMaybeObjectsEqual, - }; - function isMaybeObjectsEqual(a, b) { - if (typeof a === 'object' && typeof b === 'object' && a && b) { // both non-null objects - return isPropsEqual(a, b); - } - return a === b; - } - // view-specific options - // --------------------- - const VIEW_OPTION_REFINERS = { - type: String, - component: identity, - buttonText: String, - buttonTextKey: String, - dateProfileGeneratorClass: identity, - usesMinMaxTime: Boolean, - classNames: identity, - content: identity, - didMount: identity, - willUnmount: identity, - }; - // util funcs - // ---------------------------------------------------------------------------------------------------- - function mergeRawOptions(optionSets) { - return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS); - } - function refineProps(input, refiners) { - let refined = {}; - let extra = {}; - for (let propName in refiners) { - if (propName in input) { - refined[propName] = refiners[propName](input[propName]); - } - } - for (let propName in input) { - if (!(propName in refiners)) { - extra[propName] = input[propName]; - } - } - return { refined, extra }; - } - function identity(raw) { - return raw; - } - - /* - NOTE: this can be a public API, especially createElement for hooks. - See examples/typescript-scheduler/src/index.ts - */ - function flushSync(runBeforeFlush) { - runBeforeFlush(); - let oldDebounceRendering = l$1.debounceRendering; // orig - let callbackQ = []; - function execCallbackSync(callback) { - callbackQ.push(callback); - } - l$1.debounceRendering = execCallbackSync; - P$1(h(FakeComponent, {}), document.createElement('div')); - while (callbackQ.length) { - callbackQ.shift()(); - } - l$1.debounceRendering = oldDebounceRendering; - } - class FakeComponent extends d { - render() { return h('div', {}); } - componentDidMount() { this.setState({}); } - } - // TODO: use preact/compat instead? - function createContext(defaultValue) { - let ContextType = B$1(defaultValue); - let origProvider = ContextType.Provider; - ContextType.Provider = function () { - let isNew = !this.getChildContext; - let children = origProvider.apply(this, arguments); // eslint-disable-line prefer-rest-params - if (isNew) { - let subs = []; - this.shouldComponentUpdate = (_props) => { - if (this.props.value !== _props.value) { - subs.forEach((c) => { - c.context = _props.value; - c.forceUpdate(); - }); - } - }; - this.sub = (c) => { - subs.push(c); - let old = c.componentWillUnmount; - c.componentWillUnmount = () => { - subs.splice(subs.indexOf(c), 1); - old && old.call(c); - }; - }; - } - return children; - }; - return ContextType; - } - - class ScrollResponder { - constructor(execFunc, emitter, scrollTime, scrollTimeReset) { - this.execFunc = execFunc; - this.emitter = emitter; - this.scrollTime = scrollTime; - this.scrollTimeReset = scrollTimeReset; - this.handleScrollRequest = (request) => { - this.queuedRequest = Object.assign({}, this.queuedRequest || {}, request); - this.drain(); - }; - emitter.on('_scrollRequest', this.handleScrollRequest); - this.fireInitialScroll(); - } - detach() { - this.emitter.off('_scrollRequest', this.handleScrollRequest); - } - update(isDatesNew) { - if (isDatesNew && this.scrollTimeReset) { - this.fireInitialScroll(); // will drain - } - else { - this.drain(); - } - } - fireInitialScroll() { - this.handleScrollRequest({ - time: this.scrollTime, - }); - } - drain() { - if (this.queuedRequest && this.execFunc(this.queuedRequest)) { - this.queuedRequest = null; - } - } - } - - const ViewContextType = createContext({}); // for Components - function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) { - return { - dateEnv, - options: viewOptions, - pluginHooks, - emitter, - dispatch, - getCurrentData, - calendarApi, - viewSpec, - viewApi, - dateProfileGenerator, - theme, - isRtl: viewOptions.direction === 'rtl', - addResizeHandler(handler) { - emitter.on('_resize', handler); - }, - removeResizeHandler(handler) { - emitter.off('_resize', handler); - }, - createScrollResponder(execFunc) { - return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime), viewOptions.scrollTimeReset); - }, - registerInteractiveComponent, - unregisterInteractiveComponent, - }; - } - - /* eslint max-classes-per-file: off */ - class PureComponent extends d { - shouldComponentUpdate(nextProps, nextState) { - if (this.debug) { - // eslint-disable-next-line no-console - console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state)); - } - return !compareObjs(this.props, nextProps, this.propEquality) || - !compareObjs(this.state, nextState, this.stateEquality); - } - // HACK for freakin' React StrictMode - safeSetState(newState) { - if (!compareObjs(this.state, Object.assign(Object.assign({}, this.state), newState), this.stateEquality)) { - this.setState(newState); - } - } - } - PureComponent.addPropsEquality = addPropsEquality; - PureComponent.addStateEquality = addStateEquality; - PureComponent.contextType = ViewContextType; - PureComponent.prototype.propEquality = {}; - PureComponent.prototype.stateEquality = {}; - class BaseComponent extends PureComponent { - } - BaseComponent.contextType = ViewContextType; - function addPropsEquality(propEquality) { - let hash = Object.create(this.prototype.propEquality); - Object.assign(hash, propEquality); - this.prototype.propEquality = hash; - } - function addStateEquality(stateEquality) { - let hash = Object.create(this.prototype.stateEquality); - Object.assign(hash, stateEquality); - this.prototype.stateEquality = hash; - } - // use other one - function setRef(ref, current) { - if (typeof ref === 'function') { - ref(current); - } - else if (ref) { - // see https://github.com/facebook/react/issues/13029 - ref.current = current; - } - } - - class ContentInjector extends BaseComponent { - constructor() { - super(...arguments); - this.id = guid(); - this.currentDomNodes = []; - this.queuedDomNodes = []; - this.handleEl = (el) => { - if (this.props.elRef) { - setRef(this.props.elRef, el); - } - }; - } - render() { - const { props, context } = this; - const { options } = context; - const { generator, renderProps } = props; - const attrs = buildElAttrs(props); - let innerContent; - let queuedDomNodes = []; - if (hasCustomRenderingHandler(props.generatorName, options)) { - if (options.customRenderingReplacesEl) { - delete attrs.elRef; // because handleEl will be used - } - } - else { - const customContent = typeof generator === 'function' ? - generator(renderProps, h) : - generator; - if (typeof customContent === 'string' || - i$1(customContent) || - Array.isArray(customContent)) { - innerContent = customContent; - } - else if (typeof customContent === 'object') { - if ('html' in customContent) { - attrs.dangerouslySetInnerHTML = { __html: customContent.html }; - } - else if ('domNodes' in customContent) { - queuedDomNodes = Array.prototype.slice.call(customContent.domNodes); - } - } - } - this.queuedDomNodes = queuedDomNodes; - return h(props.elTag, attrs, innerContent); - } - componentDidMount() { - this.applyQueueudDomNodes(); - this.triggerCustomRendering(true); - } - componentDidUpdate() { - this.applyQueueudDomNodes(); - this.triggerCustomRendering(true); - } - componentWillUnmount() { - this.triggerCustomRendering(false); // TODO: different API for removal? - } - triggerCustomRendering(isActive) { - const { props, context } = this; - const { handleCustomRendering, customRenderingMetaMap } = context.options; - if (handleCustomRendering) { - const customRenderingMeta = customRenderingMetaMap === null || customRenderingMetaMap === void 0 ? void 0 : customRenderingMetaMap[props.generatorName]; - if (customRenderingMeta) { - handleCustomRendering(Object.assign({ id: this.id, isActive, containerEl: this.base, reportNewContainerEl: this.handleEl, generatorMeta: customRenderingMeta }, props)); - } - } - } - applyQueueudDomNodes() { - const { queuedDomNodes, currentDomNodes } = this; - const el = this.base; - if (!isArraysEqual(queuedDomNodes, currentDomNodes)) { - currentDomNodes.forEach(removeElement); - for (let newNode of queuedDomNodes) { - el.appendChild(newNode); - } - this.currentDomNodes = queuedDomNodes; - } - } - } - ContentInjector.addPropsEquality({ - elClasses: isArraysEqual, - elStyle: isPropsEqual, - elAttrs: isPropsEqual, - renderProps: isPropsEqual, - }); - // Util - function hasCustomRenderingHandler(generatorName, options) { - var _a; - return Boolean(options.handleCustomRendering && - generatorName && - ((_a = options.customRenderingMetaMap) === null || _a === void 0 ? void 0 : _a[generatorName])); - } - function buildElAttrs(props, extraClassNames) { - const attrs = Object.assign(Object.assign({}, props.elAttrs), { ref: props.elRef }); - if (props.elClasses || extraClassNames) { - attrs.className = (props.elClasses || []) - .concat(extraClassNames || []) - .concat(attrs.className || []) - .filter(Boolean) - .join(' '); - } - if (props.elStyle) { - attrs.style = props.elStyle; - } - return attrs; - } - - const RenderId = createContext(0); - - class ContentContainer extends d { - constructor() { - super(...arguments); - this.InnerContent = InnerContentInjector.bind(undefined, this); - } - render() { - const { props } = this; - const generatedClassNames = generateClassNames(props.classNameGenerator, props.renderProps); - if (props.children) { - const elAttrs = buildElAttrs(props, generatedClassNames); - const children = props.children(this.InnerContent, props.renderProps, elAttrs); - if (props.elTag) { - return h(props.elTag, elAttrs, children); - } - else { - return children; - } - } - else { - return h((ContentInjector), Object.assign(Object.assign({}, props), { elTag: props.elTag || 'div', elClasses: (props.elClasses || []).concat(generatedClassNames), renderId: this.context })); - } - } - componentDidMount() { - var _a, _b; - (_b = (_a = this.props).didMount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.base })); - } - componentWillUnmount() { - var _a, _b; - (_b = (_a = this.props).willUnmount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.base })); - } - } - ContentContainer.contextType = RenderId; - function InnerContentInjector(containerComponent, props) { - const parentProps = containerComponent.props; - return h((ContentInjector), Object.assign({ renderProps: parentProps.renderProps, generatorName: parentProps.generatorName, generator: parentProps.generator, renderId: containerComponent.context }, props)); - } - // Utils - function generateClassNames(classNameGenerator, renderProps) { - const classNames = typeof classNameGenerator === 'function' ? - classNameGenerator(renderProps) : - classNameGenerator || []; - return typeof classNames === 'string' ? [classNames] : classNames; - } - - class ViewContainer$1 extends BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let renderProps = { view: context.viewApi }; - return (h(ContentContainer, Object.assign({}, props, { elTag: props.elTag || 'div', elClasses: [ - ...buildViewClassNames(props.viewSpec), - ...(props.elClasses || []), - ], renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, generator: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children)); - } - } - function buildViewClassNames(viewSpec) { - return [ - `fc-${viewSpec.type}-view`, - 'fc-view', - ]; - } - - function parseRange(input, dateEnv) { - let start = null; - let end = null; - if (input.start) { - start = dateEnv.createMarker(input.start); - } - if (input.end) { - end = dateEnv.createMarker(input.end); - } - if (!start && !end) { - return null; - } - if (start && end && end < start) { - return null; - } - return { start, end }; - } - // SIDE-EFFECT: will mutate ranges. - // Will return a new array result. - function invertRanges(ranges, constraintRange) { - let invertedRanges = []; - let { start } = constraintRange; // the end of the previous range. the start of the new range - let i; - let dateRange; - // ranges need to be in order. required for our date-walking algorithm - ranges.sort(compareRanges); - for (i = 0; i < ranges.length; i += 1) { - dateRange = ranges[i]; - // add the span of time before the event (if there is any) - if (dateRange.start > start) { // compare millisecond time (skip any ambig logic) - invertedRanges.push({ start, end: dateRange.start }); - } - if (dateRange.end > start) { - start = dateRange.end; - } - } - // add the span of time after the last event (if there is any) - if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic) - invertedRanges.push({ start, end: constraintRange.end }); - } - return invertedRanges; - } - function compareRanges(range0, range1) { - return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first - } - function intersectRanges(range0, range1) { - let { start, end } = range0; - let newRange = null; - if (range1.start !== null) { - if (start === null) { - start = range1.start; - } - else { - start = new Date(Math.max(start.valueOf(), range1.start.valueOf())); - } - } - if (range1.end != null) { - if (end === null) { - end = range1.end; - } - else { - end = new Date(Math.min(end.valueOf(), range1.end.valueOf())); - } - } - if (start === null || end === null || start < end) { - newRange = { start, end }; - } - return newRange; - } - function rangesEqual(range0, range1) { - return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && - (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf()); - } - function rangesIntersect(range0, range1) { - return (range0.end === null || range1.start === null || range0.end > range1.start) && - (range0.start === null || range1.end === null || range0.start < range1.end); - } - function rangeContainsRange(outerRange, innerRange) { - return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) && - (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end)); - } - function rangeContainsMarker(range, date) { - return (range.start === null || date >= range.start) && - (range.end === null || date < range.end); - } - // If the given date is not within the given range, move it inside. - // (If it's past the end, make it one millisecond before the end). - function constrainMarkerToRange(date, range) { - if (range.start != null && date < range.start) { - return range.start; - } - if (range.end != null && date >= range.end) { - return new Date(range.end.valueOf() - 1); - } - return date; - } - - /* Date stuff that doesn't belong in datelib core - ----------------------------------------------------------------------------------------------------------------------*/ - // given a timed range, computes an all-day range that has the same exact duration, - // but whose start time is aligned with the start of the day. - function computeAlignedDayRange(timedRange) { - let dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1; - let start = startOfDay(timedRange.start); - let end = addDays(start, dayCnt); - return { start, end }; - } - // given a timed range, computes an all-day range based on how for the end date bleeds into the next day - // TODO: give nextDayThreshold a default arg - function computeVisibleDayRange(timedRange, nextDayThreshold = createDuration(0)) { - let startDay = null; - let endDay = null; - if (timedRange.end) { - endDay = startOfDay(timedRange.end); - let endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay` - // If the end time is actually inclusively part of the next day and is equal to or - // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`. - // Otherwise, leaving it as inclusive will cause it to exclude `endDay`. - if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) { - endDay = addDays(endDay, 1); - } - } - if (timedRange.start) { - startDay = startOfDay(timedRange.start); // the beginning of the day the range starts - // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day. - if (endDay && endDay <= startDay) { - endDay = addDays(startDay, 1); - } - } - return { start: startDay, end: endDay }; - } - // spans from one day into another? - function isMultiDayRange(range) { - let visibleRange = computeVisibleDayRange(range); - return diffDays(visibleRange.start, visibleRange.end) > 1; - } - function diffDates(date0, date1, dateEnv, largeUnit) { - if (largeUnit === 'year') { - return createDuration(dateEnv.diffWholeYears(date0, date1), 'year'); - } - if (largeUnit === 'month') { - return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month'); - } - return diffDayAndTime(date0, date1); // returns a duration - } - - function reduceCurrentDate(currentDate, action) { - switch (action.type) { - case 'CHANGE_DATE': - return action.dateMarker; - default: - return currentDate; - } - } - function getInitialDate(options, dateEnv) { - let initialDateInput = options.initialDate; - // compute the initial ambig-timezone date - if (initialDateInput != null) { - return dateEnv.createMarker(initialDateInput); - } - return getNow(options.now, dateEnv); // getNow already returns unzoned - } - function getNow(nowInput, dateEnv) { - if (typeof nowInput === 'function') { - nowInput = nowInput(); - } - if (nowInput == null) { - return dateEnv.createNowMarker(); - } - return dateEnv.createMarker(nowInput); - } - - class DateProfileGenerator { - constructor(props) { - this.props = props; - this.nowDate = getNow(props.nowInput, props.dateEnv); - this.initHiddenDays(); - } - /* Date Range Computation - ------------------------------------------------------------------------------------------------------------------*/ - // Builds a structure with info about what the dates/ranges will be for the "prev" view. - buildPrev(currentDateProfile, currentDate, forceToValid) { - let { dateEnv } = this.props; - let prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month - currentDateProfile.dateIncrement); - return this.build(prevDate, -1, forceToValid); - } - // Builds a structure with info about what the dates/ranges will be for the "next" view. - buildNext(currentDateProfile, currentDate, forceToValid) { - let { dateEnv } = this.props; - let nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month - currentDateProfile.dateIncrement); - return this.build(nextDate, 1, forceToValid); - } - // Builds a structure holding dates/ranges for rendering around the given date. - // Optional direction param indicates whether the date is being incremented/decremented - // from its previous value. decremented = -1, incremented = 1 (default). - build(currentDate, direction, forceToValid = true) { - let { props } = this; - let validRange; - let currentInfo; - let isRangeAllDay; - let renderRange; - let activeRange; - let isValid; - validRange = this.buildValidRange(); - validRange = this.trimHiddenDays(validRange); - if (forceToValid) { - currentDate = constrainMarkerToRange(currentDate, validRange); - } - currentInfo = this.buildCurrentRangeInfo(currentDate, direction); - isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit); - renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay); - renderRange = this.trimHiddenDays(renderRange); - activeRange = renderRange; - if (!props.showNonCurrentDates) { - activeRange = intersectRanges(activeRange, currentInfo.range); - } - activeRange = this.adjustActiveRange(activeRange); - activeRange = intersectRanges(activeRange, validRange); // might return null - // it's invalid if the originally requested date is not contained, - // or if the range is completely outside of the valid range. - isValid = rangesIntersect(currentInfo.range, validRange); - return { - // constraint for where prev/next operations can go and where events can be dragged/resized to. - // an object with optional start and end properties. - validRange, - // range the view is formally responsible for. - // for example, a month view might have 1st-31st, excluding padded dates - currentRange: currentInfo.range, - // name of largest unit being displayed, like "month" or "week" - currentRangeUnit: currentInfo.unit, - isRangeAllDay, - // dates that display events and accept drag-n-drop - // will be `null` if no dates accept events - activeRange, - // date range with a rendered skeleton - // includes not-active days that need some sort of DOM - renderRange, - // Duration object that denotes the first visible time of any given day - slotMinTime: props.slotMinTime, - // Duration object that denotes the exclusive visible end time of any given day - slotMaxTime: props.slotMaxTime, - isValid, - // how far the current date will move for a prev/next operation - dateIncrement: this.buildDateIncrement(currentInfo.duration), - // pass a fallback (might be null) ^ - }; - } - // Builds an object with optional start/end properties. - // Indicates the minimum/maximum dates to display. - // not responsible for trimming hidden days. - buildValidRange() { - let input = this.props.validRangeInput; - let simpleInput = typeof input === 'function' - ? input.call(this.props.calendarApi, this.nowDate) - : input; - return this.refineRange(simpleInput) || - { start: null, end: null }; // completely open-ended - } - // Builds a structure with info about the "current" range, the range that is - // highlighted as being the current month for example. - // See build() for a description of `direction`. - // Guaranteed to have `range` and `unit` properties. `duration` is optional. - buildCurrentRangeInfo(date, direction) { - let { props } = this; - let duration = null; - let unit = null; - let range = null; - let dayCount; - if (props.duration) { - duration = props.duration; - unit = props.durationUnit; - range = this.buildRangeFromDuration(date, direction, duration, unit); - } - else if ((dayCount = this.props.dayCount)) { - unit = 'day'; - range = this.buildRangeFromDayCount(date, direction, dayCount); - } - else if ((range = this.buildCustomVisibleRange(date))) { - unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit; - } - else { - duration = this.getFallbackDuration(); - unit = greatestDurationDenominator(duration).unit; - range = this.buildRangeFromDuration(date, direction, duration, unit); - } - return { duration, unit, range }; - } - getFallbackDuration() { - return createDuration({ day: 1 }); - } - // Returns a new activeRange to have time values (un-ambiguate) - // slotMinTime or slotMaxTime causes the range to expand. - adjustActiveRange(range) { - let { dateEnv, usesMinMaxTime, slotMinTime, slotMaxTime } = this.props; - let { start, end } = range; - if (usesMinMaxTime) { - // expand active range if slotMinTime is negative (why not when positive?) - if (asRoughDays(slotMinTime) < 0) { - start = startOfDay(start); // necessary? - start = dateEnv.add(start, slotMinTime); - } - // expand active range if slotMaxTime is beyond one day (why not when negative?) - if (asRoughDays(slotMaxTime) > 1) { - end = startOfDay(end); // necessary? - end = addDays(end, -1); - end = dateEnv.add(end, slotMaxTime); - } - } - return { start, end }; - } - // Builds the "current" range when it is specified as an explicit duration. - // `unit` is the already-computed greatestDurationDenominator unit of duration. - buildRangeFromDuration(date, direction, duration, unit) { - let { dateEnv, dateAlignment } = this.props; - let start; - let end; - let res; - // compute what the alignment should be - if (!dateAlignment) { - let { dateIncrement } = this.props; - if (dateIncrement) { - // use the smaller of the two units - if (asRoughMs(dateIncrement) < asRoughMs(duration)) { - dateAlignment = greatestDurationDenominator(dateIncrement).unit; - } - else { - dateAlignment = unit; - } - } - else { - dateAlignment = unit; - } - } - // if the view displays a single day or smaller - if (asRoughDays(duration) <= 1) { - if (this.isHiddenDay(start)) { - start = this.skipHiddenDays(start, direction); - start = startOfDay(start); - } - } - function computeRes() { - start = dateEnv.startOf(date, dateAlignment); - end = dateEnv.add(start, duration); - res = { start, end }; - } - computeRes(); - // if range is completely enveloped by hidden days, go past the hidden days - if (!this.trimHiddenDays(res)) { - date = this.skipHiddenDays(date, direction); - computeRes(); - } - return res; - } - // Builds the "current" range when a dayCount is specified. - buildRangeFromDayCount(date, direction, dayCount) { - let { dateEnv, dateAlignment } = this.props; - let runningCount = 0; - let start = date; - let end; - if (dateAlignment) { - start = dateEnv.startOf(start, dateAlignment); - } - start = startOfDay(start); - start = this.skipHiddenDays(start, direction); - end = start; - do { - end = addDays(end, 1); - if (!this.isHiddenDay(end)) { - runningCount += 1; - } - } while (runningCount < dayCount); - return { start, end }; - } - // Builds a normalized range object for the "visible" range, - // which is a way to define the currentRange and activeRange at the same time. - buildCustomVisibleRange(date) { - let { props } = this; - let input = props.visibleRangeInput; - let simpleInput = typeof input === 'function' - ? input.call(props.calendarApi, props.dateEnv.toDate(date)) - : input; - let range = this.refineRange(simpleInput); - if (range && (range.start == null || range.end == null)) { - return null; - } - return range; - } - // Computes the range that will represent the element/cells for *rendering*, - // but which may have voided days/times. - // not responsible for trimming hidden days. - buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) { - return currentRange; - } - // Compute the duration value that should be added/substracted to the current date - // when a prev/next operation happens. - buildDateIncrement(fallback) { - let { dateIncrement } = this.props; - let customAlignment; - if (dateIncrement) { - return dateIncrement; - } - if ((customAlignment = this.props.dateAlignment)) { - return createDuration(1, customAlignment); - } - if (fallback) { - return fallback; - } - return createDuration({ days: 1 }); - } - refineRange(rangeInput) { - if (rangeInput) { - let range = parseRange(rangeInput, this.props.dateEnv); - if (range) { - range = computeVisibleDayRange(range); - } - return range; - } - return null; - } - /* Hidden Days - ------------------------------------------------------------------------------------------------------------------*/ - // Initializes internal variables related to calculating hidden days-of-week - initHiddenDays() { - let hiddenDays = this.props.hiddenDays || []; // array of day-of-week indices that are hidden - let isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) - let dayCnt = 0; - let i; - if (this.props.weekends === false) { - hiddenDays.push(0, 6); // 0=sunday, 6=saturday - } - for (i = 0; i < 7; i += 1) { - if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) { - dayCnt += 1; - } - } - if (!dayCnt) { - throw new Error('invalid hiddenDays'); // all days were hidden? bad. - } - this.isHiddenDayHash = isHiddenDayHash; - } - // Remove days from the beginning and end of the range that are computed as hidden. - // If the whole range is trimmed off, returns null - trimHiddenDays(range) { - let { start, end } = range; - if (start) { - start = this.skipHiddenDays(start); - } - if (end) { - end = this.skipHiddenDays(end, -1, true); - } - if (start == null || end == null || start < end) { - return { start, end }; - } - return null; - } - // Is the current day hidden? - // `day` is a day-of-week index (0-6), or a Date (used for UTC) - isHiddenDay(day) { - if (day instanceof Date) { - day = day.getUTCDay(); - } - return this.isHiddenDayHash[day]; - } - // Incrementing the current day until it is no longer a hidden day, returning a copy. - // DOES NOT CONSIDER validRange! - // If the initial value of `date` is not a hidden day, don't do anything. - // Pass `isExclusive` as `true` if you are dealing with an end date. - // `inc` defaults to `1` (increment one day forward each time) - skipHiddenDays(date, inc = 1, isExclusive = false) { - while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) { - date = addDays(date, inc); - } - return date; - } - } - - function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) { - return { - instanceId: guid(), - defId, - range, - forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo, - forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo, - }; - } - - function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) { - for (let i = 0; i < recurringTypes.length; i += 1) { - let parsed = recurringTypes[i].parse(refined, dateEnv); - if (parsed) { - let { allDay } = refined; - if (allDay == null) { - allDay = defaultAllDay; - if (allDay == null) { - allDay = parsed.allDayGuess; - if (allDay == null) { - allDay = false; - } - } - } - return { - allDay, - duration: parsed.duration, - typeData: parsed.typeData, - typeId: i, - }; - } - } - return null; - } - function expandRecurring(eventStore, framingRange, context) { - let { dateEnv, pluginHooks, options } = context; - let { defs, instances } = eventStore; - // remove existing recurring instances - // TODO: bad. always expand events as a second step - instances = filterHash(instances, (instance) => !defs[instance.defId].recurringDef); - for (let defId in defs) { - let def = defs[defId]; - if (def.recurringDef) { - let { duration } = def.recurringDef; - if (!duration) { - duration = def.allDay ? - options.defaultAllDayEventDuration : - options.defaultTimedEventDuration; - } - let starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes); - for (let start of starts) { - let instance = createEventInstance(defId, { - start, - end: dateEnv.add(start, duration), - }); - instances[instance.instanceId] = instance; - } - } - } - return { defs, instances }; - } - /* - Event MUST have a recurringDef - */ - function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) { - let typeDef = recurringTypes[eventDef.recurringDef.typeId]; - let markers = typeDef.expand(eventDef.recurringDef.typeData, { - start: dateEnv.subtract(framingRange.start, duration), - end: framingRange.end, - }, dateEnv); - // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to - if (eventDef.allDay) { - markers = markers.map(startOfDay); - } - return markers; - } - - const EVENT_NON_DATE_REFINERS = { - id: String, - groupId: String, - title: String, - url: String, - interactive: Boolean, - }; - const EVENT_DATE_REFINERS = { - start: identity, - end: identity, - date: identity, - allDay: Boolean, - }; - const EVENT_REFINERS = Object.assign(Object.assign(Object.assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity }); - function parseEvent(raw, eventSource, context, allowOpenRange, refiners = buildEventRefiners(context)) { - let { refined, extra } = refineEventDef(raw, context, refiners); - let defaultAllDay = computeIsDefaultAllDay(eventSource, context); - let recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes); - if (recurringRes) { - let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context); - def.recurringDef = { - typeId: recurringRes.typeId, - typeData: recurringRes.typeData, - duration: recurringRes.duration, - }; - return { def, instance: null }; - } - let singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange); - if (singleRes) { - let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context); - let instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); - return { def, instance }; - } - return null; - } - function refineEventDef(raw, context, refiners = buildEventRefiners(context)) { - return refineProps(raw, refiners); - } - function buildEventRefiners(context) { - return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners); - } - /* - Will NOT populate extendedProps with the leftover properties. - Will NOT populate date-related props. - */ - function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) { - let def = { - title: refined.title || '', - groupId: refined.groupId || '', - publicId: refined.id || '', - url: refined.url || '', - recurringDef: null, - defId: guid(), - sourceId, - allDay, - hasEnd, - interactive: refined.interactive, - ui: createEventUi(refined, context), - extendedProps: Object.assign(Object.assign({}, (refined.extendedProps || {})), extra), - }; - for (let memberAdder of context.pluginHooks.eventDefMemberAdders) { - Object.assign(def, memberAdder(refined)); - } - // help out EventImpl from having user modify props - Object.freeze(def.ui.classNames); - Object.freeze(def.extendedProps); - return def; - } - function parseSingle(refined, defaultAllDay, context, allowOpenRange) { - let { allDay } = refined; - let startMeta; - let startMarker = null; - let hasEnd = false; - let endMeta; - let endMarker = null; - let startInput = refined.start != null ? refined.start : refined.date; - startMeta = context.dateEnv.createMarkerMeta(startInput); - if (startMeta) { - startMarker = startMeta.marker; - } - else if (!allowOpenRange) { - return null; - } - if (refined.end != null) { - endMeta = context.dateEnv.createMarkerMeta(refined.end); - } - if (allDay == null) { - if (defaultAllDay != null) { - allDay = defaultAllDay; - } - else { - // fall back to the date props LAST - allDay = (!startMeta || startMeta.isTimeUnspecified) && - (!endMeta || endMeta.isTimeUnspecified); - } - } - if (allDay && startMarker) { - startMarker = startOfDay(startMarker); - } - if (endMeta) { - endMarker = endMeta.marker; - if (allDay) { - endMarker = startOfDay(endMarker); - } - if (startMarker && endMarker <= startMarker) { - endMarker = null; - } - } - if (endMarker) { - hasEnd = true; - } - else if (!allowOpenRange) { - hasEnd = context.options.forceEventDuration || false; - endMarker = context.dateEnv.add(startMarker, allDay ? - context.options.defaultAllDayEventDuration : - context.options.defaultTimedEventDuration); - } - return { - allDay, - hasEnd, - range: { start: startMarker, end: endMarker }, - forcedStartTzo: startMeta ? startMeta.forcedTzo : null, - forcedEndTzo: endMeta ? endMeta.forcedTzo : null, - }; - } - function computeIsDefaultAllDay(eventSource, context) { - let res = null; - if (eventSource) { - res = eventSource.defaultAllDay; - } - if (res == null) { - res = context.options.defaultAllDay; - } - return res; - } - - function parseEvents(rawEvents, eventSource, context, allowOpenRange) { - let eventStore = createEmptyEventStore(); - let eventRefiners = buildEventRefiners(context); - for (let rawEvent of rawEvents) { - let tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners); - if (tuple) { - eventTupleToStore(tuple, eventStore); - } - } - return eventStore; - } - function eventTupleToStore(tuple, eventStore = createEmptyEventStore()) { - eventStore.defs[tuple.def.defId] = tuple.def; - if (tuple.instance) { - eventStore.instances[tuple.instance.instanceId] = tuple.instance; - } - return eventStore; - } - // retrieves events that have the same groupId as the instance specified by `instanceId` - // or they are the same as the instance. - // why might instanceId not be in the store? an event from another calendar? - function getRelevantEvents(eventStore, instanceId) { - let instance = eventStore.instances[instanceId]; - if (instance) { - let def = eventStore.defs[instance.defId]; - // get events/instances with same group - let newStore = filterEventStoreDefs(eventStore, (lookDef) => isEventDefsGrouped(def, lookDef)); - // add the original - // TODO: wish we could use eventTupleToStore or something like it - newStore.defs[def.defId] = def; - newStore.instances[instance.instanceId] = instance; - return newStore; - } - return createEmptyEventStore(); - } - function isEventDefsGrouped(def0, def1) { - return Boolean(def0.groupId && def0.groupId === def1.groupId); - } - function createEmptyEventStore() { - return { defs: {}, instances: {} }; - } - function mergeEventStores(store0, store1) { - return { - defs: Object.assign(Object.assign({}, store0.defs), store1.defs), - instances: Object.assign(Object.assign({}, store0.instances), store1.instances), - }; - } - function filterEventStoreDefs(eventStore, filterFunc) { - let defs = filterHash(eventStore.defs, filterFunc); - let instances = filterHash(eventStore.instances, (instance) => (defs[instance.defId] // still exists? - )); - return { defs, instances }; - } - function excludeSubEventStore(master, sub) { - let { defs, instances } = master; - let filteredDefs = {}; - let filteredInstances = {}; - for (let defId in defs) { - if (!sub.defs[defId]) { // not explicitly excluded - filteredDefs[defId] = defs[defId]; - } - } - for (let instanceId in instances) { - if (!sub.instances[instanceId] && // not explicitly excluded - filteredDefs[instances[instanceId].defId] // def wasn't filtered away - ) { - filteredInstances[instanceId] = instances[instanceId]; - } - } - return { - defs: filteredDefs, - instances: filteredInstances, - }; - } - - function normalizeConstraint(input, context) { - if (Array.isArray(input)) { - return parseEvents(input, null, context, true); // allowOpenRange=true - } - if (typeof input === 'object' && input) { // non-null object - return parseEvents([input], null, context, true); // allowOpenRange=true - } - if (input != null) { - return String(input); - } - return null; - } - - function parseClassNames(raw) { - if (Array.isArray(raw)) { - return raw; - } - if (typeof raw === 'string') { - return raw.split(/\s+/); - } - return []; - } - - // TODO: better called "EventSettings" or "EventConfig" - // TODO: move this file into structs - // TODO: separate constraint/overlap/allow, because selection uses only that, not other props - const EVENT_UI_REFINERS = { - display: String, - editable: Boolean, - startEditable: Boolean, - durationEditable: Boolean, - constraint: identity, - overlap: identity, - allow: identity, - className: parseClassNames, - classNames: parseClassNames, - color: String, - backgroundColor: String, - borderColor: String, - textColor: String, - }; - const EMPTY_EVENT_UI = { - display: null, - startEditable: null, - durationEditable: null, - constraints: [], - overlap: null, - allows: [], - backgroundColor: '', - borderColor: '', - textColor: '', - classNames: [], - }; - function createEventUi(refined, context) { - let constraint = normalizeConstraint(refined.constraint, context); - return { - display: refined.display || null, - startEditable: refined.startEditable != null ? refined.startEditable : refined.editable, - durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable, - constraints: constraint != null ? [constraint] : [], - overlap: refined.overlap != null ? refined.overlap : null, - allows: refined.allow != null ? [refined.allow] : [], - backgroundColor: refined.backgroundColor || refined.color || '', - borderColor: refined.borderColor || refined.color || '', - textColor: refined.textColor || '', - classNames: (refined.className || []).concat(refined.classNames || []), // join singular and plural - }; - } - // TODO: prevent against problems with <2 args! - function combineEventUis(uis) { - return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI); - } - function combineTwoEventUis(item0, item1) { - return { - display: item1.display != null ? item1.display : item0.display, - startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable, - durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable, - constraints: item0.constraints.concat(item1.constraints), - overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap, - allows: item0.allows.concat(item1.allows), - backgroundColor: item1.backgroundColor || item0.backgroundColor, - borderColor: item1.borderColor || item0.borderColor, - textColor: item1.textColor || item0.textColor, - classNames: item0.classNames.concat(item1.classNames), - }; - } - - const EVENT_SOURCE_REFINERS = { - id: String, - defaultAllDay: Boolean, - url: String, - format: String, - events: identity, - eventDataTransform: identity, - // for any network-related sources - success: identity, - failure: identity, - }; - function parseEventSource(raw, context, refiners = buildEventSourceRefiners(context)) { - let rawObj; - if (typeof raw === 'string') { - rawObj = { url: raw }; - } - else if (typeof raw === 'function' || Array.isArray(raw)) { - rawObj = { events: raw }; - } - else if (typeof raw === 'object' && raw) { // not null - rawObj = raw; - } - if (rawObj) { - let { refined, extra } = refineProps(rawObj, refiners); - let metaRes = buildEventSourceMeta(refined, context); - if (metaRes) { - return { - _raw: raw, - isFetching: false, - latestFetchId: '', - fetchRange: null, - defaultAllDay: refined.defaultAllDay, - eventDataTransform: refined.eventDataTransform, - success: refined.success, - failure: refined.failure, - publicId: refined.id || '', - sourceId: guid(), - sourceDefId: metaRes.sourceDefId, - meta: metaRes.meta, - ui: createEventUi(refined, context), - extendedProps: extra, - }; - } - } - return null; - } - function buildEventSourceRefiners(context) { - return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners); - } - function buildEventSourceMeta(raw, context) { - let defs = context.pluginHooks.eventSourceDefs; - for (let i = defs.length - 1; i >= 0; i -= 1) { // later-added plugins take precedence - let def = defs[i]; - let meta = def.parseMeta(raw); - if (meta) { - return { sourceDefId: i, meta }; - } - } - return null; - } - - function reduceEventStore(eventStore, action, eventSources, dateProfile, context) { - switch (action.type) { - case 'RECEIVE_EVENTS': // raw - return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context); - case 'ADD_EVENTS': // already parsed, but not expanded - return addEvent(eventStore, action.eventStore, // new ones - dateProfile ? dateProfile.activeRange : null, context); - case 'RESET_EVENTS': - return action.eventStore; - case 'MERGE_EVENTS': // already parsed and expanded - return mergeEventStores(eventStore, action.eventStore); - case 'PREV': // TODO: how do we track all actions that affect dateProfile :( - case 'NEXT': - case 'CHANGE_DATE': - case 'CHANGE_VIEW_TYPE': - if (dateProfile) { - return expandRecurring(eventStore, dateProfile.activeRange, context); - } - return eventStore; - case 'REMOVE_EVENTS': - return excludeSubEventStore(eventStore, action.eventStore); - case 'REMOVE_EVENT_SOURCE': - return excludeEventsBySourceId(eventStore, action.sourceId); - case 'REMOVE_ALL_EVENT_SOURCES': - return filterEventStoreDefs(eventStore, (eventDef) => (!eventDef.sourceId // only keep events with no source id - )); - case 'REMOVE_ALL_EVENTS': - return createEmptyEventStore(); - default: - return eventStore; - } - } - function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) { - if (eventSource && // not already removed - fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources - ) { - let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context); - if (fetchRange) { - subset = expandRecurring(subset, fetchRange, context); - } - return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset); - } - return eventStore; - } - function transformRawEvents(rawEvents, eventSource, context) { - let calEachTransform = context.options.eventDataTransform; - let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; - if (sourceEachTransform) { - rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform); - } - if (calEachTransform) { - rawEvents = transformEachRawEvent(rawEvents, calEachTransform); - } - return rawEvents; - } - function transformEachRawEvent(rawEvents, func) { - let refinedEvents; - if (!func) { - refinedEvents = rawEvents; - } - else { - refinedEvents = []; - for (let rawEvent of rawEvents) { - let refinedEvent = func(rawEvent); - if (refinedEvent) { - refinedEvents.push(refinedEvent); - } - else if (refinedEvent == null) { - refinedEvents.push(rawEvent); - } // if a different falsy value, do nothing - } - } - return refinedEvents; - } - function addEvent(eventStore, subset, expandRange, context) { - if (expandRange) { - subset = expandRecurring(subset, expandRange, context); - } - return mergeEventStores(eventStore, subset); - } - function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) { - let { defs } = eventStore; - let instances = mapHash(eventStore.instances, (instance) => { - let def = defs[instance.defId]; - if (def.allDay || def.recurringDef) { - return instance; // isn't dependent on timezone - } - return Object.assign(Object.assign({}, instance), { range: { - start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)), - end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)), - }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo }); - }); - return { defs, instances }; - } - function excludeEventsBySourceId(eventStore, sourceId) { - return filterEventStoreDefs(eventStore, (eventDef) => eventDef.sourceId !== sourceId); - } - // QUESTION: why not just return instances? do a general object-property-exclusion util - function excludeInstances(eventStore, removals) { - return { - defs: eventStore.defs, - instances: filterHash(eventStore.instances, (instance) => !removals[instance.instanceId]), - }; - } - - class Emitter { - constructor() { - this.handlers = {}; - this.thisContext = null; - } - setThisContext(thisContext) { - this.thisContext = thisContext; - } - setOptions(options) { - this.options = options; - } - on(type, handler) { - addToHash(this.handlers, type, handler); - } - off(type, handler) { - removeFromHash(this.handlers, type, handler); - } - trigger(type, ...args) { - let attachedHandlers = this.handlers[type] || []; - let optionHandler = this.options && this.options[type]; - let handlers = [].concat(optionHandler || [], attachedHandlers); - for (let handler of handlers) { - handler.apply(this.thisContext, args); - } - } - hasHandlers(type) { - return Boolean((this.handlers[type] && this.handlers[type].length) || - (this.options && this.options[type])); - } - } - function addToHash(hash, type, handler) { - (hash[type] || (hash[type] = [])) - .push(handler); - } - function removeFromHash(hash, type, handler) { - if (handler) { - if (hash[type]) { - hash[type] = hash[type].filter((func) => func !== handler); - } - } - else { - delete hash[type]; // remove all handler funcs for this type - } - } - - const DEF_DEFAULTS = { - startTime: '09:00', - endTime: '17:00', - daysOfWeek: [1, 2, 3, 4, 5], - display: 'inverse-background', - classNames: 'fc-non-business', - groupId: '_businessHours', // so multiple defs get grouped - }; - /* - TODO: pass around as EventDefHash!!! - */ - function parseBusinessHours(input, context) { - return parseEvents(refineInputs(input), null, context); - } - function refineInputs(input) { - let rawDefs; - if (input === true) { - rawDefs = [{}]; // will get DEF_DEFAULTS verbatim - } - else if (Array.isArray(input)) { - // if specifying an array, every sub-definition NEEDS a day-of-week - rawDefs = input.filter((rawDef) => rawDef.daysOfWeek); - } - else if (typeof input === 'object' && input) { // non-null object - rawDefs = [input]; - } - else { // is probably false - rawDefs = []; - } - rawDefs = rawDefs.map((rawDef) => (Object.assign(Object.assign({}, DEF_DEFAULTS), rawDef))); - return rawDefs; - } - - function triggerDateSelect(selection, pev, context) { - context.emitter.trigger('select', Object.assign(Object.assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view })); - } - function triggerDateUnselect(pev, context) { - context.emitter.trigger('unselect', { - jsEvent: pev ? pev.origEvent : null, - view: context.viewApi || context.calendarApi.view, - }); - } - function buildDateSpanApiWithContext(dateSpan, context) { - let props = {}; - for (let transform of context.pluginHooks.dateSpanTransforms) { - Object.assign(props, transform(dateSpan, context)); - } - Object.assign(props, buildDateSpanApi(dateSpan, context.dateEnv)); - return props; - } - // Given an event's allDay status and start date, return what its fallback end date should be. - // TODO: rename to computeDefaultEventEnd - function getDefaultEventEnd(allDay, marker, context) { - let { dateEnv, options } = context; - let end = marker; - if (allDay) { - end = startOfDay(end); - end = dateEnv.add(end, options.defaultAllDayEventDuration); - } - else { - end = dateEnv.add(end, options.defaultTimedEventDuration); - } - return end; - } - - // applies the mutation to ALL defs/instances within the event store - function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) { - let eventConfigs = compileEventUis(eventStore.defs, eventConfigBase); - let dest = createEmptyEventStore(); - for (let defId in eventStore.defs) { - let def = eventStore.defs[defId]; - dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context); - } - for (let instanceId in eventStore.instances) { - let instance = eventStore.instances[instanceId]; - let def = dest.defs[instance.defId]; // important to grab the newly modified def - dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context); - } - return dest; - } - function applyMutationToEventDef(eventDef, eventConfig, mutation, context) { - let standardProps = mutation.standardProps || {}; - // if hasEnd has not been specified, guess a good value based on deltas. - // if duration will change, there's no way the default duration will persist, - // and thus, we need to mark the event as having a real end - if (standardProps.hasEnd == null && - eventConfig.durationEditable && - (mutation.startDelta || mutation.endDelta)) { - standardProps.hasEnd = true; // TODO: is this mutation okay? - } - let copy = Object.assign(Object.assign(Object.assign({}, eventDef), standardProps), { ui: Object.assign(Object.assign({}, eventDef.ui), standardProps.ui) }); - if (mutation.extendedProps) { - copy.extendedProps = Object.assign(Object.assign({}, copy.extendedProps), mutation.extendedProps); - } - for (let applier of context.pluginHooks.eventDefMutationAppliers) { - applier(copy, mutation, context); - } - if (!copy.hasEnd && context.options.forceEventDuration) { - copy.hasEnd = true; - } - return copy; - } - function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef - eventConfig, mutation, context) { - let { dateEnv } = context; - let forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true; - let clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false; - let copy = Object.assign({}, eventInstance); - if (forceAllDay) { - copy.range = computeAlignedDayRange(copy.range); - } - if (mutation.datesDelta && eventConfig.startEditable) { - copy.range = { - start: dateEnv.add(copy.range.start, mutation.datesDelta), - end: dateEnv.add(copy.range.end, mutation.datesDelta), - }; - } - if (mutation.startDelta && eventConfig.durationEditable) { - copy.range = { - start: dateEnv.add(copy.range.start, mutation.startDelta), - end: copy.range.end, - }; - } - if (mutation.endDelta && eventConfig.durationEditable) { - copy.range = { - start: copy.range.start, - end: dateEnv.add(copy.range.end, mutation.endDelta), - }; - } - if (clearEnd) { - copy.range = { - start: copy.range.start, - end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context), - }; - } - // in case event was all-day but the supplied deltas were not - // better util for this? - if (eventDef.allDay) { - copy.range = { - start: startOfDay(copy.range.start), - end: startOfDay(copy.range.end), - }; - } - // handle invalid durations - if (copy.range.end < copy.range.start) { - copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context); - } - return copy; - } - - class EventSourceImpl { - constructor(context, internalEventSource) { - this.context = context; - this.internalEventSource = internalEventSource; - } - remove() { - this.context.dispatch({ - type: 'REMOVE_EVENT_SOURCE', - sourceId: this.internalEventSource.sourceId, - }); - } - refetch() { - this.context.dispatch({ - type: 'FETCH_EVENT_SOURCES', - sourceIds: [this.internalEventSource.sourceId], - isRefetch: true, - }); - } - get id() { - return this.internalEventSource.publicId; - } - get url() { - return this.internalEventSource.meta.url; - } - get format() { - return this.internalEventSource.meta.format; // TODO: bad. not guaranteed - } - } - - class EventImpl { - // instance will be null if expressing a recurring event that has no current instances, - // OR if trying to validate an incoming external event that has no dates assigned - constructor(context, def, instance) { - this._context = context; - this._def = def; - this._instance = instance || null; - } - /* - TODO: make event struct more responsible for this - */ - setProp(name, val) { - if (name in EVENT_DATE_REFINERS) { - console.warn('Could not set date-related prop \'name\'. Use one of the date-related methods instead.'); - // TODO: make proper aliasing system? - } - else if (name === 'id') { - val = EVENT_NON_DATE_REFINERS[name](val); - this.mutate({ - standardProps: { publicId: val }, // hardcoded internal name - }); - } - else if (name in EVENT_NON_DATE_REFINERS) { - val = EVENT_NON_DATE_REFINERS[name](val); - this.mutate({ - standardProps: { [name]: val }, - }); - } - else if (name in EVENT_UI_REFINERS) { - let ui = EVENT_UI_REFINERS[name](val); - if (name === 'color') { - ui = { backgroundColor: val, borderColor: val }; - } - else if (name === 'editable') { - ui = { startEditable: val, durationEditable: val }; - } - else { - ui = { [name]: val }; - } - this.mutate({ - standardProps: { ui }, - }); - } - else { - console.warn(`Could not set prop '${name}'. Use setExtendedProp instead.`); - } - } - setExtendedProp(name, val) { - this.mutate({ - extendedProps: { [name]: val }, - }); - } - setStart(startInput, options = {}) { - let { dateEnv } = this._context; - let start = dateEnv.createMarker(startInput); - if (start && this._instance) { // TODO: warning if parsed bad - let instanceRange = this._instance.range; - let startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!? - if (options.maintainDuration) { - this.mutate({ datesDelta: startDelta }); - } - else { - this.mutate({ startDelta }); - } - } - } - setEnd(endInput, options = {}) { - let { dateEnv } = this._context; - let end; - if (endInput != null) { - end = dateEnv.createMarker(endInput); - if (!end) { - return; // TODO: warning if parsed bad - } - } - if (this._instance) { - if (end) { - let endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity); - this.mutate({ endDelta }); - } - else { - this.mutate({ standardProps: { hasEnd: false } }); - } - } - } - setDates(startInput, endInput, options = {}) { - let { dateEnv } = this._context; - let standardProps = { allDay: options.allDay }; - let start = dateEnv.createMarker(startInput); - let end; - if (!start) { - return; // TODO: warning if parsed bad - } - if (endInput != null) { - end = dateEnv.createMarker(endInput); - if (!end) { // TODO: warning if parsed bad - return; - } - } - if (this._instance) { - let instanceRange = this._instance.range; - // when computing the diff for an event being converted to all-day, - // compute diff off of the all-day values the way event-mutation does. - if (options.allDay === true) { - instanceRange = computeAlignedDayRange(instanceRange); - } - let startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); - if (end) { - let endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity); - if (durationsEqual(startDelta, endDelta)) { - this.mutate({ datesDelta: startDelta, standardProps }); - } - else { - this.mutate({ startDelta, endDelta, standardProps }); - } - } - else { // means "clear the end" - standardProps.hasEnd = false; - this.mutate({ datesDelta: startDelta, standardProps }); - } - } - } - moveStart(deltaInput) { - let delta = createDuration(deltaInput); - if (delta) { // TODO: warning if parsed bad - this.mutate({ startDelta: delta }); - } - } - moveEnd(deltaInput) { - let delta = createDuration(deltaInput); - if (delta) { // TODO: warning if parsed bad - this.mutate({ endDelta: delta }); - } - } - moveDates(deltaInput) { - let delta = createDuration(deltaInput); - if (delta) { // TODO: warning if parsed bad - this.mutate({ datesDelta: delta }); - } - } - setAllDay(allDay, options = {}) { - let standardProps = { allDay }; - let { maintainDuration } = options; - if (maintainDuration == null) { - maintainDuration = this._context.options.allDayMaintainDuration; - } - if (this._def.allDay !== allDay) { - standardProps.hasEnd = maintainDuration; - } - this.mutate({ standardProps }); - } - formatRange(formatInput) { - let { dateEnv } = this._context; - let instance = this._instance; - let formatter = createFormatter(formatInput); - if (this._def.hasEnd) { - return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, { - forcedStartTzo: instance.forcedStartTzo, - forcedEndTzo: instance.forcedEndTzo, - }); - } - return dateEnv.format(instance.range.start, formatter, { - forcedTzo: instance.forcedStartTzo, - }); - } - mutate(mutation) { - let instance = this._instance; - if (instance) { - let def = this._def; - let context = this._context; - let { eventStore } = context.getCurrentData(); - let relevantEvents = getRelevantEvents(eventStore, instance.instanceId); - let eventConfigBase = { - '': { - display: '', - startEditable: true, - durationEditable: true, - constraints: [], - overlap: null, - allows: [], - backgroundColor: '', - borderColor: '', - textColor: '', - classNames: [], - }, - }; - relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context); - let oldEvent = new EventImpl(context, def, instance); // snapshot - this._def = relevantEvents.defs[def.defId]; - this._instance = relevantEvents.instances[instance.instanceId]; - context.dispatch({ - type: 'MERGE_EVENTS', - eventStore: relevantEvents, - }); - context.emitter.trigger('eventChange', { - oldEvent, - event: this, - relatedEvents: buildEventApis(relevantEvents, context, instance), - revert() { - context.dispatch({ - type: 'RESET_EVENTS', - eventStore, // the ORIGINAL store - }); - }, - }); - } - } - remove() { - let context = this._context; - let asStore = eventApiToStore(this); - context.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: asStore, - }); - context.emitter.trigger('eventRemove', { - event: this, - relatedEvents: [], - revert() { - context.dispatch({ - type: 'MERGE_EVENTS', - eventStore: asStore, - }); - }, - }); - } - get source() { - let { sourceId } = this._def; - if (sourceId) { - return new EventSourceImpl(this._context, this._context.getCurrentData().eventSources[sourceId]); - } - return null; - } - get start() { - return this._instance ? - this._context.dateEnv.toDate(this._instance.range.start) : - null; - } - get end() { - return (this._instance && this._def.hasEnd) ? - this._context.dateEnv.toDate(this._instance.range.end) : - null; - } - get startStr() { - let instance = this._instance; - if (instance) { - return this._context.dateEnv.formatIso(instance.range.start, { - omitTime: this._def.allDay, - forcedTzo: instance.forcedStartTzo, - }); - } - return ''; - } - get endStr() { - let instance = this._instance; - if (instance && this._def.hasEnd) { - return this._context.dateEnv.formatIso(instance.range.end, { - omitTime: this._def.allDay, - forcedTzo: instance.forcedEndTzo, - }); - } - return ''; - } - // computable props that all access the def - // TODO: find a TypeScript-compatible way to do this at scale - get id() { return this._def.publicId; } - get groupId() { return this._def.groupId; } - get allDay() { return this._def.allDay; } - get title() { return this._def.title; } - get url() { return this._def.url; } - get display() { return this._def.ui.display || 'auto'; } // bad. just normalize the type earlier - get startEditable() { return this._def.ui.startEditable; } - get durationEditable() { return this._def.ui.durationEditable; } - get constraint() { return this._def.ui.constraints[0] || null; } - get overlap() { return this._def.ui.overlap; } - get allow() { return this._def.ui.allows[0] || null; } - get backgroundColor() { return this._def.ui.backgroundColor; } - get borderColor() { return this._def.ui.borderColor; } - get textColor() { return this._def.ui.textColor; } - // NOTE: user can't modify these because Object.freeze was called in event-def parsing - get classNames() { return this._def.ui.classNames; } - get extendedProps() { return this._def.extendedProps; } - toPlainObject(settings = {}) { - let def = this._def; - let { ui } = def; - let { startStr, endStr } = this; - let res = {}; - if (def.title) { - res.title = def.title; - } - if (startStr) { - res.start = startStr; - } - if (endStr) { - res.end = endStr; - } - if (def.publicId) { - res.id = def.publicId; - } - if (def.groupId) { - res.groupId = def.groupId; - } - if (def.url) { - res.url = def.url; - } - if (ui.display && ui.display !== 'auto') { - res.display = ui.display; - } - // TODO: what about recurring-event properties??? - // TODO: include startEditable/durationEditable/constraint/overlap/allow - if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) { - res.color = ui.backgroundColor; - } - else { - if (ui.backgroundColor) { - res.backgroundColor = ui.backgroundColor; - } - if (ui.borderColor) { - res.borderColor = ui.borderColor; - } - } - if (ui.textColor) { - res.textColor = ui.textColor; - } - if (ui.classNames.length) { - res.classNames = ui.classNames; - } - if (Object.keys(def.extendedProps).length) { - if (settings.collapseExtendedProps) { - Object.assign(res, def.extendedProps); - } - else { - res.extendedProps = def.extendedProps; - } - } - return res; - } - toJSON() { - return this.toPlainObject(); - } - } - function eventApiToStore(eventApi) { - let def = eventApi._def; - let instance = eventApi._instance; - return { - defs: { [def.defId]: def }, - instances: instance - ? { [instance.instanceId]: instance } - : {}, - }; - } - function buildEventApis(eventStore, context, excludeInstance) { - let { defs, instances } = eventStore; - let eventApis = []; - let excludeInstanceId = excludeInstance ? excludeInstance.instanceId : ''; - for (let id in instances) { - let instance = instances[id]; - let def = defs[instance.defId]; - if (instance.instanceId !== excludeInstanceId) { - eventApis.push(new EventImpl(context, def, instance)); - } - } - return eventApis; - } - - /* - Specifying nextDayThreshold signals that all-day ranges should be sliced. - */ - function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) { - let inverseBgByGroupId = {}; - let inverseBgByDefId = {}; - let defByGroupId = {}; - let bgRanges = []; - let fgRanges = []; - let eventUis = compileEventUis(eventStore.defs, eventUiBases); - for (let defId in eventStore.defs) { - let def = eventStore.defs[defId]; - let ui = eventUis[def.defId]; - if (ui.display === 'inverse-background') { - if (def.groupId) { - inverseBgByGroupId[def.groupId] = []; - if (!defByGroupId[def.groupId]) { - defByGroupId[def.groupId] = def; - } - } - else { - inverseBgByDefId[defId] = []; - } - } - } - for (let instanceId in eventStore.instances) { - let instance = eventStore.instances[instanceId]; - let def = eventStore.defs[instance.defId]; - let ui = eventUis[def.defId]; - let origRange = instance.range; - let normalRange = (!def.allDay && nextDayThreshold) ? - computeVisibleDayRange(origRange, nextDayThreshold) : - origRange; - let slicedRange = intersectRanges(normalRange, framingRange); - if (slicedRange) { - if (ui.display === 'inverse-background') { - if (def.groupId) { - inverseBgByGroupId[def.groupId].push(slicedRange); - } - else { - inverseBgByDefId[instance.defId].push(slicedRange); - } - } - else if (ui.display !== 'none') { - (ui.display === 'background' ? bgRanges : fgRanges).push({ - def, - ui, - instance, - range: slicedRange, - isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(), - isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf(), - }); - } - } - } - for (let groupId in inverseBgByGroupId) { // BY GROUP - let ranges = inverseBgByGroupId[groupId]; - let invertedRanges = invertRanges(ranges, framingRange); - for (let invertedRange of invertedRanges) { - let def = defByGroupId[groupId]; - let ui = eventUis[def.defId]; - bgRanges.push({ - def, - ui, - instance: null, - range: invertedRange, - isStart: false, - isEnd: false, - }); - } - } - for (let defId in inverseBgByDefId) { - let ranges = inverseBgByDefId[defId]; - let invertedRanges = invertRanges(ranges, framingRange); - for (let invertedRange of invertedRanges) { - bgRanges.push({ - def: eventStore.defs[defId], - ui: eventUis[defId], - instance: null, - range: invertedRange, - isStart: false, - isEnd: false, - }); - } - } - return { bg: bgRanges, fg: fgRanges }; - } - function hasBgRendering(def) { - return def.ui.display === 'background' || def.ui.display === 'inverse-background'; - } - function setElSeg(el, seg) { - el.fcSeg = seg; - } - function getElSeg(el) { - return el.fcSeg || - el.parentNode.fcSeg || // for the harness - null; - } - // event ui computation - function compileEventUis(eventDefs, eventUiBases) { - return mapHash(eventDefs, (eventDef) => compileEventUi(eventDef, eventUiBases)); - } - function compileEventUi(eventDef, eventUiBases) { - let uis = []; - if (eventUiBases['']) { - uis.push(eventUiBases['']); - } - if (eventUiBases[eventDef.defId]) { - uis.push(eventUiBases[eventDef.defId]); - } - uis.push(eventDef.ui); - return combineEventUis(uis); - } - function sortEventSegs(segs, eventOrderSpecs) { - let objs = segs.map(buildSegCompareObj); - objs.sort((obj0, obj1) => compareByFieldSpecs(obj0, obj1, eventOrderSpecs)); - return objs.map((c) => c._seg); - } - // returns a object with all primitive props that can be compared - function buildSegCompareObj(seg) { - let { eventRange } = seg; - let eventDef = eventRange.def; - let range = eventRange.instance ? eventRange.instance.range : eventRange.range; - let start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events - let end = range.end ? range.end.valueOf() : 0; // " - return Object.assign(Object.assign(Object.assign({}, eventDef.extendedProps), eventDef), { id: eventDef.publicId, start, - end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg }); - } - function computeSegDraggable(seg, context) { - let { pluginHooks } = context; - let transformers = pluginHooks.isDraggableTransformers; - let { def, ui } = seg.eventRange; - let val = ui.startEditable; - for (let transformer of transformers) { - val = transformer(val, def, ui, context); - } - return val; - } - function computeSegStartResizable(seg, context) { - return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart; - } - function computeSegEndResizable(seg, context) { - return seg.isEnd && seg.eventRange.ui.durationEditable; - } - function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, // defaults to true - defaultDisplayEventEnd, // defaults to true - startOverride, endOverride) { - let { dateEnv, options } = context; - let { displayEventTime, displayEventEnd } = options; - let eventDef = seg.eventRange.def; - let eventInstance = seg.eventRange.instance; - if (displayEventTime == null) { - displayEventTime = defaultDisplayEventTime !== false; - } - if (displayEventEnd == null) { - displayEventEnd = defaultDisplayEventEnd !== false; - } - let wholeEventStart = eventInstance.range.start; - let wholeEventEnd = eventInstance.range.end; - let segStart = startOverride || seg.start || seg.eventRange.range.start; - let segEnd = endOverride || seg.end || seg.eventRange.range.end; - let isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf(); - let isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf(); - if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) { - segStart = isStartDay ? wholeEventStart : segStart; - segEnd = isEndDay ? wholeEventEnd : segEnd; - if (displayEventEnd && eventDef.hasEnd) { - return dateEnv.formatRange(segStart, segEnd, timeFormat, { - forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo, - forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo, - }); - } - return dateEnv.format(segStart, timeFormat, { - forcedTzo: startOverride ? null : eventInstance.forcedStartTzo, // nooooo, same - }); - } - return ''; - } - function getSegMeta(seg, todayRange, nowDate) { - let segRange = seg.eventRange.range; - return { - isPast: segRange.end < (nowDate || todayRange.start), - isFuture: segRange.start >= (nowDate || todayRange.end), - isToday: todayRange && rangeContainsMarker(todayRange, segRange.start), - }; - } - function getEventClassNames(props) { - let classNames = ['fc-event']; - if (props.isMirror) { - classNames.push('fc-event-mirror'); - } - if (props.isDraggable) { - classNames.push('fc-event-draggable'); - } - if (props.isStartResizable || props.isEndResizable) { - classNames.push('fc-event-resizable'); - } - if (props.isDragging) { - classNames.push('fc-event-dragging'); - } - if (props.isResizing) { - classNames.push('fc-event-resizing'); - } - if (props.isSelected) { - classNames.push('fc-event-selected'); - } - if (props.isStart) { - classNames.push('fc-event-start'); - } - if (props.isEnd) { - classNames.push('fc-event-end'); - } - if (props.isPast) { - classNames.push('fc-event-past'); - } - if (props.isToday) { - classNames.push('fc-event-today'); - } - if (props.isFuture) { - classNames.push('fc-event-future'); - } - return classNames; - } - function buildEventRangeKey(eventRange) { - return eventRange.instance - ? eventRange.instance.instanceId - : `${eventRange.def.defId}:${eventRange.range.start.toISOString()}`; - // inverse-background events don't have specific instances. TODO: better solution - } - function getSegAnchorAttrs(seg, context) { - let { def, instance } = seg.eventRange; - let { url } = def; - if (url) { - return { href: url }; - } - let { emitter, options } = context; - let { eventInteractive } = options; - if (eventInteractive == null) { - eventInteractive = def.interactive; - if (eventInteractive == null) { - eventInteractive = Boolean(emitter.hasHandlers('eventClick')); - } - } - // mock what happens in EventClicking - if (eventInteractive) { - // only attach keyboard-related handlers because click handler is already done in EventClicking - return createAriaKeyboardAttrs((ev) => { - emitter.trigger('eventClick', { - el: ev.target, - event: new EventImpl(context, def, instance), - jsEvent: ev, - view: context.viewApi, - }); - }); - } - return {}; - } - - const STANDARD_PROPS = { - start: identity, - end: identity, - allDay: Boolean, - }; - function parseDateSpan(raw, dateEnv, defaultDuration) { - let span = parseOpenDateSpan(raw, dateEnv); - let { range } = span; - if (!range.start) { - return null; - } - if (!range.end) { - if (defaultDuration == null) { - return null; - } - range.end = dateEnv.add(range.start, defaultDuration); - } - return span; - } - /* - TODO: somehow combine with parseRange? - Will return null if the start/end props were present but parsed invalidly. - */ - function parseOpenDateSpan(raw, dateEnv) { - let { refined: standardProps, extra } = refineProps(raw, STANDARD_PROPS); - let startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; - let endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; - let { allDay } = standardProps; - if (allDay == null) { - allDay = (startMeta && startMeta.isTimeUnspecified) && - (!endMeta || endMeta.isTimeUnspecified); - } - return Object.assign({ range: { - start: startMeta ? startMeta.marker : null, - end: endMeta ? endMeta.marker : null, - }, allDay }, extra); - } - function isDateSpansEqual(span0, span1) { - return rangesEqual(span0.range, span1.range) && - span0.allDay === span1.allDay && - isSpanPropsEqual(span0, span1); - } - // the NON-DATE-RELATED props - function isSpanPropsEqual(span0, span1) { - for (let propName in span1) { - if (propName !== 'range' && propName !== 'allDay') { - if (span0[propName] !== span1[propName]) { - return false; - } - } - } - // are there any props that span0 has that span1 DOESN'T have? - // both have range/allDay, so no need to special-case. - for (let propName in span0) { - if (!(propName in span1)) { - return false; - } - } - return true; - } - function buildDateSpanApi(span, dateEnv) { - return Object.assign(Object.assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay }); - } - function buildRangeApiWithTimeZone(range, dateEnv, omitTime) { - return Object.assign(Object.assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone }); - } - function buildRangeApi(range, dateEnv, omitTime) { - return { - start: dateEnv.toDate(range.start), - end: dateEnv.toDate(range.end), - startStr: dateEnv.formatIso(range.start, { omitTime }), - endStr: dateEnv.formatIso(range.end, { omitTime }), - }; - } - function fabricateEventRange(dateSpan, eventUiBases, context) { - let res = refineEventDef({ editable: false }, context); - let def = parseEventDef(res.refined, res.extra, '', // sourceId - dateSpan.allDay, true, // hasEnd - context); - return { - def, - ui: compileEventUi(def, eventUiBases), - instance: createEventInstance(def.defId, dateSpan.range), - range: dateSpan.range, - isStart: true, - isEnd: true, - }; - } - - /* - given a function that resolves a result asynchronously. - the function can either call passed-in success and failure callbacks, - or it can return a promise. - if you need to pass additional params to func, bind them first. - */ - function unpromisify(func, normalizedSuccessCallback, normalizedFailureCallback) { - // guard against success/failure callbacks being called more than once - // and guard against a promise AND callback being used together. - let isResolved = false; - let wrappedSuccess = function (res) { - if (!isResolved) { - isResolved = true; - normalizedSuccessCallback(res); - } - }; - let wrappedFailure = function (error) { - if (!isResolved) { - isResolved = true; - normalizedFailureCallback(error); - } - }; - let res = func(wrappedSuccess, wrappedFailure); - if (res && typeof res.then === 'function') { - res.then(wrappedSuccess, wrappedFailure); - } - } - - class JsonRequestError extends Error { - constructor(message, response) { - super(message); - this.response = response; - } - } - function requestJson(method, url, params) { - method = method.toUpperCase(); - const fetchOptions = { - method, - }; - if (method === 'GET') { - url += (url.indexOf('?') === -1 ? '?' : '&') + - new URLSearchParams(params); - } - else { - fetchOptions.body = new URLSearchParams(params); - fetchOptions.headers = { - 'Content-Type': 'application/x-www-form-urlencoded', - }; - } - return fetch(url, fetchOptions).then((fetchRes) => { - if (fetchRes.ok) { - return fetchRes.json().then((parsedResponse) => { - return [parsedResponse, fetchRes]; - }, () => { - throw new JsonRequestError('Failure parsing JSON', fetchRes); - }); - } - else { - throw new JsonRequestError('Request failed', fetchRes); - } - }); - } - - let canVGrowWithinCell; - function getCanVGrowWithinCell() { - if (canVGrowWithinCell == null) { - canVGrowWithinCell = computeCanVGrowWithinCell(); - } - return canVGrowWithinCell; - } - function computeCanVGrowWithinCell() { - // for SSR, because this function is call immediately at top-level - // TODO: just make this logic execute top-level, immediately, instead of doing lazily - if (typeof document === 'undefined') { - return true; - } - let el = document.createElement('div'); - el.style.position = 'absolute'; - el.style.top = '0px'; - el.style.left = '0px'; - el.innerHTML = '
'; - el.querySelector('table').style.height = '100px'; - el.querySelector('div').style.height = '100%'; - document.body.appendChild(el); - let div = el.querySelector('div'); - let possible = div.offsetHeight > 0; - document.body.removeChild(el); - return possible; - } - - class CalendarRoot extends BaseComponent { - constructor() { - super(...arguments); - this.state = { - forPrint: false, - }; - this.handleBeforePrint = () => { - this.setState({ forPrint: true }); - }; - this.handleAfterPrint = () => { - this.setState({ forPrint: false }); - }; - } - render() { - let { props } = this; - let { options } = props; - let { forPrint } = this.state; - let isHeightAuto = forPrint || options.height === 'auto' || options.contentHeight === 'auto'; - let height = (!isHeightAuto && options.height != null) ? options.height : ''; - let classNames = [ - 'fc', - forPrint ? 'fc-media-print' : 'fc-media-screen', - `fc-direction-${options.direction}`, - props.theme.getClass('root'), - ]; - if (!getCanVGrowWithinCell()) { - classNames.push('fc-liquid-hack'); - } - return props.children(classNames, height, isHeightAuto, forPrint); - } - componentDidMount() { - let { emitter } = this.props; - emitter.on('_beforeprint', this.handleBeforePrint); - emitter.on('_afterprint', this.handleAfterPrint); - } - componentWillUnmount() { - let { emitter } = this.props; - emitter.off('_beforeprint', this.handleBeforePrint); - emitter.off('_afterprint', this.handleAfterPrint); - } - } - - class Interaction { - constructor(settings) { - this.component = settings.component; - this.isHitComboAllowed = settings.isHitComboAllowed || null; - } - destroy() { - } - } - function parseInteractionSettings(component, input) { - return { - component, - el: input.el, - useEventCenter: input.useEventCenter != null ? input.useEventCenter : true, - isHitComboAllowed: input.isHitComboAllowed || null, - }; - } - function interactionSettingsToStore(settings) { - return { - [settings.component.uid]: settings, - }; - } - // global state - const interactionSettingsStore = {}; - - class CalendarImpl { - getCurrentData() { - return this.currentDataManager.getCurrentData(); - } - dispatch(action) { - this.currentDataManager.dispatch(action); - } - get view() { return this.getCurrentData().viewApi; } - batchRendering(callback) { - callback(); - } - updateSize() { - this.trigger('_resize', true); - } - // Options - // ----------------------------------------------------------------------------------------------------------------- - setOption(name, val) { - this.dispatch({ - type: 'SET_OPTION', - optionName: name, - rawOptionValue: val, - }); - } - getOption(name) { - return this.currentDataManager.currentCalendarOptionsInput[name]; - } - getAvailableLocaleCodes() { - return Object.keys(this.getCurrentData().availableRawLocales); - } - // Trigger - // ----------------------------------------------------------------------------------------------------------------- - on(handlerName, handler) { - let { currentDataManager } = this; - if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) { - currentDataManager.emitter.on(handlerName, handler); - } - else { - console.warn(`Unknown listener name '${handlerName}'`); - } - } - off(handlerName, handler) { - this.currentDataManager.emitter.off(handlerName, handler); - } - // not meant for public use - trigger(handlerName, ...args) { - this.currentDataManager.emitter.trigger(handlerName, ...args); - } - // View - // ----------------------------------------------------------------------------------------------------------------- - changeView(viewType, dateOrRange) { - this.batchRendering(() => { - this.unselect(); - if (dateOrRange) { - if (dateOrRange.start && dateOrRange.end) { // a range - this.dispatch({ - type: 'CHANGE_VIEW_TYPE', - viewType, - }); - this.dispatch({ - type: 'SET_OPTION', - optionName: 'visibleRange', - rawOptionValue: dateOrRange, - }); - } - else { - let { dateEnv } = this.getCurrentData(); - this.dispatch({ - type: 'CHANGE_VIEW_TYPE', - viewType, - dateMarker: dateEnv.createMarker(dateOrRange), - }); - } - } - else { - this.dispatch({ - type: 'CHANGE_VIEW_TYPE', - viewType, - }); - } - }); - } - // Forces navigation to a view for the given date. - // `viewType` can be a specific view name or a generic one like "week" or "day". - // needs to change - zoomTo(dateMarker, viewType) { - let state = this.getCurrentData(); - let spec; - viewType = viewType || 'day'; // day is default zoom - spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType); - this.unselect(); - if (spec) { - this.dispatch({ - type: 'CHANGE_VIEW_TYPE', - viewType: spec.type, - dateMarker, - }); - } - else { - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker, - }); - } - } - // Given a duration singular unit, like "week" or "day", finds a matching view spec. - // Preference is given to views that have corresponding buttons. - getUnitViewSpec(unit) { - let { viewSpecs, toolbarConfig } = this.getCurrentData(); - let viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []); - let i; - let spec; - for (let viewType in viewSpecs) { - viewTypes.push(viewType); - } - for (i = 0; i < viewTypes.length; i += 1) { - spec = viewSpecs[viewTypes[i]]; - if (spec) { - if (spec.singleUnit === unit) { - return spec; - } - } - } - return null; - } - // Current Date - // ----------------------------------------------------------------------------------------------------------------- - prev() { - this.unselect(); - this.dispatch({ type: 'PREV' }); - } - next() { - this.unselect(); - this.dispatch({ type: 'NEXT' }); - } - prevYear() { - let state = this.getCurrentData(); - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: state.dateEnv.addYears(state.currentDate, -1), - }); - } - nextYear() { - let state = this.getCurrentData(); - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: state.dateEnv.addYears(state.currentDate, 1), - }); - } - today() { - let state = this.getCurrentData(); - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: getNow(state.calendarOptions.now, state.dateEnv), - }); - } - gotoDate(zonedDateInput) { - let state = this.getCurrentData(); - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: state.dateEnv.createMarker(zonedDateInput), - }); - } - incrementDate(deltaInput) { - let state = this.getCurrentData(); - let delta = createDuration(deltaInput); - if (delta) { // else, warn about invalid input? - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: state.dateEnv.add(state.currentDate, delta), - }); - } - } - getDate() { - let state = this.getCurrentData(); - return state.dateEnv.toDate(state.currentDate); - } - // Date Formatting Utils - // ----------------------------------------------------------------------------------------------------------------- - formatDate(d, formatter) { - let { dateEnv } = this.getCurrentData(); - return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter)); - } - // `settings` is for formatter AND isEndExclusive - formatRange(d0, d1, settings) { - let { dateEnv } = this.getCurrentData(); - return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings); - } - formatIso(d, omitTime) { - let { dateEnv } = this.getCurrentData(); - return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime }); - } - // Date Selection / Event Selection / DayClick - // ----------------------------------------------------------------------------------------------------------------- - select(dateOrObj, endDate) { - let selectionInput; - if (endDate == null) { - if (dateOrObj.start != null) { - selectionInput = dateOrObj; - } - else { - selectionInput = { - start: dateOrObj, - end: null, - }; - } - } - else { - selectionInput = { - start: dateOrObj, - end: endDate, - }; - } - let state = this.getCurrentData(); - let selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 })); - if (selection) { // throw parse error otherwise? - this.dispatch({ type: 'SELECT_DATES', selection }); - triggerDateSelect(selection, null, state); - } - } - unselect(pev) { - let state = this.getCurrentData(); - if (state.dateSelection) { - this.dispatch({ type: 'UNSELECT_DATES' }); - triggerDateUnselect(pev, state); - } - } - // Public Events API - // ----------------------------------------------------------------------------------------------------------------- - addEvent(eventInput, sourceInput) { - if (eventInput instanceof EventImpl) { - let def = eventInput._def; - let instance = eventInput._instance; - let currentData = this.getCurrentData(); - // not already present? don't want to add an old snapshot - if (!currentData.eventStore.defs[def.defId]) { - this.dispatch({ - type: 'ADD_EVENTS', - eventStore: eventTupleToStore({ def, instance }), // TODO: better util for two args? - }); - this.triggerEventAdd(eventInput); - } - return eventInput; - } - let state = this.getCurrentData(); - let eventSource; - if (sourceInput instanceof EventSourceImpl) { - eventSource = sourceInput.internalEventSource; - } - else if (typeof sourceInput === 'boolean') { - if (sourceInput) { // true. part of the first event source - [eventSource] = hashValuesToArray(state.eventSources); - } - } - else if (sourceInput != null) { // an ID. accepts a number too - let sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function - if (!sourceApi) { - console.warn(`Could not find an event source with ID "${sourceInput}"`); // TODO: test - return null; - } - eventSource = sourceApi.internalEventSource; - } - let tuple = parseEvent(eventInput, eventSource, state, false); - if (tuple) { - let newEventApi = new EventImpl(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance); - this.dispatch({ - type: 'ADD_EVENTS', - eventStore: eventTupleToStore(tuple), - }); - this.triggerEventAdd(newEventApi); - return newEventApi; - } - return null; - } - triggerEventAdd(eventApi) { - let { emitter } = this.getCurrentData(); - emitter.trigger('eventAdd', { - event: eventApi, - relatedEvents: [], - revert: () => { - this.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: eventApiToStore(eventApi), - }); - }, - }); - } - // TODO: optimize - getEventById(id) { - let state = this.getCurrentData(); - let { defs, instances } = state.eventStore; - id = String(id); - for (let defId in defs) { - let def = defs[defId]; - if (def.publicId === id) { - if (def.recurringDef) { - return new EventImpl(state, def, null); - } - for (let instanceId in instances) { - let instance = instances[instanceId]; - if (instance.defId === def.defId) { - return new EventImpl(state, def, instance); - } - } - } - } - return null; - } - getEvents() { - let currentData = this.getCurrentData(); - return buildEventApis(currentData.eventStore, currentData); - } - removeAllEvents() { - this.dispatch({ type: 'REMOVE_ALL_EVENTS' }); - } - // Public Event Sources API - // ----------------------------------------------------------------------------------------------------------------- - getEventSources() { - let state = this.getCurrentData(); - let sourceHash = state.eventSources; - let sourceApis = []; - for (let internalId in sourceHash) { - sourceApis.push(new EventSourceImpl(state, sourceHash[internalId])); - } - return sourceApis; - } - getEventSourceById(id) { - let state = this.getCurrentData(); - let sourceHash = state.eventSources; - id = String(id); - for (let sourceId in sourceHash) { - if (sourceHash[sourceId].publicId === id) { - return new EventSourceImpl(state, sourceHash[sourceId]); - } - } - return null; - } - addEventSource(sourceInput) { - let state = this.getCurrentData(); - if (sourceInput instanceof EventSourceImpl) { - // not already present? don't want to add an old snapshot - if (!state.eventSources[sourceInput.internalEventSource.sourceId]) { - this.dispatch({ - type: 'ADD_EVENT_SOURCES', - sources: [sourceInput.internalEventSource], - }); - } - return sourceInput; - } - let eventSource = parseEventSource(sourceInput, state); - if (eventSource) { // TODO: error otherwise? - this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] }); - return new EventSourceImpl(state, eventSource); - } - return null; - } - removeAllEventSources() { - this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' }); - } - refetchEvents() { - this.dispatch({ type: 'FETCH_EVENT_SOURCES', isRefetch: true }); - } - // Scroll - // ----------------------------------------------------------------------------------------------------------------- - scrollToTime(timeInput) { - let time = createDuration(timeInput); - if (time) { - this.trigger('_scrollRequest', { time }); - } - } - } - - function pointInsideRect(point, rect) { - return point.left >= rect.left && - point.left < rect.right && - point.top >= rect.top && - point.top < rect.bottom; - } - // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false - function intersectRects(rect1, rect2) { - let res = { - left: Math.max(rect1.left, rect2.left), - right: Math.min(rect1.right, rect2.right), - top: Math.max(rect1.top, rect2.top), - bottom: Math.min(rect1.bottom, rect2.bottom), - }; - if (res.left < res.right && res.top < res.bottom) { - return res; - } - return false; - } - function translateRect(rect, deltaX, deltaY) { - return { - left: rect.left + deltaX, - right: rect.right + deltaX, - top: rect.top + deltaY, - bottom: rect.bottom + deltaY, - }; - } - // Returns a new point that will have been moved to reside within the given rectangle - function constrainPoint(point, rect) { - return { - left: Math.min(Math.max(point.left, rect.left), rect.right), - top: Math.min(Math.max(point.top, rect.top), rect.bottom), - }; - } - // Returns a point that is the center of the given rectangle - function getRectCenter(rect) { - return { - left: (rect.left + rect.right) / 2, - top: (rect.top + rect.bottom) / 2, - }; - } - // Subtracts point2's coordinates from point1's coordinates, returning a delta - function diffPoints(point1, point2) { - return { - left: point1.left - point2.left, - top: point1.top - point2.top, - }; - } - - const EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere - class Splitter { - constructor() { - this.getKeysForEventDefs = memoize(this._getKeysForEventDefs); - this.splitDateSelection = memoize(this._splitDateSpan); - this.splitEventStore = memoize(this._splitEventStore); - this.splitIndividualUi = memoize(this._splitIndividualUi); - this.splitEventDrag = memoize(this._splitInteraction); - this.splitEventResize = memoize(this._splitInteraction); - this.eventUiBuilders = {}; // TODO: typescript protection - } - splitProps(props) { - let keyInfos = this.getKeyInfo(props); - let defKeys = this.getKeysForEventDefs(props.eventStore); - let dateSelections = this.splitDateSelection(props.dateSelection); - let individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases* - let eventStores = this.splitEventStore(props.eventStore, defKeys); - let eventDrags = this.splitEventDrag(props.eventDrag); - let eventResizes = this.splitEventResize(props.eventResize); - let splitProps = {}; - this.eventUiBuilders = mapHash(keyInfos, (info, key) => this.eventUiBuilders[key] || memoize(buildEventUiForKey)); - for (let key in keyInfos) { - let keyInfo = keyInfos[key]; - let eventStore = eventStores[key] || EMPTY_EVENT_STORE; - let buildEventUi = this.eventUiBuilders[key]; - splitProps[key] = { - businessHours: keyInfo.businessHours || props.businessHours, - dateSelection: dateSelections[key] || null, - eventStore, - eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]), - eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '', - eventDrag: eventDrags[key] || null, - eventResize: eventResizes[key] || null, - }; - } - return splitProps; - } - _splitDateSpan(dateSpan) { - let dateSpans = {}; - if (dateSpan) { - let keys = this.getKeysForDateSpan(dateSpan); - for (let key of keys) { - dateSpans[key] = dateSpan; - } - } - return dateSpans; - } - _getKeysForEventDefs(eventStore) { - return mapHash(eventStore.defs, (eventDef) => this.getKeysForEventDef(eventDef)); - } - _splitEventStore(eventStore, defKeys) { - let { defs, instances } = eventStore; - let splitStores = {}; - for (let defId in defs) { - for (let key of defKeys[defId]) { - if (!splitStores[key]) { - splitStores[key] = createEmptyEventStore(); - } - splitStores[key].defs[defId] = defs[defId]; - } - } - for (let instanceId in instances) { - let instance = instances[instanceId]; - for (let key of defKeys[instance.defId]) { - if (splitStores[key]) { // must have already been created - splitStores[key].instances[instanceId] = instance; - } - } - } - return splitStores; - } - _splitIndividualUi(eventUiBases, defKeys) { - let splitHashes = {}; - for (let defId in eventUiBases) { - if (defId) { // not the '' key - for (let key of defKeys[defId]) { - if (!splitHashes[key]) { - splitHashes[key] = {}; - } - splitHashes[key][defId] = eventUiBases[defId]; - } - } - } - return splitHashes; - } - _splitInteraction(interaction) { - let splitStates = {}; - if (interaction) { - let affectedStores = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents)); - // can't rely on defKeys because event data is mutated - let mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents); - let mutatedStores = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId); - let populate = (key) => { - if (!splitStates[key]) { - splitStates[key] = { - affectedEvents: affectedStores[key] || EMPTY_EVENT_STORE, - mutatedEvents: mutatedStores[key] || EMPTY_EVENT_STORE, - isEvent: interaction.isEvent, - }; - } - }; - for (let key in affectedStores) { - populate(key); - } - for (let key in mutatedStores) { - populate(key); - } - } - return splitStates; - } - } - function buildEventUiForKey(allUi, eventUiForKey, individualUi) { - let baseParts = []; - if (allUi) { - baseParts.push(allUi); - } - if (eventUiForKey) { - baseParts.push(eventUiForKey); - } - let stuff = { - '': combineEventUis(baseParts), - }; - if (individualUi) { - Object.assign(stuff, individualUi); - } - return stuff; - } - - function getDateMeta(date, todayRange, nowDate, dateProfile) { - return { - dow: date.getUTCDay(), - isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)), - isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)), - isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)), - isPast: Boolean(nowDate ? (date < nowDate) : todayRange ? (date < todayRange.start) : false), - isFuture: Boolean(nowDate ? (date > nowDate) : todayRange ? (date >= todayRange.end) : false), - }; - } - function getDayClassNames(meta, theme) { - let classNames = [ - 'fc-day', - `fc-day-${DAY_IDS[meta.dow]}`, - ]; - if (meta.isDisabled) { - classNames.push('fc-day-disabled'); - } - else { - if (meta.isToday) { - classNames.push('fc-day-today'); - classNames.push(theme.getClass('today')); - } - if (meta.isPast) { - classNames.push('fc-day-past'); - } - if (meta.isFuture) { - classNames.push('fc-day-future'); - } - if (meta.isOther) { - classNames.push('fc-day-other'); - } - } - return classNames; - } - function getSlotClassNames(meta, theme) { - let classNames = [ - 'fc-slot', - `fc-slot-${DAY_IDS[meta.dow]}`, - ]; - if (meta.isDisabled) { - classNames.push('fc-slot-disabled'); - } - else { - if (meta.isToday) { - classNames.push('fc-slot-today'); - classNames.push(theme.getClass('today')); - } - if (meta.isPast) { - classNames.push('fc-slot-past'); - } - if (meta.isFuture) { - classNames.push('fc-slot-future'); - } - } - return classNames; - } - - const DAY_FORMAT = createFormatter({ year: 'numeric', month: 'long', day: 'numeric' }); - const WEEK_FORMAT = createFormatter({ week: 'long' }); - function buildNavLinkAttrs(context, dateMarker, viewType = 'day', isTabbable = true) { - const { dateEnv, options, calendarApi } = context; - let dateStr = dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT); - if (options.navLinks) { - let zonedDate = dateEnv.toDate(dateMarker); - const handleInteraction = (ev) => { - let 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 Object.assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, (isTabbable - ? createAriaClickAttrs(handleInteraction) - : { onClick: handleInteraction })); - } - return { 'aria-label': dateStr }; - } - - let _isRtlScrollbarOnLeft = null; - function getIsRtlScrollbarOnLeft() { - if (_isRtlScrollbarOnLeft === null) { - _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft(); - } - return _isRtlScrollbarOnLeft; - } - function computeIsRtlScrollbarOnLeft() { - let outerEl = document.createElement('div'); - applyStyle(outerEl, { - position: 'absolute', - top: -1000, - left: 0, - border: 0, - padding: 0, - overflow: 'scroll', - direction: 'rtl', - }); - outerEl.innerHTML = '
'; - document.body.appendChild(outerEl); - let innerEl = outerEl.firstChild; - let res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left; - removeElement(outerEl); - return res; - } - - let _scrollbarWidths; - function getScrollbarWidths() { - if (!_scrollbarWidths) { - _scrollbarWidths = computeScrollbarWidths(); - } - return _scrollbarWidths; - } - function computeScrollbarWidths() { - let el = document.createElement('div'); - el.style.overflow = 'scroll'; - el.style.position = 'absolute'; - el.style.top = '-9999px'; - el.style.left = '-9999px'; - document.body.appendChild(el); - let res = computeScrollbarWidthsForEl(el); - document.body.removeChild(el); - return res; - } - // WARNING: will include border - function computeScrollbarWidthsForEl(el) { - return { - x: el.offsetHeight - el.clientHeight, - y: el.offsetWidth - el.clientWidth, - }; - } - - function computeEdges(el, getPadding = false) { - let computedStyle = window.getComputedStyle(el); - let borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0; - let borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0; - let borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0; - let borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; - let badScrollbarWidths = computeScrollbarWidthsForEl(el); // includes border! - let scrollbarLeftRight = badScrollbarWidths.y - borderLeft - borderRight; - let scrollbarBottom = badScrollbarWidths.x - borderTop - borderBottom; - let res = { - borderLeft, - borderRight, - borderTop, - borderBottom, - scrollbarBottom, - scrollbarLeft: 0, - scrollbarRight: 0, - }; - if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side? - res.scrollbarLeft = scrollbarLeftRight; - } - else { - res.scrollbarRight = scrollbarLeftRight; - } - if (getPadding) { - res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0; - res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0; - res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0; - res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0; - } - return res; - } - function computeInnerRect(el, goWithinPadding = false, doFromWindowViewport) { - let outerRect = doFromWindowViewport ? el.getBoundingClientRect() : computeRect(el); - let edges = computeEdges(el, goWithinPadding); - let res = { - left: outerRect.left + edges.borderLeft + edges.scrollbarLeft, - right: outerRect.right - edges.borderRight - edges.scrollbarRight, - top: outerRect.top + edges.borderTop, - bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom, - }; - if (goWithinPadding) { - res.left += edges.paddingLeft; - res.right -= edges.paddingRight; - res.top += edges.paddingTop; - res.bottom -= edges.paddingBottom; - } - return res; - } - function computeRect(el) { - let rect = el.getBoundingClientRect(); - return { - left: rect.left + window.pageXOffset, - top: rect.top + window.pageYOffset, - right: rect.right + window.pageXOffset, - bottom: rect.bottom + window.pageYOffset, - }; - } - function computeClippedClientRect(el) { - let clippingParents = getClippingParents(el); - let rect = el.getBoundingClientRect(); - for (let clippingParent of clippingParents) { - let intersection = intersectRects(rect, clippingParent.getBoundingClientRect()); - if (intersection) { - rect = intersection; - } - else { - return null; - } - } - return rect; - } - // does not return window - function getClippingParents(el) { - let parents = []; - while (el instanceof HTMLElement) { // will stop when gets to document or null - let computedStyle = window.getComputedStyle(el); - if (computedStyle.position === 'fixed') { - break; - } - if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) { - parents.push(el); - } - el = el.parentNode; - } - return parents; - } - - /* - Records offset information for a set of elements, relative to an origin element. - Can record the left/right OR the top/bottom OR both. - Provides methods for querying the cache by position. - */ - class PositionCache { - constructor(originEl, els, isHorizontal, isVertical) { - this.els = els; - let originClientRect = this.originClientRect = originEl.getBoundingClientRect(); // relative to viewport top-left - if (isHorizontal) { - this.buildElHorizontals(originClientRect.left); - } - if (isVertical) { - this.buildElVerticals(originClientRect.top); - } - } - // Populates the left/right internal coordinate arrays - buildElHorizontals(originClientLeft) { - let lefts = []; - let rights = []; - for (let el of this.els) { - let rect = el.getBoundingClientRect(); - lefts.push(rect.left - originClientLeft); - rights.push(rect.right - originClientLeft); - } - this.lefts = lefts; - this.rights = rights; - } - // Populates the top/bottom internal coordinate arrays - buildElVerticals(originClientTop) { - let tops = []; - let bottoms = []; - for (let el of this.els) { - let rect = el.getBoundingClientRect(); - tops.push(rect.top - originClientTop); - bottoms.push(rect.bottom - originClientTop); - } - this.tops = tops; - this.bottoms = bottoms; - } - // Given a left offset (from document left), returns the index of the el that it horizontally intersects. - // If no intersection is made, returns undefined. - leftToIndex(leftPosition) { - let { lefts, rights } = this; - let len = lefts.length; - let i; - for (i = 0; i < len; i += 1) { - if (leftPosition >= lefts[i] && leftPosition < rights[i]) { - return i; - } - } - return undefined; // TODO: better - } - // Given a top offset (from document top), returns the index of the el that it vertically intersects. - // If no intersection is made, returns undefined. - topToIndex(topPosition) { - let { tops, bottoms } = this; - let len = tops.length; - let i; - for (i = 0; i < len; i += 1) { - if (topPosition >= tops[i] && topPosition < bottoms[i]) { - return i; - } - } - return undefined; // TODO: better - } - // Gets the width of the element at the given index - getWidth(leftIndex) { - return this.rights[leftIndex] - this.lefts[leftIndex]; - } - // Gets the height of the element at the given index - getHeight(topIndex) { - return this.bottoms[topIndex] - this.tops[topIndex]; - } - } - - /* eslint max-classes-per-file: "off" */ - /* - An object for getting/setting scroll-related information for an element. - Internally, this is done very differently for window versus DOM element, - so this object serves as a common interface. - */ - class ScrollController { - getMaxScrollTop() { - return this.getScrollHeight() - this.getClientHeight(); - } - getMaxScrollLeft() { - return this.getScrollWidth() - this.getClientWidth(); - } - canScrollVertically() { - return this.getMaxScrollTop() > 0; - } - canScrollHorizontally() { - return this.getMaxScrollLeft() > 0; - } - canScrollUp() { - return this.getScrollTop() > 0; - } - canScrollDown() { - return this.getScrollTop() < this.getMaxScrollTop(); - } - canScrollLeft() { - return this.getScrollLeft() > 0; - } - canScrollRight() { - return this.getScrollLeft() < this.getMaxScrollLeft(); - } - } - class ElementScrollController extends ScrollController { - constructor(el) { - super(); - this.el = el; - } - getScrollTop() { - return this.el.scrollTop; - } - getScrollLeft() { - return this.el.scrollLeft; - } - setScrollTop(top) { - this.el.scrollTop = top; - } - setScrollLeft(left) { - this.el.scrollLeft = left; - } - getScrollWidth() { - return this.el.scrollWidth; - } - getScrollHeight() { - return this.el.scrollHeight; - } - getClientHeight() { - return this.el.clientHeight; - } - getClientWidth() { - return this.el.clientWidth; - } - } - class WindowScrollController extends ScrollController { - getScrollTop() { - return window.pageYOffset; - } - getScrollLeft() { - return window.pageXOffset; - } - setScrollTop(n) { - window.scroll(window.pageXOffset, n); - } - setScrollLeft(n) { - window.scroll(n, window.pageYOffset); - } - getScrollWidth() { - return document.documentElement.scrollWidth; - } - getScrollHeight() { - return document.documentElement.scrollHeight; - } - getClientHeight() { - return document.documentElement.clientHeight; - } - getClientWidth() { - return document.documentElement.clientWidth; - } - } - - /* - an INTERACTABLE date component - - PURPOSES: - - hook up to fg, fill, and mirror renderers - - interface for dragging and hits - */ - class DateComponent extends BaseComponent { - constructor() { - super(...arguments); - this.uid = guid(); - } - // Hit System - // ----------------------------------------------------------------------------------------------------------------- - prepareHits() { - } - queryHit(positionLeft, positionTop, elWidth, elHeight) { - return null; // this should be abstract - } - // Pointer Interaction Utils - // ----------------------------------------------------------------------------------------------------------------- - isValidSegDownEl(el) { - return !this.props.eventDrag && // HACK - !this.props.eventResize && // HACK - !elementClosest(el, '.fc-event-mirror'); - } - isValidDateDownEl(el) { - return !elementClosest(el, '.fc-event:not(.fc-bg-event)') && - !elementClosest(el, '.fc-more-link') && // a "more.." link - !elementClosest(el, 'a[data-navlink]') && // a clickable nav link - !elementClosest(el, '.fc-popover'); // hack - } - } - - class NamedTimeZoneImpl { - constructor(timeZoneName) { - this.timeZoneName = timeZoneName; - } - } - - class SegHierarchy { - constructor() { - // settings - this.strictOrder = false; - this.allowReslicing = false; - this.maxCoord = -1; // -1 means no max - this.maxStackCnt = -1; // -1 means no max - this.levelCoords = []; // ordered - this.entriesByLevel = []; // parallel with levelCoords - this.stackCnts = {}; // TODO: use better technique!? - } - addSegs(inputs) { - let hiddenEntries = []; - for (let input of inputs) { - this.insertEntry(input, hiddenEntries); - } - return hiddenEntries; - } - insertEntry(entry, hiddenEntries) { - let insertion = this.findInsertion(entry); - if (this.isInsertionValid(insertion, entry)) { - this.insertEntryAt(entry, insertion); - return 1; - } - return this.handleInvalidInsertion(insertion, entry, hiddenEntries); - } - isInsertionValid(insertion, entry) { - return (this.maxCoord === -1 || insertion.levelCoord + entry.thickness <= this.maxCoord) && - (this.maxStackCnt === -1 || insertion.stackCnt < this.maxStackCnt); - } - // returns number of new entries inserted - handleInvalidInsertion(insertion, entry, hiddenEntries) { - if (this.allowReslicing && insertion.touchingEntry) { - return this.splitEntry(entry, insertion.touchingEntry, hiddenEntries); - } - hiddenEntries.push(entry); - return 0; - } - splitEntry(entry, barrier, hiddenEntries) { - let partCnt = 0; - let splitHiddenEntries = []; - let entrySpan = entry.span; - let barrierSpan = barrier.span; - 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({ - index: entry.index, - thickness: entry.thickness, - span: intersectSpans(barrierSpan, entrySpan), // guaranteed to intersect - }, ...splitHiddenEntries); - return partCnt; - } - hiddenEntries.push(entry); - return 0; - } - insertEntryAt(entry, insertion) { - let { entriesByLevel, levelCoords } = this; - if (insertion.lateral === -1) { - // create a new level - insertAt(levelCoords, insertion.level, insertion.levelCoord); - insertAt(entriesByLevel, insertion.level, [entry]); - } - else { - // insert into existing level - insertAt(entriesByLevel[insertion.level], insertion.lateral, entry); - } - this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt; - } - findInsertion(newEntry) { - let { levelCoords, entriesByLevel, strictOrder, stackCnts } = this; - let levelCnt = levelCoords.length; - let candidateCoord = 0; - let touchingLevel = -1; - let touchingLateral = -1; - let touchingEntry = null; - let stackCnt = 0; - for (let trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) { - let 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 && trackingCoord >= candidateCoord + newEntry.thickness) { - break; - } - let trackingEntries = entriesByLevel[trackingLevel]; - let trackingEntry; - let searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd); // find first entry after newEntry's end - let lateralIndex = searchRes[0] + searchRes[1]; // if exact match (which doesn't collide), go to next one - while ( // loop through entries that horizontally intersect - (trackingEntry = trackingEntries[lateralIndex]) && // but not past the whole entry list - trackingEntry.span.start < newEntry.span.end // and not entirely past newEntry - ) { - let trackingEntryBottom = trackingCoord + trackingEntry.thickness; - // intersects into the top of the candidate? - if (trackingEntryBottom > candidateCoord) { - candidateCoord = trackingEntryBottom; - touchingEntry = trackingEntry; - touchingLevel = trackingLevel; - touchingLateral = lateralIndex; - } - // 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 - let 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 - let destLateral = -1; - if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) { - destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0]; - } - return { - touchingLevel, - touchingLateral, - touchingEntry, - stackCnt, - levelCoord: candidateCoord, - level: destLevel, - lateral: destLateral, - }; - } - // sorted by levelCoord (lowest to highest) - toRects() { - let { entriesByLevel, levelCoords } = this; - let levelCnt = entriesByLevel.length; - let rects = []; - for (let level = 0; level < levelCnt; level += 1) { - let entries = entriesByLevel[level]; - let levelCoord = levelCoords[level]; - for (let entry of entries) { - rects.push(Object.assign(Object.assign({}, entry), { levelCoord })); - } - } - return rects; - } - } - function getEntrySpanEnd(entry) { - return entry.span.end; - } - function buildEntryKey(entry) { - return entry.index + ':' + entry.span.start; - } - // returns groups with entries sorted by input order - function groupIntersectingEntries(entries) { - let merges = []; - for (let entry of entries) { - let filteredMerges = []; - let hungryMerge = { - span: entry.span, - entries: [entry], - }; - for (let merge of merges) { - if (intersectSpans(merge.span, hungryMerge.span)) { - hungryMerge = { - entries: merge.entries.concat(hungryMerge.entries), - span: joinSpans(merge.span, hungryMerge.span), - }; - } - else { - filteredMerges.push(merge); - } - } - filteredMerges.push(hungryMerge); - merges = filteredMerges; - } - return merges; - } - function joinSpans(span0, span1) { - return { - start: Math.min(span0.start, span1.start), - end: Math.max(span0.end, span1.end), - }; - } - function intersectSpans(span0, span1) { - let start = Math.max(span0.start, span1.start); - let end = Math.min(span0.end, span1.end); - if (start < end) { - return { start, end }; - } - return null; - } - // general util - // --------------------------------------------------------------------------------------------------------------------- - function insertAt(arr, index, item) { - arr.splice(index, 0, item); - } - function binarySearch(a, searchVal, getItemVal) { - let startIndex = 0; - let endIndex = a.length; // exclusive - if (!endIndex || searchVal < getItemVal(a[startIndex])) { // no items OR before first item - return [0, 0]; - } - if (searchVal > getItemVal(a[endIndex - 1])) { // after last item - return [endIndex, 0]; - } - while (startIndex < endIndex) { - let middleIndex = Math.floor(startIndex + (endIndex - startIndex) / 2); - let middleVal = getItemVal(a[middleIndex]); - if (searchVal < middleVal) { - endIndex = middleIndex; - } - else if (searchVal > middleVal) { - startIndex = middleIndex + 1; - } - else { // equal! - return [middleIndex, 1]; - } - } - return [startIndex, 0]; - } - - /* - An abstraction for a dragging interaction originating on an event. - Does higher-level things than PointerDragger, such as possibly: - - a "mirror" that moves with the pointer - - a minimum number of pixels or other criteria for a true drag to begin - - subclasses must emit: - - pointerdown - - dragstart - - dragmove - - pointerup - - dragend - */ - class ElementDragging { - constructor(el, selector) { - this.emitter = new Emitter(); - } - destroy() { - } - setMirrorIsVisible(bool) { - // optional if subclass doesn't want to support a mirror - } - setMirrorNeedsRevert(bool) { - // optional if subclass doesn't want to support a mirror - } - setAutoScrollEnabled(bool) { - // optional - } - } - - // TODO: get rid of this in favor of options system, - // tho it's really easy to access this globally rather than pass thru options. - const config = {}; - - /* - Information about what will happen when an external element is dragged-and-dropped - onto a calendar. Contains information for creating an event. - */ - const DRAG_META_REFINERS = { - startTime: createDuration, - duration: createDuration, - create: Boolean, - sourceId: String, - }; - function parseDragMeta(raw) { - let { refined, extra } = refineProps(raw, DRAG_META_REFINERS); - return { - startTime: refined.startTime || null, - duration: refined.duration || null, - create: refined.create != null ? refined.create : true, - sourceId: refined.sourceId, - leftoverProps: extra, - }; - } - - // Computes a default column header formatting string if `colFormat` is not explicitly defined - function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) { - // if more than one week row, or if there are a lot of columns with not much space, - // put just the day numbers will be in each cell - if (!datesRepDistinctDays || dayCnt > 10) { - return createFormatter({ weekday: 'short' }); // "Sat" - } - if (dayCnt > 1) { - return createFormatter({ weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }); // "Sat 11/12" - } - return createFormatter({ weekday: 'long' }); // "Saturday" - } - - const CLASS_NAME = 'fc-col-header-cell'; // do the cushion too? no - function renderInner$1(renderProps) { - return renderProps.text; - } - - // BAD name for this class now. used in the Header - class TableDateCell extends BaseComponent { - render() { - let { dateEnv, options, theme, viewApi } = this.context; - let { props } = this; - let { date, dateProfile } = props; - let dayMeta = getDateMeta(date, props.todayRange, null, dateProfile); - let classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme)); - let text = dateEnv.format(date, props.dayHeaderFormat); - // if colCnt is 1, we are already in a day-view and don't need a navlink - let navLinkAttrs = (!dayMeta.isDisabled && props.colCnt > 1) - ? buildNavLinkAttrs(this.context, date) - : {}; - let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta); - return (h(ContentContainer, { elTag: "th", elClasses: classNames, elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan, 'data-date': !dayMeta.isDisabled ? formatDayString(date) : undefined }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContainer) => (h("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && (h(InnerContainer, { elTag: "a", elAttrs: navLinkAttrs, elClasses: [ - 'fc-col-header-cell-cushion', - props.isSticky && 'fc-sticky', - ] })))))); - } - } - - const WEEKDAY_FORMAT = createFormatter({ weekday: 'long' }); - class TableDowCell extends BaseComponent { - render() { - let { props } = this; - let { dateEnv, theme, viewApi, options } = this.context; - let date = addDays(new Date(259200000), props.dow); // start with Sun, 04 Jan 1970 00:00:00 GMT - let dateMeta = { - dow: props.dow, - isDisabled: false, - isFuture: false, - isPast: false, - isToday: false, - isOther: false, - }; - let text = dateEnv.format(date, props.dayHeaderFormat); - let renderProps = Object.assign(Object.assign(Object.assign(Object.assign({ // TODO: make this public? - date }, dateMeta), { view: viewApi }), props.extraRenderProps), { text }); - return (h(ContentContainer, { elTag: "th", elClasses: [ - CLASS_NAME, - ...getDayClassNames(dateMeta, theme), - ...(props.extraClassNames || []), - ], elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => (h("div", { className: "fc-scrollgrid-sync-inner" }, - h(InnerContent, { elTag: "a", elClasses: [ - 'fc-col-header-cell-cushion', - props.isSticky && 'fc-sticky', - ], elAttrs: { - 'aria-label': dateEnv.format(date, WEEKDAY_FORMAT), - } }))))); - } - } - - class NowTimer extends d { - constructor(props, context) { - super(props, context); - this.initialNowDate = getNow(context.options.now, context.dateEnv); - this.initialNowQueriedMs = new Date().valueOf(); - this.state = this.computeTiming().currentState; - } - render() { - let { props, state } = this; - return props.children(state.nowDate, state.todayRange); - } - componentDidMount() { - this.setTimeout(); - } - componentDidUpdate(prevProps) { - if (prevProps.unit !== this.props.unit) { - this.clearTimeout(); - this.setTimeout(); - } - } - componentWillUnmount() { - this.clearTimeout(); - } - computeTiming() { - let { props, context } = this; - let unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs); - let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit); - let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit)); - let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf(); - // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342) - // ensure no longer than a day - waitMs = Math.min(1000 * 60 * 60 * 24, waitMs); - return { - currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) }, - nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) }, - waitMs, - }; - } - setTimeout() { - let { nextState, waitMs } = this.computeTiming(); - this.timeoutId = setTimeout(() => { - this.setState(nextState, () => { - this.setTimeout(); - }); - }, waitMs); - } - clearTimeout() { - if (this.timeoutId) { - clearTimeout(this.timeoutId); - } - } - } - NowTimer.contextType = ViewContextType; - function buildDayRange(date) { - let start = startOfDay(date); - let end = addDays(start, 1); - return { start, end }; - } - - class DayHeader extends BaseComponent { - constructor() { - super(...arguments); - this.createDayHeaderFormatter = memoize(createDayHeaderFormatter); - } - render() { - let { context } = this; - let { dates, dateProfile, datesRepDistinctDays, renderIntro } = this.props; - let dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length); - return (h(NowTimer, { unit: "day" }, (nowDate, todayRange) => (h("tr", { role: "row" }, - renderIntro && renderIntro('day'), - dates.map((date) => (datesRepDistinctDays ? (h(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat })) : (h(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat })))))))); - } - } - function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) { - return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt); - } - - class DaySeriesModel { - constructor(range, dateProfileGenerator) { - let date = range.start; - let { end } = range; - let indices = []; - let dates = []; - let dayIndex = -1; - while (date < end) { // loop each day from start to end - if (dateProfileGenerator.isHiddenDay(date)) { - indices.push(dayIndex + 0.5); // mark that it's between indices - } - else { - dayIndex += 1; - indices.push(dayIndex); - dates.push(date); - } - date = addDays(date, 1); - } - this.dates = dates; - this.indices = indices; - this.cnt = dates.length; - } - sliceRange(range) { - let firstIndex = this.getDateDayIndex(range.start); // inclusive first index - let lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index - let clippedFirstIndex = Math.max(0, firstIndex); - let clippedLastIndex = Math.min(this.cnt - 1, lastIndex); - // deal with in-between indices - clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell - clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell - if (clippedFirstIndex <= clippedLastIndex) { - return { - firstIndex: clippedFirstIndex, - lastIndex: clippedLastIndex, - isStart: firstIndex === clippedFirstIndex, - isEnd: lastIndex === clippedLastIndex, - }; - } - return null; - } - // Given a date, returns its chronolocial cell-index from the first cell of the grid. - // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets. - // If before the first offset, returns a negative number. - // If after the last offset, returns an offset past the last cell offset. - // Only works for *start* dates of cells. Will not work for exclusive end dates for cells. - getDateDayIndex(date) { - let { indices } = this; - let dayOffset = Math.floor(diffDays(this.dates[0], date)); - if (dayOffset < 0) { - return indices[0] - 1; - } - if (dayOffset >= indices.length) { - return indices[indices.length - 1] + 1; - } - return indices[dayOffset]; - } - } - - class DayTableModel { - constructor(daySeries, breakOnWeeks) { - let { dates } = daySeries; - let daysPerRow; - let firstDay; - let rowCnt; - if (breakOnWeeks) { - // count columns until the day-of-week repeats - firstDay = dates[0].getUTCDay(); - for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow += 1) { - if (dates[daysPerRow].getUTCDay() === firstDay) { - break; - } - } - rowCnt = Math.ceil(dates.length / daysPerRow); - } - else { - rowCnt = 1; - daysPerRow = dates.length; - } - this.rowCnt = rowCnt; - this.colCnt = daysPerRow; - this.daySeries = daySeries; - this.cells = this.buildCells(); - this.headerDates = this.buildHeaderDates(); - } - buildCells() { - let rows = []; - for (let row = 0; row < this.rowCnt; row += 1) { - let cells = []; - for (let col = 0; col < this.colCnt; col += 1) { - cells.push(this.buildCell(row, col)); - } - rows.push(cells); - } - return rows; - } - buildCell(row, col) { - let date = this.daySeries.dates[row * this.colCnt + col]; - return { - key: date.toISOString(), - date, - }; - } - buildHeaderDates() { - let dates = []; - for (let col = 0; col < this.colCnt; col += 1) { - dates.push(this.cells[0][col].date); - } - return dates; - } - sliceRange(range) { - let { colCnt } = this; - let seriesSeg = this.daySeries.sliceRange(range); - let segs = []; - if (seriesSeg) { - let { firstIndex, lastIndex } = seriesSeg; - let index = firstIndex; - while (index <= lastIndex) { - let row = Math.floor(index / colCnt); - let nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1); - segs.push({ - row, - firstCol: index % colCnt, - lastCol: (nextIndex - 1) % colCnt, - isStart: seriesSeg.isStart && index === firstIndex, - isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex, - }); - index = nextIndex; - } - } - return segs; - } - } - - class Slicer { - constructor() { - this.sliceBusinessHours = memoize(this._sliceBusinessHours); - this.sliceDateSelection = memoize(this._sliceDateSpan); - this.sliceEventStore = memoize(this._sliceEventStore); - this.sliceEventDrag = memoize(this._sliceInteraction); - this.sliceEventResize = memoize(this._sliceInteraction); - this.forceDayIfListItem = false; // hack - } - sliceProps(props, dateProfile, nextDayThreshold, context, ...extraArgs) { - let { eventUiBases } = props; - let eventSegs = this.sliceEventStore(props.eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs); - return { - dateSelectionSegs: this.sliceDateSelection(props.dateSelection, eventUiBases, context, ...extraArgs), - businessHourSegs: this.sliceBusinessHours(props.businessHours, dateProfile, nextDayThreshold, context, ...extraArgs), - fgEventSegs: eventSegs.fg, - bgEventSegs: eventSegs.bg, - eventDrag: this.sliceEventDrag(props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs), - eventResize: this.sliceEventResize(props.eventResize, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs), - eventSelection: props.eventSelection, - }; // TODO: give interactionSegs? - } - sliceNowDate(// does not memoize - date, context, ...extraArgs) { - return this._sliceDateSpan({ range: { start: date, end: addMs(date, 1) }, allDay: false }, // add 1 ms, protect against null range - {}, context, ...extraArgs); - } - _sliceBusinessHours(businessHours, dateProfile, nextDayThreshold, context, ...extraArgs) { - if (!businessHours) { - return []; - } - return this._sliceEventStore(expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context), {}, dateProfile, nextDayThreshold, ...extraArgs).bg; - } - _sliceEventStore(eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) { - if (eventStore) { - let rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); - return { - bg: this.sliceEventRanges(rangeRes.bg, extraArgs), - fg: this.sliceEventRanges(rangeRes.fg, extraArgs), - }; - } - return { bg: [], fg: [] }; - } - _sliceInteraction(interaction, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) { - if (!interaction) { - return null; - } - let rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); - return { - segs: this.sliceEventRanges(rangeRes.fg, extraArgs), - affectedInstances: interaction.affectedEvents.instances, - isEvent: interaction.isEvent, - }; - } - _sliceDateSpan(dateSpan, eventUiBases, context, ...extraArgs) { - if (!dateSpan) { - return []; - } - let eventRange = fabricateEventRange(dateSpan, eventUiBases, context); - let segs = this.sliceRange(dateSpan.range, ...extraArgs); - for (let seg of segs) { - seg.eventRange = eventRange; - } - return segs; - } - /* - "complete" seg means it has component and eventRange - */ - sliceEventRanges(eventRanges, extraArgs) { - let segs = []; - for (let eventRange of eventRanges) { - segs.push(...this.sliceEventRange(eventRange, extraArgs)); - } - return segs; - } - /* - "complete" seg means it has component and eventRange - */ - sliceEventRange(eventRange, extraArgs) { - let dateRange = eventRange.range; - // hack to make multi-day events that are being force-displayed as list-items to take up only one day - if (this.forceDayIfListItem && eventRange.ui.display === 'list-item') { - dateRange = { - start: dateRange.start, - end: addDays(dateRange.start, 1), - }; - } - let segs = this.sliceRange(dateRange, ...extraArgs); - for (let seg of segs) { - seg.eventRange = eventRange; - seg.isStart = eventRange.isStart && seg.isStart; - seg.isEnd = eventRange.isEnd && seg.isEnd; - } - return segs; - } - } - /* - for incorporating slotMinTime/slotMaxTime if appropriate - TODO: should be part of DateProfile! - TimelineDateProfile already does this btw - */ - function computeActiveRange(dateProfile, isComponentAllDay) { - let range = dateProfile.activeRange; - if (isComponentAllDay) { - return range; - } - return { - start: addMs(range.start, dateProfile.slotMinTime.milliseconds), - end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5), // 864e5 = ms in a day - }; - } - - // high-level segmenting-aware tester functions - // ------------------------------------------------------------------------------------------------------------------------ - function isInteractionValid(interaction, dateProfile, context) { - let { instances } = interaction.mutatedEvents; - for (let instanceId in instances) { - if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) { - return false; - } - } - return isNewPropsValid({ eventDrag: interaction }, context); // HACK: the eventDrag props is used for ALL interactions - } - function isDateSelectionValid(dateSelection, dateProfile, context) { - if (!rangeContainsRange(dateProfile.validRange, dateSelection.range)) { - return false; - } - return isNewPropsValid({ dateSelection }, context); - } - function isNewPropsValid(newProps, context) { - let calendarState = context.getCurrentData(); - let props = Object.assign({ businessHours: calendarState.businessHours, dateSelection: '', eventStore: calendarState.eventStore, eventUiBases: calendarState.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps); - return (context.pluginHooks.isPropsValid || isPropsValid)(props, context); - } - function isPropsValid(state, context, dateSpanMeta = {}, filterConfig) { - if (state.eventDrag && !isInteractionPropsValid(state, context, dateSpanMeta, filterConfig)) { - return false; - } - if (state.dateSelection && !isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) { - return false; - } - return true; - } - // Moving Event Validation - // ------------------------------------------------------------------------------------------------------------------------ - function isInteractionPropsValid(state, context, dateSpanMeta, filterConfig) { - let currentState = context.getCurrentData(); - let interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions - let subjectEventStore = interaction.mutatedEvents; - let subjectDefs = subjectEventStore.defs; - let subjectInstances = subjectEventStore.instances; - let subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ? - state.eventUiBases : - { '': currentState.selectionConfig }); - if (filterConfig) { - subjectConfigs = mapHash(subjectConfigs, filterConfig); - } - // exclude the subject events. TODO: exclude defs too? - let otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); - let otherDefs = otherEventStore.defs; - let otherInstances = otherEventStore.instances; - let otherConfigs = compileEventUis(otherDefs, state.eventUiBases); - for (let subjectInstanceId in subjectInstances) { - let subjectInstance = subjectInstances[subjectInstanceId]; - let subjectRange = subjectInstance.range; - let subjectConfig = subjectConfigs[subjectInstance.defId]; - let subjectDef = subjectDefs[subjectInstance.defId]; - // constraint - if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, context)) { - return false; - } - // overlap - let { eventOverlap } = context.options; - let eventOverlapFunc = typeof eventOverlap === 'function' ? eventOverlap : null; - for (let otherInstanceId in otherInstances) { - let otherInstance = otherInstances[otherInstanceId]; - // intersect! evaluate - if (rangesIntersect(subjectRange, otherInstance.range)) { - let otherOverlap = otherConfigs[otherInstance.defId].overlap; - // consider the other event's overlap. only do this if the subject event is a "real" event - if (otherOverlap === false && interaction.isEvent) { - return false; - } - if (subjectConfig.overlap === false) { - return false; - } - if (eventOverlapFunc && !eventOverlapFunc(new EventImpl(context, otherDefs[otherInstance.defId], otherInstance), // still event - new EventImpl(context, subjectDef, subjectInstance))) { - return false; - } - } - } - // allow (a function) - let calendarEventStore = currentState.eventStore; // need global-to-calendar, not local to component (splittable)state - for (let subjectAllow of subjectConfig.allows) { - let subjectDateSpan = Object.assign(Object.assign({}, dateSpanMeta), { range: subjectInstance.range, allDay: subjectDef.allDay }); - let origDef = calendarEventStore.defs[subjectDef.defId]; - let origInstance = calendarEventStore.instances[subjectInstanceId]; - let eventApi; - if (origDef) { // was previously in the calendar - eventApi = new EventImpl(context, origDef, origInstance); - } - else { // was an external event - eventApi = new EventImpl(context, subjectDef); // no instance, because had no dates - } - if (!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context), eventApi)) { - return false; - } - } - } - return true; - } - // Date Selection Validation - // ------------------------------------------------------------------------------------------------------------------------ - function isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig) { - let relevantEventStore = state.eventStore; - let relevantDefs = relevantEventStore.defs; - let relevantInstances = relevantEventStore.instances; - let selection = state.dateSelection; - let selectionRange = selection.range; - let { selectionConfig } = context.getCurrentData(); - if (filterConfig) { - selectionConfig = filterConfig(selectionConfig); - } - // constraint - if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, context)) { - return false; - } - // overlap - let { selectOverlap } = context.options; - let selectOverlapFunc = typeof selectOverlap === 'function' ? selectOverlap : null; - for (let relevantInstanceId in relevantInstances) { - let relevantInstance = relevantInstances[relevantInstanceId]; - // intersect! evaluate - if (rangesIntersect(selectionRange, relevantInstance.range)) { - if (selectionConfig.overlap === false) { - return false; - } - if (selectOverlapFunc && !selectOverlapFunc(new EventImpl(context, relevantDefs[relevantInstance.defId], relevantInstance), null)) { - return false; - } - } - } - // allow (a function) - for (let selectionAllow of selectionConfig.allows) { - let fullDateSpan = Object.assign(Object.assign({}, dateSpanMeta), selection); - if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan, context), null)) { - return false; - } - } - return true; - } - // Constraint Utils - // ------------------------------------------------------------------------------------------------------------------------ - function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, context) { - for (let constraint of constraints) { - if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context), subjectRange)) { - return false; - } - } - return true; - } - function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours - otherEventStore, // for if constraint is an even group ID - businessHoursUnexpanded, // for if constraint is 'businessHours' - context) { - if (constraint === 'businessHours') { - return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, context)); - } - if (typeof constraint === 'string') { // an group ID - return eventStoreToRanges(filterEventStoreDefs(otherEventStore, (eventDef) => eventDef.groupId === constraint)); - } - if (typeof constraint === 'object' && constraint) { // non-null object - return eventStoreToRanges(expandRecurring(constraint, subjectRange, context)); - } - return []; // if it's false - } - // TODO: move to event-store file? - function eventStoreToRanges(eventStore) { - let { instances } = eventStore; - let ranges = []; - for (let instanceId in instances) { - ranges.push(instances[instanceId].range); - } - return ranges; - } - // TODO: move to geom file? - function anyRangesContainRange(outerRanges, innerRange) { - for (let outerRange of outerRanges) { - if (rangeContainsRange(outerRange, innerRange)) { - return true; - } - } - return false; - } - - const VISIBLE_HIDDEN_RE = /^(visible|hidden)$/; - class Scroller extends BaseComponent { - constructor() { - super(...arguments); - this.handleEl = (el) => { - this.el = el; - setRef(this.props.elRef, el); - }; - } - render() { - let { props } = this; - let { liquid, liquidIsAbsolute } = props; - let isAbsolute = liquid && liquidIsAbsolute; - let className = ['fc-scroller']; - if (liquid) { - if (liquidIsAbsolute) { - className.push('fc-scroller-liquid-absolute'); - } - else { - className.push('fc-scroller-liquid'); - } - } - return (h("div", { ref: this.handleEl, className: className.join(' '), style: { - overflowX: props.overflowX, - overflowY: props.overflowY, - left: (isAbsolute && -(props.overcomeLeft || 0)) || '', - right: (isAbsolute && -(props.overcomeRight || 0)) || '', - bottom: (isAbsolute && -(props.overcomeBottom || 0)) || '', - marginLeft: (!isAbsolute && -(props.overcomeLeft || 0)) || '', - marginRight: (!isAbsolute && -(props.overcomeRight || 0)) || '', - marginBottom: (!isAbsolute && -(props.overcomeBottom || 0)) || '', - maxHeight: props.maxHeight || '', - } }, props.children)); - } - needsXScrolling() { - if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { - return false; - } - // testing scrollWidth>clientWidth is unreliable cross-browser when pixel heights aren't integers. - // much more reliable to see if children are taller than the scroller, even tho doesn't account for - // inner-child margins and absolute positioning - let { el } = this; - let realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth(); - let { children } = el; - for (let i = 0; i < children.length; i += 1) { - let childEl = children[i]; - if (childEl.getBoundingClientRect().width > realClientWidth) { - return true; - } - } - return false; - } - needsYScrolling() { - if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { - return false; - } - // testing scrollHeight>clientHeight is unreliable cross-browser when pixel heights aren't integers. - // much more reliable to see if children are taller than the scroller, even tho doesn't account for - // inner-child margins and absolute positioning - let { el } = this; - let realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth(); - let { children } = el; - for (let i = 0; i < children.length; i += 1) { - let childEl = children[i]; - if (childEl.getBoundingClientRect().height > realClientHeight) { - return true; - } - } - return false; - } - getXScrollbarWidth() { - if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { - return 0; - } - return this.el.offsetHeight - this.el.clientHeight; // only works because we guarantee no borders. TODO: add to CSS with important? - } - getYScrollbarWidth() { - if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { - return 0; - } - return this.el.offsetWidth - this.el.clientWidth; // only works because we guarantee no borders. TODO: add to CSS with important? - } - } - - /* - TODO: somehow infer OtherArgs from masterCallback? - TODO: infer RefType from masterCallback if provided - */ - class RefMap { - constructor(masterCallback) { - this.masterCallback = masterCallback; - this.currentMap = {}; - this.depths = {}; - this.callbackMap = {}; - this.handleValue = (val, key) => { - let { depths, currentMap } = this; - let removed = false; - let added = false; - if (val !== null) { - // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore - removed = (key in currentMap); - currentMap[key] = val; - depths[key] = (depths[key] || 0) + 1; - added = true; - } - else { - depths[key] -= 1; - if (!depths[key]) { - delete currentMap[key]; - delete this.callbackMap[key]; - removed = true; - } - } - if (this.masterCallback) { - if (removed) { - this.masterCallback(null, String(key)); - } - if (added) { - this.masterCallback(val, String(key)); - } - } - }; - } - createRef(key) { - let refCallback = this.callbackMap[key]; - if (!refCallback) { - refCallback = this.callbackMap[key] = (val) => { - this.handleValue(val, String(key)); - }; - } - return refCallback; - } - // TODO: check callers that don't care about order. should use getAll instead - // NOTE: this method has become less valuable now that we are encouraged to map order by some other index - // TODO: provide ONE array-export function, buildArray, which fails on non-numeric indexes. caller can manipulate and "collect" - collect(startIndex, endIndex, step) { - return collectFromHash(this.currentMap, startIndex, endIndex, step); - } - getAll() { - return hashValuesToArray(this.currentMap); - } - } - - function computeShrinkWidth(chunkEls) { - let shrinkCells = findElements(chunkEls, '.fc-scrollgrid-shrink'); - let largestWidth = 0; - for (let shrinkCell of shrinkCells) { - largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell)); - } - return Math.ceil(largestWidth); // elements work best with integers. round up to ensure contents fits - } - function getSectionHasLiquidHeight(props, sectionConfig) { - return props.liquid && sectionConfig.liquid; // does the section do liquid-height? (need to have whole scrollgrid liquid-height as well) - } - function getAllowYScrolling(props, sectionConfig) { - return sectionConfig.maxHeight != null || // if its possible for the height to max out, we might need scrollbars - 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, isHeader) { - let { expandRows } = arg; - let content = typeof chunkConfig.content === 'function' ? - chunkConfig.content(arg) : - h('table', { - role: 'presentation', - className: [ - chunkConfig.tableClassName, - sectionConfig.syncRowHeights ? 'fc-scrollgrid-sync-table' : '', - ].join(' '), - style: { - minWidth: arg.tableMinWidth, - width: arg.clientWidth, - height: expandRows ? arg.clientHeight : '', // css `height` on a
serves as a min-height - }, - }, arg.tableColGroupNode, h(isHeader ? 'thead' : 'tbody', { - role: 'presentation', - }, typeof chunkConfig.rowContent === 'function' - ? chunkConfig.rowContent(arg) - : chunkConfig.rowContent)); - return content; - } - function isColPropsEqual(cols0, cols1) { - return isArraysEqual(cols0, cols1, isPropsEqual); - } - function renderMicroColGroup(cols, shrinkWidth) { - let colNodes = []; - /* - for ColProps with spans, it would have been great to make a single - HOWEVER, Chrome was getting messing up distributing the width to elements makes Chrome behave. - */ - for (let colProps of cols) { - let span = colProps.span || 1; - for (let i = 0; i < span; i += 1) { - colNodes.push(h("col", { style: { - width: colProps.width === 'shrink' ? sanitizeShrinkWidth(shrinkWidth) : (colProps.width || ''), - minWidth: colProps.minWidth || '', - } })); - } - } - return h('colgroup', {}, ...colNodes); - } - function sanitizeShrinkWidth(shrinkWidth) { - /* why 4? if we do 0, it will kill any border, which are needed for computeSmallestCellWidth - 4 accounts for 2 2-pixel borders. TODO: better solution? */ - return shrinkWidth == null ? 4 : shrinkWidth; - } - function hasShrinkWidth(cols) { - for (let col of cols) { - if (col.width === 'shrink') { - return true; - } - } - return false; - } - function getScrollGridClassNames(liquid, context) { - let classNames = [ - 'fc-scrollgrid', - context.theme.getClass('table'), - ]; - if (liquid) { - classNames.push('fc-scrollgrid-liquid'); - } - return classNames; - } - function getSectionClassNames(sectionConfig, wholeTableVGrow) { - let classNames = [ - 'fc-scrollgrid-section', - `fc-scrollgrid-section-${sectionConfig.type}`, - sectionConfig.className, // used? - ]; - if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) { - classNames.push('fc-scrollgrid-section-liquid'); - } - if (sectionConfig.isSticky) { - classNames.push('fc-scrollgrid-section-sticky'); - } - return classNames; - } - function renderScrollShim(arg) { - return (h("div", { className: "fc-scrollgrid-sticky-shim", style: { - width: arg.clientWidth, - minWidth: arg.tableMinWidth, - } })); - } - function getStickyHeaderDates(options) { - let { stickyHeaderDates } = options; - if (stickyHeaderDates == null || stickyHeaderDates === 'auto') { - stickyHeaderDates = options.height === 'auto' || options.viewHeight === 'auto'; - } - return stickyHeaderDates; - } - function getStickyFooterScrollbar(options) { - let { stickyFooterScrollbar } = options; - if (stickyFooterScrollbar == null || stickyFooterScrollbar === 'auto') { - stickyFooterScrollbar = options.height === 'auto' || options.viewHeight === 'auto'; - } - return stickyFooterScrollbar; - } - - class SimpleScrollGrid extends BaseComponent { - constructor() { - super(...arguments); - this.processCols = memoize((a) => a, isColPropsEqual); // so we get same `cols` props every time - // yucky to memoize VNodes, but much more efficient for consumers - this.renderMicroColGroup = memoize(renderMicroColGroup); - this.scrollerRefs = new RefMap(); - this.scrollerElRefs = new RefMap(this._handleScrollerEl.bind(this)); - this.state = { - shrinkWidth: null, - forceYScrollbars: false, - scrollerClientWidths: {}, - scrollerClientHeights: {}, - }; - // TODO: can do a really simple print-view. dont need to join rows - this.handleSizing = () => { - this.safeSetState(Object.assign({ shrinkWidth: this.computeShrinkWidth() }, this.computeScrollerDims())); - }; - } - render() { - let { props, state, context } = this; - let sectionConfigs = props.sections || []; - let cols = this.processCols(props.cols); - let microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth); - let classNames = getScrollGridClassNames(props.liquid, context); - if (props.collapsibleWidth) { - classNames.push('fc-scrollgrid-collapsible'); - } - // TODO: make DRY - let configCnt = sectionConfigs.length; - let configI = 0; - let currentConfig; - let headSectionNodes = []; - let bodySectionNodes = []; - let footSectionNodes = []; - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') { - headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); - configI += 1; - } - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') { - bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false)); - configI += 1; - } - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') { - footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); - configI += 1; - } - // firefox bug: when setting height on table and there is a thead or tfoot, - // the necessary height:100% on the liquid-height body section forces the *whole* table to be taller. (bug #5524) - // use getCanVGrowWithinCell as a way to detect table-stupid firefox. - // if so, use a simpler dom structure, jam everything into a lone tbody. - let isBuggy = !getCanVGrowWithinCell(); - const roleAttrs = { role: 'rowgroup' }; - return h('table', { - role: 'grid', - className: classNames.join(' '), - style: { height: props.height }, - }, Boolean(!isBuggy && headSectionNodes.length) && h('thead', roleAttrs, ...headSectionNodes), Boolean(!isBuggy && bodySectionNodes.length) && h('tbody', roleAttrs, ...bodySectionNodes), Boolean(!isBuggy && footSectionNodes.length) && h('tfoot', roleAttrs, ...footSectionNodes), isBuggy && h('tbody', roleAttrs, ...headSectionNodes, ...bodySectionNodes, ...footSectionNodes)); - } - renderSection(sectionConfig, microColGroupNode, isHeader) { - if ('outerContent' in sectionConfig) { - return (h(p, { key: sectionConfig.key }, sectionConfig.outerContent)); - } - return (h("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader))); - } - renderChunkTd(sectionConfig, microColGroupNode, chunkConfig, isHeader) { - if ('outerContent' in chunkConfig) { - return chunkConfig.outerContent; - } - let { props } = this; - let { forceYScrollbars, scrollerClientWidths, scrollerClientHeights } = this.state; - let needsYScrolling = getAllowYScrolling(props, sectionConfig); // TODO: do lazily. do in section config? - let isLiquid = getSectionHasLiquidHeight(props, sectionConfig); - // for `!props.liquid` - is WHOLE scrollgrid natural height? - // TODO: do same thing in advanced scrollgrid? prolly not b/c always has horizontal scrollbars - let overflowY = !props.liquid ? 'visible' : - forceYScrollbars ? 'scroll' : - !needsYScrolling ? 'hidden' : - 'auto'; - let sectionKey = sectionConfig.key; - let content = renderChunkContent(sectionConfig, chunkConfig, { - tableColGroupNode: microColGroupNode, - tableMinWidth: '', - clientWidth: (!props.collapsibleWidth && scrollerClientWidths[sectionKey] !== undefined) ? scrollerClientWidths[sectionKey] : null, - clientHeight: scrollerClientHeights[sectionKey] !== undefined ? scrollerClientHeights[sectionKey] : null, - expandRows: sectionConfig.expandRows, - syncRowHeights: false, - rowSyncHeights: [], - reportRowHeightChange: () => { }, - }, isHeader); - return h(isHeader ? 'th' : 'td', { - ref: chunkConfig.elRef, - role: 'presentation', - }, h("div", { className: `fc-scroller-harness${isLiquid ? ' fc-scroller-harness-liquid' : ''}` }, - h(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))); - } - _handleScrollerEl(scrollerEl, key) { - let section = getSectionByKey(this.props.sections, key); - if (section) { - setRef(section.chunk.scrollerElRef, scrollerEl); - } - } - componentDidMount() { - this.handleSizing(); - this.context.addResizeHandler(this.handleSizing); - } - componentDidUpdate() { - // TODO: need better solution when state contains non-sizing things - this.handleSizing(); - } - componentWillUnmount() { - this.context.removeResizeHandler(this.handleSizing); - } - computeShrinkWidth() { - return hasShrinkWidth(this.props.cols) - ? computeShrinkWidth(this.scrollerElRefs.getAll()) - : 0; - } - computeScrollerDims() { - let scrollbarWidth = getScrollbarWidths(); - let { scrollerRefs, scrollerElRefs } = this; - let forceYScrollbars = false; - let scrollerClientWidths = {}; - let scrollerClientHeights = {}; - for (let sectionKey in scrollerRefs.currentMap) { - let scroller = scrollerRefs.currentMap[sectionKey]; - if (scroller && scroller.needsYScrolling()) { - forceYScrollbars = true; - break; - } - } - for (let section of this.props.sections) { - let sectionKey = section.key; - let scrollerEl = scrollerElRefs.currentMap[sectionKey]; - if (scrollerEl) { - let harnessEl = scrollerEl.parentNode; // TODO: weird way to get this. need harness b/c doesn't include table borders - scrollerClientWidths[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars - ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future - : 0)); - scrollerClientHeights[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().height); - } - } - return { forceYScrollbars, scrollerClientWidths, scrollerClientHeights }; - } - } - SimpleScrollGrid.addStateEquality({ - scrollerClientWidths: isPropsEqual, - scrollerClientHeights: isPropsEqual, - }); - function getSectionByKey(sections, key) { - for (let section of sections) { - if (section.key === key) { - return section; - } - } - return null; - } - - class EventContainer extends BaseComponent { - constructor() { - super(...arguments); - this.handleEl = (el) => { - if (el) { - setElSeg(el, this.props.seg); - } - // TODO: when null, should unset to avoid memory leaks? - }; - } - render() { - const { props, context } = this; - const { options } = context; - const { seg } = props; - const { eventRange } = seg; - const { ui } = eventRange; - const renderProps = { - event: new EventImpl(context, eventRange.def, eventRange.instance), - view: context.viewApi, - timeText: props.timeText, - textColor: ui.textColor, - backgroundColor: ui.backgroundColor, - borderColor: ui.borderColor, - isDraggable: !props.disableDragging && computeSegDraggable(seg, context), - isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context), - isEndResizable: !props.disableResizing && computeSegEndResizable(seg), - isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting), - isStart: Boolean(seg.isStart), - isEnd: Boolean(seg.isEnd), - isPast: Boolean(props.isPast), - isFuture: Boolean(props.isFuture), - isToday: Boolean(props.isToday), - isSelected: Boolean(props.isSelected), - isDragging: Boolean(props.isDragging), - isResizing: Boolean(props.isResizing), - }; - return (h(ContentContainer, Object.assign({}, props /* contains children */, { elRef: this.handleEl, elClasses: [ - ...getEventClassNames(renderProps), - ...seg.eventRange.ui.classNames, - ...(props.elClasses || []), - ], renderProps: renderProps, generatorName: "eventContent", generator: options.eventContent || props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount }))); - } - } - - // should not be a purecomponent - class StandardEvent extends BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let { seg } = props; - let { ui } = seg.eventRange; - let timeFormat = options.eventTimeFormat || props.defaultTimeFormat; - let timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd); - return (h(EventContainer, Object.assign({}, props /* includes elRef */, { elTag: "a", elStyle: { - borderColor: ui.borderColor, - backgroundColor: ui.backgroundColor, - }, elAttrs: getSegAnchorAttrs(seg, context), defaultGenerator: renderInnerContent$1$1, timeText: timeText }), (InnerContent, eventContentArg) => (h(p, null, - h(InnerContent, { elTag: "div", elClasses: ['fc-event-main'], elStyle: { color: eventContentArg.textColor } }), - Boolean(eventContentArg.isStartResizable) && (h("div", { className: "fc-event-resizer fc-event-resizer-start" })), - Boolean(eventContentArg.isEndResizable) && (h("div", { className: "fc-event-resizer fc-event-resizer-end" })))))); - } - } - function renderInnerContent$1$1(innerProps) { - return (h("div", { className: "fc-event-main-frame" }, - innerProps.timeText && (h("div", { className: "fc-event-time" }, innerProps.timeText)), - h("div", { className: "fc-event-title-container" }, - h("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || h(p, null, "\u00A0"))))); - } - - const NowIndicatorContainer = (props) => (h(ViewContextType.Consumer, null, (context) => { - let { options } = context; - let renderProps = { - isAxis: props.isAxis, - date: context.dateEnv.toDate(props.date), - view: context.viewApi, - }; - return (h(ContentContainer, Object.assign({}, props /* includes children */, { elTag: props.elTag || 'div', renderProps: renderProps, generatorName: "nowIndicatorContent", generator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }))); - })); - - const DAY_NUM_FORMAT = createFormatter({ day: 'numeric' }); - class DayCellContainer extends BaseComponent { - constructor() { - super(...arguments); - this.refineRenderProps = memoizeObjArg(refineRenderProps); - } - render() { - let { props, context } = this; - let { options } = context; - let renderProps = this.refineRenderProps({ - date: props.date, - dateProfile: props.dateProfile, - todayRange: props.todayRange, - showDayNumber: props.showDayNumber, - extraRenderProps: props.extraRenderProps, - viewApi: context.viewApi, - dateEnv: context.dateEnv, - }); - return (h(ContentContainer, Object.assign({}, props /* includes children */, { elClasses: [ - ...getDayClassNames(renderProps, context.theme), - ...(props.elClasses || []), - ], elAttrs: Object.assign(Object.assign({}, props.elAttrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), renderProps: renderProps, generatorName: "dayCellContent", generator: options.dayCellContent || props.defaultGenerator, classNameGenerator: - // don't use custom classNames if disabled - renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount }))); - } - } - function hasCustomDayCellContent(options) { - return Boolean(options.dayCellContent || hasCustomRenderingHandler('dayCellContent', options)); - } - function refineRenderProps(raw) { - let { date, dateEnv } = raw; - let dayMeta = getDateMeta(date, raw.todayRange, null, raw.dateProfile); - return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ? dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraRenderProps); - } - - class BgEvent extends BaseComponent { - render() { - let { props } = this; - let { seg } = props; - return (h(EventContainer, { elTag: "div", elClasses: ['fc-bg-event'], elStyle: { backgroundColor: seg.eventRange.ui.backgroundColor }, defaultGenerator: renderInnerContent$3, seg: seg, timeText: "", isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, disableDragging: true, disableResizing: true })); - } - } - function renderInnerContent$3(props) { - let { title } = props.event; - return title && (h("div", { className: "fc-event-title" }, props.event.title)); - } - function renderFill(fillType) { - return (h("div", { className: `fc-${fillType}` })); - } - - const WeekNumberContainer = (props) => (h(ViewContextType.Consumer, null, (context) => { - let { dateEnv, options } = context; - let { date } = props; - let format = options.weekNumberFormat || props.defaultFormat; - let num = dateEnv.computeWeekNumber(date); // TODO: somehow use for formatting as well? - let text = dateEnv.format(date, format); - let renderProps = { num, text, date }; - return (h(ContentContainer // why isn't WeekNumberContentArg being auto-detected? - , Object.assign({}, props /* includes children */, { renderProps: renderProps, generatorName: "weekNumberContent", generator: options.weekNumberContent || renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }))); - })); - function renderInner(innerProps) { - return innerProps.text; - } - - const PADDING_FROM_VIEWPORT = 10; - class Popover extends BaseComponent { - constructor() { - super(...arguments); - this.state = { - titleId: getUniqueDomId(), - }; - this.handleRootEl = (el) => { - this.rootEl = el; - if (this.props.elRef) { - setRef(this.props.elRef, el); - } - }; - // Triggered when the user clicks *anywhere* in the document, for the autoHide feature - this.handleDocumentMouseDown = (ev) => { - // only hide the popover if the click happened outside the popover - const target = getEventTargetViaRoot(ev); - if (!this.rootEl.contains(target)) { - this.handleCloseClick(); - } - }; - this.handleDocumentKeyDown = (ev) => { - if (ev.key === 'Escape') { - this.handleCloseClick(); - } - }; - this.handleCloseClick = () => { - let { onClose } = this.props; - if (onClose) { - onClose(); - } - }; - } - render() { - let { theme, options } = this.context; - let { props, state } = this; - let classNames = [ - 'fc-popover', - theme.getClass('popover'), - ].concat(props.extraClassNames || []); - return j(h("div", Object.assign({}, props.extraAttrs, { id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId, ref: this.handleRootEl }), - h("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') }, - h("span", { className: "fc-popover-title", id: state.titleId }, props.title), - h("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })), - h("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl); - } - componentDidMount() { - document.addEventListener('mousedown', this.handleDocumentMouseDown); - document.addEventListener('keydown', this.handleDocumentKeyDown); - this.updateSize(); - } - componentWillUnmount() { - document.removeEventListener('mousedown', this.handleDocumentMouseDown); - document.removeEventListener('keydown', this.handleDocumentKeyDown); - } - updateSize() { - let { isRtl } = this.context; - let { alignmentEl, alignGridTop } = this.props; - let { rootEl } = this; - let alignmentRect = computeClippedClientRect(alignmentEl); - if (alignmentRect) { - let popoverDims = rootEl.getBoundingClientRect(); - // position relative to viewport - let popoverTop = alignGridTop - ? elementClosest(alignmentEl, '.fc-scrollgrid').getBoundingClientRect().top - : alignmentRect.top; - let popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left; - // constrain - popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT); - popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width); - popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT); - let origin = rootEl.offsetParent.getBoundingClientRect(); - applyStyle(rootEl, { - top: popoverTop - origin.top, - left: popoverLeft - origin.left, - }); - } - } - } - - class MorePopover extends DateComponent { - constructor() { - super(...arguments); - this.handleRootEl = (rootEl) => { - this.rootEl = rootEl; - if (rootEl) { - this.context.registerInteractiveComponent(this, { - el: rootEl, - useEventCenter: false, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; - } - render() { - let { options, dateEnv } = this.context; - let { props } = this; - let { startDate, todayRange, dateProfile } = props; - let title = dateEnv.format(startDate, options.dayPopoverFormat); - return (h(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateProfile: dateProfile, todayRange: todayRange }, (InnerContent, renderProps, elAttrs) => (h(Popover, { elRef: elAttrs.ref, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(elAttrs.className || []), extraAttrs: elAttrs /* TODO: make these time-based when not whole-day? */, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, - hasCustomDayCellContent(options) && (h(InnerContent, { elTag: "div", elClasses: ['fc-more-popover-misc'] })), - props.children)))); - } - queryHit(positionLeft, positionTop, elWidth, elHeight) { - let { rootEl, props } = this; - if (positionLeft >= 0 && positionLeft < elWidth && - positionTop >= 0 && positionTop < elHeight) { - return { - dateProfile: props.dateProfile, - dateSpan: Object.assign({ allDay: true, range: { - start: props.startDate, - end: props.endDate, - } }, props.extraDateSpan), - dayEl: rootEl, - rect: { - left: 0, - top: 0, - right: elWidth, - bottom: elHeight, - }, - layer: 1, // important when comparing with hits from other components - }; - } - return null; - } - } - - class MoreLinkContainer extends BaseComponent { - constructor() { - super(...arguments); - this.linkElRef = y(); - this.state = { - isPopoverOpen: false, - popoverId: getUniqueDomId(), - }; - this.handleClick = (ev) => { - let { props, context } = this; - let { moreLinkClick } = context.options; - let date = computeRange(props).start; - function buildPublicSeg(seg) { - let { def, instance, range } = seg.eventRange; - return { - event: new EventImpl(context, def, instance), - start: context.dateEnv.toDate(range.start), - end: context.dateEnv.toDate(range.end), - isStart: seg.isStart, - isEnd: seg.isEnd, - }; - } - if (typeof moreLinkClick === 'function') { - moreLinkClick = moreLinkClick({ - date, - allDay: Boolean(props.allDayDate), - allSegs: props.allSegs.map(buildPublicSeg), - hiddenSegs: props.hiddenSegs.map(buildPublicSeg), - jsEvent: ev, - view: context.viewApi, - }); - } - if (!moreLinkClick || moreLinkClick === 'popover') { - this.setState({ isPopoverOpen: true }); - } - else if (typeof moreLinkClick === 'string') { // a view name - context.calendarApi.zoomTo(date, moreLinkClick); - } - }; - this.handlePopoverClose = () => { - this.setState({ isPopoverOpen: false }); - }; - } - render() { - let { props, state } = this; - return (h(ViewContextType.Consumer, null, (context) => { - let { viewApi, options, calendarApi } = context; - let { moreLinkText } = options; - let { moreCnt } = props; - let range = computeRange(props); - let text = typeof moreLinkText === 'function' // TODO: eventually use formatWithOrdinals - ? moreLinkText.call(calendarApi, moreCnt) - : `+${moreCnt} ${moreLinkText}`; - let hint = formatWithOrdinals(options.moreLinkHint, [moreCnt], text); - let renderProps = { - num: moreCnt, - shortText: `+${moreCnt}`, - text, - view: viewApi, - }; - return (h(p, null, - Boolean(props.moreCnt) && (h(ContentContainer, { elTag: props.elTag || 'a', elRef: this.linkElRef, elClasses: [ - ...(props.elClasses || []), - 'fc-more-link', - ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.elAttrs), createAriaClickAttrs(this.handleClick)), { title: hint, 'aria-expanded': state.isPopoverOpen, 'aria-controls': state.isPopoverOpen ? state.popoverId : '' }), renderProps: renderProps, generatorName: "moreLinkContent", generator: options.moreLinkContent || props.defaultGenerator || renderMoreLinkInner$1, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children)), - state.isPopoverOpen && (h(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 ? - props.alignmentElRef.current : - this.linkElRef.current, alignGridTop: props.alignGridTop, onClose: this.handlePopoverClose }, props.popoverContent())))); - })); - } - componentDidMount() { - this.updateParentEl(); - } - componentDidUpdate() { - this.updateParentEl(); - } - updateParentEl() { - if (this.linkElRef.current) { - this.parentEl = elementClosest(this.linkElRef.current, '.fc-view-harness'); - } - } - } - function renderMoreLinkInner$1(props) { - return props.text; - } - function computeRange(props) { - if (props.allDayDate) { - return { - start: props.allDayDate, - end: addDays(props.allDayDate, 1), - }; - } - let { hiddenSegs } = props; - return { - start: computeEarliestSegStart(hiddenSegs), - end: computeLatestSegEnd(hiddenSegs), - }; - } - function computeEarliestSegStart(segs) { - return segs.reduce(pickEarliestStart).eventRange.range.start; - } - function pickEarliestStart(seg0, seg1) { - return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1; - } - function computeLatestSegEnd(segs) { - return segs.reduce(pickLatestEnd).eventRange.range.end; - } - function pickLatestEnd(seg0, seg1) { - return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1; - } - - class Store { - constructor() { - this.handlers = []; - } - set(value) { - this.currentValue = value; - for (let handler of this.handlers) { - handler(value); - } - } - subscribe(handler) { - this.handlers.push(handler); - if (this.currentValue !== undefined) { - handler(this.currentValue); - } - } - } - - /* - Subscribers will get a LIST of CustomRenderings - */ - class CustomRenderingStore extends Store { - constructor() { - super(...arguments); - this.map = new Map(); - } - // for consistent order - handle(customRendering) { - const { map } = this; - let updated = false; - if (customRendering.isActive) { - map.set(customRendering.id, customRendering); - updated = true; - } - else if (map.has(customRendering.id)) { - map.delete(customRendering.id); - updated = true; - } - if (updated) { - this.set(map); - } - } - } - - var internal = { - __proto__: null, - BASE_OPTION_DEFAULTS: BASE_OPTION_DEFAULTS, - BaseComponent: BaseComponent, - BgEvent: BgEvent, - CalendarImpl: CalendarImpl, - CalendarRoot: CalendarRoot, - ContentContainer: ContentContainer, - CustomRenderingStore: CustomRenderingStore, - DateComponent: DateComponent, - DateEnv: DateEnv, - DateProfileGenerator: DateProfileGenerator, - DayCellContainer: DayCellContainer, - DayHeader: DayHeader, - DaySeriesModel: DaySeriesModel, - DayTableModel: DayTableModel, - DelayedRunner: DelayedRunner, - ElementDragging: ElementDragging, - ElementScrollController: ElementScrollController, - Emitter: Emitter, - EventContainer: EventContainer, - EventImpl: EventImpl, - Interaction: Interaction, - MoreLinkContainer: MoreLinkContainer, - NamedTimeZoneImpl: NamedTimeZoneImpl, - NowIndicatorContainer: NowIndicatorContainer, - NowTimer: NowTimer, - PositionCache: PositionCache, - RefMap: RefMap, - ScrollController: ScrollController, - ScrollResponder: ScrollResponder, - Scroller: Scroller, - SegHierarchy: SegHierarchy, - SimpleScrollGrid: SimpleScrollGrid, - Slicer: Slicer, - Splitter: Splitter, - StandardEvent: StandardEvent, - TableDateCell: TableDateCell, - TableDowCell: TableDowCell, - Theme: Theme, - ViewContainer: ViewContainer$1, - ViewContextType: ViewContextType, - WeekNumberContainer: WeekNumberContainer, - WindowScrollController: WindowScrollController, - addDays: addDays, - addDurations: addDurations, - addMs: addMs, - addWeeks: addWeeks, - allowContextMenu: allowContextMenu, - allowSelection: allowSelection, - applyMutationToEventStore: applyMutationToEventStore, - applyStyle: applyStyle, - asCleanDays: asCleanDays, - asRoughMinutes: asRoughMinutes, - asRoughMs: asRoughMs, - asRoughSeconds: asRoughSeconds, - binarySearch: binarySearch, - buildElAttrs: buildElAttrs, - buildEntryKey: buildEntryKey, - buildEventApis: buildEventApis, - buildEventRangeKey: buildEventRangeKey, - buildIsoString: buildIsoString, - buildNavLinkAttrs: buildNavLinkAttrs, - buildSegTimeText: buildSegTimeText, - collectFromHash: collectFromHash, - combineEventUis: combineEventUis, - compareByFieldSpecs: compareByFieldSpecs, - compareNumbers: compareNumbers, - compareObjs: compareObjs, - computeEarliestSegStart: computeEarliestSegStart, - computeEdges: computeEdges, - computeFallbackHeaderFormat: computeFallbackHeaderFormat, - computeInnerRect: computeInnerRect, - computeRect: computeRect, - computeShrinkWidth: computeShrinkWidth, - computeVisibleDayRange: computeVisibleDayRange, - config: config, - constrainPoint: constrainPoint, - createDuration: createDuration, - createEmptyEventStore: createEmptyEventStore, - createEventInstance: createEventInstance, - createEventUi: createEventUi, - createFormatter: createFormatter, - diffDates: diffDates, - diffDayAndTime: diffDayAndTime, - diffDays: diffDays, - diffPoints: diffPoints, - diffWeeks: diffWeeks, - diffWholeDays: diffWholeDays, - diffWholeWeeks: diffWholeWeeks, - disableCursor: disableCursor, - elementClosest: elementClosest, - elementMatches: elementMatches, - enableCursor: enableCursor, - eventTupleToStore: eventTupleToStore, - filterHash: filterHash, - findDirectChildren: findDirectChildren, - findElements: findElements, - flexibleCompare: flexibleCompare, - formatDayString: formatDayString, - formatIsoTimeString: formatIsoTimeString, - getAllowYScrolling: getAllowYScrolling, - getCanVGrowWithinCell: getCanVGrowWithinCell, - getClippingParents: getClippingParents, - getDateMeta: getDateMeta, - getDayClassNames: getDayClassNames, - getDefaultEventEnd: getDefaultEventEnd, - getElRoot: getElRoot, - getElSeg: getElSeg, - getEntrySpanEnd: getEntrySpanEnd, - getEventTargetViaRoot: getEventTargetViaRoot, - getIsRtlScrollbarOnLeft: getIsRtlScrollbarOnLeft, - getRectCenter: getRectCenter, - getRelevantEvents: getRelevantEvents, - getScrollGridClassNames: getScrollGridClassNames, - getScrollbarWidths: getScrollbarWidths, - getSectionClassNames: getSectionClassNames, - getSectionHasLiquidHeight: getSectionHasLiquidHeight, - getSegAnchorAttrs: getSegAnchorAttrs, - getSegMeta: getSegMeta, - getSlotClassNames: getSlotClassNames, - getStickyFooterScrollbar: getStickyFooterScrollbar, - getStickyHeaderDates: getStickyHeaderDates, - getUniqueDomId: getUniqueDomId, - greatestDurationDenominator: greatestDurationDenominator, - groupIntersectingEntries: groupIntersectingEntries, - guid: guid, - hasBgRendering: hasBgRendering, - hasCustomDayCellContent: hasCustomDayCellContent, - hasShrinkWidth: hasShrinkWidth, - identity: identity, - injectStyles: injectStyles, - interactionSettingsStore: interactionSettingsStore, - interactionSettingsToStore: interactionSettingsToStore, - intersectRanges: intersectRanges, - intersectRects: intersectRects, - intersectSpans: intersectSpans, - isArraysEqual: isArraysEqual, - isColPropsEqual: isColPropsEqual, - isDateSelectionValid: isDateSelectionValid, - isDateSpansEqual: isDateSpansEqual, - isInt: isInt, - isInteractionValid: isInteractionValid, - isMultiDayRange: isMultiDayRange, - isPropsEqual: isPropsEqual, - isPropsValid: isPropsValid, - isValidDate: isValidDate, - mapHash: mapHash, - memoize: memoize, - memoizeArraylike: memoizeArraylike, - memoizeHashlike: memoizeHashlike, - memoizeObjArg: memoizeObjArg, - mergeEventStores: mergeEventStores, - multiplyDuration: multiplyDuration, - padStart: padStart, - parseBusinessHours: parseBusinessHours, - parseClassNames: parseClassNames, - parseDragMeta: parseDragMeta, - parseEventDef: parseEventDef, - parseFieldSpecs: parseFieldSpecs, - parseMarker: parse, - pointInsideRect: pointInsideRect, - preventContextMenu: preventContextMenu, - preventDefault: preventDefault, - preventSelection: preventSelection, - rangeContainsMarker: rangeContainsMarker, - rangeContainsRange: rangeContainsRange, - rangesEqual: rangesEqual, - rangesIntersect: rangesIntersect, - refineEventDef: refineEventDef, - refineProps: refineProps, - removeElement: removeElement, - removeExact: removeExact, - renderChunkContent: renderChunkContent, - renderFill: renderFill, - renderMicroColGroup: renderMicroColGroup, - renderScrollShim: renderScrollShim, - requestJson: requestJson, - sanitizeShrinkWidth: sanitizeShrinkWidth, - setRef: setRef, - sliceEventStore: sliceEventStore, - sortEventSegs: sortEventSegs, - startOfDay: startOfDay, - translateRect: translateRect, - triggerDateSelect: triggerDateSelect, - unpromisify: unpromisify, - whenTransitionDone: whenTransitionDone, - wholeDivideDurations: wholeDivideDurations - }; - - var css_248z$3 = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{border-style:none;padding:0}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.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:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}"; - injectStyles(css_248z$3); - - const globalLocales = []; - - const MINIMAL_RAW_EN_LOCALE = { - code: 'en', - week: { - dow: 0, - doy: 4, // 4 days need to be within the year to be considered the first week - }, - 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', - }; - const RAW_EN_LOCALE = Object.assign(Object.assign({}, MINIMAL_RAW_EN_LOCALE), { - // Includes things we don't want other locales to inherit, - // things that derive from other translatable strings. - buttonHints: { - prev: 'Previous $0', - next: 'Next $0', - today(buttonText, unit) { - return (unit === 'day') - ? 'Today' - : `This ${buttonText}`; - }, - }, viewHint: '$0 view', navLinkHint: 'Go to $0', moreLinkHint(eventCnt) { - return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`; - } }); - function organizeRawLocales(explicitRawLocales) { - let defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en'; - let allRawLocales = globalLocales.concat(explicitRawLocales); - let rawLocaleMap = { - en: RAW_EN_LOCALE, - }; - for (let rawLocale of allRawLocales) { - rawLocaleMap[rawLocale.code] = rawLocale; - } - return { - map: rawLocaleMap, - defaultCode, - }; - } - function buildLocale(inputSingular, available) { - if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) { - return parseLocale(inputSingular.code, [inputSingular.code], inputSingular); - } - return queryLocale(inputSingular, available); - } - function queryLocale(codeArg, available) { - let codes = [].concat(codeArg || []); // will convert to array - let raw = queryRawLocale(codes, available) || RAW_EN_LOCALE; - return parseLocale(codeArg, codes, raw); - } - function queryRawLocale(codes, available) { - for (let i = 0; i < codes.length; i += 1) { - let parts = codes[i].toLocaleLowerCase().split('-'); - for (let j = parts.length; j > 0; j -= 1) { - let simpleId = parts.slice(0, j).join('-'); - if (available[simpleId]) { - return available[simpleId]; - } - } - } - return null; - } - function parseLocale(codeArg, codes, raw) { - let merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ['buttonText']); - delete merged.code; // don't want this part of the options - let { week } = merged; - delete merged.week; - return { - codeArg, - codes, - week, - simpleNumberFormat: new Intl.NumberFormat(codeArg), - options: merged, - }; - } - - // TODO: easier way to add new hooks? need to update a million things - function createPlugin(input) { - return { - id: guid(), - name: input.name, - premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : undefined, - deps: input.deps || [], - reducers: input.reducers || [], - isLoadingFuncs: input.isLoadingFuncs || [], - contextInit: [].concat(input.contextInit || []), - eventRefiners: input.eventRefiners || {}, - eventDefMemberAdders: input.eventDefMemberAdders || [], - eventSourceRefiners: input.eventSourceRefiners || {}, - isDraggableTransformers: input.isDraggableTransformers || [], - eventDragMutationMassagers: input.eventDragMutationMassagers || [], - eventDefMutationAppliers: input.eventDefMutationAppliers || [], - dateSelectionTransformers: input.dateSelectionTransformers || [], - datePointTransforms: input.datePointTransforms || [], - dateSpanTransforms: input.dateSpanTransforms || [], - views: input.views || {}, - viewPropsTransformers: input.viewPropsTransformers || [], - isPropsValid: input.isPropsValid || null, - externalDefTransforms: input.externalDefTransforms || [], - viewContainerAppends: input.viewContainerAppends || [], - eventDropTransformers: input.eventDropTransformers || [], - componentInteractions: input.componentInteractions || [], - calendarInteractions: input.calendarInteractions || [], - themeClasses: input.themeClasses || {}, - eventSourceDefs: input.eventSourceDefs || [], - cmdFormatter: input.cmdFormatter, - recurringTypes: input.recurringTypes || [], - namedTimeZonedImpl: input.namedTimeZonedImpl, - initialView: input.initialView || '', - elementDraggingImpl: input.elementDraggingImpl, - optionChangeHandlers: input.optionChangeHandlers || {}, - scrollGridImpl: input.scrollGridImpl || null, - listenerRefiners: input.listenerRefiners || {}, - optionRefiners: input.optionRefiners || {}, - propSetHandlers: input.propSetHandlers || {}, - }; - } - function buildPluginHooks(pluginDefs, globalDefs) { - let currentPluginIds = {}; - let hooks = { - premiumReleaseDate: undefined, - reducers: [], - isLoadingFuncs: [], - contextInit: [], - eventRefiners: {}, - eventDefMemberAdders: [], - eventSourceRefiners: {}, - isDraggableTransformers: [], - eventDragMutationMassagers: [], - eventDefMutationAppliers: [], - dateSelectionTransformers: [], - datePointTransforms: [], - dateSpanTransforms: [], - views: {}, - viewPropsTransformers: [], - isPropsValid: null, - externalDefTransforms: [], - viewContainerAppends: [], - eventDropTransformers: [], - componentInteractions: [], - calendarInteractions: [], - themeClasses: {}, - eventSourceDefs: [], - cmdFormatter: null, - recurringTypes: [], - namedTimeZonedImpl: null, - initialView: '', - elementDraggingImpl: null, - optionChangeHandlers: {}, - scrollGridImpl: null, - listenerRefiners: {}, - optionRefiners: {}, - propSetHandlers: {}, - }; - function addDefs(defs) { - for (let def of defs) { - const pluginName = def.name; - const currentId = currentPluginIds[pluginName]; - if (currentId === undefined) { - currentPluginIds[pluginName] = def.id; - addDefs(def.deps); - hooks = combineHooks(hooks, def); - } - else if (currentId !== def.id) { - // different ID than the one already added - console.warn(`Duplicate plugin '${pluginName}'`); - } - } - } - if (pluginDefs) { - addDefs(pluginDefs); - } - addDefs(globalDefs); - return hooks; - } - function buildBuildPluginHooks() { - let currentOverrideDefs = []; - let currentGlobalDefs = []; - let currentHooks; - return (overrideDefs, globalDefs) => { - if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) { - currentHooks = buildPluginHooks(overrideDefs, globalDefs); - } - currentOverrideDefs = overrideDefs; - currentGlobalDefs = globalDefs; - return currentHooks; - }; - } - function combineHooks(hooks0, hooks1) { - return { - premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate), - reducers: hooks0.reducers.concat(hooks1.reducers), - isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs), - contextInit: hooks0.contextInit.concat(hooks1.contextInit), - eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners), - eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders), - eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners), - isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers), - eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers), - eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers), - dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers), - datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms), - dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms), - views: Object.assign(Object.assign({}, hooks0.views), hooks1.views), - viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers), - isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid, - externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms), - viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends), - eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers), - calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions), - componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions), - themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses), - eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs), - cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter, - recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes), - namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl, - initialView: hooks0.initialView || hooks1.initialView, - elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl, - optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers), - scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl, - listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners), - optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners), - propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers), - }; - } - function compareOptionalDates(date0, date1) { - if (date0 === undefined) { - return date1; - } - if (date1 === undefined) { - return date0; - } - return new Date(Math.max(date0.valueOf(), date1.valueOf())); - } - - class StandardTheme extends Theme { - } - StandardTheme.prototype.classes = { - root: 'fc-theme-standard', - tableCellShaded: 'fc-cell-shaded', - buttonGroup: 'fc-button-group', - button: 'fc-button fc-button-primary', - buttonActive: 'fc-button-active', - }; - StandardTheme.prototype.baseIconClass = 'fc-icon'; - StandardTheme.prototype.iconClasses = { - close: 'fc-icon-x', - prev: 'fc-icon-chevron-left', - next: 'fc-icon-chevron-right', - prevYear: 'fc-icon-chevrons-left', - nextYear: 'fc-icon-chevrons-right', - }; - StandardTheme.prototype.rtlIconClasses = { - prev: 'fc-icon-chevron-right', - next: 'fc-icon-chevron-left', - prevYear: 'fc-icon-chevrons-right', - nextYear: 'fc-icon-chevrons-left', - }; - StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly - StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon'; - StandardTheme.prototype.iconOverridePrefix = 'fc-icon-'; - - function compileViewDefs(defaultConfigs, overrideConfigs) { - let hash = {}; - let viewType; - for (viewType in defaultConfigs) { - ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); - } - for (viewType in overrideConfigs) { - ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); - } - return hash; - } - function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) { - if (hash[viewType]) { - return hash[viewType]; - } - let viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs); - if (viewDef) { - hash[viewType] = viewDef; - } - return viewDef; - } - function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) { - let defaultConfig = defaultConfigs[viewType]; - let overrideConfig = overrideConfigs[viewType]; - let queryProp = (name) => ((defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] : - ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null)); - let theComponent = queryProp('component'); - let superType = queryProp('superType'); - let superDef = null; - if (superType) { - if (superType === viewType) { - throw new Error('Can\'t have a custom view type that references itself'); - } - superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs); - } - if (!theComponent && superDef) { - theComponent = superDef.component; - } - if (!theComponent) { - return null; // don't throw a warning, might be settings for a single-unit view - } - return { - type: viewType, - component: theComponent, - defaults: Object.assign(Object.assign({}, (superDef ? superDef.defaults : {})), (defaultConfig ? defaultConfig.rawOptions : {})), - overrides: Object.assign(Object.assign({}, (superDef ? superDef.overrides : {})), (overrideConfig ? overrideConfig.rawOptions : {})), - }; - } - - function parseViewConfigs(inputs) { - return mapHash(inputs, parseViewConfig); - } - function parseViewConfig(input) { - let rawOptions = typeof input === 'function' ? - { component: input } : - input; - let { component } = rawOptions; - if (rawOptions.content) { - component = createViewHookComponent(rawOptions); - // TODO: remove content/classNames/didMount/etc from options? - } - return { - superType: rawOptions.type, - component: component, - rawOptions, // includes type and component too :( - }; - } - function createViewHookComponent(options) { - return (viewProps) => (h(ViewContextType.Consumer, null, (context) => (h(ContentContainer, { elTag: "div", elClasses: buildViewClassNames(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: undefined, generator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount })))); - } - - function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) { - let defaultConfigs = parseViewConfigs(defaultInputs); - let overrideConfigs = parseViewConfigs(optionOverrides.views); - let viewDefs = compileViewDefs(defaultConfigs, overrideConfigs); - return mapHash(viewDefs, (viewDef) => buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults)); - } - function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) { - let durationInput = viewDef.overrides.duration || - viewDef.defaults.duration || - dynamicOptionOverrides.duration || - optionOverrides.duration; - let duration = null; - let durationUnit = ''; - let singleUnit = ''; - let singleUnitOverrides = {}; - if (durationInput) { - duration = createDurationCached(durationInput); - if (duration) { // valid? - let denom = greatestDurationDenominator(duration); - durationUnit = denom.unit; - if (denom.value === 1) { - singleUnit = durationUnit; - singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {}; - } - } - } - let queryButtonText = (optionsSubset) => { - let buttonTextMap = optionsSubset.buttonText || {}; - let buttonTextKey = viewDef.defaults.buttonTextKey; - if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) { - return buttonTextMap[buttonTextKey]; - } - if (buttonTextMap[viewDef.type] != null) { - return buttonTextMap[viewDef.type]; - } - if (buttonTextMap[singleUnit] != null) { - return buttonTextMap[singleUnit]; - } - return null; - }; - let queryButtonTitle = (optionsSubset) => { - let buttonHints = optionsSubset.buttonHints || {}; - let 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, - duration, - durationUnit, - singleUnit, - optionDefaults: viewDef.defaults, - optionOverrides: Object.assign(Object.assign({}, singleUnitOverrides), viewDef.overrides), - buttonTextOverride: queryButtonText(dynamicOptionOverrides) || - queryButtonText(optionOverrides) || // constructor-specified buttonText lookup hash takes precedence - viewDef.overrides.buttonText, - buttonTextDefault: queryButtonText(localeDefaults) || - viewDef.defaults.buttonText || - queryButtonText(BASE_OPTION_DEFAULTS) || - 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 - let durationInputMap = {}; - function createDurationCached(durationInput) { - let json = JSON.stringify(durationInput); - let res = durationInputMap[json]; - if (res === undefined) { - res = createDuration(durationInput); - durationInputMap[json] = res; - } - return res; - } - - function reduceViewType(viewType, action) { - switch (action.type) { - case 'CHANGE_VIEW_TYPE': - viewType = action.viewType; - } - return viewType; - } - - function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) { - switch (action.type) { - case 'SET_OPTION': - return Object.assign(Object.assign({}, dynamicOptionOverrides), { [action.optionName]: action.rawOptionValue }); - default: - return dynamicOptionOverrides; - } - } - - function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) { - let dp; - switch (action.type) { - case 'CHANGE_VIEW_TYPE': - return dateProfileGenerator.build(action.dateMarker || currentDate); - case 'CHANGE_DATE': - return dateProfileGenerator.build(action.dateMarker); - case 'PREV': - dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate); - if (dp.isValid) { - return dp; - } - break; - case 'NEXT': - dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate); - if (dp.isValid) { - return dp; - } - break; - } - return currentDateProfile; - } - - function initEventSources(calendarOptions, dateProfile, context) { - let activeRange = dateProfile ? dateProfile.activeRange : null; - return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context); - } - function reduceEventSources(eventSources, action, dateProfile, context) { - let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? - switch (action.type) { - case 'ADD_EVENT_SOURCES': // already parsed - return addSources(eventSources, action.sources, activeRange, context); - case 'REMOVE_EVENT_SOURCE': - return removeSource(eventSources, action.sourceId); - case 'PREV': // TODO: how do we track all actions that affect dateProfile :( - case 'NEXT': - case 'CHANGE_DATE': - case 'CHANGE_VIEW_TYPE': - if (dateProfile) { - return fetchDirtySources(eventSources, activeRange, context); - } - return eventSources; - case 'FETCH_EVENT_SOURCES': - return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type? - arrayToHash(action.sourceIds) : - excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context); - case 'RECEIVE_EVENTS': - case 'RECEIVE_EVENT_ERROR': - return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange); - case 'REMOVE_ALL_EVENT_SOURCES': - return {}; - default: - return eventSources; - } - } - function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) { - let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? - return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context); - } - function computeEventSourcesLoading(eventSources) { - for (let sourceId in eventSources) { - if (eventSources[sourceId].isFetching) { - return true; - } - } - return false; - } - function addSources(eventSourceHash, sources, fetchRange, context) { - let hash = {}; - for (let source of sources) { - hash[source.sourceId] = source; - } - if (fetchRange) { - hash = fetchDirtySources(hash, fetchRange, context); - } - return Object.assign(Object.assign({}, eventSourceHash), hash); - } - function removeSource(eventSourceHash, sourceId) { - return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId); - } - function fetchDirtySources(sourceHash, fetchRange, context) { - return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context); - } - function isSourceDirty(eventSource, fetchRange, context) { - if (!doesSourceNeedRange(eventSource, context)) { - return !eventSource.latestFetchId; - } - return !context.options.lazyFetching || - !eventSource.fetchRange || - eventSource.isFetching || // always cancel outdated in-progress fetches - fetchRange.start < eventSource.fetchRange.start || - fetchRange.end > eventSource.fetchRange.end; - } - function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) { - let nextSources = {}; - for (let sourceId in prevSources) { - let source = prevSources[sourceId]; - if (sourceIdHash[sourceId]) { - nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context); - } - else { - nextSources[sourceId] = source; - } - } - return nextSources; - } - function fetchSource(eventSource, fetchRange, isRefetch, context) { - let { options, calendarApi } = context; - let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId]; - let fetchId = guid(); - sourceDef.fetch({ - eventSource, - range: fetchRange, - isRefetch, - context, - }, (res) => { - let { rawEvents } = res; - if (options.eventSourceSuccess) { - rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents; - } - if (eventSource.success) { - rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents; - } - context.dispatch({ - type: 'RECEIVE_EVENTS', - sourceId: eventSource.sourceId, - fetchId, - fetchRange, - rawEvents, - }); - }, (error) => { - let errorHandled = false; - if (options.eventSourceFailure) { - options.eventSourceFailure.call(calendarApi, error); - errorHandled = true; - } - if (eventSource.failure) { - eventSource.failure(error); - errorHandled = true; - } - if (!errorHandled) { - console.warn(error.message, error); - } - context.dispatch({ - type: 'RECEIVE_EVENT_ERROR', - sourceId: eventSource.sourceId, - fetchId, - fetchRange, - error, - }); - }); - return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId }); - } - function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) { - let eventSource = sourceHash[sourceId]; - if (eventSource && // not already removed - fetchId === eventSource.latestFetchId) { - return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) }); - } - return sourceHash; - } - function excludeStaticSources(eventSources, context) { - return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context)); - } - function parseInitialSources(rawOptions, context) { - let refiners = buildEventSourceRefiners(context); - let rawSources = [].concat(rawOptions.eventSources || []); - let sources = []; // parsed - if (rawOptions.initialEvents) { - rawSources.unshift(rawOptions.initialEvents); - } - if (rawOptions.events) { - rawSources.unshift(rawOptions.events); - } - for (let rawSource of rawSources) { - let source = parseEventSource(rawSource, context, refiners); - if (source) { - sources.push(source); - } - } - return sources; - } - function doesSourceNeedRange(eventSource, context) { - let defs = context.pluginHooks.eventSourceDefs; - return !defs[eventSource.sourceDefId].ignoreRange; - } - - function reduceDateSelection(currentSelection, action) { - switch (action.type) { - case 'UNSELECT_DATES': - return null; - case 'SELECT_DATES': - return action.selection; - default: - return currentSelection; - } - } - - function reduceSelectedEvent(currentInstanceId, action) { - switch (action.type) { - case 'UNSELECT_EVENT': - return ''; - case 'SELECT_EVENT': - return action.eventInstanceId; - default: - return currentInstanceId; - } - } - - function reduceEventDrag(currentDrag, action) { - let newDrag; - switch (action.type) { - case 'UNSET_EVENT_DRAG': - return null; - case 'SET_EVENT_DRAG': - newDrag = action.state; - return { - affectedEvents: newDrag.affectedEvents, - mutatedEvents: newDrag.mutatedEvents, - isEvent: newDrag.isEvent, - }; - default: - return currentDrag; - } - } - - function reduceEventResize(currentResize, action) { - let newResize; - switch (action.type) { - case 'UNSET_EVENT_RESIZE': - return null; - case 'SET_EVENT_RESIZE': - newResize = action.state; - return { - affectedEvents: newResize.affectedEvents, - mutatedEvents: newResize.mutatedEvents, - isEvent: newResize.isEvent, - }; - default: - return currentResize; - } - } - - function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { - let header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; - let footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; - return { header, footer }; - } - function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { - let sectionWidgets = {}; - let viewsWithButtons = []; - let hasTitle = false; - for (let sectionName in sectionStrHash) { - let sectionStr = sectionStrHash[sectionName]; - let sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi); - sectionWidgets[sectionName] = sectionRes.widgets; - viewsWithButtons.push(...sectionRes.viewsWithButtons); - hasTitle = hasTitle || sectionRes.hasTitle; - } - return { sectionWidgets, viewsWithButtons, hasTitle }; - } - /* - BAD: querying icons and text here. should be done at render time - */ - function parseSection(sectionStr, calendarOptions, // defaults+overrides, then refined - calendarOptionOverrides, // overrides only!, unrefined :( - theme, viewSpecs, calendarApi) { - let isRtl = calendarOptions.direction === 'rtl'; - let calendarCustomButtons = calendarOptions.customButtons || {}; - let calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {}; - let calendarButtonText = calendarOptions.buttonText || {}; - let calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {}; - let calendarButtonHints = calendarOptions.buttonHints || {}; - let sectionSubstrs = sectionStr ? sectionStr.split(' ') : []; - let viewsWithButtons = []; - let hasTitle = false; - let widgets = sectionSubstrs.map((buttonGroupStr) => (buttonGroupStr.split(',').map((buttonName) => { - if (buttonName === 'title') { - hasTitle = true; - return { buttonName }; - } - let customButtonProps; - let viewSpec; - let buttonClick; - let buttonIcon; // only one of these will be set - let buttonText; // " - let buttonHint; - // ^ for the title="" attribute, for accessibility - if ((customButtonProps = calendarCustomButtons[buttonName])) { - buttonClick = (ev) => { - if (customButtonProps.click) { - customButtonProps.click.call(ev.target, ev, ev.target); // TODO: use Calendar this context? - } - }; - (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); - buttonClick = () => { - calendarApi.changeView(buttonName); - }; - (buttonText = viewSpec.buttonTextOverride) || - (buttonIcon = theme.getIconClass(buttonName, isRtl)) || - (buttonText = viewSpec.buttonTextDefault); - let 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 = () => { - calendarApi[buttonName](); - }; - (buttonText = calendarButtonTextOverrides[buttonName]) || - (buttonIcon = theme.getIconClass(buttonName, isRtl)) || - (buttonText = calendarButtonText[buttonName]); // everything else is considered default - if (buttonName === 'prevYear' || buttonName === 'nextYear') { - let prevOrNext = buttonName === 'prevYear' ? 'prev' : 'next'; - buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] || - calendarButtonHints[prevOrNext], [ - calendarButtonText.year || 'year', - 'year', - ], calendarButtonText[buttonName]); - } - else { - buttonHint = (navUnit) => formatWithOrdinals(calendarButtonHintOverrides[buttonName] || - calendarButtonHints[buttonName], [ - calendarButtonText[navUnit] || navUnit, - navUnit, - ], calendarButtonText[buttonName]); - } - } - return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint }; - }))); - return { widgets, viewsWithButtons, hasTitle }; - } - - // always represents the current view. otherwise, it'd need to change value every time date changes - class ViewImpl { - constructor(type, getCurrentData, dateEnv) { - this.type = type; - this.getCurrentData = getCurrentData; - this.dateEnv = dateEnv; - } - get calendar() { - return this.getCurrentData().calendarApi; - } - get title() { - return this.getCurrentData().viewTitle; - } - get activeStart() { - return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start); - } - get activeEnd() { - return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end); - } - get currentStart() { - return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start); - } - get currentEnd() { - return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end); - } - getOption(name) { - return this.getCurrentData().options[name]; // are the view-specific options - } - } - - let eventSourceDef$2 = { - ignoreRange: true, - parseMeta(refined) { - if (Array.isArray(refined.events)) { - return refined.events; - } - return null; - }, - fetch(arg, successCallback) { - successCallback({ - rawEvents: arg.eventSource.meta, - }); - }, - }; - const arrayEventSourcePlugin = createPlugin({ - name: 'array-event-source', - eventSourceDefs: [eventSourceDef$2], - }); - - let eventSourceDef$1 = { - parseMeta(refined) { - if (typeof refined.events === 'function') { - return refined.events; - } - return null; - }, - fetch(arg, successCallback, errorCallback) { - const { dateEnv } = arg.context; - const func = arg.eventSource.meta; - unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback); - }, - }; - const funcEventSourcePlugin = createPlugin({ - name: 'func-event-source', - eventSourceDefs: [eventSourceDef$1], - }); - - const JSON_FEED_EVENT_SOURCE_REFINERS = { - method: String, - extraParams: identity, - startParam: String, - endParam: String, - timeZoneParam: String, - }; - - let eventSourceDef = { - parseMeta(refined) { - if (refined.url && (refined.format === 'json' || !refined.format)) { - return { - url: refined.url, - format: 'json', - method: (refined.method || 'GET').toUpperCase(), - extraParams: refined.extraParams, - startParam: refined.startParam, - endParam: refined.endParam, - timeZoneParam: refined.timeZoneParam, - }; - } - return null; - }, - fetch(arg, successCallback, errorCallback) { - const { meta } = arg.eventSource; - const requestParams = buildRequestParams(meta, arg.range, arg.context); - requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => { - successCallback({ rawEvents, response }); - }, errorCallback); - }, - }; - const jsonFeedEventSourcePlugin = createPlugin({ - name: 'json-event-source', - eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS, - eventSourceDefs: [eventSourceDef], - }); - function buildRequestParams(meta, range, context) { - let { dateEnv, options } = context; - let startParam; - let endParam; - let timeZoneParam; - let customRequestParams; - let params = {}; - 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; - } - // 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 || {}; - } - Object.assign(params, customRequestParams); - params[startParam] = dateEnv.formatIso(range.start); - params[endParam] = dateEnv.formatIso(range.end); - if (dateEnv.timeZone !== 'local') { - params[timeZoneParam] = dateEnv.timeZone; - } - return params; - } - - const SIMPLE_RECURRING_REFINERS = { - daysOfWeek: identity, - startTime: createDuration, - endTime: createDuration, - duration: createDuration, - startRecur: identity, - endRecur: identity, - }; - - let recurring = { - parse(refined, dateEnv) { - if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) { - let recurringData = { - daysOfWeek: refined.daysOfWeek || null, - startTime: refined.startTime || null, - endTime: refined.endTime || null, - startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null, - endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null, - }; - let duration; - if (refined.duration) { - duration = refined.duration; - } - if (!duration && refined.startTime && refined.endTime) { - duration = subtractDurations(refined.endTime, refined.startTime); - } - return { - allDayGuess: Boolean(!refined.startTime && !refined.endTime), - duration, - typeData: recurringData, // doesn't need endTime anymore but oh well - }; - } - return null; - }, - expand(typeData, framingRange, dateEnv) { - let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur }); - if (clippedFramingRange) { - return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv); - } - return []; - }, - }; - const simpleRecurringEventsPlugin = createPlugin({ - name: 'simple-recurring-event', - recurringTypes: [recurring], - eventRefiners: SIMPLE_RECURRING_REFINERS, - }); - function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) { - let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null; - let dayMarker = startOfDay(framingRange.start); - let endMarker = framingRange.end; - let instanceStarts = []; - while (dayMarker < endMarker) { - let instanceStart; - // if everyday, or this particular day-of-week - if (!dowHash || dowHash[dayMarker.getUTCDay()]) { - if (startTime) { - instanceStart = dateEnv.add(dayMarker, startTime); - } - else { - instanceStart = dayMarker; - } - instanceStarts.push(instanceStart); - } - dayMarker = addDays(dayMarker, 1); - } - return instanceStarts; - } - - const changeHandlerPlugin = createPlugin({ - name: 'change-handler', - optionChangeHandlers: { - events(events, context) { - handleEventSources([events], context); - }, - eventSources: handleEventSources, - }, - }); - /* - BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out - */ - function handleEventSources(inputs, context) { - let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources); - let newInputs = []; - for (let input of inputs) { - let inputFound = false; - for (let i = 0; i < unfoundSources.length; i += 1) { - if (unfoundSources[i]._raw === input) { - unfoundSources.splice(i, 1); // delete - inputFound = true; - break; - } - } - if (!inputFound) { - newInputs.push(input); - } - } - for (let unfoundSource of unfoundSources) { - context.dispatch({ - type: 'REMOVE_EVENT_SOURCE', - sourceId: unfoundSource.sourceId, - }); - } - for (let newInput of newInputs) { - context.calendarApi.addEventSource(newInput); - } - } - - function handleDateProfile(dateProfile, context) { - context.emitter.trigger('datesSet', Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi })); - } - - function handleEventStore(eventStore, context) { - let { emitter } = context; - if (emitter.hasHandlers('eventsSet')) { - emitter.trigger('eventsSet', buildEventApis(eventStore, context)); - } - } - - /* - this array is exposed on the root namespace so that UMD plugins can add to it. - see the rollup-bundles script. - */ - const globalPlugins = [ - arrayEventSourcePlugin, - funcEventSourcePlugin, - jsonFeedEventSourcePlugin, - simpleRecurringEventsPlugin, - changeHandlerPlugin, - createPlugin({ - name: 'misc', - isLoadingFuncs: [ - (state) => computeEventSourcesLoading(state.eventSources), - ], - propSetHandlers: { - dateProfile: handleDateProfile, - eventStore: handleEventStore, - }, - }), - ]; - - class TaskRunner { - constructor(runTaskOption, drainedOption) { - this.runTaskOption = runTaskOption; - this.drainedOption = drainedOption; - this.queue = []; - this.delayedRunner = new DelayedRunner(this.drain.bind(this)); - } - request(task, delay) { - this.queue.push(task); - this.delayedRunner.request(delay); - } - pause(scope) { - this.delayedRunner.pause(scope); - } - resume(scope, force) { - this.delayedRunner.resume(scope, force); - } - drain() { - let { queue } = this; - while (queue.length) { - let completedTasks = []; - let task; - while ((task = queue.shift())) { - this.runTask(task); - completedTasks.push(task); - } - this.drained(completedTasks); - } // keep going, in case new tasks were added in the drained handler - } - runTask(task) { - if (this.runTaskOption) { - this.runTaskOption(task); - } - } - drained(completedTasks) { - if (this.drainedOption) { - this.drainedOption(completedTasks); - } - } - } - - // Computes what the title at the top of the calendarApi should be for this view - function buildTitle(dateProfile, viewOptions, dateEnv) { - let range; - // for views that span a large unit of time, show the proper interval, ignoring stray days before and after - if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) { - range = dateProfile.currentRange; - } - else { // for day units or smaller, use the actual day range - range = dateProfile.activeRange; - } - return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), { - isEndExclusive: dateProfile.isRangeAllDay, - defaultSeparator: viewOptions.titleRangeSeparator, - }); - } - // Generates the format string that should be used to generate the title for the current date range. - // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`. - function buildTitleFormat(dateProfile) { - let { currentRangeUnit } = dateProfile; - if (currentRangeUnit === 'year') { - return { year: 'numeric' }; - } - if (currentRangeUnit === 'month') { - return { year: 'numeric', month: 'long' }; // like "September 2014" - } - let days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end); - if (days !== null && days > 1) { - // multi-day range. shorter, like "Sep 9 - 10 2014" - return { year: 'numeric', month: 'short', day: 'numeric' }; - } - // one day. longer, like "September 9 2014" - return { year: 'numeric', month: 'long', day: 'numeric' }; - } - - // in future refactor, do the redux-style function(state=initial) for initial-state - // also, whatever is happening in constructor, have it happen in action queue too - class CalendarDataManager { - constructor(props) { - this.computeOptionsData = memoize(this._computeOptionsData); - this.computeCurrentViewData = memoize(this._computeCurrentViewData); - this.organizeRawLocales = memoize(organizeRawLocales); - this.buildLocale = memoize(buildLocale); - this.buildPluginHooks = buildBuildPluginHooks(); - this.buildDateEnv = memoize(buildDateEnv$1); - this.buildTheme = memoize(buildTheme); - this.parseToolbars = memoize(parseToolbars); - this.buildViewSpecs = memoize(buildViewSpecs); - this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator); - this.buildViewApi = memoize(buildViewApi); - this.buildViewUiProps = memoizeObjArg(buildViewUiProps); - this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual); - this.buildEventUiBases = memoize(buildEventUiBases); - this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours); - this.buildTitle = memoize(buildTitle); - this.emitter = new Emitter(); - this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this)); - this.currentCalendarOptionsInput = {}; - this.currentCalendarOptionsRefined = {}; - this.currentViewOptionsInput = {}; - this.currentViewOptionsRefined = {}; - this.currentCalendarOptionsRefiners = {}; - this.getCurrentData = () => this.data; - this.dispatch = (action) => { - this.actionRunner.request(action); // protects against recursive calls to _handleAction - }; - this.props = props; - this.actionRunner.pause(); - let dynamicOptionOverrides = {}; - let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); - let currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView; - let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); - // wire things up - // TODO: not DRY - props.calendarApi.currentDataManager = this; - this.emitter.setThisContext(props.calendarApi); - this.emitter.setOptions(currentViewData.options); - let currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv); - let dateProfile = currentViewData.dateProfileGenerator.build(currentDate); - if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) { - currentDate = dateProfile.currentRange.start; - } - let calendarContext = { - dateEnv: optionsData.dateEnv, - options: optionsData.calendarOptions, - pluginHooks: optionsData.pluginHooks, - calendarApi: props.calendarApi, - dispatch: this.dispatch, - emitter: this.emitter, - getCurrentData: this.getCurrentData, - }; - // needs to be after setThisContext - for (let callback of optionsData.pluginHooks.contextInit) { - callback(calendarContext); - } - // NOT DRY - let eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext); - let initialState = { - dynamicOptionOverrides, - currentViewType, - currentDate, - dateProfile, - businessHours: this.parseContextBusinessHours(calendarContext), - eventSources, - eventUiBases: {}, - eventStore: createEmptyEventStore(), - renderableEventStore: createEmptyEventStore(), - dateSelection: null, - eventSelection: '', - eventDrag: null, - eventResize: null, - selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig, - }; - let contextAndState = Object.assign(Object.assign({}, calendarContext), initialState); - for (let reducer of optionsData.pluginHooks.reducers) { - Object.assign(initialState, reducer(null, null, contextAndState)); - } - if (computeIsLoading(initialState, calendarContext)) { - this.emitter.trigger('loading', true); // NOT DRY - } - this.state = initialState; - this.updateData(); - this.actionRunner.resume(); - } - resetOptions(optionOverrides, append) { - let { props } = this; - props.optionOverrides = append - ? Object.assign(Object.assign({}, props.optionOverrides), optionOverrides) : optionOverrides; - this.actionRunner.request({ - type: 'NOTHING', - }); - } - _handleAction(action) { - let { props, state, emitter } = this; - let dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action); - let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); - let currentViewType = reduceViewType(state.currentViewType, action); - let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); - // wire things up - // TODO: not DRY - props.calendarApi.currentDataManager = this; - emitter.setThisContext(props.calendarApi); - emitter.setOptions(currentViewData.options); - let calendarContext = { - dateEnv: optionsData.dateEnv, - options: optionsData.calendarOptions, - pluginHooks: optionsData.pluginHooks, - calendarApi: props.calendarApi, - dispatch: this.dispatch, - emitter, - getCurrentData: this.getCurrentData, - }; - let { currentDate, dateProfile } = state; - if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) { // hack - dateProfile = currentViewData.dateProfileGenerator.build(currentDate); - } - currentDate = reduceCurrentDate(currentDate, action); - dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator); - if (action.type === 'PREV' || // TODO: move this logic into DateProfileGenerator - action.type === 'NEXT' || // " - !rangeContainsMarker(dateProfile.currentRange, currentDate)) { - currentDate = dateProfile.currentRange.start; - } - let eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext); - let eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext); - let isEventsLoading = computeEventSourcesLoading(eventSources); // BAD. also called in this func in computeIsLoading - let renderableEventStore = (isEventsLoading && !currentViewData.options.progressiveEventRendering) ? - (state.renderableEventStore || eventStore) : // try from previous state - eventStore; - let { eventUiSingleBase, selectionConfig } = this.buildViewUiProps(calendarContext); // will memoize obj - let eventUiBySource = this.buildEventUiBySource(eventSources); - let eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource); - let newState = { - dynamicOptionOverrides, - currentViewType, - currentDate, - dateProfile, - eventSources, - eventStore, - renderableEventStore, - selectionConfig, - eventUiBases, - businessHours: this.parseContextBusinessHours(calendarContext), - dateSelection: reduceDateSelection(state.dateSelection, action), - eventSelection: reduceSelectedEvent(state.eventSelection, action), - eventDrag: reduceEventDrag(state.eventDrag, action), - eventResize: reduceEventResize(state.eventResize, action), - }; - let contextAndState = Object.assign(Object.assign({}, calendarContext), newState); - for (let reducer of optionsData.pluginHooks.reducers) { - Object.assign(newState, reducer(state, action, contextAndState)); // give the OLD state, for old value - } - let wasLoading = computeIsLoading(state, calendarContext); - let isLoading = computeIsLoading(newState, calendarContext); - // TODO: use propSetHandlers in plugin system - if (!wasLoading && isLoading) { - emitter.trigger('loading', true); - } - else if (wasLoading && !isLoading) { - emitter.trigger('loading', false); - } - this.state = newState; - if (props.onAction) { - props.onAction(action); - } - } - updateData() { - let { props, state } = this; - let oldData = this.data; - let optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi); - let currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides); - let data = this.data = Object.assign(Object.assign(Object.assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state); - let changeHandlers = optionsData.pluginHooks.optionChangeHandlers; - let oldCalendarOptions = oldData && oldData.calendarOptions; - let newCalendarOptions = optionsData.calendarOptions; - if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) { - if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) { - // hack - state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data); - state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv); - } - for (let optionName in changeHandlers) { - if (oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) { - changeHandlers[optionName](newCalendarOptions[optionName], data); - } - } - } - if (props.onData) { - props.onData(data); - } - } - _computeOptionsData(optionOverrides, dynamicOptionOverrides, calendarApi) { - // TODO: blacklist options that are handled by optionChangeHandlers - let { refinedOptions, pluginHooks, localeDefaults, availableLocaleData, extra, } = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides); - warnUnknownOptions(extra); - let dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator); - let viewSpecs = this.buildViewSpecs(pluginHooks.views, optionOverrides, dynamicOptionOverrides, localeDefaults); - let theme = this.buildTheme(refinedOptions, pluginHooks); - let toolbarConfig = this.parseToolbars(refinedOptions, optionOverrides, theme, viewSpecs, calendarApi); - return { - calendarOptions: refinedOptions, - pluginHooks, - dateEnv, - viewSpecs, - theme, - toolbarConfig, - localeDefaults, - availableRawLocales: availableLocaleData.map, - }; - } - // always called from behind a memoizer - processRawCalendarOptions(optionOverrides, dynamicOptionOverrides) { - let { locales, locale } = mergeRawOptions([ - BASE_OPTION_DEFAULTS, - optionOverrides, - dynamicOptionOverrides, - ]); - let availableLocaleData = this.organizeRawLocales(locales); - let availableRawLocales = availableLocaleData.map; - let localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options; - let pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins); - let refiners = this.currentCalendarOptionsRefiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); - let extra = {}; - let raw = mergeRawOptions([ - BASE_OPTION_DEFAULTS, - localeDefaults, - optionOverrides, - dynamicOptionOverrides, - ]); - let refined = {}; - let currentRaw = this.currentCalendarOptionsInput; - let currentRefined = this.currentCalendarOptionsRefined; - let anyChanges = false; - for (let optionName in raw) { - if (optionName !== 'plugins') { // because plugins is special-cased - if (raw[optionName] === currentRaw[optionName] || - (COMPLEX_OPTION_COMPARATORS[optionName] && - (optionName in currentRaw) && - COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]))) { - refined[optionName] = currentRefined[optionName]; - } - else if (refiners[optionName]) { - refined[optionName] = refiners[optionName](raw[optionName]); - anyChanges = true; - } - else { - extra[optionName] = currentRaw[optionName]; - } - } - } - if (anyChanges) { - this.currentCalendarOptionsInput = raw; - this.currentCalendarOptionsRefined = refined; - } - return { - rawOptions: this.currentCalendarOptionsInput, - refinedOptions: this.currentCalendarOptionsRefined, - pluginHooks, - availableLocaleData, - localeDefaults, - extra, - }; - } - _computeCurrentViewData(viewType, optionsData, optionOverrides, dynamicOptionOverrides) { - let viewSpec = optionsData.viewSpecs[viewType]; - if (!viewSpec) { - throw new Error(`viewType "${viewType}" is not available. Please make sure you've loaded all neccessary plugins`); - } - let { refinedOptions, extra } = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides); - warnUnknownOptions(extra); - let dateProfileGenerator = this.buildDateProfileGenerator({ - dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass, - duration: viewSpec.duration, - durationUnit: viewSpec.durationUnit, - usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime, - dateEnv: optionsData.dateEnv, - calendarApi: this.props.calendarApi, - slotMinTime: refinedOptions.slotMinTime, - slotMaxTime: refinedOptions.slotMaxTime, - showNonCurrentDates: refinedOptions.showNonCurrentDates, - dayCount: refinedOptions.dayCount, - dateAlignment: refinedOptions.dateAlignment, - dateIncrement: refinedOptions.dateIncrement, - hiddenDays: refinedOptions.hiddenDays, - weekends: refinedOptions.weekends, - nowInput: refinedOptions.now, - validRangeInput: refinedOptions.validRange, - visibleRangeInput: refinedOptions.visibleRange, - monthMode: refinedOptions.monthMode, - fixedWeekCount: refinedOptions.fixedWeekCount, - }); - let viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv); - return { viewSpec, options: refinedOptions, dateProfileGenerator, viewApi }; - } - processRawViewOptions(viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) { - let raw = mergeRawOptions([ - BASE_OPTION_DEFAULTS, - viewSpec.optionDefaults, - localeDefaults, - optionOverrides, - viewSpec.optionOverrides, - dynamicOptionOverrides, - ]); - let refiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); - let refined = {}; - let currentRaw = this.currentViewOptionsInput; - let currentRefined = this.currentViewOptionsRefined; - let anyChanges = false; - let extra = {}; - for (let optionName in raw) { - if (raw[optionName] === currentRaw[optionName] || - (COMPLEX_OPTION_COMPARATORS[optionName] && - COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], currentRaw[optionName]))) { - refined[optionName] = currentRefined[optionName]; - } - else { - if (raw[optionName] === this.currentCalendarOptionsInput[optionName] || - (COMPLEX_OPTION_COMPARATORS[optionName] && - COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], this.currentCalendarOptionsInput[optionName]))) { - if (optionName in this.currentCalendarOptionsRefined) { // might be an "extra" prop - refined[optionName] = this.currentCalendarOptionsRefined[optionName]; - } - } - else if (refiners[optionName]) { - refined[optionName] = refiners[optionName](raw[optionName]); - } - else { - extra[optionName] = raw[optionName]; - } - anyChanges = true; - } - } - if (anyChanges) { - this.currentViewOptionsInput = raw; - this.currentViewOptionsRefined = refined; - } - return { - rawOptions: this.currentViewOptionsInput, - refinedOptions: this.currentViewOptionsRefined, - extra, - }; - } - } - function buildDateEnv$1(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) { - let locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map); - return new DateEnv({ - calendarSystem: 'gregory', - timeZone, - namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl, - locale, - weekNumberCalculation, - firstDay, - weekText, - cmdFormatter: pluginHooks.cmdFormatter, - defaultSeparator, - }); - } - function buildTheme(options, pluginHooks) { - let ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme; - return new ThemeClass(options); - } - function buildDateProfileGenerator(props) { - let DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator; - return new DateProfileGeneratorClass(props); - } - function buildViewApi(type, getCurrentData, dateEnv) { - return new ViewImpl(type, getCurrentData, dateEnv); - } - function buildEventUiBySource(eventSources) { - return mapHash(eventSources, (eventSource) => eventSource.ui); - } - function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) { - let eventUiBases = { '': eventUiSingleBase }; - for (let defId in eventDefs) { - let def = eventDefs[defId]; - if (def.sourceId && eventUiBySource[def.sourceId]) { - eventUiBases[defId] = eventUiBySource[def.sourceId]; - } - } - return eventUiBases; - } - function buildViewUiProps(calendarContext) { - let { options } = calendarContext; - return { - eventUiSingleBase: createEventUi({ - display: options.eventDisplay, - editable: options.editable, - startEditable: options.eventStartEditable, - durationEditable: options.eventDurationEditable, - constraint: options.eventConstraint, - overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined, - allow: options.eventAllow, - backgroundColor: options.eventBackgroundColor, - borderColor: options.eventBorderColor, - textColor: options.eventTextColor, - color: options.eventColor, - // classNames: options.eventClassNames // render hook will handle this - }, calendarContext), - selectionConfig: createEventUi({ - constraint: options.selectConstraint, - overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined, - allow: options.selectAllow, - }, calendarContext), - }; - } - function computeIsLoading(state, context) { - for (let isLoadingFunc of context.pluginHooks.isLoadingFuncs) { - if (isLoadingFunc(state)) { - return true; - } - } - return false; - } - function parseContextBusinessHours(calendarContext) { - return parseBusinessHours(calendarContext.options.businessHours, calendarContext); - } - function warnUnknownOptions(options, viewName) { - for (let optionName in options) { - console.warn(`Unknown option '${optionName}'` + - (viewName ? ` for view '${viewName}'` : '')); - } - } - - class ToolbarSection extends BaseComponent { - render() { - let children = this.props.widgetGroups.map((widgetGroup) => this.renderWidgetGroup(widgetGroup)); - return h('div', { className: 'fc-toolbar-chunk' }, ...children); - } - renderWidgetGroup(widgetGroup) { - let { props } = this; - let { theme } = this.context; - let children = []; - let isOnlyButtons = true; - for (let widget of widgetGroup) { - let { buttonName, buttonClick, buttonText, buttonIcon, buttonHint } = widget; - if (buttonName === 'title') { - isOnlyButtons = false; - children.push(h("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); - } - else { - let isPressed = buttonName === props.activeButton; - let isDisabled = (!props.isTodayEnabled && buttonName === 'today') || - (!props.isPrevEnabled && buttonName === 'prev') || - (!props.isNextEnabled && buttonName === 'next'); - let buttonClasses = [`fc-${buttonName}-button`, theme.getClass('button')]; - if (isPressed) { - buttonClasses.push(theme.getClass('buttonActive')); - } - children.push(h("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? h("span", { className: buttonIcon }) : ''))); - } - } - if (children.length > 1) { - let groupClassName = (isOnlyButtons && theme.getClass('buttonGroup')) || ''; - return h('div', { className: groupClassName }, ...children); - } - return children[0]; - } - } - - class Toolbar extends BaseComponent { - render() { - let { model, extraClassName } = this.props; - let forceLtr = false; - let startContent; - let endContent; - let sectionWidgets = model.sectionWidgets; - let centerContent = sectionWidgets.center; - if (sectionWidgets.left) { - forceLtr = true; - startContent = sectionWidgets.left; - } - else { - startContent = sectionWidgets.start; - } - if (sectionWidgets.right) { - forceLtr = true; - endContent = sectionWidgets.right; - } - else { - endContent = sectionWidgets.end; - } - let classNames = [ - extraClassName || '', - 'fc-toolbar', - forceLtr ? 'fc-toolbar-ltr' : '', - ]; - return (h("div", { className: classNames.join(' ') }, - this.renderSection('start', startContent || []), - this.renderSection('center', centerContent || []), - this.renderSection('end', endContent || []))); - } - renderSection(key, widgetGroups) { - let { props } = this; - return (h(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 })); - } - } - - // TODO: do function component? - class ViewContainer extends BaseComponent { - constructor() { - super(...arguments); - this.state = { - availableWidth: null, - }; - this.handleEl = (el) => { - this.el = el; - setRef(this.props.elRef, el); - this.updateAvailableWidth(); - }; - this.handleResize = () => { - this.updateAvailableWidth(); - }; - } - render() { - let { props, state } = this; - let { aspectRatio } = props; - let classNames = [ - 'fc-view-harness', - (aspectRatio || props.liquid || props.height) - ? 'fc-view-harness-active' // harness controls the height - : 'fc-view-harness-passive', // let the view do the height - ]; - let height = ''; - let paddingBottom = ''; - if (aspectRatio) { - if (state.availableWidth !== null) { - height = state.availableWidth / aspectRatio; - } - else { - // while waiting to know availableWidth, we can't set height to *zero* - // because will cause lots of unnecessary scrollbars within scrollgrid. - // BETTER: don't start rendering ANYTHING yet until we know container width - // NOTE: why not always use paddingBottom? Causes height oscillation (issue 5606) - paddingBottom = `${(1 / aspectRatio) * 100}%`; - } - } - else { - height = props.height || ''; - } - return (h("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height, paddingBottom } }, props.children)); - } - componentDidMount() { - this.context.addResizeHandler(this.handleResize); - } - componentWillUnmount() { - this.context.removeResizeHandler(this.handleResize); - } - updateAvailableWidth() { - if (this.el && // needed. but why? - this.props.aspectRatio // aspectRatio is the only height setting that needs availableWidth - ) { - this.setState({ availableWidth: this.el.offsetWidth }); - } - } - } - - /* - Detects when the user clicks on an event within a DateComponent - */ - class EventClicking extends Interaction { - constructor(settings) { - super(settings); - this.handleSegClick = (ev, segEl) => { - let { component } = this; - let { context } = component; - let seg = getElSeg(segEl); - if (seg && // might be the
surrounding the more link - component.isValidSegDownEl(ev.target)) { - // our way to simulate a link click for elements that can't be tags - // grab before trigger fired in case trigger trashes DOM thru rerendering - let hasUrlContainer = elementClosest(ev.target, '.fc-event-forced-url'); - let url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : ''; - context.emitter.trigger('eventClick', { - el: segEl, - event: new EventImpl(component.context, seg.eventRange.def, seg.eventRange.instance), - jsEvent: ev, - view: context.viewApi, - }); - if (url && !ev.defaultPrevented) { - window.location.href = url; - } - } - }; - this.destroy = listenBySelector(settings.el, 'click', '.fc-event', // on both fg and bg events - this.handleSegClick); - } - } - - /* - Triggers events and adds/removes core classNames when the user's pointer - enters/leaves event-elements of a component. - */ - class EventHovering extends Interaction { - constructor(settings) { - super(settings); - // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it - this.handleEventElRemove = (el) => { - if (el === this.currentSegEl) { - this.handleSegLeave(null, this.currentSegEl); - } - }; - this.handleSegEnter = (ev, segEl) => { - if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper - this.currentSegEl = segEl; - this.triggerEvent('eventMouseEnter', ev, segEl); - } - }; - this.handleSegLeave = (ev, segEl) => { - if (this.currentSegEl) { - this.currentSegEl = null; - this.triggerEvent('eventMouseLeave', ev, segEl); - } - }; - this.removeHoverListeners = listenToHoverBySelector(settings.el, '.fc-event', // on both fg and bg events - this.handleSegEnter, this.handleSegLeave); - } - destroy() { - this.removeHoverListeners(); - } - triggerEvent(publicEvName, ev, segEl) { - let { component } = this; - let { context } = component; - let seg = getElSeg(segEl); - if (!ev || component.isValidSegDownEl(ev.target)) { - context.emitter.trigger(publicEvName, { - el: segEl, - event: new EventImpl(context, seg.eventRange.def, seg.eventRange.instance), - jsEvent: ev, - view: context.viewApi, - }); - } - } - } - - class CalendarContent extends PureComponent { - constructor() { - super(...arguments); - this.buildViewContext = memoize(buildViewContext); - this.buildViewPropTransformers = memoize(buildViewPropTransformers); - this.buildToolbarProps = memoize(buildToolbarProps); - this.headerRef = y(); - this.footerRef = y(); - this.interactionsStore = {}; - // eslint-disable-next-line - this.state = { - viewLabelId: getUniqueDomId(), - }; - // Component Registration - // ----------------------------------------------------------------------------------------------------------------- - this.registerInteractiveComponent = (component, settingsInput) => { - let settings = parseInteractionSettings(component, settingsInput); - let DEFAULT_INTERACTIONS = [ - EventClicking, - EventHovering, - ]; - let interactionClasses = DEFAULT_INTERACTIONS.concat(this.props.pluginHooks.componentInteractions); - let interactions = interactionClasses.map((TheInteractionClass) => new TheInteractionClass(settings)); - this.interactionsStore[component.uid] = interactions; - interactionSettingsStore[component.uid] = settings; - }; - this.unregisterInteractiveComponent = (component) => { - let listeners = this.interactionsStore[component.uid]; - if (listeners) { - for (let listener of listeners) { - listener.destroy(); - } - delete this.interactionsStore[component.uid]; - } - delete interactionSettingsStore[component.uid]; - }; - // Resizing - // ----------------------------------------------------------------------------------------------------------------- - this.resizeRunner = new DelayedRunner(() => { - this.props.emitter.trigger('_resize', true); // should window resizes be considered "forced" ? - this.props.emitter.trigger('windowResize', { view: this.props.viewApi }); - }); - this.handleWindowResize = (ev) => { - let { options } = this.props; - if (options.handleWindowResize && - ev.target === window // avoid jqui events - ) { - this.resizeRunner.request(options.windowResizeDelay); - } - }; - } - /* - renders INSIDE of an outer div - */ - render() { - let { props } = this; - let { toolbarConfig, options } = props; - let toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, getNow(props.options.now, props.dateEnv), // TODO: use NowTimer???? - props.viewTitle); - let viewVGrow = false; - let viewHeight = ''; - let viewAspectRatio; - if (props.isHeightAuto || props.forPrint) { - viewHeight = ''; - } - else if (options.height != null) { - viewVGrow = true; - } - else if (options.contentHeight != null) { - viewHeight = options.contentHeight; - } - else { - viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall - } - let viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent); - let viewLabelId = (toolbarConfig.header && toolbarConfig.header.hasTitle) - ? this.state.viewLabelId - : ''; - return (h(ViewContextType.Provider, { value: viewContext }, - toolbarConfig.header && (h(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))), - h(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, - this.renderView(props), - this.buildAppendContent()), - toolbarConfig.footer && (h(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))))); - } - componentDidMount() { - let { props } = this; - this.calendarInteractions = props.pluginHooks.calendarInteractions - .map((CalendarInteractionClass) => new CalendarInteractionClass(props)); - window.addEventListener('resize', this.handleWindowResize); - let { propSetHandlers } = props.pluginHooks; - for (let propName in propSetHandlers) { - propSetHandlers[propName](props[propName], props); - } - } - componentDidUpdate(prevProps) { - let { props } = this; - let { propSetHandlers } = props.pluginHooks; - for (let propName in propSetHandlers) { - if (props[propName] !== prevProps[propName]) { - propSetHandlers[propName](props[propName], props); - } - } - } - componentWillUnmount() { - window.removeEventListener('resize', this.handleWindowResize); - this.resizeRunner.clear(); - for (let interaction of this.calendarInteractions) { - interaction.destroy(); - } - this.props.emitter.trigger('_unmount'); - } - buildAppendContent() { - let { props } = this; - let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props)); - return h(p, {}, ...children); - } - renderView(props) { - let { pluginHooks } = props; - let { viewSpec } = props; - let viewProps = { - dateProfile: props.dateProfile, - businessHours: props.businessHours, - eventStore: props.renderableEventStore, - eventUiBases: props.eventUiBases, - dateSelection: props.dateSelection, - eventSelection: props.eventSelection, - eventDrag: props.eventDrag, - eventResize: props.eventResize, - isHeightAuto: props.isHeightAuto, - forPrint: props.forPrint, - }; - let transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers); - for (let transformer of transformers) { - Object.assign(viewProps, transformer.transform(viewProps, props)); - } - let ViewComponent = viewSpec.component; - return (h(ViewComponent, Object.assign({}, viewProps))); - } - } - function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) { - // don't force any date-profiles to valid date profiles (the `false`) so that we can tell if it's invalid - let todayInfo = dateProfileGenerator.build(now, undefined, false); // TODO: need `undefined` or else INFINITE LOOP for some reason - let prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false); - let nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false); - return { - title, - activeButton: viewSpec.type, - navUnit: viewSpec.singleUnit, - isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now), - isPrevEnabled: prevInfo.isValid, - isNextEnabled: nextInfo.isValid, - }; - } - // Plugin - // ----------------------------------------------------------------------------------------------------------------- - function buildViewPropTransformers(theClasses) { - return theClasses.map((TheClass) => new TheClass()); - } - - class Calendar extends CalendarImpl { - constructor(el, optionOverrides = {}) { - super(); - this.isRendering = false; - this.isRendered = false; - this.currentClassNames = []; - this.customContentRenderId = 0; - this.handleAction = (action) => { - // actions we know we want to render immediately - switch (action.type) { - case 'SET_EVENT_DRAG': - case 'SET_EVENT_RESIZE': - this.renderRunner.tryDrain(); - } - }; - this.handleData = (data) => { - this.currentData = data; - this.renderRunner.request(data.calendarOptions.rerenderDelay); - }; - this.handleRenderRequest = () => { - if (this.isRendering) { - this.isRendered = true; - let { currentData } = this; - flushSync(() => { - P$1(h(CalendarRoot, { options: currentData.calendarOptions, theme: currentData.theme, emitter: currentData.emitter }, (classNames, height, isHeightAuto, forPrint) => { - this.setClassNames(classNames); - this.setHeight(height); - return (h(RenderId.Provider, { value: this.customContentRenderId }, - h(CalendarContent, Object.assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData)))); - }), this.el); - }); - } - else if (this.isRendered) { - this.isRendered = false; - P$1(null, this.el); - this.setClassNames([]); - this.setHeight(''); - } - }; - this.el = el; - this.renderRunner = new DelayedRunner(this.handleRenderRequest); - new CalendarDataManager({ - optionOverrides, - calendarApi: this, - onAction: this.handleAction, - onData: this.handleData, - }); - } - render() { - let wasRendering = this.isRendering; - if (!wasRendering) { - this.isRendering = true; - } - else { - this.customContentRenderId += 1; - } - this.renderRunner.request(); - if (wasRendering) { - this.updateSize(); - } - } - destroy() { - if (this.isRendering) { - this.isRendering = false; - this.renderRunner.request(); - } - } - updateSize() { - flushSync(() => { - super.updateSize(); - }); - } - batchRendering(func) { - this.renderRunner.pause('batchRendering'); - func(); - this.renderRunner.resume('batchRendering'); - } - pauseRendering() { - this.renderRunner.pause('pauseRendering'); - } - resumeRendering() { - this.renderRunner.resume('pauseRendering', true); - } - resetOptions(optionOverrides, append) { - this.currentDataManager.resetOptions(optionOverrides, append); - } - setClassNames(classNames) { - if (!isArraysEqual(classNames, this.currentClassNames)) { - let { classList } = this.el; - for (let className of this.currentClassNames) { - classList.remove(className); - } - for (let className of classNames) { - classList.add(className); - } - this.currentClassNames = classNames; - } - } - setHeight(height) { - applyStyleProp(this.el, 'height', height); - } - } - - function formatDate(dateInput, options = {}) { - let dateEnv = buildDateEnv(options); - let formatter = createFormatter(options); - let dateMeta = dateEnv.createMarkerMeta(dateInput); - if (!dateMeta) { // TODO: warning? - return ''; - } - return dateEnv.format(dateMeta.marker, formatter, { - forcedTzo: dateMeta.forcedTzo, - }); - } - function formatRange(startInput, endInput, options) { - let dateEnv = buildDateEnv(typeof options === 'object' && options ? options : {}); // pass in if non-null object - let formatter = createFormatter(options); - let startMeta = dateEnv.createMarkerMeta(startInput); - let endMeta = dateEnv.createMarkerMeta(endInput); - if (!startMeta || !endMeta) { // TODO: warning? - return ''; - } - return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, { - forcedStartTzo: startMeta.forcedTzo, - forcedEndTzo: endMeta.forcedTzo, - isEndExclusive: options.isEndExclusive, - defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator, - }); - } - // TODO: more DRY and optimized - function buildDateEnv(settings) { - let locale = buildLocale(settings.locale || 'en', organizeRawLocales([]).map); // TODO: don't hardcode 'en' everywhere - return new DateEnv(Object.assign(Object.assign({ timeZone: BASE_OPTION_DEFAULTS.timeZone, calendarSystem: 'gregory' }, settings), { locale })); - } - - // HELPERS - /* - if nextDayThreshold is specified, slicing is done in an all-day fashion. - you can get nextDayThreshold from context.nextDayThreshold - */ - function sliceEvents(props, allDay) { - return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg; - } - - const version = '6.0.1'; - - config.touchMouseIgnoreWait = 500; - let ignoreMouseDepth = 0; - let listenerCnt = 0; - let isWindowTouchMoveCancelled = false; - /* - Uses a "pointer" abstraction, which monitors UI events for both mouse and touch. - Tracks when the pointer "drags" on a certain element, meaning down+move+up. - - Also, tracks if there was touch-scrolling. - Also, can prevent touch-scrolling from happening. - Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement. - - emits: - - pointerdown - - pointermove - - pointerup - */ - class PointerDragging { - constructor(containerEl) { - this.subjectEl = null; - // options that can be directly assigned by caller - this.selector = ''; // will cause subjectEl in all emitted events to be this element - this.handleSelector = ''; - this.shouldIgnoreMove = false; - this.shouldWatchScroll = true; // for simulating pointermove on scroll - // internal states - this.isDragging = false; - this.isTouchDragging = false; - this.wasTouchScroll = false; - // Mouse - // ---------------------------------------------------------------------------------------------------- - this.handleMouseDown = (ev) => { - if (!this.shouldIgnoreMouse() && - isPrimaryMouseButton(ev) && - this.tryStart(ev)) { - let pev = this.createEventFromMouse(ev, true); - this.emitter.trigger('pointerdown', pev); - this.initScrollWatch(pev); - if (!this.shouldIgnoreMove) { - document.addEventListener('mousemove', this.handleMouseMove); - } - document.addEventListener('mouseup', this.handleMouseUp); - } - }; - this.handleMouseMove = (ev) => { - let pev = this.createEventFromMouse(ev); - this.recordCoords(pev); - this.emitter.trigger('pointermove', pev); - }; - this.handleMouseUp = (ev) => { - document.removeEventListener('mousemove', this.handleMouseMove); - document.removeEventListener('mouseup', this.handleMouseUp); - this.emitter.trigger('pointerup', this.createEventFromMouse(ev)); - this.cleanup(); // call last so that pointerup has access to props - }; - // Touch - // ---------------------------------------------------------------------------------------------------- - this.handleTouchStart = (ev) => { - if (this.tryStart(ev)) { - this.isTouchDragging = true; - let pev = this.createEventFromTouch(ev, true); - this.emitter.trigger('pointerdown', pev); - this.initScrollWatch(pev); - // unlike mouse, need to attach to target, not document - // https://stackoverflow.com/a/45760014 - let targetEl = ev.target; - if (!this.shouldIgnoreMove) { - targetEl.addEventListener('touchmove', this.handleTouchMove); - } - targetEl.addEventListener('touchend', this.handleTouchEnd); - targetEl.addEventListener('touchcancel', this.handleTouchEnd); // treat it as a touch end - // attach a handler to get called when ANY scroll action happens on the page. - // this was impossible to do with normal on/off because 'scroll' doesn't bubble. - // http://stackoverflow.com/a/32954565/96342 - window.addEventListener('scroll', this.handleTouchScroll, true); - } - }; - this.handleTouchMove = (ev) => { - let pev = this.createEventFromTouch(ev); - this.recordCoords(pev); - this.emitter.trigger('pointermove', pev); - }; - this.handleTouchEnd = (ev) => { - if (this.isDragging) { // done to guard against touchend followed by touchcancel - let targetEl = ev.target; - targetEl.removeEventListener('touchmove', this.handleTouchMove); - targetEl.removeEventListener('touchend', this.handleTouchEnd); - targetEl.removeEventListener('touchcancel', this.handleTouchEnd); - window.removeEventListener('scroll', this.handleTouchScroll, true); // useCaptured=true - this.emitter.trigger('pointerup', this.createEventFromTouch(ev)); - this.cleanup(); // call last so that pointerup has access to props - this.isTouchDragging = false; - startIgnoringMouse(); - } - }; - this.handleTouchScroll = () => { - this.wasTouchScroll = true; - }; - this.handleScroll = (ev) => { - if (!this.shouldIgnoreMove) { - let pageX = (window.pageXOffset - this.prevScrollX) + this.prevPageX; - let pageY = (window.pageYOffset - this.prevScrollY) + this.prevPageY; - this.emitter.trigger('pointermove', { - origEvent: ev, - isTouch: this.isTouchDragging, - subjectEl: this.subjectEl, - pageX, - pageY, - deltaX: pageX - this.origPageX, - deltaY: pageY - this.origPageY, - }); - } - }; - this.containerEl = containerEl; - this.emitter = new Emitter(); - containerEl.addEventListener('mousedown', this.handleMouseDown); - containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true }); - listenerCreated(); - } - destroy() { - this.containerEl.removeEventListener('mousedown', this.handleMouseDown); - this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true }); - listenerDestroyed(); - } - tryStart(ev) { - let subjectEl = this.querySubjectEl(ev); - let downEl = ev.target; - if (subjectEl && - (!this.handleSelector || elementClosest(downEl, this.handleSelector))) { - this.subjectEl = subjectEl; - this.isDragging = true; // do this first so cancelTouchScroll will work - this.wasTouchScroll = false; - return true; - } - return false; - } - cleanup() { - isWindowTouchMoveCancelled = false; - this.isDragging = false; - this.subjectEl = null; - // keep wasTouchScroll around for later access - this.destroyScrollWatch(); - } - querySubjectEl(ev) { - if (this.selector) { - return elementClosest(ev.target, this.selector); - } - return this.containerEl; - } - shouldIgnoreMouse() { - return ignoreMouseDepth || this.isTouchDragging; - } - // can be called by user of this class, to cancel touch-based scrolling for the current drag - cancelTouchScroll() { - if (this.isDragging) { - isWindowTouchMoveCancelled = true; - } - } - // Scrolling that simulates pointermoves - // ---------------------------------------------------------------------------------------------------- - initScrollWatch(ev) { - if (this.shouldWatchScroll) { - this.recordCoords(ev); - window.addEventListener('scroll', this.handleScroll, true); // useCapture=true - } - } - recordCoords(ev) { - if (this.shouldWatchScroll) { - this.prevPageX = ev.pageX; - this.prevPageY = ev.pageY; - this.prevScrollX = window.pageXOffset; - this.prevScrollY = window.pageYOffset; - } - } - destroyScrollWatch() { - if (this.shouldWatchScroll) { - window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true - } - } - // Event Normalization - // ---------------------------------------------------------------------------------------------------- - createEventFromMouse(ev, isFirst) { - let deltaX = 0; - let deltaY = 0; - // TODO: repeat code - if (isFirst) { - this.origPageX = ev.pageX; - this.origPageY = ev.pageY; - } - else { - deltaX = ev.pageX - this.origPageX; - deltaY = ev.pageY - this.origPageY; - } - return { - origEvent: ev, - isTouch: false, - subjectEl: this.subjectEl, - pageX: ev.pageX, - pageY: ev.pageY, - deltaX, - deltaY, - }; - } - createEventFromTouch(ev, isFirst) { - let touches = ev.touches; - let pageX; - let pageY; - let deltaX = 0; - let deltaY = 0; - // if touch coords available, prefer, - // because FF would give bad ev.pageX ev.pageY - if (touches && touches.length) { - pageX = touches[0].pageX; - pageY = touches[0].pageY; - } - else { - pageX = ev.pageX; - pageY = ev.pageY; - } - // TODO: repeat code - if (isFirst) { - this.origPageX = pageX; - this.origPageY = pageY; - } - else { - deltaX = pageX - this.origPageX; - deltaY = pageY - this.origPageY; - } - return { - origEvent: ev, - isTouch: true, - subjectEl: this.subjectEl, - pageX, - pageY, - deltaX, - deltaY, - }; - } - } - // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) - function isPrimaryMouseButton(ev) { - return ev.button === 0 && !ev.ctrlKey; - } - // Ignoring fake mouse events generated by touch - // ---------------------------------------------------------------------------------------------------- - function startIgnoringMouse() { - ignoreMouseDepth += 1; - setTimeout(() => { - ignoreMouseDepth -= 1; - }, config.touchMouseIgnoreWait); - } - // We want to attach touchmove as early as possible for Safari - // ---------------------------------------------------------------------------------------------------- - function listenerCreated() { - listenerCnt += 1; - if (listenerCnt === 1) { - window.addEventListener('touchmove', onWindowTouchMove, { passive: false }); - } - } - function listenerDestroyed() { - listenerCnt -= 1; - if (!listenerCnt) { - window.removeEventListener('touchmove', onWindowTouchMove, { passive: false }); - } - } - function onWindowTouchMove(ev) { - if (isWindowTouchMoveCancelled) { - ev.preventDefault(); - } - } - - /* - An effect in which an element follows the movement of a pointer across the screen. - The moving element is a clone of some other element. - Must call start + handleMove + stop. - */ - class ElementMirror { - constructor() { - this.isVisible = false; // must be explicitly enabled - this.sourceEl = null; - this.mirrorEl = null; - this.sourceElRect = null; // screen coords relative to viewport - // options that can be set directly by caller - this.parentNode = document.body; // HIGHLY SUGGESTED to set this to sidestep ShadowDOM issues - this.zIndex = 9999; - this.revertDuration = 0; - } - start(sourceEl, pageX, pageY) { - this.sourceEl = sourceEl; - this.sourceElRect = this.sourceEl.getBoundingClientRect(); - this.origScreenX = pageX - window.pageXOffset; - this.origScreenY = pageY - window.pageYOffset; - this.deltaX = 0; - this.deltaY = 0; - this.updateElPosition(); - } - handleMove(pageX, pageY) { - this.deltaX = (pageX - window.pageXOffset) - this.origScreenX; - this.deltaY = (pageY - window.pageYOffset) - this.origScreenY; - this.updateElPosition(); - } - // can be called before start - setIsVisible(bool) { - if (bool) { - if (!this.isVisible) { - if (this.mirrorEl) { - this.mirrorEl.style.display = ''; - } - this.isVisible = bool; // needs to happen before updateElPosition - this.updateElPosition(); // because was not updating the position while invisible - } - } - else if (this.isVisible) { - if (this.mirrorEl) { - this.mirrorEl.style.display = 'none'; - } - this.isVisible = bool; - } - } - // always async - stop(needsRevertAnimation, callback) { - let done = () => { - this.cleanup(); - callback(); - }; - if (needsRevertAnimation && - this.mirrorEl && - this.isVisible && - this.revertDuration && // if 0, transition won't work - (this.deltaX || this.deltaY) // if same coords, transition won't work - ) { - this.doRevertAnimation(done, this.revertDuration); - } - else { - setTimeout(done, 0); - } - } - doRevertAnimation(callback, revertDuration) { - let mirrorEl = this.mirrorEl; - let finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened - mirrorEl.style.transition = - 'top ' + revertDuration + 'ms,' + - 'left ' + revertDuration + 'ms'; - applyStyle(mirrorEl, { - left: finalSourceElRect.left, - top: finalSourceElRect.top, - }); - whenTransitionDone(mirrorEl, () => { - mirrorEl.style.transition = ''; - callback(); - }); - } - cleanup() { - if (this.mirrorEl) { - removeElement(this.mirrorEl); - this.mirrorEl = null; - } - this.sourceEl = null; - } - updateElPosition() { - if (this.sourceEl && this.isVisible) { - applyStyle(this.getMirrorEl(), { - left: this.sourceElRect.left + this.deltaX, - top: this.sourceElRect.top + this.deltaY, - }); - } - } - getMirrorEl() { - let sourceElRect = this.sourceElRect; - let mirrorEl = this.mirrorEl; - if (!mirrorEl) { - mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true - // we don't want long taps or any mouse interaction causing selection/menus. - // would use preventSelection(), but that prevents selectstart, causing problems. - mirrorEl.classList.add('fc-unselectable'); - mirrorEl.classList.add('fc-event-dragging'); - applyStyle(mirrorEl, { - position: 'fixed', - zIndex: this.zIndex, - visibility: '', - boxSizing: 'border-box', - width: sourceElRect.right - sourceElRect.left, - height: sourceElRect.bottom - sourceElRect.top, - right: 'auto', - bottom: 'auto', - margin: 0, - }); - this.parentNode.appendChild(mirrorEl); - } - return mirrorEl; - } - } - - /* - Is a cache for a given element's scroll information (all the info that ScrollController stores) - in addition the "client rectangle" of the element.. the area within the scrollbars. - - The cache can be in one of two modes: - - doesListening:false - ignores when the container is scrolled by someone else - - doesListening:true - watch for scrolling and update the cache - */ - class ScrollGeomCache extends ScrollController { - constructor(scrollController, doesListening) { - super(); - this.handleScroll = () => { - this.scrollTop = this.scrollController.getScrollTop(); - this.scrollLeft = this.scrollController.getScrollLeft(); - this.handleScrollChange(); - }; - this.scrollController = scrollController; - this.doesListening = doesListening; - this.scrollTop = this.origScrollTop = scrollController.getScrollTop(); - this.scrollLeft = this.origScrollLeft = scrollController.getScrollLeft(); - this.scrollWidth = scrollController.getScrollWidth(); - this.scrollHeight = scrollController.getScrollHeight(); - this.clientWidth = scrollController.getClientWidth(); - this.clientHeight = scrollController.getClientHeight(); - this.clientRect = this.computeClientRect(); // do last in case it needs cached values - if (this.doesListening) { - this.getEventTarget().addEventListener('scroll', this.handleScroll); - } - } - destroy() { - if (this.doesListening) { - this.getEventTarget().removeEventListener('scroll', this.handleScroll); - } - } - getScrollTop() { - return this.scrollTop; - } - getScrollLeft() { - return this.scrollLeft; - } - setScrollTop(top) { - this.scrollController.setScrollTop(top); - if (!this.doesListening) { - // we are not relying on the element to normalize out-of-bounds scroll values - // so we need to sanitize ourselves - this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0); - this.handleScrollChange(); - } - } - setScrollLeft(top) { - this.scrollController.setScrollLeft(top); - if (!this.doesListening) { - // we are not relying on the element to normalize out-of-bounds scroll values - // so we need to sanitize ourselves - this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0); - this.handleScrollChange(); - } - } - getClientWidth() { - return this.clientWidth; - } - getClientHeight() { - return this.clientHeight; - } - getScrollWidth() { - return this.scrollWidth; - } - getScrollHeight() { - return this.scrollHeight; - } - handleScrollChange() { - } - } - - class ElementScrollGeomCache extends ScrollGeomCache { - constructor(el, doesListening) { - super(new ElementScrollController(el), doesListening); - } - getEventTarget() { - return this.scrollController.el; - } - computeClientRect() { - return computeInnerRect(this.scrollController.el); - } - } - - class WindowScrollGeomCache extends ScrollGeomCache { - constructor(doesListening) { - super(new WindowScrollController(), doesListening); - } - getEventTarget() { - return window; - } - computeClientRect() { - return { - left: this.scrollLeft, - right: this.scrollLeft + this.clientWidth, - top: this.scrollTop, - bottom: this.scrollTop + this.clientHeight, - }; - } - // the window is the only scroll object that changes it's rectangle relative - // to the document's topleft as it scrolls - handleScrollChange() { - this.clientRect = this.computeClientRect(); - } - } - - // If available we are using native "performance" API instead of "Date" - // Read more about it on MDN: - // https://developer.mozilla.org/en-US/docs/Web/API/Performance - const getTime = typeof performance === 'function' ? performance.now : Date.now; - /* - For a pointer interaction, automatically scrolls certain scroll containers when the pointer - approaches the edge. - - The caller must call start + handleMove + stop. - */ - class AutoScroller { - constructor() { - // options that can be set by caller - this.isEnabled = true; - this.scrollQuery = [window, '.fc-scroller']; - this.edgeThreshold = 50; // pixels - this.maxVelocity = 300; // pixels per second - // internal state - this.pointerScreenX = null; - this.pointerScreenY = null; - this.isAnimating = false; - this.scrollCaches = null; - // protect against the initial pointerdown being too close to an edge and starting the scroll - this.everMovedUp = false; - this.everMovedDown = false; - this.everMovedLeft = false; - this.everMovedRight = false; - this.animate = () => { - if (this.isAnimating) { // wasn't cancelled between animation calls - let edge = this.computeBestEdge(this.pointerScreenX + window.pageXOffset, this.pointerScreenY + window.pageYOffset); - if (edge) { - let now = getTime(); - this.handleSide(edge, (now - this.msSinceRequest) / 1000); - this.requestAnimation(now); - } - else { - this.isAnimating = false; // will stop animation - } - } - }; - } - start(pageX, pageY, scrollStartEl) { - if (this.isEnabled) { - this.scrollCaches = this.buildCaches(scrollStartEl); - this.pointerScreenX = null; - this.pointerScreenY = null; - this.everMovedUp = false; - this.everMovedDown = false; - this.everMovedLeft = false; - this.everMovedRight = false; - this.handleMove(pageX, pageY); - } - } - handleMove(pageX, pageY) { - if (this.isEnabled) { - let pointerScreenX = pageX - window.pageXOffset; - let pointerScreenY = pageY - window.pageYOffset; - let yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY; - let xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX; - if (yDelta < 0) { - this.everMovedUp = true; - } - else if (yDelta > 0) { - this.everMovedDown = true; - } - if (xDelta < 0) { - this.everMovedLeft = true; - } - else if (xDelta > 0) { - this.everMovedRight = true; - } - this.pointerScreenX = pointerScreenX; - this.pointerScreenY = pointerScreenY; - if (!this.isAnimating) { - this.isAnimating = true; - this.requestAnimation(getTime()); - } - } - } - stop() { - if (this.isEnabled) { - this.isAnimating = false; // will stop animation - for (let scrollCache of this.scrollCaches) { - scrollCache.destroy(); - } - this.scrollCaches = null; - } - } - requestAnimation(now) { - this.msSinceRequest = now; - requestAnimationFrame(this.animate); - } - handleSide(edge, seconds) { - let { scrollCache } = edge; - let { edgeThreshold } = this; - let invDistance = edgeThreshold - edge.distance; - let velocity = // the closer to the edge, the faster we scroll - ((invDistance * invDistance) / (edgeThreshold * edgeThreshold)) * // quadratic - this.maxVelocity * seconds; - let sign = 1; - switch (edge.name) { - case 'left': - sign = -1; - // falls through - case 'right': - scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign); - break; - case 'top': - sign = -1; - // falls through - case 'bottom': - scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign); - break; - } - } - // left/top are relative to document topleft - computeBestEdge(left, top) { - let { edgeThreshold } = this; - let bestSide = null; - let scrollCaches = this.scrollCaches || []; - for (let scrollCache of scrollCaches) { - let rect = scrollCache.clientRect; - let leftDist = left - rect.left; - let rightDist = rect.right - left; - let topDist = top - rect.top; - let bottomDist = rect.bottom - top; - // completely within the rect? - if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) { - if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() && - (!bestSide || bestSide.distance > topDist)) { - bestSide = { scrollCache, name: 'top', distance: topDist }; - } - if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() && - (!bestSide || bestSide.distance > bottomDist)) { - bestSide = { scrollCache, name: 'bottom', distance: bottomDist }; - } - if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() && - (!bestSide || bestSide.distance > leftDist)) { - bestSide = { scrollCache, name: 'left', distance: leftDist }; - } - if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() && - (!bestSide || bestSide.distance > rightDist)) { - bestSide = { scrollCache, name: 'right', distance: rightDist }; - } - } - } - return bestSide; - } - buildCaches(scrollStartEl) { - return this.queryScrollEls(scrollStartEl).map((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 - }); - } - queryScrollEls(scrollStartEl) { - let els = []; - for (let query of this.scrollQuery) { - if (typeof query === 'object') { - els.push(query); - } - else { - els.push(...Array.prototype.slice.call(getElRoot(scrollStartEl).querySelectorAll(query))); - } - } - return els; - } - } - - /* - Monitors dragging on an element. Has a number of high-level features: - - minimum distance required before dragging - - minimum wait time ("delay") before dragging - - a mirror element that follows the pointer - */ - class FeaturefulElementDragging extends ElementDragging { - constructor(containerEl, selector) { - super(containerEl); - 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; - this.minDistance = 0; - this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag - this.mirrorNeedsRevert = false; - this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup - this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation - this.isDelayEnded = false; - this.isDistanceSurpassed = false; - this.delayTimeoutId = null; - this.onPointerDown = (ev) => { - if (!this.isDragging) { // so new drag doesn't happen while revert animation is going - this.isInteracting = true; - this.isDelayEnded = false; - this.isDistanceSurpassed = false; - preventSelection(document.body); - preventContextMenu(document.body); - // prevent links from being visited if there's an eventual drag. - // also prevents selection in older browsers (maybe?). - // not necessary for touch, besides, browser would complain about passiveness. - if (!ev.isTouch) { - ev.origEvent.preventDefault(); - } - this.emitter.trigger('pointerdown', ev); - if (this.isInteracting && // not destroyed via pointerdown handler - !this.pointer.shouldIgnoreMove) { - // actions related to initiating dragstart+dragmove+dragend... - this.mirror.setIsVisible(false); // reset. caller must set-visible - this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down - this.startDelay(ev); - if (!this.minDistance) { - this.handleDistanceSurpassed(ev); - } - } - } - }; - this.onPointerMove = (ev) => { - if (this.isInteracting) { - this.emitter.trigger('pointermove', ev); - if (!this.isDistanceSurpassed) { - let minDistance = this.minDistance; - let distanceSq; // current distance from the origin, squared - let { deltaX, deltaY } = ev; - distanceSq = deltaX * deltaX + deltaY * deltaY; - if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem - this.handleDistanceSurpassed(ev); - } - } - if (this.isDragging) { - // a real pointer move? (not one simulated by scrolling) - if (ev.origEvent.type !== 'scroll') { - this.mirror.handleMove(ev.pageX, ev.pageY); - this.autoScroller.handleMove(ev.pageX, ev.pageY); - } - this.emitter.trigger('dragmove', ev); - } - } - }; - this.onPointerUp = (ev) => { - if (this.isInteracting) { - this.isInteracting = false; - allowSelection(document.body); - allowContextMenu(document.body); - this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert - if (this.isDragging) { - this.autoScroller.stop(); - this.tryStopDrag(ev); // which will stop the mirror - } - if (this.delayTimeoutId) { - clearTimeout(this.delayTimeoutId); - this.delayTimeoutId = null; - } - } - }; - let pointer = this.pointer = new PointerDragging(containerEl); - pointer.emitter.on('pointerdown', this.onPointerDown); - pointer.emitter.on('pointermove', this.onPointerMove); - pointer.emitter.on('pointerup', this.onPointerUp); - if (selector) { - pointer.selector = selector; - } - this.mirror = new ElementMirror(); - this.autoScroller = new AutoScroller(); - } - destroy() { - this.pointer.destroy(); - // HACK: simulate a pointer-up to end the current drag - // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire) - this.onPointerUp({}); - } - startDelay(ev) { - if (typeof this.delay === 'number') { - this.delayTimeoutId = setTimeout(() => { - this.delayTimeoutId = null; - this.handleDelayEnd(ev); - }, this.delay); // not assignable to number! - } - else { - this.handleDelayEnd(ev); - } - } - handleDelayEnd(ev) { - this.isDelayEnded = true; - this.tryStartDrag(ev); - } - handleDistanceSurpassed(ev) { - this.isDistanceSurpassed = true; - this.tryStartDrag(ev); - } - tryStartDrag(ev) { - if (this.isDelayEnded && this.isDistanceSurpassed) { - if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) { - this.isDragging = true; - this.mirrorNeedsRevert = false; - this.autoScroller.start(ev.pageX, ev.pageY, this.containerEl); - this.emitter.trigger('dragstart', ev); - if (this.touchScrollAllowed === false) { - this.pointer.cancelTouchScroll(); - } - } - } - } - tryStopDrag(ev) { - // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events - // that come from the document to fire beforehand. much more convenient this way. - this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev)); - } - stopDrag(ev) { - this.isDragging = false; - this.emitter.trigger('dragend', ev); - } - // fill in the implementations... - setIgnoreMove(bool) { - this.pointer.shouldIgnoreMove = bool; - } - setMirrorIsVisible(bool) { - this.mirror.setIsVisible(bool); - } - setMirrorNeedsRevert(bool) { - this.mirrorNeedsRevert = bool; - } - setAutoScrollEnabled(bool) { - this.autoScroller.isEnabled = bool; - } - } - - /* - When this class is instantiated, it records the offset of an element (relative to the document topleft), - and continues to monitor scrolling, updating the cached coordinates if it needs to. - Does not access the DOM after instantiation, so highly performant. - - Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element - and an determine if a given point is inside the combined clipping rectangle. - */ - class OffsetTracker { - constructor(el) { - this.origRect = computeRect(el); - // will work fine for divs that have overflow:hidden - this.scrollCaches = getClippingParents(el).map((scrollEl) => new ElementScrollGeomCache(scrollEl, true)); - } - destroy() { - for (let scrollCache of this.scrollCaches) { - scrollCache.destroy(); - } - } - computeLeft() { - let left = this.origRect.left; - for (let scrollCache of this.scrollCaches) { - left += scrollCache.origScrollLeft - scrollCache.getScrollLeft(); - } - return left; - } - computeTop() { - let top = this.origRect.top; - for (let scrollCache of this.scrollCaches) { - top += scrollCache.origScrollTop - scrollCache.getScrollTop(); - } - return top; - } - isWithinClipping(pageX, pageY) { - let point = { left: pageX, top: pageY }; - for (let scrollCache of this.scrollCaches) { - if (!isIgnoredClipping(scrollCache.getEventTarget()) && - !pointInsideRect(point, scrollCache.clientRect)) { - return false; - } - } - return true; - } - } - // certain clipping containers should never constrain interactions, like and - // https://github.com/fullcalendar/fullcalendar/issues/3615 - function isIgnoredClipping(node) { - let tagName = node.tagName; - return tagName === 'HTML' || tagName === 'BODY'; - } - - /* - Tracks movement over multiple droppable areas (aka "hits") - that exist in one or more DateComponents. - Relies on an existing draggable. - - emits: - - pointerdown - - dragstart - - hitchange - fires initially, even if not over a hit - - pointerup - - (hitchange - again, to null, if ended over a hit) - - dragend - */ - class HitDragging { - constructor(dragging, droppableStore) { - // options that can be set by caller - this.useSubjectCenter = false; - this.requireInitial = true; // if doesn't start out on a hit, won't emit any events - this.initialHit = null; - this.movingHit = null; - this.finalHit = null; // won't ever be populated if shouldIgnoreMove - this.handlePointerDown = (ev) => { - let { dragging } = this; - this.initialHit = null; - this.movingHit = null; - this.finalHit = null; - this.prepareHits(); - this.processFirstCoord(ev); - if (this.initialHit || !this.requireInitial) { - dragging.setIgnoreMove(false); - // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :( - this.emitter.trigger('pointerdown', ev); - } - else { - dragging.setIgnoreMove(true); - } - }; - this.handleDragStart = (ev) => { - this.emitter.trigger('dragstart', ev); - this.handleMove(ev, true); // force = fire even if initially null - }; - this.handleDragMove = (ev) => { - this.emitter.trigger('dragmove', ev); - this.handleMove(ev); - }; - this.handlePointerUp = (ev) => { - this.releaseHits(); - this.emitter.trigger('pointerup', ev); - }; - this.handleDragEnd = (ev) => { - if (this.movingHit) { - this.emitter.trigger('hitupdate', null, true, ev); - } - this.finalHit = this.movingHit; - this.movingHit = null; - this.emitter.trigger('dragend', ev); - }; - this.droppableStore = droppableStore; - dragging.emitter.on('pointerdown', this.handlePointerDown); - dragging.emitter.on('dragstart', this.handleDragStart); - dragging.emitter.on('dragmove', this.handleDragMove); - dragging.emitter.on('pointerup', this.handlePointerUp); - dragging.emitter.on('dragend', this.handleDragEnd); - this.dragging = dragging; - this.emitter = new Emitter(); - } - // sets initialHit - // sets coordAdjust - processFirstCoord(ev) { - let origPoint = { left: ev.pageX, top: ev.pageY }; - let adjustedPoint = origPoint; - let subjectEl = ev.subjectEl; - let subjectRect; - if (subjectEl instanceof HTMLElement) { // i.e. not a Document/ShadowRoot - subjectRect = computeRect(subjectEl); - adjustedPoint = constrainPoint(adjustedPoint, subjectRect); - } - let initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top); - if (initialHit) { - if (this.useSubjectCenter && subjectRect) { - let slicedSubjectRect = intersectRects(subjectRect, initialHit.rect); - if (slicedSubjectRect) { - adjustedPoint = getRectCenter(slicedSubjectRect); - } - } - this.coordAdjust = diffPoints(adjustedPoint, origPoint); - } - else { - this.coordAdjust = { left: 0, top: 0 }; - } - } - handleMove(ev, forceHandle) { - let hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top); - if (forceHandle || !isHitsEqual(this.movingHit, hit)) { - this.movingHit = hit; - this.emitter.trigger('hitupdate', hit, false, ev); - } - } - prepareHits() { - this.offsetTrackers = mapHash(this.droppableStore, (interactionSettings) => { - interactionSettings.component.prepareHits(); - return new OffsetTracker(interactionSettings.el); - }); - } - releaseHits() { - let { offsetTrackers } = this; - for (let id in offsetTrackers) { - offsetTrackers[id].destroy(); - } - this.offsetTrackers = {}; - } - queryHitForOffset(offsetLeft, offsetTop) { - let { droppableStore, offsetTrackers } = this; - let bestHit = null; - for (let id in droppableStore) { - let component = droppableStore[id].component; - let offsetTracker = offsetTrackers[id]; - if (offsetTracker && // wasn't destroyed mid-drag - offsetTracker.isWithinClipping(offsetLeft, offsetTop)) { - let originLeft = offsetTracker.computeLeft(); - let originTop = offsetTracker.computeTop(); - let positionLeft = offsetLeft - originLeft; - let positionTop = offsetTop - originTop; - let { origRect } = offsetTracker; - let width = origRect.right - origRect.left; - let height = origRect.bottom - origRect.top; - if ( - // must be within the element's bounds - positionLeft >= 0 && positionLeft < width && - positionTop >= 0 && positionTop < height) { - let hit = component.queryHit(positionLeft, positionTop, width, height); - if (hit && ( - // make sure the hit is within activeRange, meaning it's not a dead cell - rangeContainsRange(hit.dateProfile.activeRange, hit.dateSpan.range)) && - (!bestHit || hit.layer > bestHit.layer)) { - hit.componentId = id; - hit.context = component.context; - // TODO: better way to re-orient rectangle - hit.rect.left += originLeft; - hit.rect.right += originLeft; - hit.rect.top += originTop; - hit.rect.bottom += originTop; - bestHit = hit; - } - } - } - } - return bestHit; - } - } - function isHitsEqual(hit0, hit1) { - if (!hit0 && !hit1) { - return true; - } - if (Boolean(hit0) !== Boolean(hit1)) { - return false; - } - return isDateSpansEqual(hit0.dateSpan, hit1.dateSpan); - } - - function buildDatePointApiWithContext(dateSpan, context) { - let props = {}; - for (let transform of context.pluginHooks.datePointTransforms) { - Object.assign(props, transform(dateSpan, context)); - } - Object.assign(props, buildDatePointApi(dateSpan, context.dateEnv)); - return props; - } - function buildDatePointApi(span, dateEnv) { - return { - date: dateEnv.toDate(span.range.start), - dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), - allDay: span.allDay, - }; - } - - /* - Monitors when the user clicks on a specific date/time of a component. - A pointerdown+pointerup on the same "hit" constitutes a click. - */ - class DateClicking extends Interaction { - constructor(settings) { - super(settings); - this.handlePointerDown = (pev) => { - let { dragging } = this; - let downEl = pev.origEvent.target; - // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired - dragging.setIgnoreMove(!this.component.isValidDateDownEl(downEl)); - }; - // won't even fire if moving was ignored - this.handleDragEnd = (ev) => { - let { component } = this; - let { pointer } = this.dragging; - if (!pointer.wasTouchScroll) { - let { initialHit, finalHit } = this.hitDragging; - if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) { - let { context } = component; - let arg = Object.assign(Object.assign({}, buildDatePointApiWithContext(initialHit.dateSpan, context)), { dayEl: initialHit.dayEl, jsEvent: ev.origEvent, view: context.viewApi || context.calendarApi.view }); - context.emitter.trigger('dateClick', arg); - } - } - }; - // we DO want to watch pointer moves because otherwise finalHit won't get populated - this.dragging = new FeaturefulElementDragging(settings.el); - this.dragging.autoScroller.isEnabled = false; - let hitDragging = this.hitDragging = new HitDragging(this.dragging, interactionSettingsToStore(settings)); - hitDragging.emitter.on('pointerdown', this.handlePointerDown); - hitDragging.emitter.on('dragend', this.handleDragEnd); - } - destroy() { - this.dragging.destroy(); - } - } - - /* - Tracks when the user selects a portion of time of a component, - constituted by a drag over date cells, with a possible delay at the beginning of the drag. - */ - class DateSelecting extends Interaction { - constructor(settings) { - super(settings); - this.dragSelection = null; - this.handlePointerDown = (ev) => { - let { component, dragging } = this; - let { options } = component.context; - let canSelect = options.selectable && - component.isValidDateDownEl(ev.origEvent.target); - // don't bother to watch expensive moves if component won't do selection - dragging.setIgnoreMove(!canSelect); - // if touch, require user to hold down - dragging.delay = ev.isTouch ? getComponentTouchDelay$1(component) : null; - }; - this.handleDragStart = (ev) => { - this.component.context.calendarApi.unselect(ev); // unselect previous selections - }; - this.handleHitUpdate = (hit, isFinal) => { - let { context } = this.component; - let dragSelection = null; - let isInvalid = false; - if (hit) { - let initialHit = this.hitDragging.initialHit; - let disallowed = hit.componentId === initialHit.componentId - && this.isHitComboAllowed - && !this.isHitComboAllowed(initialHit, hit); - if (!disallowed) { - dragSelection = joinHitsIntoSelection(initialHit, hit, context.pluginHooks.dateSelectionTransformers); - } - if (!dragSelection || !isDateSelectionValid(dragSelection, hit.dateProfile, context)) { - isInvalid = true; - dragSelection = null; - } - } - if (dragSelection) { - context.dispatch({ type: 'SELECT_DATES', selection: dragSelection }); - } - else if (!isFinal) { // only unselect if moved away while dragging - context.dispatch({ type: 'UNSELECT_DATES' }); - } - if (!isInvalid) { - enableCursor(); - } - else { - disableCursor(); - } - if (!isFinal) { - this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging - } - }; - this.handlePointerUp = (pev) => { - if (this.dragSelection) { - // selection is already rendered, so just need to report selection - triggerDateSelect(this.dragSelection, pev, this.component.context); - this.dragSelection = null; - } - }; - let { component } = settings; - let { options } = component.context; - let dragging = this.dragging = new FeaturefulElementDragging(settings.el); - dragging.touchScrollAllowed = false; - dragging.minDistance = options.selectMinDistance || 0; - dragging.autoScroller.isEnabled = options.dragScroll; - let hitDragging = this.hitDragging = new HitDragging(this.dragging, interactionSettingsToStore(settings)); - hitDragging.emitter.on('pointerdown', this.handlePointerDown); - hitDragging.emitter.on('dragstart', this.handleDragStart); - hitDragging.emitter.on('hitupdate', this.handleHitUpdate); - hitDragging.emitter.on('pointerup', this.handlePointerUp); - } - destroy() { - this.dragging.destroy(); - } - } - function getComponentTouchDelay$1(component) { - let { options } = component.context; - let delay = options.selectLongPressDelay; - if (delay == null) { - delay = options.longPressDelay; - } - return delay; - } - function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) { - let dateSpan0 = hit0.dateSpan; - let dateSpan1 = hit1.dateSpan; - let ms = [ - dateSpan0.range.start, - dateSpan0.range.end, - dateSpan1.range.start, - dateSpan1.range.end, - ]; - ms.sort(compareNumbers); - let props = {}; - for (let transformer of dateSelectionTransformers) { - let res = transformer(hit0, hit1); - if (res === false) { - return null; - } - if (res) { - Object.assign(props, res); - } - } - props.range = { start: ms[0], end: ms[3] }; - props.allDay = dateSpan0.allDay; - return props; - } - - class EventDragging extends Interaction { - constructor(settings) { - super(settings); - // internal state - this.subjectEl = null; - this.subjectSeg = null; // the seg being selected/dragged - this.isDragging = false; - this.eventRange = null; - this.relevantEvents = null; // the events being dragged - this.receivingContext = null; - this.validMutation = null; - this.mutatedRelevantEvents = null; - this.handlePointerDown = (ev) => { - let origTarget = ev.origEvent.target; - let { component, dragging } = this; - let { mirror } = dragging; - let { options } = component.context; - let initialContext = component.context; - this.subjectEl = ev.subjectEl; - let subjectSeg = this.subjectSeg = getElSeg(ev.subjectEl); - let eventRange = this.eventRange = subjectSeg.eventRange; - let eventInstanceId = eventRange.instance.instanceId; - this.relevantEvents = getRelevantEvents(initialContext.getCurrentData().eventStore, eventInstanceId); - dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance; - dragging.delay = - // only do a touch delay if touch and this event hasn't been selected yet - (ev.isTouch && eventInstanceId !== component.props.eventSelection) ? - getComponentTouchDelay(component) : - null; - if (options.fixedMirrorParent) { - mirror.parentNode = options.fixedMirrorParent; - } - else { - mirror.parentNode = elementClosest(origTarget, '.fc'); - } - mirror.revertDuration = options.dragRevertDuration; - let isValid = component.isValidSegDownEl(origTarget) && - !elementClosest(origTarget, '.fc-event-resizer'); // NOT on a resizer - dragging.setIgnoreMove(!isValid); - // disable dragging for elements that are resizable (ie, selectable) - // but are not draggable - this.isDragging = isValid && - ev.subjectEl.classList.contains('fc-event-draggable'); - }; - this.handleDragStart = (ev) => { - let initialContext = this.component.context; - let eventRange = this.eventRange; - let eventInstanceId = eventRange.instance.instanceId; - if (ev.isTouch) { - // need to select a different event? - if (eventInstanceId !== this.component.props.eventSelection) { - initialContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId }); - } - } - else { - // if now using mouse, but was previous touch interaction, clear selected event - initialContext.dispatch({ type: 'UNSELECT_EVENT' }); - } - if (this.isDragging) { - initialContext.calendarApi.unselect(ev); // unselect *date* selection - initialContext.emitter.trigger('eventDragStart', { - el: this.subjectEl, - event: new EventImpl(initialContext, eventRange.def, eventRange.instance), - jsEvent: ev.origEvent, - view: initialContext.viewApi, - }); - } - }; - this.handleHitUpdate = (hit, isFinal) => { - if (!this.isDragging) { - return; - } - let relevantEvents = this.relevantEvents; - let initialHit = this.hitDragging.initialHit; - let initialContext = this.component.context; - // states based on new hit - let receivingContext = null; - let mutation = null; - let mutatedRelevantEvents = null; - let isInvalid = false; - let interaction = { - affectedEvents: relevantEvents, - mutatedEvents: createEmptyEventStore(), - isEvent: true, - }; - if (hit) { - receivingContext = hit.context; - let receivingOptions = receivingContext.options; - if (initialContext === receivingContext || - (receivingOptions.editable && receivingOptions.droppable)) { - mutation = computeEventMutation(initialHit, hit, receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers); - if (mutation) { - mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, receivingContext.getCurrentData().eventUiBases, mutation, receivingContext); - interaction.mutatedEvents = mutatedRelevantEvents; - if (!isInteractionValid(interaction, hit.dateProfile, receivingContext)) { - isInvalid = true; - mutation = null; - mutatedRelevantEvents = null; - interaction.mutatedEvents = createEmptyEventStore(); - } - } - } - else { - receivingContext = null; - } - } - this.displayDrag(receivingContext, interaction); - if (!isInvalid) { - enableCursor(); - } - else { - disableCursor(); - } - if (!isFinal) { - if (initialContext === receivingContext && // TODO: write test for this - isHitsEqual(initialHit, hit)) { - mutation = null; - } - 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 || !getElRoot(this.subjectEl).querySelector('.fc-event-mirror')); - // assign states based on new hit - this.receivingContext = receivingContext; - this.validMutation = mutation; - this.mutatedRelevantEvents = mutatedRelevantEvents; - } - }; - this.handlePointerUp = () => { - if (!this.isDragging) { - this.cleanup(); // because handleDragEnd won't fire - } - }; - this.handleDragEnd = (ev) => { - if (this.isDragging) { - let initialContext = this.component.context; - let initialView = initialContext.viewApi; - let { receivingContext, validMutation } = this; - let eventDef = this.eventRange.def; - let eventInstance = this.eventRange.instance; - let eventApi = new EventImpl(initialContext, eventDef, eventInstance); - let relevantEvents = this.relevantEvents; - let mutatedRelevantEvents = this.mutatedRelevantEvents; - let { finalHit } = this.hitDragging; - this.clearDrag(); // must happen after revert animation - initialContext.emitter.trigger('eventDragStop', { - el: this.subjectEl, - event: eventApi, - jsEvent: ev.origEvent, - view: initialView, - }); - if (validMutation) { - // dropped within same calendar - if (receivingContext === initialContext) { - let updatedEventApi = new EventImpl(initialContext, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null); - initialContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: mutatedRelevantEvents, - }); - let eventChangeArg = { - oldEvent: eventApi, - event: updatedEventApi, - relatedEvents: buildEventApis(mutatedRelevantEvents, initialContext, eventInstance), - revert() { - initialContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: relevantEvents, // the pre-change data - }); - }, - }; - let transformed = {}; - for (let transformer of initialContext.getCurrentData().pluginHooks.eventDropTransformers) { - Object.assign(transformed, transformer(validMutation, initialContext)); - } - initialContext.emitter.trigger('eventDrop', Object.assign(Object.assign(Object.assign({}, eventChangeArg), transformed), { el: ev.subjectEl, delta: validMutation.datesDelta, jsEvent: ev.origEvent, view: initialView })); - initialContext.emitter.trigger('eventChange', eventChangeArg); - // dropped in different calendar - } - else if (receivingContext) { - let eventRemoveArg = { - event: eventApi, - relatedEvents: buildEventApis(relevantEvents, initialContext, eventInstance), - revert() { - initialContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: relevantEvents, - }); - }, - }; - initialContext.emitter.trigger('eventLeave', Object.assign(Object.assign({}, eventRemoveArg), { draggedEl: ev.subjectEl, view: initialView })); - initialContext.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: relevantEvents, - }); - initialContext.emitter.trigger('eventRemove', eventRemoveArg); - let addedEventDef = mutatedRelevantEvents.defs[eventDef.defId]; - let addedEventInstance = mutatedRelevantEvents.instances[eventInstance.instanceId]; - let addedEventApi = new EventImpl(receivingContext, addedEventDef, addedEventInstance); - receivingContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: mutatedRelevantEvents, - }); - let eventAddArg = { - event: addedEventApi, - relatedEvents: buildEventApis(mutatedRelevantEvents, receivingContext, addedEventInstance), - revert() { - receivingContext.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: mutatedRelevantEvents, - }); - }, - }; - receivingContext.emitter.trigger('eventAdd', eventAddArg); - if (ev.isTouch) { - receivingContext.dispatch({ - type: 'SELECT_EVENT', - eventInstanceId: eventInstance.instanceId, - }); - } - receivingContext.emitter.trigger('drop', Object.assign(Object.assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.context.viewApi })); - receivingContext.emitter.trigger('eventReceive', Object.assign(Object.assign({}, eventAddArg), { draggedEl: ev.subjectEl, view: finalHit.context.viewApi })); - } - } - else { - initialContext.emitter.trigger('_noEventDrop'); - } - } - this.cleanup(); - }; - let { component } = this; - let { options } = component.context; - let dragging = this.dragging = new FeaturefulElementDragging(settings.el); - dragging.pointer.selector = EventDragging.SELECTOR; - dragging.touchScrollAllowed = false; - dragging.autoScroller.isEnabled = options.dragScroll; - let hitDragging = this.hitDragging = new HitDragging(this.dragging, interactionSettingsStore); - hitDragging.useSubjectCenter = settings.useEventCenter; - hitDragging.emitter.on('pointerdown', this.handlePointerDown); - hitDragging.emitter.on('dragstart', this.handleDragStart); - hitDragging.emitter.on('hitupdate', this.handleHitUpdate); - hitDragging.emitter.on('pointerup', this.handlePointerUp); - hitDragging.emitter.on('dragend', this.handleDragEnd); - } - destroy() { - this.dragging.destroy(); - } - // render a drag state on the next receivingCalendar - displayDrag(nextContext, state) { - let initialContext = this.component.context; - let prevContext = this.receivingContext; - // does the previous calendar need to be cleared? - if (prevContext && prevContext !== nextContext) { - // does the initial calendar need to be cleared? - // if so, don't clear all the way. we still need to to hide the affectedEvents - if (prevContext === initialContext) { - prevContext.dispatch({ - type: 'SET_EVENT_DRAG', - state: { - affectedEvents: state.affectedEvents, - mutatedEvents: createEmptyEventStore(), - isEvent: true, - }, - }); - // completely clear the old calendar if it wasn't the initial - } - else { - prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - } - if (nextContext) { - nextContext.dispatch({ type: 'SET_EVENT_DRAG', state }); - } - } - clearDrag() { - let initialCalendar = this.component.context; - let { receivingContext } = this; - if (receivingContext) { - receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - // the initial calendar might have an dummy drag state from displayDrag - if (initialCalendar !== receivingContext) { - initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - } - cleanup() { - this.subjectSeg = null; - this.isDragging = false; - this.eventRange = null; - this.relevantEvents = null; - this.receivingContext = null; - this.validMutation = null; - this.mutatedRelevantEvents = null; - } - } - // TODO: test this in IE11 - // QUESTION: why do we need it on the resizable??? - EventDragging.SELECTOR = '.fc-event-draggable, .fc-event-resizable'; - function computeEventMutation(hit0, hit1, massagers) { - let dateSpan0 = hit0.dateSpan; - let dateSpan1 = hit1.dateSpan; - let date0 = dateSpan0.range.start; - let date1 = dateSpan1.range.start; - let standardProps = {}; - if (dateSpan0.allDay !== dateSpan1.allDay) { - standardProps.allDay = dateSpan1.allDay; - standardProps.hasEnd = hit1.context.options.allDayMaintainDuration; - if (dateSpan1.allDay) { - // means date1 is already start-of-day, - // but date0 needs to be converted - date0 = startOfDay(date0); - } - } - let delta = diffDates(date0, date1, hit0.context.dateEnv, hit0.componentId === hit1.componentId ? - hit0.largeUnit : - null); - if (delta.milliseconds) { // has hours/minutes/seconds - standardProps.allDay = false; - } - let mutation = { - datesDelta: delta, - standardProps, - }; - for (let massager of massagers) { - massager(mutation, hit0, hit1); - } - return mutation; - } - function getComponentTouchDelay(component) { - let { options } = component.context; - let delay = options.eventLongPressDelay; - if (delay == null) { - delay = options.longPressDelay; - } - return delay; - } - - class EventResizing extends Interaction { - constructor(settings) { - super(settings); - // internal state - this.draggingSegEl = null; - this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg? - this.eventRange = null; - this.relevantEvents = null; - this.validMutation = null; - this.mutatedRelevantEvents = null; - this.handlePointerDown = (ev) => { - let { component } = this; - let segEl = this.querySegEl(ev); - let seg = getElSeg(segEl); - let eventRange = this.eventRange = seg.eventRange; - this.dragging.minDistance = component.context.options.eventDragMinDistance; - // if touch, need to be working with a selected event - this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(ev.origEvent.target) || - (ev.isTouch && this.component.props.eventSelection !== eventRange.instance.instanceId)); - }; - this.handleDragStart = (ev) => { - let { context } = this.component; - let eventRange = this.eventRange; - this.relevantEvents = getRelevantEvents(context.getCurrentData().eventStore, this.eventRange.instance.instanceId); - let segEl = this.querySegEl(ev); - this.draggingSegEl = segEl; - this.draggingSeg = getElSeg(segEl); - context.calendarApi.unselect(); - context.emitter.trigger('eventResizeStart', { - el: segEl, - event: new EventImpl(context, eventRange.def, eventRange.instance), - jsEvent: ev.origEvent, - view: context.viewApi, - }); - }; - this.handleHitUpdate = (hit, isFinal, ev) => { - let { context } = this.component; - let relevantEvents = this.relevantEvents; - let initialHit = this.hitDragging.initialHit; - let eventInstance = this.eventRange.instance; - let mutation = null; - let mutatedRelevantEvents = null; - let isInvalid = false; - let interaction = { - affectedEvents: relevantEvents, - mutatedEvents: createEmptyEventStore(), - isEvent: true, - }; - if (hit) { - let disallowed = hit.componentId === initialHit.componentId - && this.isHitComboAllowed - && !this.isHitComboAllowed(initialHit, hit); - if (!disallowed) { - mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-event-resizer-start'), eventInstance.range); - } - } - if (mutation) { - mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, context.getCurrentData().eventUiBases, mutation, context); - interaction.mutatedEvents = mutatedRelevantEvents; - if (!isInteractionValid(interaction, hit.dateProfile, context)) { - isInvalid = true; - mutation = null; - mutatedRelevantEvents = null; - interaction.mutatedEvents = null; - } - } - if (mutatedRelevantEvents) { - context.dispatch({ - type: 'SET_EVENT_RESIZE', - state: interaction, - }); - } - else { - context.dispatch({ type: 'UNSET_EVENT_RESIZE' }); - } - if (!isInvalid) { - enableCursor(); - } - else { - disableCursor(); - } - if (!isFinal) { - if (mutation && isHitsEqual(initialHit, hit)) { - mutation = null; - } - this.validMutation = mutation; - this.mutatedRelevantEvents = mutatedRelevantEvents; - } - }; - this.handleDragEnd = (ev) => { - let { context } = this.component; - let eventDef = this.eventRange.def; - let eventInstance = this.eventRange.instance; - let eventApi = new EventImpl(context, eventDef, eventInstance); - let relevantEvents = this.relevantEvents; - let mutatedRelevantEvents = this.mutatedRelevantEvents; - context.emitter.trigger('eventResizeStop', { - el: this.draggingSegEl, - event: eventApi, - jsEvent: ev.origEvent, - view: context.viewApi, - }); - if (this.validMutation) { - let updatedEventApi = new EventImpl(context, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null); - context.dispatch({ - type: 'MERGE_EVENTS', - eventStore: mutatedRelevantEvents, - }); - let eventChangeArg = { - oldEvent: eventApi, - event: updatedEventApi, - relatedEvents: buildEventApis(mutatedRelevantEvents, context, eventInstance), - revert() { - context.dispatch({ - type: 'MERGE_EVENTS', - eventStore: relevantEvents, // the pre-change events - }); - }, - }; - context.emitter.trigger('eventResize', Object.assign(Object.assign({}, eventChangeArg), { el: this.draggingSegEl, startDelta: this.validMutation.startDelta || createDuration(0), endDelta: this.validMutation.endDelta || createDuration(0), jsEvent: ev.origEvent, view: context.viewApi })); - context.emitter.trigger('eventChange', eventChangeArg); - } - else { - context.emitter.trigger('_noEventResize'); - } - // reset all internal state - this.draggingSeg = null; - this.relevantEvents = null; - this.validMutation = null; - // okay to keep eventInstance around. useful to set it in handlePointerDown - }; - let { component } = settings; - let dragging = this.dragging = new FeaturefulElementDragging(settings.el); - dragging.pointer.selector = '.fc-event-resizer'; - dragging.touchScrollAllowed = false; - dragging.autoScroller.isEnabled = component.context.options.dragScroll; - let hitDragging = this.hitDragging = new HitDragging(this.dragging, interactionSettingsToStore(settings)); - hitDragging.emitter.on('pointerdown', this.handlePointerDown); - hitDragging.emitter.on('dragstart', this.handleDragStart); - hitDragging.emitter.on('hitupdate', this.handleHitUpdate); - hitDragging.emitter.on('dragend', this.handleDragEnd); - } - destroy() { - this.dragging.destroy(); - } - querySegEl(ev) { - return elementClosest(ev.subjectEl, '.fc-event'); - } - } - function computeMutation(hit0, hit1, isFromStart, instanceRange) { - let dateEnv = hit0.context.dateEnv; - let date0 = hit0.dateSpan.range.start; - let date1 = hit1.dateSpan.range.start; - let delta = diffDates(date0, date1, dateEnv, hit0.largeUnit); - if (isFromStart) { - if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) { - return { startDelta: delta }; - } - } - else if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) { - return { endDelta: delta }; - } - return null; - } - - class UnselectAuto { - constructor(context) { - this.context = context; - this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system - this.matchesCancel = false; - this.matchesEvent = false; - this.onSelect = (selectInfo) => { - if (selectInfo.jsEvent) { - this.isRecentPointerDateSelect = true; - } - }; - this.onDocumentPointerDown = (pev) => { - let unselectCancel = this.context.options.unselectCancel; - let downEl = getEventTargetViaRoot(pev.origEvent); - this.matchesCancel = !!elementClosest(downEl, unselectCancel); - this.matchesEvent = !!elementClosest(downEl, EventDragging.SELECTOR); // interaction started on an event? - }; - this.onDocumentPointerUp = (pev) => { - let { context } = this; - let { documentPointer } = this; - let calendarState = context.getCurrentData(); - // touch-scrolling should never unfocus any type of selection - if (!documentPointer.wasTouchScroll) { - if (calendarState.dateSelection && // an existing date selection? - !this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp? - ) { - let unselectAuto = context.options.unselectAuto; - if (unselectAuto && (!unselectAuto || !this.matchesCancel)) { - context.calendarApi.unselect(pev); - } - } - if (calendarState.eventSelection && // an existing event selected? - !this.matchesEvent // interaction DIDN'T start on an event - ) { - context.dispatch({ type: 'UNSELECT_EVENT' }); - } - } - this.isRecentPointerDateSelect = false; - }; - let documentPointer = this.documentPointer = new PointerDragging(document); - documentPointer.shouldIgnoreMove = true; - documentPointer.shouldWatchScroll = false; - documentPointer.emitter.on('pointerdown', this.onDocumentPointerDown); - documentPointer.emitter.on('pointerup', this.onDocumentPointerUp); - /* - TODO: better way to know about whether there was a selection with the pointer - */ - context.emitter.on('select', this.onSelect); - } - destroy() { - this.context.emitter.off('select', this.onSelect); - this.documentPointer.destroy(); - } - } - - const OPTION_REFINERS$2 = { - fixedMirrorParent: identity, - }; - const LISTENER_REFINERS = { - dateClick: identity, - eventDragStart: identity, - eventDragStop: identity, - eventDrop: identity, - eventResizeStart: identity, - eventResizeStop: identity, - eventResize: identity, - drop: identity, - eventReceive: identity, - eventLeave: identity, - }; - - /* - Given an already instantiated draggable object for one-or-more elements, - Interprets any dragging as an attempt to drag an events that lives outside - of a calendar onto a calendar. - */ - class ExternalElementDragging { - constructor(dragging, suppliedDragMeta) { - this.receivingContext = null; - this.droppableEvent = null; // will exist for all drags, even if create:false - this.suppliedDragMeta = null; - this.dragMeta = null; - this.handleDragStart = (ev) => { - this.dragMeta = this.buildDragMeta(ev.subjectEl); - }; - this.handleHitUpdate = (hit, isFinal, ev) => { - let { dragging } = this.hitDragging; - let receivingContext = null; - let droppableEvent = null; - let isInvalid = false; - let interaction = { - affectedEvents: createEmptyEventStore(), - mutatedEvents: createEmptyEventStore(), - isEvent: this.dragMeta.create, - }; - if (hit) { - receivingContext = hit.context; - if (this.canDropElOnCalendar(ev.subjectEl, receivingContext)) { - droppableEvent = computeEventForDateSpan(hit.dateSpan, this.dragMeta, receivingContext); - interaction.mutatedEvents = eventTupleToStore(droppableEvent); - isInvalid = !isInteractionValid(interaction, hit.dateProfile, receivingContext); - if (isInvalid) { - interaction.mutatedEvents = createEmptyEventStore(); - droppableEvent = null; - } - } - } - this.displayDrag(receivingContext, interaction); - // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?) - // TODO: wish we could somehow wait for dispatch to guarantee render - dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-event-mirror')); - if (!isInvalid) { - enableCursor(); - } - else { - disableCursor(); - } - if (!isFinal) { - dragging.setMirrorNeedsRevert(!droppableEvent); - this.receivingContext = receivingContext; - this.droppableEvent = droppableEvent; - } - }; - this.handleDragEnd = (pev) => { - let { receivingContext, droppableEvent } = this; - this.clearDrag(); - if (receivingContext && droppableEvent) { - let finalHit = this.hitDragging.finalHit; - let finalView = finalHit.context.viewApi; - let dragMeta = this.dragMeta; - receivingContext.emitter.trigger('drop', Object.assign(Object.assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView })); - if (dragMeta.create) { - let addingEvents = eventTupleToStore(droppableEvent); - receivingContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: addingEvents, - }); - if (pev.isTouch) { - receivingContext.dispatch({ - type: 'SELECT_EVENT', - eventInstanceId: droppableEvent.instance.instanceId, - }); - } - // signal that an external event landed - receivingContext.emitter.trigger('eventReceive', { - event: new EventImpl(receivingContext, droppableEvent.def, droppableEvent.instance), - relatedEvents: [], - revert() { - receivingContext.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: addingEvents, - }); - }, - draggedEl: pev.subjectEl, - view: finalView, - }); - } - } - this.receivingContext = null; - this.droppableEvent = null; - }; - let hitDragging = this.hitDragging = new HitDragging(dragging, interactionSettingsStore); - hitDragging.requireInitial = false; // will start outside of a component - hitDragging.emitter.on('dragstart', this.handleDragStart); - hitDragging.emitter.on('hitupdate', this.handleHitUpdate); - hitDragging.emitter.on('dragend', this.handleDragEnd); - this.suppliedDragMeta = suppliedDragMeta; - } - buildDragMeta(subjectEl) { - if (typeof this.suppliedDragMeta === 'object') { - return parseDragMeta(this.suppliedDragMeta); - } - if (typeof this.suppliedDragMeta === 'function') { - return parseDragMeta(this.suppliedDragMeta(subjectEl)); - } - return getDragMetaFromEl(subjectEl); - } - displayDrag(nextContext, state) { - let prevContext = this.receivingContext; - if (prevContext && prevContext !== nextContext) { - prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - if (nextContext) { - nextContext.dispatch({ type: 'SET_EVENT_DRAG', state }); - } - } - clearDrag() { - if (this.receivingContext) { - this.receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - } - canDropElOnCalendar(el, receivingContext) { - let dropAccept = receivingContext.options.dropAccept; - if (typeof dropAccept === 'function') { - return dropAccept.call(receivingContext.calendarApi, el); - } - if (typeof dropAccept === 'string' && dropAccept) { - return Boolean(elementMatches(el, dropAccept)); - } - return true; - } - } - // Utils for computing event store from the DragMeta - // ---------------------------------------------------------------------------------------------------- - function computeEventForDateSpan(dateSpan, dragMeta, context) { - let defProps = Object.assign({}, dragMeta.leftoverProps); - for (let transform of context.pluginHooks.externalDefTransforms) { - Object.assign(defProps, transform(dateSpan, dragMeta)); - } - let { refined, extra } = refineEventDef(defProps, context); - let def = parseEventDef(refined, extra, dragMeta.sourceId, dateSpan.allDay, context.options.forceEventDuration || Boolean(dragMeta.duration), // hasEnd - context); - let start = dateSpan.range.start; - // only rely on time info if drop zone is all-day, - // otherwise, we already know the time - if (dateSpan.allDay && dragMeta.startTime) { - start = context.dateEnv.add(start, dragMeta.startTime); - } - let end = dragMeta.duration ? - context.dateEnv.add(start, dragMeta.duration) : - getDefaultEventEnd(dateSpan.allDay, start, context); - let instance = createEventInstance(def.defId, { start, end }); - return { def, instance }; - } - // Utils for extracting data from element - // ---------------------------------------------------------------------------------------------------- - function getDragMetaFromEl(el) { - let str = getEmbeddedElData(el, 'event'); - let obj = str ? - JSON.parse(str) : - { create: false }; // if no embedded data, assume no event creation - return parseDragMeta(obj); - } - config.dataAttrPrefix = ''; - function getEmbeddedElData(el, name) { - let prefix = config.dataAttrPrefix; - let prefixedName = (prefix ? prefix + '-' : '') + name; - return el.getAttribute('data-' + prefixedName) || ''; - } - - /* - Makes an element (that is *external* to any calendar) draggable. - Can pass in data that determines how an event will be created when dropped onto a calendar. - Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system. - */ - class ExternalDraggable { - constructor(el, settings = {}) { - this.handlePointerDown = (ev) => { - let { dragging } = this; - let { minDistance, longPressDelay } = this.settings; - dragging.minDistance = - minDistance != null ? - minDistance : - (ev.isTouch ? 0 : BASE_OPTION_DEFAULTS.eventDragMinDistance); - dragging.delay = - ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv - (longPressDelay != null ? longPressDelay : BASE_OPTION_DEFAULTS.longPressDelay) : - 0; - }; - this.handleDragStart = (ev) => { - if (ev.isTouch && - this.dragging.delay && - ev.subjectEl.classList.contains('fc-event')) { - this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected'); - } - }; - this.settings = settings; - let dragging = this.dragging = new FeaturefulElementDragging(el); - dragging.touchScrollAllowed = false; - if (settings.itemSelector != null) { - dragging.pointer.selector = settings.itemSelector; - } - if (settings.appendTo != null) { - dragging.mirror.parentNode = settings.appendTo; // TODO: write tests - } - dragging.emitter.on('pointerdown', this.handlePointerDown); - dragging.emitter.on('dragstart', this.handleDragStart); - new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new - } - destroy() { - this.dragging.destroy(); - } - } - - /* - Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements. - The third-party system is responsible for drawing the visuals effects of the drag. - This class simply monitors for pointer movements and fires events. - It also has the ability to hide the moving element (the "mirror") during the drag. - */ - class InferredElementDragging extends ElementDragging { - constructor(containerEl) { - super(containerEl); - this.shouldIgnoreMove = false; - this.mirrorSelector = ''; - this.currentMirrorEl = null; - this.handlePointerDown = (ev) => { - this.emitter.trigger('pointerdown', ev); - if (!this.shouldIgnoreMove) { - // fire dragstart right away. does not support delay or min-distance - this.emitter.trigger('dragstart', ev); - } - }; - this.handlePointerMove = (ev) => { - if (!this.shouldIgnoreMove) { - this.emitter.trigger('dragmove', ev); - } - }; - this.handlePointerUp = (ev) => { - this.emitter.trigger('pointerup', ev); - if (!this.shouldIgnoreMove) { - // fire dragend right away. does not support a revert animation - this.emitter.trigger('dragend', ev); - } - }; - let pointer = this.pointer = new PointerDragging(containerEl); - pointer.emitter.on('pointerdown', this.handlePointerDown); - pointer.emitter.on('pointermove', this.handlePointerMove); - pointer.emitter.on('pointerup', this.handlePointerUp); - } - destroy() { - this.pointer.destroy(); - } - setIgnoreMove(bool) { - this.shouldIgnoreMove = bool; - } - setMirrorIsVisible(bool) { - if (bool) { - // restore a previously hidden element. - // use the reference in case the selector class has already been removed. - if (this.currentMirrorEl) { - this.currentMirrorEl.style.visibility = ''; - this.currentMirrorEl = null; - } - } - else { - let mirrorEl = this.mirrorSelector - // TODO: somehow query FullCalendars WITHIN shadow-roots - ? document.querySelector(this.mirrorSelector) - : null; - if (mirrorEl) { - this.currentMirrorEl = mirrorEl; - mirrorEl.style.visibility = 'hidden'; - } - } - } - } - - /* - Bridges third-party drag-n-drop systems with FullCalendar. - Must be instantiated and destroyed by caller. - */ - class ThirdPartyDraggable { - constructor(containerOrSettings, settings) { - let containerEl = document; - if ( - // wish we could just test instanceof EventTarget, but doesn't work in IE11 - containerOrSettings === document || - containerOrSettings instanceof Element) { - containerEl = containerOrSettings; - settings = settings || {}; - } - else { - settings = (containerOrSettings || {}); - } - let dragging = this.dragging = new InferredElementDragging(containerEl); - if (typeof settings.itemSelector === 'string') { - dragging.pointer.selector = settings.itemSelector; - } - else if (containerEl === document) { - dragging.pointer.selector = '[data-event]'; - } - if (typeof settings.mirrorSelector === 'string') { - dragging.mirrorSelector = settings.mirrorSelector; - } - new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new - } - destroy() { - this.dragging.destroy(); - } - } - - var index$3 = createPlugin({ - name: '@fullcalendar/interaction', - componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing], - calendarInteractions: [UnselectAuto], - elementDraggingImpl: FeaturefulElementDragging, - optionRefiners: OPTION_REFINERS$2, - listenerRefiners: LISTENER_REFINERS, - }); - - /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. - ----------------------------------------------------------------------------------------------------------------------*/ - // It is a manager for a Table subcomponent, which does most of the heavy lifting. - // It is responsible for managing width/height. - class TableView extends DateComponent { - constructor() { - super(...arguments); - this.headerElRef = y(); - } - renderSimpleLayout(headerRowContent, bodyContent) { - let { props, context } = this; - let sections = []; - let stickyHeaderDates = getStickyHeaderDates(context.options); - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunk: { - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }, - }); - } - sections.push({ - type: 'body', - key: 'body', - liquid: true, - chunk: { content: bodyContent }, - }); - return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec }, - h(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections }))); - } - renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) { - let ScrollGrid = this.context.pluginHooks.scrollGridImpl; - if (!ScrollGrid) { - throw new Error('No ScrollGrid implementation'); - } - let { props, context } = this; - let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options); - let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options); - let sections = []; - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunks: [{ - key: 'main', - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }], - }); - } - sections.push({ - type: 'body', - key: 'body', - liquid: true, - chunks: [{ - key: 'main', - content: bodyContent, - }], - }); - if (stickyFooterScrollbar) { - sections.push({ - type: 'footer', - key: 'footer', - isSticky: true, - chunks: [{ - key: 'main', - content: renderScrollShim, - }], - }); - } - return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec }, - h(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections }))); - } - } - - function splitSegsByRow(segs, rowCnt) { - let byRow = []; - for (let i = 0; i < rowCnt; i += 1) { - byRow[i] = []; - } - for (let seg of segs) { - byRow[seg.row].push(seg); - } - return byRow; - } - function splitSegsByFirstCol(segs, colCnt) { - let byCol = []; - for (let i = 0; i < colCnt; i += 1) { - byCol[i] = []; - } - for (let seg of segs) { - byCol[seg.firstCol].push(seg); - } - return byCol; - } - function splitInteractionByRow(ui, rowCnt) { - let byRow = []; - if (!ui) { - for (let i = 0; i < rowCnt; i += 1) { - byRow[i] = null; - } - } - else { - for (let i = 0; i < rowCnt; i += 1) { - byRow[i] = { - affectedInstances: ui.affectedInstances, - isEvent: ui.isEvent, - segs: [], - }; - } - for (let seg of ui.segs) { - byRow[seg.row].segs.push(seg); - } - } - return byRow; - } - - const DEFAULT_TABLE_EVENT_TIME_FORMAT = createFormatter({ - hour: 'numeric', - minute: '2-digit', - omitZeroMinute: true, - meridiem: 'narrow', - }); - function hasListItemDisplay(seg) { - let { display } = seg.eventRange.ui; - return display === 'list-item' || (display === 'auto' && - !seg.eventRange.def.allDay && - seg.firstCol === seg.lastCol && // can't be multi-day - seg.isStart && // " - seg.isEnd // " - ); - } - - class TableBlockEvent extends BaseComponent { - render() { - let { props } = this; - return (h(StandardEvent, Object.assign({}, props, { elClasses: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay }))); - } - } - - class TableListItemEvent extends BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let { seg } = props; - let timeFormat = options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT; - let timeText = buildSegTimeText(seg, timeFormat, context, true, props.defaultDisplayEventEnd); - return (h(EventContainer, Object.assign({}, props, { elTag: "a", elClasses: ['fc-daygrid-event', 'fc-daygrid-dot-event'], elAttrs: getSegAnchorAttrs(props.seg, context), defaultGenerator: renderInnerContent$2, timeText: timeText, isResizing: false, isDateSelecting: false }))); - } - } - function renderInnerContent$2(renderProps) { - return (h(p, null, - h("div", { className: "fc-daygrid-event-dot", style: { borderColor: renderProps.borderColor || renderProps.backgroundColor } }), - renderProps.timeText && (h("div", { className: "fc-event-time" }, renderProps.timeText)), - h("div", { className: "fc-event-title" }, renderProps.event.title || h(p, null, "\u00A0")))); - } - - class TableCellMoreLink extends BaseComponent { - constructor() { - super(...arguments); - this.compileSegs = memoize(compileSegs); - } - render() { - let { props } = this; - let { allSegs, invisibleSegs } = this.compileSegs(props.singlePlacements); - return (h(MoreLinkContainer, { elClasses: ['fc-daygrid-more-link'], dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs: allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: () => { - let isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) || - (props.eventResize ? props.eventResize.affectedInstances : null) || - {}; - return (h(p, null, allSegs.map((seg) => { - let instanceId = seg.eventRange.instance.instanceId; - return (h("div", { className: "fc-daygrid-event-harness", key: instanceId, style: { - visibility: isForcedInvisible[instanceId] ? 'hidden' : '', - } }, hasListItemDisplay(seg) ? (h(TableListItemEvent, Object.assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))) : (h(TableBlockEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))))); - }))); - } })); - } - } - function compileSegs(singlePlacements) { - let allSegs = []; - let invisibleSegs = []; - for (let placement of singlePlacements) { - allSegs.push(placement.seg); - if (!placement.isVisible) { - invisibleSegs.push(placement.seg); - } - } - return { allSegs, invisibleSegs }; - } - - const DEFAULT_WEEK_NUM_FORMAT$1 = createFormatter({ week: 'narrow' }); - class TableCell extends DateComponent { - constructor() { - super(...arguments); - this.rootElRef = y(); - this.state = { - dayNumberId: getUniqueDomId(), - }; - this.handleRootEl = (el) => { - setRef(this.rootElRef, el); - setRef(this.props.elRef, el); - }; - } - render() { - let { context, props, state, rootElRef } = this; - let { options } = context; - let { date, dateProfile } = props; - return (h(DayCellContainer, { elTag: "td", elRef: this.handleRootEl, elClasses: [ - 'fc-daygrid-day', - ...(props.extraClassNames || []), - ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.extraDataAttrs), (props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {})), { role: 'gridcell' }), defaultGenerator: renderTopInner, date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraRenderProps: props.extraRenderProps }, (InnerContent, renderProps) => (h("div", { className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref: props.innerElRef }, - props.showWeekNumber && (h(WeekNumberContainer, { elTag: "a", elClasses: ['fc-daygrid-week-number'], elAttrs: buildNavLinkAttrs(context, date, 'week'), date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT$1 })), - Boolean(!renderProps.isDisabled && - (props.showDayNumber || hasCustomDayCellContent(options) || props.forceDayTop)) && (h("div", { className: "fc-daygrid-day-top" }, - h(InnerContent, { elTag: "a", elClasses: ['fc-daygrid-day-number'], elAttrs: Object.assign(Object.assign({}, buildNavLinkAttrs(context, date)), { id: state.dayNumberId }) }))), - h("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, - props.fgContent, - h("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, - h(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))), - h("div", { className: "fc-daygrid-day-bg" }, props.bgContent))))); - } - } - function renderTopInner(props) { - return props.dayNumberText || h(p, null, "\u00A0"); - } - - function computeFgSegPlacement(segs, // assumed already sorted - dayMaxEvents, dayMaxEventRows, strictOrder, eventInstanceHeights, maxContentHeight, cells) { - let hierarchy = new DayGridSegHierarchy(); - hierarchy.allowReslicing = true; - hierarchy.strictOrder = strictOrder; - if (dayMaxEvents === true || dayMaxEventRows === true) { - hierarchy.maxCoord = maxContentHeight; - hierarchy.hiddenConsumes = true; - } - else if (typeof dayMaxEvents === 'number') { - hierarchy.maxStackCnt = dayMaxEvents; - } - else if (typeof dayMaxEventRows === 'number') { - hierarchy.maxStackCnt = dayMaxEventRows; - hierarchy.hiddenConsumes = true; - } - // create segInputs only for segs with known heights - let segInputs = []; - let unknownHeightSegs = []; - for (let i = 0; i < segs.length; i += 1) { - let seg = segs[i]; - let { instanceId } = seg.eventRange.instance; - let eventHeight = eventInstanceHeights[instanceId]; - if (eventHeight != null) { - segInputs.push({ - index: i, - thickness: eventHeight, - span: { - start: seg.firstCol, - end: seg.lastCol + 1, - }, - }); - } - else { - unknownHeightSegs.push(seg); - } - } - let hiddenEntries = hierarchy.addSegs(segInputs); - let segRects = hierarchy.toRects(); - let { singleColPlacements, multiColPlacements, leftoverMargins } = placeRects(segRects, segs, cells); - let moreCnts = []; - let moreMarginTops = []; - // add segs with unknown heights - for (let seg of unknownHeightSegs) { - multiColPlacements[seg.firstCol].push({ - seg, - isVisible: false, - isAbsolute: true, - absoluteTop: 0, - marginTop: 0, - }); - for (let col = seg.firstCol; col <= seg.lastCol; col += 1) { - singleColPlacements[col].push({ - seg: resliceSeg(seg, col, col + 1, cells), - isVisible: false, - isAbsolute: false, - absoluteTop: 0, - marginTop: 0, - }); - } - } - // add the hidden entries - for (let col = 0; col < cells.length; col += 1) { - moreCnts.push(0); - } - for (let hiddenEntry of hiddenEntries) { - let seg = segs[hiddenEntry.index]; - let hiddenSpan = hiddenEntry.span; - multiColPlacements[hiddenSpan.start].push({ - seg: resliceSeg(seg, hiddenSpan.start, hiddenSpan.end, cells), - isVisible: false, - isAbsolute: true, - absoluteTop: 0, - marginTop: 0, - }); - for (let col = hiddenSpan.start; col < hiddenSpan.end; col += 1) { - moreCnts[col] += 1; - singleColPlacements[col].push({ - seg: resliceSeg(seg, col, col + 1, cells), - isVisible: false, - isAbsolute: false, - absoluteTop: 0, - marginTop: 0, - }); - } - } - // deal with leftover margins - for (let col = 0; col < cells.length; col += 1) { - moreMarginTops.push(leftoverMargins[col]); - } - return { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops }; - } - // rects ordered by top coord, then left - function placeRects(allRects, segs, cells) { - let rectsByEachCol = groupRectsByEachCol(allRects, cells.length); - let singleColPlacements = []; - let multiColPlacements = []; - let leftoverMargins = []; - for (let col = 0; col < cells.length; col += 1) { - let rects = rectsByEachCol[col]; - // compute all static segs in singlePlacements - let singlePlacements = []; - let currentHeight = 0; - let currentMarginTop = 0; - for (let rect of rects) { - let seg = segs[rect.index]; - singlePlacements.push({ - seg: resliceSeg(seg, col, col + 1, cells), - isVisible: true, - isAbsolute: false, - absoluteTop: rect.levelCoord, - marginTop: rect.levelCoord - currentHeight, - }); - currentHeight = rect.levelCoord + rect.thickness; - } - // compute mixed static/absolute segs in multiPlacements - let multiPlacements = []; - currentHeight = 0; - currentMarginTop = 0; - for (let rect of rects) { - let seg = segs[rect.index]; - let isAbsolute = rect.span.end - rect.span.start > 1; // multi-column? - let isFirstCol = rect.span.start === col; - currentMarginTop += rect.levelCoord - currentHeight; // amount of space since bottom of previous seg - currentHeight = rect.levelCoord + rect.thickness; // height will now be bottom of current seg - if (isAbsolute) { - currentMarginTop += rect.thickness; - if (isFirstCol) { - multiPlacements.push({ - seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), - isVisible: true, - isAbsolute: true, - absoluteTop: rect.levelCoord, - marginTop: 0, - }); - } - } - else if (isFirstCol) { - multiPlacements.push({ - seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), - isVisible: true, - isAbsolute: false, - absoluteTop: rect.levelCoord, - marginTop: currentMarginTop, // claim the margin - }); - currentMarginTop = 0; - } - } - singleColPlacements.push(singlePlacements); - multiColPlacements.push(multiPlacements); - leftoverMargins.push(currentMarginTop); - } - return { singleColPlacements, multiColPlacements, leftoverMargins }; - } - function groupRectsByEachCol(rects, colCnt) { - let rectsByEachCol = []; - for (let col = 0; col < colCnt; col += 1) { - rectsByEachCol.push([]); - } - for (let rect of rects) { - for (let col = rect.span.start; col < rect.span.end; col += 1) { - rectsByEachCol[col].push(rect); - } - } - return rectsByEachCol; - } - function resliceSeg(seg, spanStart, spanEnd, cells) { - if (seg.firstCol === spanStart && seg.lastCol === spanEnd - 1) { - return seg; - } - let eventRange = seg.eventRange; - let origRange = eventRange.range; - let slicedRange = intersectRanges(origRange, { - start: cells[spanStart].date, - end: addDays(cells[spanEnd - 1].date, 1), - }); - return Object.assign(Object.assign({}, seg), { firstCol: spanStart, lastCol: spanEnd - 1, eventRange: { - def: eventRange.def, - ui: Object.assign(Object.assign({}, eventRange.ui), { durationEditable: false }), - instance: eventRange.instance, - range: slicedRange, - }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }); - } - class DayGridSegHierarchy extends SegHierarchy { - constructor() { - super(...arguments); - // config - this.hiddenConsumes = false; - // allows us to keep hidden entries in the hierarchy so they take up space - this.forceHidden = {}; - } - addSegs(segInputs) { - const hiddenSegs = super.addSegs(segInputs); - const { entriesByLevel } = this; - const excludeHidden = (entry) => !this.forceHidden[buildEntryKey(entry)]; - // remove the forced-hidden segs - for (let level = 0; level < entriesByLevel.length; level += 1) { - entriesByLevel[level] = entriesByLevel[level].filter(excludeHidden); - } - return hiddenSegs; - } - handleInvalidInsertion(insertion, entry, hiddenEntries) { - const { entriesByLevel, forceHidden } = this; - const { touchingEntry, touchingLevel, touchingLateral } = insertion; - if (this.hiddenConsumes && touchingEntry) { - const touchingEntryId = buildEntryKey(touchingEntry); - // if not already hidden - if (!forceHidden[touchingEntryId]) { - if (this.allowReslicing) { - const placeholderEntry = Object.assign(Object.assign({}, touchingEntry), { span: intersectSpans(touchingEntry.span, entry.span) }); - const placeholderEntryId = buildEntryKey(placeholderEntry); - forceHidden[placeholderEntryId] = true; - entriesByLevel[touchingLevel][touchingLateral] = placeholderEntry; // replace touchingEntry with our placeholder - this.splitEntry(touchingEntry, entry, hiddenEntries); // split up the touchingEntry, reinsert it - } - else { - forceHidden[touchingEntryId] = true; - hiddenEntries.push(touchingEntry); - } - } - } - return super.handleInvalidInsertion(insertion, entry, hiddenEntries); - } - } - - class TableRow extends DateComponent { - constructor() { - super(...arguments); - this.cellElRefs = new RefMap(); // the
? - h("tr", { role: "presentation", className: "fc-scrollgrid-section" }, - h("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), - }); - } - sections.push({ - type: 'body', - key: 'body', - liquid: true, - expandRows: Boolean(context.options.expandRows), - chunk: { - scrollerElRef: this.scrollerElRef, - content: timeContent, - }, - }); - return (h(ViewContainer$1, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec }, - h(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: 'shrink' }], sections: sections }))); - } - renderHScrollLayout(headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) { - let ScrollGrid = this.context.pluginHooks.scrollGridImpl; - if (!ScrollGrid) { - throw new Error('No ScrollGrid implementation'); - } - let { context, props } = this; - let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options); - let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options); - let sections = []; - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - syncRowHeights: true, - chunks: [ - { - key: 'axis', - rowContent: (arg) => (h("tr", { role: "presentation" }, this.renderHeadAxis('day', arg.rowSyncHeights[0]))), - }, - { - key: 'cols', - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }, - ], - }); - } - if (allDayContent) { - sections.push({ - type: 'body', - key: 'all-day', - syncRowHeights: true, - chunks: [ - { - key: 'axis', - rowContent: (contentArg) => (h("tr", { role: "presentation" }, this.renderTableRowAxis(contentArg.rowSyncHeights[0]))), - }, - { - key: 'cols', - content: allDayContent, - }, - ], - }); - sections.push({ - key: 'all-day-divider', - type: 'body', - outerContent: ( // TODO: rename to cellContent so don't need to define ? - h("tr", { role: "presentation", className: "fc-scrollgrid-section" }, - h("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), - }); - } - let isNowIndicator = context.options.nowIndicator; - sections.push({ - type: 'body', - key: 'body', - liquid: true, - expandRows: Boolean(context.options.expandRows), - chunks: [ - { - key: 'axis', - content: (arg) => ( - // TODO: make this now-indicator arrow more DRY with TimeColsContent - h("div", { className: "fc-timegrid-axis-chunk" }, - h("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } }, - arg.tableColGroupNode, - h("tbody", null, - h(TimeBodyAxis, { slatMetas: slatMetas }))), - h("div", { className: "fc-timegrid-now-indicator-container" }, - h(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, (nowDate) => { - let nowIndicatorTop = isNowIndicator && - slatCoords && - slatCoords.safeComputeTop(nowDate); // might return void - if (typeof nowIndicatorTop === 'number') { - return (h(NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: nowDate })); - } - return null; - })))), - }, - { - key: 'cols', - scrollerElRef: this.scrollerElRef, - content: timeContent, - }, - ], - }); - if (stickyFooterScrollbar) { - sections.push({ - key: 'footer', - type: 'footer', - isSticky: true, - chunks: [ - { - key: 'axis', - content: renderScrollShim, - }, - { - key: 'cols', - content: renderScrollShim, - }, - ], - }); - } - return (h(ViewContainer$1, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec }, - h(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [ - { width: 'shrink', cols: [{ width: 'shrink' }] }, - { cols: [{ span: colCnt, minWidth: dayMinWidth }] }, - ], sections: sections }))); - } - /* Dimensions - ------------------------------------------------------------------------------------------------------------------*/ - getAllDayMaxEventProps() { - let { dayMaxEvents, dayMaxEventRows } = this.context.options; - if (dayMaxEvents === true || dayMaxEventRows === true) { // is auto? - dayMaxEvents = undefined; - dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; // make sure "auto" goes to a real number - } - return { dayMaxEvents, dayMaxEventRows }; - } - } - function renderAllDayInner$1(renderProps) { - return renderProps.text; - } - - class TimeColsSlatsCoords { - constructor(positions, dateProfile, slotDuration) { - this.positions = positions; - this.dateProfile = dateProfile; - this.slotDuration = slotDuration; - } - safeComputeTop(date) { - let { dateProfile } = this; - if (rangeContainsMarker(dateProfile.currentRange, date)) { - let startOfDayDate = startOfDay(date); - let timeMs = date.valueOf() - startOfDayDate.valueOf(); - if (timeMs >= asRoughMs(dateProfile.slotMinTime) && - timeMs < asRoughMs(dateProfile.slotMaxTime)) { - return this.computeTimeTop(createDuration(timeMs)); - } - } - return null; - } - // Computes the top coordinate, relative to the bounds of the grid, of the given date. - // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. - computeDateTop(when, startOfDayDate) { - if (!startOfDayDate) { - startOfDayDate = startOfDay(when); - } - return this.computeTimeTop(createDuration(when.valueOf() - startOfDayDate.valueOf())); - } - // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). - // This is a makeshify way to compute the time-top. Assumes all slatMetas dates are uniform. - // Eventually allow computation with arbirary slat dates. - computeTimeTop(duration) { - let { positions, dateProfile } = this; - let len = positions.els.length; - // floating-point value of # of slots covered - let slatCoverage = (duration.milliseconds - asRoughMs(dateProfile.slotMinTime)) / asRoughMs(this.slotDuration); - let slatIndex; - let slatRemainder; - // compute a floating-point number for how many slats should be progressed through. - // from 0 to number of slats (inclusive) - // constrained because slotMinTime/slotMaxTime might be customized. - slatCoverage = Math.max(0, slatCoverage); - slatCoverage = Math.min(len, slatCoverage); - // an integer index of the furthest whole slat - // from 0 to number slats (*exclusive*, so len-1) - slatIndex = Math.floor(slatCoverage); - slatIndex = Math.min(slatIndex, len - 1); - // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition. - // could be 1.0 if slatCoverage is covering *all* the slots - slatRemainder = slatCoverage - slatIndex; - return positions.tops[slatIndex] + - positions.getHeight(slatIndex) * slatRemainder; - } - } - - class TimeColsSlatsBody extends BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let { slatElRefs } = props; - return (h("tbody", null, props.slatMetas.map((slatMeta, i) => { - let renderProps = { - time: slatMeta.time, - date: context.dateEnv.toDate(slatMeta.date), - view: context.viewApi, - }; - return (h("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) }, - props.axis && (h(TimeColsAxisCell, Object.assign({}, slatMeta))), - h(ContentContainer, { elTag: "td", elClasses: [ - 'fc-timegrid-slot', - 'fc-timegrid-slot-lane', - !slatMeta.isLabeled && 'fc-timegrid-slot-minor', - ], elAttrs: { - 'data-time': slatMeta.isoTimeStr, - }, renderProps: renderProps, generatorName: "slotLaneContent", generator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }))); - }))); - } - } - - /* - for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. - */ - class TimeColsSlats extends BaseComponent { - constructor() { - super(...arguments); - this.rootElRef = y(); - this.slatElRefs = new RefMap(); - } - render() { - let { props, context } = this; - return (h("div", { ref: this.rootElRef, className: "fc-timegrid-slots" }, - h("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { - minWidth: props.tableMinWidth, - width: props.clientWidth, - height: props.minHeight, - } }, - props.tableColGroupNode /* relies on there only being a single for the axis */, - h(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas })))); - } - componentDidMount() { - this.updateSizing(); - } - componentDidUpdate() { - this.updateSizing(); - } - componentWillUnmount() { - if (this.props.onCoords) { - this.props.onCoords(null); - } - } - updateSizing() { - let { context, props } = this; - if (props.onCoords && - props.clientWidth !== null // means sizing has stabilized - ) { - let rootEl = this.rootElRef.current; - if (rootEl.offsetHeight) { // not hidden by css - props.onCoords(new TimeColsSlatsCoords(new PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true), this.props.dateProfile, context.options.slotDuration)); - } - } - } - } - function collectSlatEls(elMap, slatMetas) { - return slatMetas.map((slatMeta) => elMap[slatMeta.key]); - } - - function splitSegsByCol(segs, colCnt) { - let segsByCol = []; - let i; - for (i = 0; i < colCnt; i += 1) { - segsByCol.push([]); - } - if (segs) { - for (i = 0; i < segs.length; i += 1) { - segsByCol[segs[i].col].push(segs[i]); - } - } - return segsByCol; - } - function splitInteractionByCol(ui, colCnt) { - let byRow = []; - if (!ui) { - for (let i = 0; i < colCnt; i += 1) { - byRow[i] = null; - } - } - else { - for (let i = 0; i < colCnt; i += 1) { - byRow[i] = { - affectedInstances: ui.affectedInstances, - isEvent: ui.isEvent, - segs: [], - }; - } - for (let seg of ui.segs) { - byRow[seg.col].segs.push(seg); - } - } - return byRow; - } - - class TimeColMoreLink extends BaseComponent { - render() { - let { props } = this; - return (h(MoreLinkContainer, { elClasses: ['fc-timegrid-more-link'], elStyle: { - top: props.top, - bottom: props.bottom, - }, allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: () => renderPlainFgSegs(props.hiddenSegs, props), defaultGenerator: renderMoreLinkInner }, (InnerContent) => (h(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-more-link-inner', 'fc-sticky'] })))); - } - } - function renderMoreLinkInner(props) { - return props.shortText; - } - - // segInputs assumed sorted - function buildPositioning(segInputs, strictOrder, maxStackCnt) { - let hierarchy = new SegHierarchy(); - if (strictOrder != null) { - hierarchy.strictOrder = strictOrder; - } - if (maxStackCnt != null) { - hierarchy.maxStackCnt = maxStackCnt; - } - let hiddenEntries = hierarchy.addSegs(segInputs); - let hiddenGroups = groupIntersectingEntries(hiddenEntries); - let web = buildWeb(hierarchy); - web = stretchWeb(web, 1); // all levelCoords/thickness will have 0.0-1.0 - let segRects = webToRects(web); - return { segRects, hiddenGroups }; - } - function buildWeb(hierarchy) { - const { entriesByLevel } = hierarchy; - const buildNode = cacheable((level, lateral) => level + ':' + lateral, (level, lateral) => { - let siblingRange = findNextLevelSegs(hierarchy, level, lateral); - let nextLevelRes = buildNodes(siblingRange, buildNode); - let entry = entriesByLevel[level][lateral]; - return [ - Object.assign(Object.assign({}, entry), { nextLevelNodes: nextLevelRes[0] }), - entry.thickness + nextLevelRes[1], // the pressure builds - ]; - }); - return buildNodes(entriesByLevel.length - ? { level: 0, lateralStart: 0, lateralEnd: entriesByLevel[0].length } - : null, buildNode)[0]; - } - function buildNodes(siblingRange, buildNode) { - if (!siblingRange) { - return [[], 0]; - } - let { level, lateralStart, lateralEnd } = siblingRange; - let lateral = lateralStart; - let pairs = []; - while (lateral < lateralEnd) { - pairs.push(buildNode(level, lateral)); - lateral += 1; - } - pairs.sort(cmpDescPressures); - return [ - pairs.map(extractNode), - pairs[0][1], // first item's pressure - ]; - } - function cmpDescPressures(a, b) { - return b[1] - a[1]; - } - function extractNode(a) { - return a[0]; - } - function findNextLevelSegs(hierarchy, subjectLevel, subjectLateral) { - let { levelCoords, entriesByLevel } = hierarchy; - let subjectEntry = entriesByLevel[subjectLevel][subjectLateral]; - let afterSubject = levelCoords[subjectLevel] + subjectEntry.thickness; - let levelCnt = levelCoords.length; - let level = subjectLevel; - // skip past levels that are too high up - for (; level < levelCnt && levelCoords[level] < afterSubject; level += 1) - ; // do nothing - for (; level < levelCnt; level += 1) { - let entries = entriesByLevel[level]; - let entry; - let searchIndex = binarySearch(entries, subjectEntry.span.start, getEntrySpanEnd); - let lateralStart = searchIndex[0] + searchIndex[1]; // if exact match (which doesn't collide), go to next one - let lateralEnd = lateralStart; - while ( // loop through entries that horizontally intersect - (entry = entries[lateralEnd]) && // but not past the whole seg list - entry.span.start < subjectEntry.span.end) { - lateralEnd += 1; - } - if (lateralStart < lateralEnd) { - return { level, lateralStart, lateralEnd }; - } - } - return null; - } - function stretchWeb(topLevelNodes, totalThickness) { - const stretchNode = cacheable((node, startCoord, prevThickness) => buildEntryKey(node), (node, startCoord, prevThickness) => { - let { nextLevelNodes, thickness } = node; - let allThickness = thickness + prevThickness; - let thicknessFraction = thickness / allThickness; - let endCoord; - let newChildren = []; - if (!nextLevelNodes.length) { - endCoord = totalThickness; - } - else { - for (let childNode of nextLevelNodes) { - if (endCoord === undefined) { - let res = stretchNode(childNode, startCoord, allThickness); - endCoord = res[0]; - newChildren.push(res[1]); - } - else { - let res = stretchNode(childNode, endCoord, 0); - newChildren.push(res[1]); - } - } - } - let newThickness = (endCoord - startCoord) * thicknessFraction; - return [endCoord - newThickness, Object.assign(Object.assign({}, node), { thickness: newThickness, nextLevelNodes: newChildren })]; - }); - return topLevelNodes.map((node) => stretchNode(node, 0, 0)[1]); - } - // not sorted in any particular order - function webToRects(topLevelNodes) { - let rects = []; - const processNode = cacheable((node, levelCoord, stackDepth) => buildEntryKey(node), (node, levelCoord, stackDepth) => { - let rect = Object.assign(Object.assign({}, node), { levelCoord, - stackDepth, stackForward: 0 }); - rects.push(rect); - return (rect.stackForward = processNodes(node.nextLevelNodes, levelCoord + node.thickness, stackDepth + 1) + 1); - }); - function processNodes(nodes, levelCoord, stackDepth) { - let stackForward = 0; - for (let node of nodes) { - stackForward = Math.max(processNode(node, levelCoord, stackDepth), stackForward); - } - return stackForward; - } - processNodes(topLevelNodes, 0, 0); - return rects; // TODO: sort rects by levelCoord to be consistent with toRects? - } - // TODO: move to general util - function cacheable(keyFunc, workFunc) { - const cache = {}; - return (...args) => { - let key = keyFunc(...args); - return (key in cache) - ? cache[key] - : (cache[key] = workFunc(...args)); - }; - } - - function computeSegVCoords(segs, colDate, slatCoords = null, eventMinHeight = 0) { - let vcoords = []; - if (slatCoords) { - for (let i = 0; i < segs.length; i += 1) { - let seg = segs[i]; - let spanStart = slatCoords.computeDateTop(seg.start, colDate); - let spanEnd = Math.max(spanStart + (eventMinHeight || 0), // :( - slatCoords.computeDateTop(seg.end, colDate)); - vcoords.push({ - start: Math.round(spanStart), - end: Math.round(spanEnd), // - }); - } - } - return vcoords; - } - function computeFgSegPlacements(segs, segVCoords, // might not have for every seg - eventOrderStrict, eventMaxStack) { - let segInputs = []; - let dumbSegs = []; // segs without coords - for (let i = 0; i < segs.length; i += 1) { - let vcoords = segVCoords[i]; - if (vcoords) { - segInputs.push({ - index: i, - thickness: 1, - span: vcoords, - }); - } - else { - dumbSegs.push(segs[i]); - } - } - let { segRects, hiddenGroups } = buildPositioning(segInputs, eventOrderStrict, eventMaxStack); - let segPlacements = []; - for (let segRect of segRects) { - segPlacements.push({ - seg: segs[segRect.index], - rect: segRect, - }); - } - for (let dumbSeg of dumbSegs) { - segPlacements.push({ seg: dumbSeg, rect: null }); - } - return { segPlacements, hiddenGroups }; - } - - const DEFAULT_TIME_FORMAT$1 = createFormatter({ - hour: 'numeric', - minute: '2-digit', - meridiem: false, - }); - class TimeColEvent extends BaseComponent { - render() { - return (h(StandardEvent, Object.assign({}, this.props, { elClasses: [ - 'fc-timegrid-event', - 'fc-v-event', - this.props.isShort && 'fc-timegrid-event-short', - ], defaultTimeFormat: DEFAULT_TIME_FORMAT$1 }))); - } - } - - class TimeCol extends BaseComponent { - constructor() { - super(...arguments); - this.sortEventSegs = memoize(sortEventSegs); - } - // TODO: memoize event-placement? - render() { - let { props, context } = this; - let { options } = context; - let isSelectMirror = options.selectMirror; - let mirrorSegs = // yuck - (props.eventDrag && props.eventDrag.segs) || - (props.eventResize && props.eventResize.segs) || - (isSelectMirror && props.dateSelectionSegs) || - []; - let interactionAffectedInstances = // TODO: messy way to compute this - (props.eventDrag && props.eventDrag.affectedInstances) || - (props.eventResize && props.eventResize.affectedInstances) || - {}; - let sortedFgSegs = this.sortEventSegs(props.fgEventSegs, options.eventOrder); - return (h(DayCellContainer, { elTag: "td", elRef: props.elRef, elClasses: [ - 'fc-timegrid-col', - ...(props.extraClassNames || []), - ], elAttrs: Object.assign({ role: 'gridcell' }, props.extraDataAttrs), date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraRenderProps: props.extraRenderProps }, (InnerContent) => (h("div", { className: "fc-timegrid-col-frame" }, - h("div", { className: "fc-timegrid-col-bg" }, - this.renderFillSegs(props.businessHourSegs, 'non-business'), - this.renderFillSegs(props.bgEventSegs, 'bg-event'), - this.renderFillSegs(props.dateSelectionSegs, 'highlight')), - h("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)), - h("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror))), - h("div", { className: "fc-timegrid-now-indicator-container" }, this.renderNowIndicator(props.nowIndicatorSegs)), - hasCustomDayCellContent(options) && (h(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-col-misc'] })))))); - } - renderFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting) { - let { props } = this; - if (props.forPrint) { - return renderPlainFgSegs(sortedFgSegs, props); - } - return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting); - } - renderPositionedFgSegs(segs, // if not mirror, needs to be sorted - segIsInvisible, isDragging, isResizing, isDateSelecting) { - let { eventMaxStack, eventShortHeight, eventOrderStrict, eventMinHeight } = this.context.options; - let { date, slatCoords, eventSelection, todayRange, nowDate } = this.props; - let isMirror = isDragging || isResizing || isDateSelecting; - let segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight); - let { segPlacements, hiddenGroups } = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack); - return (h(p, null, - this.renderHiddenGroups(hiddenGroups, segs), - segPlacements.map((segPlacement) => { - let { seg, rect } = segPlacement; - let instanceId = seg.eventRange.instance.instanceId; - let isVisible = isMirror || Boolean(!segIsInvisible[instanceId] && rect); - let vStyle = computeSegVStyle(rect && rect.span); - let hStyle = (!isMirror && rect) ? this.computeSegHStyle(rect) : { left: 0, right: 0 }; - let isInset = Boolean(rect) && rect.stackForward > 0; - let isShort = Boolean(rect) && (rect.span.end - rect.span.start) < eventShortHeight; // look at other places for this problem - return (h("div", { className: 'fc-timegrid-event-harness' + - (isInset ? ' fc-timegrid-event-harness-inset' : ''), key: instanceId, style: Object.assign(Object.assign({ visibility: isVisible ? '' : 'hidden' }, vStyle), hStyle) }, - h(TimeColEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, isShort: isShort }, getSegMeta(seg, todayRange, nowDate))))); - }))); - } - // will already have eventMinHeight applied because segInputs already had it - renderHiddenGroups(hiddenGroups, segs) { - let { extraDateSpan, dateProfile, todayRange, nowDate, eventSelection, eventDrag, eventResize } = this.props; - return (h(p, null, hiddenGroups.map((hiddenGroup) => { - let positionCss = computeSegVStyle(hiddenGroup.span); - let hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs); - return (h(TimeColMoreLink, { key: buildIsoString(computeEarliestSegStart(hiddenSegs)), hiddenSegs: hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan: extraDateSpan, dateProfile: dateProfile, todayRange: todayRange, nowDate: nowDate, eventSelection: eventSelection, eventDrag: eventDrag, eventResize: eventResize })); - }))); - } - renderFillSegs(segs, fillType) { - let { props, context } = this; - let segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight); // don't assume all populated - let children = segVCoords.map((vcoords, i) => { - let seg = segs[i]; - return (h("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === 'bg-event' ? - h(BgEvent, Object.assign({ seg: seg }, getSegMeta(seg, props.todayRange, props.nowDate))) : - renderFill(fillType))); - }); - return h(p, null, children); - } - renderNowIndicator(segs) { - let { slatCoords, date } = this.props; - if (!slatCoords) { - return null; - } - return segs.map((seg, i) => (h(NowIndicatorContainer - // key doesn't matter. will only ever be one - , { - // key doesn't matter. will only ever be one - key: i, elClasses: ['fc-timegrid-now-indicator-line'], elStyle: { - top: slatCoords.computeDateTop(seg.start, date), - }, isAxis: false, date: date }))); - } - computeSegHStyle(segHCoords) { - let { isRtl, options } = this.context; - let shouldOverlap = options.slotEventOverlap; - let nearCoord = segHCoords.levelCoord; // the left side if LTR. the right side if RTL. floating-point - let farCoord = segHCoords.levelCoord + segHCoords.thickness; // the right side if LTR. the left side if RTL. floating-point - let left; // amount of space from left edge, a fraction of the total width - let right; // amount of space from right edge, a fraction of the total width - if (shouldOverlap) { - // double the width, but don't go beyond the maximum forward coordinate (1.0) - farCoord = Math.min(1, nearCoord + (farCoord - nearCoord) * 2); - } - if (isRtl) { - left = 1 - farCoord; - right = nearCoord; - } - else { - left = nearCoord; - right = 1 - farCoord; - } - let props = { - zIndex: segHCoords.stackDepth + 1, - left: left * 100 + '%', - right: right * 100 + '%', - }; - if (shouldOverlap && !segHCoords.stackForward) { - // add padding to the edge so that forward stacked events don't cover the resizer's icon - props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width - } - return props; - } - } - function renderPlainFgSegs(sortedFgSegs, { todayRange, nowDate, eventSelection, eventDrag, eventResize }) { - let hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) || - (eventResize ? eventResize.affectedInstances : null) || - {}; - return (h(p, null, sortedFgSegs.map((seg) => { - let instanceId = seg.eventRange.instance.instanceId; - return (h("div", { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? 'hidden' : '' } }, - h(TimeColEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, getSegMeta(seg, todayRange, nowDate))))); - }))); - } - function computeSegVStyle(segVCoords) { - if (!segVCoords) { - return { top: '', bottom: '' }; - } - return { - top: segVCoords.start, - bottom: -segVCoords.end, - }; - } - function compileSegsFromEntries(segEntries, allSegs) { - return segEntries.map((segEntry) => allSegs[segEntry.index]); - } - - class TimeColsContent extends BaseComponent { - constructor() { - super(...arguments); - this.splitFgEventSegs = memoize(splitSegsByCol); - this.splitBgEventSegs = memoize(splitSegsByCol); - this.splitBusinessHourSegs = memoize(splitSegsByCol); - this.splitNowIndicatorSegs = memoize(splitSegsByCol); - this.splitDateSelectionSegs = memoize(splitSegsByCol); - this.splitEventDrag = memoize(splitInteractionByCol); - this.splitEventResize = memoize(splitInteractionByCol); - this.rootElRef = y(); - this.cellElRefs = new RefMap(); - } - render() { - let { props, context } = this; - let nowIndicatorTop = context.options.nowIndicator && - props.slatCoords && - props.slatCoords.safeComputeTop(props.nowDate); // might return void - let colCnt = props.cells.length; - let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt); - let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt); - let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt); - let nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt); - let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt); - let eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt); - let eventResizeByRow = this.splitEventResize(props.eventResize, colCnt); - return (h("div", { className: "fc-timegrid-cols", ref: this.rootElRef }, - h("table", { role: "presentation", style: { - minWidth: props.tableMinWidth, - width: props.clientWidth, - } }, - props.tableColGroupNode, - h("tbody", { role: "presentation" }, - h("tr", { role: "row" }, - props.axis && (h("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, - h("div", { className: "fc-timegrid-col-frame" }, - h("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && (h(NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: props.nowDate })))))), - props.cells.map((cell, i) => (h(TimeCol, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraRenderProps: cell.extraRenderProps, 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 })))))))); - } - componentDidMount() { - this.updateCoords(); - } - componentDidUpdate() { - this.updateCoords(); - } - updateCoords() { - let { props } = this; - if (props.onColCoords && - props.clientWidth !== null // means sizing has stabilized - ) { - props.onColCoords(new PositionCache(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.cells), true, // horizontal - false)); - } - } - } - function collectCellEls(elMap, cells) { - return cells.map((cell) => elMap[cell.key]); - } - - /* A component that renders one or more columns of vertical time slots - ----------------------------------------------------------------------------------------------------------------------*/ - class TimeCols extends DateComponent { - constructor() { - super(...arguments); - this.processSlotOptions = memoize(processSlotOptions); - this.state = { - slatCoords: null, - }; - this.handleRootEl = (el) => { - if (el) { - this.context.registerInteractiveComponent(this, { - el, - isHitComboAllowed: this.props.isHitComboAllowed, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; - this.handleScrollRequest = (request) => { - let { onScrollTopRequest } = this.props; - let { slatCoords } = this.state; - if (onScrollTopRequest && slatCoords) { - if (request.time) { - let top = slatCoords.computeTimeTop(request.time); - top = Math.ceil(top); // zoom can give weird floating-point values. rather scroll a little bit further - if (top) { - top += 1; // to overcome top border that slots beyond the first have. looks better - } - onScrollTopRequest(top); - } - return true; - } - return false; - }; - this.handleColCoords = (colCoords) => { - this.colCoords = colCoords; - }; - this.handleSlatCoords = (slatCoords) => { - this.setState({ slatCoords }); - if (this.props.onSlatCoords) { - this.props.onSlatCoords(slatCoords); - } - }; - } - render() { - let { props, state } = this; - return (h("div", { className: "fc-timegrid-body", ref: this.handleRootEl, style: { - // these props are important to give this wrapper correct dimensions for interactions - // TODO: if we set it here, can we avoid giving to inner tables? - width: props.clientWidth, - minWidth: props.tableMinWidth, - } }, - h(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */, onCoords: this.handleSlatCoords }), - h(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint }))); - } - componentDidMount() { - this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); - } - componentDidUpdate(prevProps) { - this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); - } - componentWillUnmount() { - this.scrollResponder.detach(); - } - queryHit(positionLeft, positionTop) { - let { dateEnv, options } = this.context; - let { colCoords } = this; - let { dateProfile } = this.props; - let { slatCoords } = this.state; - let { snapDuration, snapsPerSlot } = this.processSlotOptions(this.props.slotDuration, options.snapDuration); - let colIndex = colCoords.leftToIndex(positionLeft); - let slatIndex = slatCoords.positions.topToIndex(positionTop); - if (colIndex != null && slatIndex != null) { - let cell = this.props.cells[colIndex]; - let slatTop = slatCoords.positions.tops[slatIndex]; - let slatHeight = slatCoords.positions.getHeight(slatIndex); - let partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1 - let localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat - let snapIndex = slatIndex * snapsPerSlot + localSnapIndex; - let dayDate = this.props.cells[colIndex].date; - let time = addDurations(dateProfile.slotMinTime, multiplyDuration(snapDuration, snapIndex)); - let start = dateEnv.add(dayDate, time); - let end = dateEnv.add(start, snapDuration); - return { - dateProfile, - dateSpan: Object.assign({ range: { start, end }, allDay: false }, cell.extraDateSpan), - dayEl: colCoords.els[colIndex], - rect: { - left: colCoords.lefts[colIndex], - right: colCoords.rights[colIndex], - top: slatTop, - bottom: slatTop + slatHeight, - }, - layer: 0, - }; - } - return null; - } - } - function processSlotOptions(slotDuration, snapDurationOverride) { - let snapDuration = snapDurationOverride || slotDuration; - let snapsPerSlot = wholeDivideDurations(slotDuration, snapDuration); - if (snapsPerSlot === null) { - snapDuration = slotDuration; - snapsPerSlot = 1; - // TODO: say warning? - } - return { snapDuration, snapsPerSlot }; - } - - class DayTimeColsSlicer extends Slicer { - sliceRange(range, dayRanges) { - let segs = []; - for (let col = 0; col < dayRanges.length; col += 1) { - let segRange = intersectRanges(range, dayRanges[col]); - if (segRange) { - segs.push({ - start: segRange.start, - end: segRange.end, - isStart: segRange.start.valueOf() === range.start.valueOf(), - isEnd: segRange.end.valueOf() === range.end.valueOf(), - col, - }); - } - } - return segs; - } - } - - class DayTimeCols extends DateComponent { - constructor() { - super(...arguments); - this.buildDayRanges = memoize(buildDayRanges); - this.slicer = new DayTimeColsSlicer(); - this.timeColsRef = y(); - } - render() { - let { props, context } = this; - let { dateProfile, dayTableModel } = props; - let isNowIndicator = context.options.nowIndicator; - let dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv); - // give it the first row of cells - // TODO: would move this further down hierarchy, but sliceNowDate needs it - return (h(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' }, (nowDate, todayRange) => (h(TimeCols, Object.assign({ ref: this.timeColsRef }, this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: isNowIndicator && this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords }))))); - } - } - function buildDayRanges(dayTableModel, dateProfile, dateEnv) { - let ranges = []; - for (let date of dayTableModel.headerDates) { - ranges.push({ - start: dateEnv.add(date, dateProfile.slotMinTime), - end: dateEnv.add(date, dateProfile.slotMaxTime), - }); - } - return ranges; - } - - // potential nice values for the slot-duration and interval-duration - // from largest to smallest - const STOCK_SUB_DURATIONS = [ - { hours: 1 }, - { minutes: 30 }, - { minutes: 15 }, - { seconds: 30 }, - { seconds: 15 }, - ]; - function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) { - let dayStart = new Date(0); - let slatTime = slotMinTime; - let slatIterator = createDuration(0); - let labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration); - let metas = []; - while (asRoughMs(slatTime) < asRoughMs(slotMaxTime)) { - let date = dateEnv.add(dayStart, slatTime); - let isLabeled = wholeDivideDurations(slatIterator, labelInterval) !== null; - metas.push({ - date, - time: slatTime, - key: date.toISOString(), - isoTimeStr: formatIsoTimeString(date), - isLabeled, - }); - slatTime = addDurations(slatTime, slotDuration); - slatIterator = addDurations(slatIterator, slotDuration); - } - return metas; - } - // Computes an automatic value for slotLabelInterval - function computeLabelInterval(slotDuration) { - let i; - let labelInterval; - let slotsPerLabel; - // find the smallest stock label interval that results in more than one slots-per-label - 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; - } - } - return slotDuration; // fall back - } - - class DayTimeColsView extends TimeColsView { - constructor() { - super(...arguments); - this.buildTimeColsModel = memoize(buildTimeColsModel); - this.buildSlatMetas = memoize(buildSlatMetas); - } - render() { - let { options, dateEnv, dateProfileGenerator } = this.context; - let { props } = this; - let { dateProfile } = props; - let dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator); - let splitProps = this.allDaySplitter.splitProps(props); - let slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv); - let { dayMinWidth } = options; - let hasAttachedAxis = !dayMinWidth; - let hasDetachedAxis = dayMinWidth; - let headerContent = options.dayHeaders && (h(DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null })); - let allDayContent = (options.allDaySlot !== false) && ((contentArg) => (h(DayTable, Object.assign({}, splitProps.allDay, { dateProfile: dateProfile, dayTableModel: dayTableModel, 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())))); - let timeGridContent = (contentArg) => (h(DayTimeCols, Object.assign({}, splitProps.timed, { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: this.handleScrollTopRequest }))); - return hasDetachedAxis - ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) - : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); - } - } - function buildTimeColsModel(dateProfile, dateProfileGenerator) { - let daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); - return new DayTableModel(daySeries, false); - } - - const OPTION_REFINERS$1 = { - allDaySlot: Boolean, - }; - - var css_248z$1 = ".fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:\"\\00a0\"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:\"\\00a0-\\00a0\"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}"; - injectStyles(css_248z$1); - - var index$1 = createPlugin({ - name: '@fullcalendar/timegrid', - initialView: 'timeGridWeek', - optionRefiners: OPTION_REFINERS$1, - views: { - timeGrid: { - component: DayTimeColsView, - usesMinMaxTime: true, - allDaySlot: true, - slotDuration: '00:30:00', - slotEventOverlap: true, // a bad name. confused with overlap/constraint system - }, - timeGridDay: { - type: 'timeGrid', - duration: { days: 1 }, - }, - timeGridWeek: { - type: 'timeGrid', - duration: { weeks: 1 }, - }, - }, - }); - - class ListViewHeaderRow extends BaseComponent { - constructor() { - super(...arguments); - this.state = { - textId: getUniqueDomId(), - }; - } - render() { - let { theme, dateEnv, options, viewApi } = this.context; - let { cellId, dayDate, todayRange } = this.props; - let { textId } = this.state; - let dayMeta = getDateMeta(dayDate, todayRange); - // will ever be falsy? - let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ''; - // will ever be falsy? also, BAD NAME "alt" - let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ''; - let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId, - text, - sideText, navLinkAttrs: buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta); - // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too) - return (h(ContentContainer, { elTag: "tr", elClasses: [ - 'fc-list-day', - ...getDayClassNames(dayMeta, theme), - ], elAttrs: { - 'data-date': formatDayString(dayDate), - }, renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => ( // TODO: force-hide top border based on :first-child - h("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, - h(InnerContent, { elTag: "div", elClasses: [ - 'fc-list-day-cushion', - theme.getClass('tableCellShaded'), - ] }))))); - } - } - function renderInnerContent(props) { - return (h(p, null, - props.text && (h("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)), - props.sideText && ( /* not keyboard tabbable */h("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText)))); - } - - const DEFAULT_TIME_FORMAT = createFormatter({ - hour: 'numeric', - minute: '2-digit', - meridiem: 'short', - }); - class ListViewEventRow extends BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props; - let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT; - return (h(EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [ - 'fc-list-event', - seg.eventRange.def.url && 'fc-event-forced-url', - ], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (h(p, null, - buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId), - h("td", { "aria-hidden": true, className: "fc-list-event-graphic" }, - h("span", { className: "fc-list-event-dot", style: { - borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor, - } })), - h(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } }))))); - } - } - function renderEventInnerContent(seg, context) { - let interactiveAttrs = getSegAnchorAttrs(seg, context); - return (h("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title)); - } - function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) { - let { options } = context; - if (options.displayEventTime !== false) { - let eventDef = seg.eventRange.def; - let eventInstance = seg.eventRange.instance; - let doAllDay = false; - let timeText; - if (eventDef.allDay) { - doAllDay = true; - } - else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead? - if (seg.isStart) { - timeText = buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end); - } - else if (seg.isEnd) { - timeText = buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end); - } - else { - doAllDay = true; - } - } - else { - timeText = buildSegTimeText(seg, timeFormat, context); - } - if (doAllDay) { - let renderProps = { - text: context.options.allDayText, - view: context.viewApi, - }; - return (h(ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: { - headers: `${timeHeaderId} ${dateHeaderId}`, - }, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount })); - } - return (h("td", { className: "fc-list-event-time" }, timeText)); - } - return null; - } - function renderAllDayInner(renderProps) { - return renderProps.text; - } - - /* - Responsible for the scroller, and forwarding event-related actions into the "grid". - */ - class ListView extends DateComponent { - constructor() { - super(...arguments); - this.computeDateVars = memoize(computeDateVars); - this.eventStoreToSegs = memoize(this._eventStoreToSegs); - this.state = { - timeHeaderId: getUniqueDomId(), - eventHeaderId: getUniqueDomId(), - dateHeaderIdRoot: getUniqueDomId(), - }; - this.setRootEl = (rootEl) => { - if (rootEl) { - this.context.registerInteractiveComponent(this, { - el: rootEl, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; - } - render() { - let { props, context } = this; - let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile); - let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges); - return (h(ViewContainer$1, { elRef: this.setRootEl, elClasses: [ - 'fc-list', - context.theme.getClass('table'), - context.options.stickyHeaderDates !== false ? - 'fc-list-sticky' : - '', - ], viewSpec: context.viewSpec }, - h(Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ? - this.renderSegList(eventSegs, dayDates) : - this.renderEmptyMessage()))); - } - renderEmptyMessage() { - let { options, viewApi } = this.context; - let renderProps = { - text: options.noEventsText, - view: viewApi, - }; - return (h(ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", generator: options.noEventsContent || renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (h(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] })))); - } - renderSegList(allSegs, dayDates) { - let { theme, options } = this.context; - let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state; - let segsByDay = groupSegsByDay(allSegs); // sparse array - return (h(NowTimer, { unit: "day" }, (nowDate, todayRange) => { - let innerNodes = []; - for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) { - let daySegs = segsByDay[dayIndex]; - if (daySegs) { // sparse array, so might be undefined - let dayStr = formatDayString(dayDates[dayIndex]); - let dateHeaderId = dateHeaderIdRoot + '-' + dayStr; - // append a day header - innerNodes.push(h(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange })); - daySegs = sortEventSegs(daySegs, options.eventOrder); - for (let seg of daySegs) { - innerNodes.push(h(ListViewEventRow, Object.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 (h("table", { className: 'fc-list-table ' + theme.getClass('table') }, - h("thead", null, - h("tr", null, - h("th", { scope: "col", id: timeHeaderId }, options.timeHint), - h("th", { scope: "col", "aria-hidden": true }), - h("th", { scope: "col", id: eventHeaderId }, options.eventHint))), - h("tbody", null, innerNodes))); - })); - } - _eventStoreToSegs(eventStore, eventUiBases, dayRanges) { - return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges); - } - eventRangesToSegs(eventRanges, dayRanges) { - let segs = []; - for (let eventRange of eventRanges) { - segs.push(...this.eventRangeToSegs(eventRange, dayRanges)); - } - return segs; - } - eventRangeToSegs(eventRange, dayRanges) { - let { dateEnv } = this.context; - let { nextDayThreshold } = this.context.options; - let range = eventRange.range; - let allDay = eventRange.def.allDay; - let dayIndex; - let segRange; - let seg; - let segs = []; - for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) { - segRange = intersectRanges(range, dayRanges[dayIndex]); - if (segRange) { - seg = { - component: this, - eventRange, - start: segRange.start, - end: segRange.end, - isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(), - isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(), - dayIndex, - }; - segs.push(seg); - // detect when range won't go fully into the next day, - // and mutate the latest seg to the be the end. - if (!seg.isEnd && !allDay && - dayIndex + 1 < dayRanges.length && - range.end < - dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) { - seg.end = range.end; - seg.isEnd = true; - break; - } - } - } - return segs; - } - } - function renderNoEventsInner(renderProps) { - return renderProps.text; - } - function computeDateVars(dateProfile) { - let dayStart = startOfDay(dateProfile.renderRange.start); - let viewEnd = dateProfile.renderRange.end; - let dayDates = []; - let dayRanges = []; - while (dayStart < viewEnd) { - dayDates.push(dayStart); - dayRanges.push({ - start: dayStart, - end: addDays(dayStart, 1), - }); - dayStart = addDays(dayStart, 1); - } - return { dayDates, dayRanges }; - } - // Returns a sparse array of arrays, segs grouped by their dayIndex - function groupSegsByDay(segs) { - let segsByDay = []; // sparse array - let i; - let seg; - for (i = 0; i < segs.length; i += 1) { - seg = segs[i]; - (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = [])) - .push(seg); - } - return segsByDay; - } - - const OPTION_REFINERS = { - listDayFormat: createFalsableFormatter, - listDaySideFormat: createFalsableFormatter, - noEventsClassNames: identity, - noEventsContent: identity, - noEventsDidMount: identity, - noEventsWillUnmount: identity, - // noEventsText is defined in base options - }; - function createFalsableFormatter(input) { - return input === false ? null : createFormatter(input); - } - - var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}"; - injectStyles(css_248z); - - var index = createPlugin({ - name: '@fullcalendar/list', - optionRefiners: OPTION_REFINERS, - views: { - list: { - component: ListView, - buttonTextKey: 'list', - listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016" - }, - listDay: { - type: 'list', - duration: { days: 1 }, - listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar - }, - listWeek: { - type: 'list', - duration: { weeks: 1 }, - listDayFormat: { weekday: 'long' }, - listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' }, - }, - listMonth: { - type: 'list', - duration: { month: 1 }, - listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have - }, - listYear: { - type: 'list', - duration: { year: 1 }, - listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have - }, - }, - }); - - globalPlugins.push(index$3, index$2, index$1, index); - - exports.Calendar = Calendar; - exports.Draggable = ExternalDraggable; - exports.Internal = internal; - exports.JsonRequestError = JsonRequestError; - exports.ThirdPartyDraggable = ThirdPartyDraggable; - exports.createPlugin = createPlugin; - exports.formatDate = formatDate; - exports.formatRange = formatRange; - exports.globalLocales = globalLocales; - exports.globalPlugins = globalPlugins; - exports.sliceEvents = sliceEvents; - exports.version = version; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/dist/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/dist/index.global.min.js deleted file mode 100644 index 13bdaba6..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/dist/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Standard Bundle v6.0.1 -Docs & License: https://fullcalendar.io/docs/initialize-globals -(c) 2022 Adam Shaw -*/ -var FullCalendar=function(e){"use strict";var t,n,r,i,s,o,a,l={},c=[],d=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function u(e,t){for(var n in t)e[n]=t[n];return e}function h(e){var t=e.parentNode;t&&t.removeChild(e)}function f(e,n,r){var i,s,o,a={};for(o in n)"key"==o?i=n[o]:"ref"==o?s=n[o]:a[o]=n[o];if(arguments.length>2&&(a.children=arguments.length>3?t.call(arguments,2):r),"function"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===a[o]&&(a[o]=e.defaultProps[o]);return g(e,a,i,s,null)}function g(e,t,i,s,o){var a={type:e,props:t,key:i,ref:s,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++r:o};return null==o&&null!=n.vnode&&n.vnode(a),a}function p(e){return e.children}function m(e,t){this.props=e,this.context=t}function v(e,t){if(null==t)return e.__?v(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t0?g(b.type,b.props,b.key,b.ref?b.ref:null,b.__v):b)){if(b.__=n,b.__b=n.__b+1,null===(m=S[h])||m&&b.key==m.key&&b.type===m.type)S[h]=void 0;else for(f=0;f3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),P(f(oe,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}(ie.prototype=new m).__a=function(e){var t=this,n=re(t.__v),r=t.o.get(e);return r[0]++,function(i){var s=function(){t.props.revealOrder?(r.push(i),se(t,e,r)):i()};n?n(s):s()}},ie.prototype.render=function(e){this.u=null,this.o=new Map;var t=S(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},ie.prototype.componentDidUpdate=ie.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){se(e,n,t)}))};var le="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,ce=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,de="undefined"!=typeof document,ue=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};m.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(m.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var he=n.event;function fe(){}function ge(){return this.cancelBubble}function pe(){return this.defaultPrevented}n.event=function(e){return he&&(e=he(e)),e.persist=fe,e.isPropagationStopped=ge,e.isDefaultPrevented=pe,e.nativeEvent=e};var me={configurable:!0,get:function(){return this.class}},ve=n.vnode;n.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var s in r={},n){var o=n[s];de&&"children"===s&&"noscript"===t||"value"===s&&"defaultValue"in n&&null==o||("defaultValue"===s&&"value"in n&&null==n.value?s="value":"download"===s&&!0===o?o="":/ondoubleclick/i.test(s)?s="ondblclick":/^onchange(textarea|input)/i.test(s+t)&&!ue(n.type)?s="oninput":/^onfocus$/i.test(s)?s="onfocusin":/^onblur$/i.test(s)?s="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(s)?s=s.toLowerCase():i&&ce.test(s)?s=s.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===o&&(o=void 0),/^oninput$/i.test(s)&&(s=s.toLowerCase(),r[s]&&(s="oninputCapture")),r[s]=o)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=S(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=S(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,n.class!=n.className&&(me.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",me))}e.$$typeof=le,ve&&ve(e)};var be=n.__r;function ye(e){if(!e||"undefined"==typeof document)return;const t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}n.__r=function(e){be&&be(e),e.__c};class Ee{constructor(e){this.drainedOption=e,this.isRunning=!1,this.isDirty=!1,this.pauseDepths={},this.timeoutId=0}request(e){this.isDirty=!0,this.isPaused()||(this.clearTimeout(),null==e?this.tryDrain():this.timeoutId=setTimeout(this.tryDrain.bind(this),e))}pause(e=""){let{pauseDepths:t}=this;t[e]=(t[e]||0)+1,this.clearTimeout()}resume(e="",t){let{pauseDepths:n}=this;if(e in n){if(t)delete n[e];else{n[e]-=1,n[e]<=0&&delete n[e]}this.tryDrain()}}isPaused(){return Object.keys(this.pauseDepths).length}tryDrain(){if(!this.isRunning&&!this.isPaused()){for(this.isRunning=!0;this.isDirty;)this.isDirty=!1,this.drained();this.isRunning=!1}}clear(){this.clearTimeout(),this.isDirty=!1,this.pauseDepths={}}clearTimeout(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=0)}drained(){this.drainedOption&&this.drainedOption()}}const{hasOwnProperty:Ae}=Object.prototype;function De(e,t){let n={};if(t)for(let r in t){let t=[];for(let i=e.length-1;i>=0;i-=1){let s=e[i][r];if("object"==typeof s&&s)t.unshift(s);else if(void 0!==s){n[r]=s;break}}t.length&&(n[r]=De(t))}for(let t=e.length-1;t>=0;t-=1){let r=e[t];for(let e in r)e in n||(n[e]=r[e])}return n}function Se(e,t){let n={};for(let r in e)t(e[r],r)&&(n[r]=e[r]);return n}function we(e,t){let n={};for(let r in e)n[r]=t(e[r],r);return n}function Ce(e){let t={};for(let n of e)t[n]=!0;return t}function Re(e){let t=[];for(let n in e)t.push(e[n]);return t}function xe(e,t){if(e===t)return!0;for(let n in e)if(Ae.call(e,n)&&!(n in t))return!1;for(let n in t)if(Ae.call(t,n)&&e[n]!==t[n])return!1;return!0}function _e(e,t){let n=[];for(let r in e)Ae.call(e,r)&&(r in t||n.push(r));for(let r in t)Ae.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function Te(e,t,n={}){if(e===t)return!0;for(let r in t)if(!(r in e)||!ke(e[r],t[r],n[r]))return!1;for(let n in e)if(!(n in t))return!1;return!0}function ke(e,t,n){return e===t||!0===n||!!n&&n(e,t)}function Me(e,t=0,n,r=1){let i=[];null==n&&(n=Object.keys(e).length);for(let s=t;s{if(r){if(!xe(r,s)){n&&n(i);let r=e.call(this,s);t&&t(r,i)||(i=r)}}else i=e.call(this,s);return r=s,i}}function Pe(e){e.parentNode&&e.parentNode.removeChild(e)}function He(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 je(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e{let r=He(n.target,e);r&&t.call(r,n,r)}}(n,r);return e.addEventListener(t,i),()=>{e.removeEventListener(t,i)}}const Ye=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function Ze(e,t){let n=r=>{t(r),Ye.forEach(t=>{e.removeEventListener(t,n)})};Ye.forEach(t=>{e.addEventListener(t,n)})}function Xe(e){return Object.assign({onClick:e},Je(e))}function Je(e){return{tabIndex:0,onKeyDown(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}let $e=0;function Ke(){return $e+=1,String($e)}function et(){document.body.classList.add("fc-not-allowed")}function tt(){document.body.classList.remove("fc-not-allowed")}function nt(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",Qe)}function rt(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",Qe)}function it(e){e.addEventListener("contextmenu",Qe)}function st(e){e.removeEventListener("contextmenu",Qe)}function ot(e){let t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;te.replace("$"+n,t||""),e):n}function ht(e,t){return e-t}function ft(e){return e%1==0}function gt(e){let t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}const pt=["sun","mon","tue","wed","thu","fri","sat"];function mt(e,t){let n=Tt(e);return n[2]+=7*t,kt(n)}function vt(e,t){let n=Tt(e);return n[2]+=t,kt(n)}function bt(e,t){let n=Tt(e);return n[6]+=t,kt(n)}function yt(e,t){return Et(e,t)/7}function Et(e,t){return(t.valueOf()-e.valueOf())/864e5}function At(e,t){let n=wt(e),r=wt(t);return{years:0,months:0,days:Math.round(Et(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function Dt(e,t){let n=St(e,t);return null!==n&&n%7==0?n/7:null}function St(e,t){return It(e)===It(t)?Math.round(Et(e,t)):null}function wt(e){return kt([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function Ct(e,t,n,r){let i=kt([t,0,1+Rt(t,n,r)]),s=wt(e),o=Math.round(Et(i,s));return Math.floor(o/7)+1}function Rt(e,t,n){let r=7+t-n;return-((7+kt([e,0,r]).getUTCDay()-t)%7)+r-1}function xt(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function _t(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function Tt(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function kt(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC(...e))}function Mt(e){return!isNaN(e.valueOf())}function It(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}let Ot={};var Nt,Pt;Nt="gregory",Pt=class{getMarkerYear(e){return e.getUTCFullYear()}getMarkerMonth(e){return e.getUTCMonth()}getMarkerDay(e){return e.getUTCDate()}arrayToMarker(e){return kt(e)}markerToArray(e){return Tt(e)}},Ot[Nt]=Pt;const Ht=["years","months","days","milliseconds"],Bt=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function jt(e,t){return"string"==typeof e?function(e){let t=Bt.exec(e);if(t){let e=t[1]?-1:1;return{years:0,months:0,days:e*(t[2]?parseInt(t[2],10):0),milliseconds:e*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?zt(e):"number"==typeof e?zt({[t||"milliseconds"]:e}):null}function zt(e){let t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function Ut(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}}function Lt(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}}function Wt(e){return Ft(e)/864e5}function Ft(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function Vt(e,t){let n=null;for(let r=0;r10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",Zt(t,!0)))),r}function qt(e){return e.toISOString().replace(/T.*$/,"")}function Yt(e){return dt(e.getUTCHours(),2)+":"+dt(e.getUTCMinutes(),2)+":"+dt(e.getUTCSeconds(),2)}function Zt(e,t=!1){let n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),s=Math.round(r%60);return t?`${n+dt(i,2)}:${dt(s,2)}`:`GMT${n}${i}${s?":"+dt(s,2):""}`}const Xt=/^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function Jt(e){let t=Xt.exec(e);if(t){let e=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]?1e3*Number("0."+t[12]):0));if(Mt(e)){let n=null;return t[13]&&(n=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:e,isTimeUnspecified:!t[6],timeZoneOffset:n}}}return null}class $t{constructor(e){let t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new Ot[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.weekTextLong=(null!=e.weekTextLong?e.weekTextLong:e.locale.options.weekTextLong)||this.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}createMarker(e){let t=this.createMarkerMeta(e);return null===t?null:t.marker}createNowMarker(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):kt(xt(new Date))}createMarkerMeta(e){if("string"==typeof e)return this.parse(e);let t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=kt(e)),null!==t&&Mt(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null}parse(e){let t=Jt(e);if(null===t)return null;let{marker:n}=t,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}}getYear(e){return this.calendarSystem.getMarkerYear(e)}getMonth(e){return this.calendarSystem.getMarkerMonth(e)}add(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)}subtract(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)}addYears(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)}addMonths(e,t){let n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)}diffWholeYears(e,t){let{calendarSystem:n}=this;return It(e)===It(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null}diffWholeMonths(e,t){let{calendarSystem:n}=this;return It(e)===It(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null}greatestWholeUnit(e,t){let n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:(n=this.diffWholeMonths(e,t),null!==n?{unit:"month",value:n}:(n=Dt(e,t),null!==n?{unit:"week",value:n}:(n=St(e,t),null!==n?{unit:"day",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t),ft(n)?{unit:"hour",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t),ft(n)?{unit:"minute",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t),ft(n)?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}))))))}countDurationsBetween(e,t,n){let r;return n.years&&(r=this.diffWholeYears(e,t),null!==r)?r/(Wt(n)/365):n.months&&(r=this.diffWholeMonths(e,t),null!==r)?r/function(e){return Wt(e)/30}(n):n.days&&(r=St(e,t),null!==r)?r/Wt(n):(t.valueOf()-e.valueOf())/Ft(n)}startOf(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?wt(e):"hour"===t?function(e){return kt([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return kt([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return kt([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):null}startOfYear(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])}startOfMonth(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])}startOfWeek(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])}computeWeekNumber(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){let r=e.getUTCFullYear(),i=Ct(e,r,t,n);if(i<1)return Ct(e,r-1,t,n);let s=Ct(e,r+1,t,n);return s>=1?Math.min(i,s):i}(e,this.weekDow,this.weekDoy)}format(e,t,n={}){return t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)}formatRange(e,t,n,r={}){return r.isEndExclusive&&(t=bt(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)}formatIso(e,t={}){let n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Qt(e,n,t.omitTime)}timestampToMarker(e){return"local"===this.timeZone?kt(xt(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?kt(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)}offsetForMarker(e){return"local"===this.timeZone?-_t(Tt(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Tt(e)):null}toDate(e,t){return"local"===this.timeZone?_t(Tt(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Tt(e))*60):new Date(e.valueOf()-(t||0))}}class Kt{constructor(e){this.iconOverrideOption&&this.setIconOverride(e[this.iconOverrideOption])}setIconOverride(e){let t,n;if("object"==typeof e&&e){for(n in t=Object.assign({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})}applyIconOverridePrefix(e){let t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e}getClass(e){return this.classes[e]||""}getIconClass(e,t){let n;return n=t&&this.rtlIconClasses&&this.rtlIconClasses[e]||this.iconClasses[e],n?`${this.baseIconClass} ${n}`:""}getCustomButtonIconClass(e){let t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption],t)?`${this.baseIconClass} ${this.applyIconOverridePrefix(t)}`:""}}Kt.prototype.classes={},Kt.prototype.iconClasses={},Kt.prototype.baseIconClass="",Kt.prototype.iconOverridePrefix="";const en={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},tn={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},nn=/\s*([ap])\.?m\.?/i,rn=/,/g,sn=/\s+/g,on=/\u200e/g,an=/UTC|GMT/;class ln{constructor(e){let t={},n={},r=0;for(let i in e)i in en?(n[i]=e[i],r=Math.max(en[i],r)):(t[i]=e[i],i in tn&&(r=Math.max(tn[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=Oe(cn)}format(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)}formatRange(e,t,n,r){let{standardDateProps:i,extendedSettings:s}=this,o=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(It(e)!==It(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!o)return this.format(e,n);let a=o;!(a>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(a=1);let l=this.format(e,n),c=this.format(t,n);if(l===c)return l;let d=cn(function(e,t){let n={};for(let r in e)(!(r in tn)||tn[r]<=t)&&(n[r]=e[r]);return n}(i,a),s,n),u=d(e),h=d(t),f=function(e,t,n,r){let i=0;for(;iZt(e.timeZoneOffset):0===r&&t.week?e=>function(e,t,n,r,i){let s=[];"long"===i?s.push(n):"short"!==i&&"narrow"!==i||s.push(t);"long"!==i&&"short"!==i||s.push(" ");s.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&s.reverse();return s.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week):function(e,t,n){e=Object.assign({},e),t=Object.assign({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";let r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){let t=Object.assign({},e);delete t.minute,r=new Intl.DateTimeFormat(n.locale.codes,t)}return s=>{let o,{marker:a}=s;return o=r&&!a.getUTCMinutes()?r:i,function(e,t,n,r,i){e=e.replace(on,""),"short"===n.timeZoneName&&(e=function(e,t){let n=!1;e=e.replace(an,()=>(n=!0,t)),n||(e+=" "+t);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":Zt(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(rn,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(nn,"").trim():"narrow"===r.meridiem?e=e.replace(nn,(e,t)=>t.toLocaleLowerCase()):"short"===r.meridiem?e=e.replace(nn,(e,t)=>t.toLocaleLowerCase()+"m"):"lowercase"===r.meridiem&&(e=e.replace(nn,e=>e.toLocaleLowerCase()));return e=(e=e.replace(sn," ")).trim()}(o.format(a),s,e,t,n)}}(e,t,n)}function dn(e,t){let n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function un(e,t,n,r){let i=dn(e,n.calendarSystem);return{date:i,start:i,end:t?dn(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}class hn{constructor(e){this.cmdStr=e}format(e,t,n){return t.cmdFormatter(this.cmdStr,un(e,null,t,n))}formatRange(e,t,n,r){return n.cmdFormatter(this.cmdStr,un(e,t,n,r))}}class fn{constructor(e){this.func=e}format(e,t,n){return this.func(un(e,null,t,n))}formatRange(e,t,n,r){return this.func(un(e,t,n,r))}}function gn(e){return"object"==typeof e&&e?new ln(e):"string"==typeof e?new hn(e):"function"==typeof e?new fn(e):null}const pn={navLinkDayClick:wn,navLinkWeekClick:wn,duration:jt,bootstrapFontAwesome:wn,buttonIcons:wn,customButtons:wn,defaultAllDayEventDuration:jt,defaultTimedEventDuration:jt,nextDayThreshold:jt,scrollTime:jt,scrollTimeReset:Boolean,slotMinTime:jt,slotMaxTime:jt,dayPopoverFormat:gn,slotDuration:jt,snapDuration:jt,headerToolbar:wn,footerToolbar:wn,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:gn,dayHeaderClassNames:wn,dayHeaderContent:wn,dayHeaderDidMount:wn,dayHeaderWillUnmount:wn,dayCellClassNames:wn,dayCellContent:wn,dayCellDidMount:wn,dayCellWillUnmount:wn,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:wn,weekNumbers:Boolean,weekNumberClassNames:wn,weekNumberContent:wn,weekNumberDidMount:wn,weekNumberWillUnmount:wn,editable:Boolean,viewClassNames:wn,viewDidMount:wn,viewWillUnmount:wn,nowIndicator:Boolean,nowIndicatorClassNames:wn,nowIndicatorContent:wn,nowIndicatorDidMount:wn,nowIndicatorWillUnmount:wn,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:wn,locale:wn,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:wn,eventOrder:ot,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:wn,contentHeight:wn,direction:String,weekNumberFormat:gn,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:wn,initialDate:wn,now:wn,eventDataTransform:wn,stickyHeaderDates:wn,stickyFooterScrollbar:wn,viewHeight:wn,defaultAllDay:Boolean,eventSourceFailure:wn,eventSourceSuccess:wn,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:wn,eventConstraint:wn,eventAllow:wn,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:wn,eventContent:wn,eventDidMount:wn,eventWillUnmount:wn,selectConstraint:wn,selectOverlap:wn,selectAllow:wn,droppable:Boolean,unselectCancel:String,slotLabelFormat:wn,slotLaneClassNames:wn,slotLaneContent:wn,slotLaneDidMount:wn,slotLaneWillUnmount:wn,slotLabelClassNames:wn,slotLabelContent:wn,slotLabelDidMount:wn,slotLabelWillUnmount:wn,dayMaxEvents:wn,dayMaxEventRows:wn,dayMinWidth:Number,slotLabelInterval:jt,allDayText:String,allDayClassNames:wn,allDayContent:wn,allDayDidMount:wn,allDayWillUnmount:wn,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:gn,rerenderDelay:Number,moreLinkText:wn,moreLinkHint:wn,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:wn,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:jt,hiddenDays:wn,monthMode:Boolean,fixedWeekCount:Boolean,validRange:wn,visibleRange:wn,titleFormat:wn,eventInteractive:Boolean,noEventsText:String,viewHint:wn,navLinkHint:wn,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:wn,moreLinkClassNames:wn,moreLinkContent:wn,moreLinkDidMount:wn,moreLinkWillUnmount:wn,handleCustomRendering:wn,customRenderingMetaMap:wn,customRenderingReplacesEl:Boolean},mn={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},vn={datesSet:wn,eventsSet:wn,eventAdd:wn,eventChange:wn,eventRemove:wn,windowResize:wn,eventClick:wn,eventMouseEnter:wn,eventMouseLeave:wn,select:wn,unselect:wn,loading:wn,_unmount:wn,_beforeprint:wn,_afterprint:wn,_noEventDrop:wn,_noEventResize:wn,_resize:wn,_scrollRequest:wn},bn={buttonText:wn,buttonHints:wn,views:wn,plugins:wn,initialEvents:wn,events:wn,eventSources:wn},yn={headerToolbar:En,footerToolbar:En,buttonText:En,buttonHints:En,buttonIcons:En,dateIncrement:En};function En(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?xe(e,t):e===t}const An={type:String,component:wn,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:wn,usesMinMaxTime:Boolean,classNames:wn,content:wn,didMount:wn,willUnmount:wn};function Dn(e){return De(e,yn)}function Sn(e,t){let n={},r={};for(let r in t)r in e&&(n[r]=t[r](e[r]));for(let n in e)n in t||(r[n]=e[n]);return{refined:n,extra:r}}function wn(e){return e}function Cn(e){e();let t=n.debounceRendering,r=[];for(n.debounceRendering=function(e){r.push(e)},P(f(Rn,{}),document.createElement("div"));r.length;)r.shift()();n.debounceRendering=t}class Rn extends m{render(){return f("div",{})}componentDidMount(){this.setState({})}}function xn(e){let t=function(e,t){var n={__c:t="__cC"+a++,__: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(y)},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(){let e=!this.getChildContext,t=n.apply(this,arguments);if(e){let e=[];this.shouldComponentUpdate=t=>{this.props.value!==t.value&&e.forEach(e=>{e.context=t.value,e.forceUpdate()})},this.sub=t=>{e.push(t);let n=t.componentWillUnmount;t.componentWillUnmount=()=>{e.splice(e.indexOf(t),1),n&&n.call(t)}}}return t},t}class _n{constructor(e,t,n,r){this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=r,this.handleScrollRequest=e=>{this.queuedRequest=Object.assign({},this.queuedRequest||{},e),this.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}detach(){this.emitter.off("_scrollRequest",this.handleScrollRequest)}update(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()}fireInitialScroll(){this.handleScrollRequest({time:this.scrollTime})}drain(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)}}const Tn=xn({});function kn(e,t,n,r,i,s,o,a,l,c,d,u,h){return{dateEnv:i,options:n,pluginHooks:o,emitter:c,dispatch:a,getCurrentData:l,calendarApi:d,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:s,isRtl:"rtl"===n.direction,addResizeHandler(e){c.on("_resize",e)},removeResizeHandler(e){c.off("_resize",e)},createScrollResponder:e=>new _n(e,c,jt(n.scrollTime),n.scrollTimeReset),registerInteractiveComponent:u,unregisterInteractiveComponent:h}}class Mn extends m{shouldComponentUpdate(e,t){return this.debug&&console.log(_e(e,this.props),_e(t,this.state)),!Te(this.props,e,this.propEquality)||!Te(this.state,t,this.stateEquality)}safeSetState(e){Te(this.state,Object.assign(Object.assign({},this.state),e),this.stateEquality)||this.setState(e)}}Mn.addPropsEquality=function(e){let t=Object.create(this.prototype.propEquality);Object.assign(t,e),this.prototype.propEquality=t},Mn.addStateEquality=function(e){let t=Object.create(this.prototype.stateEquality);Object.assign(t,e),this.prototype.stateEquality=t},Mn.contextType=Tn,Mn.prototype.propEquality={},Mn.prototype.stateEquality={};class In extends Mn{}function On(e,t){"function"==typeof e?e(t):e&&(e.current=t)}In.contextType=Tn;class Nn extends In{constructor(){super(...arguments),this.id=Ke(),this.currentDomNodes=[],this.queuedDomNodes=[],this.handleEl=e=>{this.props.elRef&&On(this.props.elRef,e)}}render(){const{props:e,context:t}=this,{options:n}=t,{generator:r,renderProps:s}=e,o=Hn(e);let a,l=[];if(Pn(e.generatorName,n))n.customRenderingReplacesEl&&delete o.elRef;else{const e="function"==typeof r?r(s,f):r;"string"==typeof e||i(e)||Array.isArray(e)?a=e:"object"==typeof e&&("html"in e?o.dangerouslySetInnerHTML={__html:e.html}:"domNodes"in e&&(l=Array.prototype.slice.call(e.domNodes)))}return this.queuedDomNodes=l,f(e.elTag,o,a)}componentDidMount(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentDidUpdate(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentWillUnmount(){this.triggerCustomRendering(!1)}triggerCustomRendering(e){const{props:t,context:n}=this,{handleCustomRendering:r,customRenderingMetaMap:i}=n.options;if(r){const n=null==i?void 0:i[t.generatorName];n&&r(Object.assign({id:this.id,isActive:e,containerEl:this.base,reportNewContainerEl:this.handleEl,generatorMeta:n},t))}}applyQueueudDomNodes(){const{queuedDomNodes:e,currentDomNodes:t}=this,n=this.base;if(!Ie(e,t)){t.forEach(Pe);for(let t of e)n.appendChild(t);this.currentDomNodes=e}}}function Pn(e,t){var n;return Boolean(t.handleCustomRendering&&e&&(null===(n=t.customRenderingMetaMap)||void 0===n?void 0:n[e]))}function Hn(e,t){const n=Object.assign(Object.assign({},e.elAttrs),{ref:e.elRef});return(e.elClasses||t)&&(n.className=(e.elClasses||[]).concat(t||[]).concat(n.className||[]).filter(Boolean).join(" ")),e.elStyle&&(n.style=e.elStyle),n}Nn.addPropsEquality({elClasses:Ie,elStyle:xe,elAttrs:xe,renderProps:xe});const Bn=xn(0);class jn extends m{constructor(){super(...arguments),this.InnerContent=zn.bind(void 0,this)}render(){const{props:e}=this,t=function(e,t){const n="function"==typeof e?e(t):e||[];return"string"==typeof n?[n]:n}(e.classNameGenerator,e.renderProps);if(e.children){const n=Hn(e,t),r=e.children(this.InnerContent,e.renderProps,n);return e.elTag?f(e.elTag,n,r):r}return f(Nn,Object.assign(Object.assign({},e),{elTag:e.elTag||"div",elClasses:(e.elClasses||[]).concat(t),renderId:this.context}))}componentDidMount(){var e,t;null===(t=(e=this.props).didMount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.base}))}componentWillUnmount(){var e,t;null===(t=(e=this.props).willUnmount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.base}))}}function zn(e,t){const n=e.props;return f(Nn,Object.assign({renderProps:n.renderProps,generatorName:n.generatorName,generator:n.generator,renderId:e.context},t))}jn.contextType=Bn;class Un extends In{render(){let{props:e,context:t}=this,{options:n}=t,r={view:t.viewApi};return f(jn,Object.assign({},e,{elTag:e.elTag||"div",elClasses:[...Ln(e.viewSpec),...e.elClasses||[]],renderProps:r,classNameGenerator:n.viewClassNames,generatorName:void 0,generator:void 0,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount}),()=>e.children)}}function Ln(e){return[`fc-${e.type}-view`,"fc-view"]}function Wn(e,t){let n,r,i=[],{start:s}=t;for(e.sort(Fn),n=0;ns&&i.push({start:s,end:r.start}),r.end>s&&(s=r.end);return st.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Yn(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t=Ft(t)&&(r=vt(r,1))}return e.start&&(n=wt(e.start),r&&r<=n&&(r=vt(n,1))),{start:n,end:r}}function Jn(e){let t=Xn(e);return Et(t.start,t.end)>1}function $n(e,t,n,r){return"year"===r?jt(n.diffWholeYears(e,t),"year"):"month"===r?jt(n.diffWholeMonths(e,t),"month"):At(e,t)}function Kn(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}class er{constructor(e){this.props=e,this.nowDate=Kn(e.nowInput,e.dateEnv),this.initHiddenDays()}buildPrev(e,t,n){let{dateEnv:r}=this.props,i=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,-1,n)}buildNext(e,t,n){let{dateEnv:r}=this.props,i=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,1,n)}build(e,t,n=!0){let r,i,s,o,a,l,{props:c}=this;var d,u;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(u=r).start&&d=u.end?new Date(u.end.valueOf()-1):d),i=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(i.unit),o=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,s),o=this.trimHiddenDays(o),a=o,c.showNonCurrentDates||(a=Vn(a,i.range)),a=this.adjustActiveRange(a),a=Vn(a,r),l=Qn(i.range,r),{validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:s,activeRange:a,renderRange:o,slotMinTime:c.slotMinTime,slotMaxTime:c.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(i.duration)}}buildValidRange(){let e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}}buildCurrentRangeInfo(e,t){let n,{props:r}=this,i=null,s=null,o=null;return r.duration?(i=r.duration,s=r.durationUnit,o=this.buildRangeFromDuration(e,t,i,s)):(n=this.props.dayCount)?(s="day",o=this.buildRangeFromDayCount(e,t,n)):(o=this.buildCustomVisibleRange(e))?s=r.dateEnv.greatestWholeUnit(o.start,o.end).unit:(i=this.getFallbackDuration(),s=Gt(i).unit,o=this.buildRangeFromDuration(e,t,i,s)),{duration:i,unit:s,range:o}}getFallbackDuration(){return jt({day:1})}adjustActiveRange(e){let{dateEnv:t,usesMinMaxTime:n,slotMinTime:r,slotMaxTime:i}=this.props,{start:s,end:o}=e;return n&&(Wt(r)<0&&(s=wt(s),s=t.add(s,r)),Wt(i)>1&&(o=wt(o),o=vt(o,-1),o=t.add(o,i))),{start:s,end:o}}buildRangeFromDuration(e,t,n,r){let i,s,o,{dateEnv:a,dateAlignment:l}=this.props;if(!l){let{dateIncrement:e}=this.props;l=e&&Ft(e)!o[e.defId].recurringDef);for(let e in o){let n=o[e];if(n.recurringDef){let{duration:o}=n.recurringDef;o||(o=n.allDay?s.defaultAllDayEventDuration:s.defaultTimedEventDuration);let l=rr(n,o,t,r,i.recurringTypes);for(let t of l){let n=tr(e,{start:t,end:r.add(t,o)});a[n.instanceId]=n}}}return{defs:o,instances:a}}function rr(e,t,n,r,i){let s=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(s=s.map(wt)),s}const ir={id:String,groupId:String,title:String,url:String,interactive:Boolean},sr={start:wn,end:wn,date:wn,allDay:Boolean},or=Object.assign(Object.assign(Object.assign({},ir),sr),{extendedProps:wn});function ar(e,t,n,r,i=cr(n)){let{refined:s,extra:o}=lr(e,n,i),a=function(e,t){let n=null;e&&(n=e.defaultAllDay);null==n&&(n=t.options.defaultAllDay);return n}(t,n),l=function(e,t,n,r){for(let i=0;i{return n=t,r=e,Boolean(n.groupId&&n.groupId===r.groupId);var n,r});return r.defs[t.defId]=t,r.instances[n.instanceId]=n,r}return{defs:{},instances:{}}}function gr(){return{defs:{},instances:{}}}function pr(e,t){return{defs:Object.assign(Object.assign({},e.defs),t.defs),instances:Object.assign(Object.assign({},e.instances),t.instances)}}function mr(e,t){let n=Se(e.defs,t),r=Se(e.instances,e=>n[e.defId]);return{defs:n,instances:r}}function vr(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}const br={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:wn,overlap:wn,allow:wn,className:vr,classNames:vr,color:String,backgroundColor:String,borderColor:String,textColor:String},yr={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Er(e,t){let n=function(e,t){return Array.isArray(e)?ur(e,null,t,!0):"object"==typeof e&&e?ur([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function Ar(e){return e.reduce(Dr,yr)}function Dr(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}const Sr={id:String,defaultAllDay:Boolean,url:String,format:String,events:wn,eventDataTransform:wn,success:wn,failure:wn};function wr(e,t,n=Cr(t)){let r;if("string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){let{refined:i,extra:s}=Sn(r,n),o=function(e,t){let n=t.pluginHooks.eventSourceDefs;for(let t=n.length-1;t>=0;t-=1){let r=n[t].parseMeta(e);if(r)return{sourceDefId:t,meta:r}}return null}(i,t);if(o)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:Ke(),sourceDefId:o.sourceDefId,meta:o.meta,ui:Er(i,t),extendedProps:s}}return null}function Cr(e){return Object.assign(Object.assign(Object.assign({},br),Sr),e.pluginHooks.eventSourceRefiners)}function Rr(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,s){if(t&&n===t.latestFetchId){let n=ur(function(e,t,n){let r=n.options.eventDataTransform,i=t?t.eventDataTransform:null;i&&(e=xr(e,i));r&&(e=xr(e,r));return e}(i,t,s),t,s);return r&&(n=nr(n,r,s)),pr(_r(e,t.sourceId),n)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=nr(t,n,r));return pr(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return pr(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?nr(e,r.activeRange,i):e;case"REMOVE_EVENTS":return function(e,t){let{defs:n,instances:r}=e,i={},s={};for(let e in n)t.defs[e]||(i[e]=n[e]);for(let e in r)!t.instances[e]&&i[r[e].defId]&&(s[e]=r[e]);return{defs:i,instances:s}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return _r(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return mr(e,e=>!e.sourceId);case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function xr(e,t){let n;if(t){n=[];for(let r of e){let e=t(r);e?n.push(e):null==e&&n.push(r)}}else n=e;return n}function _r(e,t){return mr(e,e=>e.sourceId!==t)}class Tr{constructor(){this.handlers={},this.thisContext=null}setThisContext(e){this.thisContext=e}setOptions(e){this.options=e}on(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)}off(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter(e=>e!==n)):delete e[t]}(this.handlers,e,t)}trigger(e,...t){let n=this.handlers[e]||[],r=this.options&&this.options[e],i=[].concat(r||[],n);for(let e of i)e.apply(this.thisContext,t)}hasHandlers(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])}}const kr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function Mr(e,t){return ur(function(e){let t;t=!0===e?[{}]:Array.isArray(e)?e.filter(e=>e.daysOfWeek):"object"==typeof e&&e?[e]:[];return t=t.map(e=>Object.assign(Object.assign({},kr),e)),t}(e),null,t)}function Ir(e,t,n){n.emitter.trigger("select",Object.assign(Object.assign({},Or(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function Or(e,t){let n={};for(let r of t.pluginHooks.dateSpanTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,i=t.dateEnv,Object.assign(Object.assign({},ai(r.range,i,r.allDay)),{allDay:r.allDay}))),n}function Nr(e,t,n){let{dateEnv:r,options:i}=n,s=t;return e?(s=wt(s),s=r.add(s,i.defaultAllDayEventDuration)):s=r.add(s,i.defaultTimedEventDuration),s}function Pr(e,t,n,r){let i=Gr(e.defs,t),s={defs:{},instances:{}};for(let t in e.defs){let o=e.defs[t];s.defs[t]=Hr(o,i[t],n,r)}for(let t in e.instances){let o=e.instances[t],a=s.defs[o.defId];s.instances[t]=Br(o,a,i[o.defId],n,r)}return s}function Hr(e,t,n,r){let i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);let s=Object.assign(Object.assign(Object.assign({},e),i),{ui:Object.assign(Object.assign({},e.ui),i.ui)});n.extendedProps&&(s.extendedProps=Object.assign(Object.assign({},s.extendedProps),n.extendedProps));for(let e of r.pluginHooks.eventDefMutationAppliers)e(s,n,r);return!s.hasEnd&&r.options.forceEventDuration&&(s.hasEnd=!0),s}function Br(e,t,n,r,i){let{dateEnv:s}=i,o=r.standardProps&&!0===r.standardProps.allDay,a=r.standardProps&&!1===r.standardProps.hasEnd,l=Object.assign({},e);return o&&(l.range=Zn(l.range)),r.datesDelta&&n.startEditable&&(l.range={start:s.add(l.range.start,r.datesDelta),end:s.add(l.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(l.range={start:s.add(l.range.start,r.startDelta),end:l.range.end}),r.endDelta&&n.durationEditable&&(l.range={start:l.range.start,end:s.add(l.range.end,r.endDelta)}),a&&(l.range={start:l.range.start,end:Nr(t.allDay,l.range.start,i)}),t.allDay&&(l.range={start:wt(l.range.start),end:wt(l.range.end)}),l.range.endQr(e,t))}function Qr(e,t){let n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),Ar(n)}function qr(e,t){let n=e.map(Yr);return n.sort((e,n)=>at(e,n,t)),n.map(e=>e._seg)}function Yr(e){let{eventRange:t}=e,n=t.def,r=t.instance?t.instance.range:t.range,i=r.start?r.start.valueOf():0,s=r.end?r.end.valueOf():0;return Object.assign(Object.assign(Object.assign({},n.extendedProps),n),{id:n.publicId,start:i,end:s,duration:s-i,allDay:Number(n.allDay),_seg:e})}function Zr(e,t){let{pluginHooks:n}=t,r=n.isDraggableTransformers,{def:i,ui:s}=e.eventRange,o=s.startEditable;for(let e of r)o=e(o,i,s,t);return o}function Xr(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function Jr(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function $r(e,t,n,r,i,s,o){let{dateEnv:a,options:l}=n,{displayEventTime:c,displayEventEnd:d}=l,u=e.eventRange.def,h=e.eventRange.instance;null==c&&(c=!1!==r),null==d&&(d=!1!==i);let f=h.range.start,g=h.range.end,p=s||e.start||e.eventRange.range.start,m=o||e.end||e.eventRange.range.end,v=wt(f).valueOf()===wt(p).valueOf(),b=wt(bt(g,-1)).valueOf()===wt(bt(m,-1)).valueOf();return c&&!u.allDay&&(v||b)?(p=v?f:p,m=b?g:m,d&&u.hasEnd?a.formatRange(p,m,t,{forcedStartTzo:s?null:h.forcedStartTzo,forcedEndTzo:o?null:h.forcedEndTzo}):a.format(p,t,{forcedTzo:s?null:h.forcedStartTzo})):""}function Kr(e,t,n){let r=e.eventRange.range;return{isPast:r.end<(n||t.start),isFuture:r.start>=(n||t.end),isToday:t&&Yn(t,r.start)}}function ei(e){let 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 ti(e){return e.instance?e.instance.instanceId:`${e.def.defId}:${e.range.start.toISOString()}`}function ni(e,t){let{def:n,instance:r}=e.eventRange,{url:i}=n;if(i)return{href:i};let{emitter:s,options:o}=t,{eventInteractive:a}=o;return null==a&&(a=n.interactive,null==a&&(a=Boolean(s.hasHandlers("eventClick")))),a?Je(e=>{s.trigger("eventClick",{el:e.target,event:new zr(t,n,r),jsEvent:e,view:t.viewApi})}):{}}const ri={start:wn,end:wn,allDay:Boolean};function ii(e,t,n){let r=function(e,t){let{refined:n,extra:r}=Sn(e,ri),i=n.start?t.createMarkerMeta(n.start):null,s=n.end?t.createMarkerMeta(n.end):null,{allDay:o}=n;null==o&&(o=i&&i.isTimeUnspecified&&(!s||s.isTimeUnspecified));return Object.assign({range:{start:i?i.marker:null,end:s?s.marker:null},allDay:o},r)}(e,t),{range:i}=r;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function si(e,t){return Gn(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(let n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}(e,t)}function oi(e,t,n){return Object.assign(Object.assign({},ai(e,t,n)),{timeZone:t.timeZone})}function ai(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 li(e,t,n){let r=!1,i=function(e){r||(r=!0,t(e))},s=function(e){r||(r=!0,n(e))},o=e(i,s);o&&"function"==typeof o.then&&o.then(i,s)}class ci extends Error{constructor(e,t){super(e),this.response=t}}function di(e,t,n){const r={method:e=e.toUpperCase()};return"GET"===e?t+=(-1===t.indexOf("?")?"?":"&")+new URLSearchParams(n):(r.body=new URLSearchParams(n),r.headers={"Content-Type":"application/x-www-form-urlencoded"}),fetch(t,r).then(e=>{if(e.ok)return e.json().then(t=>[t,e],()=>{throw new ci("Failure parsing JSON",e)});throw new ci("Request failed",e)})}let ui;function hi(){return null==ui&&(ui=function(){if("undefined"==typeof document)return!0;let e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.innerHTML="
/ elements with colspans. - SOLUTION: making individual
- this.frameElRefs = new RefMap(); // the fc-daygrid-day-frame - this.fgElRefs = new RefMap(); // the fc-daygrid-day-events - this.segHarnessRefs = new RefMap(); // indexed by "instanceId:firstCol" - this.rootElRef = y(); - this.state = { - framePositions: null, - maxContentHeight: null, - eventInstanceHeights: {}, - }; - this.handleResize = (isForced) => { - if (isForced) { - this.updateSizing(true); // isExternal=true - } - }; - } - render() { - let { props, state, context } = this; - let { options } = context; - let colCnt = props.cells.length; - let businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt); - let bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt); - let highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt); - let mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt); - let { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops } = computeFgSegPlacement(sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.eventInstanceHeights, state.maxContentHeight, props.cells); - let isForcedInvisible = // TODO: messy way to compute this - (props.eventDrag && props.eventDrag.affectedInstances) || - (props.eventResize && props.eventResize.affectedInstances) || - {}; - return (h("tr", { ref: this.rootElRef, role: "row" }, - props.renderIntro && props.renderIntro(), - props.cells.map((cell, col) => { - let normalFgNodes = this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible); - let mirrorFgNodes = this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); - return (h(TableCell, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), innerElRef: this.frameElRefs.createRef(cell.key) /* FF 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, extraRenderProps: cell.extraRenderProps, 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 - h(p, null, - h(p, null, normalFgNodes), - h(p, null, mirrorFgNodes))), bgContent: ( // Fragment scopes the keys - h(p, null, - this.renderFillSegs(highlightSegsByCol[col], 'highlight'), - this.renderFillSegs(businessHoursByCol[col], 'non-business'), - this.renderFillSegs(bgEventSegsByCol[col], 'bg-event'))) })); - }))); - } - componentDidMount() { - this.updateSizing(true); - this.context.addResizeHandler(this.handleResize); - } - componentDidUpdate(prevProps, prevState) { - let currentProps = this.props; - this.updateSizing(!isPropsEqual(prevProps, currentProps)); - } - componentWillUnmount() { - this.context.removeResizeHandler(this.handleResize); - } - getHighlightSegs() { - let { props } = this; - if (props.eventDrag && props.eventDrag.segs.length) { // messy check - return props.eventDrag.segs; - } - if (props.eventResize && props.eventResize.segs.length) { // messy check - return props.eventResize.segs; - } - return props.dateSelectionSegs; - } - getMirrorSegs() { - let { props } = this; - if (props.eventResize && props.eventResize.segs.length) { // messy check - return props.eventResize.segs; - } - return []; - } - renderFgSegs(col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) { - let { context } = this; - let { eventSelection } = this.props; - let { framePositions } = this.state; - let defaultDisplayEventEnd = this.props.cells.length === 1; // colCnt === 1 - let isMirror = isDragging || isResizing || isDateSelecting; - let nodes = []; - if (framePositions) { - for (let placement of segPlacements) { - let { seg } = placement; - let { instanceId } = seg.eventRange.instance; - let key = instanceId + ':' + col; - let isVisible = placement.isVisible && !isForcedInvisible[instanceId]; - let isAbsolute = placement.isAbsolute; - let left = ''; - let right = ''; - if (isAbsolute) { - if (context.isRtl) { - right = 0; - left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]; - } - else { - left = 0; - right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol]; - } - } - /* - known bug: events that are force to be list-item but span multiple days still take up space in later columns - todo: in print view, for multi-day events, don't display title within non-start/end segs - */ - nodes.push(h("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: { - visibility: isVisible ? '' : 'hidden', - marginTop: isAbsolute ? '' : placement.marginTop, - top: isAbsolute ? placement.absoluteTop : '', - left, - right, - } }, hasListItemDisplay(seg) ? (h(TableListItemEvent, Object.assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))) : (h(TableBlockEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))))); - } - } - return nodes; - } - renderFillSegs(segs, fillType) { - let { isRtl } = this.context; - let { todayRange } = this.props; - let { framePositions } = this.state; - let nodes = []; - if (framePositions) { - for (let seg of segs) { - let leftRightCss = isRtl ? { - right: 0, - left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol], - } : { - left: 0, - right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol], - }; - nodes.push(h("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === 'bg-event' ? - h(BgEvent, Object.assign({ seg: seg }, getSegMeta(seg, todayRange))) : - renderFill(fillType))); - } - } - return h(p, {}, ...nodes); - } - updateSizing(isExternalSizingChange) { - let { props, frameElRefs } = this; - if (!props.forPrint && - props.clientWidth !== null // positioning ready? - ) { - if (isExternalSizingChange) { - let frameEls = props.cells.map((cell) => frameElRefs.currentMap[cell.key]); - if (frameEls.length) { - let originEl = this.rootElRef.current; - this.setState({ - framePositions: new PositionCache(originEl, frameEls, true, // isHorizontal - false), - }); - } - } - const oldInstanceHeights = this.state.eventInstanceHeights; - const newInstanceHeights = this.queryEventInstanceHeights(); - const limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true; - this.safeSetState({ - // 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: Object.assign(Object.assign({}, oldInstanceHeights), newInstanceHeights), - maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null, - }); - } - } - queryEventInstanceHeights() { - let segElMap = this.segHarnessRefs.currentMap; - let eventInstanceHeights = {}; - // get the max height amongst instance segs - for (let key in segElMap) { - let height = Math.round(segElMap[key].getBoundingClientRect().height); - let instanceId = key.split(':')[0]; // deconstruct how renderFgSegs makes the key - eventInstanceHeights[instanceId] = Math.max(eventInstanceHeights[instanceId] || 0, height); - } - return eventInstanceHeights; - } - computeMaxContentHeight() { - let firstKey = this.props.cells[0].key; - let cellEl = this.cellElRefs.currentMap[firstKey]; - let fcContainerEl = this.fgElRefs.currentMap[firstKey]; - return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top; - } - getCellEls() { - let elMap = this.cellElRefs.currentMap; - return this.props.cells.map((cell) => elMap[cell.key]); - } - } - TableRow.addStateEquality({ - eventInstanceHeights: isPropsEqual, - }); - function buildMirrorPlacements(mirrorSegs, colPlacements) { - if (!mirrorSegs.length) { - return []; - } - let topsByInstanceId = buildAbsoluteTopHash(colPlacements); // TODO: cache this at first render? - return mirrorSegs.map((seg) => ({ - seg, - isVisible: true, - isAbsolute: true, - absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId], - marginTop: 0, - })); - } - function buildAbsoluteTopHash(colPlacements) { - let topsByInstanceId = {}; - for (let placements of colPlacements) { - for (let placement of placements) { - topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop; - } - } - return topsByInstanceId; - } - - class Table extends DateComponent { - constructor() { - super(...arguments); - this.splitBusinessHourSegs = memoize(splitSegsByRow); - this.splitBgEventSegs = memoize(splitSegsByRow); - this.splitFgEventSegs = memoize(splitSegsByRow); - this.splitDateSelectionSegs = memoize(splitSegsByRow); - this.splitEventDrag = memoize(splitInteractionByRow); - this.splitEventResize = memoize(splitInteractionByRow); - this.rowRefs = new RefMap(); - this.handleRootEl = (rootEl) => { - this.rootEl = rootEl; - if (rootEl) { - this.context.registerInteractiveComponent(this, { - el: rootEl, - isHitComboAllowed: this.props.isHitComboAllowed, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; - } - render() { - let { props } = this; - let { dateProfile, dayMaxEventRows, dayMaxEvents, expandRows } = props; - let rowCnt = props.cells.length; - let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt); - let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt); - let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt); - let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt); - let eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt); - let eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt); - let limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; - // if rows can't expand to fill fixed height, can't do balanced-height event limit - // TODO: best place to normalize these options? - if (limitViaBalanced && !expandRows) { - limitViaBalanced = false; - dayMaxEventRows = null; - dayMaxEvents = null; - } - let classNames = [ - 'fc-daygrid-body', - limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced', - expandRows ? '' : 'fc-daygrid-body-natural', // will height of one row depend on the others? - ]; - return (h("div", { className: classNames.join(' '), ref: this.handleRootEl, style: { - // these props are important to give this wrapper correct dimensions for interactions - // TODO: if we set it here, can we avoid giving to inner tables? - width: props.clientWidth, - minWidth: props.tableMinWidth, - } }, - h(NowTimer, { unit: "day" }, (nowDate, todayRange) => (h(p, null, - h("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: { - width: props.clientWidth, - minWidth: props.tableMinWidth, - height: expandRows ? props.clientHeight : '', - } }, - props.colGroupNode, - h("tbody", { role: "presentation" }, props.cells.map((cells, row) => (h(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 })))))))))); - } - // Hit System - // ---------------------------------------------------------------------------------------------------- - prepareHits() { - this.rowPositions = new PositionCache(this.rootEl, this.rowRefs.collect().map((rowObj) => rowObj.getCellEls()[0]), // first cell el in each row. TODO: not optimal - false, true); - this.colPositions = new PositionCache(this.rootEl, this.rowRefs.currentMap[0].getCellEls(), // cell els in first row - true, // horizontal - false); - } - queryHit(positionLeft, positionTop) { - let { colPositions, rowPositions } = this; - let col = colPositions.leftToIndex(positionLeft); - let row = rowPositions.topToIndex(positionTop); - if (row != null && col != null) { - let cell = this.props.cells[row][col]; - return { - dateProfile: this.props.dateProfile, - dateSpan: Object.assign({ range: this.getCellRange(row, col), allDay: true }, cell.extraDateSpan), - dayEl: this.getCellEl(row, col), - rect: { - left: colPositions.lefts[col], - right: colPositions.rights[col], - top: rowPositions.tops[row], - bottom: rowPositions.bottoms[row], - }, - layer: 0, - }; - } - return null; - } - getCellEl(row, col) { - return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO: not optimal - } - getCellRange(row, col) { - let start = this.props.cells[row][col].date; - let end = addDays(start, 1); - return { start, end }; - } - } - function isSegAllDay(seg) { - return seg.eventRange.def.allDay; - } - - class DayTableSlicer extends Slicer { - constructor() { - super(...arguments); - this.forceDayIfListItem = true; - } - sliceRange(dateRange, dayTableModel) { - return dayTableModel.sliceRange(dateRange); - } - } - - class DayTable extends DateComponent { - constructor() { - super(...arguments); - this.slicer = new DayTableSlicer(); - this.tableRef = y(); - } - render() { - let { props, context } = this; - return (h(Table, Object.assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, 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, forPrint: props.forPrint }))); - } - } - - class DayTableView extends TableView { - constructor() { - super(...arguments); - this.buildDayTableModel = memoize(buildDayTableModel); - this.headerRef = y(); - this.tableRef = y(); - } - render() { - let { options, dateProfileGenerator } = this.context; - let { props } = this; - let dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator); - let headerContent = options.dayHeaders && (h(DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 })); - let bodyContent = (contentArg) => (h(DayTable, { ref: this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, 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, dayTableModel.colCnt, options.dayMinWidth) - : this.renderSimpleLayout(headerContent, bodyContent); - } - } - function buildDayTableModel(dateProfile, dateProfileGenerator) { - let daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); - return new DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); - } - - class TableDateProfileGenerator extends DateProfileGenerator { - // Computes the date range that will be rendered. - buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) { - let { dateEnv } = this.props; - let renderRange = super.buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay); - let start = renderRange.start; - let end = renderRange.end; - let endOfWeek; - // year and month views should be aligned with weeks. this is already done for week - if (/^(year|month)$/.test(currentRangeUnit)) { - start = dateEnv.startOfWeek(start); - // make end-of-week if not already - endOfWeek = dateEnv.startOfWeek(end); - if (endOfWeek.valueOf() !== end.valueOf()) { - end = addWeeks(endOfWeek, 1); - } - } - // ensure 6 weeks - if (this.props.monthMode && - this.props.fixedWeekCount) { - let rowCnt = Math.ceil(// could be partial weeks due to hiddenDays - diffWeeks(start, end)); - end = addWeeks(end, 6 - rowCnt); - } - return { start, end }; - } - } - - var css_248z$2 = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}"; - injectStyles(css_248z$2); - - var index$2 = createPlugin({ - name: '@fullcalendar/daygrid', - initialView: 'dayGridMonth', - views: { - dayGrid: { - component: DayTableView, - dateProfileGeneratorClass: TableDateProfileGenerator, - }, - dayGridDay: { - type: 'dayGrid', - duration: { days: 1 }, - }, - dayGridWeek: { - type: 'dayGrid', - duration: { weeks: 1 }, - }, - dayGridMonth: { - type: 'dayGrid', - duration: { months: 1 }, - monthMode: true, - fixedWeekCount: true, - }, - }, - }); - - class AllDaySplitter extends Splitter { - getKeyInfo() { - return { - allDay: {}, - timed: {}, - }; - } - getKeysForDateSpan(dateSpan) { - if (dateSpan.allDay) { - return ['allDay']; - } - return ['timed']; - } - getKeysForEventDef(eventDef) { - if (!eventDef.allDay) { - return ['timed']; - } - if (hasBgRendering(eventDef)) { - return ['timed', 'allDay']; - } - return ['allDay']; - } - } - - const DEFAULT_SLAT_LABEL_FORMAT = createFormatter({ - hour: 'numeric', - minute: '2-digit', - omitZeroMinute: true, - meridiem: 'short', - }); - function TimeColsAxisCell(props) { - let classNames = [ - 'fc-timegrid-slot', - 'fc-timegrid-slot-label', - props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor', - ]; - return (h(ViewContextType.Consumer, null, (context) => { - if (!props.isLabeled) { - return (h("td", { className: classNames.join(' '), "data-time": props.isoTimeStr })); - } - let { dateEnv, options, viewApi } = context; - let labelFormat = // TODO: fully pre-parse - options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT : - Array.isArray(options.slotLabelFormat) ? createFormatter(options.slotLabelFormat[0]) : - createFormatter(options.slotLabelFormat); - let renderProps = { - level: 0, - time: props.time, - date: dateEnv.toDate(props.date), - view: viewApi, - text: dateEnv.format(props.date, labelFormat), - }; - return (h(ContentContainer, { elTag: "td", elClasses: classNames, elAttrs: { - 'data-time': props.isoTimeStr, - }, renderProps: renderProps, generatorName: "slotLabelContent", generator: options.slotLabelContent || renderInnerContent$1, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (h("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, - h(InnerContent, { elTag: "div", elClasses: [ - 'fc-timegrid-slot-label-cushion', - 'fc-scrollgrid-shrink-cushion', - ] }))))); - })); - } - function renderInnerContent$1(props) { - return props.text; - } - - class TimeBodyAxis extends BaseComponent { - render() { - return this.props.slatMetas.map((slatMeta) => (h("tr", { key: slatMeta.key }, - h(TimeColsAxisCell, Object.assign({}, slatMeta))))); - } - } - - const DEFAULT_WEEK_NUM_FORMAT = createFormatter({ week: 'short' }); - const AUTO_ALL_DAY_MAX_EVENT_ROWS = 5; - class TimeColsView extends DateComponent { - constructor() { - super(...arguments); - this.allDaySplitter = new AllDaySplitter(); // for use by subclasses - this.headerElRef = y(); - this.rootElRef = y(); - this.scrollerElRef = y(); - this.state = { - slatCoords: null, - }; - this.handleScrollTopRequest = (scrollTop) => { - let scrollerEl = this.scrollerElRef.current; - if (scrollerEl) { // TODO: not sure how this could ever be null. weirdness with the reducer - scrollerEl.scrollTop = scrollTop; - } - }; - /* Header Render Methods - ------------------------------------------------------------------------------------------------------------------*/ - this.renderHeadAxis = (rowKey, frameHeight = '') => { - let { options } = this.context; - let { dateProfile } = this.props; - let range = dateProfile.renderRange; - let dayCnt = diffDays(range.start, range.end); - // only do in day views (to avoid doing in week views that dont need it) - let navLinkAttrs = (dayCnt === 1) - ? buildNavLinkAttrs(this.context, range.start, 'week') - : {}; - if (options.weekNumbers && rowKey === 'day') { - return (h(WeekNumberContainer, { elTag: "th", elClasses: [ - 'fc-timegrid-axis', - 'fc-scrollgrid-shrink', - ], elAttrs: { - 'aria-hidden': true, - }, date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, (InnerContent) => (h("div", { className: [ - 'fc-timegrid-axis-frame', - 'fc-scrollgrid-shrink-frame', - 'fc-timegrid-axis-frame-liquid', - ].join(' '), style: { height: frameHeight } }, - h(InnerContent, { elTag: "a", elClasses: [ - 'fc-timegrid-axis-cushion', - 'fc-scrollgrid-shrink-cushion', - 'fc-scrollgrid-sync-inner', - ], elAttrs: navLinkAttrs }))))); - } - return (h("th", { "aria-hidden": true, className: "fc-timegrid-axis" }, - h("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } }))); - }; - /* Table Component Render Methods - ------------------------------------------------------------------------------------------------------------------*/ - // only a one-way height sync. we don't send the axis inner-content height to the DayGrid, - // but DayGrid still needs to have classNames on inner elements in order to measure. - this.renderTableRowAxis = (rowHeight) => { - let { options, viewApi } = this.context; - let renderProps = { - text: options.allDayText, - view: viewApi, - }; - return ( - // TODO: make reusable hook. used in list view too - h(ContentContainer, { elTag: "td", elClasses: [ - 'fc-timegrid-axis', - 'fc-scrollgrid-shrink', - ], elAttrs: { - 'aria-hidden': true, - }, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner$1, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, (InnerContent) => (h("div", { className: [ - 'fc-timegrid-axis-frame', - 'fc-scrollgrid-shrink-frame', - rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : '', - ].join(' '), style: { height: rowHeight } }, - h(InnerContent, { elTag: "span", elClasses: [ - 'fc-timegrid-axis-cushion', - 'fc-scrollgrid-shrink-cushion', - 'fc-scrollgrid-sync-inner', - ] }))))); - }; - this.handleSlatCoords = (slatCoords) => { - this.setState({ slatCoords }); - }; - } - // rendering - // ---------------------------------------------------------------------------------------------------- - renderSimpleLayout(headerRowContent, allDayContent, timeContent) { - let { context, props } = this; - let sections = []; - let stickyHeaderDates = getStickyHeaderDates(context.options); - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunk: { - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }, - }); - } - if (allDayContent) { - sections.push({ - type: 'body', - key: 'all-day', - chunk: { content: allDayContent }, - }); - sections.push({ - type: 'body', - key: 'all-day-divider', - outerContent: ( // TODO: rename to cellContent so don't need to define
",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);let t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),ui}class fi extends In{constructor(){super(...arguments),this.state={forPrint:!1},this.handleBeforePrint=()=>{this.setState({forPrint:!0})},this.handleAfterPrint=()=>{this.setState({forPrint:!1})}}render(){let{props:e}=this,{options:t}=e,{forPrint:n}=this.state,r=n||"auto"===t.height||"auto"===t.contentHeight,i=r||null==t.height?"":t.height,s=["fc",n?"fc-media-print":"fc-media-screen","fc-direction-"+t.direction,e.theme.getClass("root")];return hi()||s.push("fc-liquid-hack"),e.children(s,i,r,n)}componentDidMount(){let{emitter:e}=this.props;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)}componentWillUnmount(){let{emitter:e}=this.props;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)}}class gi{constructor(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}destroy(){}}function pi(e){return{[e.component.uid]:e}}const mi={};class vi{getCurrentData(){return this.currentDataManager.getCurrentData()}dispatch(e){this.currentDataManager.dispatch(e)}get view(){return this.getCurrentData().viewApi}batchRendering(e){e()}updateSize(){this.trigger("_resize",!0)}setOption(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})}getOption(e){return this.currentDataManager.currentCalendarOptionsInput[e]}getAvailableLocaleCodes(){return Object.keys(this.getCurrentData().availableRawLocales)}on(e,t){let{currentDataManager:n}=this;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn(`Unknown listener name '${e}'`)}off(e,t){this.currentDataManager.emitter.off(e,t)}trigger(e,...t){this.currentDataManager.emitter.trigger(e,...t)}changeView(e,t){this.batchRendering(()=>{if(this.unselect(),t)if(t.start&&t.end)this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),this.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{let{dateEnv:n}=this.getCurrentData();this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:n.createMarker(t)})}else this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})})}zoomTo(e,t){let n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})}getUnitViewSpec(e){let t,n,{viewSpecs:r,toolbarConfig:i}=this.getCurrentData(),s=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(let e in r)s.push(e);for(t=0;t{this.dispatch({type:"REMOVE_EVENTS",eventStore:Ur(e)})}})}getEventById(e){let t=this.getCurrentData(),{defs:n,instances:r}=t.eventStore;e=String(e);for(let i in n){let s=n[i];if(s.publicId===e){if(s.recurringDef)return new zr(t,s,null);for(let e in r){let n=r[e];if(n.defId===s.defId)return new zr(t,s,n)}}}return null}getEvents(){let e=this.getCurrentData();return Lr(e.eventStore,e)}removeAllEvents(){this.dispatch({type:"REMOVE_ALL_EVENTS"})}getEventSources(){let e=this.getCurrentData(),t=e.eventSources,n=[];for(let r in t)n.push(new jr(e,t[r]));return n}getEventSourceById(e){let t=this.getCurrentData(),n=t.eventSources;e=String(e);for(let r in n)if(n[r].publicId===e)return new jr(t,n[r]);return null}addEventSource(e){let t=this.getCurrentData();if(e instanceof jr)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;let n=wr(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new jr(t,n)):null}removeAllEventSources(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})}refetchEvents(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})}scrollToTime(e){let t=jt(e);t&&this.trigger("_scrollRequest",{time:t})}}function bi(e,t){return e.left>=t.left&&e.left=t.top&&e.topthis.eventUiBuilders[t]||Oe(Ci));for(let n in t){let c=t[n],d=s[n]||Si,u=this.eventUiBuilders[n];l[n]={businessHours:c.businessHours||e.businessHours,dateSelection:r[n]||null,eventStore:d,eventUiBases:u(e.eventUiBases[""],c.ui,i[n]),eventSelection:d.instances[e.eventSelection]?e.eventSelection:"",eventDrag:o[n]||null,eventResize:a[n]||null}}return l}_splitDateSpan(e){let t={};if(e){let n=this.getKeysForDateSpan(e);for(let r of n)t[r]=e}return t}_getKeysForEventDefs(e){return we(e.defs,e=>this.getKeysForEventDef(e))}_splitEventStore(e,t){let{defs:n,instances:r}=e,i={};for(let e in n)for(let r of t[e])i[r]||(i[r]={defs:{},instances:{}}),i[r].defs[e]=n[e];for(let e in r){let n=r[e];for(let r of t[n.defId])i[r]&&(i[r].instances[e]=n)}return i}_splitIndividualUi(e,t){let n={};for(let r in e)if(r)for(let i of t[r])n[i]||(n[i]={}),n[i][r]=e[r];return n}_splitInteraction(e){let t={};if(e){let n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),s=r=>{t[r]||(t[r]={affectedEvents:n[r]||Si,mutatedEvents:i[r]||Si,isEvent:e.isEvent})};for(let e in n)s(e);for(let e in i)s(e)}return t}}function Ci(e,t,n){let r=[];e&&r.push(e),t&&r.push(t);let i={"":Ar(r)};return n&&Object.assign(i,n),i}function Ri(e,t,n,r){return{dow:e.getUTCDay(),isDisabled:Boolean(r&&!Yn(r.activeRange,e)),isOther:Boolean(r&&!Yn(r.currentRange,e)),isToday:Boolean(t&&Yn(t,e)),isPast:Boolean(n?en:!!t&&e>=t.end)}}function xi(e,t){let n=["fc-day","fc-day-"+pt[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}const _i=gn({year:"numeric",month:"long",day:"numeric"}),Ti=gn({week:"long"});function ki(e,t,n="day",r=!0){const{dateEnv:i,options:s,calendarApi:o}=e;let a=i.format(t,"week"===n?Ti:_i);if(s.navLinks){let e=i.toDate(t);const l=e=>{let r="day"===n?s.navLinkDayClick:"week"===n?s.navLinkWeekClick:null;"function"==typeof r?r.call(o,i.toDate(t),e):("string"==typeof r&&(n=r),o.zoomTo(t,n))};return Object.assign({title:ut(s.navLinkHint,[a,e],a),"data-navlink":""},r?Xe(l):{onClick:l})}return{"aria-label":a}}let Mi,Ii=null;function Oi(){return null===Ii&&(Ii=function(){let e=document.createElement("div");Ue(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
",document.body.appendChild(e);let t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return Pe(e),t}()),Ii}function Ni(){return Mi||(Mi=function(){let e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);let t=Pi(e);return document.body.removeChild(e),t}()),Mi}function Pi(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function Hi(e,t=!1){let n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,s=parseInt(n.borderTopWidth,10)||0,o=parseInt(n.borderBottomWidth,10)||0,a=Pi(e),l=a.y-r-i,c={borderLeft:r,borderRight:i,borderTop:s,borderBottom:o,scrollbarBottom:a.x-s-o,scrollbarLeft:0,scrollbarRight:0};return Oi()&&"rtl"===n.direction?c.scrollbarLeft=l:c.scrollbarRight=l,t&&(c.paddingLeft=parseInt(n.paddingLeft,10)||0,c.paddingRight=parseInt(n.paddingRight,10)||0,c.paddingTop=parseInt(n.paddingTop,10)||0,c.paddingBottom=parseInt(n.paddingBottom,10)||0),c}function Bi(e,t=!1,n){let r=n?e.getBoundingClientRect():ji(e),i=Hi(e,t),s={left:r.left+i.borderLeft+i.scrollbarLeft,right:r.right-i.borderRight-i.scrollbarRight,top:r.top+i.borderTop,bottom:r.bottom-i.borderBottom-i.scrollbarBottom};return t&&(s.left+=i.paddingLeft,s.right-=i.paddingRight,s.top+=i.paddingTop,s.bottom-=i.paddingBottom),s}function ji(e){let 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 zi(e){let t=[];for(;e instanceof HTMLElement;){let 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}class Ui{constructor(e,t,n,r){this.els=t;let i=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(i.left),r&&this.buildElVerticals(i.top)}buildElHorizontals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n}buildElVerticals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n}leftToIndex(e){let t,{lefts:n,rights:r}=this,i=n.length;for(t=0;t=n[t]&&e=n[t]&&e0}canScrollHorizontally(){return this.getMaxScrollLeft()>0}canScrollUp(){return this.getScrollTop()>0}canScrollDown(){return this.getScrollTop()0}canScrollRight(){return this.getScrollLeft()o.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:o.end,end:s.end}},i)),r?(n.push({index:e.index,thickness:e.thickness,span:Zi(o,s)},...i),r):(n.push(e),0)}insertEntryAt(e,t){let{entriesByLevel:n,levelCoords:r}=this;-1===t.lateral?(Xi(r,t.level,t.levelCoord),Xi(n,t.level,[e])):Xi(n[t.level],t.lateral,e),this.stackCnts[qi(e)]=t.stackCnt}findInsertion(e){let{levelCoords:t,entriesByLevel:n,strictOrder:r,stackCnts:i}=this,s=t.length,o=0,a=-1,l=-1,c=null,d=0;for(let u=0;u=o+e.thickness)break;let h,f=n[u],g=Ji(f,e.span.start,Qi),p=g[0]+g[1];for(;(h=f[p])&&h.span.starto&&(o=e,c=h,a=u,l=p),e===o&&(d=Math.max(d,i[qi(h)]+1)),p+=1}}let u=0;if(c)for(u=a+1;un(e[i-1]))return[i,0];for(;ro))return[s,1];r=s+1}}return[r,0]}class $i{constructor(e,t){this.emitter=new Tr}destroy(){}setMirrorIsVisible(e){}setMirrorNeedsRevert(e){}setAutoScrollEnabled(e){}}const Ki={},es={startTime:jt,duration:jt,create:Boolean,sourceId:String};function ts(e){let{refined:t,extra:n}=Sn(e,es);return{startTime:t.startTime||null,duration:t.duration||null,create:null==t.create||t.create,sourceId:t.sourceId,leftoverProps:n}}function ns(e,t){return gn(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}const rs="fc-col-header-cell";function is(e){return e.text}class ss extends In{render(){let{dateEnv:e,options:t,theme:n,viewApi:r}=this.context,{props:i}=this,{date:s,dateProfile:o}=i,a=Ri(s,i.todayRange,null,o),l=[rs].concat(xi(a,n)),c=e.format(s,i.dayHeaderFormat),d=!a.isDisabled&&i.colCnt>1?ki(this.context,s):{},u=Object.assign(Object.assign(Object.assign({date:e.toDate(s),view:r},i.extraRenderProps),{text:c}),a);return f(jn,{elTag:"th",elClasses:l,elAttrs:Object.assign({role:"columnheader",colSpan:i.colSpan,"data-date":a.isDisabled?void 0:qt(s)},i.extraDataAttrs),renderProps:u,generatorName:"dayHeaderContent",generator:t.dayHeaderContent||is,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount},e=>f("div",{className:"fc-scrollgrid-sync-inner"},!a.isDisabled&&f(e,{elTag:"a",elAttrs:d,elClasses:["fc-col-header-cell-cushion",i.isSticky&&"fc-sticky"]})))}}const os=gn({weekday:"long"});class as extends In{render(){let{props:e}=this,{dateEnv:t,theme:n,viewApi:r,options:i}=this.context,s=vt(new Date(2592e5),e.dow),o={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},a=t.format(s,e.dayHeaderFormat),l=Object.assign(Object.assign(Object.assign(Object.assign({date:s},o),{view:r}),e.extraRenderProps),{text:a});return f(jn,{elTag:"th",elClasses:[rs,...xi(o,n),...e.extraClassNames||[]],elAttrs:Object.assign({role:"columnheader",colSpan:e.colSpan},e.extraDataAttrs),renderProps:l,generatorName:"dayHeaderContent",generator:i.dayHeaderContent||is,classNameGenerator:i.dayHeaderClassNames,didMount:i.dayHeaderDidMount,willUnmount:i.dayHeaderWillUnmount},n=>f("div",{className:"fc-scrollgrid-sync-inner"},f(n,{elTag:"a",elClasses:["fc-col-header-cell-cushion",e.isSticky&&"fc-sticky"],elAttrs:{"aria-label":t.format(s,os)}})))}}class ls extends m{constructor(e,t){super(e,t),this.initialNowDate=Kn(t.options.now,t.dateEnv),this.initialNowQueriedMs=(new Date).valueOf(),this.state=this.computeTiming().currentState}render(){let{props:e,state:t}=this;return e.children(t.nowDate,t.todayRange)}componentDidMount(){this.setTimeout()}componentDidUpdate(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())}componentWillUnmount(){this.clearTimeout()}computeTiming(){let{props:e,context:t}=this,n=bt(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),i=t.dateEnv.add(r,jt(1,e.unit)),s=i.valueOf()-n.valueOf();return s=Math.min(864e5,s),{currentState:{nowDate:r,todayRange:cs(r)},nextState:{nowDate:i,todayRange:cs(i)},waitMs:s}}setTimeout(){let{nextState:e,waitMs:t}=this.computeTiming();this.timeoutId=setTimeout(()=>{this.setState(e,()=>{this.setTimeout()})},t)}clearTimeout(){this.timeoutId&&clearTimeout(this.timeoutId)}}function cs(e){let t=wt(e);return{start:t,end:vt(t,1)}}ls.contextType=Tn;class ds extends In{constructor(){super(...arguments),this.createDayHeaderFormatter=Oe(us)}render(){let{context:e}=this,{dates:t,dateProfile:n,datesRepDistinctDays:r,renderIntro:i}=this.props,s=this.createDayHeaderFormatter(e.options.dayHeaderFormat,r,t.length);return f(ls,{unit:"day"},(e,o)=>f("tr",{role:"row"},i&&i("day"),t.map(e=>r?f(ss,{key:e.toISOString(),date:e,dateProfile:n,todayRange:o,colCnt:t.length,dayHeaderFormat:s}):f(as,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:s}))))}}function us(e,t,n){return e||ns(t,n)}class hs{constructor(e,t){let n=e.start,{end:r}=e,i=[],s=[],o=-1;for(;n=t.length?t[t.length-1]+1:t[n]}}class fs{constructor(e,t){let n,r,i,{dates:s}=e;if(t){for(r=s[0].getUTCDay(),n=1;n!p[e.instanceId])}),u=d.defs,h=d.instances,f=Gr(u,e.eventUiBases);var g,p;for(let r in l){let o=l[r],g=o.range,p=c[o.defId],m=a[o.defId];if(!Es(p.constraints,g,d,e.businessHours,t))return!1;let{eventOverlap:v}=t.options,b="function"==typeof v?v:null;for(let e in h){let n=h[e];if(Qn(g,n.range)){if(!1===f[n.defId].overlap&&s.isEvent)return!1;if(!1===p.overlap)return!1;if(b&&!b(new zr(t,u[n.defId],n),new zr(t,m,o)))return!1}}let y=i.eventStore;for(let e of p.allows){let i,s=Object.assign(Object.assign({},n),{range:o.range,allDay:m.allDay}),a=y.defs[m.defId],l=y.instances[r];if(i=a?new zr(t,a,l):new zr(t,m),!e(Or(s,t),i))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){let i=e.eventStore,s=i.defs,o=i.instances,a=e.dateSelection,l=a.range,{selectionConfig:c}=t.getCurrentData();r&&(c=r(c));if(!Es(c.constraints,l,i,e.businessHours,t))return!1;let{selectOverlap:d}=t.options,u="function"==typeof d?d:null;for(let e in o){let n=o[e];if(Qn(l,n.range)){if(!1===c.overlap)return!1;if(u&&!u(new zr(t,s[n.defId],n),null))return!1}}for(let e of c.allows){let r=Object.assign(Object.assign({},n),a);if(!e(Or(r,t),null))return!1}return!0}(e,t,n,r))}function Es(e,t,n,r,i){for(let s of e)if(!Ss(As(s,t,n,r,i),t))return!1;return!0}function As(e,t,n,r,i){return"businessHours"===e?Ds(nr(r,t,i)):"string"==typeof e?Ds(mr(n,t=>t.groupId===e)):"object"==typeof e&&e?Ds(nr(e,t,i)):[]}function Ds(e){let{instances:t}=e,n=[];for(let e in t)n.push(t[e].range);return n}function Ss(e,t){for(let n of e)if(qn(n,t))return!0;return!1}const ws=/^(visible|hidden)$/;class Cs extends In{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,On(this.props.elRef,e)}}render(){let{props:e}=this,{liquid:t,liquidIsAbsolute:n}=e,r=t&&n,i=["fc-scroller"];return t&&(n?i.push("fc-scroller-liquid-absolute"):i.push("fc-scroller-liquid")),f("div",{ref:this.handleEl,className:i.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:r&&-(e.overcomeLeft||0)||"",right:r&&-(e.overcomeRight||0)||"",bottom:r&&-(e.overcomeBottom||0)||"",marginLeft:!r&&-(e.overcomeLeft||0)||"",marginRight:!r&&-(e.overcomeRight||0)||"",marginBottom:!r&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)}needsXScrolling(){if(ws.test(this.props.overflowX))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0}return!1}needsYScrolling(){if(ws.test(this.props.overflowY))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0}return!1}getXScrollbarWidth(){return ws.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight}getYScrollbarWidth(){return ws.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth}}class Rs{constructor(e){this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=(e,t)=>{let{depths:n,currentMap:r}=this,i=!1,s=!1;null!==e?(i=t in r,r[t]=e,n[t]=(n[t]||0)+1,s=!0):(n[t]-=1,n[t]||(delete r[t],delete this.callbackMap[t],i=!0)),this.masterCallback&&(i&&this.masterCallback(null,String(t)),s&&this.masterCallback(e,String(t)))}}createRef(e){let t=this.callbackMap[e];return t||(t=this.callbackMap[e]=t=>{this.handleValue(t,String(e))}),t}collect(e,t,n){return Me(this.currentMap,e,t,n)}getAll(){return Re(this.currentMap)}}function xs(e){let t=je(e,".fc-scrollgrid-shrink"),n=0;for(let e of t)n=Math.max(n,gt(e));return Math.ceil(n)}function _s(e,t){return e.liquid&&t.liquid}function Ts(e,t){return null!=t.maxHeight||_s(e,t)}function ks(e,t,n,r){let{expandRows:i}=n;return"function"==typeof t.content?t.content(n):f("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:i?n.clientHeight:""}},n.tableColGroupNode,f(r?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function Ms(e,t){return Ie(e,t,xe)}function Is(e,t){let n=[];for(let r of e){let e=r.span||1;for(let i=0;ie,Ms),this.renderMicroColGroup=Oe(Is),this.scrollerRefs=new Rs,this.scrollerElRefs=new Rs(this._handleScrollerEl.bind(this)),this.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},this.handleSizing=()=>{this.safeSetState(Object.assign({shrinkWidth:this.computeShrinkWidth()},this.computeScrollerDims()))}}render(){let{props:e,state:t,context:n}=this,r=e.sections||[],i=this.processCols(e.cols),s=this.renderMicroColGroup(i,t.shrinkWidth),o=Ps(e.liquid,n);e.collapsibleWidth&&o.push("fc-scrollgrid-collapsible");let a,l=r.length,c=0,d=[],u=[],h=[];for(;c{}},r);return f(r?"th":"td",{ref:n.elRef,role:"presentation"},f("div",{className:"fc-scroller-harness"+(c?" fc-scroller-harness-liquid":"")},f(Cs,{ref:this.scrollerRefs.createRef(u),elRef:this.scrollerElRefs.createRef(u),overflowY:d,overflowX:i.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:c,liquidIsAbsolute:!0},h)))}_handleScrollerEl(e,t){let n=function(e,t){for(let n of e)if(n.key===t)return n;return null}(this.props.sections,t);n&&On(n.chunk.scrollerElRef,e)}componentDidMount(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)}componentDidUpdate(){this.handleSizing()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}computeShrinkWidth(){return Ns(this.props.cols)?xs(this.scrollerElRefs.getAll()):0}computeScrollerDims(){let e=Ni(),{scrollerRefs:t,scrollerElRefs:n}=this,r=!1,i={},s={};for(let e in t.currentMap){let n=t.currentMap[e];if(n&&n.needsYScrolling()){r=!0;break}}for(let t of this.props.sections){let o=t.key,a=n.currentMap[o];if(a){let t=a.parentNode;i[o]=Math.floor(t.getBoundingClientRect().width-(r?e.y:0)),s[o]=Math.floor(t.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:i,scrollerClientHeights:s}}}Us.addStateEquality({scrollerClientWidths:xe,scrollerClientHeights:xe});class Ls extends In{constructor(){super(...arguments),this.handleEl=e=>{e&&function(e,t){e.fcSeg=t}(e,this.props.seg)}}render(){const{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{eventRange:i}=r,{ui:s}=i,o={event:new zr(t,i.def,i.instance),view:t.viewApi,timeText:e.timeText,textColor:s.textColor,backgroundColor:s.backgroundColor,borderColor:s.borderColor,isDraggable:!e.disableDragging&&Zr(r,t),isStartResizable:!e.disableResizing&&Xr(r,t),isEndResizable:!e.disableResizing&&Jr(r),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(r.isStart),isEnd:Boolean(r.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)};return f(jn,Object.assign({},e,{elRef:this.handleEl,elClasses:[...ei(o),...r.eventRange.ui.classNames,...e.elClasses||[]],renderProps:o,generatorName:"eventContent",generator:n.eventContent||e.defaultGenerator,classNameGenerator:n.eventClassNames,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount}))}}class Ws extends In{render(){let{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{ui:i}=r.eventRange,s=$r(r,n.eventTimeFormat||e.defaultTimeFormat,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return f(Ls,Object.assign({},e,{elTag:"a",elStyle:{borderColor:i.borderColor,backgroundColor:i.backgroundColor},elAttrs:ni(r,t),defaultGenerator:Fs,timeText:s}),(e,t)=>f(p,null,f(e,{elTag:"div",elClasses:["fc-event-main"],elStyle:{color:t.textColor}}),Boolean(t.isStartResizable)&&f("div",{className:"fc-event-resizer fc-event-resizer-start"}),Boolean(t.isEndResizable)&&f("div",{className:"fc-event-resizer fc-event-resizer-end"})))}}function Fs(e){return f("div",{className:"fc-event-main-frame"},e.timeText&&f("div",{className:"fc-event-time"},e.timeText),f("div",{className:"fc-event-title-container"},f("div",{className:"fc-event-title fc-sticky"},e.event.title||f(p,null," "))))}const Vs=e=>f(Tn.Consumer,null,t=>{let{options:n}=t,r={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return f(jn,Object.assign({},e,{elTag:e.elTag||"div",renderProps:r,generatorName:"nowIndicatorContent",generator:n.nowIndicatorContent,classNameGenerator:n.nowIndicatorClassNames,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount}))}),Gs=gn({day:"numeric"});class Qs extends In{constructor(){super(...arguments),this.refineRenderProps=Ne(Ys)}render(){let{props:e,context:t}=this,{options:n}=t,r=this.refineRenderProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraRenderProps:e.extraRenderProps,viewApi:t.viewApi,dateEnv:t.dateEnv});return f(jn,Object.assign({},e,{elClasses:[...xi(r,t.theme),...e.elClasses||[]],elAttrs:Object.assign(Object.assign({},e.elAttrs),r.isDisabled?{}:{"data-date":qt(e.date)}),renderProps:r,generatorName:"dayCellContent",generator:n.dayCellContent||e.defaultGenerator,classNameGenerator:r.isDisabled?void 0:n.dayCellClassNames,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount}))}}function qs(e){return Boolean(e.dayCellContent||Pn("dayCellContent",e))}function Ys(e){let{date:t,dateEnv:n}=e,r=Ri(t,e.todayRange,null,e.dateProfile);return Object.assign(Object.assign(Object.assign({date:n.toDate(t),view:e.viewApi},r),{dayNumberText:e.showDayNumber?n.format(t,Gs):""}),e.extraRenderProps)}class Zs extends In{render(){let{props:e}=this,{seg:t}=e;return f(Ls,{elTag:"div",elClasses:["fc-bg-event"],elStyle:{backgroundColor:t.eventRange.ui.backgroundColor},defaultGenerator:Xs,seg:t,timeText:"",isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,disableDragging:!0,disableResizing:!0})}}function Xs(e){let{title:t}=e.event;return t&&f("div",{className:"fc-event-title"},e.event.title)}function Js(e){return f("div",{className:"fc-"+e})}const $s=e=>f(Tn.Consumer,null,t=>{let{dateEnv:n,options:r}=t,{date:i}=e,s=r.weekNumberFormat||e.defaultFormat,o={num:n.computeWeekNumber(i),text:n.format(i,s),date:i};return f(jn,Object.assign({},e,{renderProps:o,generatorName:"weekNumberContent",generator:r.weekNumberContent||Ks,classNameGenerator:r.weekNumberClassNames,didMount:r.weekNumberDidMount,willUnmount:r.weekNumberWillUnmount}))});function Ks(e){return e.text}class eo extends In{constructor(){super(...arguments),this.state={titleId:Ge()},this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&On(this.props.elRef,e)},this.handleDocumentMouseDown=e=>{const t=We(e);this.rootEl.contains(t)||this.handleCloseClick()},this.handleDocumentKeyDown=e=>{"Escape"===e.key&&this.handleCloseClick()},this.handleCloseClick=()=>{let{onClose:e}=this.props;e&&e()}}render(){let{theme:e,options:t}=this.context,{props:n,state:r}=this,i=["fc-popover",e.getClass("popover")].concat(n.extraClassNames||[]);return function(e,t){var n=f(ae,{__v:e,i:t});return n.containerInfo=t,n}(f("div",Object.assign({},n.extraAttrs,{id:n.id,className:i.join(" "),"aria-labelledby":r.titleId,ref:this.handleRootEl}),f("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},f("span",{className:"fc-popover-title",id:r.titleId},n.title),f("span",{className:"fc-popover-close "+e.getIconClass("close"),title:t.closeHint,onClick:this.handleCloseClick})),f("div",{className:"fc-popover-body "+e.getClass("popoverContent")},n.children)),n.parentEl)}componentDidMount(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()}componentWillUnmount(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)}updateSize(){let{isRtl:e}=this.context,{alignmentEl:t,alignGridTop:n}=this.props,{rootEl:r}=this,i=function(e){let t=zi(e),n=e.getBoundingClientRect();for(let e of t){let t=yi(n,e.getBoundingClientRect());if(!t)return null;n=t}return n}(t);if(i){let s=r.getBoundingClientRect(),o=n?He(t,".fc-scrollgrid").getBoundingClientRect().top:i.top,a=e?i.right-s.width:i.left;o=Math.max(o,10),a=Math.min(a,document.documentElement.clientWidth-10-s.width),a=Math.max(a,10);let l=r.offsetParent.getBoundingClientRect();Ue(r,{top:o-l.top,left:a-l.left})}}}class to extends Vi{constructor(){super(...arguments),this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,useEventCenter:!1}):this.context.unregisterInteractiveComponent(this)}}render(){let{options:e,dateEnv:t}=this.context,{props:n}=this,{startDate:r,todayRange:i,dateProfile:s}=n,o=t.format(r,e.dayPopoverFormat);return f(Qs,{elRef:this.handleRootEl,date:r,dateProfile:s,todayRange:i},(t,r,i)=>f(eo,{elRef:i.ref,id:n.id,title:o,extraClassNames:["fc-more-popover"].concat(i.className||[]),extraAttrs:i,parentEl:n.parentEl,alignmentEl:n.alignmentEl,alignGridTop:n.alignGridTop,onClose:n.onClose},qs(e)&&f(t,{elTag:"div",elClasses:["fc-more-popover-misc"]}),n.children))}queryHit(e,t,n,r){let{rootEl:i,props:s}=this;return e>=0&&e=0&&t{let{props:t,context:n}=this,{moreLinkClick:r}=n.options,i=io(t).start;function s(e){let{def:t,instance:r,range:i}=e.eventRange;return{event:new zr(n,t,r),start:n.dateEnv.toDate(i.start),end:n.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof r&&(r=r({date:i,allDay:Boolean(t.allDayDate),allSegs:t.allSegs.map(s),hiddenSegs:t.hiddenSegs.map(s),jsEvent:e,view:n.viewApi})),r&&"popover"!==r?"string"==typeof r&&n.calendarApi.zoomTo(i,r):this.setState({isPopoverOpen:!0})},this.handlePopoverClose=()=>{this.setState({isPopoverOpen:!1})}}render(){let{props:e,state:t}=this;return f(Tn.Consumer,null,n=>{let{viewApi:r,options:i,calendarApi:s}=n,{moreLinkText:o}=i,{moreCnt:a}=e,l=io(e),c="function"==typeof o?o.call(s,a):`+${a} ${o}`,d=ut(i.moreLinkHint,[a],c),u={num:a,shortText:"+"+a,text:c,view:r};return f(p,null,Boolean(e.moreCnt)&&f(jn,{elTag:e.elTag||"a",elRef:this.linkElRef,elClasses:[...e.elClasses||[],"fc-more-link"],elAttrs:Object.assign(Object.assign(Object.assign({},e.elAttrs),Xe(this.handleClick)),{title:d,"aria-expanded":t.isPopoverOpen,"aria-controls":t.isPopoverOpen?t.popoverId:""}),renderProps:u,generatorName:"moreLinkContent",generator:i.moreLinkContent||e.defaultGenerator||ro,classNameGenerator:i.moreLinkClassNames,didMount:i.moreLinkDidMount,willUnmount:i.moreLinkWillUnmount},e.children),t.isPopoverOpen&&f(to,{id:t.popoverId,startDate:l.start,endDate:l.end,dateProfile:e.dateProfile,todayRange:e.todayRange,extraDateSpan:e.extraDateSpan,parentEl:this.parentEl,alignmentEl:e.alignmentElRef?e.alignmentElRef.current:this.linkElRef.current,alignGridTop:e.alignGridTop,onClose:this.handlePopoverClose},e.popoverContent()))})}componentDidMount(){this.updateParentEl()}componentDidUpdate(){this.updateParentEl()}updateParentEl(){this.linkElRef.current&&(this.parentEl=He(this.linkElRef.current,".fc-view-harness"))}}function ro(e){return e.text}function io(e){if(e.allDayDate)return{start:e.allDayDate,end:vt(e.allDayDate,1)};let{hiddenSegs:t}=e;return{start:so(t),end:(n=t,n.reduce(ao).eventRange.range.end)};var n}function so(e){return e.reduce(oo).eventRange.range.start}function oo(e,t){return e.eventRange.range.startt.eventRange.range.end?e:t}var lo={__proto__:null,BASE_OPTION_DEFAULTS:mn,BaseComponent:In,BgEvent:Zs,CalendarImpl:vi,CalendarRoot:fi,ContentContainer:jn,CustomRenderingStore:class extends class{constructor(){this.handlers=[]}set(e){this.currentValue=e;for(let t of this.handlers)t(e)}subscribe(e){this.handlers.push(e),void 0!==this.currentValue&&e(this.currentValue)}}{constructor(){super(...arguments),this.map=new Map}handle(e){const{map:t}=this;let n=!1;e.isActive?(t.set(e.id,e),n=!0):t.has(e.id)&&(t.delete(e.id),n=!0),n&&this.set(t)}},DateComponent:Vi,DateEnv:$t,DateProfileGenerator:er,DayCellContainer:Qs,DayHeader:ds,DaySeriesModel:hs,DayTableModel:fs,DelayedRunner:Ee,ElementDragging:$i,ElementScrollController:Wi,Emitter:Tr,EventContainer:Ls,EventImpl:zr,Interaction:gi,MoreLinkContainer:no,NamedTimeZoneImpl:class{constructor(e){this.timeZoneName=e}},NowIndicatorContainer:Vs,NowTimer:ls,PositionCache:Ui,RefMap:Rs,ScrollController:Li,ScrollResponder:_n,Scroller:Cs,SegHierarchy:Gi,SimpleScrollGrid:Us,Slicer:gs,Splitter:wi,StandardEvent:Ws,TableDateCell:ss,TableDowCell:as,Theme:Kt,ViewContainer:Un,ViewContextType:Tn,WeekNumberContainer:$s,WindowScrollController:Fi,addDays:vt,addDurations:Ut,addMs:bt,addWeeks:mt,allowContextMenu:st,allowSelection:rt,applyMutationToEventStore:Pr,applyStyle:Ue,asCleanDays:function(e){return e.years||e.months||e.milliseconds?0:e.days},asRoughMinutes:function(e){return Ft(e)/6e4},asRoughMs:Ft,asRoughSeconds:function(e){return Ft(e)/1e3},binarySearch:Ji,buildElAttrs:Hn,buildEntryKey:qi,buildEventApis:Lr,buildEventRangeKey:ti,buildIsoString:Qt,buildNavLinkAttrs:ki,buildSegTimeText:$r,collectFromHash:Me,combineEventUis:Ar,compareByFieldSpecs:at,compareNumbers:ht,compareObjs:Te,computeEarliestSegStart:so,computeEdges:Hi,computeFallbackHeaderFormat:ns,computeInnerRect:Bi,computeRect:ji,computeShrinkWidth:xs,computeVisibleDayRange:Xn,config:Ki,constrainPoint:Ei,createDuration:jt,createEmptyEventStore:gr,createEventInstance:tr,createEventUi:Er,createFormatter:gn,diffDates:$n,diffDayAndTime:At,diffDays:Et,diffPoints:Di,diffWeeks:yt,diffWholeDays:St,diffWholeWeeks:Dt,disableCursor:et,elementClosest:He,elementMatches:Be,enableCursor:tt,eventTupleToStore:hr,filterHash:Se,findDirectChildren:function(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e{let o=r.length,a=s.length,l=0;for(;l{let o={};for(let a in s)if(i[a])if(Ie(r[a],s[a]))o[a]=i[a];else{n&&n(i[a]);let r=e.apply(this,s[a]);o[a]=t&&t(r,i[a])?i[a]:r}else o[a]=e.apply(this,s[a]);return r=s,i=o,o}},memoizeObjArg:Ne,mergeEventStores:pr,multiplyDuration:Lt,padStart:dt,parseBusinessHours:Mr,parseClassNames:vr,parseDragMeta:ts,parseEventDef:dr,parseFieldSpecs:ot,parseMarker:Jt,pointInsideRect:bi,preventContextMenu:it,preventDefault:Qe,preventSelection:nt,rangeContainsMarker:Yn,rangeContainsRange:qn,rangesEqual:Gn,rangesIntersect:Qn,refineEventDef:lr,refineProps:Sn,removeElement:Pe,removeExact:function(e,t){let n=0,r=0;for(;r.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.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:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}');const co=[],uo={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"},ho=Object.assign(Object.assign({},uo),{buttonHints:{prev:"Previous $0",next:"Next $0",today:(e,t)=>"day"===t?"Today":"This "+e},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`});function fo(e){let t=e.length>0?e[0].code:"en",n=co.concat(e),r={en:ho};for(let e of n)r[e.code]=e;return{map:r,defaultCode:t}}function go(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){let n=[].concat(e||[]),r=function(e,t){for(let n=0;n0;e-=1){let n=r.slice(0,e).join("-");if(t[n])return t[n]}}return null}(n,t)||ho;return po(e,n,r)}(e,t):po(e.code,[e.code],e)}function po(e,t,n){let r=De([uo,n],["buttonText"]);delete r.code;let{week:i}=r;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function mo(e){return{id:Ke(),name:e.name,premiumReleaseDate:e.premiumReleaseDate?new Date(e.premiumReleaseDate):void 0,deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}function vo(){let e,t=[],n=[];return(r,i)=>(e&&Ie(r,t)&&Ie(i,n)||(e=function(e,t){let n={},r={premiumReleaseDate:void 0,reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(let o of e){const e=o.name,a=n[e];void 0===a?(n[e]=o.id,i(o.deps),s=o,r={premiumReleaseDate:bo((t=r).premiumReleaseDate,s.premiumReleaseDate),reducers:t.reducers.concat(s.reducers),isLoadingFuncs:t.isLoadingFuncs.concat(s.isLoadingFuncs),contextInit:t.contextInit.concat(s.contextInit),eventRefiners:Object.assign(Object.assign({},t.eventRefiners),s.eventRefiners),eventDefMemberAdders:t.eventDefMemberAdders.concat(s.eventDefMemberAdders),eventSourceRefiners:Object.assign(Object.assign({},t.eventSourceRefiners),s.eventSourceRefiners),isDraggableTransformers:t.isDraggableTransformers.concat(s.isDraggableTransformers),eventDragMutationMassagers:t.eventDragMutationMassagers.concat(s.eventDragMutationMassagers),eventDefMutationAppliers:t.eventDefMutationAppliers.concat(s.eventDefMutationAppliers),dateSelectionTransformers:t.dateSelectionTransformers.concat(s.dateSelectionTransformers),datePointTransforms:t.datePointTransforms.concat(s.datePointTransforms),dateSpanTransforms:t.dateSpanTransforms.concat(s.dateSpanTransforms),views:Object.assign(Object.assign({},t.views),s.views),viewPropsTransformers:t.viewPropsTransformers.concat(s.viewPropsTransformers),isPropsValid:s.isPropsValid||t.isPropsValid,externalDefTransforms:t.externalDefTransforms.concat(s.externalDefTransforms),viewContainerAppends:t.viewContainerAppends.concat(s.viewContainerAppends),eventDropTransformers:t.eventDropTransformers.concat(s.eventDropTransformers),calendarInteractions:t.calendarInteractions.concat(s.calendarInteractions),componentInteractions:t.componentInteractions.concat(s.componentInteractions),themeClasses:Object.assign(Object.assign({},t.themeClasses),s.themeClasses),eventSourceDefs:t.eventSourceDefs.concat(s.eventSourceDefs),cmdFormatter:s.cmdFormatter||t.cmdFormatter,recurringTypes:t.recurringTypes.concat(s.recurringTypes),namedTimeZonedImpl:s.namedTimeZonedImpl||t.namedTimeZonedImpl,initialView:t.initialView||s.initialView,elementDraggingImpl:t.elementDraggingImpl||s.elementDraggingImpl,optionChangeHandlers:Object.assign(Object.assign({},t.optionChangeHandlers),s.optionChangeHandlers),scrollGridImpl:s.scrollGridImpl||t.scrollGridImpl,listenerRefiners:Object.assign(Object.assign({},t.listenerRefiners),s.listenerRefiners),optionRefiners:Object.assign(Object.assign({},t.optionRefiners),s.optionRefiners),propSetHandlers:Object.assign(Object.assign({},t.propSetHandlers),s.propSetHandlers)}):a!==o.id&&console.warn(`Duplicate plugin '${e}'`)}var t,s}return e&&i(e),i(t),r}(r,i)),t=r,n=i,e)}function bo(e,t){return void 0===e?t:void 0===t?e:new Date(Math.max(e.valueOf(),t.valueOf()))}class yo extends Kt{}function Eo(e,t,n,r){if(t[e])return t[e];let i=function(e,t,n,r){let i=n[e],s=r[e],o=e=>i&&null!==i[e]?i[e]:s&&null!==s[e]?s[e]:null,a=o("component"),l=o("superType"),c=null;if(l){if(l===e)throw new Error("Can't have a custom view type that references itself");c=Eo(l,t,n,r)}!a&&c&&(a=c.component);if(!a)return null;return{type:e,component:a,defaults:Object.assign(Object.assign({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:Object.assign(Object.assign({},c?c.overrides:{}),s?s.rawOptions:{})}}(e,t,n,r);return i&&(t[e]=i),i}function Ao(e){return we(e,Do)}function Do(e){let t="function"==typeof e?{component:e}:e,{component:n}=t;var r;return t.content&&(r=t,n=e=>f(Tn.Consumer,null,t=>f(jn,{elTag:"div",elClasses:Ln(t.viewSpec),renderProps:Object.assign(Object.assign({},e),{nextDayThreshold:t.options.nextDayThreshold}),generatorName:void 0,generator:r.content,classNameGenerator:r.classNames,didMount:r.didMount,willUnmount:r.willUnmount}))),{superType:t.type,component:n,rawOptions:t}}function So(e,t,n,r){let i=Ao(e),s=Ao(t.views);return we(function(e,t){let n,r={};for(n in e)Eo(n,r,e,t);for(n in t)Eo(n,r,e,t);return r}(i,s),e=>function(e,t,n,r,i){let s=e.overrides.duration||e.defaults.duration||r.duration||n.duration,o=null,a="",l="",c={};if(s&&(o=function(e){let t=JSON.stringify(e),n=wo[t];void 0===n&&(n=jt(e),wo[t]=n);return n}(s),o)){let e=Gt(o);a=e.unit,1===e.value&&(l=a,c=t[a]?t[a].rawOptions:{})}let d=t=>{let n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null},u=t=>{let n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null};return{type:e.type,component:e.component,duration:o,durationUnit:a,singleUnit:l,optionDefaults:e.defaults,optionOverrides:Object.assign(Object.assign({},c),e.overrides),buttonTextOverride:d(r)||d(n)||e.overrides.buttonText,buttonTextDefault:d(i)||e.defaults.buttonText||d(mn)||e.type,buttonTitleOverride:u(r)||u(n)||e.overrides.buttonHint,buttonTitleDefault:u(i)||e.defaults.buttonHint||u(mn)}}(e,s,t,n,r))}yo.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},yo.prototype.baseIconClass="fc-icon",yo.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},yo.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},yo.prototype.iconOverrideOption="buttonIcons",yo.prototype.iconOverrideCustomButtonOption="icon",yo.prototype.iconOverridePrefix="fc-icon-";let wo={};function Co(e,t,n){let r=t?t.activeRange:null;return _o({},function(e,t){let n=Cr(t),r=[].concat(e.eventSources||[]),i=[];e.initialEvents&&r.unshift(e.initialEvents);e.events&&r.unshift(e.events);for(let e of r){let r=wr(e,t,n);r&&i.push(r)}return i}(e,n),r,n)}function Ro(e,t,n,r){let i=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return _o(e,t.sources,i,r);case"REMOVE_EVENT_SOURCE":return s=e,o=t.sourceId,Se(s,e=>e.sourceId!==o);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?To(e,i,r):e;case"FETCH_EVENT_SOURCES":return ko(e,t.sourceIds?Ce(t.sourceIds):Io(e,r),i,t.isRefetch||!1,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){let i=e[t];if(i&&n===i.latestFetchId)return Object.assign(Object.assign({},e),{[t]:Object.assign(Object.assign({},i),{isFetching:!1,fetchRange:r})});return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var s,o}function xo(e){for(let t in e)if(e[t].isFetching)return!0;return!1}function _o(e,t,n,r){let i={};for(let e of t)i[e.sourceId]=e;return n&&(i=To(i,n,r)),Object.assign(Object.assign({},e),i)}function To(e,t,n){return ko(e,Se(e,e=>function(e,t,n){if(!Oo(e,n))return!e.latestFetchId;return!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.starte.fetchRange.end}(e,t,n)),t,!1,n)}function ko(e,t,n,r,i){let s={};for(let o in e){let a=e[o];t[o]?s[o]=Mo(a,n,r,i):s[o]=a}return s}function Mo(e,t,n,r){let{options:i,calendarApi:s}=r,o=r.pluginHooks.eventSourceDefs[e.sourceDefId],a=Ke();return o.fetch({eventSource:e,range:t,isRefetch:n,context:r},n=>{let{rawEvents:o}=n;i.eventSourceSuccess&&(o=i.eventSourceSuccess.call(s,o,n.response)||o),e.success&&(o=e.success.call(s,o,n.response)||o),r.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:a,fetchRange:t,rawEvents:o})},n=>{let o=!1;i.eventSourceFailure&&(i.eventSourceFailure.call(s,n),o=!0),e.failure&&(e.failure(n),o=!0),o||console.warn(n.message,n),r.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:a,fetchRange:t,error:n})}),Object.assign(Object.assign({},e),{isFetching:!0,latestFetchId:a})}function Io(e,t){return Se(e,e=>Oo(e,t))}function Oo(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function No(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function Po(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function Ho(e,t){let n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Bo(e,t){let n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function jo(e,t,n,r,i){return{header:e.headerToolbar?zo(e.headerToolbar,e,t,n,r,i):null,footer:e.footerToolbar?zo(e.footerToolbar,e,t,n,r,i):null}}function zo(e,t,n,r,i,s){let o={},a=[],l=!1;for(let c in e){let d=Uo(e[c],t,n,r,i,s);o[c]=d.widgets,a.push(...d.viewsWithButtons),l=l||d.hasTitle}return{sectionWidgets:o,viewsWithButtons:a,hasTitle:l}}function Uo(e,t,n,r,i,s){let o="rtl"===t.direction,a=t.customButtons||{},l=n.buttonText||{},c=t.buttonText||{},d=n.buttonHints||{},u=t.buttonHints||{},h=e?e.split(" "):[],f=[],g=!1;return{widgets:h.map(e=>e.split(",").map(e=>{if("title"===e)return g=!0,{buttonName:e};let n,h,p,m,v,b;if(n=a[e])p=e=>{n.click&&n.click.call(e.target,e,e.target)},(m=r.getCustomButtonIconClass(n))||(m=r.getIconClass(e,o))||(v=n.text),b=n.hint||n.text;else if(h=i[e]){f.push(e),p=()=>{s.changeView(e)},(v=h.buttonTextOverride)||(m=r.getIconClass(e,o))||(v=h.buttonTextDefault);let n=h.buttonTextOverride||h.buttonTextDefault;b=ut(h.buttonTitleOverride||h.buttonTitleDefault||t.viewHint,[n,e],n)}else if(s[e])if(p=()=>{s[e]()},(v=l[e])||(m=r.getIconClass(e,o))||(v=c[e]),"prevYear"===e||"nextYear"===e){let t="prevYear"===e?"prev":"next";b=ut(d[t]||u[t],[c.year||"year","year"],c[e])}else b=t=>ut(d[e]||u[e],[c[t]||t,t],c[e]);return{buttonName:e,buttonClick:p,buttonIcon:m,buttonText:v,buttonHint:b}})),viewsWithButtons:f,hasTitle:g}}class Lo{constructor(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}get calendar(){return this.getCurrentData().calendarApi}get title(){return this.getCurrentData().viewTitle}get activeStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)}get activeEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)}get currentStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)}get currentEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)}getOption(e){return this.getCurrentData().options[e]}}function Wo(e,t){let n=Re(t.getCurrentData().eventSources),r=[];for(let t of e){let e=!1;for(let r=0;rArray.isArray(e.events)?e.events:null,fetch(e,t){t({rawEvents:e.eventSource.meta})}}]}),mo({name:"func-event-source",eventSourceDefs:[{parseMeta:e=>"function"==typeof e.events?e.events:null,fetch(e,t,n){const{dateEnv:r}=e.context;li(e.eventSource.meta.bind(null,oi(e.range,r)),e=>t({rawEvents:e}),n)}}]}),mo({name:"json-event-source",eventSourceRefiners:{method:String,extraParams:wn,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:e=>!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam},fetch(e,t,n){const{meta:r}=e.eventSource,i=function(e,t,n){let r,i,s,o,{dateEnv:a,options:l}=n,c={};r=e.startParam,null==r&&(r=l.startParam);i=e.endParam,null==i&&(i=l.endParam);s=e.timeZoneParam,null==s&&(s=l.timeZoneParam);o="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Object.assign(c,o),c[r]=a.formatIso(t.start),c[i]=a.formatIso(t.end),"local"!==a.timeZone&&(c[s]=a.timeZone);return c}(r,e.range,e.context);di(r.method,r.url,i).then(([e,n])=>{t({rawEvents:e,response:n})},n)}}]}),mo({name:"simple-recurring-event",recurringTypes:[{parse(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){let i,s={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null};return e.duration&&(i=e.duration),!i&&e.startTime&&e.endTime&&(n=e.endTime,r=e.startTime,i={years:n.years-r.years,months:n.months-r.months,days:n.days-r.days,milliseconds:n.milliseconds-r.milliseconds}),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:i,typeData:s}}var n,r;return null},expand(e,t,n){let r=Vn(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){let i=e?Ce(e):null,s=wt(n.start),o=n.end,a=[];for(;sxo(e.eventSources)],propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",Object.assign(Object.assign({},oi(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){let{emitter:n}=t;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",Lr(e,t))}}})];class Vo{constructor(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new Ee(this.drain.bind(this))}request(e,t){this.queue.push(e),this.delayedRunner.request(t)}pause(e){this.delayedRunner.pause(e)}resume(e,t){this.delayedRunner.resume(e,t)}drain(){let{queue:e}=this;for(;e.length;){let t,n=[];for(;t=e.shift();)this.runTask(t),n.push(t);this.drained(n)}}runTask(e){this.runTaskOption&&this.runTaskOption(e)}drained(e){this.drainedOption&&this.drainedOption(e)}}function Go(e,t,n){let r;return r=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(r.start,r.end,gn(t.titleFormat||function(e){let{currentRangeUnit:t}=e;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};let n=St(e.currentRange.start,e.currentRange.end);if(null!==n&&n>1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}class Qo{constructor(e){this.computeOptionsData=Oe(this._computeOptionsData),this.computeCurrentViewData=Oe(this._computeCurrentViewData),this.organizeRawLocales=Oe(fo),this.buildLocale=Oe(go),this.buildPluginHooks=vo(),this.buildDateEnv=Oe(qo),this.buildTheme=Oe(Yo),this.parseToolbars=Oe(jo),this.buildViewSpecs=Oe(So),this.buildDateProfileGenerator=Ne(Zo),this.buildViewApi=Oe(Xo),this.buildViewUiProps=Ne(Ko),this.buildEventUiBySource=Oe(Jo,xe),this.buildEventUiBases=Oe($o),this.parseContextBusinessHours=Ne(ta),this.buildTitle=Oe(Go),this.emitter=new Tr,this.actionRunner=new Vo(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=()=>this.data,this.dispatch=e=>{this.actionRunner.request(e)},this.props=e,this.actionRunner.pause();let t={},n=this.computeOptionsData(e.optionOverrides,t,e.calendarApi),r=n.calendarOptions.initialView||n.pluginHooks.initialView,i=this.computeCurrentViewData(r,n,e.optionOverrides,t);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(i.options);let s=function(e,t){let n=e.initialDate;return null!=n?t.createMarker(n):Kn(e.now,t)}(n.calendarOptions,n.dateEnv),o=i.dateProfileGenerator.build(s);Yn(o.activeRange,s)||(s=o.currentRange.start);let a={dateEnv:n.dateEnv,options:n.calendarOptions,pluginHooks:n.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData};for(let e of n.pluginHooks.contextInit)e(a);let l=Co(n.calendarOptions,o,a),c={dynamicOptionOverrides:t,currentViewType:r,currentDate:s,dateProfile:o,businessHours:this.parseContextBusinessHours(a),eventSources:l,eventUiBases:{},eventStore:{defs:{},instances:{}},renderableEventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(a).selectionConfig},d=Object.assign(Object.assign({},a),c);for(let e of n.pluginHooks.reducers)Object.assign(c,e(null,null,d));ea(c,a)&&this.emitter.trigger("loading",!0),this.state=c,this.updateData(),this.actionRunner.resume()}resetOptions(e,t){let{props:n}=this;n.optionOverrides=t?Object.assign(Object.assign({},n.optionOverrides),e):e,this.actionRunner.request({type:"NOTHING"})}_handleAction(e){let{props:t,state:n,emitter:r}=this,i=function(e,t){switch(t.type){case"SET_OPTION":return Object.assign(Object.assign({},e),{[t.optionName]:t.rawOptionValue});default:return e}}(n.dynamicOptionOverrides,e),s=this.computeOptionsData(t.optionOverrides,i,t.calendarApi),o=function(e,t){switch(t.type){case"CHANGE_VIEW_TYPE":e=t.viewType}return e}(n.currentViewType,e),a=this.computeCurrentViewData(o,s,t.optionOverrides,i);t.calendarApi.currentDataManager=this,r.setThisContext(t.calendarApi),r.setOptions(a.options);let l={dateEnv:s.dateEnv,options:s.calendarOptions,pluginHooks:s.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:r,getCurrentData:this.getCurrentData},{currentDate:c,dateProfile:d}=n;this.data&&this.data.dateProfileGenerator!==a.dateProfileGenerator&&(d=a.dateProfileGenerator.build(c)),c=function(e,t){switch(t.type){case"CHANGE_DATE":return t.dateMarker;default:return e}}(c,e),d=function(e,t,n,r){let i;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if(i=r.buildPrev(e,n),i.isValid)return i;break;case"NEXT":if(i=r.buildNext(e,n),i.isValid)return i}return e}(d,e,c,a.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&Yn(d.currentRange,c)||(c=d.currentRange.start);let u=Ro(n.eventSources,e,d,l),h=Rr(n.eventStore,e,u,d,l),f=xo(u)&&!a.options.progressiveEventRendering&&n.renderableEventStore||h,{eventUiSingleBase:g,selectionConfig:p}=this.buildViewUiProps(l),m=this.buildEventUiBySource(u),v={dynamicOptionOverrides:i,currentViewType:o,currentDate:c,dateProfile:d,eventSources:u,eventStore:h,renderableEventStore:f,selectionConfig:p,eventUiBases:this.buildEventUiBases(f.defs,g,m),businessHours:this.parseContextBusinessHours(l),dateSelection:No(n.dateSelection,e),eventSelection:Po(n.eventSelection,e),eventDrag:Ho(n.eventDrag,e),eventResize:Bo(n.eventResize,e)},b=Object.assign(Object.assign({},l),v);for(let t of s.pluginHooks.reducers)Object.assign(v,t(n,e,b));let y=ea(n,l),E=ea(v,l);!y&&E?r.trigger("loading",!0):y&&!E&&r.trigger("loading",!1),this.state=v,t.onAction&&t.onAction(e)}updateData(){let{props:e,state:t}=this,n=this.data,r=this.computeOptionsData(e.optionOverrides,t.dynamicOptionOverrides,e.calendarApi),i=this.computeCurrentViewData(t.currentViewType,r,e.optionOverrides,t.dynamicOptionOverrides),s=this.data=Object.assign(Object.assign(Object.assign({viewTitle:this.buildTitle(t.dateProfile,i.options,r.dateEnv),calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},r),i),t),o=r.pluginHooks.optionChangeHandlers,a=n&&n.calendarOptions,l=r.calendarOptions;if(a&&a!==l){a.timeZone!==l.timeZone&&(t.eventSources=s.eventSources=function(e,t,n){let r=t?t.activeRange:null;return ko(e,Io(e,n),r,!0,n)}(s.eventSources,t.dateProfile,s),t.eventStore=s.eventStore=function(e,t,n){let{defs:r}=e,i=we(e.instances,e=>{let i=r[e.defId];return i.allDay||i.recurringDef?e:Object.assign(Object.assign({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})});return{defs:r,instances:i}}(s.eventStore,n.dateEnv,s.dateEnv));for(let e in o)a[e]!==l[e]&&o[e](l[e],s)}e.onData&&e.onData(s)}_computeOptionsData(e,t,n){let{refinedOptions:r,pluginHooks:i,localeDefaults:s,availableLocaleData:o,extra:a}=this.processRawCalendarOptions(e,t);na(a);let l=this.buildDateEnv(r.timeZone,r.locale,r.weekNumberCalculation,r.firstDay,r.weekText,i,o,r.defaultRangeSeparator),c=this.buildViewSpecs(i.views,e,t,s),d=this.buildTheme(r,i);return{calendarOptions:r,pluginHooks:i,dateEnv:l,viewSpecs:c,theme:d,toolbarConfig:this.parseToolbars(r,e,d,c,n),localeDefaults:s,availableRawLocales:o.map}}processRawCalendarOptions(e,t){let{locales:n,locale:r}=Dn([mn,e,t]),i=this.organizeRawLocales(n),s=i.map,o=this.buildLocale(r||i.defaultCode,s).options,a=this.buildPluginHooks(e.plugins||[],Fo),l=this.currentCalendarOptionsRefiners=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},pn),vn),bn),a.listenerRefiners),a.optionRefiners),c={},d=Dn([mn,o,e,t]),u={},h=this.currentCalendarOptionsInput,f=this.currentCalendarOptionsRefined,g=!1;for(let e in d)"plugins"!==e&&(d[e]===h[e]||yn[e]&&e in h&&yn[e](h[e],d[e])?u[e]=f[e]:l[e]?(u[e]=l[e](d[e]),g=!0):c[e]=h[e]);return g&&(this.currentCalendarOptionsInput=d,this.currentCalendarOptionsRefined=u),{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:a,availableLocaleData:i,localeDefaults:o,extra:c}}_computeCurrentViewData(e,t,n,r){let i=t.viewSpecs[e];if(!i)throw new Error(`viewType "${e}" is not available. Please make sure you've loaded all neccessary plugins`);let{refinedOptions:s,extra:o}=this.processRawViewOptions(i,t.pluginHooks,t.localeDefaults,n,r);return na(o),{viewSpec:i,options:s,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:i.optionDefaults.dateProfileGeneratorClass,duration:i.duration,durationUnit:i.durationUnit,usesMinMaxTime:i.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:s.slotMinTime,slotMaxTime:s.slotMaxTime,showNonCurrentDates:s.showNonCurrentDates,dayCount:s.dayCount,dateAlignment:s.dateAlignment,dateIncrement:s.dateIncrement,hiddenDays:s.hiddenDays,weekends:s.weekends,nowInput:s.now,validRangeInput:s.validRange,visibleRangeInput:s.visibleRange,monthMode:s.monthMode,fixedWeekCount:s.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}}processRawViewOptions(e,t,n,r,i){let s=Dn([mn,e.optionDefaults,n,r,e.optionOverrides,i]),o=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},pn),vn),bn),An),t.listenerRefiners),t.optionRefiners),a={},l=this.currentViewOptionsInput,c=this.currentViewOptionsRefined,d=!1,u={};for(let e in s)s[e]===l[e]||yn[e]&&yn[e](s[e],l[e])?a[e]=c[e]:(s[e]===this.currentCalendarOptionsInput[e]||yn[e]&&yn[e](s[e],this.currentCalendarOptionsInput[e])?e in this.currentCalendarOptionsRefined&&(a[e]=this.currentCalendarOptionsRefined[e]):o[e]?a[e]=o[e](s[e]):u[e]=s[e],d=!0);return d&&(this.currentViewOptionsInput=s,this.currentViewOptionsRefined=a),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:u}}}function qo(e,t,n,r,i,s,o,a){let l=go(t||o.defaultCode,o.map);return new $t({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:s.namedTimeZonedImpl,locale:l,weekNumberCalculation:n,firstDay:r,weekText:i,cmdFormatter:s.cmdFormatter,defaultSeparator:a})}function Yo(e,t){return new(t.themeClasses[e.themeSystem]||yo)(e)}function Zo(e){return new(e.dateProfileGeneratorClass||er)(e)}function Xo(e,t,n){return new Lo(e,t,n)}function Jo(e){return we(e,e=>e.ui)}function $o(e,t,n){let r={"":t};for(let t in e){let i=e[t];i.sourceId&&n[i.sourceId]&&(r[t]=n[i.sourceId])}return r}function Ko(e){let{options:t}=e;return{eventUiSingleBase:Er({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:Er({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function ea(e,t){for(let n of t.pluginHooks.isLoadingFuncs)if(n(e))return!0;return!1}function ta(e){return Mr(e.options.businessHours,e)}function na(e,t){for(let n in e)console.warn(`Unknown option '${n}'`+(t?` for view '${t}'`:""))}class ra extends In{render(){return f("div",{className:"fc-toolbar-chunk"},...this.props.widgetGroups.map(e=>this.renderWidgetGroup(e)))}renderWidgetGroup(e){let{props:t}=this,{theme:n}=this.context,r=[],i=!0;for(let s of e){let{buttonName:e,buttonClick:o,buttonText:a,buttonIcon:l,buttonHint:c}=s;if("title"===e)i=!1,r.push(f("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{let i=e===t.activeButton,s=!t.isTodayEnabled&&"today"===e||!t.isPrevEnabled&&"prev"===e||!t.isNextEnabled&&"next"===e,d=[`fc-${e}-button`,n.getClass("button")];i&&d.push(n.getClass("buttonActive")),r.push(f("button",{type:"button",title:"function"==typeof c?c(t.navUnit):c,disabled:s,"aria-pressed":i,className:d.join(" "),onClick:o},a||(l?f("span",{className:l}):"")))}}if(r.length>1){return f("div",{className:i&&n.getClass("buttonGroup")||""},...r)}return r[0]}}class ia extends In{render(){let e,t,{model:n,extraClassName:r}=this.props,i=!1,s=n.sectionWidgets,o=s.center;return s.left?(i=!0,e=s.left):e=s.start,s.right?(i=!0,t=s.right):t=s.end,f("div",{className:[r||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",o||[]),this.renderSection("end",t||[]))}renderSection(e,t){let{props:n}=this;return f(ra,{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})}}class sa extends In{constructor(){super(...arguments),this.state={availableWidth:null},this.handleEl=e=>{this.el=e,On(this.props.elRef,e),this.updateAvailableWidth()},this.handleResize=()=>{this.updateAvailableWidth()}}render(){let{props:e,state:t}=this,{aspectRatio:n}=e,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],i="",s="";return n?null!==t.availableWidth?i=t.availableWidth/n:s=1/n*100+"%":i=e.height||"",f("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:i,paddingBottom:s}},e.children)}componentDidMount(){this.context.addResizeHandler(this.handleResize)}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}updateAvailableWidth(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})}}class oa extends gi{constructor(e){super(e),this.handleSegClick=(e,t)=>{let{component:n}=this,{context:r}=n,i=Vr(t);if(i&&n.isValidSegDownEl(e.target)){let s=He(e.target,".fc-event-forced-url"),o=s?s.querySelector("a[href]").href:"";r.emitter.trigger("eventClick",{el:t,event:new zr(n.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:r.viewApi}),o&&!e.defaultPrevented&&(window.location.href=o)}},this.destroy=qe(e.el,"click",".fc-event",this.handleSegClick)}}class aa extends gi{constructor(e){super(e),this.handleEventElRemove=e=>{e===this.currentSegEl&&this.handleSegLeave(null,this.currentSegEl)},this.handleSegEnter=(e,t)=>{Vr(t)&&(this.currentSegEl=t,this.triggerEvent("eventMouseEnter",e,t))},this.handleSegLeave=(e,t)=>{this.currentSegEl&&(this.currentSegEl=null,this.triggerEvent("eventMouseLeave",e,t))},this.removeHoverListeners=function(e,t,n,r){let i;return qe(e,"mouseover",t,(e,t)=>{if(t!==i){i=t,n(e,t);let s=e=>{i=null,r(e,t),t.removeEventListener("mouseleave",s)};t.addEventListener("mouseleave",s)}})}(e.el,".fc-event",this.handleSegEnter,this.handleSegLeave)}destroy(){this.removeHoverListeners()}triggerEvent(e,t,n){let{component:r}=this,{context:i}=r,s=Vr(n);t&&!r.isValidSegDownEl(t.target)||i.emitter.trigger(e,{el:n,event:new zr(i,s.eventRange.def,s.eventRange.instance),jsEvent:t,view:i.viewApi})}}class la extends Mn{constructor(){super(...arguments),this.buildViewContext=Oe(kn),this.buildViewPropTransformers=Oe(da),this.buildToolbarProps=Oe(ca),this.headerRef={current:null},this.footerRef={current:null},this.interactionsStore={},this.state={viewLabelId:Ge()},this.registerInteractiveComponent=(e,t)=>{let n=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}(e,t),r=[oa,aa].concat(this.props.pluginHooks.componentInteractions).map(e=>new e(n));this.interactionsStore[e.uid]=r,mi[e.uid]=n},this.unregisterInteractiveComponent=e=>{let t=this.interactionsStore[e.uid];if(t){for(let e of t)e.destroy();delete this.interactionsStore[e.uid]}delete mi[e.uid]},this.resizeRunner=new Ee(()=>{this.props.emitter.trigger("_resize",!0),this.props.emitter.trigger("windowResize",{view:this.props.viewApi})}),this.handleWindowResize=e=>{let{options:t}=this.props;t.handleWindowResize&&e.target===window&&this.resizeRunner.request(t.windowResizeDelay)}}render(){let e,{props:t}=this,{toolbarConfig:n,options:r}=t,i=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,Kn(t.options.now,t.dateEnv),t.viewTitle),s=!1,o="";t.isHeightAuto||t.forPrint?o="":null!=r.height?s=!0:null!=r.contentHeight?o=r.contentHeight:e=Math.max(r.aspectRatio,.5);let a=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),l=n.header&&n.header.hasTitle?this.state.viewLabelId:"";return f(Tn.Provider,{value:a},n.header&&f(ia,Object.assign({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:l},i)),f(sa,{liquid:s,height:o,aspectRatio:e,labeledById:l},this.renderView(t),this.buildAppendContent()),n.footer&&f(ia,Object.assign({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},i)))}componentDidMount(){let{props:e}=this;this.calendarInteractions=e.pluginHooks.calendarInteractions.map(t=>new t(e)),window.addEventListener("resize",this.handleWindowResize);let{propSetHandlers:t}=e.pluginHooks;for(let n in t)t[n](e[n],e)}componentDidUpdate(e){let{props:t}=this,{propSetHandlers:n}=t.pluginHooks;for(let r in n)t[r]!==e[r]&&n[r](t[r],t)}componentWillUnmount(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(let e of this.calendarInteractions)e.destroy();this.props.emitter.trigger("_unmount")}buildAppendContent(){let{props:e}=this;return f(p,{},...e.pluginHooks.viewContainerAppends.map(t=>t(e)))}renderView(e){let{pluginHooks:t}=e,{viewSpec:n}=e,r={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},i=this.buildViewPropTransformers(t.viewPropsTransformers);for(let t of i)Object.assign(r,t.transform(r,e));return f(n.component,Object.assign({},r))}}function ca(e,t,n,r,i,s){let o=n.build(i,void 0,!1),a=n.buildPrev(t,r,!1),l=n.buildNext(t,r,!1);return{title:s,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:o.isValid&&!Yn(t.currentRange,i),isPrevEnabled:a.isValid,isNextEnabled:l.isValid}}function da(e){return e.map(e=>new e)}function ua(e){let t=go(e.locale||"en",fo([]).map);return new $t(Object.assign(Object.assign({timeZone:mn.timeZone,calendarSystem:"gregory"},e),{locale:t}))}Ki.touchMouseIgnoreWait=500;let ha=0,fa=0,ga=!1;class pa{constructor(e){this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=e=>{if(!this.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&this.tryStart(e)){let t=this.createEventFromMouse(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t),this.shouldIgnoreMove||document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}},this.handleMouseMove=e=>{let t=this.createEventFromMouse(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleMouseUp=e=>{document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.emitter.trigger("pointerup",this.createEventFromMouse(e)),this.cleanup()},this.handleTouchStart=e=>{if(this.tryStart(e)){this.isTouchDragging=!0;let t=this.createEventFromTouch(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t);let n=e.target;this.shouldIgnoreMove||n.addEventListener("touchmove",this.handleTouchMove),n.addEventListener("touchend",this.handleTouchEnd),n.addEventListener("touchcancel",this.handleTouchEnd),window.addEventListener("scroll",this.handleTouchScroll,!0)}},this.handleTouchMove=e=>{let t=this.createEventFromTouch(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleTouchEnd=e=>{if(this.isDragging){let t=e.target;t.removeEventListener("touchmove",this.handleTouchMove),t.removeEventListener("touchend",this.handleTouchEnd),t.removeEventListener("touchcancel",this.handleTouchEnd),window.removeEventListener("scroll",this.handleTouchScroll,!0),this.emitter.trigger("pointerup",this.createEventFromTouch(e)),this.cleanup(),this.isTouchDragging=!1,ha+=1,setTimeout(()=>{ha-=1},Ki.touchMouseIgnoreWait)}},this.handleTouchScroll=()=>{this.wasTouchScroll=!0},this.handleScroll=e=>{if(!this.shouldIgnoreMove){let t=window.pageXOffset-this.prevScrollX+this.prevPageX,n=window.pageYOffset-this.prevScrollY+this.prevPageY;this.emitter.trigger("pointermove",{origEvent:e,isTouch:this.isTouchDragging,subjectEl:this.subjectEl,pageX:t,pageY:n,deltaX:t-this.origPageX,deltaY:n-this.origPageY})}},this.containerEl=e,this.emitter=new Tr,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),fa+=1,1===fa&&window.addEventListener("touchmove",ma,{passive:!1})}destroy(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),fa-=1,fa||window.removeEventListener("touchmove",ma,{passive:!1})}tryStart(e){let t=this.querySubjectEl(e),n=e.target;return!(!t||this.handleSelector&&!He(n,this.handleSelector))&&(this.subjectEl=t,this.isDragging=!0,this.wasTouchScroll=!1,!0)}cleanup(){ga=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()}querySubjectEl(e){return this.selector?He(e.target,this.selector):this.containerEl}shouldIgnoreMouse(){return ha||this.isTouchDragging}cancelTouchScroll(){this.isDragging&&(ga=!0)}initScrollWatch(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))}recordCoords(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)}destroyScrollWatch(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)}createEventFromMouse(e,t){let n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}}createEventFromTouch(e,t){let n,r,i=e.touches,s=0,o=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(s=n-this.origPageX,o=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:s,deltaY:o}}}function ma(e){ga&&e.preventDefault()}class va{constructor(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}start(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()}handleMove(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()}setIsVisible(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)}stop(e,t){let n=()=>{this.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(n,this.revertDuration):setTimeout(n,0)}doRevertAnimation(e,t){let n=this.mirrorEl,r=this.sourceEl.getBoundingClientRect();n.style.transition="top "+t+"ms,left "+t+"ms",Ue(n,{left:r.left,top:r.top}),Ze(n,()=>{n.style.transition="",e()})}cleanup(){this.mirrorEl&&(Pe(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null}updateElPosition(){this.sourceEl&&this.isVisible&&Ue(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})}getMirrorEl(){let e=this.sourceElRect,t=this.mirrorEl;return t||(t=this.mirrorEl=this.sourceEl.cloneNode(!0),t.classList.add("fc-unselectable"),t.classList.add("fc-event-dragging"),Ue(t,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(t)),t}}class ba extends Li{constructor(e,t){super(),this.handleScroll=()=>{this.scrollTop=this.scrollController.getScrollTop(),this.scrollLeft=this.scrollController.getScrollLeft(),this.handleScrollChange()},this.scrollController=e,this.doesListening=t,this.scrollTop=this.origScrollTop=e.getScrollTop(),this.scrollLeft=this.origScrollLeft=e.getScrollLeft(),this.scrollWidth=e.getScrollWidth(),this.scrollHeight=e.getScrollHeight(),this.clientWidth=e.getClientWidth(),this.clientHeight=e.getClientHeight(),this.clientRect=this.computeClientRect(),this.doesListening&&this.getEventTarget().addEventListener("scroll",this.handleScroll)}destroy(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}setScrollTop(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())}setScrollLeft(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())}getClientWidth(){return this.clientWidth}getClientHeight(){return this.clientHeight}getScrollWidth(){return this.scrollWidth}getScrollHeight(){return this.scrollHeight}handleScrollChange(){}}class ya extends ba{constructor(e,t){super(new Wi(e),t)}getEventTarget(){return this.scrollController.el}computeClientRect(){return Bi(this.scrollController.el)}}class Ea extends ba{constructor(e){super(new Fi,e)}getEventTarget(){return window}computeClientRect(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}}handleScrollChange(){this.clientRect=this.computeClientRect()}}const Aa="function"==typeof performance?performance.now:Date.now;class Da{constructor(){this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=()=>{if(this.isAnimating){let e=this.computeBestEdge(this.pointerScreenX+window.pageXOffset,this.pointerScreenY+window.pageYOffset);if(e){let t=Aa();this.handleSide(e,(t-this.msSinceRequest)/1e3),this.requestAnimation(t)}else this.isAnimating=!1}}}start(e,t,n){this.isEnabled&&(this.scrollCaches=this.buildCaches(n),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))}handleMove(e,t){if(this.isEnabled){let n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,s=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),s<0?this.everMovedLeft=!0:s>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Aa()))}}stop(){if(this.isEnabled){this.isAnimating=!1;for(let e of this.scrollCaches)e.destroy();this.scrollCaches=null}}requestAnimation(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)}handleSide(e,t){let{scrollCache:n}=e,{edgeThreshold:r}=this,i=r-e.distance,s=i*i/(r*r)*this.maxVelocity*t,o=1;switch(e.name){case"left":o=-1;case"right":n.setScrollLeft(n.getScrollLeft()+s*o);break;case"top":o=-1;case"bottom":n.setScrollTop(n.getScrollTop()+s*o)}}computeBestEdge(e,t){let{edgeThreshold:n}=this,r=null,i=this.scrollCaches||[];for(let s of i){let i=s.clientRect,o=e-i.left,a=i.right-e,l=t-i.top,c=i.bottom-t;o>=0&&a>=0&&l>=0&&c>=0&&(l<=n&&this.everMovedUp&&s.canScrollUp()&&(!r||r.distance>l)&&(r={scrollCache:s,name:"top",distance:l}),c<=n&&this.everMovedDown&&s.canScrollDown()&&(!r||r.distance>c)&&(r={scrollCache:s,name:"bottom",distance:c}),o<=n&&this.everMovedLeft&&s.canScrollLeft()&&(!r||r.distance>o)&&(r={scrollCache:s,name:"left",distance:o}),a<=n&&this.everMovedRight&&s.canScrollRight()&&(!r||r.distance>a)&&(r={scrollCache:s,name:"right",distance:a}))}return r}buildCaches(e){return this.queryScrollEls(e).map(e=>e===window?new Ea(!1):new ya(e,!1))}queryScrollEls(e){let t=[];for(let n of this.scrollQuery)"object"==typeof n?t.push(n):t.push(...Array.prototype.slice.call(Fe(e).querySelectorAll(n)));return t}}class Sa extends $i{constructor(e,t){super(e),this.containerEl=e,this.delay=null,this.minDistance=0,this.touchScrollAllowed=!0,this.mirrorNeedsRevert=!1,this.isInteracting=!1,this.isDragging=!1,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.delayTimeoutId=null,this.onPointerDown=e=>{this.isDragging||(this.isInteracting=!0,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,nt(document.body),it(document.body),e.isTouch||e.origEvent.preventDefault(),this.emitter.trigger("pointerdown",e),this.isInteracting&&!this.pointer.shouldIgnoreMove&&(this.mirror.setIsVisible(!1),this.mirror.start(e.subjectEl,e.pageX,e.pageY),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e)))},this.onPointerMove=e=>{if(this.isInteracting){if(this.emitter.trigger("pointermove",e),!this.isDistanceSurpassed){let t,n=this.minDistance,{deltaX:r,deltaY:i}=e;t=r*r+i*i,t>=n*n&&this.handleDistanceSurpassed(e)}this.isDragging&&("scroll"!==e.origEvent.type&&(this.mirror.handleMove(e.pageX,e.pageY),this.autoScroller.handleMove(e.pageX,e.pageY)),this.emitter.trigger("dragmove",e))}},this.onPointerUp=e=>{this.isInteracting&&(this.isInteracting=!1,rt(document.body),st(document.body),this.emitter.trigger("pointerup",e),this.isDragging&&(this.autoScroller.stop(),this.tryStopDrag(e)),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null))};let n=this.pointer=new pa(e);n.emitter.on("pointerdown",this.onPointerDown),n.emitter.on("pointermove",this.onPointerMove),n.emitter.on("pointerup",this.onPointerUp),t&&(n.selector=t),this.mirror=new va,this.autoScroller=new Da}destroy(){this.pointer.destroy(),this.onPointerUp({})}startDelay(e){"number"==typeof this.delay?this.delayTimeoutId=setTimeout(()=>{this.delayTimeoutId=null,this.handleDelayEnd(e)},this.delay):this.handleDelayEnd(e)}handleDelayEnd(e){this.isDelayEnded=!0,this.tryStartDrag(e)}handleDistanceSurpassed(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)}tryStartDrag(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()))}tryStopDrag(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))}stopDrag(e){this.isDragging=!1,this.emitter.trigger("dragend",e)}setIgnoreMove(e){this.pointer.shouldIgnoreMove=e}setMirrorIsVisible(e){this.mirror.setIsVisible(e)}setMirrorNeedsRevert(e){this.mirrorNeedsRevert=e}setAutoScrollEnabled(e){this.autoScroller.isEnabled=e}}class wa{constructor(e){this.origRect=ji(e),this.scrollCaches=zi(e).map(e=>new ya(e,!0))}destroy(){for(let e of this.scrollCaches)e.destroy()}computeLeft(){let e=this.origRect.left;for(let t of this.scrollCaches)e+=t.origScrollLeft-t.getScrollLeft();return e}computeTop(){let e=this.origRect.top;for(let t of this.scrollCaches)e+=t.origScrollTop-t.getScrollTop();return e}isWithinClipping(e,t){let n={left:e,top:t};for(let e of this.scrollCaches)if(!Ca(e.getEventTarget())&&!bi(n,e.clientRect))return!1;return!0}}function Ca(e){let t=e.tagName;return"HTML"===t||"BODY"===t}class Ra{constructor(e,t){this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=e=>{let{dragging:t}=this;this.initialHit=null,this.movingHit=null,this.finalHit=null,this.prepareHits(),this.processFirstCoord(e),this.initialHit||!this.requireInitial?(t.setIgnoreMove(!1),this.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=e=>{this.emitter.trigger("dragstart",e),this.handleMove(e,!0)},this.handleDragMove=e=>{this.emitter.trigger("dragmove",e),this.handleMove(e)},this.handlePointerUp=e=>{this.releaseHits(),this.emitter.trigger("pointerup",e)},this.handleDragEnd=e=>{this.movingHit&&this.emitter.trigger("hitupdate",null,!0,e),this.finalHit=this.movingHit,this.movingHit=null,this.emitter.trigger("dragend",e)},this.droppableStore=t,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new Tr}processFirstCoord(e){let t,n={left:e.pageX,top:e.pageY},r=n,i=e.subjectEl;i instanceof HTMLElement&&(t=ji(i),r=Ei(r,t));let s=this.initialHit=this.queryHitForOffset(r.left,r.top);if(s){if(this.useSubjectCenter&&t){let e=yi(t,s.rect);e&&(r=Ai(e))}this.coordAdjust=Di(r,n)}else this.coordAdjust={left:0,top:0}}handleMove(e,t){let n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&xa(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))}prepareHits(){this.offsetTrackers=we(this.droppableStore,e=>(e.component.prepareHits(),new wa(e.el)))}releaseHits(){let{offsetTrackers:e}=this;for(let t in e)e[t].destroy();this.offsetTrackers={}}queryHitForOffset(e,t){let{droppableStore:n,offsetTrackers:r}=this,i=null;for(let s in n){let o=n[s].component,a=r[s];if(a&&a.isWithinClipping(e,t)){let n=a.computeLeft(),r=a.computeTop(),l=e-n,c=t-r,{origRect:d}=a,u=d.right-d.left,h=d.bottom-d.top;if(l>=0&&l=0&&ci.layer)&&(e.componentId=s,e.context=o.context,e.rect.left+=n,e.rect.right+=n,e.rect.top+=r,e.rect.bottom+=r,i=e)}}}return i}}function xa(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&si(e.dateSpan,t.dateSpan)}function _a(e,t){let n={};for(let r of t.pluginHooks.datePointTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,{date:(i=t.dateEnv).toDate(r.range.start),dateStr:i.formatIso(r.range.start,{omitTime:r.allDay}),allDay:r.allDay})),n}class Ta extends gi{constructor(e){super(e),this.subjectEl=null,this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let t=e.origEvent.target,{component:n,dragging:r}=this,{mirror:i}=r,{options:s}=n.context,o=n.context;this.subjectEl=e.subjectEl;let a=this.subjectSeg=Vr(e.subjectEl),l=(this.eventRange=a.eventRange).instance.instanceId;this.relevantEvents=fr(o.getCurrentData().eventStore,l),r.minDistance=e.isTouch?0:s.eventDragMinDistance,r.delay=e.isTouch&&l!==n.props.eventSelection?function(e){let{options:t}=e.context,n=t.eventLongPressDelay;null==n&&(n=t.longPressDelay);return n}(n):null,s.fixedMirrorParent?i.parentNode=s.fixedMirrorParent:i.parentNode=He(t,".fc"),i.revertDuration=s.dragRevertDuration;let c=n.isValidSegDownEl(t)&&!He(t,".fc-event-resizer");r.setIgnoreMove(!c),this.isDragging=c&&e.subjectEl.classList.contains("fc-event-draggable")},this.handleDragStart=e=>{let t=this.component.context,n=this.eventRange,r=n.instance.instanceId;e.isTouch?r!==this.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"}),this.isDragging&&(t.calendarApi.unselect(e),t.emitter.trigger("eventDragStart",{el:this.subjectEl,event:new zr(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi}))},this.handleHitUpdate=(e,t)=>{if(!this.isDragging)return;let n=this.relevantEvents,r=this.hitDragging.initialHit,i=this.component.context,s=null,o=null,a=null,l=!1,c={affectedEvents:n,mutatedEvents:{defs:{},instances:{}},isEvent:!0};if(e){s=e.context;let t=s.options;i===s||t.editable&&t.droppable?(o=function(e,t,n){let r=e.dateSpan,i=t.dateSpan,s=r.range.start,o=i.range.start,a={};r.allDay!==i.allDay&&(a.allDay=i.allDay,a.hasEnd=t.context.options.allDayMaintainDuration,i.allDay&&(s=wt(s)));let l=$n(s,o,e.context.dateEnv,e.componentId===t.componentId?e.largeUnit:null);l.milliseconds&&(a.allDay=!1);let c={datesDelta:l,standardProps:a};for(let r of n)r(c,e,t);return c}(r,e,s.getCurrentData().pluginHooks.eventDragMutationMassagers),o&&(a=Pr(n,s.getCurrentData().eventUiBases,o,s),c.mutatedEvents=a,ms(c,e.dateProfile,s)||(l=!0,o=null,a=null,c.mutatedEvents={defs:{},instances:{}}))):s=null}this.displayDrag(s,c),l?et():tt(),t||(i===s&&xa(r,e)&&(o=null),this.dragging.setMirrorNeedsRevert(!o),this.dragging.setMirrorIsVisible(!e||!Fe(this.subjectEl).querySelector(".fc-event-mirror")),this.receivingContext=s,this.validMutation=o,this.mutatedRelevantEvents=a)},this.handlePointerUp=()=>{this.isDragging||this.cleanup()},this.handleDragEnd=e=>{if(this.isDragging){let t=this.component.context,n=t.viewApi,{receivingContext:r,validMutation:i}=this,s=this.eventRange.def,o=this.eventRange.instance,a=new zr(t,s,o),l=this.relevantEvents,c=this.mutatedRelevantEvents,{finalHit:d}=this.hitDragging;if(this.clearDrag(),t.emitter.trigger("eventDragStop",{el:this.subjectEl,event:a,jsEvent:e.origEvent,view:n}),i){if(r===t){let r=new zr(t,c.defs[s.defId],o?c.instances[o.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:c});let d={oldEvent:a,event:r,relatedEvents:Lr(c,t,o),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:l})}},u={};for(let e of t.getCurrentData().pluginHooks.eventDropTransformers)Object.assign(u,e(i,t));t.emitter.trigger("eventDrop",Object.assign(Object.assign(Object.assign({},d),u),{el:e.subjectEl,delta:i.datesDelta,jsEvent:e.origEvent,view:n})),t.emitter.trigger("eventChange",d)}else if(r){let i={event:a,relatedEvents:Lr(l,t,o),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:l})}};t.emitter.trigger("eventLeave",Object.assign(Object.assign({},i),{draggedEl:e.subjectEl,view:n})),t.dispatch({type:"REMOVE_EVENTS",eventStore:l}),t.emitter.trigger("eventRemove",i);let u=c.defs[s.defId],h=c.instances[o.instanceId],f=new zr(r,u,h);r.dispatch({type:"MERGE_EVENTS",eventStore:c});let g={event:f,relatedEvents:Lr(c,r,h),revert(){r.dispatch({type:"REMOVE_EVENTS",eventStore:c})}};r.emitter.trigger("eventAdd",g),e.isTouch&&r.dispatch({type:"SELECT_EVENT",eventInstanceId:o.instanceId}),r.emitter.trigger("drop",Object.assign(Object.assign({},_a(d.dateSpan,r)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:d.context.viewApi})),r.emitter.trigger("eventReceive",Object.assign(Object.assign({},g),{draggedEl:e.subjectEl,view:d.context.viewApi}))}}else t.emitter.trigger("_noEventDrop")}this.cleanup()};let{component:t}=this,{options:n}=t.context,r=this.dragging=new Sa(e.el);r.pointer.selector=Ta.SELECTOR,r.touchScrollAllowed=!1,r.autoScroller.isEnabled=n.dragScroll;let i=this.hitDragging=new Ra(this.dragging,mi);i.useSubjectCenter=e.useEventCenter,i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),i.emitter.on("hitupdate",this.handleHitUpdate),i.emitter.on("pointerup",this.handlePointerUp),i.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}displayDrag(e,t){let n=this.component.context,r=this.receivingContext;r&&r!==e&&(r===n?r.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:t.affectedEvents,mutatedEvents:{defs:{},instances:{}},isEvent:!0}}):r.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){let e=this.component.context,{receivingContext:t}=this;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})}cleanup(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null}}Ta.SELECTOR=".fc-event-draggable, .fc-event-resizable";const ka={fixedMirrorParent:wn},Ma={dateClick:wn,eventDragStart:wn,eventDragStop:wn,eventDrop:wn,eventResizeStart:wn,eventResizeStop:wn,eventResize:wn,drop:wn,eventReceive:wn,eventLeave:wn};class Ia{constructor(e,t){this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=e=>{this.dragMeta=this.buildDragMeta(e.subjectEl)},this.handleHitUpdate=(e,t,n)=>{let{dragging:r}=this.hitDragging,i=null,s=null,o=!1,a={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:this.dragMeta.create};e&&(i=e.context,this.canDropElOnCalendar(n.subjectEl,i)&&(s=function(e,t,n){let r=Object.assign({},t.leftoverProps);for(let i of n.pluginHooks.externalDefTransforms)Object.assign(r,i(e,t));let{refined:i,extra:s}=lr(r,n),o=dr(i,s,t.sourceId,e.allDay,n.options.forceEventDuration||Boolean(t.duration),n),a=e.range.start;e.allDay&&t.startTime&&(a=n.dateEnv.add(a,t.startTime));let l=t.duration?n.dateEnv.add(a,t.duration):Nr(e.allDay,a,n),c=tr(o.defId,{start:a,end:l});return{def:o,instance:c}}(e.dateSpan,this.dragMeta,i),a.mutatedEvents=hr(s),o=!ms(a,e.dateProfile,i),o&&(a.mutatedEvents={defs:{},instances:{}},s=null))),this.displayDrag(i,a),r.setMirrorIsVisible(t||!s||!document.querySelector(".fc-event-mirror")),o?et():tt(),t||(r.setMirrorNeedsRevert(!s),this.receivingContext=i,this.droppableEvent=s)},this.handleDragEnd=e=>{let{receivingContext:t,droppableEvent:n}=this;if(this.clearDrag(),t&&n){let r=this.hitDragging.finalHit,i=r.context.viewApi,s=this.dragMeta;if(t.emitter.trigger("drop",Object.assign(Object.assign({},_a(r.dateSpan,t)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:i})),s.create){let r=hr(n);t.dispatch({type:"MERGE_EVENTS",eventStore:r}),e.isTouch&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:n.instance.instanceId}),t.emitter.trigger("eventReceive",{event:new zr(t,n.def,n.instance),relatedEvents:[],revert(){t.dispatch({type:"REMOVE_EVENTS",eventStore:r})},draggedEl:e.subjectEl,view:i})}}this.receivingContext=null,this.droppableEvent=null};let n=this.hitDragging=new Ra(e,mi);n.requireInitial=!1,n.emitter.on("dragstart",this.handleDragStart),n.emitter.on("hitupdate",this.handleHitUpdate),n.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=t}buildDragMeta(e){return"object"==typeof this.suppliedDragMeta?ts(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?ts(this.suppliedDragMeta(e)):function(e){let t=function(e,t){let n=Ki.dataAttrPrefix,r=(n?n+"-":"")+t;return e.getAttribute("data-"+r)||""}(e,"event");return ts(t?JSON.parse(t):{create:!1})}(e)}displayDrag(e,t){let n=this.receivingContext;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})}canDropElOnCalendar(e,t){let n=t.options.dropAccept;return"function"==typeof n?n.call(t.calendarApi,e):"string"!=typeof n||!n||Boolean(Be(e,n))}}Ki.dataAttrPrefix="";class Oa extends $i{constructor(e){super(e),this.shouldIgnoreMove=!1,this.mirrorSelector="",this.currentMirrorEl=null,this.handlePointerDown=e=>{this.emitter.trigger("pointerdown",e),this.shouldIgnoreMove||this.emitter.trigger("dragstart",e)},this.handlePointerMove=e=>{this.shouldIgnoreMove||this.emitter.trigger("dragmove",e)},this.handlePointerUp=e=>{this.emitter.trigger("pointerup",e),this.shouldIgnoreMove||this.emitter.trigger("dragend",e)};let t=this.pointer=new pa(e);t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("pointermove",this.handlePointerMove),t.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.pointer.destroy()}setIgnoreMove(e){this.shouldIgnoreMove=e}setMirrorIsVisible(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{let e=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;e&&(this.currentMirrorEl=e,e.style.visibility="hidden")}}}var Na=mo({name:"@fullcalendar/interaction",componentInteractions:[class extends gi{constructor(e){super(e),this.handlePointerDown=e=>{let{dragging:t}=this,n=e.origEvent.target;t.setIgnoreMove(!this.component.isValidDateDownEl(n))},this.handleDragEnd=e=>{let{component:t}=this,{pointer:n}=this.dragging;if(!n.wasTouchScroll){let{initialHit:n,finalHit:r}=this.hitDragging;if(n&&r&&xa(n,r)){let{context:r}=t,i=Object.assign(Object.assign({},_a(n.dateSpan,r)),{dayEl:n.dayEl,jsEvent:e.origEvent,view:r.viewApi||r.calendarApi.view});r.emitter.trigger("dateClick",i)}}},this.dragging=new Sa(e.el),this.dragging.autoScroller.isEnabled=!1;let t=this.hitDragging=new Ra(this.dragging,pi(e));t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}},class extends gi{constructor(e){super(e),this.dragSelection=null,this.handlePointerDown=e=>{let{component:t,dragging:n}=this,{options:r}=t.context,i=r.selectable&&t.isValidDateDownEl(e.origEvent.target);n.setIgnoreMove(!i),n.delay=e.isTouch?function(e){let{options:t}=e.context,n=t.selectLongPressDelay;null==n&&(n=t.longPressDelay);return n}(t):null},this.handleDragStart=e=>{this.component.context.calendarApi.unselect(e)},this.handleHitUpdate=(e,t)=>{let{context:n}=this.component,r=null,i=!1;if(e){let t=this.hitDragging.initialHit;e.componentId===t.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(t,e)||(r=function(e,t,n){let r=e.dateSpan,i=t.dateSpan,s=[r.range.start,r.range.end,i.range.start,i.range.end];s.sort(ht);let o={};for(let r of n){let n=r(e,t);if(!1===n)return null;n&&Object.assign(o,n)}return o.range={start:s[0],end:s[3]},o.allDay=r.allDay,o}(t,e,n.pluginHooks.dateSelectionTransformers)),r&&vs(r,e.dateProfile,n)||(i=!0,r=null)}r?n.dispatch({type:"SELECT_DATES",selection:r}):t||n.dispatch({type:"UNSELECT_DATES"}),i?et():tt(),t||(this.dragSelection=r)},this.handlePointerUp=e=>{this.dragSelection&&(Ir(this.dragSelection,e,this.component.context),this.dragSelection=null)};let{component:t}=e,{options:n}=t.context,r=this.dragging=new Sa(e.el);r.touchScrollAllowed=!1,r.minDistance=n.selectMinDistance||0,r.autoScroller.isEnabled=n.dragScroll;let i=this.hitDragging=new Ra(this.dragging,pi(e));i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),i.emitter.on("hitupdate",this.handleHitUpdate),i.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.dragging.destroy()}},Ta,class extends gi{constructor(e){super(e),this.draggingSegEl=null,this.draggingSeg=null,this.eventRange=null,this.relevantEvents=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let{component:t}=this,n=Vr(this.querySegEl(e)),r=this.eventRange=n.eventRange;this.dragging.minDistance=t.context.options.eventDragMinDistance,this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&this.component.props.eventSelection!==r.instance.instanceId)},this.handleDragStart=e=>{let{context:t}=this.component,n=this.eventRange;this.relevantEvents=fr(t.getCurrentData().eventStore,this.eventRange.instance.instanceId);let r=this.querySegEl(e);this.draggingSegEl=r,this.draggingSeg=Vr(r),t.calendarApi.unselect(),t.emitter.trigger("eventResizeStart",{el:r,event:new zr(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi})},this.handleHitUpdate=(e,t,n)=>{let{context:r}=this.component,i=this.relevantEvents,s=this.hitDragging.initialHit,o=this.eventRange.instance,a=null,l=null,c=!1,d={affectedEvents:i,mutatedEvents:{defs:{},instances:{}},isEvent:!0};if(e){e.componentId===s.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(s,e)||(a=function(e,t,n,r){let i=e.context.dateEnv,s=e.dateSpan.range.start,o=t.dateSpan.range.start,a=$n(s,o,i,e.largeUnit);if(n){if(i.add(r.start,a)r.start)return{endDelta:a};return null}(s,e,n.subjectEl.classList.contains("fc-event-resizer-start"),o.range))}a&&(l=Pr(i,r.getCurrentData().eventUiBases,a,r),d.mutatedEvents=l,ms(d,e.dateProfile,r)||(c=!0,a=null,l=null,d.mutatedEvents=null)),l?r.dispatch({type:"SET_EVENT_RESIZE",state:d}):r.dispatch({type:"UNSET_EVENT_RESIZE"}),c?et():tt(),t||(a&&xa(s,e)&&(a=null),this.validMutation=a,this.mutatedRelevantEvents=l)},this.handleDragEnd=e=>{let{context:t}=this.component,n=this.eventRange.def,r=this.eventRange.instance,i=new zr(t,n,r),s=this.relevantEvents,o=this.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:this.draggingSegEl,event:i,jsEvent:e.origEvent,view:t.viewApi}),this.validMutation){let a=new zr(t,o.defs[n.defId],r?o.instances[r.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:o});let l={oldEvent:i,event:a,relatedEvents:Lr(o,t,r),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",Object.assign(Object.assign({},l),{el:this.draggingSegEl,startDelta:this.validMutation.startDelta||jt(0),endDelta:this.validMutation.endDelta||jt(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",l)}else t.emitter.trigger("_noEventResize");this.draggingSeg=null,this.relevantEvents=null,this.validMutation=null};let{component:t}=e,n=this.dragging=new Sa(e.el);n.pointer.selector=".fc-event-resizer",n.touchScrollAllowed=!1,n.autoScroller.isEnabled=t.context.options.dragScroll;let r=this.hitDragging=new Ra(this.dragging,pi(e));r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}querySegEl(e){return He(e.subjectEl,".fc-event")}}],calendarInteractions:[class{constructor(e){this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=e=>{e.jsEvent&&(this.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=e=>{let t=this.context.options.unselectCancel,n=We(e.origEvent);this.matchesCancel=!!He(n,t),this.matchesEvent=!!He(n,Ta.SELECTOR)},this.onDocumentPointerUp=e=>{let{context:t}=this,{documentPointer:n}=this,r=t.getCurrentData();if(!n.wasTouchScroll){if(r.dateSelection&&!this.isRecentPointerDateSelect){let n=t.options.unselectAuto;!n||n&&this.matchesCancel||t.calendarApi.unselect(e)}r.eventSelection&&!this.matchesEvent&&t.dispatch({type:"UNSELECT_EVENT"})}this.isRecentPointerDateSelect=!1};let t=this.documentPointer=new pa(document);t.shouldIgnoreMove=!0,t.shouldWatchScroll=!1,t.emitter.on("pointerdown",this.onDocumentPointerDown),t.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}destroy(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()}}],elementDraggingImpl:Sa,optionRefiners:ka,listenerRefiners:Ma});class Pa extends Vi{constructor(){super(...arguments),this.headerElRef={current:null}}renderSimpleLayout(e,t){let{props:n,context:r}=this,i=[],s=js(r.options);return e&&i.push({type:"header",key:"header",isSticky:s,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),i.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),f(Un,{elClasses:["fc-daygrid"],viewSpec:r.viewSpec},f(Us,{liquid:!n.isHeightAuto&&!n.forPrint,collapsibleWidth:n.forPrint,cols:[],sections:i}))}renderHScrollLayout(e,t,n,r){let i=this.context.pluginHooks.scrollGridImpl;if(!i)throw new Error("No ScrollGrid implementation");let{props:s,context:o}=this,a=!s.forPrint&&js(o.options),l=!s.forPrint&&zs(o.options),c=[];return e&&c.push({type:"header",key:"header",isSticky:a,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),c.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),l&&c.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:Bs}]}),f(Un,{elClasses:["fc-daygrid"],viewSpec:o.viewSpec},f(i,{liquid:!s.isHeightAuto&&!s.forPrint,collapsibleWidth:s.forPrint,colGroups:[{cols:[{span:n,minWidth:r}]}],sections:c}))}}function Ha(e,t){let n=[];for(let e=0;e{let n=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return f(p,null,t.map(t=>{let r=t.eventRange.instance.instanceId;return f("div",{className:"fc-daygrid-event-harness",key:r,style:{visibility:n[r]?"hidden":""}},Ua(t)?f(Wa,Object.assign({seg:t,isDragging:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},Kr(t,e.todayRange))):f(La,Object.assign({seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},Kr(t,e.todayRange))))}))}})}}function Ga(e){let t=[],n=[];for(let r of e)t.push(r.seg),r.isVisible||n.push(r.seg);return{allSegs:t,invisibleSegs:n}}const Qa=gn({week:"narrow"});class qa extends Vi{constructor(){super(...arguments),this.rootElRef={current:null},this.state={dayNumberId:Ge()},this.handleRootEl=e=>{On(this.rootElRef,e),On(this.props.elRef,e)}}render(){let{context:e,props:t,state:n,rootElRef:r}=this,{options:i}=e,{date:s,dateProfile:o}=t;return f(Qs,{elTag:"td",elRef:this.handleRootEl,elClasses:["fc-daygrid-day",...t.extraClassNames||[]],elAttrs:Object.assign(Object.assign(Object.assign({},t.extraDataAttrs),t.showDayNumber?{"aria-labelledby":n.dayNumberId}:{}),{role:"gridcell"}),defaultGenerator:Ya,date:s,dateProfile:o,todayRange:t.todayRange,showDayNumber:t.showDayNumber,extraRenderProps:t.extraRenderProps},(o,a)=>f("div",{className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",ref:t.innerElRef},t.showWeekNumber&&f($s,{elTag:"a",elClasses:["fc-daygrid-week-number"],elAttrs:ki(e,s,"week"),date:s,defaultFormat:Qa}),Boolean(!a.isDisabled&&(t.showDayNumber||qs(i)||t.forceDayTop))&&f("div",{className:"fc-daygrid-day-top"},f(o,{elTag:"a",elClasses:["fc-daygrid-day-number"],elAttrs:Object.assign(Object.assign({},ki(e,s)),{id:n.dayNumberId})})),f("div",{className:"fc-daygrid-day-events",ref:t.fgContentElRef},t.fgContent,f("div",{className:"fc-daygrid-day-bottom",style:{marginTop:t.moreMarginTop}},f(Va,{allDayDate:s,singlePlacements:t.singlePlacements,moreCnt:t.moreCnt,alignmentElRef:r,alignGridTop:!t.showDayNumber,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,todayRange:t.todayRange}))),f("div",{className:"fc-daygrid-day-bg"},t.bgContent)))}}function Ya(e){return e.dayNumberText||f(p,null," ")}function Za(e,t,n,r,i,s,o){let a=new Ja;a.allowReslicing=!0,a.strictOrder=r,!0===t||!0===n?(a.maxCoord=s,a.hiddenConsumes=!0):"number"==typeof t?a.maxStackCnt=t:"number"==typeof n&&(a.maxStackCnt=n,a.hiddenConsumes=!0);let l=[],c=[];for(let t=0;t1,o=r.span.start===e;d+=r.levelCoord-c,c=r.levelCoord+r.thickness,s?(d+=r.thickness,o&&u.push({seg:Xa(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:r.levelCoord,marginTop:0})):o&&(u.push({seg:Xa(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:r.levelCoord,marginTop:d}),d=0)}i.push(l),s.push(u),o.push(d)}return{singleColPlacements:i,multiColPlacements:s,leftoverMargins:o}}(u,e,o),p=[],m=[];for(let e of c){f[e.firstCol].push({seg:e,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let t=e.firstCol;t<=e.lastCol;t+=1)h[t].push({seg:Xa(e,t,t+1,o),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e!this.forceHidden[qi(e)];for(let e=0;e{e&&this.updateSizing(!0)}}render(){let{props:e,state:t,context:n}=this,{options:r}=n,i=e.cells.length,s=Ba(e.businessHourSegs,i),o=Ba(e.bgEventSegs,i),a=Ba(this.getHighlightSegs(),i),l=Ba(this.getMirrorSegs(),i),{singleColPlacements:c,multiColPlacements:d,moreCnts:u,moreMarginTops:h}=Za(qr(e.fgEventSegs,r.eventOrder),e.dayMaxEvents,e.dayMaxEventRows,r.eventOrderStrict,t.eventInstanceHeights,t.maxContentHeight,e.cells),g=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{};return f("tr",{ref:this.rootElRef,role:"row"},e.renderIntro&&e.renderIntro(),e.cells.map((t,n)=>{let r=this.renderFgSegs(n,e.forPrint?c[n]:d[n],e.todayRange,g),i=this.renderFgSegs(n,function(e,t){if(!e.length)return[];let n=function(e){let t={};for(let n of e)for(let e of n)t[e.seg.eventRange.instance.instanceId]=e.absoluteTop;return t}(t);return e.map(e=>({seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0}))}(l[n],d),e.todayRange,{},Boolean(e.eventDrag),Boolean(e.eventResize),!1);return f(qa,{key:t.key,elRef:this.cellElRefs.createRef(t.key),innerElRef:this.frameElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,showDayNumber:e.showDayNumbers,showWeekNumber:e.showWeekNumbers&&0===n,forceDayTop:e.showWeekNumbers,todayRange:e.todayRange,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:u[n],moreMarginTop:h[n],singlePlacements:c[n],fgContentElRef:this.fgElRefs.createRef(t.key),fgContent:f(p,null,f(p,null,r),f(p,null,i)),bgContent:f(p,null,this.renderFillSegs(a[n],"highlight"),this.renderFillSegs(s[n],"non-business"),this.renderFillSegs(o[n],"bg-event"))})}))}componentDidMount(){this.updateSizing(!0),this.context.addResizeHandler(this.handleResize)}componentDidUpdate(e,t){let n=this.props;this.updateSizing(!xe(e,n))}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}getHighlightSegs(){let{props:e}=this;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs}getMirrorSegs(){let{props:e}=this;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]}renderFgSegs(e,t,n,r,i,s,o){let{context:a}=this,{eventSelection:l}=this.props,{framePositions:c}=this.state,d=1===this.props.cells.length,u=i||s||o,h=[];if(c)for(let g of t){let{seg:t}=g,{instanceId:p}=t.eventRange.instance,m=p+":"+e,v=g.isVisible&&!r[p],b=g.isAbsolute,y="",E="";b&&(a.isRtl?(E=0,y=c.lefts[t.lastCol]-c.lefts[t.firstCol]):(y=0,E=c.rights[t.firstCol]-c.rights[t.lastCol])),h.push(f("div",{className:"fc-daygrid-event-harness"+(b?" fc-daygrid-event-harness-abs":""),key:m,ref:u?null:this.segHarnessRefs.createRef(m),style:{visibility:v?"":"hidden",marginTop:b?"":g.marginTop,top:b?g.absoluteTop:"",left:y,right:E}},Ua(t)?f(Wa,Object.assign({seg:t,isDragging:i,isSelected:p===l,defaultDisplayEventEnd:d},Kr(t,n))):f(La,Object.assign({seg:t,isDragging:i,isResizing:s,isDateSelecting:o,isSelected:p===l,defaultDisplayEventEnd:d},Kr(t,n)))))}return h}renderFillSegs(e,t){let{isRtl:n}=this.context,{todayRange:r}=this.props,{framePositions:i}=this.state,s=[];if(i)for(let o of e){let e=n?{right:0,left:i.lefts[o.lastCol]-i.lefts[o.firstCol]}:{left:0,right:i.rights[o.firstCol]-i.rights[o.lastCol]};s.push(f("div",{key:ti(o.eventRange),className:"fc-daygrid-bg-harness",style:e},"bg-event"===t?f(Zs,Object.assign({seg:o},Kr(o,r))):Js(t)))}return f(p,{},...s)}updateSizing(e){let{props:t,frameElRefs:n}=this;if(!t.forPrint&&null!==t.clientWidth){if(e){let e=t.cells.map(e=>n.currentMap[e.key]);if(e.length){let t=this.rootElRef.current;this.setState({framePositions:new Ui(t,e,!0,!1)})}}const r=this.state.eventInstanceHeights,i=this.queryEventInstanceHeights(),s=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.safeSetState({eventInstanceHeights:Object.assign(Object.assign({},r),i),maxContentHeight:s?this.computeMaxContentHeight():null})}}queryEventInstanceHeights(){let e=this.segHarnessRefs.currentMap,t={};for(let n in e){let r=Math.round(e[n].getBoundingClientRect().height),i=n.split(":")[0];t[i]=Math.max(t[i]||0,r)}return t}computeMaxContentHeight(){let e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top}getCellEls(){let e=this.cellElRefs.currentMap;return this.props.cells.map(t=>e[t.key])}}$a.addStateEquality({eventInstanceHeights:xe});class Ka extends Vi{constructor(){super(...arguments),this.splitBusinessHourSegs=Oe(Ha),this.splitBgEventSegs=Oe(Ha),this.splitFgEventSegs=Oe(Ha),this.splitDateSelectionSegs=Oe(Ha),this.splitEventDrag=Oe(ja),this.splitEventResize=Oe(ja),this.rowRefs=new Rs,this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e}=this,{dateProfile:t,dayMaxEventRows:n,dayMaxEvents:r,expandRows:i}=e,s=e.cells.length,o=this.splitBusinessHourSegs(e.businessHourSegs,s),a=this.splitBgEventSegs(e.bgEventSegs,s),l=this.splitFgEventSegs(e.fgEventSegs,s),c=this.splitDateSelectionSegs(e.dateSelectionSegs,s),d=this.splitEventDrag(e.eventDrag,s),u=this.splitEventResize(e.eventResize,s),h=!0===r||!0===n;return h&&!i&&(h=!1,n=null,r=null),f("div",{className:["fc-daygrid-body",h?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",i?"":"fc-daygrid-body-natural"].join(" "),ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},f(ls,{unit:"day"},(h,g)=>f(p,null,f("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:e.clientWidth,minWidth:e.tableMinWidth,height:i?e.clientHeight:""}},e.colGroupNode,f("tbody",{role:"presentation"},e.cells.map((i,h)=>f($a,{ref:this.rowRefs.createRef(h),key:i.length?i[0].date.toISOString():h,showDayNumbers:s>1,showWeekNumbers:e.showWeekNumbers,todayRange:g,dateProfile:t,cells:i,renderIntro:e.renderRowIntro,businessHourSegs:o[h],eventSelection:e.eventSelection,bgEventSegs:a[h].filter(el),fgEventSegs:l[h],dateSelectionSegs:c[h],eventDrag:d[h],eventResize:u[h],dayMaxEvents:r,dayMaxEventRows:n,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint})))))))}prepareHits(){this.rowPositions=new Ui(this.rootEl,this.rowRefs.collect().map(e=>e.getCellEls()[0]),!1,!0),this.colPositions=new Ui(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)}queryHit(e,t){let{colPositions:n,rowPositions:r}=this,i=n.leftToIndex(e),s=r.topToIndex(t);if(null!=s&&null!=i){let e=this.props.cells[s][i];return{dateProfile:this.props.dateProfile,dateSpan:Object.assign({range:this.getCellRange(s,i),allDay:!0},e.extraDateSpan),dayEl:this.getCellEl(s,i),rect:{left:n.lefts[i],right:n.rights[i],top:r.tops[s],bottom:r.bottoms[s]},layer:0}}return null}getCellEl(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]}getCellRange(e,t){let n=this.props.cells[e][t].date;return{start:n,end:vt(n,1)}}}function el(e){return e.eventRange.def.allDay}class tl extends gs{constructor(){super(...arguments),this.forceDayIfListItem=!0}sliceRange(e,t){return t.sliceRange(e)}}class nl extends Vi{constructor(){super(...arguments),this.slicer=new tl,this.tableRef={current:null}}render(){let{props:e,context:t}=this;return f(Ka,Object.assign({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}))}}function rl(e,t){let n=new hs(e.renderRange,t);return new fs(n,/year|month|week/.test(e.currentRangeUnit))}ye(':root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:"";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:"";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}');var il=mo({name:"@fullcalendar/daygrid",initialView:"dayGridMonth",views:{dayGrid:{component:class extends Pa{constructor(){super(...arguments),this.buildDayTableModel=Oe(rl),this.headerRef={current:null},this.tableRef={current:null}}render(){let{options:e,dateProfileGenerator:t}=this.context,{props:n}=this,r=this.buildDayTableModel(n.dateProfile,t),i=e.dayHeaders&&f(ds,{ref:this.headerRef,dateProfile:n.dateProfile,dates:r.headerDates,datesRepDistinctDays:1===r.rowCnt}),s=t=>f(nl,{ref:this.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:e.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.weekNumbers,expandRows:!n.isHeightAuto,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:n.forPrint});return e.dayMinWidth?this.renderHScrollLayout(i,s,r.colCnt,e.dayMinWidth):this.renderSimpleLayout(i,s)}},dateProfileGeneratorClass:class extends er{buildRenderRange(e,t,n){let r,{dateEnv:i}=this.props,s=super.buildRenderRange(e,t,n),o=s.start,a=s.end;if(/^(year|month)$/.test(t)&&(o=i.startOfWeek(o),r=i.startOfWeek(a),r.valueOf()!==a.valueOf()&&(a=mt(r,1))),this.props.monthMode&&this.props.fixedWeekCount){a=mt(a,6-Math.ceil(yt(o,a)))}return{start:o,end:a}}}},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});class sl extends wi{getKeyInfo(){return{allDay:{},timed:{}}}getKeysForDateSpan(e){return e.allDay?["allDay"]:["timed"]}getKeysForEventDef(e){return e.allDay?Fr(e)?["timed","allDay"]:["allDay"]:["timed"]}}const ol=gn({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function al(e){let t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return f(Tn.Consumer,null,n=>{if(!e.isLabeled)return f("td",{className:t.join(" "),"data-time":e.isoTimeStr});let{dateEnv:r,options:i,viewApi:s}=n,o=null==i.slotLabelFormat?ol:Array.isArray(i.slotLabelFormat)?gn(i.slotLabelFormat[0]):gn(i.slotLabelFormat),a={level:0,time:e.time,date:r.toDate(e.date),view:s,text:r.format(e.date,o)};return f(jn,{elTag:"td",elClasses:t,elAttrs:{"data-time":e.isoTimeStr},renderProps:a,generatorName:"slotLabelContent",generator:i.slotLabelContent||ll,classNameGenerator:i.slotLabelClassNames,didMount:i.slotLabelDidMount,willUnmount:i.slotLabelWillUnmount},e=>f("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},f(e,{elTag:"div",elClasses:["fc-timegrid-slot-label-cushion","fc-scrollgrid-shrink-cushion"]})))})}function ll(e){return e.text}class cl extends In{render(){return this.props.slatMetas.map(e=>f("tr",{key:e.key},f(al,Object.assign({},e))))}}const dl=gn({week:"short"});class ul extends Vi{constructor(){super(...arguments),this.allDaySplitter=new sl,this.headerElRef={current:null},this.rootElRef={current:null},this.scrollerElRef={current:null},this.state={slatCoords:null},this.handleScrollTopRequest=e=>{let t=this.scrollerElRef.current;t&&(t.scrollTop=e)},this.renderHeadAxis=(e,t="")=>{let{options:n}=this.context,{dateProfile:r}=this.props,i=r.renderRange,s=1===Et(i.start,i.end)?ki(this.context,i.start,"week"):{};return n.weekNumbers&&"day"===e?f($s,{elTag:"th",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},date:i.start,defaultFormat:dl},e=>f("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame","fc-timegrid-axis-frame-liquid"].join(" "),style:{height:t}},f(e,{elTag:"a",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"],elAttrs:s}))):f("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},f("div",{className:"fc-timegrid-axis-frame",style:{height:t}}))},this.renderTableRowAxis=e=>{let{options:t,viewApi:n}=this.context,r={text:t.allDayText,view:n};return f(jn,{elTag:"td",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},renderProps:r,generatorName:"allDayContent",generator:t.allDayContent||hl,classNameGenerator:t.allDayClassNames,didMount:t.allDayDidMount,willUnmount:t.allDayWillUnmount},t=>f("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame",null==e?" fc-timegrid-axis-frame-liquid":""].join(" "),style:{height:e}},f(t,{elTag:"span",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"]})))},this.handleSlatCoords=e=>{this.setState({slatCoords:e})}}renderSimpleLayout(e,t,n){let{context:r,props:i}=this,s=[],o=js(r.options);return e&&s.push({type:"header",key:"header",isSticky:o,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(s.push({type:"body",key:"all-day",chunk:{content:t}}),s.push({type:"body",key:"all-day-divider",outerContent:f("tr",{role:"presentation",className:"fc-scrollgrid-section"},f("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),s.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),f(Un,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:r.viewSpec},f(Us,{liquid:!i.isHeightAuto&&!i.forPrint,collapsibleWidth:i.forPrint,cols:[{width:"shrink"}],sections:s}))}renderHScrollLayout(e,t,n,r,i,s,o){let a=this.context.pluginHooks.scrollGridImpl;if(!a)throw new Error("No ScrollGrid implementation");let{context:l,props:c}=this,d=!c.forPrint&&js(l.options),u=!c.forPrint&&zs(l.options),h=[];e&&h.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>f("tr",{role:"presentation"},this.renderHeadAxis("day",e.rowSyncHeights[0]))},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(h.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>f("tr",{role:"presentation"},this.renderTableRowAxis(e.rowSyncHeights[0]))},{key:"cols",content:t}]}),h.push({key:"all-day-divider",type:"body",outerContent:f("tr",{role:"presentation",className:"fc-scrollgrid-section"},f("td",{colSpan:2,className:"fc-timegrid-divider "+l.theme.getClass("tableCellShaded")}))}));let g=l.options.nowIndicator;return h.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(l.options.expandRows),chunks:[{key:"axis",content:e=>f("div",{className:"fc-timegrid-axis-chunk"},f("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,f("tbody",null,f(cl,{slatMetas:s}))),f("div",{className:"fc-timegrid-now-indicator-container"},f(ls,{unit:g?"minute":"day"},e=>{let t=g&&o&&o.safeComputeTop(e);return"number"==typeof t?f(Vs,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:t},isAxis:!0,date:e}):null})))},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),u&&h.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:Bs},{key:"cols",content:Bs}]}),f(Un,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:l.viewSpec},f(a,{liquid:!c.isHeightAuto&&!c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:i}]}],sections:h}))}getAllDayMaxEventProps(){let{dayMaxEvents:e,dayMaxEventRows:t}=this.context.options;return!0!==e&&!0!==t||(e=void 0,t=5),{dayMaxEvents:e,dayMaxEventRows:t}}}function hl(e){return e.text}class fl{constructor(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}safeComputeTop(e){let{dateProfile:t}=this;if(Yn(t.currentRange,e)){let n=wt(e),r=e.valueOf()-n.valueOf();if(r>=Ft(t.slotMinTime)&&r{let o={time:i.time,date:t.dateEnv.toDate(i.date),view:t.viewApi};return f("tr",{key:i.key,ref:r.createRef(i.key)},e.axis&&f(al,Object.assign({},i)),f(jn,{elTag:"td",elClasses:["fc-timegrid-slot","fc-timegrid-slot-lane",!i.isLabeled&&"fc-timegrid-slot-minor"],elAttrs:{"data-time":i.isoTimeStr},renderProps:o,generatorName:"slotLaneContent",generator:n.slotLaneContent,classNameGenerator:n.slotLaneClassNames,didMount:n.slotLaneDidMount,willUnmount:n.slotLaneWillUnmount}))}))}}class pl extends In{constructor(){super(...arguments),this.rootElRef={current:null},this.slatElRefs=new Rs}render(){let{props:e,context:t}=this;return f("div",{ref:this.rootElRef,className:"fc-timegrid-slots"},f("table",{"aria-hidden":!0,className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},e.tableColGroupNode,f(gl,{slatElRefs:this.slatElRefs,axis:e.axis,slatMetas:e.slatMetas})))}componentDidMount(){this.updateSizing()}componentDidUpdate(){this.updateSizing()}componentWillUnmount(){this.props.onCoords&&this.props.onCoords(null)}updateSizing(){let{context:e,props:t}=this;if(t.onCoords&&null!==t.clientWidth){this.rootElRef.current.offsetHeight&&t.onCoords(new fl(new Ui(this.rootElRef.current,(n=this.slatElRefs.currentMap,t.slatMetas.map(e=>n[e.key])),!1,!0),this.props.dateProfile,e.options.slotDuration))}var n}}function ml(e,t){let n,r=[];for(n=0;nTl(e.hiddenSegs,e),defaultGenerator:yl},e=>f(e,{elTag:"div",elClasses:["fc-timegrid-more-link-inner","fc-sticky"]}))}}function yl(e){return e.shortText}function El(e,t,n){let r=new Gi;null!=t&&(r.strictOrder=t),null!=n&&(r.maxStackCnt=n);let i=Yi(r.addSegs(e)),s=function(e){const{entriesByLevel:t}=e,n=wl((e,t)=>e+":"+t,(r,i)=>{let s=Al(function(e,t,n){let{levelCoords:r,entriesByLevel:i}=e,s=i[t][n],o=r[t]+s.thickness,a=r.length,l=t;for(;lqi(e),(e,r,i)=>{let s,{nextLevelNodes:o,thickness:a}=e,l=a+i,c=a/l,d=[];if(o.length)for(let e of o)if(void 0===s){let t=n(e,r,l);s=t[0],d.push(t[1])}else{let t=n(e,s,0);d.push(t[1])}else s=t;let u=(s-r)*c;return[s-u,Object.assign(Object.assign({},e),{thickness:u,nextLevelNodes:d})]});return e.map(e=>n(e,0,0)[1])}(s,1),{segRects:function(e){let t=[];const n=wl((e,t,n)=>qi(e),(e,n,i)=>{let s=Object.assign(Object.assign({},e),{levelCoord:n,stackDepth:i,stackForward:0});return t.push(s),s.stackForward=r(e.nextLevelNodes,n+e.thickness,i+1)+1});function r(e,t,r){let i=0;for(let s of e)i=Math.max(n(s,t,r),i);return i}return r(e,0,0),t}(s),hiddenGroups:i}}function Al(e,t){if(!e)return[[],0];let{level:n,lateralStart:r,lateralEnd:i}=e,s=r,o=[];for(;s{let i=e(...r);return i in n?n[i]:n[i]=t(...r)}}function Cl(e,t,n=null,r=0){let i=[];if(n)for(let s=0;sf("div",{className:"fc-timegrid-col-frame"},f("div",{className:"fc-timegrid-col-bg"},this.renderFillSegs(e.businessHourSegs,"non-business"),this.renderFillSegs(e.bgEventSegs,"bg-event"),this.renderFillSegs(e.dateSelectionSegs,"highlight")),f("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(o,s,!1,!1,!1)),f("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(i,{},Boolean(e.eventDrag),Boolean(e.eventResize),Boolean(r))),f("div",{className:"fc-timegrid-now-indicator-container"},this.renderNowIndicator(e.nowIndicatorSegs)),qs(n)&&f(t,{elTag:"div",elClasses:["fc-timegrid-col-misc"]})))}renderFgSegs(e,t,n,r,i){let{props:s}=this;return s.forPrint?Tl(e,s):this.renderPositionedFgSegs(e,t,n,r,i)}renderPositionedFgSegs(e,t,n,r,i){let{eventMaxStack:s,eventShortHeight:o,eventOrderStrict:a,eventMinHeight:l}=this.context.options,{date:c,slatCoords:d,eventSelection:u,todayRange:h,nowDate:g}=this.props,m=n||r||i,v=Cl(e,c,d,l),{segPlacements:b,hiddenGroups:y}=function(e,t,n,r){let i=[],s=[];for(let n=0;n{let{seg:s,rect:a}=e,l=s.eventRange.instance.instanceId,c=m||Boolean(!t[l]&&a),d=kl(a&&a.span),p=!m&&a?this.computeSegHStyle(a):{left:0,right:0},v=Boolean(a)&&a.stackForward>0,b=Boolean(a)&&a.span.end-a.span.start{let c=kl(e.span),d=(u=e.entries,h=t,u.map(e=>h[e.index]));var u,h;return f(bl,{key:Qt(so(d)),hiddenSegs:d,top:c.top,bottom:c.bottom,extraDateSpan:n,dateProfile:r,todayRange:i,nowDate:s,eventSelection:o,eventDrag:a,eventResize:l})}))}renderFillSegs(e,t){let{props:n,context:r}=this,i=Cl(e,n.date,n.slatCoords,r.options.eventMinHeight).map((r,i)=>{let s=e[i];return f("div",{key:ti(s.eventRange),className:"fc-timegrid-bg-harness",style:kl(r)},"bg-event"===t?f(Zs,Object.assign({seg:s},Kr(s,n.todayRange,n.nowDate))):Js(t))});return f(p,null,i)}renderNowIndicator(e){let{slatCoords:t,date:n}=this.props;return t?e.map((e,r)=>f(Vs,{key:r,elClasses:["fc-timegrid-now-indicator-line"],elStyle:{top:t.computeDateTop(e.start,n)},isAxis:!1,date:n})):null}computeSegHStyle(e){let t,n,{isRtl:r,options:i}=this.context,s=i.slotEventOverlap,o=e.levelCoord,a=e.levelCoord+e.thickness;s&&(a=Math.min(1,o+2*(a-o))),r?(t=1-a,n=o):(t=o,n=1-a);let l={zIndex:e.stackDepth+1,left:100*t+"%",right:100*n+"%"};return s&&!e.stackForward&&(l[r?"marginLeft":"marginRight"]=20),l}}function Tl(e,{todayRange:t,nowDate:n,eventSelection:r,eventDrag:i,eventResize:s}){let o=(i?i.affectedInstances:null)||(s?s.affectedInstances:null)||{};return f(p,null,e.map(e=>{let i=e.eventRange.instance.instanceId;return f("div",{key:i,style:{visibility:o[i]?"hidden":""}},f(xl,Object.assign({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:i===r,isShort:!1},Kr(e,t,n))))}))}function kl(e){return e?{top:e.start,bottom:-e.end}:{top:"",bottom:""}}class Ml extends In{constructor(){super(...arguments),this.splitFgEventSegs=Oe(ml),this.splitBgEventSegs=Oe(ml),this.splitBusinessHourSegs=Oe(ml),this.splitNowIndicatorSegs=Oe(ml),this.splitDateSelectionSegs=Oe(ml),this.splitEventDrag=Oe(vl),this.splitEventResize=Oe(vl),this.rootElRef={current:null},this.cellElRefs=new Rs}render(){let{props:e,context:t}=this,n=t.options.nowIndicator&&e.slatCoords&&e.slatCoords.safeComputeTop(e.nowDate),r=e.cells.length,i=this.splitFgEventSegs(e.fgEventSegs,r),s=this.splitBgEventSegs(e.bgEventSegs,r),o=this.splitBusinessHourSegs(e.businessHourSegs,r),a=this.splitNowIndicatorSegs(e.nowIndicatorSegs,r),l=this.splitDateSelectionSegs(e.dateSelectionSegs,r),c=this.splitEventDrag(e.eventDrag,r),d=this.splitEventResize(e.eventResize,r);return f("div",{className:"fc-timegrid-cols",ref:this.rootElRef},f("table",{role:"presentation",style:{minWidth:e.tableMinWidth,width:e.clientWidth}},e.tableColGroupNode,f("tbody",{role:"presentation"},f("tr",{role:"row"},e.axis&&f("td",{"aria-hidden":!0,className:"fc-timegrid-col fc-timegrid-axis"},f("div",{className:"fc-timegrid-col-frame"},f("div",{className:"fc-timegrid-now-indicator-container"},"number"==typeof n&&f(Vs,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:n},isAxis:!0,date:e.nowDate})))),e.cells.map((t,n)=>f(_l,{key:t.key,elRef:this.cellElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,nowDate:e.nowDate,todayRange:e.todayRange,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,fgEventSegs:i[n],bgEventSegs:s[n],businessHourSegs:o[n],nowIndicatorSegs:a[n],dateSelectionSegs:l[n],eventDrag:c[n],eventResize:d[n],slatCoords:e.slatCoords,eventSelection:e.eventSelection,forPrint:e.forPrint}))))))}componentDidMount(){this.updateCoords()}componentDidUpdate(){this.updateCoords()}updateCoords(){let{props:e}=this;var t;e.onColCoords&&null!==e.clientWidth&&e.onColCoords(new Ui(this.rootElRef.current,(t=this.cellElRefs.currentMap,e.cells.map(e=>t[e.key])),!0,!1))}}class Il extends Vi{constructor(){super(...arguments),this.processSlotOptions=Oe(Ol),this.state={slatCoords:null},this.handleRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)},this.handleScrollRequest=e=>{let{onScrollTopRequest:t}=this.props,{slatCoords:n}=this.state;if(t&&n){if(e.time){let r=n.computeTimeTop(e.time);r=Math.ceil(r),r&&(r+=1),t(r)}return!0}return!1},this.handleColCoords=e=>{this.colCoords=e},this.handleSlatCoords=e=>{this.setState({slatCoords:e}),this.props.onSlatCoords&&this.props.onSlatCoords(e)}}render(){let{props:e,state:t}=this;return f("div",{className:"fc-timegrid-body",ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},f(pl,{axis:e.axis,dateProfile:e.dateProfile,slatMetas:e.slatMetas,clientWidth:e.clientWidth,minHeight:e.expandRows?e.clientHeight:"",tableMinWidth:e.tableMinWidth,tableColGroupNode:e.axis?e.tableColGroupNode:null,onCoords:this.handleSlatCoords}),f(Ml,{cells:e.cells,axis:e.axis,dateProfile:e.dateProfile,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,todayRange:e.todayRange,nowDate:e.nowDate,nowIndicatorSegs:e.nowIndicatorSegs,clientWidth:e.clientWidth,tableMinWidth:e.tableMinWidth,tableColGroupNode:e.tableColGroupNode,slatCoords:t.slatCoords,onColCoords:this.handleColCoords,forPrint:e.forPrint}))}componentDidMount(){this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)}componentDidUpdate(e){this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)}componentWillUnmount(){this.scrollResponder.detach()}queryHit(e,t){let{dateEnv:n,options:r}=this.context,{colCoords:i}=this,{dateProfile:s}=this.props,{slatCoords:o}=this.state,{snapDuration:a,snapsPerSlot:l}=this.processSlotOptions(this.props.slotDuration,r.snapDuration),c=i.leftToIndex(e),d=o.positions.topToIndex(t);if(null!=c&&null!=d){let e=this.props.cells[c],r=o.positions.tops[d],u=o.positions.getHeight(d),h=(t-r)/u,f=d*l+Math.floor(h*l),g=this.props.cells[c].date,p=Ut(s.slotMinTime,Lt(a,f)),m=n.add(g,p),v=n.add(m,a);return{dateProfile:s,dateSpan:Object.assign({range:{start:m,end:v},allDay:!1},e.extraDateSpan),dayEl:i.els[c],rect:{left:i.lefts[c],right:i.rights[c],top:r,bottom:r+u},layer:0}}return null}}function Ol(e,t){let n=t||e,r=Vt(e,n);return null===r&&(n=e,r=1),{snapDuration:n,snapsPerSlot:r}}class Nl extends gs{sliceRange(e,t){let n=[];for(let r=0;rf(Il,Object.assign({ref:this.timeColsRef},this.slicer.sliceProps(e,n,null,t,s),{forPrint:e.forPrint,axis:e.axis,dateProfile:n,slatMetas:e.slatMetas,slotDuration:e.slotDuration,cells:r.cells[0],tableColGroupNode:e.tableColGroupNode,tableMinWidth:e.tableMinWidth,clientWidth:e.clientWidth,clientHeight:e.clientHeight,expandRows:e.expandRows,nowDate:o,nowIndicatorSegs:i&&this.slicer.sliceNowDate(o,t,s),todayRange:a,onScrollTopRequest:e.onScrollTopRequest,onSlatCoords:e.onSlatCoords})))}}function Hl(e,t,n){let r=[];for(let i of e.headerDates)r.push({start:n.add(i,t.slotMinTime),end:n.add(i,t.slotMaxTime)});return r}const Bl=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];function jl(e,t,n,r,i){let s=new Date(0),o=e,a=jt(0),l=n||function(e){let t,n,r;for(t=Bl.length-1;t>=0;t-=1)if(n=jt(Bl[t]),r=Vt(n,e),null!==r&&r>1)return n;return e}(r),c=[];for(;Ft(o)table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:"\\00a0"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:"\\00a0-\\00a0"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}');var Ll=mo({name:"@fullcalendar/timegrid",initialView:"timeGridWeek",optionRefiners:Ul,views:{timeGrid:{component:class extends ul{constructor(){super(...arguments),this.buildTimeColsModel=Oe(zl),this.buildSlatMetas=Oe(jl)}render(){let{options:e,dateEnv:t,dateProfileGenerator:n}=this.context,{props:r}=this,{dateProfile:i}=r,s=this.buildTimeColsModel(i,n),o=this.allDaySplitter.splitProps(r),a=this.buildSlatMetas(i.slotMinTime,i.slotMaxTime,e.slotLabelInterval,e.slotDuration,t),{dayMinWidth:l}=e,c=!l,d=l,u=e.dayHeaders&&f(ds,{dates:s.headerDates,dateProfile:i,datesRepDistinctDays:!0,renderIntro:c?this.renderHeadAxis:null}),h=!1!==e.allDaySlot&&(t=>f(nl,Object.assign({},o.allDay,{dateProfile:i,dayTableModel:s,nextDayThreshold:e.nextDayThreshold,tableMinWidth:t.tableMinWidth,colGroupNode:t.tableColGroupNode,renderRowIntro:c?this.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:r.forPrint},this.getAllDayMaxEventProps()))),g=t=>f(Pl,Object.assign({},o.timed,{dayTableModel:s,dateProfile:i,axis:c,slotDuration:e.slotDuration,slatMetas:a,forPrint:r.forPrint,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,onSlatCoords:this.handleSlatCoords,expandRows:t.expandRows,onScrollTopRequest:this.handleScrollTopRequest}));return d?this.renderHScrollLayout(u,h,g,s.colCnt,l,a,this.state.slatCoords):this.renderSimpleLayout(u,h,g)}},usesMinMaxTime:!0,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}});class Wl extends In{constructor(){super(...arguments),this.state={textId:Ge()}}render(){let{theme:e,dateEnv:t,options:n,viewApi:r}=this.context,{cellId:i,dayDate:s,todayRange:o}=this.props,{textId:a}=this.state,l=Ri(s,o),c=n.listDayFormat?t.format(s,n.listDayFormat):"",d=n.listDaySideFormat?t.format(s,n.listDaySideFormat):"",u=Object.assign({date:t.toDate(s),view:r,textId:a,text:c,sideText:d,navLinkAttrs:ki(this.context,s),sideNavLinkAttrs:ki(this.context,s,"day",!1)},l);return f(jn,{elTag:"tr",elClasses:["fc-list-day",...xi(l,e)],elAttrs:{"data-date":qt(s)},renderProps:u,generatorName:"dayHeaderContent",generator:n.dayHeaderContent||Fl,classNameGenerator:n.dayHeaderClassNames,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},t=>f("th",{scope:"colgroup",colSpan:3,id:i,"aria-labelledby":a},f(t,{elTag:"div",elClasses:["fc-list-day-cushion",e.getClass("tableCellShaded")]})))}}function Fl(e){return f(p,null,e.text&&f("a",Object.assign({id:e.textId,className:"fc-list-day-text"},e.navLinkAttrs),e.text),e.sideText&&f("a",Object.assign({"aria-hidden":!0,className:"fc-list-day-side-text"},e.sideNavLinkAttrs),e.sideText))}const Vl=gn({hour:"numeric",minute:"2-digit",meridiem:"short"});class Gl extends In{render(){let{props:e,context:t}=this,{options:n}=t,{seg:r,timeHeaderId:i,eventHeaderId:s,dateHeaderId:o}=e,a=n.eventTimeFormat||Vl;return f(Ls,Object.assign({},e,{elTag:"tr",elClasses:["fc-list-event",r.eventRange.def.url&&"fc-event-forced-url"],defaultGenerator:()=>function(e,t){let n=ni(e,t);return f("a",Object.assign({},n),e.eventRange.def.title)}(r,t),seg:r,timeText:"",disableDragging:!0,disableResizing:!0}),(e,n)=>f(p,null,function(e,t,n,r,i){let{options:s}=n;if(!1!==s.displayEventTime){let o,a=e.eventRange.def,l=e.eventRange.instance,c=!1;if(a.allDay?c=!0:Jn(e.eventRange.range)?e.isStart?o=$r(e,t,n,null,null,l.range.start,e.end):e.isEnd?o=$r(e,t,n,null,null,e.start,l.range.end):c=!0:o=$r(e,t,n),c){let e={text:n.options.allDayText,view:n.viewApi};return f(jn,{elTag:"td",elClasses:["fc-list-event-time"],elAttrs:{headers:`${r} ${i}`},renderProps:e,generatorName:"allDayContent",generator:s.allDayContent||Ql,classNameGenerator:s.allDayClassNames,didMount:s.allDayDidMount,willUnmount:s.allDayWillUnmount})}return f("td",{className:"fc-list-event-time"},o)}return null}(r,a,t,i,o),f("td",{"aria-hidden":!0,className:"fc-list-event-graphic"},f("span",{className:"fc-list-event-dot",style:{borderColor:n.borderColor||n.backgroundColor}})),f(e,{elTag:"td",elClasses:["fc-list-event-title"],elAttrs:{headers:`${s} ${o}`}})))}}function Ql(e){return e.text}function ql(e){return e.text}function Yl(e){let t=wt(e.renderRange.start),n=e.renderRange.end,r=[],i=[];for(;t*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:"";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}');var Jl=mo({name:"@fullcalendar/list",optionRefiners:Zl,views:{list:{component:class extends Vi{constructor(){super(...arguments),this.computeDateVars=Oe(Yl),this.eventStoreToSegs=Oe(this._eventStoreToSegs),this.state={timeHeaderId:Ge(),eventHeaderId:Ge(),dateHeaderIdRoot:Ge()},this.setRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e,context:t}=this,{dayDates:n,dayRanges:r}=this.computeDateVars(e.dateProfile),i=this.eventStoreToSegs(e.eventStore,e.eventUiBases,r);return f(Un,{elRef:this.setRootEl,elClasses:["fc-list",t.theme.getClass("table"),!1!==t.options.stickyHeaderDates?"fc-list-sticky":""],viewSpec:t.viewSpec},f(Cs,{liquid:!e.isHeightAuto,overflowX:e.isHeightAuto?"visible":"hidden",overflowY:e.isHeightAuto?"visible":"auto"},i.length>0?this.renderSegList(i,n):this.renderEmptyMessage()))}renderEmptyMessage(){let{options:e,viewApi:t}=this.context,n={text:e.noEventsText,view:t};return f(jn,{elTag:"div",elClasses:["fc-list-empty"],renderProps:n,generatorName:"noEventsContent",generator:e.noEventsContent||ql,classNameGenerator:e.noEventsClassNames,didMount:e.noEventsDidMount,willUnmount:e.noEventsWillUnmount},e=>f(e,{elTag:"div",elClasses:["fc-list-empty-cushion"]}))}renderSegList(e,t){let{theme:n,options:r}=this.context,{timeHeaderId:i,eventHeaderId:s,dateHeaderIdRoot:o}=this.state,a=function(e){let t,n,r=[];for(t=0;t{let c=[];for(let n=0;n{switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":this.renderRunner.tryDrain()}},this.handleData=e=>{this.currentData=e,this.renderRunner.request(e.calendarOptions.rerenderDelay)},this.handleRenderRequest=()=>{if(this.isRendering){this.isRendered=!0;let{currentData:e}=this;Cn(()=>{P(f(fi,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(t,n,r,i)=>(this.setClassNames(t),this.setHeight(n),f(Bn.Provider,{value:this.customContentRenderId},f(la,Object.assign({isHeightAuto:r,forPrint:i},e))))),this.el)})}else this.isRendered&&(this.isRendered=!1,P(null,this.el),this.setClassNames([]),this.setHeight(""))},this.el=e,this.renderRunner=new Ee(this.handleRenderRequest),new Qo({optionOverrides:t,calendarApi:this,onAction:this.handleAction,onData:this.handleData})}render(){let e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()}destroy(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())}updateSize(){Cn(()=>{super.updateSize()})}batchRendering(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")}pauseRendering(){this.renderRunner.pause("pauseRendering")}resumeRendering(){this.renderRunner.resume("pauseRendering",!0)}resetOptions(e,t){this.currentDataManager.resetOptions(e,t)}setClassNames(e){if(!Ie(e,this.currentClassNames)){let{classList:t}=this.el;for(let e of this.currentClassNames)t.remove(e);for(let n of e)t.add(n);this.currentClassNames=e}}setHeight(e){Le(this.el,"height",e)}},e.Draggable=class{constructor(e,t={}){this.handlePointerDown=e=>{let{dragging:t}=this,{minDistance:n,longPressDelay:r}=this.settings;t.minDistance=null!=n?n:e.isTouch?0:mn.eventDragMinDistance,t.delay=e.isTouch?null!=r?r:mn.longPressDelay:0},this.handleDragStart=e=>{e.isTouch&&this.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&this.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=t;let n=this.dragging=new Sa(e);n.touchScrollAllowed=!1,null!=t.itemSelector&&(n.pointer.selector=t.itemSelector),null!=t.appendTo&&(n.mirror.parentNode=t.appendTo),n.emitter.on("pointerdown",this.handlePointerDown),n.emitter.on("dragstart",this.handleDragStart),new Ia(n,t.eventData)}destroy(){this.dragging.destroy()}},e.Internal=lo,e.JsonRequestError=ci,e.ThirdPartyDraggable=class{constructor(e,t){let n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};let r=this.dragging=new Oa(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new Ia(r,t.eventData)}destroy(){this.dragging.destroy()}},e.createPlugin=mo,e.formatDate=function(e,t={}){let n=ua(t),r=gn(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""},e.formatRange=function(e,t,n){let r=ua("object"==typeof n&&n?n:{}),i=gn(n),s=r.createMarkerMeta(e),o=r.createMarkerMeta(t);return s&&o?r.formatRange(s.marker,o.marker,i,{forcedStartTzo:s.forcedTzo,forcedEndTzo:o.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:mn.defaultRangeSeparator}):""},e.globalLocales=co,e.globalPlugins=Fo,e.sliceEvents=function(e,t){return Wr(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},e.version="6.0.1",Object.defineProperty(e,"__esModule",{value:!0}),e}({}); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/index.global.min.js new file mode 100644 index 00000000..32b68540 --- /dev/null +++ b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/index.global.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Standard Bundle v6.1.10 +Docs & License: https://fullcalendar.io/docs/initialize-globals +(c) 2023 Adam Shaw +*/ +var FullCalendar=function(e){"use strict";var t,n,r,i,s,o,a,l,c,d={},u=[],h=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function f(e,t){for(var n in t)e[n]=t[n];return e}function g(e){var t=e.parentNode;t&&t.removeChild(e)}function p(e,n,r){var i,s,o,a={};for(o in n)"key"==o?i=n[o]:"ref"==o?s=n[o]:a[o]=n[o];if(arguments.length>2&&(a.children=arguments.length>3?t.call(arguments,2):r),"function"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===a[o]&&(a[o]=e.defaultProps[o]);return m(e,a,i,s,null)}function m(e,t,i,s,o){var a={type:e,props:t,key:i,ref:s,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++r:o};return null==o&&null!=n.vnode&&n.vnode(a),a}function v(){return{current:null}}function y(e){return e.children}function b(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||h.test(t)?n:n+"px"}function E(e,t,n,r,i){var s;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||b(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||b(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])s=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+s]=n,n?r||e.addEventListener(t,s?A:S,s):e.removeEventListener(t,s?A:S,s);else if("dangerouslySetInnerHTML"!==t){if(i)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&-1==t.indexOf("-")?e.removeAttribute(t):e.setAttribute(t,n))}}function S(e){s=!0;try{return this.l[e.type+!1](n.event?n.event(e):e)}finally{s=!1}}function A(e){s=!0;try{return this.l[e.type+!0](n.event?n.event(e):e)}finally{s=!1}}function D(e,t){this.props=e,this.context=t}function w(e,t){if(null==t)return e.__?w(e.__,e.__.__k.indexOf(e)+1):null;for(var n;tt&&o.sort((function(e,t){return e.__v.__b-t.__v.__b})));_.__r=0}function T(e,t,n,r,i,s,o,a,l,c){var h,f,g,p,v,b,E,S=r&&r.__k||u,A=S.length;for(n.__k=[],h=0;h0?m(p.type,p.props,p.key,p.ref?p.ref:null,p.__v):p)){if(p.__=n,p.__b=n.__b+1,null===(g=S[h])||g&&p.key==g.key&&p.type===g.type)S[h]=void 0;else for(f=0;f=0;t--)if((n=e.__k[t])&&(r=O(n)))return r;return null}function N(e,t,r,i,s,o,a,l,c){var d,u,h,g,p,m,v,b,E,S,A,w,C,R,x,_=t.type;if(void 0!==t.constructor)return null;null!=r.__h&&(c=r.__h,l=t.__e=r.__e,t.__h=null,o=[l]),(d=n.__b)&&d(t);try{e:if("function"==typeof _){if(b=t.props,E=(d=_.contextType)&&i[d.__c],S=d?E?E.props.value:d.__:i,r.__c?v=(u=t.__c=r.__c).__=u.__E:("prototype"in _&&_.prototype.render?t.__c=u=new _(b,S):(t.__c=u=new D(b,S),u.constructor=_,u.render=z),E&&E.sub(u),u.props=b,u.state||(u.state={}),u.context=S,u.__n=i,h=u.__d=!0,u.__h=[],u._sb=[]),null==u.__s&&(u.__s=u.state),null!=_.getDerivedStateFromProps&&(u.__s==u.state&&(u.__s=f({},u.__s)),f(u.__s,_.getDerivedStateFromProps(b,u.__s))),g=u.props,p=u.state,u.__v=t,h)null==_.getDerivedStateFromProps&&null!=u.componentWillMount&&u.componentWillMount(),null!=u.componentDidMount&&u.__h.push(u.componentDidMount);else{if(null==_.getDerivedStateFromProps&&b!==g&&null!=u.componentWillReceiveProps&&u.componentWillReceiveProps(b,S),!u.__e&&null!=u.shouldComponentUpdate&&!1===u.shouldComponentUpdate(b,u.__s,S)||t.__v===r.__v){for(t.__v!==r.__v&&(u.props=b,u.state=u.__s,u.__d=!1),t.__e=r.__e,t.__k=r.__k,t.__k.forEach((function(e){e&&(e.__=t)})),A=0;A3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),U(p(ue,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function fe(e,t){var n=p(he,{__v:e,i:t});return n.containerInfo=t,n}(ce.prototype=new D).__a=function(e){var t=this,n=le(t.__v),r=t.o.get(e);return r[0]++,function(i){var s=function(){t.props.revealOrder?(r.push(i),de(t,e,r)):i()};n?n(s):s()}},ce.prototype.render=function(e){this.u=null,this.o=new Map;var t=M(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},ce.prototype.componentDidUpdate=ce.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){de(e,n,t)}))};var ge="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,pe=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,me="undefined"!=typeof document,ve=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};D.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(D.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var ye=n.event;function be(){}function Ee(){return this.cancelBubble}function Se(){return this.defaultPrevented}n.event=function(e){return ye&&(e=ye(e)),e.persist=be,e.isPropagationStopped=Ee,e.isDefaultPrevented=Se,e.nativeEvent=e};var Ae={configurable:!0,get:function(){return this.class}},De=n.vnode;n.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var s in r={},n){var o=n[s];me&&"children"===s&&"noscript"===t||"value"===s&&"defaultValue"in n&&null==o||("defaultValue"===s&&"value"in n&&null==n.value?s="value":"download"===s&&!0===o?o="":/ondoubleclick/i.test(s)?s="ondblclick":/^onchange(textarea|input)/i.test(s+t)&&!ve(n.type)?s="oninput":/^onfocus$/i.test(s)?s="onfocusin":/^onblur$/i.test(s)?s="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(s)?s=s.toLowerCase():i&&pe.test(s)?s=s.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===o&&(o=void 0),/^oninput$/i.test(s)&&(s=s.toLowerCase(),r[s]&&(s="oninputCapture")),r[s]=o)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=M(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=M(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,n.class!=n.className&&(Ae.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",Ae))}e.$$typeof=ge,De&&De(e)};var we=n.__r;n.__r=function(e){we&&we(e),e.__c};const Ce=[],Re=new Map;function xe(e){Ce.push(e),Re.forEach(t=>{Te(t,e)})}function _e(e){let t=Re.get(e);if(!t||!t.isConnected){if(t=e.querySelector("style[data-fullcalendar]"),!t){t=document.createElement("style"),t.setAttribute("data-fullcalendar","");const n=function(){void 0===ke&&(ke=function(){const e=document.querySelector('meta[name="csp-nonce"]');if(e&&e.hasAttribute("content"))return e.getAttribute("content");const t=document.querySelector("script[nonce]");if(t)return t.nonce||"";return""}());return ke}();n&&(t.nonce=n);const r=e===document?document.head:e,i=e===document?r.querySelector("script,link[rel=stylesheet],link[as=style],style"):r.firstChild;r.insertBefore(t,i)}Re.set(e,t),function(e){for(const t of Ce)Te(e,t)}(t)}}function Te(e,t){const{sheet:n}=e,r=n.cssRules.length;t.split("}").forEach((e,t)=>{(e=e.trim())&&n.insertRule(e+"}",r+t)})}let ke;"undefined"!=typeof document&&_e(document);xe(':root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:"\\e900"}.fc-icon-chevron-right:before{content:"\\e901"}.fc-icon-chevrons-left:before{content:"\\e902"}.fc-icon-chevrons-right:before{content:"\\e903"}.fc-icon-minus-square:before{content:"\\e904"}.fc-icon-plus-square:before{content:"\\e905"}.fc-icon-x:before{content:"\\e906"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.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:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}');class Me{constructor(e){this.drainedOption=e,this.isRunning=!1,this.isDirty=!1,this.pauseDepths={},this.timeoutId=0}request(e){this.isDirty=!0,this.isPaused()||(this.clearTimeout(),null==e?this.tryDrain():this.timeoutId=setTimeout(this.tryDrain.bind(this),e))}pause(e=""){let{pauseDepths:t}=this;t[e]=(t[e]||0)+1,this.clearTimeout()}resume(e="",t){let{pauseDepths:n}=this;if(e in n){if(t)delete n[e];else{n[e]-=1,n[e]<=0&&delete n[e]}this.tryDrain()}}isPaused(){return Object.keys(this.pauseDepths).length}tryDrain(){if(!this.isRunning&&!this.isPaused()){for(this.isRunning=!0;this.isDirty;)this.isDirty=!1,this.drained();this.isRunning=!1}}clear(){this.clearTimeout(),this.isDirty=!1,this.pauseDepths={}}clearTimeout(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=0)}drained(){this.drainedOption&&this.drainedOption()}}function Ie(e){e.parentNode&&e.parentNode.removeChild(e)}function Oe(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(Ne(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function Ne(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function Pe(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e{let r=Oe(n.target,e);r&&t.call(r,n,r)}}(n,r);return e.addEventListener(t,i),()=>{e.removeEventListener(t,i)}}const Ve=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function Ge(e,t){let n=r=>{t(r),Ve.forEach(t=>{e.removeEventListener(t,n)})};Ve.forEach(t=>{e.addEventListener(t,n)})}function Qe(e){return Object.assign({onClick:e},qe(e))}function qe(e){return{tabIndex:0,onKeyDown(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}let Ye=0;function Ze(){return Ye+=1,String(Ye)}function Xe(){document.body.classList.add("fc-not-allowed")}function $e(){document.body.classList.remove("fc-not-allowed")}function Je(e){e.style.userSelect="none",e.style.webkitUserSelect="none",e.addEventListener("selectstart",Le)}function Ke(e){e.style.userSelect="",e.style.webkitUserSelect="",e.removeEventListener("selectstart",Le)}function et(e){e.addEventListener("contextmenu",Le)}function tt(e){e.removeEventListener("contextmenu",Le)}function nt(e){let t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;te.replace("$"+n,t||""),e):n}function lt(e,t){return e-t}function ct(e){return e%1==0}function dt(e){let t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}const ut=["years","months","days","milliseconds"],ht=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function ft(e,t){return"string"==typeof e?function(e){let t=ht.exec(e);if(t){let e=t[1]?-1:1;return{years:0,months:0,days:e*(t[2]?parseInt(t[2],10):0),milliseconds:e*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?gt(e):"number"==typeof e?gt({[t||"milliseconds"]:e}):null}function gt(e){let t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function pt(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}}function mt(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}}function vt(e){return yt(e)/864e5}function yt(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function bt(e,t){let n=null;for(let r=0;r10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",Vt(t,!0)))),r}function Wt(e){return e.toISOString().replace(/T.*$/,"")}function Lt(e){return e.toISOString().match(/^\d{4}-\d{2}/)[0]}function Ft(e){return ot(e.getUTCHours(),2)+":"+ot(e.getUTCMinutes(),2)+":"+ot(e.getUTCSeconds(),2)}function Vt(e,t=!1){let n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),s=Math.round(r%60);return t?`${n+ot(i,2)}:${ot(s,2)}`:`GMT${n}${i}${s?":"+ot(s,2):""}`}function Gt(e,t,n){let r,i;return function(...s){if(r){if(!St(r,s)){n&&n(i);let r=e.apply(this,s);t&&t(r,i)||(i=r)}}else i=e.apply(this,s);return r=s,i}}function Qt(e,t,n){let r,i;return s=>{if(r){if(!Cn(r,s)){n&&n(i);let r=e.call(this,s);t&&t(r,i)||(i=r)}}else i=e.call(this,s);return r=s,i}}const qt={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Yt={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Zt=/\s*([ap])\.?m\.?/i,Xt=/,/g,$t=/\s+/g,Jt=/\u200e/g,Kt=/UTC|GMT/;class en{constructor(e){let t={},n={},r=0;for(let i in e)i in qt?(n[i]=e[i],r=Math.max(qt[i],r)):(t[i]=e[i],i in Yt&&(r=Math.max(Yt[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=Gt(tn)}format(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)}formatRange(e,t,n,r){let{standardDateProps:i,extendedSettings:s}=this,o=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(zt(e)!==zt(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!o)return this.format(e,n);let a=o;!(a>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(a=1);let l=this.format(e,n),c=this.format(t,n);if(l===c)return l;let d=tn(function(e,t){let n={};for(let r in e)(!(r in Yt)||Yt[r]<=t)&&(n[r]=e[r]);return n}(i,a),s,n),u=d(e),h=d(t),f=function(e,t,n,r){let i=0;for(;iVt(e.timeZoneOffset):0===r&&t.week?e=>function(e,t,n,r,i){let s=[];"long"===i?s.push(n):"short"!==i&&"narrow"!==i||s.push(t);"long"!==i&&"short"!==i||s.push(" ");s.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&s.reverse();return s.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week):function(e,t,n){e=Object.assign({},e),t=Object.assign({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";let r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){let t=Object.assign({},e);delete t.minute,r=new Intl.DateTimeFormat(n.locale.codes,t)}return s=>{let o,{marker:a}=s;return o=r&&!a.getUTCMinutes()?r:i,function(e,t,n,r,i){e=e.replace(Jt,""),"short"===n.timeZoneName&&(e=function(e,t){let n=!1;e=e.replace(Kt,()=>(n=!0,t)),n||(e+=" "+t);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":Vt(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(Xt,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(Zt,"").trim():"narrow"===r.meridiem?e=e.replace(Zt,(e,t)=>t.toLocaleLowerCase()):"short"===r.meridiem?e=e.replace(Zt,(e,t)=>t.toLocaleLowerCase()+"m"):"lowercase"===r.meridiem&&(e=e.replace(Zt,e=>e.toLocaleLowerCase()));return e=(e=e.replace($t," ")).trim()}(o.format(a),s,e,t,n)}}(e,t,n)}function nn(e,t){let n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function rn(e,t,n,r){let i=nn(e,n.calendarSystem);return{date:i,start:i,end:t?nn(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}class sn{constructor(e){this.cmdStr=e}format(e,t,n){return t.cmdFormatter(this.cmdStr,rn(e,null,t,n))}formatRange(e,t,n,r){return n.cmdFormatter(this.cmdStr,rn(e,t,n,r))}}class on{constructor(e){this.func=e}format(e,t,n){return this.func(rn(e,null,t,n))}formatRange(e,t,n,r){return this.func(rn(e,t,n,r))}}function an(e){return"object"==typeof e&&e?new en(e):"string"==typeof e?new sn(e):"function"==typeof e?new on(e):null}const ln={navLinkDayClick:yn,navLinkWeekClick:yn,duration:ft,bootstrapFontAwesome:yn,buttonIcons:yn,customButtons:yn,defaultAllDayEventDuration:ft,defaultTimedEventDuration:ft,nextDayThreshold:ft,scrollTime:ft,scrollTimeReset:Boolean,slotMinTime:ft,slotMaxTime:ft,dayPopoverFormat:an,slotDuration:ft,snapDuration:ft,headerToolbar:yn,footerToolbar:yn,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:an,dayHeaderClassNames:yn,dayHeaderContent:yn,dayHeaderDidMount:yn,dayHeaderWillUnmount:yn,dayCellClassNames:yn,dayCellContent:yn,dayCellDidMount:yn,dayCellWillUnmount:yn,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:yn,weekNumbers:Boolean,weekNumberClassNames:yn,weekNumberContent:yn,weekNumberDidMount:yn,weekNumberWillUnmount:yn,editable:Boolean,viewClassNames:yn,viewDidMount:yn,viewWillUnmount:yn,nowIndicator:Boolean,nowIndicatorClassNames:yn,nowIndicatorContent:yn,nowIndicatorDidMount:yn,nowIndicatorWillUnmount:yn,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:yn,locale:yn,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:yn,eventOrder:nt,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:yn,contentHeight:yn,direction:String,weekNumberFormat:an,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:yn,initialDate:yn,now:yn,eventDataTransform:yn,stickyHeaderDates:yn,stickyFooterScrollbar:yn,viewHeight:yn,defaultAllDay:Boolean,eventSourceFailure:yn,eventSourceSuccess:yn,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:yn,eventConstraint:yn,eventAllow:yn,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:yn,eventContent:yn,eventDidMount:yn,eventWillUnmount:yn,selectConstraint:yn,selectOverlap:yn,selectAllow:yn,droppable:Boolean,unselectCancel:String,slotLabelFormat:yn,slotLaneClassNames:yn,slotLaneContent:yn,slotLaneDidMount:yn,slotLaneWillUnmount:yn,slotLabelClassNames:yn,slotLabelContent:yn,slotLabelDidMount:yn,slotLabelWillUnmount:yn,dayMaxEvents:yn,dayMaxEventRows:yn,dayMinWidth:Number,slotLabelInterval:ft,allDayText:String,allDayClassNames:yn,allDayContent:yn,allDayDidMount:yn,allDayWillUnmount:yn,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:an,rerenderDelay:Number,moreLinkText:yn,moreLinkHint:yn,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:yn,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:ft,hiddenDays:yn,fixedWeekCount:Boolean,validRange:yn,visibleRange:yn,titleFormat:yn,eventInteractive:Boolean,noEventsText:String,viewHint:yn,navLinkHint:yn,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:yn,moreLinkClassNames:yn,moreLinkContent:yn,moreLinkDidMount:yn,moreLinkWillUnmount:yn,monthStartFormat:an,handleCustomRendering:yn,customRenderingMetaMap:yn,customRenderingReplaces:Boolean},cn={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,monthStartFormat:{month:"long",day:"numeric"}},dn={datesSet:yn,eventsSet:yn,eventAdd:yn,eventChange:yn,eventRemove:yn,windowResize:yn,eventClick:yn,eventMouseEnter:yn,eventMouseLeave:yn,select:yn,unselect:yn,loading:yn,_unmount:yn,_beforeprint:yn,_afterprint:yn,_noEventDrop:yn,_noEventResize:yn,_resize:yn,_scrollRequest:yn},un={buttonText:yn,buttonHints:yn,views:yn,plugins:yn,initialEvents:yn,events:yn,eventSources:yn},hn={headerToolbar:fn,footerToolbar:fn,buttonText:fn,buttonHints:fn,buttonIcons:fn,dateIncrement:fn,plugins:gn,events:gn,eventSources:gn,resources:gn};function fn(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?Cn(e,t):e===t}function gn(e,t){return Array.isArray(e)&&Array.isArray(t)?St(e,t):e===t}const pn={type:String,component:yn,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:yn,usesMinMaxTime:Boolean,classNames:yn,content:yn,didMount:yn,willUnmount:yn};function mn(e){return En(e,hn)}function vn(e,t){let n={},r={};for(let r in t)r in e&&(n[r]=t[r](e[r]));for(let n in e)n in t||(r[n]=e[n]);return{refined:n,extra:r}}function yn(e){return e}const{hasOwnProperty:bn}=Object.prototype;function En(e,t){let n={};if(t)for(let r in t)if(t[r]===fn){let t=[];for(let i=e.length-1;i>=0;i-=1){let s=e[i][r];if("object"==typeof s&&s)t.unshift(s);else if(void 0!==s){n[r]=s;break}}t.length&&(n[r]=En(t))}for(let t=e.length-1;t>=0;t-=1){let r=e[t];for(let e in r)e in n||(n[e]=r[e])}return n}function Sn(e,t){let n={};for(let r in e)t(e[r],r)&&(n[r]=e[r]);return n}function An(e,t){let n={};for(let r in e)n[r]=t(e[r],r);return n}function Dn(e){let t={};for(let n of e)t[n]=!0;return t}function wn(e){let t=[];for(let n in e)t.push(e[n]);return t}function Cn(e,t){if(e===t)return!0;for(let n in e)if(bn.call(e,n)&&!(n in t))return!1;for(let n in t)if(bn.call(t,n)&&e[n]!==t[n])return!1;return!0}const Rn=/^on[A-Z]/;function xn(e,t){let n=[];for(let r in e)bn.call(e,r)&&(r in t||n.push(r));for(let r in t)bn.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function _n(e,t,n={}){if(e===t)return!0;for(let r in t)if(!(r in e)||!Tn(e[r],t[r],n[r]))return!1;for(let n in e)if(!(n in t))return!1;return!0}function Tn(e,t,n){return e===t||!0===n||!!n&&n(e,t)}function kn(e,t=0,n,r=1){let i=[];null==n&&(n=Object.keys(e).length);for(let s=t;s=1?Math.min(i,s):i}(e,this.weekDow,this.weekDoy)}format(e,t,n={}){return t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)}formatRange(e,t,n,r={}){return r.isEndExclusive&&(t=Ct(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)}formatIso(e,t={}){let n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Ut(e,n,t.omitTime)}timestampToMarker(e){return"local"===this.timeZone?Bt(Nt(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?Bt(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)}offsetForMarker(e){return"local"===this.timeZone?-Pt(Ht(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Ht(e)):null}toDate(e,t){return"local"===this.timeZone?Pt(Ht(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Ht(e))*60):new Date(e.valueOf()-(t||0))}}class Bn{constructor(e){this.iconOverrideOption&&this.setIconOverride(e[this.iconOverrideOption])}setIconOverride(e){let t,n;if("object"==typeof e&&e){for(n in t=Object.assign({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})}applyIconOverridePrefix(e){let t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e}getClass(e){return this.classes[e]||""}getIconClass(e,t){let n;return n=t&&this.rtlIconClasses&&this.rtlIconClasses[e]||this.iconClasses[e],n?`${this.baseIconClass} ${n}`:""}getCustomButtonIconClass(e){let t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption],t)?`${this.baseIconClass} ${this.applyIconOverridePrefix(t)}`:""}}function jn(e){e();let t=n.debounceRendering,r=[];for(n.debounceRendering=function(e){r.push(e)},U(p(zn,{}),document.createElement("div"));r.length;)r.shift()();n.debounceRendering=t}Bn.prototype.classes={},Bn.prototype.iconClasses={},Bn.prototype.baseIconClass="",Bn.prototype.iconOverridePrefix="";class zn extends D{render(){return p("div",{})}componentDidMount(){this.setState({})}}function Un(e){let t=function(e,t){var n={__c:t="__cC"+c++,__: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((function(e){e.__e=!0,x(e)}))},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(){let e=!this.getChildContext,t=n.apply(this,arguments);if(e){let e=[];this.shouldComponentUpdate=t=>{this.props.value!==t.value&&e.forEach(e=>{e.context=t.value,e.forceUpdate()})},this.sub=t=>{e.push(t);let n=t.componentWillUnmount;t.componentWillUnmount=()=>{e.splice(e.indexOf(t),1),n&&n.call(t)}}}return t},t}class Wn{constructor(e,t,n,r){this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=r,this.handleScrollRequest=e=>{this.queuedRequest=Object.assign({},this.queuedRequest||{},e),this.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}detach(){this.emitter.off("_scrollRequest",this.handleScrollRequest)}update(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()}fireInitialScroll(){this.handleScrollRequest({time:this.scrollTime})}drain(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)}}const Ln=Un({});function Fn(e,t,n,r,i,s,o,a,l,c,d,u,h){return{dateEnv:i,options:n,pluginHooks:o,emitter:c,dispatch:a,getCurrentData:l,calendarApi:d,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:s,isRtl:"rtl"===n.direction,addResizeHandler(e){c.on("_resize",e)},removeResizeHandler(e){c.off("_resize",e)},createScrollResponder:e=>new Wn(e,c,ft(n.scrollTime),n.scrollTimeReset),registerInteractiveComponent:u,unregisterInteractiveComponent:h}}class Vn extends D{shouldComponentUpdate(e,t){return this.debug&&console.log(xn(e,this.props),xn(t,this.state)),!_n(this.props,e,this.propEquality)||!_n(this.state,t,this.stateEquality)}safeSetState(e){_n(this.state,Object.assign(Object.assign({},this.state),e),this.stateEquality)||this.setState(e)}}Vn.addPropsEquality=function(e){let t=Object.create(this.prototype.propEquality);Object.assign(t,e),this.prototype.propEquality=t},Vn.addStateEquality=function(e){let t=Object.create(this.prototype.stateEquality);Object.assign(t,e),this.prototype.stateEquality=t},Vn.contextType=Ln,Vn.prototype.propEquality={},Vn.prototype.stateEquality={};class Gn extends Vn{}function Qn(e,t){"function"==typeof e?e(t):e&&(e.current=t)}Gn.contextType=Ln;class qn extends Gn{constructor(){super(...arguments),this.id=Ze(),this.queuedDomNodes=[],this.currentDomNodes=[],this.handleEl=e=>{const{options:t}=this.context,{generatorName:n}=this.props;t.customRenderingReplaces&&Yn(n,t)||this.updateElRef(e)},this.updateElRef=e=>{this.props.elRef&&Qn(this.props.elRef,e)}}render(){const{props:e,context:t}=this,{options:n}=t,{customGenerator:r,defaultGenerator:s,renderProps:o}=e,a=Zn(e,[],this.handleEl);let l,c,d=!1,u=[];if(null!=r){const e="function"==typeof r?r(o,p):r;if(!0===e)d=!0;else{const t=e&&"object"==typeof e;t&&"html"in e?a.dangerouslySetInnerHTML={__html:e.html}:t&&"domNodes"in e?u=Array.prototype.slice.call(e.domNodes):(t?i(e):"function"!=typeof e)?l=e:c=e}}else d=!Yn(e.generatorName,n);return d&&s&&(l=s(o)),this.queuedDomNodes=u,this.currentGeneratorMeta=c,p(e.elTag,a,l)}componentDidMount(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentDidUpdate(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentWillUnmount(){this.triggerCustomRendering(!1)}triggerCustomRendering(e){var t;const{props:n,context:r}=this,{handleCustomRendering:i,customRenderingMetaMap:s}=r.options;if(i){const r=null!==(t=this.currentGeneratorMeta)&&void 0!==t?t:null==s?void 0:s[n.generatorName];r&&i(Object.assign(Object.assign({id:this.id,isActive:e,containerEl:this.base,reportNewContainerEl:this.updateElRef,generatorMeta:r},n),{elClasses:(n.elClasses||[]).filter(Xn)}))}}applyQueueudDomNodes(){const{queuedDomNodes:e,currentDomNodes:t}=this,n=this.base;if(!St(e,t)){t.forEach(Ie);for(let t of e)n.appendChild(t);this.currentDomNodes=e}}}function Yn(e,t){var n;return Boolean(t.handleCustomRendering&&e&&(null===(n=t.customRenderingMetaMap)||void 0===n?void 0:n[e]))}function Zn(e,t,n){const r=Object.assign(Object.assign({},e.elAttrs),{ref:n});return(e.elClasses||t)&&(r.className=(e.elClasses||[]).concat(t||[]).concat(r.className||[]).filter(Boolean).join(" ")),e.elStyle&&(r.style=e.elStyle),r}function Xn(e){return Boolean(e)}qn.addPropsEquality({elClasses:St,elStyle:Cn,elAttrs:function(e,t){const n=xn(e,t);for(let e of n)if(!Rn.test(e))return!1;return!0},renderProps:Cn});const $n=Un(0);class Jn extends D{constructor(){super(...arguments),this.InnerContent=Kn.bind(void 0,this),this.handleEl=e=>{this.el=e,this.props.elRef&&(Qn(this.props.elRef,e),e&&this.didMountMisfire&&this.componentDidMount())}}render(){const{props:e}=this,t=function(e,t){const n="function"==typeof e?e(t):e||[];return"string"==typeof n?[n]:n}(e.classNameGenerator,e.renderProps);if(e.children){const n=Zn(e,t,this.handleEl),r=e.children(this.InnerContent,e.renderProps,n);return e.elTag?p(e.elTag,n,r):r}return p(qn,Object.assign(Object.assign({},e),{elRef:this.handleEl,elTag:e.elTag||"div",elClasses:(e.elClasses||[]).concat(t),renderId:this.context}))}componentDidMount(){var e,t;this.el?null===(t=(e=this.props).didMount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.el})):this.didMountMisfire=!0}componentWillUnmount(){var e,t;null===(t=(e=this.props).willUnmount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.el}))}}function Kn(e,t){const n=e.props;return p(qn,Object.assign({renderProps:n.renderProps,generatorName:n.generatorName,customGenerator:n.customGenerator,defaultGenerator:n.defaultGenerator,renderId:e.context},t))}Jn.contextType=$n;class er extends Gn{render(){let{props:e,context:t}=this,{options:n}=t,r={view:t.viewApi};return p(Jn,Object.assign({},e,{elTag:e.elTag||"div",elClasses:[...tr(e.viewSpec),...e.elClasses||[]],renderProps:r,classNameGenerator:n.viewClassNames,generatorName:void 0,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount}),()=>e.children)}}function tr(e){return[`fc-${e.type}-view`,"fc-view"]}function nr(e,t){let n,r,i=[],{start:s}=t;for(e.sort(rr),n=0;ns&&i.push({start:s,end:r.start}),r.end>s&&(s=r.end);return st.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function lr(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t=yt(t)&&(r=wt(r,1))}return e.start&&(n=Mt(e.start),r&&r<=n&&(r=wt(n,1))),{start:n,end:r}}function ur(e){let t=dr(e);return xt(t.start,t.end)>1}function hr(e,t,n,r){return"year"===r?ft(n.diffWholeYears(e,t),"year"):"month"===r?ft(n.diffWholeMonths(e,t),"month"):_t(e,t)}function fr(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}class gr{constructor(e){this.props=e,this.nowDate=fr(e.nowInput,e.dateEnv),this.initHiddenDays()}buildPrev(e,t,n){let{dateEnv:r}=this.props,i=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,-1,n)}buildNext(e,t,n){let{dateEnv:r}=this.props,i=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,1,n)}build(e,t,n=!0){let r,i,s,o,a,l,{props:c}=this;var d,u;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(u=r).start&&d=u.end?new Date(u.end.valueOf()-1):d),i=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(i.unit),o=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,s),o=this.trimHiddenDays(o),a=o,c.showNonCurrentDates||(a=ir(a,i.range)),a=this.adjustActiveRange(a),a=ir(a,r),l=or(i.range,r),lr(o,e)||(e=o.start),{currentDate:e,validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:s,activeRange:a,renderRange:o,slotMinTime:c.slotMinTime,slotMaxTime:c.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(i.duration)}}buildValidRange(){let e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}}buildCurrentRangeInfo(e,t){let n,{props:r}=this,i=null,s=null,o=null;return r.duration?(i=r.duration,s=r.durationUnit,o=this.buildRangeFromDuration(e,t,i,s)):(n=this.props.dayCount)?(s="day",o=this.buildRangeFromDayCount(e,t,n)):(o=this.buildCustomVisibleRange(e))?s=r.dateEnv.greatestWholeUnit(o.start,o.end).unit:(i=this.getFallbackDuration(),s=Et(i).unit,o=this.buildRangeFromDuration(e,t,i,s)),{duration:i,unit:s,range:o}}getFallbackDuration(){return ft({day:1})}adjustActiveRange(e){let{dateEnv:t,usesMinMaxTime:n,slotMinTime:r,slotMaxTime:i}=this.props,{start:s,end:o}=e;return n&&(vt(r)<0&&(s=Mt(s),s=t.add(s,r)),vt(i)>1&&(o=Mt(o),o=wt(o,-1),o=t.add(o,i))),{start:s,end:o}}buildRangeFromDuration(e,t,n,r){let i,s,o,{dateEnv:a,dateAlignment:l}=this.props;if(!l){let{dateIncrement:e}=this.props;l=e&&yt(e)!o[e.defId].recurringDef);for(let e in o){let n=o[e];if(n.recurringDef){let{duration:o}=n.recurringDef;o||(o=n.allDay?s.defaultAllDayEventDuration:s.defaultTimedEventDuration);let l=vr(n,o,t,r,i.recurringTypes);for(let t of l){let n=pr(e,{start:t,end:r.add(t,o)});a[n.instanceId]=n}}}return{defs:o,instances:a}}function vr(e,t,n,r,i){let s=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(s=s.map(Mt)),s}const yr={id:String,groupId:String,title:String,url:String,interactive:Boolean},br={start:yn,end:yn,date:yn,allDay:Boolean},Er=Object.assign(Object.assign(Object.assign({},yr),br),{extendedProps:yn});function Sr(e,t,n,r,i=Dr(n),s,o){let{refined:a,extra:l}=Ar(e,n,i),c=function(e,t){let n=null;e&&(n=e.defaultAllDay);null==n&&(n=t.options.defaultAllDay);return n}(t,n),d=function(e,t,n,r){for(let i=0;i{return n=t,r=e,Boolean(n.groupId&&n.groupId===r.groupId);var n,r});return r.defs[t.defId]=t,r.instances[n.instanceId]=n,r}return{defs:{},instances:{}}}function _r(){return{defs:{},instances:{}}}function Tr(e,t){return{defs:Object.assign(Object.assign({},e.defs),t.defs),instances:Object.assign(Object.assign({},e.instances),t.instances)}}function kr(e,t){let n=Sn(e.defs,t),r=Sn(e.instances,e=>n[e.defId]);return{defs:n,instances:r}}function Mr(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}const Ir={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:yn,overlap:yn,allow:yn,className:Mr,classNames:Mr,color:String,backgroundColor:String,borderColor:String,textColor:String},Or={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Nr(e,t){let n=function(e,t){return Array.isArray(e)?Cr(e,null,t,!0):"object"==typeof e&&e?Cr([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function Pr(e){return e.reduce(Hr,Or)}function Hr(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}const Br={id:String,defaultAllDay:Boolean,url:String,format:String,events:yn,eventDataTransform:yn,success:yn,failure:yn};function jr(e,t,n=zr(t)){let r;if("string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){let{refined:i,extra:s}=vn(r,n),o=function(e,t){let n=t.pluginHooks.eventSourceDefs;for(let t=n.length-1;t>=0;t-=1){let r=n[t].parseMeta(e);if(r)return{sourceDefId:t,meta:r}}return null}(i,t);if(o)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:Ze(),sourceDefId:o.sourceDefId,meta:o.meta,ui:Nr(i,t),extendedProps:s}}return null}function zr(e){return Object.assign(Object.assign(Object.assign({},Ir),Br),e.pluginHooks.eventSourceRefiners)}function Ur(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,s){if(t&&n===t.latestFetchId){let n=Cr(Wr(i,t,s),t,s);return r&&(n=mr(n,r,s)),Tr(Vr(e,t.sourceId),n)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"RESET_RAW_EVENTS":return function(e,t,n,r,i){const{defIdMap:s,instanceIdMap:o}=function(e){const{defs:t,instances:n}=e,r={},i={};for(let e in t){const n=t[e],{publicId:i}=n;i&&(r[i]=e)}for(let e in n){const r=n[e],s=t[r.defId],{publicId:o}=s;o&&(i[o]=e)}return{defIdMap:r,instanceIdMap:i}}(e);return mr(Cr(Wr(n,t,i),t,i,!1,s,o),r,i)}(e,n[t.sourceId],t.rawEvents,r.activeRange,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=mr(t,n,r));return Tr(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return Tr(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?mr(e,r.activeRange,i):e;case"REMOVE_EVENTS":return function(e,t){let{defs:n,instances:r}=e,i={},s={};for(let e in n)t.defs[e]||(i[e]=n[e]);for(let e in r)!t.instances[e]&&i[r[e].defId]&&(s[e]=r[e]);return{defs:i,instances:s}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return Vr(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return kr(e,e=>!e.sourceId);case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function Wr(e,t,n){let r=n.options.eventDataTransform,i=t?t.eventDataTransform:null;return i&&(e=Lr(e,i)),r&&(e=Lr(e,r)),e}function Lr(e,t){let n;if(t){n=[];for(let r of e){let e=t(r);e?n.push(e):null==e&&n.push(r)}}else n=e;return n}function Fr(e,t,n){let{defs:r}=e,i=An(e.instances,e=>r[e.defId].allDay?e:Object.assign(Object.assign({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo}));return{defs:r,instances:i}}function Vr(e,t){return kr(e,e=>e.sourceId!==t)}class Gr{constructor(){this.handlers={},this.thisContext=null}setThisContext(e){this.thisContext=e}setOptions(e){this.options=e}on(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)}off(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter(e=>e!==n)):delete e[t]}(this.handlers,e,t)}trigger(e,...t){let n=this.handlers[e]||[],r=this.options&&this.options[e],i=[].concat(r||[],n);for(let e of i)e.apply(this.thisContext,t)}hasHandlers(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])}}const Qr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function qr(e,t){return Cr(function(e){let t;t=!0===e?[{}]:Array.isArray(e)?e.filter(e=>e.daysOfWeek):"object"==typeof e&&e?[e]:[];return t=t.map(e=>Object.assign(Object.assign({},Qr),e)),t}(e),null,t)}function Yr(e,t,n){n.emitter.trigger("select",Object.assign(Object.assign({},Zr(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function Zr(e,t){let n={};for(let r of t.pluginHooks.dateSpanTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,i=t.dateEnv,Object.assign(Object.assign({},wi(r.range,i,r.allDay)),{allDay:r.allDay}))),n}function Xr(e,t,n){let{dateEnv:r,options:i}=n,s=t;return e?(s=Mt(s),s=r.add(s,i.defaultAllDayEventDuration)):s=r.add(s,i.defaultTimedEventDuration),s}function $r(e,t,n,r){let i=li(e.defs,t),s={defs:{},instances:{}};for(let t in e.defs){let o=e.defs[t];s.defs[t]=Jr(o,i[t],n,r)}for(let t in e.instances){let o=e.instances[t],a=s.defs[o.defId];s.instances[t]=Kr(o,a,i[o.defId],n,r)}return s}function Jr(e,t,n,r){let i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);let s=Object.assign(Object.assign(Object.assign({},e),i),{ui:Object.assign(Object.assign({},e.ui),i.ui)});n.extendedProps&&(s.extendedProps=Object.assign(Object.assign({},s.extendedProps),n.extendedProps));for(let e of r.pluginHooks.eventDefMutationAppliers)e(s,n,r);return!s.hasEnd&&r.options.forceEventDuration&&(s.hasEnd=!0),s}function Kr(e,t,n,r,i){let{dateEnv:s}=i,o=r.standardProps&&!0===r.standardProps.allDay,a=r.standardProps&&!1===r.standardProps.hasEnd,l=Object.assign({},e);return o&&(l.range=cr(l.range)),r.datesDelta&&n.startEditable&&(l.range={start:s.add(l.range.start,r.datesDelta),end:s.add(l.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(l.range={start:s.add(l.range.start,r.startDelta),end:l.range.end}),r.endDelta&&n.durationEditable&&(l.range={start:l.range.start,end:s.add(l.range.end,r.endDelta)}),a&&(l.range={start:l.range.start,end:Xr(t.allDay,l.range.start,i)}),t.allDay&&(l.range={start:Mt(l.range.start),end:Mt(l.range.end)}),l.range.endci(e,t))}function ci(e,t){let n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),Pr(n)}function di(e,t){let n=e.map(ui);return n.sort((e,n)=>rt(e,n,t)),n.map(e=>e._seg)}function ui(e){let{eventRange:t}=e,n=t.def,r=t.instance?t.instance.range:t.range,i=r.start?r.start.valueOf():0,s=r.end?r.end.valueOf():0;return Object.assign(Object.assign(Object.assign({},n.extendedProps),n),{id:n.publicId,start:i,end:s,duration:s-i,allDay:Number(n.allDay),_seg:e})}function hi(e,t){let{pluginHooks:n}=t,r=n.isDraggableTransformers,{def:i,ui:s}=e.eventRange,o=s.startEditable;for(let e of r)o=e(o,i,s,t);return o}function fi(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function gi(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function pi(e,t,n,r,i,s,o){let{dateEnv:a,options:l}=n,{displayEventTime:c,displayEventEnd:d}=l,u=e.eventRange.def,h=e.eventRange.instance;null==c&&(c=!1!==r),null==d&&(d=!1!==i);let f=h.range.start,g=h.range.end,p=s||e.start||e.eventRange.range.start,m=o||e.end||e.eventRange.range.end,v=Mt(f).valueOf()===Mt(p).valueOf(),y=Mt(Ct(g,-1)).valueOf()===Mt(Ct(m,-1)).valueOf();return c&&!u.allDay&&(v||y)?(p=v?f:p,m=y?g:m,d&&u.hasEnd?a.formatRange(p,m,t,{forcedStartTzo:s?null:h.forcedStartTzo,forcedEndTzo:o?null:h.forcedEndTzo}):a.format(p,t,{forcedTzo:s?null:h.forcedStartTzo})):""}function mi(e,t,n){let r=e.eventRange.range;return{isPast:r.end<(n||t.start),isFuture:r.start>=(n||t.end),isToday:t&&lr(t,r.start)}}function vi(e){let 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 yi(e){return e.instance?e.instance.instanceId:`${e.def.defId}:${e.range.start.toISOString()}`}function bi(e,t){let{def:n,instance:r}=e.eventRange,{url:i}=n;if(i)return{href:i};let{emitter:s,options:o}=t,{eventInteractive:a}=o;return null==a&&(a=n.interactive,null==a&&(a=Boolean(s.hasHandlers("eventClick")))),a?qe(e=>{s.trigger("eventClick",{el:e.target,event:new ti(t,n,r),jsEvent:e,view:t.viewApi})}):{}}const Ei={start:yn,end:yn,allDay:Boolean};function Si(e,t,n){let r=function(e,t){let{refined:n,extra:r}=vn(e,Ei),i=n.start?t.createMarkerMeta(n.start):null,s=n.end?t.createMarkerMeta(n.end):null,{allDay:o}=n;null==o&&(o=i&&i.isTimeUnspecified&&(!s||s.isTimeUnspecified));return Object.assign({range:{start:i?i.marker:null,end:s?s.marker:null},allDay:o},r)}(e,t),{range:i}=r;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function Ai(e,t){return sr(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(let n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}(e,t)}function Di(e,t,n){return Object.assign(Object.assign({},wi(e,t,n)),{timeZone:t.timeZone})}function wi(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 Ci(e,t,n){let r=!1,i=function(e){r||(r=!0,t(e))},s=function(e){r||(r=!0,n(e))},o=e(i,s);o&&"function"==typeof o.then&&o.then(i,s)}class Ri extends Error{constructor(e,t){super(e),this.response=t}}function xi(e,t,n){const r={method:e=e.toUpperCase()};return"GET"===e?t+=(-1===t.indexOf("?")?"?":"&")+new URLSearchParams(n):(r.body=new URLSearchParams(n),r.headers={"Content-Type":"application/x-www-form-urlencoded"}),fetch(t,r).then(e=>{if(e.ok)return e.json().then(t=>[t,e],()=>{throw new Ri("Failure parsing JSON",e)});throw new Ri("Request failed",e)})}let _i;function Ti(){return null==_i&&(_i=function(){if("undefined"==typeof document)return!0;let e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.innerHTML="
",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);let t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),_i}class ki extends Gn{constructor(){super(...arguments),this.state={forPrint:!1},this.handleBeforePrint=()=>{this.setState({forPrint:!0})},this.handleAfterPrint=()=>{this.setState({forPrint:!1})}}render(){let{props:e}=this,{options:t}=e,{forPrint:n}=this.state,r=n||"auto"===t.height||"auto"===t.contentHeight,i=r||null==t.height?"":t.height,s=["fc",n?"fc-media-print":"fc-media-screen","fc-direction-"+t.direction,e.theme.getClass("root")];return Ti()||s.push("fc-liquid-hack"),e.children(s,i,r,n)}componentDidMount(){let{emitter:e}=this.props;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)}componentWillUnmount(){let{emitter:e}=this.props;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)}}class Mi{constructor(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}destroy(){}}function Ii(e){return{[e.component.uid]:e}}const Oi={};class Ni{getCurrentData(){return this.currentDataManager.getCurrentData()}dispatch(e){this.currentDataManager.dispatch(e)}get view(){return this.getCurrentData().viewApi}batchRendering(e){e()}updateSize(){this.trigger("_resize",!0)}setOption(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})}getOption(e){return this.currentDataManager.currentCalendarOptionsInput[e]}getAvailableLocaleCodes(){return Object.keys(this.getCurrentData().availableRawLocales)}on(e,t){let{currentDataManager:n}=this;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn(`Unknown listener name '${e}'`)}off(e,t){this.currentDataManager.emitter.off(e,t)}trigger(e,...t){this.currentDataManager.emitter.trigger(e,...t)}changeView(e,t){this.batchRendering(()=>{if(this.unselect(),t)if(t.start&&t.end)this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),this.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{let{dateEnv:n}=this.getCurrentData();this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:n.createMarker(t)})}else this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})})}zoomTo(e,t){let n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})}getUnitViewSpec(e){let t,n,{viewSpecs:r,toolbarConfig:i}=this.getCurrentData(),s=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(let e in r)s.push(e);for(t=0;t{this.dispatch({type:"REMOVE_EVENTS",eventStore:ni(e)})}})}getEventById(e){let t=this.getCurrentData(),{defs:n,instances:r}=t.eventStore;e=String(e);for(let i in n){let s=n[i];if(s.publicId===e){if(s.recurringDef)return new ti(t,s,null);for(let e in r){let n=r[e];if(n.defId===s.defId)return new ti(t,s,n)}}}return null}getEvents(){let e=this.getCurrentData();return ri(e.eventStore,e)}removeAllEvents(){this.dispatch({type:"REMOVE_ALL_EVENTS"})}getEventSources(){let e=this.getCurrentData(),t=e.eventSources,n=[];for(let r in t)n.push(new ei(e,t[r]));return n}getEventSourceById(e){let t=this.getCurrentData(),n=t.eventSources;e=String(e);for(let r in n)if(n[r].publicId===e)return new ei(t,n[r]);return null}addEventSource(e){let t=this.getCurrentData();if(e instanceof ei)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;let n=jr(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new ei(t,n)):null}removeAllEventSources(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})}refetchEvents(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})}scrollToTime(e){let t=ft(e);t&&this.trigger("_scrollRequest",{time:t})}}function Pi(e,t){return e.left>=t.left&&e.left=t.top&&e.topthis.eventUiBuilders[t]||Gt(Li));for(let n in t){let c=t[n],d=s[n]||Ui,u=this.eventUiBuilders[n];l[n]={businessHours:c.businessHours||e.businessHours,dateSelection:r[n]||null,eventStore:d,eventUiBases:u(e.eventUiBases[""],c.ui,i[n]),eventSelection:d.instances[e.eventSelection]?e.eventSelection:"",eventDrag:o[n]||null,eventResize:a[n]||null}}return l}_splitDateSpan(e){let t={};if(e){let n=this.getKeysForDateSpan(e);for(let r of n)t[r]=e}return t}_getKeysForEventDefs(e){return An(e.defs,e=>this.getKeysForEventDef(e))}_splitEventStore(e,t){let{defs:n,instances:r}=e,i={};for(let e in n)for(let r of t[e])i[r]||(i[r]={defs:{},instances:{}}),i[r].defs[e]=n[e];for(let e in r){let n=r[e];for(let r of t[n.defId])i[r]&&(i[r].instances[e]=n)}return i}_splitIndividualUi(e,t){let n={};for(let r in e)if(r)for(let i of t[r])n[i]||(n[i]={}),n[i][r]=e[r];return n}_splitInteraction(e){let t={};if(e){let n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),s=r=>{t[r]||(t[r]={affectedEvents:n[r]||Ui,mutatedEvents:i[r]||Ui,isEvent:e.isEvent})};for(let e in n)s(e);for(let e in i)s(e)}return t}}function Li(e,t,n){let r=[];e&&r.push(e),t&&r.push(t);let i={"":Pr(r)};return n&&Object.assign(i,n),i}function Fi(e,t,n,r){return{dow:e.getUTCDay(),isDisabled:Boolean(r&&!lr(r.activeRange,e)),isOther:Boolean(r&&!lr(r.currentRange,e)),isToday:Boolean(t&&lr(t,e)),isPast:Boolean(n?en:!!t&&e>=t.end)}}function Vi(e,t){let n=["fc-day","fc-day-"+At[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}const Gi=an({year:"numeric",month:"long",day:"numeric"}),Qi=an({week:"long"});function qi(e,t,n="day",r=!0){const{dateEnv:i,options:s,calendarApi:o}=e;let a=i.format(t,"week"===n?Qi:Gi);if(s.navLinks){let e=i.toDate(t);const l=e=>{let r="day"===n?s.navLinkDayClick:"week"===n?s.navLinkWeekClick:null;"function"==typeof r?r.call(o,i.toDate(t),e):("string"==typeof r&&(n=r),o.zoomTo(t,n))};return Object.assign({title:at(s.navLinkHint,[a,e],a),"data-navlink":""},r?Qe(l):{onClick:l})}return{"aria-label":a}}let Yi,Zi=null;function Xi(){return null===Zi&&(Zi=function(){let e=document.createElement("div");Be(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
",document.body.appendChild(e);let t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return Ie(e),t}()),Zi}function $i(){return Yi||(Yi=function(){let e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);let t=Ji(e);return document.body.removeChild(e),t}()),Yi}function Ji(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function Ki(e,t=!1){let n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,s=parseInt(n.borderTopWidth,10)||0,o=parseInt(n.borderBottomWidth,10)||0,a=Ji(e),l=a.y-r-i,c={borderLeft:r,borderRight:i,borderTop:s,borderBottom:o,scrollbarBottom:a.x-s-o,scrollbarLeft:0,scrollbarRight:0};return Xi()&&"rtl"===n.direction?c.scrollbarLeft=l:c.scrollbarRight=l,t&&(c.paddingLeft=parseInt(n.paddingLeft,10)||0,c.paddingRight=parseInt(n.paddingRight,10)||0,c.paddingTop=parseInt(n.paddingTop,10)||0,c.paddingBottom=parseInt(n.paddingBottom,10)||0),c}function es(e,t=!1,n){let r=n?e.getBoundingClientRect():ts(e),i=Ki(e,t),s={left:r.left+i.borderLeft+i.scrollbarLeft,right:r.right-i.borderRight-i.scrollbarRight,top:r.top+i.borderTop,bottom:r.bottom-i.borderBottom-i.scrollbarBottom};return t&&(s.left+=i.paddingLeft,s.right-=i.paddingRight,s.top+=i.paddingTop,s.bottom-=i.paddingBottom),s}function ts(e){let 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 ns(e){let t=[];for(;e instanceof HTMLElement;){let 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}class rs{constructor(e,t,n,r){this.els=t;let i=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(i.left),r&&this.buildElVerticals(i.top)}buildElHorizontals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n}buildElVerticals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n}leftToIndex(e){let t,{lefts:n,rights:r}=this,i=n.length;for(t=0;t=n[t]&&e=n[t]&&e0}canScrollHorizontally(){return this.getMaxScrollLeft()>0}canScrollUp(){return this.getScrollTop()>0}canScrollDown(){return this.getScrollTop()0}canScrollRight(){return this.getScrollLeft()e.thickness)){this.getEntryThickness=e,this.strictOrder=!1,this.allowReslicing=!1,this.maxCoord=-1,this.maxStackCnt=-1,this.levelCoords=[],this.entriesByLevel=[],this.stackCnts={}}addSegs(e){let t=[];for(let n of e)this.insertEntry(n,t);return t}insertEntry(e,t){let n=this.findInsertion(e);return this.isInsertionValid(n,e)?(this.insertEntryAt(e,n),1):this.handleInvalidInsertion(n,e,t)}isInsertionValid(e,t){return(-1===this.maxCoord||e.levelCoord+this.getEntryThickness(t)<=this.maxCoord)&&(-1===this.maxStackCnt||e.stackCnto.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:o.end,end:s.end}},i)),r?(n.push({index:e.index,thickness:e.thickness,span:fs(o,s)},...i),r):(n.push(e),0)}insertEntryAt(e,t){let{entriesByLevel:n,levelCoords:r}=this;-1===t.lateral?(gs(r,t.level,t.levelCoord),gs(n,t.level,[e])):gs(n[t.level],t.lateral,e),this.stackCnts[us(e)]=t.stackCnt}findInsertion(e){let{levelCoords:t,entriesByLevel:n,strictOrder:r,stackCnts:i}=this,s=t.length,o=0,a=-1,l=-1,c=null,d=0;for(let u=0;u=o+this.getEntryThickness(e))break;let h,f=n[u],g=ps(f,e.span.start,ds),p=g[0]+g[1];for(;(h=f[p])&&h.span.starto&&(o=e,c=h,a=u,l=p),e===o&&(d=Math.max(d,i[us(h)]+1)),p+=1}}let u=0;if(c)for(u=a+1;un(e[i-1]))return[i,0];for(;ro))return[s,1];r=s+1}}return[r,0]}class ms{constructor(e,t){this.emitter=new Gr}destroy(){}setMirrorIsVisible(e){}setMirrorNeedsRevert(e){}setAutoScrollEnabled(e){}}const vs={},ys={startTime:ft,duration:ft,create:Boolean,sourceId:String};function bs(e){let{refined:t,extra:n}=vn(e,ys);return{startTime:t.startTime||null,duration:t.duration||null,create:null==t.create||t.create,sourceId:t.sourceId,leftoverProps:n}}function Es(e,t){return an(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}const Ss="fc-col-header-cell";function As(e){return e.text}class Ds extends Gn{render(){let{dateEnv:e,options:t,theme:n,viewApi:r}=this.context,{props:i}=this,{date:s,dateProfile:o}=i,a=Fi(s,i.todayRange,null,o),l=[Ss].concat(Vi(a,n)),c=e.format(s,i.dayHeaderFormat),d=!a.isDisabled&&i.colCnt>1?qi(this.context,s):{},u=Object.assign(Object.assign(Object.assign({date:e.toDate(s),view:r},i.extraRenderProps),{text:c}),a);return p(Jn,{elTag:"th",elClasses:l,elAttrs:Object.assign({role:"columnheader",colSpan:i.colSpan,"data-date":a.isDisabled?void 0:Wt(s)},i.extraDataAttrs),renderProps:u,generatorName:"dayHeaderContent",customGenerator:t.dayHeaderContent,defaultGenerator:As,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount},e=>p("div",{className:"fc-scrollgrid-sync-inner"},!a.isDisabled&&p(e,{elTag:"a",elAttrs:d,elClasses:["fc-col-header-cell-cushion",i.isSticky&&"fc-sticky"]})))}}const ws=an({weekday:"long"});class Cs extends Gn{render(){let{props:e}=this,{dateEnv:t,theme:n,viewApi:r,options:i}=this.context,s=wt(new Date(2592e5),e.dow),o={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},a=t.format(s,e.dayHeaderFormat),l=Object.assign(Object.assign(Object.assign(Object.assign({date:s},o),{view:r}),e.extraRenderProps),{text:a});return p(Jn,{elTag:"th",elClasses:[Ss,...Vi(o,n),...e.extraClassNames||[]],elAttrs:Object.assign({role:"columnheader",colSpan:e.colSpan},e.extraDataAttrs),renderProps:l,generatorName:"dayHeaderContent",customGenerator:i.dayHeaderContent,defaultGenerator:As,classNameGenerator:i.dayHeaderClassNames,didMount:i.dayHeaderDidMount,willUnmount:i.dayHeaderWillUnmount},n=>p("div",{className:"fc-scrollgrid-sync-inner"},p(n,{elTag:"a",elClasses:["fc-col-header-cell-cushion",e.isSticky&&"fc-sticky"],elAttrs:{"aria-label":t.format(s,ws)}})))}}class Rs extends D{constructor(e,t){super(e,t),this.initialNowDate=fr(t.options.now,t.dateEnv),this.initialNowQueriedMs=(new Date).valueOf(),this.state=this.computeTiming().currentState}render(){let{props:e,state:t}=this;return e.children(t.nowDate,t.todayRange)}componentDidMount(){this.setTimeout()}componentDidUpdate(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())}componentWillUnmount(){this.clearTimeout()}computeTiming(){let{props:e,context:t}=this,n=Ct(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),i=t.dateEnv.add(r,ft(1,e.unit)),s=i.valueOf()-n.valueOf();return s=Math.min(864e5,s),{currentState:{nowDate:r,todayRange:xs(r)},nextState:{nowDate:i,todayRange:xs(i)},waitMs:s}}setTimeout(){let{nextState:e,waitMs:t}=this.computeTiming();this.timeoutId=setTimeout(()=>{this.setState(e,()=>{this.setTimeout()})},t)}clearTimeout(){this.timeoutId&&clearTimeout(this.timeoutId)}}function xs(e){let t=Mt(e);return{start:t,end:wt(t,1)}}Rs.contextType=Ln;class _s extends Gn{constructor(){super(...arguments),this.createDayHeaderFormatter=Gt(Ts)}render(){let{context:e}=this,{dates:t,dateProfile:n,datesRepDistinctDays:r,renderIntro:i}=this.props,s=this.createDayHeaderFormatter(e.options.dayHeaderFormat,r,t.length);return p(Rs,{unit:"day"},(e,o)=>p("tr",{role:"row"},i&&i("day"),t.map(e=>r?p(Ds,{key:e.toISOString(),date:e,dateProfile:n,todayRange:o,colCnt:t.length,dayHeaderFormat:s}):p(Cs,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:s}))))}}function Ts(e,t,n){return e||Es(t,n)}class ks{constructor(e,t){let n=e.start,{end:r}=e,i=[],s=[],o=-1;for(;n=t.length?t[t.length-1]+1:t[n]}}class Ms{constructor(e,t){let n,r,i,{dates:s}=e;if(t){for(r=s[0].getUTCDay(),n=1;n!p[e.instanceId])}),u=d.defs,h=d.instances,f=li(u,e.eventUiBases);var g,p;for(let r in l){let o=l[r],g=o.range,p=c[o.defId],m=a[o.defId];if(!js(p.constraints,g,d,e.businessHours,t))return!1;let{eventOverlap:v}=t.options,y="function"==typeof v?v:null;for(let e in h){let n=h[e];if(or(g,n.range)){if(!1===f[n.defId].overlap&&s.isEvent)return!1;if(!1===p.overlap)return!1;if(y&&!y(new ti(t,u[n.defId],n),new ti(t,m,o)))return!1}}let b=i.eventStore;for(let e of p.allows){let i,s=Object.assign(Object.assign({},n),{range:o.range,allDay:m.allDay}),a=b.defs[m.defId],l=b.instances[r];if(i=a?new ti(t,a,l):new ti(t,m),!e(Zr(s,t),i))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){let i=e.eventStore,s=i.defs,o=i.instances,a=e.dateSelection,l=a.range,{selectionConfig:c}=t.getCurrentData();r&&(c=r(c));if(!js(c.constraints,l,i,e.businessHours,t))return!1;let{selectOverlap:d}=t.options,u="function"==typeof d?d:null;for(let e in o){let n=o[e];if(or(l,n.range)){if(!1===c.overlap)return!1;if(u&&!u(new ti(t,s[n.defId],n),null))return!1}}for(let e of c.allows){let r=Object.assign(Object.assign({},n),a);if(!e(Zr(r,t),null))return!1}return!0}(e,t,n,r))}function js(e,t,n,r,i){for(let s of e)if(!Ws(zs(s,t,n,r,i),t))return!1;return!0}function zs(e,t,n,r,i){return"businessHours"===e?Us(mr(r,t,i)):"string"==typeof e?Us(kr(n,t=>t.groupId===e)):"object"==typeof e&&e?Us(mr(e,t,i)):[]}function Us(e){let{instances:t}=e,n=[];for(let e in t)n.push(t[e].range);return n}function Ws(e,t){for(let n of e)if(ar(n,t))return!0;return!1}const Ls=/^(visible|hidden)$/;class Fs extends Gn{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,Qn(this.props.elRef,e)}}render(){let{props:e}=this,{liquid:t,liquidIsAbsolute:n}=e,r=t&&n,i=["fc-scroller"];return t&&(n?i.push("fc-scroller-liquid-absolute"):i.push("fc-scroller-liquid")),p("div",{ref:this.handleEl,className:i.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:r&&-(e.overcomeLeft||0)||"",right:r&&-(e.overcomeRight||0)||"",bottom:r&&-(e.overcomeBottom||0)||"",marginLeft:!r&&-(e.overcomeLeft||0)||"",marginRight:!r&&-(e.overcomeRight||0)||"",marginBottom:!r&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)}needsXScrolling(){if(Ls.test(this.props.overflowX))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0}return!1}needsYScrolling(){if(Ls.test(this.props.overflowY))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0}return!1}getXScrollbarWidth(){return Ls.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight}getYScrollbarWidth(){return Ls.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth}}class Vs{constructor(e){this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=(e,t)=>{let{depths:n,currentMap:r}=this,i=!1,s=!1;null!==e?(i=t in r,r[t]=e,n[t]=(n[t]||0)+1,s=!0):(n[t]-=1,n[t]||(delete r[t],delete this.callbackMap[t],i=!0)),this.masterCallback&&(i&&this.masterCallback(null,String(t)),s&&this.masterCallback(e,String(t)))}}createRef(e){let t=this.callbackMap[e];return t||(t=this.callbackMap[e]=t=>{this.handleValue(t,String(e))}),t}collect(e,t,n){return kn(this.currentMap,e,t,n)}getAll(){return wn(this.currentMap)}}function Gs(e){let t=Pe(e,".fc-scrollgrid-shrink"),n=0;for(let e of t)n=Math.max(n,dt(e));return Math.ceil(n)}function Qs(e,t){return e.liquid&&t.liquid}function qs(e,t){return null!=t.maxHeight||Qs(e,t)}function Ys(e,t,n,r){let{expandRows:i}=n;return"function"==typeof t.content?t.content(n):p("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:i?n.clientHeight:""}},n.tableColGroupNode,p(r?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function Zs(e,t){return St(e,t,Cn)}function Xs(e,t){let n=[];for(let r of e){let e=r.span||1;for(let i=0;ie,Zs),this.renderMicroColGroup=Gt(Xs),this.scrollerRefs=new Vs,this.scrollerElRefs=new Vs(this._handleScrollerEl.bind(this)),this.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},this.handleSizing=()=>{this.safeSetState(Object.assign({shrinkWidth:this.computeShrinkWidth()},this.computeScrollerDims()))}}render(){let{props:e,state:t,context:n}=this,r=e.sections||[],i=this.processCols(e.cols),s=this.renderMicroColGroup(i,t.shrinkWidth),o=Ks(e.liquid,n);e.collapsibleWidth&&o.push("fc-scrollgrid-collapsible");let a,l=r.length,c=0,d=[],u=[],h=[];for(;c{}},r);return p(r?"th":"td",{ref:n.elRef,role:"presentation"},p("div",{className:"fc-scroller-harness"+(c?" fc-scroller-harness-liquid":"")},p(Fs,{ref:this.scrollerRefs.createRef(u),elRef:this.scrollerElRefs.createRef(u),overflowY:d,overflowX:i.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:c,liquidIsAbsolute:!0},h)))}_handleScrollerEl(e,t){let n=function(e,t){for(let n of e)if(n.key===t)return n;return null}(this.props.sections,t);n&&Qn(n.chunk.scrollerElRef,e)}componentDidMount(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)}componentDidUpdate(){this.handleSizing()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}computeShrinkWidth(){return Js(this.props.cols)?Gs(this.scrollerElRefs.getAll()):0}computeScrollerDims(){let e=$i(),{scrollerRefs:t,scrollerElRefs:n}=this,r=!1,i={},s={};for(let e in t.currentMap){let n=t.currentMap[e];if(n&&n.needsYScrolling()){r=!0;break}}for(let t of this.props.sections){let o=t.key,a=n.currentMap[o];if(a){let t=a.parentNode;i[o]=Math.floor(t.getBoundingClientRect().width-(r?e.y:0)),s[o]=Math.floor(t.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:i,scrollerClientHeights:s}}}io.addStateEquality({scrollerClientWidths:Cn,scrollerClientHeights:Cn});class so extends Gn{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,e&&oi(e,this.props.seg)}}render(){const{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{eventRange:i}=r,{ui:s}=i,o={event:new ti(t,i.def,i.instance),view:t.viewApi,timeText:e.timeText,textColor:s.textColor,backgroundColor:s.backgroundColor,borderColor:s.borderColor,isDraggable:!e.disableDragging&&hi(r,t),isStartResizable:!e.disableResizing&&fi(r,t),isEndResizable:!e.disableResizing&&gi(r),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(r.isStart),isEnd:Boolean(r.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)};return p(Jn,Object.assign({},e,{elRef:this.handleEl,elClasses:[...vi(o),...r.eventRange.ui.classNames,...e.elClasses||[]],renderProps:o,generatorName:"eventContent",customGenerator:n.eventContent,defaultGenerator:e.defaultGenerator,classNameGenerator:n.eventClassNames,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount}))}componentDidUpdate(e){this.el&&this.props.seg!==e.seg&&oi(this.el,this.props.seg)}}class oo extends Gn{render(){let{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{ui:i}=r.eventRange,s=pi(r,n.eventTimeFormat||e.defaultTimeFormat,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return p(so,Object.assign({},e,{elTag:"a",elStyle:{borderColor:i.borderColor,backgroundColor:i.backgroundColor},elAttrs:bi(r,t),defaultGenerator:ao,timeText:s}),(e,t)=>p(y,null,p(e,{elTag:"div",elClasses:["fc-event-main"],elStyle:{color:t.textColor}}),Boolean(t.isStartResizable)&&p("div",{className:"fc-event-resizer fc-event-resizer-start"}),Boolean(t.isEndResizable)&&p("div",{className:"fc-event-resizer fc-event-resizer-end"})))}}function ao(e){return p("div",{className:"fc-event-main-frame"},e.timeText&&p("div",{className:"fc-event-time"},e.timeText),p("div",{className:"fc-event-title-container"},p("div",{className:"fc-event-title fc-sticky"},e.event.title||p(y,null," "))))}const lo=e=>p(Ln.Consumer,null,t=>{let{options:n}=t,r={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return p(Jn,Object.assign({},e,{elTag:e.elTag||"div",renderProps:r,generatorName:"nowIndicatorContent",customGenerator:n.nowIndicatorContent,classNameGenerator:n.nowIndicatorClassNames,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount}))}),co=an({day:"numeric"});class uo extends Gn{constructor(){super(...arguments),this.refineRenderProps=Qt(fo)}render(){let{props:e,context:t}=this,{options:n}=t,r=this.refineRenderProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,isMonthStart:e.isMonthStart||!1,showDayNumber:e.showDayNumber,extraRenderProps:e.extraRenderProps,viewApi:t.viewApi,dateEnv:t.dateEnv,monthStartFormat:n.monthStartFormat});return p(Jn,Object.assign({},e,{elClasses:[...Vi(r,t.theme),...e.elClasses||[]],elAttrs:Object.assign(Object.assign({},e.elAttrs),r.isDisabled?{}:{"data-date":Wt(e.date)}),renderProps:r,generatorName:"dayCellContent",customGenerator:n.dayCellContent,defaultGenerator:e.defaultGenerator,classNameGenerator:r.isDisabled?void 0:n.dayCellClassNames,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount}))}}function ho(e){return Boolean(e.dayCellContent||Yn("dayCellContent",e))}function fo(e){let{date:t,dateEnv:n,dateProfile:r,isMonthStart:i}=e,s=Fi(t,e.todayRange,null,r),o=e.showDayNumber?n.format(t,i?e.monthStartFormat:co):"";return Object.assign(Object.assign(Object.assign({date:n.toDate(t),view:e.viewApi},s),{isMonthStart:i,dayNumberText:o}),e.extraRenderProps)}class go extends Gn{render(){let{props:e}=this,{seg:t}=e;return p(so,{elTag:"div",elClasses:["fc-bg-event"],elStyle:{backgroundColor:t.eventRange.ui.backgroundColor},defaultGenerator:po,seg:t,timeText:"",isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,disableDragging:!0,disableResizing:!0})}}function po(e){let{title:t}=e.event;return t&&p("div",{className:"fc-event-title"},e.event.title)}function mo(e){return p("div",{className:"fc-"+e})}const vo=e=>p(Ln.Consumer,null,t=>{let{dateEnv:n,options:r}=t,{date:i}=e,s=r.weekNumberFormat||e.defaultFormat,o={num:n.computeWeekNumber(i),text:n.format(i,s),date:i};return p(Jn,Object.assign({},e,{renderProps:o,generatorName:"weekNumberContent",customGenerator:r.weekNumberContent,defaultGenerator:yo,classNameGenerator:r.weekNumberClassNames,didMount:r.weekNumberDidMount,willUnmount:r.weekNumberWillUnmount}))});function yo(e){return e.text}class bo extends Gn{constructor(){super(...arguments),this.state={titleId:We()},this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&Qn(this.props.elRef,e)},this.handleDocumentMouseDown=e=>{const t=ze(e);this.rootEl.contains(t)||this.handleCloseClick()},this.handleDocumentKeyDown=e=>{"Escape"===e.key&&this.handleCloseClick()},this.handleCloseClick=()=>{let{onClose:e}=this.props;e&&e()}}render(){let{theme:e,options:t}=this.context,{props:n,state:r}=this,i=["fc-popover",e.getClass("popover")].concat(n.extraClassNames||[]);return fe(p("div",Object.assign({},n.extraAttrs,{id:n.id,className:i.join(" "),"aria-labelledby":r.titleId,ref:this.handleRootEl}),p("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},p("span",{className:"fc-popover-title",id:r.titleId},n.title),p("span",{className:"fc-popover-close "+e.getIconClass("close"),title:t.closeHint,onClick:this.handleCloseClick})),p("div",{className:"fc-popover-body "+e.getClass("popoverContent")},n.children)),n.parentEl)}componentDidMount(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()}componentWillUnmount(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)}updateSize(){let{isRtl:e}=this.context,{alignmentEl:t,alignGridTop:n}=this.props,{rootEl:r}=this,i=function(e){let t=ns(e),n=e.getBoundingClientRect();for(let e of t){let t=Hi(n,e.getBoundingClientRect());if(!t)return null;n=t}return n}(t);if(i){let s=r.getBoundingClientRect(),o=n?Oe(t,".fc-scrollgrid").getBoundingClientRect().top:i.top,a=e?i.right-s.width:i.left;o=Math.max(o,10),a=Math.min(a,document.documentElement.clientWidth-10-s.width),a=Math.max(a,10);let l=r.offsetParent.getBoundingClientRect();Be(r,{top:o-l.top,left:a-l.left})}}}class Eo extends ls{constructor(){super(...arguments),this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,useEventCenter:!1}):this.context.unregisterInteractiveComponent(this)}}render(){let{options:e,dateEnv:t}=this.context,{props:n}=this,{startDate:r,todayRange:i,dateProfile:s}=n,o=t.format(r,e.dayPopoverFormat);return p(uo,{elRef:this.handleRootEl,date:r,dateProfile:s,todayRange:i},(t,r,i)=>p(bo,{elRef:i.ref,id:n.id,title:o,extraClassNames:["fc-more-popover"].concat(i.className||[]),extraAttrs:i,parentEl:n.parentEl,alignmentEl:n.alignmentEl,alignGridTop:n.alignGridTop,onClose:n.onClose},ho(e)&&p(t,{elTag:"div",elClasses:["fc-more-popover-misc"]}),n.children))}queryHit(e,t,n,r){let{rootEl:i,props:s}=this;return e>=0&&e=0&&t{this.linkEl=e,this.props.elRef&&Qn(this.props.elRef,e)},this.handleClick=e=>{let{props:t,context:n}=this,{moreLinkClick:r}=n.options,i=Do(t).start;function s(e){let{def:t,instance:r,range:i}=e.eventRange;return{event:new ti(n,t,r),start:n.dateEnv.toDate(i.start),end:n.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof r&&(r=r({date:i,allDay:Boolean(t.allDayDate),allSegs:t.allSegs.map(s),hiddenSegs:t.hiddenSegs.map(s),jsEvent:e,view:n.viewApi})),r&&"popover"!==r?"string"==typeof r&&n.calendarApi.zoomTo(i,r):this.setState({isPopoverOpen:!0})},this.handlePopoverClose=()=>{this.setState({isPopoverOpen:!1})}}render(){let{props:e,state:t}=this;return p(Ln.Consumer,null,n=>{let{viewApi:r,options:i,calendarApi:s}=n,{moreLinkText:o}=i,{moreCnt:a}=e,l=Do(e),c="function"==typeof o?o.call(s,a):`+${a} ${o}`,d=at(i.moreLinkHint,[a],c),u={num:a,shortText:"+"+a,text:c,view:r};return p(y,null,Boolean(e.moreCnt)&&p(Jn,{elTag:e.elTag||"a",elRef:this.handleLinkEl,elClasses:[...e.elClasses||[],"fc-more-link"],elStyle:e.elStyle,elAttrs:Object.assign(Object.assign(Object.assign({},e.elAttrs),Qe(this.handleClick)),{title:d,"aria-expanded":t.isPopoverOpen,"aria-controls":t.isPopoverOpen?t.popoverId:""}),renderProps:u,generatorName:"moreLinkContent",customGenerator:i.moreLinkContent,defaultGenerator:e.defaultGenerator||Ao,classNameGenerator:i.moreLinkClassNames,didMount:i.moreLinkDidMount,willUnmount:i.moreLinkWillUnmount},e.children),t.isPopoverOpen&&p(Eo,{id:t.popoverId,startDate:l.start,endDate:l.end,dateProfile:e.dateProfile,todayRange:e.todayRange,extraDateSpan:e.extraDateSpan,parentEl:this.parentEl,alignmentEl:e.alignmentElRef?e.alignmentElRef.current:this.linkEl,alignGridTop:e.alignGridTop,forceTimed:e.forceTimed,onClose:this.handlePopoverClose},e.popoverContent()))})}componentDidMount(){this.updateParentEl()}componentDidUpdate(){this.updateParentEl()}updateParentEl(){this.linkEl&&(this.parentEl=Oe(this.linkEl,".fc-view-harness"))}}function Ao(e){return e.text}function Do(e){if(e.allDayDate)return{start:e.allDayDate,end:wt(e.allDayDate,1)};let{hiddenSegs:t}=e;return{start:wo(t),end:(n=t,n.reduce(Ro).eventRange.range.end)};var n}function wo(e){return e.reduce(Co).eventRange.range.start}function Co(e,t){return e.eventRange.range.startt.eventRange.range.end?e:t}var xo={__proto__:null,BASE_OPTION_DEFAULTS:cn,BaseComponent:Gn,BgEvent:go,CalendarImpl:Ni,CalendarRoot:ki,ContentContainer:Jn,CustomRenderingStore:class extends class{constructor(){this.handlers=[]}set(e){this.currentValue=e;for(let t of this.handlers)t(e)}subscribe(e){this.handlers.push(e),void 0!==this.currentValue&&e(this.currentValue)}}{constructor(){super(...arguments),this.map=new Map}handle(e){const{map:t}=this;let n=!1;e.isActive?(t.set(e.id,e),n=!0):t.has(e.id)&&(t.delete(e.id),n=!0),n&&this.set(t)}},DateComponent:ls,DateEnv:Hn,DateProfileGenerator:gr,DayCellContainer:uo,DayHeader:_s,DaySeriesModel:ks,DayTableModel:Ms,DelayedRunner:Me,ElementDragging:ms,ElementScrollController:os,Emitter:Gr,EventContainer:so,EventImpl:ti,Interaction:Mi,MoreLinkContainer:So,NamedTimeZoneImpl:class{constructor(e){this.timeZoneName=e}},NowIndicatorContainer:lo,NowTimer:Rs,PositionCache:rs,RefMap:Vs,ScrollController:ss,ScrollResponder:Wn,Scroller:Fs,SegHierarchy:cs,SimpleScrollGrid:io,Slicer:Is,Splitter:Wi,StandardEvent:oo,TableDateCell:Ds,TableDowCell:Cs,Theme:Bn,ViewContainer:er,ViewContextType:Ln,WeekNumberContainer:vo,WindowScrollController:as,addDays:wt,addDurations:pt,addMs:Ct,addWeeks:Dt,allowContextMenu:tt,allowSelection:Ke,applyMutationToEventStore:$r,applyStyle:Be,asCleanDays:function(e){return e.years||e.months||e.milliseconds?0:e.days},asRoughMinutes:function(e){return yt(e)/6e4},asRoughMs:yt,asRoughSeconds:function(e){return yt(e)/1e3},binarySearch:ps,buildElAttrs:Zn,buildEntryKey:us,buildEventApis:ri,buildEventRangeKey:yi,buildIsoString:Ut,buildNavLinkAttrs:qi,buildSegTimeText:pi,collectFromHash:kn,combineEventUis:Pr,compareByFieldSpecs:rt,compareNumbers:lt,compareObjs:_n,computeEarliestSegStart:wo,computeEdges:Ki,computeFallbackHeaderFormat:Es,computeInnerRect:es,computeRect:ts,computeShrinkWidth:Gs,computeVisibleDayRange:dr,config:vs,constrainPoint:Bi,createDuration:ft,createEmptyEventStore:_r,createEventInstance:pr,createEventUi:Nr,createFormatter:an,diffDates:hr,diffDayAndTime:_t,diffDays:xt,diffPoints:zi,diffWeeks:Rt,diffWholeDays:kt,diffWholeWeeks:Tt,disableCursor:Xe,elementClosest:Oe,elementMatches:Ne,enableCursor:$e,eventTupleToStore:Rr,filterHash:Sn,findDirectChildren:function(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e{let o=r.length,a=s.length,l=0;for(;l{let o={};for(let a in s)if(i[a])if(St(r[a],s[a]))o[a]=i[a];else{n&&n(i[a]);let r=e.apply(this,s[a]);o[a]=t&&t(r,i[a])?i[a]:r}else o[a]=e.apply(this,s[a]);return r=s,i=o,o}},memoizeObjArg:Qt,mergeEventStores:Tr,multiplyDuration:mt,padStart:ot,parseBusinessHours:qr,parseClassNames:Mr,parseDragMeta:bs,parseEventDef:wr,parseFieldSpecs:nt,parseMarker:Pn,pointInsideRect:Pi,preventContextMenu:et,preventDefault:Le,preventSelection:Je,rangeContainsMarker:lr,rangeContainsRange:ar,rangesEqual:sr,rangesIntersect:or,refineEventDef:Ar,refineProps:vn,removeElement:Ie,removeExact:function(e,t){let n=0,r=0;for(;r2&&(a.children=arguments.length>3?t.call(arguments,2):r),m(e.type,a,i||e.key,s||e.ref,null)},createElement:p,createRef:v,h:p,hydrate:function e(t,n){U(t,n,e)},get isValidElement(){return i},get options(){return n},render:U,toChildArray:M};const To=[],ko={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"},Mo=Object.assign(Object.assign({},ko),{buttonHints:{prev:"Previous $0",next:"Next $0",today:(e,t)=>"day"===t?"Today":"This "+e},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`});function Io(e){let t=e.length>0?e[0].code:"en",n=To.concat(e),r={en:Mo};for(let e of n)r[e.code]=e;return{map:r,defaultCode:t}}function Oo(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){let n=[].concat(e||[]),r=function(e,t){for(let n=0;n0;e-=1){let n=r.slice(0,e).join("-");if(t[n])return t[n]}}return null}(n,t)||Mo;return No(e,n,r)}(e,t):No(e.code,[e.code],e)}function No(e,t,n){let r=En([ko,n],["buttonText"]);delete r.code;let{week:i}=r;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function Po(e){return{id:Ze(),name:e.name,premiumReleaseDate:e.premiumReleaseDate?new Date(e.premiumReleaseDate):void 0,deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}function Ho(){let e,t=[],n=[];return(r,i)=>(e&&St(r,t)&&St(i,n)||(e=function(e,t){let n={},r={premiumReleaseDate:void 0,reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(let o of e){const e=o.name,a=n[e];void 0===a?(n[e]=o.id,i(o.deps),s=o,r={premiumReleaseDate:Bo((t=r).premiumReleaseDate,s.premiumReleaseDate),reducers:t.reducers.concat(s.reducers),isLoadingFuncs:t.isLoadingFuncs.concat(s.isLoadingFuncs),contextInit:t.contextInit.concat(s.contextInit),eventRefiners:Object.assign(Object.assign({},t.eventRefiners),s.eventRefiners),eventDefMemberAdders:t.eventDefMemberAdders.concat(s.eventDefMemberAdders),eventSourceRefiners:Object.assign(Object.assign({},t.eventSourceRefiners),s.eventSourceRefiners),isDraggableTransformers:t.isDraggableTransformers.concat(s.isDraggableTransformers),eventDragMutationMassagers:t.eventDragMutationMassagers.concat(s.eventDragMutationMassagers),eventDefMutationAppliers:t.eventDefMutationAppliers.concat(s.eventDefMutationAppliers),dateSelectionTransformers:t.dateSelectionTransformers.concat(s.dateSelectionTransformers),datePointTransforms:t.datePointTransforms.concat(s.datePointTransforms),dateSpanTransforms:t.dateSpanTransforms.concat(s.dateSpanTransforms),views:Object.assign(Object.assign({},t.views),s.views),viewPropsTransformers:t.viewPropsTransformers.concat(s.viewPropsTransformers),isPropsValid:s.isPropsValid||t.isPropsValid,externalDefTransforms:t.externalDefTransforms.concat(s.externalDefTransforms),viewContainerAppends:t.viewContainerAppends.concat(s.viewContainerAppends),eventDropTransformers:t.eventDropTransformers.concat(s.eventDropTransformers),calendarInteractions:t.calendarInteractions.concat(s.calendarInteractions),componentInteractions:t.componentInteractions.concat(s.componentInteractions),themeClasses:Object.assign(Object.assign({},t.themeClasses),s.themeClasses),eventSourceDefs:t.eventSourceDefs.concat(s.eventSourceDefs),cmdFormatter:s.cmdFormatter||t.cmdFormatter,recurringTypes:t.recurringTypes.concat(s.recurringTypes),namedTimeZonedImpl:s.namedTimeZonedImpl||t.namedTimeZonedImpl,initialView:t.initialView||s.initialView,elementDraggingImpl:t.elementDraggingImpl||s.elementDraggingImpl,optionChangeHandlers:Object.assign(Object.assign({},t.optionChangeHandlers),s.optionChangeHandlers),scrollGridImpl:s.scrollGridImpl||t.scrollGridImpl,listenerRefiners:Object.assign(Object.assign({},t.listenerRefiners),s.listenerRefiners),optionRefiners:Object.assign(Object.assign({},t.optionRefiners),s.optionRefiners),propSetHandlers:Object.assign(Object.assign({},t.propSetHandlers),s.propSetHandlers)}):a!==o.id&&console.warn(`Duplicate plugin '${e}'`)}var t,s}return e&&i(e),i(t),r}(r,i)),t=r,n=i,e)}function Bo(e,t){return void 0===e?t:void 0===t?e:new Date(Math.max(e.valueOf(),t.valueOf()))}class jo extends Bn{}function zo(e,t,n,r){if(t[e])return t[e];let i=function(e,t,n,r){let i=n[e],s=r[e],o=e=>i&&null!==i[e]?i[e]:s&&null!==s[e]?s[e]:null,a=o("component"),l=o("superType"),c=null;if(l){if(l===e)throw new Error("Can't have a custom view type that references itself");c=zo(l,t,n,r)}!a&&c&&(a=c.component);if(!a)return null;return{type:e,component:a,defaults:Object.assign(Object.assign({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:Object.assign(Object.assign({},c?c.overrides:{}),s?s.rawOptions:{})}}(e,t,n,r);return i&&(t[e]=i),i}function Uo(e){return An(e,Wo)}function Wo(e){let t="function"==typeof e?{component:e}:e,{component:n}=t;return t.content?n=Lo(t):!n||n.prototype instanceof Gn||(n=Lo(Object.assign(Object.assign({},t),{content:n}))),{superType:t.type,component:n,rawOptions:t}}function Lo(e){return t=>p(Ln.Consumer,null,n=>p(Jn,{elTag:"div",elClasses:tr(n.viewSpec),renderProps:Object.assign(Object.assign({},t),{nextDayThreshold:n.options.nextDayThreshold}),generatorName:void 0,customGenerator:e.content,classNameGenerator:e.classNames,didMount:e.didMount,willUnmount:e.willUnmount}))}function Fo(e,t,n,r){let i=Uo(e),s=Uo(t.views);return An(function(e,t){let n,r={};for(n in e)zo(n,r,e,t);for(n in t)zo(n,r,e,t);return r}(i,s),e=>function(e,t,n,r,i){let s=e.overrides.duration||e.defaults.duration||r.duration||n.duration,o=null,a="",l="",c={};if(s&&(o=function(e){let t=JSON.stringify(e),n=Vo[t];void 0===n&&(n=ft(e),Vo[t]=n);return n}(s),o)){let e=Et(o);a=e.unit,1===e.value&&(l=a,c=t[a]?t[a].rawOptions:{})}let d=t=>{let n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null},u=t=>{let n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null};return{type:e.type,component:e.component,duration:o,durationUnit:a,singleUnit:l,optionDefaults:e.defaults,optionOverrides:Object.assign(Object.assign({},c),e.overrides),buttonTextOverride:d(r)||d(n)||e.overrides.buttonText,buttonTextDefault:d(i)||e.defaults.buttonText||d(cn)||e.type,buttonTitleOverride:u(r)||u(n)||e.overrides.buttonHint,buttonTitleDefault:u(i)||e.defaults.buttonHint||u(cn)}}(e,s,t,n,r))}jo.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},jo.prototype.baseIconClass="fc-icon",jo.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},jo.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},jo.prototype.iconOverrideOption="buttonIcons",jo.prototype.iconOverrideCustomButtonOption="icon",jo.prototype.iconOverridePrefix="fc-icon-";let Vo={};function Go(e,t,n){let r=t?t.activeRange:null;return Yo({},function(e,t){let n=zr(t),r=[].concat(e.eventSources||[]),i=[];e.initialEvents&&r.unshift(e.initialEvents);e.events&&r.unshift(e.events);for(let e of r){let r=jr(e,t,n);r&&i.push(r)}return i}(e,n),r,n)}function Qo(e,t,n,r){let i=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return Yo(e,t.sources,i,r);case"REMOVE_EVENT_SOURCE":return s=e,o=t.sourceId,Sn(s,e=>e.sourceId!==o);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?Zo(e,i,r):e;case"FETCH_EVENT_SOURCES":return Xo(e,t.sourceIds?Dn(t.sourceIds):Jo(e,r),i,t.isRefetch||!1,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){let i=e[t];if(i&&n===i.latestFetchId)return Object.assign(Object.assign({},e),{[t]:Object.assign(Object.assign({},i),{isFetching:!1,fetchRange:r})});return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var s,o}function qo(e){for(let t in e)if(e[t].isFetching)return!0;return!1}function Yo(e,t,n,r){let i={};for(let e of t)i[e.sourceId]=e;return n&&(i=Zo(i,n,r)),Object.assign(Object.assign({},e),i)}function Zo(e,t,n){return Xo(e,Sn(e,e=>function(e,t,n){if(!Ko(e,n))return!e.latestFetchId;return!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.starte.fetchRange.end}(e,t,n)),t,!1,n)}function Xo(e,t,n,r,i){let s={};for(let o in e){let a=e[o];t[o]?s[o]=$o(a,n,r,i):s[o]=a}return s}function $o(e,t,n,r){let{options:i,calendarApi:s}=r,o=r.pluginHooks.eventSourceDefs[e.sourceDefId],a=Ze();return o.fetch({eventSource:e,range:t,isRefetch:n,context:r},n=>{let{rawEvents:o}=n;i.eventSourceSuccess&&(o=i.eventSourceSuccess.call(s,o,n.response)||o),e.success&&(o=e.success.call(s,o,n.response)||o),r.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:a,fetchRange:t,rawEvents:o})},n=>{let o=!1;i.eventSourceFailure&&(i.eventSourceFailure.call(s,n),o=!0),e.failure&&(e.failure(n),o=!0),o||console.warn(n.message,n),r.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:a,fetchRange:t,error:n})}),Object.assign(Object.assign({},e),{isFetching:!0,latestFetchId:a})}function Jo(e,t){return Sn(e,e=>Ko(e,t))}function Ko(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function ea(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function ta(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function na(e,t){let n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function ra(e,t){let n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function ia(e,t,n,r,i){return{header:e.headerToolbar?sa(e.headerToolbar,e,t,n,r,i):null,footer:e.footerToolbar?sa(e.footerToolbar,e,t,n,r,i):null}}function sa(e,t,n,r,i,s){let o={},a=[],l=!1;for(let c in e){let d=oa(e[c],t,n,r,i,s);o[c]=d.widgets,a.push(...d.viewsWithButtons),l=l||d.hasTitle}return{sectionWidgets:o,viewsWithButtons:a,hasTitle:l}}function oa(e,t,n,r,i,s){let o="rtl"===t.direction,a=t.customButtons||{},l=n.buttonText||{},c=t.buttonText||{},d=n.buttonHints||{},u=t.buttonHints||{},h=e?e.split(" "):[],f=[],g=!1;return{widgets:h.map(e=>e.split(",").map(e=>{if("title"===e)return g=!0,{buttonName:e};let n,h,p,m,v,y;if(n=a[e])p=e=>{n.click&&n.click.call(e.target,e,e.target)},(m=r.getCustomButtonIconClass(n))||(m=r.getIconClass(e,o))||(v=n.text),y=n.hint||n.text;else if(h=i[e]){f.push(e),p=()=>{s.changeView(e)},(v=h.buttonTextOverride)||(m=r.getIconClass(e,o))||(v=h.buttonTextDefault);let n=h.buttonTextOverride||h.buttonTextDefault;y=at(h.buttonTitleOverride||h.buttonTitleDefault||t.viewHint,[n,e],n)}else if(s[e])if(p=()=>{s[e]()},(v=l[e])||(m=r.getIconClass(e,o))||(v=c[e]),"prevYear"===e||"nextYear"===e){let t="prevYear"===e?"prev":"next";y=at(d[t]||u[t],[c.year||"year","year"],c[e])}else y=t=>at(d[e]||u[e],[c[t]||t,t],c[e]);return{buttonName:e,buttonClick:p,buttonIcon:m,buttonText:v,buttonHint:y}})),viewsWithButtons:f,hasTitle:g}}class aa{constructor(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}get calendar(){return this.getCurrentData().calendarApi}get title(){return this.getCurrentData().viewTitle}get activeStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)}get activeEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)}get currentStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)}get currentEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)}getOption(e){return this.getCurrentData().options[e]}}function la(e,t){let n=wn(t.getCurrentData().eventSources);if(1===n.length&&1===e.length&&Array.isArray(n[0]._raw)&&Array.isArray(e[0]))return void t.dispatch({type:"RESET_RAW_EVENTS",sourceId:n[0].sourceId,rawEvents:e[0]});let r=[];for(let t of e){let e=!1;for(let r=0;rArray.isArray(e.events)?e.events:null,fetch(e,t){t({rawEvents:e.eventSource.meta})}}]}),Po({name:"func-event-source",eventSourceDefs:[{parseMeta:e=>"function"==typeof e.events?e.events:null,fetch(e,t,n){const{dateEnv:r}=e.context;Ci(e.eventSource.meta.bind(null,Di(e.range,r)),e=>t({rawEvents:e}),n)}}]}),Po({name:"json-event-source",eventSourceRefiners:{method:String,extraParams:yn,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:e=>!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam},fetch(e,t,n){const{meta:r}=e.eventSource,i=function(e,t,n){let r,i,s,o,{dateEnv:a,options:l}=n,c={};r=e.startParam,null==r&&(r=l.startParam);i=e.endParam,null==i&&(i=l.endParam);s=e.timeZoneParam,null==s&&(s=l.timeZoneParam);o="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Object.assign(c,o),c[r]=a.formatIso(t.start),c[i]=a.formatIso(t.end),"local"!==a.timeZone&&(c[s]=a.timeZone);return c}(r,e.range,e.context);xi(r.method,r.url,i).then(([e,n])=>{t({rawEvents:e,response:n})},n)}}]}),Po({name:"simple-recurring-event",recurringTypes:[{parse(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){let i,s={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null};return e.duration&&(i=e.duration),!i&&e.startTime&&e.endTime&&(n=e.endTime,r=e.startTime,i={years:n.years-r.years,months:n.months-r.months,days:n.days-r.days,milliseconds:n.milliseconds-r.milliseconds}),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:i,typeData:s}}var n,r;return null},expand(e,t,n){let r=ir(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){let i=e?Dn(e):null,s=Mt(n.start),o=n.end,a=[];for(;sqo(e.eventSources)],propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",Object.assign(Object.assign({},Di(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){let{emitter:n}=t;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",ri(e,t))}}})];class da{constructor(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new Me(this.drain.bind(this))}request(e,t){this.queue.push(e),this.delayedRunner.request(t)}pause(e){this.delayedRunner.pause(e)}resume(e,t){this.delayedRunner.resume(e,t)}drain(){let{queue:e}=this;for(;e.length;){let t,n=[];for(;t=e.shift();)this.runTask(t),n.push(t);this.drained(n)}}runTask(e){this.runTaskOption&&this.runTaskOption(e)}drained(e){this.drainedOption&&this.drainedOption(e)}}function ua(e,t,n){let r;return r=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(r.start,r.end,an(t.titleFormat||function(e){let{currentRangeUnit:t}=e;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};let n=kt(e.currentRange.start,e.currentRange.end);if(null!==n&&n>1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}class ha{constructor(e){this.computeCurrentViewData=Gt(this._computeCurrentViewData),this.organizeRawLocales=Gt(Io),this.buildLocale=Gt(Oo),this.buildPluginHooks=Ho(),this.buildDateEnv=Gt(fa),this.buildTheme=Gt(ga),this.parseToolbars=Gt(ia),this.buildViewSpecs=Gt(Fo),this.buildDateProfileGenerator=Qt(pa),this.buildViewApi=Gt(ma),this.buildViewUiProps=Qt(ba),this.buildEventUiBySource=Gt(va,Cn),this.buildEventUiBases=Gt(ya),this.parseContextBusinessHours=Qt(Sa),this.buildTitle=Gt(ua),this.emitter=new Gr,this.actionRunner=new da(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.optionsForRefining=[],this.optionsForHandling=[],this.getCurrentData=()=>this.data,this.dispatch=e=>{this.actionRunner.request(e)},this.props=e,this.actionRunner.pause();let t={},n=this.computeOptionsData(e.optionOverrides,t,e.calendarApi),r=n.calendarOptions.initialView||n.pluginHooks.initialView,i=this.computeCurrentViewData(r,n,e.optionOverrides,t);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(i.options);let s=function(e,t){let n=e.initialDate;return null!=n?t.createMarker(n):fr(e.now,t)}(n.calendarOptions,n.dateEnv),o=i.dateProfileGenerator.build(s);lr(o.activeRange,s)||(s=o.currentRange.start);let a={dateEnv:n.dateEnv,options:n.calendarOptions,pluginHooks:n.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData};for(let e of n.pluginHooks.contextInit)e(a);let l=Go(n.calendarOptions,o,a),c={dynamicOptionOverrides:t,currentViewType:r,currentDate:s,dateProfile:o,businessHours:this.parseContextBusinessHours(a),eventSources:l,eventUiBases:{},eventStore:{defs:{},instances:{}},renderableEventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(a).selectionConfig},d=Object.assign(Object.assign({},a),c);for(let e of n.pluginHooks.reducers)Object.assign(c,e(null,null,d));Ea(c,a)&&this.emitter.trigger("loading",!0),this.state=c,this.updateData(),this.actionRunner.resume()}resetOptions(e,t){let{props:n}=this;void 0===t?n.optionOverrides=e:(n.optionOverrides=Object.assign(Object.assign({},n.optionOverrides||{}),e),this.optionsForRefining.push(...t)),(void 0===t||t.length)&&this.actionRunner.request({type:"NOTHING"})}_handleAction(e){let{props:t,state:n,emitter:r}=this,i=function(e,t){switch(t.type){case"SET_OPTION":return Object.assign(Object.assign({},e),{[t.optionName]:t.rawOptionValue});default:return e}}(n.dynamicOptionOverrides,e),s=this.computeOptionsData(t.optionOverrides,i,t.calendarApi),o=function(e,t){switch(t.type){case"CHANGE_VIEW_TYPE":e=t.viewType}return e}(n.currentViewType,e),a=this.computeCurrentViewData(o,s,t.optionOverrides,i);t.calendarApi.currentDataManager=this,r.setThisContext(t.calendarApi),r.setOptions(a.options);let l={dateEnv:s.dateEnv,options:s.calendarOptions,pluginHooks:s.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:r,getCurrentData:this.getCurrentData},{currentDate:c,dateProfile:d}=n;this.data&&this.data.dateProfileGenerator!==a.dateProfileGenerator&&(d=a.dateProfileGenerator.build(c)),c=function(e,t){switch(t.type){case"CHANGE_DATE":return t.dateMarker;default:return e}}(c,e),d=function(e,t,n,r){let i;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if(i=r.buildPrev(e,n),i.isValid)return i;break;case"NEXT":if(i=r.buildNext(e,n),i.isValid)return i}return e}(d,e,c,a.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&lr(d.currentRange,c)||(c=d.currentRange.start);let u=Qo(n.eventSources,e,d,l),h=Ur(n.eventStore,e,u,d,l),f=qo(u)&&!a.options.progressiveEventRendering&&n.renderableEventStore||h,{eventUiSingleBase:g,selectionConfig:p}=this.buildViewUiProps(l),m=this.buildEventUiBySource(u),v={dynamicOptionOverrides:i,currentViewType:o,currentDate:c,dateProfile:d,eventSources:u,eventStore:h,renderableEventStore:f,selectionConfig:p,eventUiBases:this.buildEventUiBases(f.defs,g,m),businessHours:this.parseContextBusinessHours(l),dateSelection:ea(n.dateSelection,e),eventSelection:ta(n.eventSelection,e),eventDrag:na(n.eventDrag,e),eventResize:ra(n.eventResize,e)},y=Object.assign(Object.assign({},l),v);for(let t of s.pluginHooks.reducers)Object.assign(v,t(n,e,y));let b=Ea(n,l),E=Ea(v,l);!b&&E?r.trigger("loading",!0):b&&!E&&r.trigger("loading",!1),this.state=v,t.onAction&&t.onAction(e)}updateData(){let{props:e,state:t}=this,n=this.data,r=this.computeOptionsData(e.optionOverrides,t.dynamicOptionOverrides,e.calendarApi),i=this.computeCurrentViewData(t.currentViewType,r,e.optionOverrides,t.dynamicOptionOverrides),s=this.data=Object.assign(Object.assign(Object.assign({viewTitle:this.buildTitle(t.dateProfile,i.options,r.dateEnv),calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},r),i),t),o=r.pluginHooks.optionChangeHandlers,a=n&&n.calendarOptions,l=r.calendarOptions;if(a&&a!==l){a.timeZone!==l.timeZone&&(t.eventSources=s.eventSources=function(e,t,n){let r=t?t.activeRange:null;return Xo(e,Jo(e,n),r,!0,n)}(s.eventSources,t.dateProfile,s),t.eventStore=s.eventStore=Fr(s.eventStore,n.dateEnv,s.dateEnv),t.renderableEventStore=s.renderableEventStore=Fr(s.renderableEventStore,n.dateEnv,s.dateEnv));for(let e in o)-1===this.optionsForHandling.indexOf(e)&&a[e]===l[e]||o[e](l[e],s)}this.optionsForHandling=[],e.onData&&e.onData(s)}computeOptionsData(e,t,n){if(!this.optionsForRefining.length&&e===this.stableOptionOverrides&&t===this.stableDynamicOptionOverrides)return this.stableCalendarOptionsData;let{refinedOptions:r,pluginHooks:i,localeDefaults:s,availableLocaleData:o,extra:a}=this.processRawCalendarOptions(e,t);Aa(a);let l=this.buildDateEnv(r.timeZone,r.locale,r.weekNumberCalculation,r.firstDay,r.weekText,i,o,r.defaultRangeSeparator),c=this.buildViewSpecs(i.views,this.stableOptionOverrides,this.stableDynamicOptionOverrides,s),d=this.buildTheme(r,i),u=this.parseToolbars(r,this.stableOptionOverrides,d,c,n);return this.stableCalendarOptionsData={calendarOptions:r,pluginHooks:i,dateEnv:l,viewSpecs:c,theme:d,toolbarConfig:u,localeDefaults:s,availableRawLocales:o.map}}processRawCalendarOptions(e,t){let{locales:n,locale:r}=mn([cn,e,t]),i=this.organizeRawLocales(n),s=i.map,o=this.buildLocale(r||i.defaultCode,s).options,a=this.buildPluginHooks(e.plugins||[],ca),l=this.currentCalendarOptionsRefiners=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},ln),dn),un),a.listenerRefiners),a.optionRefiners),c={},d=mn([cn,o,e,t]),u={},h=this.currentCalendarOptionsInput,f=this.currentCalendarOptionsRefined,g=!1;for(let e in d)-1===this.optionsForRefining.indexOf(e)&&(d[e]===h[e]||hn[e]&&e in h&&hn[e](h[e],d[e]))?u[e]=f[e]:l[e]?(u[e]=l[e](d[e]),g=!0):c[e]=h[e];return g&&(this.currentCalendarOptionsInput=d,this.currentCalendarOptionsRefined=u,this.stableOptionOverrides=e,this.stableDynamicOptionOverrides=t),this.optionsForHandling.push(...this.optionsForRefining),this.optionsForRefining=[],{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:a,availableLocaleData:i,localeDefaults:o,extra:c}}_computeCurrentViewData(e,t,n,r){let i=t.viewSpecs[e];if(!i)throw new Error(`viewType "${e}" is not available. Please make sure you've loaded all neccessary plugins`);let{refinedOptions:s,extra:o}=this.processRawViewOptions(i,t.pluginHooks,t.localeDefaults,n,r);return Aa(o),{viewSpec:i,options:s,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:i.optionDefaults.dateProfileGeneratorClass,duration:i.duration,durationUnit:i.durationUnit,usesMinMaxTime:i.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:s.slotMinTime,slotMaxTime:s.slotMaxTime,showNonCurrentDates:s.showNonCurrentDates,dayCount:s.dayCount,dateAlignment:s.dateAlignment,dateIncrement:s.dateIncrement,hiddenDays:s.hiddenDays,weekends:s.weekends,nowInput:s.now,validRangeInput:s.validRange,visibleRangeInput:s.visibleRange,fixedWeekCount:s.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}}processRawViewOptions(e,t,n,r,i){let s=mn([cn,e.optionDefaults,n,r,e.optionOverrides,i]),o=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},ln),dn),un),pn),t.listenerRefiners),t.optionRefiners),a={},l=this.currentViewOptionsInput,c=this.currentViewOptionsRefined,d=!1,u={};for(let e in s)s[e]===l[e]||hn[e]&&hn[e](s[e],l[e])?a[e]=c[e]:(s[e]===this.currentCalendarOptionsInput[e]||hn[e]&&hn[e](s[e],this.currentCalendarOptionsInput[e])?e in this.currentCalendarOptionsRefined&&(a[e]=this.currentCalendarOptionsRefined[e]):o[e]?a[e]=o[e](s[e]):u[e]=s[e],d=!0);return d&&(this.currentViewOptionsInput=s,this.currentViewOptionsRefined=a),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:u}}}function fa(e,t,n,r,i,s,o,a){let l=Oo(t||o.defaultCode,o.map);return new Hn({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:s.namedTimeZonedImpl,locale:l,weekNumberCalculation:n,firstDay:r,weekText:i,cmdFormatter:s.cmdFormatter,defaultSeparator:a})}function ga(e,t){return new(t.themeClasses[e.themeSystem]||jo)(e)}function pa(e){return new(e.dateProfileGeneratorClass||gr)(e)}function ma(e,t,n){return new aa(e,t,n)}function va(e){return An(e,e=>e.ui)}function ya(e,t,n){let r={"":t};for(let t in e){let i=e[t];i.sourceId&&n[i.sourceId]&&(r[t]=n[i.sourceId])}return r}function ba(e){let{options:t}=e;return{eventUiSingleBase:Nr({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:Nr({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function Ea(e,t){for(let n of t.pluginHooks.isLoadingFuncs)if(n(e))return!0;return!1}function Sa(e){return qr(e.options.businessHours,e)}function Aa(e,t){for(let n in e)console.warn(`Unknown option '${n}'`+(t?` for view '${t}'`:""))}class Da extends Gn{render(){return p("div",{className:"fc-toolbar-chunk"},...this.props.widgetGroups.map(e=>this.renderWidgetGroup(e)))}renderWidgetGroup(e){let{props:t}=this,{theme:n}=this.context,r=[],i=!0;for(let s of e){let{buttonName:e,buttonClick:o,buttonText:a,buttonIcon:l,buttonHint:c}=s;if("title"===e)i=!1,r.push(p("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{let i=e===t.activeButton,s=!t.isTodayEnabled&&"today"===e||!t.isPrevEnabled&&"prev"===e||!t.isNextEnabled&&"next"===e,d=[`fc-${e}-button`,n.getClass("button")];i&&d.push(n.getClass("buttonActive")),r.push(p("button",{type:"button",title:"function"==typeof c?c(t.navUnit):c,disabled:s,"aria-pressed":i,className:d.join(" "),onClick:o},a||(l?p("span",{className:l,role:"img"}):"")))}}if(r.length>1){return p("div",{className:i&&n.getClass("buttonGroup")||""},...r)}return r[0]}}class wa extends Gn{render(){let e,t,{model:n,extraClassName:r}=this.props,i=!1,s=n.sectionWidgets,o=s.center;return s.left?(i=!0,e=s.left):e=s.start,s.right?(i=!0,t=s.right):t=s.end,p("div",{className:[r||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",o||[]),this.renderSection("end",t||[]))}renderSection(e,t){let{props:n}=this;return p(Da,{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})}}class Ca extends Gn{constructor(){super(...arguments),this.state={availableWidth:null},this.handleEl=e=>{this.el=e,Qn(this.props.elRef,e),this.updateAvailableWidth()},this.handleResize=()=>{this.updateAvailableWidth()}}render(){let{props:e,state:t}=this,{aspectRatio:n}=e,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],i="",s="";return n?null!==t.availableWidth?i=t.availableWidth/n:s=1/n*100+"%":i=e.height||"",p("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:i,paddingBottom:s}},e.children)}componentDidMount(){this.context.addResizeHandler(this.handleResize)}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}updateAvailableWidth(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})}}class Ra extends Mi{constructor(e){super(e),this.handleSegClick=(e,t)=>{let{component:n}=this,{context:r}=n,i=ai(t);if(i&&n.isValidSegDownEl(e.target)){let s=Oe(e.target,".fc-event-forced-url"),o=s?s.querySelector("a[href]").href:"";r.emitter.trigger("eventClick",{el:t,event:new ti(n.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:r.viewApi}),o&&!e.defaultPrevented&&(window.location.href=o)}},this.destroy=Fe(e.el,"click",".fc-event",this.handleSegClick)}}class xa extends Mi{constructor(e){super(e),this.handleEventElRemove=e=>{e===this.currentSegEl&&this.handleSegLeave(null,this.currentSegEl)},this.handleSegEnter=(e,t)=>{ai(t)&&(this.currentSegEl=t,this.triggerEvent("eventMouseEnter",e,t))},this.handleSegLeave=(e,t)=>{this.currentSegEl&&(this.currentSegEl=null,this.triggerEvent("eventMouseLeave",e,t))},this.removeHoverListeners=function(e,t,n,r){let i;return Fe(e,"mouseover",t,(e,t)=>{if(t!==i){i=t,n(e,t);let s=e=>{i=null,r(e,t),t.removeEventListener("mouseleave",s)};t.addEventListener("mouseleave",s)}})}(e.el,".fc-event",this.handleSegEnter,this.handleSegLeave)}destroy(){this.removeHoverListeners()}triggerEvent(e,t,n){let{component:r}=this,{context:i}=r,s=ai(n);t&&!r.isValidSegDownEl(t.target)||i.emitter.trigger(e,{el:n,event:new ti(i,s.eventRange.def,s.eventRange.instance),jsEvent:t,view:i.viewApi})}}class _a extends Vn{constructor(){super(...arguments),this.buildViewContext=Gt(Fn),this.buildViewPropTransformers=Gt(ka),this.buildToolbarProps=Gt(Ta),this.headerRef={current:null},this.footerRef={current:null},this.interactionsStore={},this.state={viewLabelId:We()},this.registerInteractiveComponent=(e,t)=>{let n=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}(e,t),r=[Ra,xa].concat(this.props.pluginHooks.componentInteractions).map(e=>new e(n));this.interactionsStore[e.uid]=r,Oi[e.uid]=n},this.unregisterInteractiveComponent=e=>{let t=this.interactionsStore[e.uid];if(t){for(let e of t)e.destroy();delete this.interactionsStore[e.uid]}delete Oi[e.uid]},this.resizeRunner=new Me(()=>{this.props.emitter.trigger("_resize",!0),this.props.emitter.trigger("windowResize",{view:this.props.viewApi})}),this.handleWindowResize=e=>{let{options:t}=this.props;t.handleWindowResize&&e.target===window&&this.resizeRunner.request(t.windowResizeDelay)}}render(){let e,{props:t}=this,{toolbarConfig:n,options:r}=t,i=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,fr(t.options.now,t.dateEnv),t.viewTitle),s=!1,o="";t.isHeightAuto||t.forPrint?o="":null!=r.height?s=!0:null!=r.contentHeight?o=r.contentHeight:e=Math.max(r.aspectRatio,.5);let a=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),l=n.header&&n.header.hasTitle?this.state.viewLabelId:"";return p(Ln.Provider,{value:a},n.header&&p(wa,Object.assign({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:l},i)),p(Ca,{liquid:s,height:o,aspectRatio:e,labeledById:l},this.renderView(t),this.buildAppendContent()),n.footer&&p(wa,Object.assign({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},i)))}componentDidMount(){let{props:e}=this;this.calendarInteractions=e.pluginHooks.calendarInteractions.map(t=>new t(e)),window.addEventListener("resize",this.handleWindowResize);let{propSetHandlers:t}=e.pluginHooks;for(let n in t)t[n](e[n],e)}componentDidUpdate(e){let{props:t}=this,{propSetHandlers:n}=t.pluginHooks;for(let r in n)t[r]!==e[r]&&n[r](t[r],t)}componentWillUnmount(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(let e of this.calendarInteractions)e.destroy();this.props.emitter.trigger("_unmount")}buildAppendContent(){let{props:e}=this;return p(y,{},...e.pluginHooks.viewContainerAppends.map(t=>t(e)))}renderView(e){let{pluginHooks:t}=e,{viewSpec:n}=e,r={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},i=this.buildViewPropTransformers(t.viewPropsTransformers);for(let t of i)Object.assign(r,t.transform(r,e));return p(n.component,Object.assign({},r))}}function Ta(e,t,n,r,i,s){let o=n.build(i,void 0,!1),a=n.buildPrev(t,r,!1),l=n.buildNext(t,r,!1);return{title:s,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:o.isValid&&!lr(t.currentRange,i),isPrevEnabled:a.isValid,isNextEnabled:l.isValid}}function ka(e){return e.map(e=>new e)}function Ma(e){let t=Oo(e.locale||"en",Io([]).map);return new Hn(Object.assign(Object.assign({timeZone:cn.timeZone,calendarSystem:"gregory"},e),{locale:t}))}vs.touchMouseIgnoreWait=500;let Ia=0,Oa=0,Na=!1;class Pa{constructor(e){this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=e=>{if(!this.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&this.tryStart(e)){let t=this.createEventFromMouse(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t),this.shouldIgnoreMove||document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}},this.handleMouseMove=e=>{let t=this.createEventFromMouse(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleMouseUp=e=>{document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.emitter.trigger("pointerup",this.createEventFromMouse(e)),this.cleanup()},this.handleTouchStart=e=>{if(this.tryStart(e)){this.isTouchDragging=!0;let t=this.createEventFromTouch(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t);let n=e.target;this.shouldIgnoreMove||n.addEventListener("touchmove",this.handleTouchMove),n.addEventListener("touchend",this.handleTouchEnd),n.addEventListener("touchcancel",this.handleTouchEnd),window.addEventListener("scroll",this.handleTouchScroll,!0)}},this.handleTouchMove=e=>{let t=this.createEventFromTouch(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleTouchEnd=e=>{if(this.isDragging){let t=e.target;t.removeEventListener("touchmove",this.handleTouchMove),t.removeEventListener("touchend",this.handleTouchEnd),t.removeEventListener("touchcancel",this.handleTouchEnd),window.removeEventListener("scroll",this.handleTouchScroll,!0),this.emitter.trigger("pointerup",this.createEventFromTouch(e)),this.cleanup(),this.isTouchDragging=!1,Ia+=1,setTimeout(()=>{Ia-=1},vs.touchMouseIgnoreWait)}},this.handleTouchScroll=()=>{this.wasTouchScroll=!0},this.handleScroll=e=>{if(!this.shouldIgnoreMove){let t=window.pageXOffset-this.prevScrollX+this.prevPageX,n=window.pageYOffset-this.prevScrollY+this.prevPageY;this.emitter.trigger("pointermove",{origEvent:e,isTouch:this.isTouchDragging,subjectEl:this.subjectEl,pageX:t,pageY:n,deltaX:t-this.origPageX,deltaY:n-this.origPageY})}},this.containerEl=e,this.emitter=new Gr,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),Oa+=1,1===Oa&&window.addEventListener("touchmove",Ha,{passive:!1})}destroy(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),Oa-=1,Oa||window.removeEventListener("touchmove",Ha,{passive:!1})}tryStart(e){let t=this.querySubjectEl(e),n=e.target;return!(!t||this.handleSelector&&!Oe(n,this.handleSelector))&&(this.subjectEl=t,this.isDragging=!0,this.wasTouchScroll=!1,!0)}cleanup(){Na=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()}querySubjectEl(e){return this.selector?Oe(e.target,this.selector):this.containerEl}shouldIgnoreMouse(){return Ia||this.isTouchDragging}cancelTouchScroll(){this.isDragging&&(Na=!0)}initScrollWatch(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))}recordCoords(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)}destroyScrollWatch(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)}createEventFromMouse(e,t){let n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}}createEventFromTouch(e,t){let n,r,i=e.touches,s=0,o=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(s=n-this.origPageX,o=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:s,deltaY:o}}}function Ha(e){Na&&e.preventDefault()}class Ba{constructor(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}start(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()}handleMove(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()}setIsVisible(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)}stop(e,t){let n=()=>{this.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(n,this.revertDuration):setTimeout(n,0)}doRevertAnimation(e,t){let n=this.mirrorEl,r=this.sourceEl.getBoundingClientRect();n.style.transition="top "+t+"ms,left "+t+"ms",Be(n,{left:r.left,top:r.top}),Ge(n,()=>{n.style.transition="",e()})}cleanup(){this.mirrorEl&&(Ie(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null}updateElPosition(){this.sourceEl&&this.isVisible&&Be(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})}getMirrorEl(){let e=this.sourceElRect,t=this.mirrorEl;return t||(t=this.mirrorEl=this.sourceEl.cloneNode(!0),t.style.userSelect="none",t.style.webkitUserSelect="none",t.classList.add("fc-event-dragging"),Be(t,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(t)),t}}class ja extends ss{constructor(e,t){super(),this.handleScroll=()=>{this.scrollTop=this.scrollController.getScrollTop(),this.scrollLeft=this.scrollController.getScrollLeft(),this.handleScrollChange()},this.scrollController=e,this.doesListening=t,this.scrollTop=this.origScrollTop=e.getScrollTop(),this.scrollLeft=this.origScrollLeft=e.getScrollLeft(),this.scrollWidth=e.getScrollWidth(),this.scrollHeight=e.getScrollHeight(),this.clientWidth=e.getClientWidth(),this.clientHeight=e.getClientHeight(),this.clientRect=this.computeClientRect(),this.doesListening&&this.getEventTarget().addEventListener("scroll",this.handleScroll)}destroy(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}setScrollTop(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())}setScrollLeft(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())}getClientWidth(){return this.clientWidth}getClientHeight(){return this.clientHeight}getScrollWidth(){return this.scrollWidth}getScrollHeight(){return this.scrollHeight}handleScrollChange(){}}class za extends ja{constructor(e,t){super(new os(e),t)}getEventTarget(){return this.scrollController.el}computeClientRect(){return es(this.scrollController.el)}}class Ua extends ja{constructor(e){super(new as,e)}getEventTarget(){return window}computeClientRect(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}}handleScrollChange(){this.clientRect=this.computeClientRect()}}const Wa="function"==typeof performance?performance.now:Date.now;class La{constructor(){this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=()=>{if(this.isAnimating){let e=this.computeBestEdge(this.pointerScreenX+window.pageXOffset,this.pointerScreenY+window.pageYOffset);if(e){let t=Wa();this.handleSide(e,(t-this.msSinceRequest)/1e3),this.requestAnimation(t)}else this.isAnimating=!1}}}start(e,t,n){this.isEnabled&&(this.scrollCaches=this.buildCaches(n),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))}handleMove(e,t){if(this.isEnabled){let n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,s=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),s<0?this.everMovedLeft=!0:s>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Wa()))}}stop(){if(this.isEnabled){this.isAnimating=!1;for(let e of this.scrollCaches)e.destroy();this.scrollCaches=null}}requestAnimation(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)}handleSide(e,t){let{scrollCache:n}=e,{edgeThreshold:r}=this,i=r-e.distance,s=i*i/(r*r)*this.maxVelocity*t,o=1;switch(e.name){case"left":o=-1;case"right":n.setScrollLeft(n.getScrollLeft()+s*o);break;case"top":o=-1;case"bottom":n.setScrollTop(n.getScrollTop()+s*o)}}computeBestEdge(e,t){let{edgeThreshold:n}=this,r=null,i=this.scrollCaches||[];for(let s of i){let i=s.clientRect,o=e-i.left,a=i.right-e,l=t-i.top,c=i.bottom-t;o>=0&&a>=0&&l>=0&&c>=0&&(l<=n&&this.everMovedUp&&s.canScrollUp()&&(!r||r.distance>l)&&(r={scrollCache:s,name:"top",distance:l}),c<=n&&this.everMovedDown&&s.canScrollDown()&&(!r||r.distance>c)&&(r={scrollCache:s,name:"bottom",distance:c}),o<=n&&this.everMovedLeft&&s.canScrollLeft()&&(!r||r.distance>o)&&(r={scrollCache:s,name:"left",distance:o}),a<=n&&this.everMovedRight&&s.canScrollRight()&&(!r||r.distance>a)&&(r={scrollCache:s,name:"right",distance:a}))}return r}buildCaches(e){return this.queryScrollEls(e).map(e=>e===window?new Ua(!1):new za(e,!1))}queryScrollEls(e){let t=[];for(let n of this.scrollQuery)"object"==typeof n?t.push(n):t.push(...Array.prototype.slice.call(e.getRootNode().querySelectorAll(n)));return t}}class Fa extends ms{constructor(e,t){super(e),this.containerEl=e,this.delay=null,this.minDistance=0,this.touchScrollAllowed=!0,this.mirrorNeedsRevert=!1,this.isInteracting=!1,this.isDragging=!1,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.delayTimeoutId=null,this.onPointerDown=e=>{this.isDragging||(this.isInteracting=!0,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,Je(document.body),et(document.body),e.isTouch||e.origEvent.preventDefault(),this.emitter.trigger("pointerdown",e),this.isInteracting&&!this.pointer.shouldIgnoreMove&&(this.mirror.setIsVisible(!1),this.mirror.start(e.subjectEl,e.pageX,e.pageY),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e)))},this.onPointerMove=e=>{if(this.isInteracting){if(this.emitter.trigger("pointermove",e),!this.isDistanceSurpassed){let t,n=this.minDistance,{deltaX:r,deltaY:i}=e;t=r*r+i*i,t>=n*n&&this.handleDistanceSurpassed(e)}this.isDragging&&("scroll"!==e.origEvent.type&&(this.mirror.handleMove(e.pageX,e.pageY),this.autoScroller.handleMove(e.pageX,e.pageY)),this.emitter.trigger("dragmove",e))}},this.onPointerUp=e=>{this.isInteracting&&(this.isInteracting=!1,Ke(document.body),tt(document.body),this.emitter.trigger("pointerup",e),this.isDragging&&(this.autoScroller.stop(),this.tryStopDrag(e)),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null))};let n=this.pointer=new Pa(e);n.emitter.on("pointerdown",this.onPointerDown),n.emitter.on("pointermove",this.onPointerMove),n.emitter.on("pointerup",this.onPointerUp),t&&(n.selector=t),this.mirror=new Ba,this.autoScroller=new La}destroy(){this.pointer.destroy(),this.onPointerUp({})}startDelay(e){"number"==typeof this.delay?this.delayTimeoutId=setTimeout(()=>{this.delayTimeoutId=null,this.handleDelayEnd(e)},this.delay):this.handleDelayEnd(e)}handleDelayEnd(e){this.isDelayEnded=!0,this.tryStartDrag(e)}handleDistanceSurpassed(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)}tryStartDrag(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()))}tryStopDrag(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))}stopDrag(e){this.isDragging=!1,this.emitter.trigger("dragend",e)}setIgnoreMove(e){this.pointer.shouldIgnoreMove=e}setMirrorIsVisible(e){this.mirror.setIsVisible(e)}setMirrorNeedsRevert(e){this.mirrorNeedsRevert=e}setAutoScrollEnabled(e){this.autoScroller.isEnabled=e}}class Va{constructor(e){this.origRect=ts(e),this.scrollCaches=ns(e).map(e=>new za(e,!0))}destroy(){for(let e of this.scrollCaches)e.destroy()}computeLeft(){let e=this.origRect.left;for(let t of this.scrollCaches)e+=t.origScrollLeft-t.getScrollLeft();return e}computeTop(){let e=this.origRect.top;for(let t of this.scrollCaches)e+=t.origScrollTop-t.getScrollTop();return e}isWithinClipping(e,t){let n={left:e,top:t};for(let e of this.scrollCaches)if(!Ga(e.getEventTarget())&&!Pi(n,e.clientRect))return!1;return!0}}function Ga(e){let t=e.tagName;return"HTML"===t||"BODY"===t}class Qa{constructor(e,t){this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=e=>{let{dragging:t}=this;this.initialHit=null,this.movingHit=null,this.finalHit=null,this.prepareHits(),this.processFirstCoord(e),this.initialHit||!this.requireInitial?(t.setIgnoreMove(!1),this.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=e=>{this.emitter.trigger("dragstart",e),this.handleMove(e,!0)},this.handleDragMove=e=>{this.emitter.trigger("dragmove",e),this.handleMove(e)},this.handlePointerUp=e=>{this.releaseHits(),this.emitter.trigger("pointerup",e)},this.handleDragEnd=e=>{this.movingHit&&this.emitter.trigger("hitupdate",null,!0,e),this.finalHit=this.movingHit,this.movingHit=null,this.emitter.trigger("dragend",e)},this.droppableStore=t,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new Gr}processFirstCoord(e){let t,n={left:e.pageX,top:e.pageY},r=n,i=e.subjectEl;i instanceof HTMLElement&&(t=ts(i),r=Bi(r,t));let s=this.initialHit=this.queryHitForOffset(r.left,r.top);if(s){if(this.useSubjectCenter&&t){let e=Hi(t,s.rect);e&&(r=ji(e))}this.coordAdjust=zi(r,n)}else this.coordAdjust={left:0,top:0}}handleMove(e,t){let n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&qa(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))}prepareHits(){this.offsetTrackers=An(this.droppableStore,e=>(e.component.prepareHits(),new Va(e.el)))}releaseHits(){let{offsetTrackers:e}=this;for(let t in e)e[t].destroy();this.offsetTrackers={}}queryHitForOffset(e,t){let{droppableStore:n,offsetTrackers:r}=this,i=null;for(let s in n){let o=n[s].component,a=r[s];if(a&&a.isWithinClipping(e,t)){let n=a.computeLeft(),r=a.computeTop(),l=e-n,c=t-r,{origRect:d}=a,u=d.right-d.left,h=d.bottom-d.top;if(l>=0&&l=0&&ci.layer)&&(e.componentId=s,e.context=o.context,e.rect.left+=n,e.rect.right+=n,e.rect.top+=r,e.rect.bottom+=r,i=e)}}}return i}}function qa(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&Ai(e.dateSpan,t.dateSpan)}function Ya(e,t){let n={};for(let r of t.pluginHooks.datePointTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,{date:(i=t.dateEnv).toDate(r.range.start),dateStr:i.formatIso(r.range.start,{omitTime:r.allDay}),allDay:r.allDay})),n}class Za extends Mi{constructor(e){super(e),this.subjectEl=null,this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let t=e.origEvent.target,{component:n,dragging:r}=this,{mirror:i}=r,{options:s}=n.context,o=n.context;this.subjectEl=e.subjectEl;let a=this.subjectSeg=ai(e.subjectEl),l=(this.eventRange=a.eventRange).instance.instanceId;this.relevantEvents=xr(o.getCurrentData().eventStore,l),r.minDistance=e.isTouch?0:s.eventDragMinDistance,r.delay=e.isTouch&&l!==n.props.eventSelection?function(e){let{options:t}=e.context,n=t.eventLongPressDelay;null==n&&(n=t.longPressDelay);return n}(n):null,s.fixedMirrorParent?i.parentNode=s.fixedMirrorParent:i.parentNode=Oe(t,".fc"),i.revertDuration=s.dragRevertDuration;let c=n.isValidSegDownEl(t)&&!Oe(t,".fc-event-resizer");r.setIgnoreMove(!c),this.isDragging=c&&e.subjectEl.classList.contains("fc-event-draggable")},this.handleDragStart=e=>{let t=this.component.context,n=this.eventRange,r=n.instance.instanceId;e.isTouch?r!==this.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"}),this.isDragging&&(t.calendarApi.unselect(e),t.emitter.trigger("eventDragStart",{el:this.subjectEl,event:new ti(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi}))},this.handleHitUpdate=(e,t)=>{if(!this.isDragging)return;let n=this.relevantEvents,r=this.hitDragging.initialHit,i=this.component.context,s=null,o=null,a=null,l=!1,c={affectedEvents:n,mutatedEvents:{defs:{},instances:{}},isEvent:!0};if(e){s=e.context;let t=s.options;i===s||t.editable&&t.droppable?(o=function(e,t,n){let r=e.dateSpan,i=t.dateSpan,s=r.range.start,o=i.range.start,a={};r.allDay!==i.allDay&&(a.allDay=i.allDay,a.hasEnd=t.context.options.allDayMaintainDuration,i.allDay&&(s=Mt(s)));let l=hr(s,o,e.context.dateEnv,e.componentId===t.componentId?e.largeUnit:null);l.milliseconds&&(a.allDay=!1);let c={datesDelta:l,standardProps:a};for(let r of n)r(c,e,t);return c}(r,e,s.getCurrentData().pluginHooks.eventDragMutationMassagers),o&&(a=$r(n,s.getCurrentData().eventUiBases,o,s),c.mutatedEvents=a,Ns(c,e.dateProfile,s)||(l=!0,o=null,a=null,c.mutatedEvents={defs:{},instances:{}}))):s=null}this.displayDrag(s,c),l?Xe():$e(),t||(i===s&&qa(r,e)&&(o=null),this.dragging.setMirrorNeedsRevert(!o),this.dragging.setMirrorIsVisible(!e||!this.subjectEl.getRootNode().querySelector(".fc-event-mirror")),this.receivingContext=s,this.validMutation=o,this.mutatedRelevantEvents=a)},this.handlePointerUp=()=>{this.isDragging||this.cleanup()},this.handleDragEnd=e=>{if(this.isDragging){let t=this.component.context,n=t.viewApi,{receivingContext:r,validMutation:i}=this,s=this.eventRange.def,o=this.eventRange.instance,a=new ti(t,s,o),l=this.relevantEvents,c=this.mutatedRelevantEvents,{finalHit:d}=this.hitDragging;if(this.clearDrag(),t.emitter.trigger("eventDragStop",{el:this.subjectEl,event:a,jsEvent:e.origEvent,view:n}),i){if(r===t){let r=new ti(t,c.defs[s.defId],o?c.instances[o.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:c});let d={oldEvent:a,event:r,relatedEvents:ri(c,t,o),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:l})}},u={};for(let e of t.getCurrentData().pluginHooks.eventDropTransformers)Object.assign(u,e(i,t));t.emitter.trigger("eventDrop",Object.assign(Object.assign(Object.assign({},d),u),{el:e.subjectEl,delta:i.datesDelta,jsEvent:e.origEvent,view:n})),t.emitter.trigger("eventChange",d)}else if(r){let i={event:a,relatedEvents:ri(l,t,o),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:l})}};t.emitter.trigger("eventLeave",Object.assign(Object.assign({},i),{draggedEl:e.subjectEl,view:n})),t.dispatch({type:"REMOVE_EVENTS",eventStore:l}),t.emitter.trigger("eventRemove",i);let u=c.defs[s.defId],h=c.instances[o.instanceId],f=new ti(r,u,h);r.dispatch({type:"MERGE_EVENTS",eventStore:c});let g={event:f,relatedEvents:ri(c,r,h),revert(){r.dispatch({type:"REMOVE_EVENTS",eventStore:c})}};r.emitter.trigger("eventAdd",g),e.isTouch&&r.dispatch({type:"SELECT_EVENT",eventInstanceId:o.instanceId}),r.emitter.trigger("drop",Object.assign(Object.assign({},Ya(d.dateSpan,r)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:d.context.viewApi})),r.emitter.trigger("eventReceive",Object.assign(Object.assign({},g),{draggedEl:e.subjectEl,view:d.context.viewApi}))}}else t.emitter.trigger("_noEventDrop")}this.cleanup()};let{component:t}=this,{options:n}=t.context,r=this.dragging=new Fa(e.el);r.pointer.selector=Za.SELECTOR,r.touchScrollAllowed=!1,r.autoScroller.isEnabled=n.dragScroll;let i=this.hitDragging=new Qa(this.dragging,Oi);i.useSubjectCenter=e.useEventCenter,i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),i.emitter.on("hitupdate",this.handleHitUpdate),i.emitter.on("pointerup",this.handlePointerUp),i.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}displayDrag(e,t){let n=this.component.context,r=this.receivingContext;r&&r!==e&&(r===n?r.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:t.affectedEvents,mutatedEvents:{defs:{},instances:{}},isEvent:!0}}):r.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){let e=this.component.context,{receivingContext:t}=this;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})}cleanup(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null}}Za.SELECTOR=".fc-event-draggable, .fc-event-resizable";const Xa={fixedMirrorParent:yn},$a={dateClick:yn,eventDragStart:yn,eventDragStop:yn,eventDrop:yn,eventResizeStart:yn,eventResizeStop:yn,eventResize:yn,drop:yn,eventReceive:yn,eventLeave:yn};class Ja{constructor(e,t){this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=e=>{this.dragMeta=this.buildDragMeta(e.subjectEl)},this.handleHitUpdate=(e,t,n)=>{let{dragging:r}=this.hitDragging,i=null,s=null,o=!1,a={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:this.dragMeta.create};e&&(i=e.context,this.canDropElOnCalendar(n.subjectEl,i)&&(s=function(e,t,n){let r=Object.assign({},t.leftoverProps);for(let i of n.pluginHooks.externalDefTransforms)Object.assign(r,i(e,t));let{refined:i,extra:s}=Ar(r,n),o=wr(i,s,t.sourceId,e.allDay,n.options.forceEventDuration||Boolean(t.duration),n),a=e.range.start;e.allDay&&t.startTime&&(a=n.dateEnv.add(a,t.startTime));let l=t.duration?n.dateEnv.add(a,t.duration):Xr(e.allDay,a,n),c=pr(o.defId,{start:a,end:l});return{def:o,instance:c}}(e.dateSpan,this.dragMeta,i),a.mutatedEvents=Rr(s),o=!Ns(a,e.dateProfile,i),o&&(a.mutatedEvents={defs:{},instances:{}},s=null))),this.displayDrag(i,a),r.setMirrorIsVisible(t||!s||!document.querySelector(".fc-event-mirror")),o?Xe():$e(),t||(r.setMirrorNeedsRevert(!s),this.receivingContext=i,this.droppableEvent=s)},this.handleDragEnd=e=>{let{receivingContext:t,droppableEvent:n}=this;if(this.clearDrag(),t&&n){let r=this.hitDragging.finalHit,i=r.context.viewApi,s=this.dragMeta;if(t.emitter.trigger("drop",Object.assign(Object.assign({},Ya(r.dateSpan,t)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:i})),s.create){let r=Rr(n);t.dispatch({type:"MERGE_EVENTS",eventStore:r}),e.isTouch&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:n.instance.instanceId}),t.emitter.trigger("eventReceive",{event:new ti(t,n.def,n.instance),relatedEvents:[],revert(){t.dispatch({type:"REMOVE_EVENTS",eventStore:r})},draggedEl:e.subjectEl,view:i})}}this.receivingContext=null,this.droppableEvent=null};let n=this.hitDragging=new Qa(e,Oi);n.requireInitial=!1,n.emitter.on("dragstart",this.handleDragStart),n.emitter.on("hitupdate",this.handleHitUpdate),n.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=t}buildDragMeta(e){return"object"==typeof this.suppliedDragMeta?bs(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?bs(this.suppliedDragMeta(e)):function(e){let t=function(e,t){let n=vs.dataAttrPrefix,r=(n?n+"-":"")+t;return e.getAttribute("data-"+r)||""}(e,"event");return bs(t?JSON.parse(t):{create:!1})}(e)}displayDrag(e,t){let n=this.receivingContext;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})}canDropElOnCalendar(e,t){let n=t.options.dropAccept;return"function"==typeof n?n.call(t.calendarApi,e):"string"!=typeof n||!n||Boolean(Ne(e,n))}}vs.dataAttrPrefix="";class Ka extends ms{constructor(e){super(e),this.shouldIgnoreMove=!1,this.mirrorSelector="",this.currentMirrorEl=null,this.handlePointerDown=e=>{this.emitter.trigger("pointerdown",e),this.shouldIgnoreMove||this.emitter.trigger("dragstart",e)},this.handlePointerMove=e=>{this.shouldIgnoreMove||this.emitter.trigger("dragmove",e)},this.handlePointerUp=e=>{this.emitter.trigger("pointerup",e),this.shouldIgnoreMove||this.emitter.trigger("dragend",e)};let t=this.pointer=new Pa(e);t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("pointermove",this.handlePointerMove),t.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.pointer.destroy()}setIgnoreMove(e){this.shouldIgnoreMove=e}setMirrorIsVisible(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{let e=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;e&&(this.currentMirrorEl=e,e.style.visibility="hidden")}}}var el=Po({name:"@fullcalendar/interaction",componentInteractions:[class extends Mi{constructor(e){super(e),this.handlePointerDown=e=>{let{dragging:t}=this,n=e.origEvent.target;t.setIgnoreMove(!this.component.isValidDateDownEl(n))},this.handleDragEnd=e=>{let{component:t}=this,{pointer:n}=this.dragging;if(!n.wasTouchScroll){let{initialHit:n,finalHit:r}=this.hitDragging;if(n&&r&&qa(n,r)){let{context:r}=t,i=Object.assign(Object.assign({},Ya(n.dateSpan,r)),{dayEl:n.dayEl,jsEvent:e.origEvent,view:r.viewApi||r.calendarApi.view});r.emitter.trigger("dateClick",i)}}},this.dragging=new Fa(e.el),this.dragging.autoScroller.isEnabled=!1;let t=this.hitDragging=new Qa(this.dragging,Ii(e));t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}},class extends Mi{constructor(e){super(e),this.dragSelection=null,this.handlePointerDown=e=>{let{component:t,dragging:n}=this,{options:r}=t.context,i=r.selectable&&t.isValidDateDownEl(e.origEvent.target);n.setIgnoreMove(!i),n.delay=e.isTouch?function(e){let{options:t}=e.context,n=t.selectLongPressDelay;null==n&&(n=t.longPressDelay);return n}(t):null},this.handleDragStart=e=>{this.component.context.calendarApi.unselect(e)},this.handleHitUpdate=(e,t)=>{let{context:n}=this.component,r=null,i=!1;if(e){let t=this.hitDragging.initialHit;e.componentId===t.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(t,e)||(r=function(e,t,n){let r=e.dateSpan,i=t.dateSpan,s=[r.range.start,r.range.end,i.range.start,i.range.end];s.sort(lt);let o={};for(let r of n){let n=r(e,t);if(!1===n)return null;n&&Object.assign(o,n)}return o.range={start:s[0],end:s[3]},o.allDay=r.allDay,o}(t,e,n.pluginHooks.dateSelectionTransformers)),r&&Ps(r,e.dateProfile,n)||(i=!0,r=null)}r?n.dispatch({type:"SELECT_DATES",selection:r}):t||n.dispatch({type:"UNSELECT_DATES"}),i?Xe():$e(),t||(this.dragSelection=r)},this.handlePointerUp=e=>{this.dragSelection&&(Yr(this.dragSelection,e,this.component.context),this.dragSelection=null)};let{component:t}=e,{options:n}=t.context,r=this.dragging=new Fa(e.el);r.touchScrollAllowed=!1,r.minDistance=n.selectMinDistance||0,r.autoScroller.isEnabled=n.dragScroll;let i=this.hitDragging=new Qa(this.dragging,Ii(e));i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),i.emitter.on("hitupdate",this.handleHitUpdate),i.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.dragging.destroy()}},Za,class extends Mi{constructor(e){super(e),this.draggingSegEl=null,this.draggingSeg=null,this.eventRange=null,this.relevantEvents=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let{component:t}=this,n=ai(this.querySegEl(e)),r=this.eventRange=n.eventRange;this.dragging.minDistance=t.context.options.eventDragMinDistance,this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&this.component.props.eventSelection!==r.instance.instanceId)},this.handleDragStart=e=>{let{context:t}=this.component,n=this.eventRange;this.relevantEvents=xr(t.getCurrentData().eventStore,this.eventRange.instance.instanceId);let r=this.querySegEl(e);this.draggingSegEl=r,this.draggingSeg=ai(r),t.calendarApi.unselect(),t.emitter.trigger("eventResizeStart",{el:r,event:new ti(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi})},this.handleHitUpdate=(e,t,n)=>{let{context:r}=this.component,i=this.relevantEvents,s=this.hitDragging.initialHit,o=this.eventRange.instance,a=null,l=null,c=!1,d={affectedEvents:i,mutatedEvents:{defs:{},instances:{}},isEvent:!0};if(e){e.componentId===s.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(s,e)||(a=function(e,t,n,r){let i=e.context.dateEnv,s=e.dateSpan.range.start,o=t.dateSpan.range.start,a=hr(s,o,i,e.largeUnit);if(n){if(i.add(r.start,a)r.start)return{endDelta:a};return null}(s,e,n.subjectEl.classList.contains("fc-event-resizer-start"),o.range))}a&&(l=$r(i,r.getCurrentData().eventUiBases,a,r),d.mutatedEvents=l,Ns(d,e.dateProfile,r)||(c=!0,a=null,l=null,d.mutatedEvents=null)),l?r.dispatch({type:"SET_EVENT_RESIZE",state:d}):r.dispatch({type:"UNSET_EVENT_RESIZE"}),c?Xe():$e(),t||(a&&qa(s,e)&&(a=null),this.validMutation=a,this.mutatedRelevantEvents=l)},this.handleDragEnd=e=>{let{context:t}=this.component,n=this.eventRange.def,r=this.eventRange.instance,i=new ti(t,n,r),s=this.relevantEvents,o=this.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:this.draggingSegEl,event:i,jsEvent:e.origEvent,view:t.viewApi}),this.validMutation){let a=new ti(t,o.defs[n.defId],r?o.instances[r.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:o});let l={oldEvent:i,event:a,relatedEvents:ri(o,t,r),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",Object.assign(Object.assign({},l),{el:this.draggingSegEl,startDelta:this.validMutation.startDelta||ft(0),endDelta:this.validMutation.endDelta||ft(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",l)}else t.emitter.trigger("_noEventResize");this.draggingSeg=null,this.relevantEvents=null,this.validMutation=null};let{component:t}=e,n=this.dragging=new Fa(e.el);n.pointer.selector=".fc-event-resizer",n.touchScrollAllowed=!1,n.autoScroller.isEnabled=t.context.options.dragScroll;let r=this.hitDragging=new Qa(this.dragging,Ii(e));r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}querySegEl(e){return Oe(e.subjectEl,".fc-event")}}],calendarInteractions:[class{constructor(e){this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=e=>{e.jsEvent&&(this.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=e=>{let t=this.context.options.unselectCancel,n=ze(e.origEvent);this.matchesCancel=!!Oe(n,t),this.matchesEvent=!!Oe(n,Za.SELECTOR)},this.onDocumentPointerUp=e=>{let{context:t}=this,{documentPointer:n}=this,r=t.getCurrentData();if(!n.wasTouchScroll){if(r.dateSelection&&!this.isRecentPointerDateSelect){let n=t.options.unselectAuto;!n||n&&this.matchesCancel||t.calendarApi.unselect(e)}r.eventSelection&&!this.matchesEvent&&t.dispatch({type:"UNSELECT_EVENT"})}this.isRecentPointerDateSelect=!1};let t=this.documentPointer=new Pa(document);t.shouldIgnoreMove=!0,t.shouldWatchScroll=!1,t.emitter.on("pointerdown",this.onDocumentPointerDown),t.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}destroy(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()}}],elementDraggingImpl:Fa,optionRefiners:Xa,listenerRefiners:$a});class tl extends ls{constructor(){super(...arguments),this.headerElRef={current:null}}renderSimpleLayout(e,t){let{props:n,context:r}=this,i=[],s=no(r.options);return e&&i.push({type:"header",key:"header",isSticky:s,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),i.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),p(er,{elClasses:["fc-daygrid"],viewSpec:r.viewSpec},p(io,{liquid:!n.isHeightAuto&&!n.forPrint,collapsibleWidth:n.forPrint,cols:[],sections:i}))}renderHScrollLayout(e,t,n,r){let i=this.context.pluginHooks.scrollGridImpl;if(!i)throw new Error("No ScrollGrid implementation");let{props:s,context:o}=this,a=!s.forPrint&&no(o.options),l=!s.forPrint&&ro(o.options),c=[];return e&&c.push({type:"header",key:"header",isSticky:a,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),c.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),l&&c.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:to}]}),p(er,{elClasses:["fc-daygrid"],viewSpec:o.viewSpec},p(i,{liquid:!s.isHeightAuto&&!s.forPrint,forPrint:s.forPrint,collapsibleWidth:s.forPrint,colGroups:[{cols:[{span:n,minWidth:r}]}],sections:c}))}}function nl(e,t){let n=[];for(let e=0;e{let n=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return p(y,null,t.map(t=>{let r=t.eventRange.instance.instanceId;return p("div",{className:"fc-daygrid-event-harness",key:r,style:{visibility:n[r]?"hidden":""}},ol(t)?p(ll,Object.assign({seg:t,isDragging:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},mi(t,e.todayRange))):p(al,Object.assign({seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},mi(t,e.todayRange))))}))}})}}function ul(e){let t=[],n=[];for(let r of e)t.push(r.seg),r.isVisible||n.push(r.seg);return{allSegs:t,invisibleSegs:n}}const hl=an({week:"narrow"});class fl extends ls{constructor(){super(...arguments),this.rootElRef={current:null},this.state={dayNumberId:We()},this.handleRootEl=e=>{Qn(this.rootElRef,e),Qn(this.props.elRef,e)}}render(){let{context:e,props:t,state:n,rootElRef:r}=this,{options:i,dateEnv:s}=e,{date:o,dateProfile:a}=t;const l=t.showDayNumber&&function(e,t,n){const{start:r,end:i}=t,s=Ct(i,-1),o=n.getYear(r),a=n.getMonth(r),l=n.getYear(s),c=n.getMonth(s);return!(o===l&&a===c)&&Boolean(e.valueOf()===r.valueOf()||1===n.getDay(e)&&e.valueOf()p("div",{ref:t.innerElRef,className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",style:{minHeight:t.minHeight}},t.showWeekNumber&&p(vo,{elTag:"a",elClasses:["fc-daygrid-week-number"],elAttrs:qi(e,o,"week"),date:o,defaultFormat:hl}),!a.isDisabled&&(t.showDayNumber||ho(i)||t.forceDayTop)?p("div",{className:"fc-daygrid-day-top"},p(s,{elTag:"a",elClasses:["fc-daygrid-day-number",l&&"fc-daygrid-month-start"],elAttrs:Object.assign(Object.assign({},qi(e,o)),{id:n.dayNumberId})})):t.showDayNumber?p("div",{className:"fc-daygrid-day-top",style:{visibility:"hidden"}},p("a",{className:"fc-daygrid-day-number"}," ")):void 0,p("div",{className:"fc-daygrid-day-events",ref:t.fgContentElRef},t.fgContent,p("div",{className:"fc-daygrid-day-bottom",style:{marginTop:t.moreMarginTop}},p(dl,{allDayDate:o,singlePlacements:t.singlePlacements,moreCnt:t.moreCnt,alignmentElRef:r,alignGridTop:!t.showDayNumber,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,todayRange:t.todayRange}))),p("div",{className:"fc-daygrid-day-bg"},t.bgContent)))}}function gl(e){return e.dayNumberText||p(y,null," ")}function pl(e){return e.eventRange.instance.instanceId+":"+e.firstCol}function ml(e){return pl(e)+":"+e.lastCol}function vl(e,t,n,r,i,s,o){let a=new bl(t=>{let n=e[t.index].eventRange.instance.instanceId+":"+t.span.start+":"+(t.span.end-1);return i[n]});a.allowReslicing=!0,a.strictOrder=r,!0===t||!0===n?(a.maxCoord=s,a.hiddenConsumes=!0):"number"==typeof t?a.maxStackCnt=t:"number"==typeof n&&(a.maxStackCnt=n,a.hiddenConsumes=!0);let l=[],c=[];for(let t=0;t1,o=r.span.start===e;d+=r.levelCoord-c,c=r.levelCoord+r.thickness,s?(d+=r.thickness,o&&u.push({seg:yl(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:r.levelCoord,marginTop:0})):o&&(u.push({seg:yl(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:r.levelCoord,marginTop:d}),d=0)}i.push(l),s.push(u),o.push(d)}return{singleColPlacements:i,multiColPlacements:s,leftoverMargins:o}}(u,e,o),p=[],m=[];for(let e of c){f[e.firstCol].push({seg:e,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let t=e.firstCol;t<=e.lastCol;t+=1)h[t].push({seg:yl(e,t,t+1,o),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e!this.forceHidden[us(e)];for(let e=0;e{e&&this.updateSizing(!0)}}render(){let{props:e,state:t,context:n}=this,{options:r}=n,i=e.cells.length,s=rl(e.businessHourSegs,i),o=rl(e.bgEventSegs,i),a=rl(this.getHighlightSegs(),i),l=rl(this.getMirrorSegs(),i),{singleColPlacements:c,multiColPlacements:d,moreCnts:u,moreMarginTops:h}=vl(di(e.fgEventSegs,r.eventOrder),e.dayMaxEvents,e.dayMaxEventRows,r.eventOrderStrict,t.segHeights,t.maxContentHeight,e.cells),f=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{};return p("tr",{ref:this.rootElRef,role:"row"},e.renderIntro&&e.renderIntro(),e.cells.map((t,n)=>{let r=this.renderFgSegs(n,e.forPrint?c[n]:d[n],e.todayRange,f),i=this.renderFgSegs(n,function(e,t){if(!e.length)return[];let n=function(e){let t={};for(let n of e)for(let e of n)t[e.seg.eventRange.instance.instanceId]=e.absoluteTop;return t}(t);return e.map(e=>({seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0}))}(l[n],d),e.todayRange,{},Boolean(e.eventDrag),Boolean(e.eventResize),!1);return p(fl,{key:t.key,elRef:this.cellElRefs.createRef(t.key),innerElRef:this.frameElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,showDayNumber:e.showDayNumbers,showWeekNumber:e.showWeekNumbers&&0===n,forceDayTop:e.showWeekNumbers,todayRange:e.todayRange,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:u[n],moreMarginTop:h[n],singlePlacements:c[n],fgContentElRef:this.fgElRefs.createRef(t.key),fgContent:p(y,null,p(y,null,r),p(y,null,i)),bgContent:p(y,null,this.renderFillSegs(a[n],"highlight"),this.renderFillSegs(s[n],"non-business"),this.renderFillSegs(o[n],"bg-event")),minHeight:e.cellMinHeight})}))}componentDidMount(){this.updateSizing(!0),this.context.addResizeHandler(this.handleResize)}componentDidUpdate(e,t){let n=this.props;this.updateSizing(!Cn(e,n))}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}getHighlightSegs(){let{props:e}=this;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs}getMirrorSegs(){let{props:e}=this;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]}renderFgSegs(e,t,n,r,i,s,o){let{context:a}=this,{eventSelection:l}=this.props,{framePositions:c}=this.state,d=1===this.props.cells.length,u=i||s||o,h=[];if(c)for(let e of t){let{seg:t}=e,{instanceId:f}=t.eventRange.instance,g=e.isVisible&&!r[f],m=e.isAbsolute,v="",y="";m&&(a.isRtl?(y=0,v=c.lefts[t.lastCol]-c.lefts[t.firstCol]):(v=0,y=c.rights[t.firstCol]-c.rights[t.lastCol])),h.push(p("div",{className:"fc-daygrid-event-harness"+(m?" fc-daygrid-event-harness-abs":""),key:pl(t),ref:u?null:this.segHarnessRefs.createRef(ml(t)),style:{visibility:g?"":"hidden",marginTop:m?"":e.marginTop,top:m?e.absoluteTop:"",left:v,right:y}},ol(t)?p(ll,Object.assign({seg:t,isDragging:i,isSelected:f===l,defaultDisplayEventEnd:d},mi(t,n))):p(al,Object.assign({seg:t,isDragging:i,isResizing:s,isDateSelecting:o,isSelected:f===l,defaultDisplayEventEnd:d},mi(t,n)))))}return h}renderFillSegs(e,t){let{isRtl:n}=this.context,{todayRange:r}=this.props,{framePositions:i}=this.state,s=[];if(i)for(let o of e){let e=n?{right:0,left:i.lefts[o.lastCol]-i.lefts[o.firstCol]}:{left:0,right:i.rights[o.firstCol]-i.rights[o.lastCol]};s.push(p("div",{key:yi(o.eventRange),className:"fc-daygrid-bg-harness",style:e},"bg-event"===t?p(go,Object.assign({seg:o},mi(o,r))):mo(t)))}return p(y,{},...s)}updateSizing(e){let{props:t,state:n,frameElRefs:r}=this;if(!t.forPrint&&null!==t.clientWidth){if(e){let e=t.cells.map(e=>r.currentMap[e.key]);if(e.length){let t=this.rootElRef.current,r=new rs(t,e,!0,!1);n.framePositions&&n.framePositions.similarTo(r)||this.setState({framePositions:new rs(t,e,!0,!1)})}}const i=this.state.segHeights,s=this.querySegHeights(),o=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.safeSetState({segHeights:Object.assign(Object.assign({},i),s),maxContentHeight:o?this.computeMaxContentHeight():null})}}querySegHeights(){let e=this.segHarnessRefs.currentMap,t={};for(let n in e){let r=Math.round(e[n].getBoundingClientRect().height);t[n]=Math.max(t[n]||0,r)}return t}computeMaxContentHeight(){let e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top}getCellEls(){let e=this.cellElRefs.currentMap;return this.props.cells.map(t=>e[t.key])}}El.addStateEquality({segHeights:Cn});class Sl extends ls{constructor(){super(...arguments),this.splitBusinessHourSegs=Gt(nl),this.splitBgEventSegs=Gt(nl),this.splitFgEventSegs=Gt(nl),this.splitDateSelectionSegs=Gt(nl),this.splitEventDrag=Gt(il),this.splitEventResize=Gt(il),this.rowRefs=new Vs}render(){let{props:e,context:t}=this,n=e.cells.length,r=this.splitBusinessHourSegs(e.businessHourSegs,n),i=this.splitBgEventSegs(e.bgEventSegs,n),s=this.splitFgEventSegs(e.fgEventSegs,n),o=this.splitDateSelectionSegs(e.dateSelectionSegs,n),a=this.splitEventDrag(e.eventDrag,n),l=this.splitEventResize(e.eventResize,n),c=n>=7&&e.clientWidth?e.clientWidth/t.options.aspectRatio/6:null;return p(Rs,{unit:"day"},(t,d)=>p(y,null,e.cells.map((t,u)=>p(El,{ref:this.rowRefs.createRef(u),key:t.length?t[0].date.toISOString():u,showDayNumbers:n>1,showWeekNumbers:e.showWeekNumbers,todayRange:d,dateProfile:e.dateProfile,cells:t,renderIntro:e.renderRowIntro,businessHourSegs:r[u],eventSelection:e.eventSelection,bgEventSegs:i[u].filter(Al),fgEventSegs:s[u],dateSelectionSegs:o[u],eventDrag:a[u],eventResize:l[u],dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,clientWidth:e.clientWidth,clientHeight:e.clientHeight,cellMinHeight:c,forPrint:e.forPrint}))))}componentDidMount(){this.registerInteractiveComponent()}componentDidUpdate(){this.registerInteractiveComponent()}registerInteractiveComponent(){if(!this.rootEl){const e=this.rowRefs.currentMap[0].getCellEls()[0],t=e?e.closest(".fc-daygrid-body"):null;t&&(this.rootEl=t,this.context.registerInteractiveComponent(this,{el:t,isHitComboAllowed:this.props.isHitComboAllowed}))}}componentWillUnmount(){this.rootEl&&(this.context.unregisterInteractiveComponent(this),this.rootEl=null)}prepareHits(){this.rowPositions=new rs(this.rootEl,this.rowRefs.collect().map(e=>e.getCellEls()[0]),!1,!0),this.colPositions=new rs(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)}queryHit(e,t){let{colPositions:n,rowPositions:r}=this,i=n.leftToIndex(e),s=r.topToIndex(t);if(null!=s&&null!=i){let e=this.props.cells[s][i];return{dateProfile:this.props.dateProfile,dateSpan:Object.assign({range:this.getCellRange(s,i),allDay:!0},e.extraDateSpan),dayEl:this.getCellEl(s,i),rect:{left:n.lefts[i],right:n.rights[i],top:r.tops[s],bottom:r.bottoms[s]},layer:0}}return null}getCellEl(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]}getCellRange(e,t){let n=this.props.cells[e][t].date;return{start:n,end:wt(n,1)}}}function Al(e){return e.eventRange.def.allDay}class Dl extends ls{constructor(){super(...arguments),this.elRef={current:null},this.needsScrollReset=!1}render(){let{props:e}=this,{dayMaxEventRows:t,dayMaxEvents:n,expandRows:r}=e,i=!0===n||!0===t;i&&!r&&(i=!1,t=null,n=null);let s=["fc-daygrid-body",i?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",r?"":"fc-daygrid-body-natural"];return p("div",{ref:this.elRef,className:s.join(" "),style:{width:e.clientWidth,minWidth:e.tableMinWidth}},p("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:e.clientWidth,minWidth:e.tableMinWidth,height:r?e.clientHeight:""}},e.colGroupNode,p("tbody",{role:"presentation"},p(Sl,{dateProfile:e.dateProfile,cells:e.cells,renderRowIntro:e.renderRowIntro,showWeekNumbers:e.showWeekNumbers,clientWidth:e.clientWidth,clientHeight:e.clientHeight,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,dayMaxEvents:n,dayMaxEventRows:t,forPrint:e.forPrint,isHitComboAllowed:e.isHitComboAllowed}))))}componentDidMount(){this.requestScrollReset()}componentDidUpdate(e){e.dateProfile!==this.props.dateProfile?this.requestScrollReset():this.flushScrollReset()}requestScrollReset(){this.needsScrollReset=!0,this.flushScrollReset()}flushScrollReset(){if(this.needsScrollReset&&this.props.clientWidth){const e=function(e,t){let n;t.currentRangeUnit.match(/year|month/)&&(n=e.querySelector(`[data-date="${Lt(t.currentDate)}-01"]`));n||(n=e.querySelector(`[data-date="${Wt(t.currentDate)}"]`));return n}(this.elRef.current,this.props.dateProfile);if(e){const t=e.closest(".fc-daygrid-body"),n=t.closest(".fc-scroller"),r=e.getBoundingClientRect().top-t.getBoundingClientRect().top;n.scrollTop=r?r+1:0}this.needsScrollReset=!1}}}class wl extends Is{constructor(){super(...arguments),this.forceDayIfListItem=!0}sliceRange(e,t){return t.sliceRange(e)}}class Cl extends ls{constructor(){super(...arguments),this.slicer=new wl,this.tableRef={current:null}}render(){let{props:e,context:t}=this;return p(Dl,Object.assign({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}))}}function Rl(e,t){let n=new ks(e.renderRange,t);return new Ms(n,/year|month|week/.test(e.currentRangeUnit))}class xl extends gr{buildRenderRange(e,t,n){let r=super.buildRenderRange(e,t,n),{props:i}=this;return _l({currentRange:r,snapToWeek:/^(year|month)$/.test(t),fixedWeekCount:i.fixedWeekCount,dateEnv:i.dateEnv})}}function _l(e){let t,{dateEnv:n,currentRange:r}=e,{start:i,end:s}=r;if(e.snapToWeek&&(i=n.startOfWeek(i),t=n.startOfWeek(s),t.valueOf()!==s.valueOf()&&(s=Dt(t,1))),e.fixedWeekCount){let e=n.startOfWeek(n.startOfMonth(wt(r.end,-1)));s=Dt(s,6-Math.ceil(Rt(e,s)))}return{start:i,end:s}}xe(':root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:"";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-month-start{font-size:1.1em;font-weight:700}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:0 2px}.fc .fc-daygrid-day-bottom:after,.fc .fc-daygrid-day-bottom:before{clear:both;content:"";display:table}.fc .fc-daygrid-more-link{border-radius:3px;cursor:pointer;line-height:1;margin-top:1px;max-width:100%;overflow:hidden;padding:2px;position:relative;white-space:nowrap;z-index:4}.fc .fc-daygrid-more-link:hover{background-color:rgba(0,0,0,.1)}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-more-link{float:left}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-more-link{float:right}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}');var Tl=Po({name:"@fullcalendar/daygrid",initialView:"dayGridMonth",views:{dayGrid:{component:class extends tl{constructor(){super(...arguments),this.buildDayTableModel=Gt(Rl),this.headerRef={current:null},this.tableRef={current:null}}render(){let{options:e,dateProfileGenerator:t}=this.context,{props:n}=this,r=this.buildDayTableModel(n.dateProfile,t),i=e.dayHeaders&&p(_s,{ref:this.headerRef,dateProfile:n.dateProfile,dates:r.headerDates,datesRepDistinctDays:1===r.rowCnt}),s=t=>p(Cl,{ref:this.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:e.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.weekNumbers,expandRows:!n.isHeightAuto,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:n.forPrint});return e.dayMinWidth?this.renderHScrollLayout(i,s,r.colCnt,e.dayMinWidth):this.renderSimpleLayout(i,s)}},dateProfileGeneratorClass:xl},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},fixedWeekCount:!0},dayGridYear:{type:"dayGrid",duration:{years:1}}}});xe('.fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:"\\00a0"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:"\\00a0-\\00a0"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}');class kl extends Wi{getKeyInfo(){return{allDay:{},timed:{}}}getKeysForDateSpan(e){return e.allDay?["allDay"]:["timed"]}getKeysForEventDef(e){return e.allDay?si(e)?["timed","allDay"]:["allDay"]:["timed"]}}const Ml=an({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function Il(e){let t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return p(Ln.Consumer,null,n=>{if(!e.isLabeled)return p("td",{className:t.join(" "),"data-time":e.isoTimeStr});let{dateEnv:r,options:i,viewApi:s}=n,o=null==i.slotLabelFormat?Ml:Array.isArray(i.slotLabelFormat)?an(i.slotLabelFormat[0]):an(i.slotLabelFormat),a={level:0,time:e.time,date:r.toDate(e.date),view:s,text:r.format(e.date,o)};return p(Jn,{elTag:"td",elClasses:t,elAttrs:{"data-time":e.isoTimeStr},renderProps:a,generatorName:"slotLabelContent",customGenerator:i.slotLabelContent,defaultGenerator:Ol,classNameGenerator:i.slotLabelClassNames,didMount:i.slotLabelDidMount,willUnmount:i.slotLabelWillUnmount},e=>p("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},p(e,{elTag:"div",elClasses:["fc-timegrid-slot-label-cushion","fc-scrollgrid-shrink-cushion"]})))})}function Ol(e){return e.text}class Nl extends Gn{render(){return this.props.slatMetas.map(e=>p("tr",{key:e.key},p(Il,Object.assign({},e))))}}const Pl=an({week:"short"});class Hl extends ls{constructor(){super(...arguments),this.allDaySplitter=new kl,this.headerElRef={current:null},this.rootElRef={current:null},this.scrollerElRef={current:null},this.state={slatCoords:null},this.handleScrollTopRequest=e=>{let t=this.scrollerElRef.current;t&&(t.scrollTop=e)},this.renderHeadAxis=(e,t="")=>{let{options:n}=this.context,{dateProfile:r}=this.props,i=r.renderRange,s=1===xt(i.start,i.end)?qi(this.context,i.start,"week"):{};return n.weekNumbers&&"day"===e?p(vo,{elTag:"th",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},date:i.start,defaultFormat:Pl},e=>p("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame","fc-timegrid-axis-frame-liquid"].join(" "),style:{height:t}},p(e,{elTag:"a",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"],elAttrs:s}))):p("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},p("div",{className:"fc-timegrid-axis-frame",style:{height:t}}))},this.renderTableRowAxis=e=>{let{options:t,viewApi:n}=this.context,r={text:t.allDayText,view:n};return p(Jn,{elTag:"td",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},renderProps:r,generatorName:"allDayContent",customGenerator:t.allDayContent,defaultGenerator:Bl,classNameGenerator:t.allDayClassNames,didMount:t.allDayDidMount,willUnmount:t.allDayWillUnmount},t=>p("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame",null==e?" fc-timegrid-axis-frame-liquid":""].join(" "),style:{height:e}},p(t,{elTag:"span",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"]})))},this.handleSlatCoords=e=>{this.setState({slatCoords:e})}}renderSimpleLayout(e,t,n){let{context:r,props:i}=this,s=[],o=no(r.options);return e&&s.push({type:"header",key:"header",isSticky:o,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(s.push({type:"body",key:"all-day",chunk:{content:t}}),s.push({type:"body",key:"all-day-divider",outerContent:p("tr",{role:"presentation",className:"fc-scrollgrid-section"},p("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),s.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),p(er,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:r.viewSpec},p(io,{liquid:!i.isHeightAuto&&!i.forPrint,collapsibleWidth:i.forPrint,cols:[{width:"shrink"}],sections:s}))}renderHScrollLayout(e,t,n,r,i,s,o){let a=this.context.pluginHooks.scrollGridImpl;if(!a)throw new Error("No ScrollGrid implementation");let{context:l,props:c}=this,d=!c.forPrint&&no(l.options),u=!c.forPrint&&ro(l.options),h=[];e&&h.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>p("tr",{role:"presentation"},this.renderHeadAxis("day",e.rowSyncHeights[0]))},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(h.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>p("tr",{role:"presentation"},this.renderTableRowAxis(e.rowSyncHeights[0]))},{key:"cols",content:t}]}),h.push({key:"all-day-divider",type:"body",outerContent:p("tr",{role:"presentation",className:"fc-scrollgrid-section"},p("td",{colSpan:2,className:"fc-timegrid-divider "+l.theme.getClass("tableCellShaded")}))}));let f=l.options.nowIndicator;return h.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(l.options.expandRows),chunks:[{key:"axis",content:e=>p("div",{className:"fc-timegrid-axis-chunk"},p("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,p("tbody",null,p(Nl,{slatMetas:s}))),p("div",{className:"fc-timegrid-now-indicator-container"},p(Rs,{unit:f?"minute":"day"},e=>{let t=f&&o&&o.safeComputeTop(e);return"number"==typeof t?p(lo,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:t},isAxis:!0,date:e}):null})))},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),u&&h.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:to},{key:"cols",content:to}]}),p(er,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:l.viewSpec},p(a,{liquid:!c.isHeightAuto&&!c.forPrint,forPrint:c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:i}]}],sections:h}))}getAllDayMaxEventProps(){let{dayMaxEvents:e,dayMaxEventRows:t}=this.context.options;return!0!==e&&!0!==t||(e=void 0,t=5),{dayMaxEvents:e,dayMaxEventRows:t}}}function Bl(e){return e.text}class jl{constructor(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}safeComputeTop(e){let{dateProfile:t}=this;if(lr(t.currentRange,e)){let n=Mt(e),r=e.valueOf()-n.valueOf();if(r>=yt(t.slotMinTime)&&r{let o={time:i.time,date:t.dateEnv.toDate(i.date),view:t.viewApi};return p("tr",{key:i.key,ref:r.createRef(i.key)},e.axis&&p(Il,Object.assign({},i)),p(Jn,{elTag:"td",elClasses:["fc-timegrid-slot","fc-timegrid-slot-lane",!i.isLabeled&&"fc-timegrid-slot-minor"],elAttrs:{"data-time":i.isoTimeStr},renderProps:o,generatorName:"slotLaneContent",customGenerator:n.slotLaneContent,classNameGenerator:n.slotLaneClassNames,didMount:n.slotLaneDidMount,willUnmount:n.slotLaneWillUnmount}))}))}}class Ul extends Gn{constructor(){super(...arguments),this.rootElRef={current:null},this.slatElRefs=new Vs}render(){let{props:e,context:t}=this;return p("div",{ref:this.rootElRef,className:"fc-timegrid-slots"},p("table",{"aria-hidden":!0,className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},e.tableColGroupNode,p(zl,{slatElRefs:this.slatElRefs,axis:e.axis,slatMetas:e.slatMetas})))}componentDidMount(){this.updateSizing()}componentDidUpdate(){this.updateSizing()}componentWillUnmount(){this.props.onCoords&&this.props.onCoords(null)}updateSizing(){let{context:e,props:t}=this;if(t.onCoords&&null!==t.clientWidth){this.rootElRef.current.offsetHeight&&t.onCoords(new jl(new rs(this.rootElRef.current,(n=this.slatElRefs.currentMap,t.slatMetas.map(e=>n[e.key])),!1,!0),this.props.dateProfile,e.options.slotDuration))}var n}}function Wl(e,t){let n,r=[];for(n=0;nec(e.hiddenSegs,e),defaultGenerator:Vl,forceTimed:!0},e=>p(e,{elTag:"div",elClasses:["fc-timegrid-more-link-inner","fc-sticky"]}))}}function Vl(e){return e.shortText}function Gl(e,t,n){let r=new cs;null!=t&&(r.strictOrder=t),null!=n&&(r.maxStackCnt=n);let i=hs(r.addSegs(e)),s=function(e){const{entriesByLevel:t}=e,n=Zl((e,t)=>e+":"+t,(r,i)=>{let s=Ql(function(e,t,n){let{levelCoords:r,entriesByLevel:i}=e,s=i[t][n],o=r[t]+s.thickness,a=r.length,l=t;for(;lus(e),(e,r,i)=>{let s,{nextLevelNodes:o,thickness:a}=e,l=a+i,c=a/l,d=[];if(o.length)for(let e of o)if(void 0===s){let t=n(e,r,l);s=t[0],d.push(t[1])}else{let t=n(e,s,0);d.push(t[1])}else s=t;let u=(s-r)*c;return[s-u,Object.assign(Object.assign({},e),{thickness:u,nextLevelNodes:d})]});return e.map(e=>n(e,0,0)[1])}(s,1),{segRects:function(e){let t=[];const n=Zl((e,t,n)=>us(e),(e,n,i)=>{let s=Object.assign(Object.assign({},e),{levelCoord:n,stackDepth:i,stackForward:0});return t.push(s),s.stackForward=r(e.nextLevelNodes,n+e.thickness,i+1)+1});function r(e,t,r){let i=0;for(let s of e)i=Math.max(n(s,t,r),i);return i}return r(e,0,0),t}(s),hiddenGroups:i}}function Ql(e,t){if(!e)return[[],0];let{level:n,lateralStart:r,lateralEnd:i}=e,s=r,o=[];for(;s{let i=e(...r);return i in n?n[i]:n[i]=t(...r)}}function Xl(e,t,n=null,r=0){let i=[];if(n)for(let s=0;sp("div",{className:"fc-timegrid-col-frame"},p("div",{className:"fc-timegrid-col-bg"},this.renderFillSegs(e.businessHourSegs,"non-business"),this.renderFillSegs(e.bgEventSegs,"bg-event"),this.renderFillSegs(e.dateSelectionSegs,"highlight")),p("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(o,s,!1,!1,!1)),p("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(i,{},Boolean(e.eventDrag),Boolean(e.eventResize),Boolean(r),"mirror")),p("div",{className:"fc-timegrid-now-indicator-container"},this.renderNowIndicator(e.nowIndicatorSegs)),ho(n)&&p(t,{elTag:"div",elClasses:["fc-timegrid-col-misc"]})))}renderFgSegs(e,t,n,r,i,s){let{props:o}=this;return o.forPrint?ec(e,o):this.renderPositionedFgSegs(e,t,n,r,i,s)}renderPositionedFgSegs(e,t,n,r,i,s){let{eventMaxStack:o,eventShortHeight:a,eventOrderStrict:l,eventMinHeight:c}=this.context.options,{date:d,slatCoords:u,eventSelection:h,todayRange:f,nowDate:g}=this.props,m=n||r||i,v=Xl(e,d,u,c),{segPlacements:b,hiddenGroups:E}=function(e,t,n,r){let i=[],s=[];for(let n=0;n{let{seg:o,rect:l}=e,c=o.eventRange.instance.instanceId,d=m||Boolean(!t[c]&&l),u=tc(l&&l.span),v=!m&&l?this.computeSegHStyle(l):{left:0,right:0},y=Boolean(l)&&l.stackForward>0,b=Boolean(l)&&l.span.end-l.span.start{let c=tc(e.span),d=(u=e.entries,h=t,u.map(e=>h[e.index]));var u,h;return p(Fl,{key:Ut(wo(d)),hiddenSegs:d,top:c.top,bottom:c.bottom,extraDateSpan:n,dateProfile:r,todayRange:i,nowDate:s,eventSelection:o,eventDrag:a,eventResize:l})}))}renderFillSegs(e,t){let{props:n,context:r}=this,i=Xl(e,n.date,n.slatCoords,r.options.eventMinHeight).map((r,i)=>{let s=e[i];return p("div",{key:yi(s.eventRange),className:"fc-timegrid-bg-harness",style:tc(r)},"bg-event"===t?p(go,Object.assign({seg:s},mi(s,n.todayRange,n.nowDate))):mo(t))});return p(y,null,i)}renderNowIndicator(e){let{slatCoords:t,date:n}=this.props;return t?e.map((e,r)=>p(lo,{key:r,elClasses:["fc-timegrid-now-indicator-line"],elStyle:{top:t.computeDateTop(e.start,n)},isAxis:!1,date:n})):null}computeSegHStyle(e){let t,n,{isRtl:r,options:i}=this.context,s=i.slotEventOverlap,o=e.levelCoord,a=e.levelCoord+e.thickness;s&&(a=Math.min(1,o+2*(a-o))),r?(t=1-a,n=o):(t=o,n=1-a);let l={zIndex:e.stackDepth+1,left:100*t+"%",right:100*n+"%"};return s&&!e.stackForward&&(l[r?"marginLeft":"marginRight"]=20),l}}function ec(e,{todayRange:t,nowDate:n,eventSelection:r,eventDrag:i,eventResize:s}){let o=(i?i.affectedInstances:null)||(s?s.affectedInstances:null)||{};return p(y,null,e.map(e=>{let i=e.eventRange.instance.instanceId;return p("div",{key:i,style:{visibility:o[i]?"hidden":""}},p(Jl,Object.assign({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:i===r,isShort:!1},mi(e,t,n))))}))}function tc(e){return e?{top:e.start,bottom:-e.end}:{top:"",bottom:""}}class nc extends Gn{constructor(){super(...arguments),this.splitFgEventSegs=Gt(Wl),this.splitBgEventSegs=Gt(Wl),this.splitBusinessHourSegs=Gt(Wl),this.splitNowIndicatorSegs=Gt(Wl),this.splitDateSelectionSegs=Gt(Wl),this.splitEventDrag=Gt(Ll),this.splitEventResize=Gt(Ll),this.rootElRef={current:null},this.cellElRefs=new Vs}render(){let{props:e,context:t}=this,n=t.options.nowIndicator&&e.slatCoords&&e.slatCoords.safeComputeTop(e.nowDate),r=e.cells.length,i=this.splitFgEventSegs(e.fgEventSegs,r),s=this.splitBgEventSegs(e.bgEventSegs,r),o=this.splitBusinessHourSegs(e.businessHourSegs,r),a=this.splitNowIndicatorSegs(e.nowIndicatorSegs,r),l=this.splitDateSelectionSegs(e.dateSelectionSegs,r),c=this.splitEventDrag(e.eventDrag,r),d=this.splitEventResize(e.eventResize,r);return p("div",{className:"fc-timegrid-cols",ref:this.rootElRef},p("table",{role:"presentation",style:{minWidth:e.tableMinWidth,width:e.clientWidth}},e.tableColGroupNode,p("tbody",{role:"presentation"},p("tr",{role:"row"},e.axis&&p("td",{"aria-hidden":!0,className:"fc-timegrid-col fc-timegrid-axis"},p("div",{className:"fc-timegrid-col-frame"},p("div",{className:"fc-timegrid-now-indicator-container"},"number"==typeof n&&p(lo,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:n},isAxis:!0,date:e.nowDate})))),e.cells.map((t,n)=>p(Kl,{key:t.key,elRef:this.cellElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,nowDate:e.nowDate,todayRange:e.todayRange,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,fgEventSegs:i[n],bgEventSegs:s[n],businessHourSegs:o[n],nowIndicatorSegs:a[n],dateSelectionSegs:l[n],eventDrag:c[n],eventResize:d[n],slatCoords:e.slatCoords,eventSelection:e.eventSelection,forPrint:e.forPrint}))))))}componentDidMount(){this.updateCoords()}componentDidUpdate(){this.updateCoords()}updateCoords(){let{props:e}=this;var t;e.onColCoords&&null!==e.clientWidth&&e.onColCoords(new rs(this.rootElRef.current,(t=this.cellElRefs.currentMap,e.cells.map(e=>t[e.key])),!0,!1))}}class rc extends ls{constructor(){super(...arguments),this.processSlotOptions=Gt(ic),this.state={slatCoords:null},this.handleRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)},this.handleScrollRequest=e=>{let{onScrollTopRequest:t}=this.props,{slatCoords:n}=this.state;if(t&&n){if(e.time){let r=n.computeTimeTop(e.time);r=Math.ceil(r),r&&(r+=1),t(r)}return!0}return!1},this.handleColCoords=e=>{this.colCoords=e},this.handleSlatCoords=e=>{this.setState({slatCoords:e}),this.props.onSlatCoords&&this.props.onSlatCoords(e)}}render(){let{props:e,state:t}=this;return p("div",{className:"fc-timegrid-body",ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},p(Ul,{axis:e.axis,dateProfile:e.dateProfile,slatMetas:e.slatMetas,clientWidth:e.clientWidth,minHeight:e.expandRows?e.clientHeight:"",tableMinWidth:e.tableMinWidth,tableColGroupNode:e.axis?e.tableColGroupNode:null,onCoords:this.handleSlatCoords}),p(nc,{cells:e.cells,axis:e.axis,dateProfile:e.dateProfile,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,todayRange:e.todayRange,nowDate:e.nowDate,nowIndicatorSegs:e.nowIndicatorSegs,clientWidth:e.clientWidth,tableMinWidth:e.tableMinWidth,tableColGroupNode:e.tableColGroupNode,slatCoords:t.slatCoords,onColCoords:this.handleColCoords,forPrint:e.forPrint}))}componentDidMount(){this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)}componentDidUpdate(e){this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)}componentWillUnmount(){this.scrollResponder.detach()}queryHit(e,t){let{dateEnv:n,options:r}=this.context,{colCoords:i}=this,{dateProfile:s}=this.props,{slatCoords:o}=this.state,{snapDuration:a,snapsPerSlot:l}=this.processSlotOptions(this.props.slotDuration,r.snapDuration),c=i.leftToIndex(e),d=o.positions.topToIndex(t);if(null!=c&&null!=d){let e=this.props.cells[c],r=o.positions.tops[d],u=o.positions.getHeight(d),h=(t-r)/u,f=d*l+Math.floor(h*l),g=this.props.cells[c].date,p=pt(s.slotMinTime,mt(a,f)),m=n.add(g,p),v=n.add(m,a);return{dateProfile:s,dateSpan:Object.assign({range:{start:m,end:v},allDay:!1},e.extraDateSpan),dayEl:i.els[c],rect:{left:i.lefts[c],right:i.rights[c],top:r,bottom:r+u},layer:0}}return null}}function ic(e,t){let n=t||e,r=bt(e,n);return null===r&&(n=e,r=1),{snapDuration:n,snapsPerSlot:r}}class sc extends Is{sliceRange(e,t){let n=[];for(let r=0;rp(rc,Object.assign({ref:this.timeColsRef},this.slicer.sliceProps(e,n,null,t,o),{forPrint:e.forPrint,axis:e.axis,dateProfile:n,slatMetas:e.slatMetas,slotDuration:e.slotDuration,cells:r.cells[0],tableColGroupNode:e.tableColGroupNode,tableMinWidth:e.tableMinWidth,clientWidth:e.clientWidth,clientHeight:e.clientHeight,expandRows:e.expandRows,nowDate:a,nowIndicatorSegs:i&&this.slicer.sliceNowDate(a,n,s,t,o),todayRange:l,onScrollTopRequest:e.onScrollTopRequest,onSlatCoords:e.onSlatCoords})))}}function ac(e,t,n){let r=[];for(let i of e.headerDates)r.push({start:n.add(i,t.slotMinTime),end:n.add(i,t.slotMaxTime)});return r}const lc=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];function cc(e,t,n,r,i){let s=new Date(0),o=e,a=ft(0),l=n||function(e){let t,n,r;for(t=lc.length-1;t>=0;t-=1)if(n=ft(lc[t]),r=bt(n,e),null!==r&&r>1)return n;return e}(r),c=[];for(;yt(o)p(Cl,Object.assign({},o.allDay,{dateProfile:i,dayTableModel:s,nextDayThreshold:e.nextDayThreshold,tableMinWidth:t.tableMinWidth,colGroupNode:t.tableColGroupNode,renderRowIntro:c?this.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:r.forPrint},this.getAllDayMaxEventProps()))),f=t=>p(oc,Object.assign({},o.timed,{dayTableModel:s,dateProfile:i,axis:c,slotDuration:e.slotDuration,slatMetas:a,forPrint:r.forPrint,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,onSlatCoords:this.handleSlatCoords,expandRows:t.expandRows,onScrollTopRequest:this.handleScrollTopRequest}));return d?this.renderHScrollLayout(u,h,f,s.colCnt,l,a,this.state.slatCoords):this.renderSimpleLayout(u,h,f)}},usesMinMaxTime:!0,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}});class hc extends Gn{constructor(){super(...arguments),this.state={textId:We()}}render(){let{theme:e,dateEnv:t,options:n,viewApi:r}=this.context,{cellId:i,dayDate:s,todayRange:o}=this.props,{textId:a}=this.state,l=Fi(s,o),c=n.listDayFormat?t.format(s,n.listDayFormat):"",d=n.listDaySideFormat?t.format(s,n.listDaySideFormat):"",u=Object.assign({date:t.toDate(s),view:r,textId:a,text:c,sideText:d,navLinkAttrs:qi(this.context,s),sideNavLinkAttrs:qi(this.context,s,"day",!1)},l);return p(Jn,{elTag:"tr",elClasses:["fc-list-day",...Vi(l,e)],elAttrs:{"data-date":Wt(s)},renderProps:u,generatorName:"dayHeaderContent",customGenerator:n.dayHeaderContent,defaultGenerator:fc,classNameGenerator:n.dayHeaderClassNames,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},t=>p("th",{scope:"colgroup",colSpan:3,id:i,"aria-labelledby":a},p(t,{elTag:"div",elClasses:["fc-list-day-cushion",e.getClass("tableCellShaded")]})))}}function fc(e){return p(y,null,e.text&&p("a",Object.assign({id:e.textId,className:"fc-list-day-text"},e.navLinkAttrs),e.text),e.sideText&&p("a",Object.assign({"aria-hidden":!0,className:"fc-list-day-side-text"},e.sideNavLinkAttrs),e.sideText))}const gc=an({hour:"numeric",minute:"2-digit",meridiem:"short"});class pc extends Gn{render(){let{props:e,context:t}=this,{options:n}=t,{seg:r,timeHeaderId:i,eventHeaderId:s,dateHeaderId:o}=e,a=n.eventTimeFormat||gc;return p(so,Object.assign({},e,{elTag:"tr",elClasses:["fc-list-event",r.eventRange.def.url&&"fc-event-forced-url"],defaultGenerator:()=>function(e,t){let n=bi(e,t);return p("a",Object.assign({},n),e.eventRange.def.title)}(r,t),seg:r,timeText:"",disableDragging:!0,disableResizing:!0}),(e,n)=>p(y,null,function(e,t,n,r,i){let{options:s}=n;if(!1!==s.displayEventTime){let o,a=e.eventRange.def,l=e.eventRange.instance,c=!1;if(a.allDay?c=!0:ur(e.eventRange.range)?e.isStart?o=pi(e,t,n,null,null,l.range.start,e.end):e.isEnd?o=pi(e,t,n,null,null,e.start,l.range.end):c=!0:o=pi(e,t,n),c){let e={text:n.options.allDayText,view:n.viewApi};return p(Jn,{elTag:"td",elClasses:["fc-list-event-time"],elAttrs:{headers:`${r} ${i}`},renderProps:e,generatorName:"allDayContent",customGenerator:s.allDayContent,defaultGenerator:mc,classNameGenerator:s.allDayClassNames,didMount:s.allDayDidMount,willUnmount:s.allDayWillUnmount})}return p("td",{className:"fc-list-event-time"},o)}return null}(r,a,t,i,o),p("td",{"aria-hidden":!0,className:"fc-list-event-graphic"},p("span",{className:"fc-list-event-dot",style:{borderColor:n.borderColor||n.backgroundColor}})),p(e,{elTag:"td",elClasses:["fc-list-event-title"],elAttrs:{headers:`${s} ${o}`}})))}}function mc(e){return e.text}function vc(e){return e.text}function yc(e){let t=Mt(e.renderRange.start),n=e.renderRange.end,r=[],i=[];for(;t*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:"";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}');function bc(e){return!1===e?null:an(e)}var Ec=Po({name:"@fullcalendar/list",optionRefiners:{listDayFormat:bc,listDaySideFormat:bc,noEventsClassNames:yn,noEventsContent:yn,noEventsDidMount:yn,noEventsWillUnmount:yn},views:{list:{component:class extends ls{constructor(){super(...arguments),this.computeDateVars=Gt(yc),this.eventStoreToSegs=Gt(this._eventStoreToSegs),this.state={timeHeaderId:We(),eventHeaderId:We(),dateHeaderIdRoot:We()},this.setRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e,context:t}=this,{dayDates:n,dayRanges:r}=this.computeDateVars(e.dateProfile),i=this.eventStoreToSegs(e.eventStore,e.eventUiBases,r);return p(er,{elRef:this.setRootEl,elClasses:["fc-list",t.theme.getClass("table"),!1!==t.options.stickyHeaderDates?"fc-list-sticky":""],viewSpec:t.viewSpec},p(Fs,{liquid:!e.isHeightAuto,overflowX:e.isHeightAuto?"visible":"hidden",overflowY:e.isHeightAuto?"visible":"auto"},i.length>0?this.renderSegList(i,n):this.renderEmptyMessage()))}renderEmptyMessage(){let{options:e,viewApi:t}=this.context,n={text:e.noEventsText,view:t};return p(Jn,{elTag:"div",elClasses:["fc-list-empty"],renderProps:n,generatorName:"noEventsContent",customGenerator:e.noEventsContent,defaultGenerator:vc,classNameGenerator:e.noEventsClassNames,didMount:e.noEventsDidMount,willUnmount:e.noEventsWillUnmount},e=>p(e,{elTag:"div",elClasses:["fc-list-empty-cushion"]}))}renderSegList(e,t){let{theme:n,options:r}=this.context,{timeHeaderId:i,eventHeaderId:s,dateHeaderIdRoot:o}=this.state,a=function(e){let t,n,r=[];for(t=0;t{let c=[];for(let n=0;n{e&&this.updateSize()}}render(){const{context:e,props:t,state:n}=this,{options:r}=e,{clientWidth:i,clientHeight:s}=n,o=n.monthHPadding||0,a=Math.min(null!=i?Math.floor(i/(r.multiMonthMinWidth+o)):1,r.multiMonthMaxColumns)||1,l=100/a+"%",c=null==i?null:i/a-o,d=null!=i&&1===a,u=this.splitDateProfileByMonth(e.dateProfileGenerator,t.dateProfile,e.dateEnv,!d&&r.fixedWeekCount,r.showNonCurrentDates),h=this.buildMonthFormat(r.multiMonthTitleFormat,u),f=["fc-multimonth",d?"fc-multimonth-singlecol":"fc-multimonth-multicol",null!=c&&c<400?"fc-multimonth-compact":""];return p(er,{elRef:this.scrollElRef,elClasses:f,viewSpec:e.viewSpec},u.map((e,n)=>{const r=Lt(e.currentRange.start);return p(Sc,Object.assign({},t,{key:r,isoDateStr:r,elRef:0===n?this.firstMonthElRef:void 0,titleFormat:h,dateProfile:e,width:l,tableWidth:c,clientWidth:i,clientHeight:s}))}))}componentDidMount(){this.updateSize(),this.context.addResizeHandler(this.handleSizing),this.requestScrollReset()}componentDidUpdate(e){Cn(e,this.props)||this.handleSizing(!1),e.dateProfile!==this.props.dateProfile?this.requestScrollReset():this.flushScrollReset()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}updateSize(){const e=this.scrollElRef.current,t=this.firstMonthElRef.current;e&&this.setState({clientWidth:e.clientWidth,clientHeight:e.clientHeight}),t&&e&&null==this.state.monthHPadding&&this.setState({monthHPadding:e.clientWidth-t.firstChild.offsetWidth})}requestScrollReset(){this.needsScrollReset=!0,this.flushScrollReset()}flushScrollReset(){if(this.needsScrollReset&&null!=this.state.monthHPadding){const{currentDate:e}=this.props.dateProfile,t=this.scrollElRef.current,n=t.querySelector(`[data-date="${Lt(e)}"]`);t.scrollTop=n.getBoundingClientRect().top-this.firstMonthElRef.current.getBoundingClientRect().top,this.needsScrollReset=!1}}shouldComponentUpdate(){return!0}},dateProfileGeneratorClass:xl,multiMonthMinWidth:350,multiMonthMaxColumns:3},multiMonthYear:{type:"multiMonth",duration:{years:1},fixedWeekCount:!0,showNonCurrentDates:!1}}});return ca.push(el,Tl,uc,Ec,_c),e.Calendar=class extends Ni{constructor(e,t={}){super(),this.isRendering=!1,this.isRendered=!1,this.currentClassNames=[],this.customContentRenderId=0,this.handleAction=e=>{switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":this.renderRunner.tryDrain()}},this.handleData=e=>{this.currentData=e,this.renderRunner.request(e.calendarOptions.rerenderDelay)},this.handleRenderRequest=()=>{if(this.isRendering){this.isRendered=!0;let{currentData:e}=this;jn(()=>{U(p(ki,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(t,n,r,i)=>(this.setClassNames(t),this.setHeight(n),p($n.Provider,{value:this.customContentRenderId},p(_a,Object.assign({isHeightAuto:r,forPrint:i},e))))),this.el)})}else this.isRendered&&(this.isRendered=!1,U(null,this.el),this.setClassNames([]),this.setHeight(""))},function(e){e.isConnected&&_e(e.getRootNode())}(e),this.el=e,this.renderRunner=new Me(this.handleRenderRequest),new ha({optionOverrides:t,calendarApi:this,onAction:this.handleAction,onData:this.handleData})}render(){let e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()}destroy(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())}updateSize(){jn(()=>{super.updateSize()})}batchRendering(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")}pauseRendering(){this.renderRunner.pause("pauseRendering")}resumeRendering(){this.renderRunner.resume("pauseRendering",!0)}resetOptions(e,t){this.currentDataManager.resetOptions(e,t)}setClassNames(e){if(!St(e,this.currentClassNames)){let{classList:t}=this.el;for(let e of this.currentClassNames)t.remove(e);for(let n of e)t.add(n);this.currentClassNames=e}}setHeight(e){je(this.el,"height",e)}},e.Draggable=class{constructor(e,t={}){this.handlePointerDown=e=>{let{dragging:t}=this,{minDistance:n,longPressDelay:r}=this.settings;t.minDistance=null!=n?n:e.isTouch?0:cn.eventDragMinDistance,t.delay=e.isTouch?null!=r?r:cn.longPressDelay:0},this.handleDragStart=e=>{e.isTouch&&this.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&this.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=t;let n=this.dragging=new Fa(e);n.touchScrollAllowed=!1,null!=t.itemSelector&&(n.pointer.selector=t.itemSelector),null!=t.appendTo&&(n.mirror.parentNode=t.appendTo),n.emitter.on("pointerdown",this.handlePointerDown),n.emitter.on("dragstart",this.handleDragStart),new Ja(n,t.eventData)}destroy(){this.dragging.destroy()}},e.Internal=xo,e.JsonRequestError=Ri,e.Preact=_o,e.ThirdPartyDraggable=class{constructor(e,t){let n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};let r=this.dragging=new Ka(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new Ja(r,t.eventData)}destroy(){this.dragging.destroy()}},e.createPlugin=Po,e.formatDate=function(e,t={}){let n=Ma(t),r=an(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""},e.formatRange=function(e,t,n){let r=Ma("object"==typeof n&&n?n:{}),i=an(n),s=r.createMarkerMeta(e),o=r.createMarkerMeta(t);return s&&o?r.formatRange(s.marker,o.marker,i,{forcedStartTzo:s.forcedTzo,forcedEndTzo:o.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:cn.defaultRangeSeparator}):""},e.globalLocales=To,e.globalPlugins=ca,e.sliceEvents=function(e,t){return ii(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},e.version="6.1.10",Object.defineProperty(e,"__esModule",{value:!0}),e}({}); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap4/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap4/index.global.js deleted file mode 100644 index 006fe22d..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap4/index.global.js +++ /dev/null @@ -1,64 +0,0 @@ -/*! -FullCalendar Bootstrap 4 Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/bootstrap4 -(c) 2022 Adam Shaw -*/ -FullCalendar.Bootstrap = (function (exports, core, internal$1) { - 'use strict'; - - class BootstrapTheme extends internal$1.Theme { - } - BootstrapTheme.prototype.classes = { - root: 'fc-theme-bootstrap', - table: 'table-bordered', - tableCellShaded: 'table-active', - buttonGroup: 'btn-group', - button: 'btn btn-primary', - buttonActive: 'active', - popover: 'popover', - popoverHeader: 'popover-header', - popoverContent: 'popover-body', - }; - BootstrapTheme.prototype.baseIconClass = 'fa'; - BootstrapTheme.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 = { - 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-'; - - var css_248z = ".fc-theme-bootstrap a:not([href]){color:inherit}"; - internal$1.injectStyles(css_248z); - - var plugin = core.createPlugin({ - name: '@fullcalendar/bootstrap', - themeClasses: { - bootstrap: BootstrapTheme, - }, - }); - - var internal = { - __proto__: null, - BootstrapTheme: BootstrapTheme - }; - - core.globalPlugins.push(plugin); - - exports.Internal = internal; - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap4/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap4/index.global.min.js deleted file mode 100644 index d05821ac..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap4/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Bootstrap 4 Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/bootstrap4 -(c) 2022 Adam Shaw -*/ -FullCalendar.Bootstrap=function(e,t,o){"use strict";class r extends o.Theme{}r.prototype.classes={root:"fc-theme-bootstrap",table:"table-bordered",tableCellShaded:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",popover:"popover",popoverHeader:"popover-header",popoverContent:"popover-body"},r.prototype.baseIconClass="fa",r.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},r.prototype.rtlIconClasses={prev:"fa-chevron-right",next:"fa-chevron-left",prevYear:"fa-angle-double-right",nextYear:"fa-angle-double-left"},r.prototype.iconOverrideOption="bootstrapFontAwesome",r.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",r.prototype.iconOverridePrefix="fa-";o.injectStyles(".fc-theme-bootstrap a:not([href]){color:inherit}");var a=t.createPlugin({name:"@fullcalendar/bootstrap",themeClasses:{bootstrap:r}}),l={__proto__:null,BootstrapTheme:r};return t.globalPlugins.push(a),e.Internal=l,e.default=a,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap5/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap5/index.global.js deleted file mode 100644 index 1f234221..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap5/index.global.js +++ /dev/null @@ -1,64 +0,0 @@ -/*! -FullCalendar Bootstrap 5 Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/bootstrap5 -(c) 2022 Adam Shaw -*/ -FullCalendar.Bootstrap5 = (function (exports, core, internal$1) { - 'use strict'; - - class BootstrapTheme extends internal$1.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 css_248z = ".fc-theme-bootstrap5 a:not([href]){color:inherit;text-decoration:inherit}.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 .fc-scrollgrid{border-bottom-width:0;border-right-width:0}.fc-theme-bootstrap5-shaded{background-color:var(--bs-gray-200)}"; - internal$1.injectStyles(css_248z); - - var plugin = core.createPlugin({ - name: '@fullcalendar/bootstrap5', - themeClasses: { - bootstrap5: BootstrapTheme, - }, - }); - - var internal = { - __proto__: null, - BootstrapTheme: BootstrapTheme - }; - - core.globalPlugins.push(plugin); - - exports.Internal = internal; - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap5/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap5/index.global.min.js deleted file mode 100644 index af477d5f..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/bootstrap5/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Bootstrap 5 Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/bootstrap5 -(c) 2022 Adam Shaw -*/ -FullCalendar.Bootstrap5=function(e,t,o){"use strict";class r extends o.Theme{}r.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"},r.prototype.baseIconClass="bi",r.prototype.iconClasses={close:"bi-x-lg",prev:"bi-chevron-left",next:"bi-chevron-right",prevYear:"bi-chevron-double-left",nextYear:"bi-chevron-double-right"},r.prototype.rtlIconClasses={prev:"bi-chevron-right",next:"bi-chevron-left",prevYear:"bi-chevron-double-right",nextYear:"bi-chevron-double-left"},r.prototype.iconOverrideOption="buttonIcons",r.prototype.iconOverrideCustomButtonOption="icon",r.prototype.iconOverridePrefix="bi-";o.injectStyles(".fc-theme-bootstrap5 a:not([href]){color:inherit;text-decoration:inherit}.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 .fc-scrollgrid{border-bottom-width:0;border-right-width:0}.fc-theme-bootstrap5-shaded{background-color:var(--bs-gray-200)}");var a=t.createPlugin({name:"@fullcalendar/bootstrap5",themeClasses:{bootstrap5:r}}),n={__proto__:null,BootstrapTheme:r};return t.globalPlugins.push(a),e.Internal=n,e.default=a,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/index.global.js deleted file mode 100644 index a5a97c64..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/index.global.js +++ /dev/null @@ -1,9608 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -var FullCalendar = (function (exports) { - 'use strict'; - - function removeElement(el) { - if (el.parentNode) { - el.parentNode.removeChild(el); - } - } - // Querying - // ---------------------------------------------------------------------------------------------------------------- - function elementClosest(el, selector) { - if (el.closest) { - return el.closest(selector); - // really bad fallback for IE - // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest - } - if (!document.documentElement.contains(el)) { - return null; - } - do { - if (elementMatches(el, selector)) { - return el; - } - el = (el.parentElement || el.parentNode); - } while (el !== null && el.nodeType === 1); - return null; - } - function elementMatches(el, selector) { - let method = el.matches || el.matchesSelector || el.msMatchesSelector; - return method.call(el, selector); - } - // accepts multiple subject els - // returns a real array. good for methods like forEach - // TODO: accept the document - function findElements(container, selector) { - let containers = container instanceof HTMLElement ? [container] : container; - let allMatches = []; - for (let i = 0; i < containers.length; i += 1) { - let matches = containers[i].querySelectorAll(selector); - for (let j = 0; j < matches.length; j += 1) { - allMatches.push(matches[j]); - } - } - return allMatches; - } - // accepts multiple subject els - // only queries direct child elements // TODO: rename to findDirectChildren! - function findDirectChildren(parent, selector) { - let parents = parent instanceof HTMLElement ? [parent] : parent; - let allMatches = []; - for (let i = 0; i < parents.length; i += 1) { - let childNodes = parents[i].children; // only ever elements - for (let j = 0; j < childNodes.length; j += 1) { - let childNode = childNodes[j]; - if (!selector || elementMatches(childNode, selector)) { - allMatches.push(childNode); - } - } - } - return allMatches; - } - // Style - // ---------------------------------------------------------------------------------------------------------------- - const PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i; - function applyStyle(el, props) { - for (let propName in props) { - applyStyleProp(el, propName, props[propName]); - } - } - function applyStyleProp(el, name, val) { - if (val == null) { - el.style[name] = ''; - } - else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) { - el.style[name] = `${val}px`; - } - else { - el.style[name] = val; - } - } - // Event Handling - // ---------------------------------------------------------------------------------------------------------------- - // if intercepting bubbled events at the document/window/body level, - // and want to see originating element (the 'target'), use this util instead - // of `ev.target` because it goes within web-component boundaries. - function getEventTargetViaRoot(ev) { - var _a, _b; - return (_b = (_a = ev.composedPath) === null || _a === void 0 ? void 0 : _a.call(ev)[0]) !== null && _b !== void 0 ? _b : ev.target; - } - // Shadow DOM consuderations - // ---------------------------------------------------------------------------------------------------------------- - function getElRoot(el) { - return el.getRootNode ? el.getRootNode() : document; - } - // Unique ID for DOM attribute - let guid$1 = 0; - function getUniqueDomId() { - guid$1 += 1; - return 'fc-dom-' + guid$1; - } - - // Stops a mouse/touch event from doing it's native browser action - function preventDefault(ev) { - ev.preventDefault(); - } - // Event Delegation - // ---------------------------------------------------------------------------------------------------------------- - function buildDelegationHandler(selector, handler) { - return (ev) => { - let matchedChild = elementClosest(ev.target, selector); - if (matchedChild) { - handler.call(matchedChild, ev, matchedChild); - } - }; - } - function listenBySelector(container, eventType, selector, handler) { - let attachedHandler = buildDelegationHandler(selector, handler); - container.addEventListener(eventType, attachedHandler); - return () => { - container.removeEventListener(eventType, attachedHandler); - }; - } - function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) { - let currentMatchedChild; - return listenBySelector(container, 'mouseover', selector, (mouseOverEv, matchedChild) => { - if (matchedChild !== currentMatchedChild) { - currentMatchedChild = matchedChild; - onMouseEnter(mouseOverEv, matchedChild); - let realOnMouseLeave = (mouseLeaveEv) => { - currentMatchedChild = null; - onMouseLeave(mouseLeaveEv, matchedChild); - matchedChild.removeEventListener('mouseleave', realOnMouseLeave); - }; - // listen to the next mouseleave, and then unattach - matchedChild.addEventListener('mouseleave', realOnMouseLeave); - } - }); - } - // Animation - // ---------------------------------------------------------------------------------------------------------------- - const transitionEventNames = [ - 'webkitTransitionEnd', - 'otransitionend', - 'oTransitionEnd', - 'msTransitionEnd', - 'transitionend', - ]; - // triggered only when the next single subsequent transition finishes - function whenTransitionDone(el, callback) { - let realCallback = (ev) => { - callback(ev); - transitionEventNames.forEach((eventName) => { - el.removeEventListener(eventName, realCallback); - }); - }; - transitionEventNames.forEach((eventName) => { - el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes - }); - } - // ARIA workarounds - // ---------------------------------------------------------------------------------------------------------------- - function createAriaClickAttrs(handler) { - return Object.assign({ onClick: handler }, createAriaKeyboardAttrs(handler)); - } - function createAriaKeyboardAttrs(handler) { - return { - tabIndex: 0, - onKeyDown(ev) { - if (ev.key === 'Enter' || ev.key === ' ') { - handler(ev); - ev.preventDefault(); // if space, don't scroll down page - } - }, - }; - } - - let guidNumber = 0; - function guid() { - guidNumber += 1; - return String(guidNumber); - } - /* FullCalendar-specific DOM Utilities - ----------------------------------------------------------------------------------------------------------------------*/ - // Make the mouse cursor express that an event is not allowed in the current area - function disableCursor() { - document.body.classList.add('fc-not-allowed'); - } - // Returns the mouse cursor to its original look - function enableCursor() { - document.body.classList.remove('fc-not-allowed'); - } - /* Selection - ----------------------------------------------------------------------------------------------------------------------*/ - function preventSelection(el) { - el.classList.add('fc-unselectable'); - el.addEventListener('selectstart', preventDefault); - } - function allowSelection(el) { - el.classList.remove('fc-unselectable'); - el.removeEventListener('selectstart', preventDefault); - } - /* Context Menu - ----------------------------------------------------------------------------------------------------------------------*/ - function preventContextMenu(el) { - el.addEventListener('contextmenu', preventDefault); - } - function allowContextMenu(el) { - el.removeEventListener('contextmenu', preventDefault); - } - function parseFieldSpecs(input) { - let specs = []; - let tokens = []; - let i; - let token; - if (typeof input === 'string') { - tokens = input.split(/\s*,\s*/); - } - else if (typeof input === 'function') { - tokens = [input]; - } - else if (Array.isArray(input)) { - tokens = input; - } - for (i = 0; i < tokens.length; i += 1) { - token = tokens[i]; - if (typeof token === 'string') { - specs.push(token.charAt(0) === '-' ? - { field: token.substring(1), order: -1 } : - { field: token, order: 1 }); - } - else if (typeof token === 'function') { - specs.push({ func: token }); - } - } - return specs; - } - function compareByFieldSpecs(obj0, obj1, fieldSpecs) { - let i; - let cmp; - for (i = 0; i < fieldSpecs.length; i += 1) { - cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]); - if (cmp) { - return cmp; - } - } - return 0; - } - function compareByFieldSpec(obj0, obj1, fieldSpec) { - if (fieldSpec.func) { - return fieldSpec.func(obj0, obj1); - } - return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field]) - * (fieldSpec.order || 1); - } - function flexibleCompare(a, b) { - if (!a && !b) { - return 0; - } - if (b == null) { - return -1; - } - if (a == null) { - return 1; - } - if (typeof a === 'string' || typeof b === 'string') { - return String(a).localeCompare(String(b)); - } - return a - b; - } - /* String Utilities - ----------------------------------------------------------------------------------------------------------------------*/ - function padStart(val, len) { - let s = String(val); - return '000'.substr(0, len - s.length) + s; - } - function formatWithOrdinals(formatter, args, fallbackText) { - if (typeof formatter === 'function') { - return formatter(...args); - } - if (typeof formatter === 'string') { // non-blank string - return args.reduce((str, arg, index) => (str.replace('$' + index, arg || '')), formatter); - } - return fallbackText; - } - /* Number Utilities - ----------------------------------------------------------------------------------------------------------------------*/ - function compareNumbers(a, b) { - return a - b; - } - function isInt(n) { - return n % 1 === 0; - } - /* FC-specific DOM dimension stuff - ----------------------------------------------------------------------------------------------------------------------*/ - function computeSmallestCellWidth(cellEl) { - let allWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-frame'); - let contentWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-cushion'); - if (!allWidthEl) { - throw new Error('needs fc-scrollgrid-shrink-frame className'); // TODO: use const - } - if (!contentWidthEl) { - throw new Error('needs fc-scrollgrid-shrink-cushion className'); - } - return cellEl.getBoundingClientRect().width - allWidthEl.getBoundingClientRect().width + // the cell padding+border - contentWidthEl.getBoundingClientRect().width; - } - - const INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds']; - const PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/; - // Parsing and Creation - function createDuration(input, unit) { - if (typeof input === 'string') { - return parseString(input); - } - if (typeof input === 'object' && input) { // non-null object - return parseObject(input); - } - if (typeof input === 'number') { - return parseObject({ [unit || 'milliseconds']: input }); - } - return null; - } - function parseString(s) { - let m = PARSE_RE.exec(s); - if (m) { - let sign = m[1] ? -1 : 1; - return { - years: 0, - months: 0, - days: sign * (m[2] ? parseInt(m[2], 10) : 0), - milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours - (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes - (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds - (m[6] ? parseInt(m[6], 10) : 0) // ms - ), - }; - } - return null; - } - function parseObject(obj) { - let duration = { - years: obj.years || obj.year || 0, - months: obj.months || obj.month || 0, - days: obj.days || obj.day || 0, - milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours - (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes - (obj.seconds || obj.second || 0) * 1000 + // seconds - (obj.milliseconds || obj.millisecond || obj.ms || 0), // ms - }; - let weeks = obj.weeks || obj.week; - if (weeks) { - duration.days += weeks * 7; - duration.specifiedWeeks = true; - } - return duration; - } - // Equality - function durationsEqual(d0, d1) { - return d0.years === d1.years && - d0.months === d1.months && - d0.days === d1.days && - d0.milliseconds === d1.milliseconds; - } - function asCleanDays(dur) { - if (!dur.years && !dur.months && !dur.milliseconds) { - return dur.days; - } - return 0; - } - // Simple Math - function addDurations(d0, d1) { - return { - years: d0.years + d1.years, - months: d0.months + d1.months, - days: d0.days + d1.days, - milliseconds: d0.milliseconds + d1.milliseconds, - }; - } - function subtractDurations(d1, d0) { - return { - years: d1.years - d0.years, - months: d1.months - d0.months, - days: d1.days - d0.days, - milliseconds: d1.milliseconds - d0.milliseconds, - }; - } - function multiplyDuration(d, n) { - return { - years: d.years * n, - months: d.months * n, - days: d.days * n, - milliseconds: d.milliseconds * n, - }; - } - // Conversions - // "Rough" because they are based on average-case Gregorian months/years - function asRoughYears(dur) { - return asRoughDays(dur) / 365; - } - function asRoughMonths(dur) { - return asRoughDays(dur) / 30; - } - function asRoughDays(dur) { - return asRoughMs(dur) / 864e5; - } - function asRoughMinutes(dur) { - return asRoughMs(dur) / (1000 * 60); - } - function asRoughSeconds(dur) { - return asRoughMs(dur) / 1000; - } - function asRoughMs(dur) { - return dur.years * (365 * 864e5) + - dur.months * (30 * 864e5) + - dur.days * 864e5 + - dur.milliseconds; - } - // Advanced Math - function wholeDivideDurations(numerator, denominator) { - let res = null; - for (let i = 0; i < INTERNAL_UNITS.length; i += 1) { - let unit = INTERNAL_UNITS[i]; - if (denominator[unit]) { - let localRes = numerator[unit] / denominator[unit]; - if (!isInt(localRes) || (res !== null && res !== localRes)) { - return null; - } - res = localRes; - } - else if (numerator[unit]) { - // needs to divide by something but can't! - return null; - } - } - return res; - } - function greatestDurationDenominator(dur) { - let ms = dur.milliseconds; - if (ms) { - if (ms % 1000 !== 0) { - return { unit: 'millisecond', value: ms }; - } - if (ms % (1000 * 60) !== 0) { - return { unit: 'second', value: ms / 1000 }; - } - if (ms % (1000 * 60 * 60) !== 0) { - return { unit: 'minute', value: ms / (1000 * 60) }; - } - if (ms) { - return { unit: 'hour', value: ms / (1000 * 60 * 60) }; - } - } - if (dur.days) { - if (dur.specifiedWeeks && dur.days % 7 === 0) { - return { unit: 'week', value: dur.days / 7 }; - } - return { unit: 'day', value: dur.days }; - } - if (dur.months) { - return { unit: 'month', value: dur.months }; - } - if (dur.years) { - return { unit: 'year', value: dur.years }; - } - return { unit: 'millisecond', value: 0 }; - } - - const { hasOwnProperty } = Object.prototype; - // Merges an array of objects into a single object. - // The second argument allows for an array of property names who's object values will be merged together. - function mergeProps(propObjs, complexPropsMap) { - let dest = {}; - if (complexPropsMap) { - for (let name in complexPropsMap) { - let complexObjs = []; - // collect the trailing object values, stopping when a non-object is discovered - for (let i = propObjs.length - 1; i >= 0; i -= 1) { - let val = propObjs[i][name]; - if (typeof val === 'object' && val) { // non-null object - complexObjs.unshift(val); - } - else if (val !== undefined) { - dest[name] = val; // if there were no objects, this value will be used - break; - } - } - // if the trailing values were objects, use the merged value - if (complexObjs.length) { - dest[name] = mergeProps(complexObjs); - } - } - } - // copy values into the destination, going from last to first - for (let i = propObjs.length - 1; i >= 0; i -= 1) { - let props = propObjs[i]; - for (let name in props) { - if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign - dest[name] = props[name]; - } - } - } - return dest; - } - function filterHash(hash, func) { - let filtered = {}; - for (let key in hash) { - if (func(hash[key], key)) { - filtered[key] = hash[key]; - } - } - return filtered; - } - function mapHash(hash, func) { - let newHash = {}; - for (let key in hash) { - newHash[key] = func(hash[key], key); - } - return newHash; - } - function arrayToHash(a) { - let hash = {}; - for (let item of a) { - hash[item] = true; - } - return hash; - } - // TODO: reassess browser support - // https://caniuse.com/?search=object.values - function hashValuesToArray(obj) { - let a = []; - for (let key in obj) { - a.push(obj[key]); - } - return a; - } - function isPropsEqual(obj0, obj1) { - if (obj0 === obj1) { - return true; - } - for (let key in obj0) { - if (hasOwnProperty.call(obj0, key)) { - if (!(key in obj1)) { - return false; - } - } - } - for (let key in obj1) { - if (hasOwnProperty.call(obj1, key)) { - if (obj0[key] !== obj1[key]) { - return false; - } - } - } - return true; - } - function getUnequalProps(obj0, obj1) { - let keys = []; - for (let key in obj0) { - if (hasOwnProperty.call(obj0, key)) { - if (!(key in obj1)) { - keys.push(key); - } - } - } - for (let key in obj1) { - if (hasOwnProperty.call(obj1, key)) { - if (obj0[key] !== obj1[key]) { - keys.push(key); - } - } - } - return keys; - } - function compareObjs(oldProps, newProps, equalityFuncs = {}) { - if (oldProps === newProps) { - return true; - } - for (let key in newProps) { - if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ; - else { - return false; - } - } - // check for props that were omitted in the new - for (let key in oldProps) { - if (!(key in newProps)) { - return false; - } - } - return true; - } - /* - assumed "true" equality for handler names like "onReceiveSomething" - */ - function isObjValsEqual(val0, val1, comparator) { - if (val0 === val1 || comparator === true) { - return true; - } - if (comparator) { - return comparator(val0, val1); - } - return false; - } - function collectFromHash(hash, startIndex = 0, endIndex, step = 1) { - let res = []; - if (endIndex == null) { - endIndex = Object.keys(hash).length; - } - for (let i = startIndex; i < endIndex; i += step) { - let val = hash[i]; - if (val !== undefined) { // will disregard undefined for sparse arrays - res.push(val); - } - } - return res; - } - - const DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; - // Adding - function addWeeks(m, n) { - let a = dateToUtcArray(m); - a[2] += n * 7; - return arrayToUtcDate(a); - } - function addDays(m, n) { - let a = dateToUtcArray(m); - a[2] += n; - return arrayToUtcDate(a); - } - function addMs(m, n) { - let a = dateToUtcArray(m); - a[6] += n; - return arrayToUtcDate(a); - } - // Diffing (all return floats) - // TODO: why not use ranges? - function diffWeeks(m0, m1) { - return diffDays(m0, m1) / 7; - } - function diffDays(m0, m1) { - return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24); - } - function diffHours(m0, m1) { - return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60); - } - function diffMinutes(m0, m1) { - return (m1.valueOf() - m0.valueOf()) / (1000 * 60); - } - function diffSeconds(m0, m1) { - return (m1.valueOf() - m0.valueOf()) / 1000; - } - function diffDayAndTime(m0, m1) { - let m0day = startOfDay(m0); - let m1day = startOfDay(m1); - return { - years: 0, - months: 0, - days: Math.round(diffDays(m0day, m1day)), - milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf()), - }; - } - // Diffing Whole Units - function diffWholeWeeks(m0, m1) { - let d = diffWholeDays(m0, m1); - if (d !== null && d % 7 === 0) { - return d / 7; - } - return null; - } - function diffWholeDays(m0, m1) { - if (timeAsMs(m0) === timeAsMs(m1)) { - return Math.round(diffDays(m0, m1)); - } - return null; - } - // Start-Of - function startOfDay(m) { - return arrayToUtcDate([ - m.getUTCFullYear(), - m.getUTCMonth(), - m.getUTCDate(), - ]); - } - function startOfHour(m) { - return arrayToUtcDate([ - m.getUTCFullYear(), - m.getUTCMonth(), - m.getUTCDate(), - m.getUTCHours(), - ]); - } - function startOfMinute(m) { - return arrayToUtcDate([ - m.getUTCFullYear(), - m.getUTCMonth(), - m.getUTCDate(), - m.getUTCHours(), - m.getUTCMinutes(), - ]); - } - function startOfSecond(m) { - return arrayToUtcDate([ - m.getUTCFullYear(), - m.getUTCMonth(), - m.getUTCDate(), - m.getUTCHours(), - m.getUTCMinutes(), - m.getUTCSeconds(), - ]); - } - // Week Computation - function weekOfYear(marker, dow, doy) { - let y = marker.getUTCFullYear(); - let w = weekOfGivenYear(marker, y, dow, doy); - if (w < 1) { - return weekOfGivenYear(marker, y - 1, dow, doy); - } - let nextW = weekOfGivenYear(marker, y + 1, dow, doy); - if (nextW >= 1) { - return Math.min(w, nextW); - } - return w; - } - function weekOfGivenYear(marker, year, dow, doy) { - let firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]); - let dayStart = startOfDay(marker); - let days = Math.round(diffDays(firstWeekStart, dayStart)); - return Math.floor(days / 7) + 1; // zero-indexed - } - // start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - // first-week day -- which january is always in the first week (4 for iso, 1 for other) - let fwd = 7 + dow - doy; - // first-week day local weekday -- which local weekday is fwd - let fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7; - return -fwdlw + fwd - 1; - } - // Array Conversion - function dateToLocalArray(date) { - return [ - date.getFullYear(), - date.getMonth(), - date.getDate(), - date.getHours(), - date.getMinutes(), - date.getSeconds(), - date.getMilliseconds(), - ]; - } - function arrayToLocalDate(a) { - return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month - a[3] || 0, a[4] || 0, a[5] || 0); - } - function dateToUtcArray(date) { - return [ - date.getUTCFullYear(), - date.getUTCMonth(), - date.getUTCDate(), - date.getUTCHours(), - date.getUTCMinutes(), - date.getUTCSeconds(), - date.getUTCMilliseconds(), - ]; - } - function arrayToUtcDate(a) { - // according to web standards (and Safari), a month index is required. - // massage if only given a year. - if (a.length === 1) { - a = a.concat([0]); - } - return new Date(Date.UTC(...a)); - } - // Other Utils - function isValidDate(m) { - return !isNaN(m.valueOf()); - } - function timeAsMs(m) { - return m.getUTCHours() * 1000 * 60 * 60 + - m.getUTCMinutes() * 1000 * 60 + - m.getUTCSeconds() * 1000 + - m.getUTCMilliseconds(); - } - - // timeZoneOffset is in minutes - function buildIsoString(marker, timeZoneOffset, stripZeroTime = false) { - let s = marker.toISOString(); - s = s.replace('.000', ''); - if (stripZeroTime) { - s = s.replace('T00:00:00Z', ''); - } - if (s.length > 10) { // time part wasn't stripped, can add timezone info - if (timeZoneOffset == null) { - s = s.replace('Z', ''); - } - else if (timeZoneOffset !== 0) { - s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); - } - // otherwise, its UTC-0 and we want to keep the Z - } - return s; - } - // formats the date, but with no time part - // TODO: somehow merge with buildIsoString and stripZeroTime - // TODO: rename. omit "string" - function formatDayString(marker) { - return marker.toISOString().replace(/T.*$/, ''); - } - // TODO: use Date::toISOString and use everything after the T? - function formatIsoTimeString(marker) { - return padStart(marker.getUTCHours(), 2) + ':' + - padStart(marker.getUTCMinutes(), 2) + ':' + - padStart(marker.getUTCSeconds(), 2); - } - function formatTimeZoneOffset(minutes, doIso = false) { - let sign = minutes < 0 ? '-' : '+'; - let abs = Math.abs(minutes); - let hours = Math.floor(abs / 60); - let mins = Math.round(abs % 60); - if (doIso) { - return `${sign + padStart(hours, 2)}:${padStart(mins, 2)}`; - } - return `GMT${sign}${hours}${mins ? `:${padStart(mins, 2)}` : ''}`; - } - - // TODO: new util arrayify? - function removeExact(array, exactVal) { - let removeCnt = 0; - let i = 0; - while (i < array.length) { - if (array[i] === exactVal) { - array.splice(i, 1); - removeCnt += 1; - } - else { - i += 1; - } - } - return removeCnt; - } - function isArraysEqual(a0, a1, equalityFunc) { - if (a0 === a1) { - return true; - } - let len = a0.length; - let i; - if (len !== a1.length) { // not array? or not same length? - return false; - } - for (i = 0; i < len; i += 1) { - if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) { - return false; - } - } - return true; - } - - function memoize(workerFunc, resEquality, teardownFunc) { - let currentArgs; - let currentRes; - return function (...newArgs) { - if (!currentArgs) { - currentRes = workerFunc.apply(this, newArgs); - } - else if (!isArraysEqual(currentArgs, newArgs)) { - if (teardownFunc) { - teardownFunc(currentRes); - } - let res = workerFunc.apply(this, newArgs); - if (!resEquality || !resEquality(res, currentRes)) { - currentRes = res; - } - } - currentArgs = newArgs; - return currentRes; - }; - } - function memoizeObjArg(workerFunc, resEquality, teardownFunc) { - let currentArg; - let currentRes; - return (newArg) => { - if (!currentArg) { - currentRes = workerFunc.call(this, newArg); - } - else if (!isPropsEqual(currentArg, newArg)) { - if (teardownFunc) { - teardownFunc(currentRes); - } - let res = workerFunc.call(this, newArg); - if (!resEquality || !resEquality(res, currentRes)) { - currentRes = res; - } - } - currentArg = newArg; - return currentRes; - }; - } - function memoizeArraylike(// used at all? - workerFunc, resEquality, teardownFunc) { - let currentArgSets = []; - let currentResults = []; - return (newArgSets) => { - let currentLen = currentArgSets.length; - let newLen = newArgSets.length; - let i = 0; - for (; i < currentLen; i += 1) { - if (!newArgSets[i]) { // one of the old sets no longer exists - if (teardownFunc) { - teardownFunc(currentResults[i]); - } - } - else if (!isArraysEqual(currentArgSets[i], newArgSets[i])) { - if (teardownFunc) { - teardownFunc(currentResults[i]); - } - let res = workerFunc.apply(this, newArgSets[i]); - if (!resEquality || !resEquality(res, currentResults[i])) { - currentResults[i] = res; - } - } - } - for (; i < newLen; i += 1) { - currentResults[i] = workerFunc.apply(this, newArgSets[i]); - } - currentArgSets = newArgSets; - currentResults.splice(newLen); // remove excess - return currentResults; - }; - } - function memoizeHashlike(workerFunc, resEquality, teardownFunc) { - let currentArgHash = {}; - let currentResHash = {}; - return (newArgHash) => { - let newResHash = {}; - for (let key in newArgHash) { - if (!currentResHash[key]) { - newResHash[key] = workerFunc.apply(this, newArgHash[key]); - } - else if (!isArraysEqual(currentArgHash[key], newArgHash[key])) { - if (teardownFunc) { - teardownFunc(currentResHash[key]); - } - let res = workerFunc.apply(this, newArgHash[key]); - newResHash[key] = (resEquality && resEquality(res, currentResHash[key])) - ? currentResHash[key] - : res; - } - else { - newResHash[key] = currentResHash[key]; - } - } - currentArgHash = newArgHash; - currentResHash = newResHash; - return newResHash; - }; - } - - const EXTENDED_SETTINGS_AND_SEVERITIES = { - week: 3, - separator: 0, - omitZeroMinute: 0, - meridiem: 0, - omitCommas: 0, - }; - const STANDARD_DATE_PROP_SEVERITIES = { - timeZoneName: 7, - era: 6, - year: 5, - month: 4, - day: 2, - weekday: 2, - hour: 1, - minute: 1, - second: 1, - }; - const MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too - const COMMA_RE = /,/g; // we need re for globalness - const MULTI_SPACE_RE = /\s+/g; - const LTR_RE = /\u200e/g; // control character - const UTC_RE = /UTC|GMT/; - class NativeFormatter { - constructor(formatSettings) { - let standardDateProps = {}; - let extendedSettings = {}; - let severity = 0; - for (let name in formatSettings) { - if (name in EXTENDED_SETTINGS_AND_SEVERITIES) { - extendedSettings[name] = formatSettings[name]; - severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name], severity); - } - else { - standardDateProps[name] = formatSettings[name]; - if (name in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity - severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name], severity); - } - } - } - this.standardDateProps = standardDateProps; - this.extendedSettings = extendedSettings; - this.severity = severity; - this.buildFormattingFunc = memoize(buildFormattingFunc); - } - format(date, context) { - return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date); - } - formatRange(start, end, context, betterDefaultSeparator) { - let { standardDateProps, extendedSettings } = this; - let diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem); - if (!diffSeverity) { - return this.format(start, context); - } - let biggestUnitForPartial = diffSeverity; - if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time - (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') && - (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') && - (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) { - biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time - } - let full0 = this.format(start, context); - let full1 = this.format(end, context); - if (full0 === full1) { - return full0; - } - let partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial); - let partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context); - let partial0 = partialFormattingFunc(start); - let partial1 = partialFormattingFunc(end); - let insertion = findCommonInsertion(full0, partial0, full1, partial1); - let separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || ''; - if (insertion) { - return insertion.before + partial0 + separator + partial1 + insertion.after; - } - return full0 + separator + full1; - } - getLargestUnit() { - 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'; // really? - } - } - } - function buildFormattingFunc(standardDateProps, extendedSettings, context) { - let standardDatePropCnt = Object.keys(standardDateProps).length; - if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') { - return (date) => (formatTimeZoneOffset(date.timeZoneOffset)); - } - if (standardDatePropCnt === 0 && extendedSettings.week) { - return (date) => (formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week)); - } - return buildNativeFormattingFunc(standardDateProps, extendedSettings, context); - } - function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) { - standardDateProps = Object.assign({}, standardDateProps); // copy - extendedSettings = Object.assign({}, extendedSettings); // copy - sanitizeSettings(standardDateProps, extendedSettings); - standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers - let normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps); - let zeroFormat; // needed? - if (extendedSettings.omitZeroMinute) { - let zeroProps = Object.assign({}, standardDateProps); - delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings - zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps); - } - return (date) => { - let { marker } = date; - let format; - if (zeroFormat && !marker.getUTCMinutes()) { - format = zeroFormat; - } - else { - format = normalFormat; - } - let s = format.format(marker); - return postProcess(s, date, standardDateProps, extendedSettings, context); - }; - } - function sanitizeSettings(standardDateProps, extendedSettings) { - // deal with a browser inconsistency where formatting the timezone - // requires that the hour/minute be present. - if (standardDateProps.timeZoneName) { - if (!standardDateProps.hour) { - standardDateProps.hour = '2-digit'; - } - if (!standardDateProps.minute) { - standardDateProps.minute = '2-digit'; - } - } - // only support short timezone names - if (standardDateProps.timeZoneName === 'long') { - standardDateProps.timeZoneName = 'short'; - } - // if requesting to display seconds, MUST display minutes - if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) { - delete extendedSettings.omitZeroMinute; - } - } - function postProcess(s, date, standardDateProps, extendedSettings, context) { - s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes - if (standardDateProps.timeZoneName === 'short') { - s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ? - 'UTC' : // important to normalize for IE, which does "GMT" - formatTimeZoneOffset(date.timeZoneOffset)); - } - if (extendedSettings.omitCommas) { - s = s.replace(COMMA_RE, '').trim(); - } - if (extendedSettings.omitZeroMinute) { - s = s.replace(':00', ''); // zeroFormat doesn't always achieve this - } - // ^ do anything that might create adjacent spaces before this point, - // because MERIDIEM_RE likes to eat up loading spaces - if (extendedSettings.meridiem === false) { - s = s.replace(MERIDIEM_RE, '').trim(); - } - else if (extendedSettings.meridiem === 'narrow') { // a/p - s = s.replace(MERIDIEM_RE, (m0, m1) => m1.toLocaleLowerCase()); - } - else if (extendedSettings.meridiem === 'short') { // am/pm - s = s.replace(MERIDIEM_RE, (m0, m1) => `${m1.toLocaleLowerCase()}m`); - } - else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase - s = s.replace(MERIDIEM_RE, (m0) => m0.toLocaleLowerCase()); - } - s = s.replace(MULTI_SPACE_RE, ' '); - s = s.trim(); - return s; - } - function injectTzoStr(s, tzoStr) { - let replaced = false; - s = s.replace(UTC_RE, () => { - replaced = true; - return tzoStr; - }); - // IE11 doesn't include UTC/GMT in the original string, so append to end - if (!replaced) { - s += ` ${tzoStr}`; - } - return s; - } - function formatWeekNumber(num, weekText, weekTextLong, locale, display) { - let parts = []; - if (display === 'long') { - parts.push(weekTextLong); - } - else if (display === 'short' || display === 'narrow') { - parts.push(weekText); - } - if (display === 'long' || display === 'short') { - parts.push(' '); - } - parts.push(locale.simpleNumberFormat.format(num)); - if (locale.options.direction === 'rtl') { // TODO: use control characters instead? - parts.reverse(); - } - return parts.join(''); - } - // Range Formatting Utils - // 0 = exactly the same - // 1 = different by time - // and bigger - function computeMarkerDiffSeverity(d0, d1, ca) { - if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) { - return 5; - } - if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) { - return 4; - } - if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) { - return 2; - } - if (timeAsMs(d0) !== timeAsMs(d1)) { - return 1; - } - return 0; - } - function computePartialFormattingOptions(options, biggestUnit) { - let partialOptions = {}; - for (let name in options) { - if (!(name in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone) - STANDARD_DATE_PROP_SEVERITIES[name] <= biggestUnit) { - partialOptions[name] = options[name]; - } - } - return partialOptions; - } - function findCommonInsertion(full0, partial0, full1, partial1) { - let i0 = 0; - while (i0 < full0.length) { - let found0 = full0.indexOf(partial0, i0); - if (found0 === -1) { - break; - } - let before0 = full0.substr(0, found0); - i0 = found0 + partial0.length; - let after0 = full0.substr(i0); - let i1 = 0; - while (i1 < full1.length) { - let found1 = full1.indexOf(partial1, i1); - if (found1 === -1) { - break; - } - let before1 = full1.substr(0, found1); - i1 = found1 + partial1.length; - let after1 = full1.substr(i1); - if (before0 === before1 && after0 === after1) { - return { - before: before0, - after: after0, - }; - } - } - } - return null; - } - - function expandZonedMarker(dateInfo, calendarSystem) { - let a = calendarSystem.markerToArray(dateInfo.marker); - return { - marker: dateInfo.marker, - timeZoneOffset: dateInfo.timeZoneOffset, - array: a, - year: a[0], - month: a[1], - day: a[2], - hour: a[3], - minute: a[4], - second: a[5], - millisecond: a[6], - }; - } - - function createVerboseFormattingArg(start, end, context, betterDefaultSeparator) { - let startInfo = expandZonedMarker(start, context.calendarSystem); - let endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null; - return { - date: startInfo, - start: startInfo, - end: endInfo, - timeZone: context.timeZone, - localeCodes: context.locale.codes, - defaultSeparator: betterDefaultSeparator || context.defaultSeparator, - }; - } - - /* - TODO: fix the terminology of "formatter" vs "formatting func" - */ - /* - At the time of instantiation, this object does not know which cmd-formatting system it will use. - It receives this at the time of formatting, as a setting. - */ - class CmdFormatter { - constructor(cmdStr) { - this.cmdStr = cmdStr; - } - format(date, context, betterDefaultSeparator) { - return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); - } - formatRange(start, end, context, betterDefaultSeparator) { - return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); - } - } - - class FuncFormatter { - constructor(func) { - this.func = func; - } - format(date, context, betterDefaultSeparator) { - return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); - } - formatRange(start, end, context, betterDefaultSeparator) { - return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); - } - } - - function createFormatter(input) { - if (typeof input === 'object' && input) { // non-null object - return new NativeFormatter(input); - } - if (typeof input === 'string') { - return new CmdFormatter(input); - } - if (typeof input === 'function') { - return new FuncFormatter(input); - } - return null; - } - - // base options - // ------------ - const BASE_OPTION_REFINERS = { - navLinkDayClick: identity, - navLinkWeekClick: identity, - duration: createDuration, - bootstrapFontAwesome: identity, - buttonIcons: identity, - customButtons: identity, - defaultAllDayEventDuration: createDuration, - defaultTimedEventDuration: createDuration, - nextDayThreshold: createDuration, - scrollTime: createDuration, - scrollTimeReset: Boolean, - slotMinTime: createDuration, - slotMaxTime: createDuration, - dayPopoverFormat: createFormatter, - slotDuration: createDuration, - snapDuration: createDuration, - headerToolbar: identity, - footerToolbar: identity, - defaultRangeSeparator: String, - titleRangeSeparator: String, - forceEventDuration: Boolean, - dayHeaders: Boolean, - dayHeaderFormat: createFormatter, - dayHeaderClassNames: identity, - dayHeaderContent: identity, - dayHeaderDidMount: identity, - dayHeaderWillUnmount: identity, - dayCellClassNames: identity, - dayCellContent: identity, - dayCellDidMount: identity, - dayCellWillUnmount: identity, - initialView: String, - aspectRatio: Number, - weekends: Boolean, - weekNumberCalculation: identity, - weekNumbers: Boolean, - weekNumberClassNames: identity, - weekNumberContent: identity, - weekNumberDidMount: identity, - weekNumberWillUnmount: identity, - editable: Boolean, - viewClassNames: identity, - viewDidMount: identity, - viewWillUnmount: identity, - nowIndicator: Boolean, - nowIndicatorClassNames: identity, - nowIndicatorContent: identity, - nowIndicatorDidMount: identity, - nowIndicatorWillUnmount: identity, - showNonCurrentDates: Boolean, - lazyFetching: Boolean, - startParam: String, - endParam: String, - timeZoneParam: String, - timeZone: String, - locales: identity, - locale: identity, - themeSystem: String, - dragRevertDuration: Number, - dragScroll: Boolean, - allDayMaintainDuration: Boolean, - unselectAuto: Boolean, - dropAccept: identity, - eventOrder: parseFieldSpecs, - eventOrderStrict: Boolean, - handleWindowResize: Boolean, - windowResizeDelay: Number, - longPressDelay: Number, - eventDragMinDistance: Number, - expandRows: Boolean, - height: identity, - contentHeight: identity, - direction: String, - weekNumberFormat: createFormatter, - eventResizableFromStart: Boolean, - displayEventTime: Boolean, - displayEventEnd: Boolean, - weekText: String, - weekTextLong: String, - progressiveEventRendering: Boolean, - businessHours: identity, - initialDate: identity, - now: identity, - eventDataTransform: identity, - stickyHeaderDates: identity, - stickyFooterScrollbar: identity, - viewHeight: identity, - defaultAllDay: Boolean, - eventSourceFailure: identity, - eventSourceSuccess: identity, - eventDisplay: String, - eventStartEditable: Boolean, - eventDurationEditable: Boolean, - eventOverlap: identity, - eventConstraint: identity, - eventAllow: identity, - eventBackgroundColor: String, - eventBorderColor: String, - eventTextColor: String, - eventColor: String, - eventClassNames: identity, - eventContent: identity, - eventDidMount: identity, - eventWillUnmount: identity, - selectConstraint: identity, - selectOverlap: identity, - selectAllow: identity, - droppable: Boolean, - unselectCancel: String, - slotLabelFormat: identity, - slotLaneClassNames: identity, - slotLaneContent: identity, - slotLaneDidMount: identity, - slotLaneWillUnmount: identity, - slotLabelClassNames: identity, - slotLabelContent: identity, - slotLabelDidMount: identity, - slotLabelWillUnmount: identity, - dayMaxEvents: identity, - dayMaxEventRows: identity, - dayMinWidth: Number, - slotLabelInterval: createDuration, - allDayText: String, - allDayClassNames: identity, - allDayContent: identity, - allDayDidMount: identity, - allDayWillUnmount: identity, - slotMinWidth: Number, - navLinks: Boolean, - eventTimeFormat: createFormatter, - rerenderDelay: Number, - moreLinkText: identity, - moreLinkHint: identity, - selectMinDistance: Number, - selectable: Boolean, - selectLongPressDelay: Number, - eventLongPressDelay: Number, - selectMirror: Boolean, - eventMaxStack: Number, - eventMinHeight: Number, - eventMinWidth: Number, - eventShortHeight: Number, - slotEventOverlap: Boolean, - plugins: identity, - firstDay: Number, - dayCount: Number, - dateAlignment: String, - dateIncrement: createDuration, - hiddenDays: identity, - monthMode: Boolean, - fixedWeekCount: Boolean, - validRange: identity, - visibleRange: identity, - titleFormat: identity, - eventInteractive: Boolean, - // only used by list-view, but languages define the value, so we need it in base options - noEventsText: String, - viewHint: identity, - navLinkHint: identity, - closeHint: String, - timeHint: String, - eventHint: String, - moreLinkClick: identity, - moreLinkClassNames: identity, - moreLinkContent: identity, - moreLinkDidMount: identity, - moreLinkWillUnmount: identity, - // for connectors - // (can't be part of plugin system b/c must be provided at runtime) - handleCustomRendering: identity, - customRenderingMetaMap: identity, - customRenderingReplacesEl: Boolean, - }; - // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give real results. - // raw values. - const BASE_OPTION_DEFAULTS = { - eventDisplay: 'auto', - defaultRangeSeparator: ' - ', - titleRangeSeparator: ' \u2013 ', - defaultTimedEventDuration: '01:00:00', - defaultAllDayEventDuration: { day: 1 }, - forceEventDuration: false, - nextDayThreshold: '00:00:00', - dayHeaders: true, - initialView: '', - aspectRatio: 1.35, - headerToolbar: { - start: 'title', - center: '', - end: 'today prev,next', - }, - weekends: true, - weekNumbers: false, - weekNumberCalculation: 'local', - editable: false, - nowIndicator: false, - scrollTime: '06:00:00', - scrollTimeReset: true, - slotMinTime: '00:00:00', - slotMaxTime: '24:00:00', - showNonCurrentDates: true, - lazyFetching: true, - startParam: 'start', - endParam: 'end', - timeZoneParam: 'timeZone', - timeZone: 'local', - locales: [], - locale: '', - themeSystem: 'standard', - dragRevertDuration: 500, - dragScroll: true, - allDayMaintainDuration: false, - unselectAuto: true, - dropAccept: '*', - eventOrder: 'start,-duration,allDay,title', - dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' }, - handleWindowResize: true, - windowResizeDelay: 100, - longPressDelay: 1000, - eventDragMinDistance: 5, - expandRows: false, - navLinks: false, - selectable: false, - eventMinHeight: 15, - eventMinWidth: 30, - eventShortHeight: 30, - }; - // calendar listeners - // ------------------ - const CALENDAR_LISTENER_REFINERS = { - datesSet: identity, - eventsSet: identity, - eventAdd: identity, - eventChange: identity, - eventRemove: identity, - windowResize: identity, - eventClick: identity, - eventMouseEnter: identity, - eventMouseLeave: identity, - select: identity, - unselect: identity, - loading: identity, - // internal - _unmount: identity, - _beforeprint: identity, - _afterprint: identity, - _noEventDrop: identity, - _noEventResize: identity, - _resize: identity, - _scrollRequest: identity, - }; - // calendar-specific options - // ------------------------- - const CALENDAR_OPTION_REFINERS = { - buttonText: identity, - buttonHints: identity, - views: identity, - plugins: identity, - initialEvents: identity, - events: identity, - eventSources: identity, - }; - const COMPLEX_OPTION_COMPARATORS = { - headerToolbar: isMaybeObjectsEqual, - footerToolbar: isMaybeObjectsEqual, - buttonText: isMaybeObjectsEqual, - buttonHints: isMaybeObjectsEqual, - buttonIcons: isMaybeObjectsEqual, - dateIncrement: isMaybeObjectsEqual, - }; - function isMaybeObjectsEqual(a, b) { - if (typeof a === 'object' && typeof b === 'object' && a && b) { // both non-null objects - return isPropsEqual(a, b); - } - return a === b; - } - // view-specific options - // --------------------- - const VIEW_OPTION_REFINERS = { - type: String, - component: identity, - buttonText: String, - buttonTextKey: String, - dateProfileGeneratorClass: identity, - usesMinMaxTime: Boolean, - classNames: identity, - content: identity, - didMount: identity, - willUnmount: identity, - }; - // util funcs - // ---------------------------------------------------------------------------------------------------- - function mergeRawOptions(optionSets) { - return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS); - } - function refineProps(input, refiners) { - let refined = {}; - let extra = {}; - for (let propName in refiners) { - if (propName in input) { - refined[propName] = refiners[propName](input[propName]); - } - } - for (let propName in input) { - if (!(propName in refiners)) { - extra[propName] = input[propName]; - } - } - return { refined, extra }; - } - function identity(raw) { - return raw; - } - - function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) { - return { - instanceId: guid(), - defId, - range, - forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo, - forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo, - }; - } - - function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) { - for (let i = 0; i < recurringTypes.length; i += 1) { - let parsed = recurringTypes[i].parse(refined, dateEnv); - if (parsed) { - let { allDay } = refined; - if (allDay == null) { - allDay = defaultAllDay; - if (allDay == null) { - allDay = parsed.allDayGuess; - if (allDay == null) { - allDay = false; - } - } - } - return { - allDay, - duration: parsed.duration, - typeData: parsed.typeData, - typeId: i, - }; - } - } - return null; - } - function expandRecurring(eventStore, framingRange, context) { - let { dateEnv, pluginHooks, options } = context; - let { defs, instances } = eventStore; - // remove existing recurring instances - // TODO: bad. always expand events as a second step - instances = filterHash(instances, (instance) => !defs[instance.defId].recurringDef); - for (let defId in defs) { - let def = defs[defId]; - if (def.recurringDef) { - let { duration } = def.recurringDef; - if (!duration) { - duration = def.allDay ? - options.defaultAllDayEventDuration : - options.defaultTimedEventDuration; - } - let starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes); - for (let start of starts) { - let instance = createEventInstance(defId, { - start, - end: dateEnv.add(start, duration), - }); - instances[instance.instanceId] = instance; - } - } - } - return { defs, instances }; - } - /* - Event MUST have a recurringDef - */ - function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) { - let typeDef = recurringTypes[eventDef.recurringDef.typeId]; - let markers = typeDef.expand(eventDef.recurringDef.typeData, { - start: dateEnv.subtract(framingRange.start, duration), - end: framingRange.end, - }, dateEnv); - // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to - if (eventDef.allDay) { - markers = markers.map(startOfDay); - } - return markers; - } - - function parseEvents(rawEvents, eventSource, context, allowOpenRange) { - let eventStore = createEmptyEventStore(); - let eventRefiners = buildEventRefiners(context); - for (let rawEvent of rawEvents) { - let tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners); - if (tuple) { - eventTupleToStore(tuple, eventStore); - } - } - return eventStore; - } - function eventTupleToStore(tuple, eventStore = createEmptyEventStore()) { - eventStore.defs[tuple.def.defId] = tuple.def; - if (tuple.instance) { - eventStore.instances[tuple.instance.instanceId] = tuple.instance; - } - return eventStore; - } - // retrieves events that have the same groupId as the instance specified by `instanceId` - // or they are the same as the instance. - // why might instanceId not be in the store? an event from another calendar? - function getRelevantEvents(eventStore, instanceId) { - let instance = eventStore.instances[instanceId]; - if (instance) { - let def = eventStore.defs[instance.defId]; - // get events/instances with same group - let newStore = filterEventStoreDefs(eventStore, (lookDef) => isEventDefsGrouped(def, lookDef)); - // add the original - // TODO: wish we could use eventTupleToStore or something like it - newStore.defs[def.defId] = def; - newStore.instances[instance.instanceId] = instance; - return newStore; - } - return createEmptyEventStore(); - } - function isEventDefsGrouped(def0, def1) { - return Boolean(def0.groupId && def0.groupId === def1.groupId); - } - function createEmptyEventStore() { - return { defs: {}, instances: {} }; - } - function mergeEventStores(store0, store1) { - return { - defs: Object.assign(Object.assign({}, store0.defs), store1.defs), - instances: Object.assign(Object.assign({}, store0.instances), store1.instances), - }; - } - function filterEventStoreDefs(eventStore, filterFunc) { - let defs = filterHash(eventStore.defs, filterFunc); - let instances = filterHash(eventStore.instances, (instance) => (defs[instance.defId] // still exists? - )); - return { defs, instances }; - } - function excludeSubEventStore(master, sub) { - let { defs, instances } = master; - let filteredDefs = {}; - let filteredInstances = {}; - for (let defId in defs) { - if (!sub.defs[defId]) { // not explicitly excluded - filteredDefs[defId] = defs[defId]; - } - } - for (let instanceId in instances) { - if (!sub.instances[instanceId] && // not explicitly excluded - filteredDefs[instances[instanceId].defId] // def wasn't filtered away - ) { - filteredInstances[instanceId] = instances[instanceId]; - } - } - return { - defs: filteredDefs, - instances: filteredInstances, - }; - } - - function normalizeConstraint(input, context) { - if (Array.isArray(input)) { - return parseEvents(input, null, context, true); // allowOpenRange=true - } - if (typeof input === 'object' && input) { // non-null object - return parseEvents([input], null, context, true); // allowOpenRange=true - } - if (input != null) { - return String(input); - } - return null; - } - - function parseClassNames(raw) { - if (Array.isArray(raw)) { - return raw; - } - if (typeof raw === 'string') { - return raw.split(/\s+/); - } - return []; - } - - // TODO: better called "EventSettings" or "EventConfig" - // TODO: move this file into structs - // TODO: separate constraint/overlap/allow, because selection uses only that, not other props - const EVENT_UI_REFINERS = { - display: String, - editable: Boolean, - startEditable: Boolean, - durationEditable: Boolean, - constraint: identity, - overlap: identity, - allow: identity, - className: parseClassNames, - classNames: parseClassNames, - color: String, - backgroundColor: String, - borderColor: String, - textColor: String, - }; - const EMPTY_EVENT_UI = { - display: null, - startEditable: null, - durationEditable: null, - constraints: [], - overlap: null, - allows: [], - backgroundColor: '', - borderColor: '', - textColor: '', - classNames: [], - }; - function createEventUi(refined, context) { - let constraint = normalizeConstraint(refined.constraint, context); - return { - display: refined.display || null, - startEditable: refined.startEditable != null ? refined.startEditable : refined.editable, - durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable, - constraints: constraint != null ? [constraint] : [], - overlap: refined.overlap != null ? refined.overlap : null, - allows: refined.allow != null ? [refined.allow] : [], - backgroundColor: refined.backgroundColor || refined.color || '', - borderColor: refined.borderColor || refined.color || '', - textColor: refined.textColor || '', - classNames: (refined.className || []).concat(refined.classNames || []), // join singular and plural - }; - } - // TODO: prevent against problems with <2 args! - function combineEventUis(uis) { - return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI); - } - function combineTwoEventUis(item0, item1) { - return { - display: item1.display != null ? item1.display : item0.display, - startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable, - durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable, - constraints: item0.constraints.concat(item1.constraints), - overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap, - allows: item0.allows.concat(item1.allows), - backgroundColor: item1.backgroundColor || item0.backgroundColor, - borderColor: item1.borderColor || item0.borderColor, - textColor: item1.textColor || item0.textColor, - classNames: item0.classNames.concat(item1.classNames), - }; - } - - const EVENT_NON_DATE_REFINERS = { - id: String, - groupId: String, - title: String, - url: String, - interactive: Boolean, - }; - const EVENT_DATE_REFINERS = { - start: identity, - end: identity, - date: identity, - allDay: Boolean, - }; - const EVENT_REFINERS = Object.assign(Object.assign(Object.assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity }); - function parseEvent(raw, eventSource, context, allowOpenRange, refiners = buildEventRefiners(context)) { - let { refined, extra } = refineEventDef(raw, context, refiners); - let defaultAllDay = computeIsDefaultAllDay(eventSource, context); - let recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes); - if (recurringRes) { - let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context); - def.recurringDef = { - typeId: recurringRes.typeId, - typeData: recurringRes.typeData, - duration: recurringRes.duration, - }; - return { def, instance: null }; - } - let singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange); - if (singleRes) { - let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context); - let instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); - return { def, instance }; - } - return null; - } - function refineEventDef(raw, context, refiners = buildEventRefiners(context)) { - return refineProps(raw, refiners); - } - function buildEventRefiners(context) { - return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners); - } - /* - Will NOT populate extendedProps with the leftover properties. - Will NOT populate date-related props. - */ - function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) { - let def = { - title: refined.title || '', - groupId: refined.groupId || '', - publicId: refined.id || '', - url: refined.url || '', - recurringDef: null, - defId: guid(), - sourceId, - allDay, - hasEnd, - interactive: refined.interactive, - ui: createEventUi(refined, context), - extendedProps: Object.assign(Object.assign({}, (refined.extendedProps || {})), extra), - }; - for (let memberAdder of context.pluginHooks.eventDefMemberAdders) { - Object.assign(def, memberAdder(refined)); - } - // help out EventImpl from having user modify props - Object.freeze(def.ui.classNames); - Object.freeze(def.extendedProps); - return def; - } - function parseSingle(refined, defaultAllDay, context, allowOpenRange) { - let { allDay } = refined; - let startMeta; - let startMarker = null; - let hasEnd = false; - let endMeta; - let endMarker = null; - let startInput = refined.start != null ? refined.start : refined.date; - startMeta = context.dateEnv.createMarkerMeta(startInput); - if (startMeta) { - startMarker = startMeta.marker; - } - else if (!allowOpenRange) { - return null; - } - if (refined.end != null) { - endMeta = context.dateEnv.createMarkerMeta(refined.end); - } - if (allDay == null) { - if (defaultAllDay != null) { - allDay = defaultAllDay; - } - else { - // fall back to the date props LAST - allDay = (!startMeta || startMeta.isTimeUnspecified) && - (!endMeta || endMeta.isTimeUnspecified); - } - } - if (allDay && startMarker) { - startMarker = startOfDay(startMarker); - } - if (endMeta) { - endMarker = endMeta.marker; - if (allDay) { - endMarker = startOfDay(endMarker); - } - if (startMarker && endMarker <= startMarker) { - endMarker = null; - } - } - if (endMarker) { - hasEnd = true; - } - else if (!allowOpenRange) { - hasEnd = context.options.forceEventDuration || false; - endMarker = context.dateEnv.add(startMarker, allDay ? - context.options.defaultAllDayEventDuration : - context.options.defaultTimedEventDuration); - } - return { - allDay, - hasEnd, - range: { start: startMarker, end: endMarker }, - forcedStartTzo: startMeta ? startMeta.forcedTzo : null, - forcedEndTzo: endMeta ? endMeta.forcedTzo : null, - }; - } - function computeIsDefaultAllDay(eventSource, context) { - let res = null; - if (eventSource) { - res = eventSource.defaultAllDay; - } - if (res == null) { - res = context.options.defaultAllDay; - } - return res; - } - - const DEF_DEFAULTS = { - startTime: '09:00', - endTime: '17:00', - daysOfWeek: [1, 2, 3, 4, 5], - display: 'inverse-background', - classNames: 'fc-non-business', - groupId: '_businessHours', // so multiple defs get grouped - }; - /* - TODO: pass around as EventDefHash!!! - */ - function parseBusinessHours(input, context) { - return parseEvents(refineInputs(input), null, context); - } - function refineInputs(input) { - let rawDefs; - if (input === true) { - rawDefs = [{}]; // will get DEF_DEFAULTS verbatim - } - else if (Array.isArray(input)) { - // if specifying an array, every sub-definition NEEDS a day-of-week - rawDefs = input.filter((rawDef) => rawDef.daysOfWeek); - } - else if (typeof input === 'object' && input) { // non-null object - rawDefs = [input]; - } - else { // is probably false - rawDefs = []; - } - rawDefs = rawDefs.map((rawDef) => (Object.assign(Object.assign({}, DEF_DEFAULTS), rawDef))); - return rawDefs; - } - - /* Date stuff that doesn't belong in datelib core - ----------------------------------------------------------------------------------------------------------------------*/ - // given a timed range, computes an all-day range that has the same exact duration, - // but whose start time is aligned with the start of the day. - function computeAlignedDayRange(timedRange) { - let dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1; - let start = startOfDay(timedRange.start); - let end = addDays(start, dayCnt); - return { start, end }; - } - // given a timed range, computes an all-day range based on how for the end date bleeds into the next day - // TODO: give nextDayThreshold a default arg - function computeVisibleDayRange(timedRange, nextDayThreshold = createDuration(0)) { - let startDay = null; - let endDay = null; - if (timedRange.end) { - endDay = startOfDay(timedRange.end); - let endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay` - // If the end time is actually inclusively part of the next day and is equal to or - // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`. - // Otherwise, leaving it as inclusive will cause it to exclude `endDay`. - if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) { - endDay = addDays(endDay, 1); - } - } - if (timedRange.start) { - startDay = startOfDay(timedRange.start); // the beginning of the day the range starts - // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day. - if (endDay && endDay <= startDay) { - endDay = addDays(startDay, 1); - } - } - return { start: startDay, end: endDay }; - } - // spans from one day into another? - function isMultiDayRange(range) { - let visibleRange = computeVisibleDayRange(range); - return diffDays(visibleRange.start, visibleRange.end) > 1; - } - function diffDates(date0, date1, dateEnv, largeUnit) { - if (largeUnit === 'year') { - return createDuration(dateEnv.diffWholeYears(date0, date1), 'year'); - } - if (largeUnit === 'month') { - return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month'); - } - return diffDayAndTime(date0, date1); // returns a duration - } - - function pointInsideRect(point, rect) { - return point.left >= rect.left && - point.left < rect.right && - point.top >= rect.top && - point.top < rect.bottom; - } - // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false - function intersectRects(rect1, rect2) { - let res = { - left: Math.max(rect1.left, rect2.left), - right: Math.min(rect1.right, rect2.right), - top: Math.max(rect1.top, rect2.top), - bottom: Math.min(rect1.bottom, rect2.bottom), - }; - if (res.left < res.right && res.top < res.bottom) { - return res; - } - return false; - } - function translateRect(rect, deltaX, deltaY) { - return { - left: rect.left + deltaX, - right: rect.right + deltaX, - top: rect.top + deltaY, - bottom: rect.bottom + deltaY, - }; - } - // Returns a new point that will have been moved to reside within the given rectangle - function constrainPoint(point, rect) { - return { - left: Math.min(Math.max(point.left, rect.left), rect.right), - top: Math.min(Math.max(point.top, rect.top), rect.bottom), - }; - } - // Returns a point that is the center of the given rectangle - function getRectCenter(rect) { - return { - left: (rect.left + rect.right) / 2, - top: (rect.top + rect.bottom) / 2, - }; - } - // Subtracts point2's coordinates from point1's coordinates, returning a delta - function diffPoints(point1, point2) { - return { - left: point1.left - point2.left, - top: point1.top - point2.top, - }; - } - - let canVGrowWithinCell; - function getCanVGrowWithinCell() { - if (canVGrowWithinCell == null) { - canVGrowWithinCell = computeCanVGrowWithinCell(); - } - return canVGrowWithinCell; - } - function computeCanVGrowWithinCell() { - // for SSR, because this function is call immediately at top-level - // TODO: just make this logic execute top-level, immediately, instead of doing lazily - if (typeof document === 'undefined') { - return true; - } - let el = document.createElement('div'); - el.style.position = 'absolute'; - el.style.top = '0px'; - el.style.left = '0px'; - el.innerHTML = '
'; - el.querySelector('table').style.height = '100px'; - el.querySelector('div').style.height = '100%'; - document.body.appendChild(el); - let div = el.querySelector('div'); - let possible = div.offsetHeight > 0; - document.body.removeChild(el); - return possible; - } - - const EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere - class Splitter { - constructor() { - this.getKeysForEventDefs = memoize(this._getKeysForEventDefs); - this.splitDateSelection = memoize(this._splitDateSpan); - this.splitEventStore = memoize(this._splitEventStore); - this.splitIndividualUi = memoize(this._splitIndividualUi); - this.splitEventDrag = memoize(this._splitInteraction); - this.splitEventResize = memoize(this._splitInteraction); - this.eventUiBuilders = {}; // TODO: typescript protection - } - splitProps(props) { - let keyInfos = this.getKeyInfo(props); - let defKeys = this.getKeysForEventDefs(props.eventStore); - let dateSelections = this.splitDateSelection(props.dateSelection); - let individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases* - let eventStores = this.splitEventStore(props.eventStore, defKeys); - let eventDrags = this.splitEventDrag(props.eventDrag); - let eventResizes = this.splitEventResize(props.eventResize); - let splitProps = {}; - this.eventUiBuilders = mapHash(keyInfos, (info, key) => this.eventUiBuilders[key] || memoize(buildEventUiForKey)); - for (let key in keyInfos) { - let keyInfo = keyInfos[key]; - let eventStore = eventStores[key] || EMPTY_EVENT_STORE; - let buildEventUi = this.eventUiBuilders[key]; - splitProps[key] = { - businessHours: keyInfo.businessHours || props.businessHours, - dateSelection: dateSelections[key] || null, - eventStore, - eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]), - eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '', - eventDrag: eventDrags[key] || null, - eventResize: eventResizes[key] || null, - }; - } - return splitProps; - } - _splitDateSpan(dateSpan) { - let dateSpans = {}; - if (dateSpan) { - let keys = this.getKeysForDateSpan(dateSpan); - for (let key of keys) { - dateSpans[key] = dateSpan; - } - } - return dateSpans; - } - _getKeysForEventDefs(eventStore) { - return mapHash(eventStore.defs, (eventDef) => this.getKeysForEventDef(eventDef)); - } - _splitEventStore(eventStore, defKeys) { - let { defs, instances } = eventStore; - let splitStores = {}; - for (let defId in defs) { - for (let key of defKeys[defId]) { - if (!splitStores[key]) { - splitStores[key] = createEmptyEventStore(); - } - splitStores[key].defs[defId] = defs[defId]; - } - } - for (let instanceId in instances) { - let instance = instances[instanceId]; - for (let key of defKeys[instance.defId]) { - if (splitStores[key]) { // must have already been created - splitStores[key].instances[instanceId] = instance; - } - } - } - return splitStores; - } - _splitIndividualUi(eventUiBases, defKeys) { - let splitHashes = {}; - for (let defId in eventUiBases) { - if (defId) { // not the '' key - for (let key of defKeys[defId]) { - if (!splitHashes[key]) { - splitHashes[key] = {}; - } - splitHashes[key][defId] = eventUiBases[defId]; - } - } - } - return splitHashes; - } - _splitInteraction(interaction) { - let splitStates = {}; - if (interaction) { - let affectedStores = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents)); - // can't rely on defKeys because event data is mutated - let mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents); - let mutatedStores = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId); - let populate = (key) => { - if (!splitStates[key]) { - splitStates[key] = { - affectedEvents: affectedStores[key] || EMPTY_EVENT_STORE, - mutatedEvents: mutatedStores[key] || EMPTY_EVENT_STORE, - isEvent: interaction.isEvent, - }; - } - }; - for (let key in affectedStores) { - populate(key); - } - for (let key in mutatedStores) { - populate(key); - } - } - return splitStates; - } - } - function buildEventUiForKey(allUi, eventUiForKey, individualUi) { - let baseParts = []; - if (allUi) { - baseParts.push(allUi); - } - if (eventUiForKey) { - baseParts.push(eventUiForKey); - } - let stuff = { - '': combineEventUis(baseParts), - }; - if (individualUi) { - Object.assign(stuff, individualUi); - } - return stuff; - } - - function parseRange(input, dateEnv) { - let start = null; - let end = null; - if (input.start) { - start = dateEnv.createMarker(input.start); - } - if (input.end) { - end = dateEnv.createMarker(input.end); - } - if (!start && !end) { - return null; - } - if (start && end && end < start) { - return null; - } - return { start, end }; - } - // SIDE-EFFECT: will mutate ranges. - // Will return a new array result. - function invertRanges(ranges, constraintRange) { - let invertedRanges = []; - let { start } = constraintRange; // the end of the previous range. the start of the new range - let i; - let dateRange; - // ranges need to be in order. required for our date-walking algorithm - ranges.sort(compareRanges); - for (i = 0; i < ranges.length; i += 1) { - dateRange = ranges[i]; - // add the span of time before the event (if there is any) - if (dateRange.start > start) { // compare millisecond time (skip any ambig logic) - invertedRanges.push({ start, end: dateRange.start }); - } - if (dateRange.end > start) { - start = dateRange.end; - } - } - // add the span of time after the last event (if there is any) - if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic) - invertedRanges.push({ start, end: constraintRange.end }); - } - return invertedRanges; - } - function compareRanges(range0, range1) { - return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first - } - function intersectRanges(range0, range1) { - let { start, end } = range0; - let newRange = null; - if (range1.start !== null) { - if (start === null) { - start = range1.start; - } - else { - start = new Date(Math.max(start.valueOf(), range1.start.valueOf())); - } - } - if (range1.end != null) { - if (end === null) { - end = range1.end; - } - else { - end = new Date(Math.min(end.valueOf(), range1.end.valueOf())); - } - } - if (start === null || end === null || start < end) { - newRange = { start, end }; - } - return newRange; - } - function rangesEqual(range0, range1) { - return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && - (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf()); - } - function rangesIntersect(range0, range1) { - return (range0.end === null || range1.start === null || range0.end > range1.start) && - (range0.start === null || range1.end === null || range0.start < range1.end); - } - function rangeContainsRange(outerRange, innerRange) { - return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) && - (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end)); - } - function rangeContainsMarker(range, date) { - return (range.start === null || date >= range.start) && - (range.end === null || date < range.end); - } - // If the given date is not within the given range, move it inside. - // (If it's past the end, make it one millisecond before the end). - function constrainMarkerToRange(date, range) { - if (range.start != null && date < range.start) { - return range.start; - } - if (range.end != null && date >= range.end) { - return new Date(range.end.valueOf() - 1); - } - return date; - } - - function getDateMeta(date, todayRange, nowDate, dateProfile) { - return { - dow: date.getUTCDay(), - isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)), - isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)), - isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)), - isPast: Boolean(nowDate ? (date < nowDate) : todayRange ? (date < todayRange.start) : false), - isFuture: Boolean(nowDate ? (date > nowDate) : todayRange ? (date >= todayRange.end) : false), - }; - } - function getDayClassNames(meta, theme) { - let classNames = [ - 'fc-day', - `fc-day-${DAY_IDS[meta.dow]}`, - ]; - if (meta.isDisabled) { - classNames.push('fc-day-disabled'); - } - else { - if (meta.isToday) { - classNames.push('fc-day-today'); - classNames.push(theme.getClass('today')); - } - if (meta.isPast) { - classNames.push('fc-day-past'); - } - if (meta.isFuture) { - classNames.push('fc-day-future'); - } - if (meta.isOther) { - classNames.push('fc-day-other'); - } - } - return classNames; - } - function getSlotClassNames(meta, theme) { - let classNames = [ - 'fc-slot', - `fc-slot-${DAY_IDS[meta.dow]}`, - ]; - if (meta.isDisabled) { - classNames.push('fc-slot-disabled'); - } - else { - if (meta.isToday) { - classNames.push('fc-slot-today'); - classNames.push(theme.getClass('today')); - } - if (meta.isPast) { - classNames.push('fc-slot-past'); - } - if (meta.isFuture) { - classNames.push('fc-slot-future'); - } - } - return classNames; - } - - const DAY_FORMAT = createFormatter({ year: 'numeric', month: 'long', day: 'numeric' }); - const WEEK_FORMAT = createFormatter({ week: 'long' }); - function buildNavLinkAttrs(context, dateMarker, viewType = 'day', isTabbable = true) { - const { dateEnv, options, calendarApi } = context; - let dateStr = dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT); - if (options.navLinks) { - let zonedDate = dateEnv.toDate(dateMarker); - const handleInteraction = (ev) => { - let 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 Object.assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, (isTabbable - ? createAriaClickAttrs(handleInteraction) - : { onClick: handleInteraction })); - } - return { 'aria-label': dateStr }; - } - - let _isRtlScrollbarOnLeft = null; - function getIsRtlScrollbarOnLeft() { - if (_isRtlScrollbarOnLeft === null) { - _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft(); - } - return _isRtlScrollbarOnLeft; - } - function computeIsRtlScrollbarOnLeft() { - let outerEl = document.createElement('div'); - applyStyle(outerEl, { - position: 'absolute', - top: -1000, - left: 0, - border: 0, - padding: 0, - overflow: 'scroll', - direction: 'rtl', - }); - outerEl.innerHTML = '
'; - document.body.appendChild(outerEl); - let innerEl = outerEl.firstChild; - let res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left; - removeElement(outerEl); - return res; - } - - let _scrollbarWidths; - function getScrollbarWidths() { - if (!_scrollbarWidths) { - _scrollbarWidths = computeScrollbarWidths(); - } - return _scrollbarWidths; - } - function computeScrollbarWidths() { - let el = document.createElement('div'); - el.style.overflow = 'scroll'; - el.style.position = 'absolute'; - el.style.top = '-9999px'; - el.style.left = '-9999px'; - document.body.appendChild(el); - let res = computeScrollbarWidthsForEl(el); - document.body.removeChild(el); - return res; - } - // WARNING: will include border - function computeScrollbarWidthsForEl(el) { - return { - x: el.offsetHeight - el.clientHeight, - y: el.offsetWidth - el.clientWidth, - }; - } - - function computeEdges(el, getPadding = false) { - let computedStyle = window.getComputedStyle(el); - let borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0; - let borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0; - let borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0; - let borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; - let badScrollbarWidths = computeScrollbarWidthsForEl(el); // includes border! - let scrollbarLeftRight = badScrollbarWidths.y - borderLeft - borderRight; - let scrollbarBottom = badScrollbarWidths.x - borderTop - borderBottom; - let res = { - borderLeft, - borderRight, - borderTop, - borderBottom, - scrollbarBottom, - scrollbarLeft: 0, - scrollbarRight: 0, - }; - if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side? - res.scrollbarLeft = scrollbarLeftRight; - } - else { - res.scrollbarRight = scrollbarLeftRight; - } - if (getPadding) { - res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0; - res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0; - res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0; - res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0; - } - return res; - } - function computeInnerRect(el, goWithinPadding = false, doFromWindowViewport) { - let outerRect = doFromWindowViewport ? el.getBoundingClientRect() : computeRect(el); - let edges = computeEdges(el, goWithinPadding); - let res = { - left: outerRect.left + edges.borderLeft + edges.scrollbarLeft, - right: outerRect.right - edges.borderRight - edges.scrollbarRight, - top: outerRect.top + edges.borderTop, - bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom, - }; - if (goWithinPadding) { - res.left += edges.paddingLeft; - res.right -= edges.paddingRight; - res.top += edges.paddingTop; - res.bottom -= edges.paddingBottom; - } - return res; - } - function computeRect(el) { - let rect = el.getBoundingClientRect(); - return { - left: rect.left + window.pageXOffset, - top: rect.top + window.pageYOffset, - right: rect.right + window.pageXOffset, - bottom: rect.bottom + window.pageYOffset, - }; - } - function computeClippedClientRect(el) { - let clippingParents = getClippingParents(el); - let rect = el.getBoundingClientRect(); - for (let clippingParent of clippingParents) { - let intersection = intersectRects(rect, clippingParent.getBoundingClientRect()); - if (intersection) { - rect = intersection; - } - else { - return null; - } - } - return rect; - } - // does not return window - function getClippingParents(el) { - let parents = []; - while (el instanceof HTMLElement) { // will stop when gets to document or null - let computedStyle = window.getComputedStyle(el); - if (computedStyle.position === 'fixed') { - break; - } - if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) { - parents.push(el); - } - el = el.parentNode; - } - return parents; - } - - /* - given a function that resolves a result asynchronously. - the function can either call passed-in success and failure callbacks, - or it can return a promise. - if you need to pass additional params to func, bind them first. - */ - function unpromisify(func, normalizedSuccessCallback, normalizedFailureCallback) { - // guard against success/failure callbacks being called more than once - // and guard against a promise AND callback being used together. - let isResolved = false; - let wrappedSuccess = function (res) { - if (!isResolved) { - isResolved = true; - normalizedSuccessCallback(res); - } - }; - let wrappedFailure = function (error) { - if (!isResolved) { - isResolved = true; - normalizedFailureCallback(error); - } - }; - let res = func(wrappedSuccess, wrappedFailure); - if (res && typeof res.then === 'function') { - res.then(wrappedSuccess, wrappedFailure); - } - } - - class Emitter { - constructor() { - this.handlers = {}; - this.thisContext = null; - } - setThisContext(thisContext) { - this.thisContext = thisContext; - } - setOptions(options) { - this.options = options; - } - on(type, handler) { - addToHash(this.handlers, type, handler); - } - off(type, handler) { - removeFromHash(this.handlers, type, handler); - } - trigger(type, ...args) { - let attachedHandlers = this.handlers[type] || []; - let optionHandler = this.options && this.options[type]; - let handlers = [].concat(optionHandler || [], attachedHandlers); - for (let handler of handlers) { - handler.apply(this.thisContext, args); - } - } - hasHandlers(type) { - return Boolean((this.handlers[type] && this.handlers[type].length) || - (this.options && this.options[type])); - } - } - function addToHash(hash, type, handler) { - (hash[type] || (hash[type] = [])) - .push(handler); - } - function removeFromHash(hash, type, handler) { - if (handler) { - if (hash[type]) { - hash[type] = hash[type].filter((func) => func !== handler); - } - } - else { - delete hash[type]; // remove all handler funcs for this type - } - } - - /* - Records offset information for a set of elements, relative to an origin element. - Can record the left/right OR the top/bottom OR both. - Provides methods for querying the cache by position. - */ - class PositionCache { - constructor(originEl, els, isHorizontal, isVertical) { - this.els = els; - let originClientRect = this.originClientRect = originEl.getBoundingClientRect(); // relative to viewport top-left - if (isHorizontal) { - this.buildElHorizontals(originClientRect.left); - } - if (isVertical) { - this.buildElVerticals(originClientRect.top); - } - } - // Populates the left/right internal coordinate arrays - buildElHorizontals(originClientLeft) { - let lefts = []; - let rights = []; - for (let el of this.els) { - let rect = el.getBoundingClientRect(); - lefts.push(rect.left - originClientLeft); - rights.push(rect.right - originClientLeft); - } - this.lefts = lefts; - this.rights = rights; - } - // Populates the top/bottom internal coordinate arrays - buildElVerticals(originClientTop) { - let tops = []; - let bottoms = []; - for (let el of this.els) { - let rect = el.getBoundingClientRect(); - tops.push(rect.top - originClientTop); - bottoms.push(rect.bottom - originClientTop); - } - this.tops = tops; - this.bottoms = bottoms; - } - // Given a left offset (from document left), returns the index of the el that it horizontally intersects. - // If no intersection is made, returns undefined. - leftToIndex(leftPosition) { - let { lefts, rights } = this; - let len = lefts.length; - let i; - for (i = 0; i < len; i += 1) { - if (leftPosition >= lefts[i] && leftPosition < rights[i]) { - return i; - } - } - return undefined; // TODO: better - } - // Given a top offset (from document top), returns the index of the el that it vertically intersects. - // If no intersection is made, returns undefined. - topToIndex(topPosition) { - let { tops, bottoms } = this; - let len = tops.length; - let i; - for (i = 0; i < len; i += 1) { - if (topPosition >= tops[i] && topPosition < bottoms[i]) { - return i; - } - } - return undefined; // TODO: better - } - // Gets the width of the element at the given index - getWidth(leftIndex) { - return this.rights[leftIndex] - this.lefts[leftIndex]; - } - // Gets the height of the element at the given index - getHeight(topIndex) { - return this.bottoms[topIndex] - this.tops[topIndex]; - } - } - - /* eslint max-classes-per-file: "off" */ - /* - An object for getting/setting scroll-related information for an element. - Internally, this is done very differently for window versus DOM element, - so this object serves as a common interface. - */ - class ScrollController { - getMaxScrollTop() { - return this.getScrollHeight() - this.getClientHeight(); - } - getMaxScrollLeft() { - return this.getScrollWidth() - this.getClientWidth(); - } - canScrollVertically() { - return this.getMaxScrollTop() > 0; - } - canScrollHorizontally() { - return this.getMaxScrollLeft() > 0; - } - canScrollUp() { - return this.getScrollTop() > 0; - } - canScrollDown() { - return this.getScrollTop() < this.getMaxScrollTop(); - } - canScrollLeft() { - return this.getScrollLeft() > 0; - } - canScrollRight() { - return this.getScrollLeft() < this.getMaxScrollLeft(); - } - } - class ElementScrollController extends ScrollController { - constructor(el) { - super(); - this.el = el; - } - getScrollTop() { - return this.el.scrollTop; - } - getScrollLeft() { - return this.el.scrollLeft; - } - setScrollTop(top) { - this.el.scrollTop = top; - } - setScrollLeft(left) { - this.el.scrollLeft = left; - } - getScrollWidth() { - return this.el.scrollWidth; - } - getScrollHeight() { - return this.el.scrollHeight; - } - getClientHeight() { - return this.el.clientHeight; - } - getClientWidth() { - return this.el.clientWidth; - } - } - class WindowScrollController extends ScrollController { - getScrollTop() { - return window.pageYOffset; - } - getScrollLeft() { - return window.pageXOffset; - } - setScrollTop(n) { - window.scroll(window.pageXOffset, n); - } - setScrollLeft(n) { - window.scroll(n, window.pageYOffset); - } - getScrollWidth() { - return document.documentElement.scrollWidth; - } - getScrollHeight() { - return document.documentElement.scrollHeight; - } - getClientHeight() { - return document.documentElement.clientHeight; - } - getClientWidth() { - return document.documentElement.clientWidth; - } - } - - class Theme { - constructor(calendarOptions) { - if (this.iconOverrideOption) { - this.setIconOverride(calendarOptions[this.iconOverrideOption]); - } - } - setIconOverride(iconOverrideHash) { - let iconClassesCopy; - let buttonName; - if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object - iconClassesCopy = Object.assign({}, this.iconClasses); - for (buttonName in iconOverrideHash) { - iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]); - } - this.iconClasses = iconClassesCopy; - } - else if (iconOverrideHash === false) { - this.iconClasses = {}; - } - } - applyIconOverridePrefix(className) { - let prefix = this.iconOverridePrefix; - if (prefix && className.indexOf(prefix) !== 0) { // if not already present - className = prefix + className; - } - return className; - } - getClass(key) { - return this.classes[key] || ''; - } - getIconClass(buttonName, isRtl) { - let className; - if (isRtl && this.rtlIconClasses) { - className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName]; - } - else { - className = this.iconClasses[buttonName]; - } - if (className) { - return `${this.baseIconClass} ${className}`; - } - return ''; - } - getCustomButtonIconClass(customButtonProps) { - let className; - if (this.iconOverrideCustomButtonOption) { - className = customButtonProps[this.iconOverrideCustomButtonOption]; - if (className) { - return `${this.baseIconClass} ${this.applyIconOverridePrefix(className)}`; - } - } - return ''; - } - } - Theme.prototype.classes = {}; - Theme.prototype.iconClasses = {}; - Theme.prototype.baseIconClass = ''; - Theme.prototype.iconOverridePrefix = ''; - - var n,l$1,u$1,i$1,t,o,r$1,f$1={},e$1=[],c$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function a$1(n){var l=n.parentNode;l&&l.removeChild(n);}function h(l,u,i){var t,o,r,f={};for(r in u)"key"==r?t=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v$1(l,f,t,o,null)}function v$1(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u$1:r};return null==r&&null!=l$1.vnode&&l$1.vnode(f),f}function y(){return {current:null}}function p(n){return n.children}function d(n,l){this.props=n,this.context=l;}function _(n,l){if(null==l)return n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l0?v$1(k.type,k.props,k.key,k.ref?k.ref:null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y2&&(f.children=arguments.length>3?n.call(arguments,2):i),v$1(l.type,f,t||l.key,o||l.ref,null)}function B$1(n,l){var u={__c:l="__cC"+r$1++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(b$1);},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n);};}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=e$1.slice,l$1={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l;}throw n}},u$1=0,i$1=function(n){return null!=n&&void 0===n.constructor},d.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s({},this.state),"function"==typeof n&&(n=n(s({},u),this.props)),n&&s(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),b$1(this));},d.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b$1(this));},d.prototype.render=p,t=[],g$2.__r=0,r$1=0; - - var r,u,i,f=[],c=[],e=l$1.__b,a=l$1.__r,v=l$1.diffed,l=l$1.__c,m=l$1.unmount;function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k),t.__H.__h.forEach(w$1),t.__H.__h=[];}catch(r){t.__H.__h=[],l$1.__e(r,t.__v);}}l$1.__b=function(n){r=null,e&&e(n);},l$1.__r=function(n){a&&a(n);var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0;})):(i.__h.forEach(k),i.__h.forEach(w$1),i.__h=[])),u=r;},l$1.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f.push(o)&&i===l$1.requestAnimationFrame||((i=l$1.requestAnimationFrame)||j$1)(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c;})),u=r=null;},l$1.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k),t.__h=t.__h.filter(function(n){return !n.__||w$1(n)});}catch(u){r.some(function(n){n.__h&&(n.__h=[]);}),r=[],l$1.__e(u,t.__v);}}),l&&l(t,r);},l$1.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k(n);}catch(n){r=n;}}),u.__H=void 0,r&&l$1.__e(r,u.__v));};var g$1="function"==typeof requestAnimationFrame;function j$1(n){var t,r=function(){clearTimeout(u),g$1&&cancelAnimationFrame(t),setTimeout(n);},u=setTimeout(r,100);g$1&&(t=requestAnimationFrame(r));}function k(n){var t=r,u=n.__c;"function"==typeof u&&(n.__c=void 0,u()),r=t;}function w$1(n){var t=r;n.__c=n.__(),r=t;} - - function g(n,t){for(var e in t)n[e]=t[e];return n}function C(n,t){for(var e in n)if("__source"!==e&&!(e in t))return !0;for(var r in t)if("__source"!==r&&n[r]!==t[r])return !0;return !1}function w(n){this.props=n;}(w.prototype=new d).isPureReactComponent=!0,w.prototype.shouldComponentUpdate=function(n,t){return C(this.props,n)||C(this.state,t)};var x=l$1.__b;l$1.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),x&&x(n);};var T=l$1.__e;l$1.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);T(n,t,e,r);};var I=l$1.unmount;function L(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){"function"==typeof n.__c&&n.__c();}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return L(n,t,e)})),n}function U(n,t,e){return n&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return U(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.insertBefore(n.__e,n.__d),n.__c.__e=!0,n.__c.__P=e)),n}function D(){this.__u=0,this.t=null,this.__b=null;}function F(n){var t=n.__.__c;return t&&t.__a&&t.__a(n)}function V(){this.u=null,this.o=null;}l$1.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&!0===n.__h&&(n.type=null),I&&I(n);},(D.prototype=new d).__c=function(n,t){var e=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(e);var u=F(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(l):l());};e.__R=i;var l=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=U(n,n.__c.__P,n.__c.__O);}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate();}},c=!0===t.__h;r.__u++||c||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i);},D.prototype.componentWillUnmount=function(){this.t=[];},D.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),o=this.__v.__k[0].__c;this.__v.__k[0]=L(this.__b,r,o.__O=o.__P);}this.__b=null;}var i=e.__a&&h(p,null,n.fallback);return i&&(i.__h=null),[h(p,null,e.__a?null:n.children),i]};var W=function(n,t,e){if(++e[1]===e[0]&&n.o.delete(t),n.props.revealOrder&&("t"!==n.props.revealOrder[0]||!n.o.size))for(e=n.u;e;){for(;e.length>3;)e.pop()();if(e[1]>>1,1),e.i.removeChild(n);}}),P$1(h(P,{context:e.context},n.__v),e.l)):e.l&&e.componentWillUnmount();}function j(n,e){var r=h($,{__v:n,i:e});return r.containerInfo=e,r}(V.prototype=new d).__a=function(n){var t=this,e=F(t.__v),r=t.o.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),W(t,n,r)):u();};e?e(o):o();}},V.prototype.render=function(n){this.u=null,this.o=new Map;var t=x$1(n.children);n.revealOrder&&"b"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return n.children},V.prototype.componentDidUpdate=V.prototype.componentDidMount=function(){var n=this;this.o.forEach(function(t,e){W(n,e,t);});};var z="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,B=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,H="undefined"!=typeof document,Z=function(n){return ("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(n)};d.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(d.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n});}});});var G=l$1.event;function J(){}function K(){return this.cancelBubble}function Q(){return this.defaultPrevented}l$1.event=function(n){return G&&(n=G(n)),n.persist=J,n.isPropagationStopped=K,n.isDefaultPrevented=Q,n.nativeEvent=n};var nn={configurable:!0,get:function(){return this.class}},tn=l$1.vnode;l$1.vnode=function(n){var t=n.type,e=n.props,u=e;if("string"==typeof t){var o=-1===t.indexOf("-");for(var i in u={},e){var l=e[i];H&&"children"===i&&"noscript"===t||"value"===i&&"defaultValue"in e&&null==l||("defaultValue"===i&&"value"in e&&null==e.value?i="value":"download"===i&&!0===l?l="":/ondoubleclick/i.test(i)?i="ondblclick":/^onchange(textarea|input)/i.test(i+t)&&!Z(e.type)?i="oninput":/^onfocus$/i.test(i)?i="onfocusin":/^onblur$/i.test(i)?i="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i)?i=i.toLowerCase():o&&B.test(i)?i=i.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===l&&(l=void 0),/^oninput$/i.test(i)&&(i=i.toLowerCase(),u[i]&&(i="oninputCapture")),u[i]=l);}"select"==t&&u.multiple&&Array.isArray(u.value)&&(u.value=x$1(e.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value);})),"select"==t&&null!=u.defaultValue&&(u.value=x$1(e.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value;})),n.props=u,e.class!=e.className&&(nn.enumerable="className"in e,null!=e.className&&(u.class=e.className),Object.defineProperty(u,"className",nn));}n.$$typeof=z,tn&&tn(n);};var en=l$1.__r;l$1.__r=function(n){en&&en(n),n.__c;}; - - /* - NOTE: this can be a public API, especially createElement for hooks. - See examples/typescript-scheduler/src/index.ts - */ - function flushSync(runBeforeFlush) { - runBeforeFlush(); - let oldDebounceRendering = l$1.debounceRendering; // orig - let callbackQ = []; - function execCallbackSync(callback) { - callbackQ.push(callback); - } - l$1.debounceRendering = execCallbackSync; - P$1(h(FakeComponent, {}), document.createElement('div')); - while (callbackQ.length) { - callbackQ.shift()(); - } - l$1.debounceRendering = oldDebounceRendering; - } - class FakeComponent extends d { - render() { return h('div', {}); } - componentDidMount() { this.setState({}); } - } - // TODO: use preact/compat instead? - function createContext(defaultValue) { - let ContextType = B$1(defaultValue); - let origProvider = ContextType.Provider; - ContextType.Provider = function () { - let isNew = !this.getChildContext; - let children = origProvider.apply(this, arguments); // eslint-disable-line prefer-rest-params - if (isNew) { - let subs = []; - this.shouldComponentUpdate = (_props) => { - if (this.props.value !== _props.value) { - subs.forEach((c) => { - c.context = _props.value; - c.forceUpdate(); - }); - } - }; - this.sub = (c) => { - subs.push(c); - let old = c.componentWillUnmount; - c.componentWillUnmount = () => { - subs.splice(subs.indexOf(c), 1); - old && old.call(c); - }; - }; - } - return children; - }; - return ContextType; - } - - var preact = { - __proto__: null, - flushSync: flushSync, - createContext: createContext, - createPortal: j, - Component: d, - Fragment: p, - cloneElement: q, - createElement: h, - createRef: y, - h: h, - hydrate: S, - get isValidElement () { return i$1; }, - get options () { return l$1; }, - render: P$1, - toChildArray: x$1 - }; - - class ScrollResponder { - constructor(execFunc, emitter, scrollTime, scrollTimeReset) { - this.execFunc = execFunc; - this.emitter = emitter; - this.scrollTime = scrollTime; - this.scrollTimeReset = scrollTimeReset; - this.handleScrollRequest = (request) => { - this.queuedRequest = Object.assign({}, this.queuedRequest || {}, request); - this.drain(); - }; - emitter.on('_scrollRequest', this.handleScrollRequest); - this.fireInitialScroll(); - } - detach() { - this.emitter.off('_scrollRequest', this.handleScrollRequest); - } - update(isDatesNew) { - if (isDatesNew && this.scrollTimeReset) { - this.fireInitialScroll(); // will drain - } - else { - this.drain(); - } - } - fireInitialScroll() { - this.handleScrollRequest({ - time: this.scrollTime, - }); - } - drain() { - if (this.queuedRequest && this.execFunc(this.queuedRequest)) { - this.queuedRequest = null; - } - } - } - - const ViewContextType = createContext({}); // for Components - function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) { - return { - dateEnv, - options: viewOptions, - pluginHooks, - emitter, - dispatch, - getCurrentData, - calendarApi, - viewSpec, - viewApi, - dateProfileGenerator, - theme, - isRtl: viewOptions.direction === 'rtl', - addResizeHandler(handler) { - emitter.on('_resize', handler); - }, - removeResizeHandler(handler) { - emitter.off('_resize', handler); - }, - createScrollResponder(execFunc) { - return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime), viewOptions.scrollTimeReset); - }, - registerInteractiveComponent, - unregisterInteractiveComponent, - }; - } - - /* eslint max-classes-per-file: off */ - class PureComponent extends d { - shouldComponentUpdate(nextProps, nextState) { - if (this.debug) { - // eslint-disable-next-line no-console - console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state)); - } - return !compareObjs(this.props, nextProps, this.propEquality) || - !compareObjs(this.state, nextState, this.stateEquality); - } - // HACK for freakin' React StrictMode - safeSetState(newState) { - if (!compareObjs(this.state, Object.assign(Object.assign({}, this.state), newState), this.stateEquality)) { - this.setState(newState); - } - } - } - PureComponent.addPropsEquality = addPropsEquality; - PureComponent.addStateEquality = addStateEquality; - PureComponent.contextType = ViewContextType; - PureComponent.prototype.propEquality = {}; - PureComponent.prototype.stateEquality = {}; - class BaseComponent extends PureComponent { - } - BaseComponent.contextType = ViewContextType; - function addPropsEquality(propEquality) { - let hash = Object.create(this.prototype.propEquality); - Object.assign(hash, propEquality); - this.prototype.propEquality = hash; - } - function addStateEquality(stateEquality) { - let hash = Object.create(this.prototype.stateEquality); - Object.assign(hash, stateEquality); - this.prototype.stateEquality = hash; - } - // use other one - function setRef(ref, current) { - if (typeof ref === 'function') { - ref(current); - } - else if (ref) { - // see https://github.com/facebook/react/issues/13029 - ref.current = current; - } - } - - /* - an INTERACTABLE date component - - PURPOSES: - - hook up to fg, fill, and mirror renderers - - interface for dragging and hits - */ - class DateComponent extends BaseComponent { - constructor() { - super(...arguments); - this.uid = guid(); - } - // Hit System - // ----------------------------------------------------------------------------------------------------------------- - prepareHits() { - } - queryHit(positionLeft, positionTop, elWidth, elHeight) { - return null; // this should be abstract - } - // Pointer Interaction Utils - // ----------------------------------------------------------------------------------------------------------------- - isValidSegDownEl(el) { - return !this.props.eventDrag && // HACK - !this.props.eventResize && // HACK - !elementClosest(el, '.fc-event-mirror'); - } - isValidDateDownEl(el) { - return !elementClosest(el, '.fc-event:not(.fc-bg-event)') && - !elementClosest(el, '.fc-more-link') && // a "more.." link - !elementClosest(el, 'a[data-navlink]') && // a clickable nav link - !elementClosest(el, '.fc-popover'); // hack - } - } - - function reduceCurrentDate(currentDate, action) { - switch (action.type) { - case 'CHANGE_DATE': - return action.dateMarker; - default: - return currentDate; - } - } - function getInitialDate(options, dateEnv) { - let initialDateInput = options.initialDate; - // compute the initial ambig-timezone date - if (initialDateInput != null) { - return dateEnv.createMarker(initialDateInput); - } - return getNow(options.now, dateEnv); // getNow already returns unzoned - } - function getNow(nowInput, dateEnv) { - if (typeof nowInput === 'function') { - nowInput = nowInput(); - } - if (nowInput == null) { - return dateEnv.createNowMarker(); - } - return dateEnv.createMarker(nowInput); - } - - class DateProfileGenerator { - constructor(props) { - this.props = props; - this.nowDate = getNow(props.nowInput, props.dateEnv); - this.initHiddenDays(); - } - /* Date Range Computation - ------------------------------------------------------------------------------------------------------------------*/ - // Builds a structure with info about what the dates/ranges will be for the "prev" view. - buildPrev(currentDateProfile, currentDate, forceToValid) { - let { dateEnv } = this.props; - let prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month - currentDateProfile.dateIncrement); - return this.build(prevDate, -1, forceToValid); - } - // Builds a structure with info about what the dates/ranges will be for the "next" view. - buildNext(currentDateProfile, currentDate, forceToValid) { - let { dateEnv } = this.props; - let nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month - currentDateProfile.dateIncrement); - return this.build(nextDate, 1, forceToValid); - } - // Builds a structure holding dates/ranges for rendering around the given date. - // Optional direction param indicates whether the date is being incremented/decremented - // from its previous value. decremented = -1, incremented = 1 (default). - build(currentDate, direction, forceToValid = true) { - let { props } = this; - let validRange; - let currentInfo; - let isRangeAllDay; - let renderRange; - let activeRange; - let isValid; - validRange = this.buildValidRange(); - validRange = this.trimHiddenDays(validRange); - if (forceToValid) { - currentDate = constrainMarkerToRange(currentDate, validRange); - } - currentInfo = this.buildCurrentRangeInfo(currentDate, direction); - isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit); - renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay); - renderRange = this.trimHiddenDays(renderRange); - activeRange = renderRange; - if (!props.showNonCurrentDates) { - activeRange = intersectRanges(activeRange, currentInfo.range); - } - activeRange = this.adjustActiveRange(activeRange); - activeRange = intersectRanges(activeRange, validRange); // might return null - // it's invalid if the originally requested date is not contained, - // or if the range is completely outside of the valid range. - isValid = rangesIntersect(currentInfo.range, validRange); - return { - // constraint for where prev/next operations can go and where events can be dragged/resized to. - // an object with optional start and end properties. - validRange, - // range the view is formally responsible for. - // for example, a month view might have 1st-31st, excluding padded dates - currentRange: currentInfo.range, - // name of largest unit being displayed, like "month" or "week" - currentRangeUnit: currentInfo.unit, - isRangeAllDay, - // dates that display events and accept drag-n-drop - // will be `null` if no dates accept events - activeRange, - // date range with a rendered skeleton - // includes not-active days that need some sort of DOM - renderRange, - // Duration object that denotes the first visible time of any given day - slotMinTime: props.slotMinTime, - // Duration object that denotes the exclusive visible end time of any given day - slotMaxTime: props.slotMaxTime, - isValid, - // how far the current date will move for a prev/next operation - dateIncrement: this.buildDateIncrement(currentInfo.duration), - // pass a fallback (might be null) ^ - }; - } - // Builds an object with optional start/end properties. - // Indicates the minimum/maximum dates to display. - // not responsible for trimming hidden days. - buildValidRange() { - let input = this.props.validRangeInput; - let simpleInput = typeof input === 'function' - ? input.call(this.props.calendarApi, this.nowDate) - : input; - return this.refineRange(simpleInput) || - { start: null, end: null }; // completely open-ended - } - // Builds a structure with info about the "current" range, the range that is - // highlighted as being the current month for example. - // See build() for a description of `direction`. - // Guaranteed to have `range` and `unit` properties. `duration` is optional. - buildCurrentRangeInfo(date, direction) { - let { props } = this; - let duration = null; - let unit = null; - let range = null; - let dayCount; - if (props.duration) { - duration = props.duration; - unit = props.durationUnit; - range = this.buildRangeFromDuration(date, direction, duration, unit); - } - else if ((dayCount = this.props.dayCount)) { - unit = 'day'; - range = this.buildRangeFromDayCount(date, direction, dayCount); - } - else if ((range = this.buildCustomVisibleRange(date))) { - unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit; - } - else { - duration = this.getFallbackDuration(); - unit = greatestDurationDenominator(duration).unit; - range = this.buildRangeFromDuration(date, direction, duration, unit); - } - return { duration, unit, range }; - } - getFallbackDuration() { - return createDuration({ day: 1 }); - } - // Returns a new activeRange to have time values (un-ambiguate) - // slotMinTime or slotMaxTime causes the range to expand. - adjustActiveRange(range) { - let { dateEnv, usesMinMaxTime, slotMinTime, slotMaxTime } = this.props; - let { start, end } = range; - if (usesMinMaxTime) { - // expand active range if slotMinTime is negative (why not when positive?) - if (asRoughDays(slotMinTime) < 0) { - start = startOfDay(start); // necessary? - start = dateEnv.add(start, slotMinTime); - } - // expand active range if slotMaxTime is beyond one day (why not when negative?) - if (asRoughDays(slotMaxTime) > 1) { - end = startOfDay(end); // necessary? - end = addDays(end, -1); - end = dateEnv.add(end, slotMaxTime); - } - } - return { start, end }; - } - // Builds the "current" range when it is specified as an explicit duration. - // `unit` is the already-computed greatestDurationDenominator unit of duration. - buildRangeFromDuration(date, direction, duration, unit) { - let { dateEnv, dateAlignment } = this.props; - let start; - let end; - let res; - // compute what the alignment should be - if (!dateAlignment) { - let { dateIncrement } = this.props; - if (dateIncrement) { - // use the smaller of the two units - if (asRoughMs(dateIncrement) < asRoughMs(duration)) { - dateAlignment = greatestDurationDenominator(dateIncrement).unit; - } - else { - dateAlignment = unit; - } - } - else { - dateAlignment = unit; - } - } - // if the view displays a single day or smaller - if (asRoughDays(duration) <= 1) { - if (this.isHiddenDay(start)) { - start = this.skipHiddenDays(start, direction); - start = startOfDay(start); - } - } - function computeRes() { - start = dateEnv.startOf(date, dateAlignment); - end = dateEnv.add(start, duration); - res = { start, end }; - } - computeRes(); - // if range is completely enveloped by hidden days, go past the hidden days - if (!this.trimHiddenDays(res)) { - date = this.skipHiddenDays(date, direction); - computeRes(); - } - return res; - } - // Builds the "current" range when a dayCount is specified. - buildRangeFromDayCount(date, direction, dayCount) { - let { dateEnv, dateAlignment } = this.props; - let runningCount = 0; - let start = date; - let end; - if (dateAlignment) { - start = dateEnv.startOf(start, dateAlignment); - } - start = startOfDay(start); - start = this.skipHiddenDays(start, direction); - end = start; - do { - end = addDays(end, 1); - if (!this.isHiddenDay(end)) { - runningCount += 1; - } - } while (runningCount < dayCount); - return { start, end }; - } - // Builds a normalized range object for the "visible" range, - // which is a way to define the currentRange and activeRange at the same time. - buildCustomVisibleRange(date) { - let { props } = this; - let input = props.visibleRangeInput; - let simpleInput = typeof input === 'function' - ? input.call(props.calendarApi, props.dateEnv.toDate(date)) - : input; - let range = this.refineRange(simpleInput); - if (range && (range.start == null || range.end == null)) { - return null; - } - return range; - } - // Computes the range that will represent the element/cells for *rendering*, - // but which may have voided days/times. - // not responsible for trimming hidden days. - buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) { - return currentRange; - } - // Compute the duration value that should be added/substracted to the current date - // when a prev/next operation happens. - buildDateIncrement(fallback) { - let { dateIncrement } = this.props; - let customAlignment; - if (dateIncrement) { - return dateIncrement; - } - if ((customAlignment = this.props.dateAlignment)) { - return createDuration(1, customAlignment); - } - if (fallback) { - return fallback; - } - return createDuration({ days: 1 }); - } - refineRange(rangeInput) { - if (rangeInput) { - let range = parseRange(rangeInput, this.props.dateEnv); - if (range) { - range = computeVisibleDayRange(range); - } - return range; - } - return null; - } - /* Hidden Days - ------------------------------------------------------------------------------------------------------------------*/ - // Initializes internal variables related to calculating hidden days-of-week - initHiddenDays() { - let hiddenDays = this.props.hiddenDays || []; // array of day-of-week indices that are hidden - let isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) - let dayCnt = 0; - let i; - if (this.props.weekends === false) { - hiddenDays.push(0, 6); // 0=sunday, 6=saturday - } - for (i = 0; i < 7; i += 1) { - if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) { - dayCnt += 1; - } - } - if (!dayCnt) { - throw new Error('invalid hiddenDays'); // all days were hidden? bad. - } - this.isHiddenDayHash = isHiddenDayHash; - } - // Remove days from the beginning and end of the range that are computed as hidden. - // If the whole range is trimmed off, returns null - trimHiddenDays(range) { - let { start, end } = range; - if (start) { - start = this.skipHiddenDays(start); - } - if (end) { - end = this.skipHiddenDays(end, -1, true); - } - if (start == null || end == null || start < end) { - return { start, end }; - } - return null; - } - // Is the current day hidden? - // `day` is a day-of-week index (0-6), or a Date (used for UTC) - isHiddenDay(day) { - if (day instanceof Date) { - day = day.getUTCDay(); - } - return this.isHiddenDayHash[day]; - } - // Incrementing the current day until it is no longer a hidden day, returning a copy. - // DOES NOT CONSIDER validRange! - // If the initial value of `date` is not a hidden day, don't do anything. - // Pass `isExclusive` as `true` if you are dealing with an end date. - // `inc` defaults to `1` (increment one day forward each time) - skipHiddenDays(date, inc = 1, isExclusive = false) { - while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) { - date = addDays(date, inc); - } - return date; - } - } - - function triggerDateSelect(selection, pev, context) { - context.emitter.trigger('select', Object.assign(Object.assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view })); - } - function triggerDateUnselect(pev, context) { - context.emitter.trigger('unselect', { - jsEvent: pev ? pev.origEvent : null, - view: context.viewApi || context.calendarApi.view, - }); - } - function buildDateSpanApiWithContext(dateSpan, context) { - let props = {}; - for (let transform of context.pluginHooks.dateSpanTransforms) { - Object.assign(props, transform(dateSpan, context)); - } - Object.assign(props, buildDateSpanApi(dateSpan, context.dateEnv)); - return props; - } - // Given an event's allDay status and start date, return what its fallback end date should be. - // TODO: rename to computeDefaultEventEnd - function getDefaultEventEnd(allDay, marker, context) { - let { dateEnv, options } = context; - let end = marker; - if (allDay) { - end = startOfDay(end); - end = dateEnv.add(end, options.defaultAllDayEventDuration); - } - else { - end = dateEnv.add(end, options.defaultTimedEventDuration); - } - return end; - } - - // applies the mutation to ALL defs/instances within the event store - function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) { - let eventConfigs = compileEventUis(eventStore.defs, eventConfigBase); - let dest = createEmptyEventStore(); - for (let defId in eventStore.defs) { - let def = eventStore.defs[defId]; - dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context); - } - for (let instanceId in eventStore.instances) { - let instance = eventStore.instances[instanceId]; - let def = dest.defs[instance.defId]; // important to grab the newly modified def - dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context); - } - return dest; - } - function applyMutationToEventDef(eventDef, eventConfig, mutation, context) { - let standardProps = mutation.standardProps || {}; - // if hasEnd has not been specified, guess a good value based on deltas. - // if duration will change, there's no way the default duration will persist, - // and thus, we need to mark the event as having a real end - if (standardProps.hasEnd == null && - eventConfig.durationEditable && - (mutation.startDelta || mutation.endDelta)) { - standardProps.hasEnd = true; // TODO: is this mutation okay? - } - let copy = Object.assign(Object.assign(Object.assign({}, eventDef), standardProps), { ui: Object.assign(Object.assign({}, eventDef.ui), standardProps.ui) }); - if (mutation.extendedProps) { - copy.extendedProps = Object.assign(Object.assign({}, copy.extendedProps), mutation.extendedProps); - } - for (let applier of context.pluginHooks.eventDefMutationAppliers) { - applier(copy, mutation, context); - } - if (!copy.hasEnd && context.options.forceEventDuration) { - copy.hasEnd = true; - } - return copy; - } - function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef - eventConfig, mutation, context) { - let { dateEnv } = context; - let forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true; - let clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false; - let copy = Object.assign({}, eventInstance); - if (forceAllDay) { - copy.range = computeAlignedDayRange(copy.range); - } - if (mutation.datesDelta && eventConfig.startEditable) { - copy.range = { - start: dateEnv.add(copy.range.start, mutation.datesDelta), - end: dateEnv.add(copy.range.end, mutation.datesDelta), - }; - } - if (mutation.startDelta && eventConfig.durationEditable) { - copy.range = { - start: dateEnv.add(copy.range.start, mutation.startDelta), - end: copy.range.end, - }; - } - if (mutation.endDelta && eventConfig.durationEditable) { - copy.range = { - start: copy.range.start, - end: dateEnv.add(copy.range.end, mutation.endDelta), - }; - } - if (clearEnd) { - copy.range = { - start: copy.range.start, - end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context), - }; - } - // in case event was all-day but the supplied deltas were not - // better util for this? - if (eventDef.allDay) { - copy.range = { - start: startOfDay(copy.range.start), - end: startOfDay(copy.range.end), - }; - } - // handle invalid durations - if (copy.range.end < copy.range.start) { - copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context); - } - return copy; - } - - class EventSourceImpl { - constructor(context, internalEventSource) { - this.context = context; - this.internalEventSource = internalEventSource; - } - remove() { - this.context.dispatch({ - type: 'REMOVE_EVENT_SOURCE', - sourceId: this.internalEventSource.sourceId, - }); - } - refetch() { - this.context.dispatch({ - type: 'FETCH_EVENT_SOURCES', - sourceIds: [this.internalEventSource.sourceId], - isRefetch: true, - }); - } - get id() { - return this.internalEventSource.publicId; - } - get url() { - return this.internalEventSource.meta.url; - } - get format() { - return this.internalEventSource.meta.format; // TODO: bad. not guaranteed - } - } - - class EventImpl { - // instance will be null if expressing a recurring event that has no current instances, - // OR if trying to validate an incoming external event that has no dates assigned - constructor(context, def, instance) { - this._context = context; - this._def = def; - this._instance = instance || null; - } - /* - TODO: make event struct more responsible for this - */ - setProp(name, val) { - if (name in EVENT_DATE_REFINERS) { - console.warn('Could not set date-related prop \'name\'. Use one of the date-related methods instead.'); - // TODO: make proper aliasing system? - } - else if (name === 'id') { - val = EVENT_NON_DATE_REFINERS[name](val); - this.mutate({ - standardProps: { publicId: val }, // hardcoded internal name - }); - } - else if (name in EVENT_NON_DATE_REFINERS) { - val = EVENT_NON_DATE_REFINERS[name](val); - this.mutate({ - standardProps: { [name]: val }, - }); - } - else if (name in EVENT_UI_REFINERS) { - let ui = EVENT_UI_REFINERS[name](val); - if (name === 'color') { - ui = { backgroundColor: val, borderColor: val }; - } - else if (name === 'editable') { - ui = { startEditable: val, durationEditable: val }; - } - else { - ui = { [name]: val }; - } - this.mutate({ - standardProps: { ui }, - }); - } - else { - console.warn(`Could not set prop '${name}'. Use setExtendedProp instead.`); - } - } - setExtendedProp(name, val) { - this.mutate({ - extendedProps: { [name]: val }, - }); - } - setStart(startInput, options = {}) { - let { dateEnv } = this._context; - let start = dateEnv.createMarker(startInput); - if (start && this._instance) { // TODO: warning if parsed bad - let instanceRange = this._instance.range; - let startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!? - if (options.maintainDuration) { - this.mutate({ datesDelta: startDelta }); - } - else { - this.mutate({ startDelta }); - } - } - } - setEnd(endInput, options = {}) { - let { dateEnv } = this._context; - let end; - if (endInput != null) { - end = dateEnv.createMarker(endInput); - if (!end) { - return; // TODO: warning if parsed bad - } - } - if (this._instance) { - if (end) { - let endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity); - this.mutate({ endDelta }); - } - else { - this.mutate({ standardProps: { hasEnd: false } }); - } - } - } - setDates(startInput, endInput, options = {}) { - let { dateEnv } = this._context; - let standardProps = { allDay: options.allDay }; - let start = dateEnv.createMarker(startInput); - let end; - if (!start) { - return; // TODO: warning if parsed bad - } - if (endInput != null) { - end = dateEnv.createMarker(endInput); - if (!end) { // TODO: warning if parsed bad - return; - } - } - if (this._instance) { - let instanceRange = this._instance.range; - // when computing the diff for an event being converted to all-day, - // compute diff off of the all-day values the way event-mutation does. - if (options.allDay === true) { - instanceRange = computeAlignedDayRange(instanceRange); - } - let startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); - if (end) { - let endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity); - if (durationsEqual(startDelta, endDelta)) { - this.mutate({ datesDelta: startDelta, standardProps }); - } - else { - this.mutate({ startDelta, endDelta, standardProps }); - } - } - else { // means "clear the end" - standardProps.hasEnd = false; - this.mutate({ datesDelta: startDelta, standardProps }); - } - } - } - moveStart(deltaInput) { - let delta = createDuration(deltaInput); - if (delta) { // TODO: warning if parsed bad - this.mutate({ startDelta: delta }); - } - } - moveEnd(deltaInput) { - let delta = createDuration(deltaInput); - if (delta) { // TODO: warning if parsed bad - this.mutate({ endDelta: delta }); - } - } - moveDates(deltaInput) { - let delta = createDuration(deltaInput); - if (delta) { // TODO: warning if parsed bad - this.mutate({ datesDelta: delta }); - } - } - setAllDay(allDay, options = {}) { - let standardProps = { allDay }; - let { maintainDuration } = options; - if (maintainDuration == null) { - maintainDuration = this._context.options.allDayMaintainDuration; - } - if (this._def.allDay !== allDay) { - standardProps.hasEnd = maintainDuration; - } - this.mutate({ standardProps }); - } - formatRange(formatInput) { - let { dateEnv } = this._context; - let instance = this._instance; - let formatter = createFormatter(formatInput); - if (this._def.hasEnd) { - return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, { - forcedStartTzo: instance.forcedStartTzo, - forcedEndTzo: instance.forcedEndTzo, - }); - } - return dateEnv.format(instance.range.start, formatter, { - forcedTzo: instance.forcedStartTzo, - }); - } - mutate(mutation) { - let instance = this._instance; - if (instance) { - let def = this._def; - let context = this._context; - let { eventStore } = context.getCurrentData(); - let relevantEvents = getRelevantEvents(eventStore, instance.instanceId); - let eventConfigBase = { - '': { - display: '', - startEditable: true, - durationEditable: true, - constraints: [], - overlap: null, - allows: [], - backgroundColor: '', - borderColor: '', - textColor: '', - classNames: [], - }, - }; - relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context); - let oldEvent = new EventImpl(context, def, instance); // snapshot - this._def = relevantEvents.defs[def.defId]; - this._instance = relevantEvents.instances[instance.instanceId]; - context.dispatch({ - type: 'MERGE_EVENTS', - eventStore: relevantEvents, - }); - context.emitter.trigger('eventChange', { - oldEvent, - event: this, - relatedEvents: buildEventApis(relevantEvents, context, instance), - revert() { - context.dispatch({ - type: 'RESET_EVENTS', - eventStore, // the ORIGINAL store - }); - }, - }); - } - } - remove() { - let context = this._context; - let asStore = eventApiToStore(this); - context.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: asStore, - }); - context.emitter.trigger('eventRemove', { - event: this, - relatedEvents: [], - revert() { - context.dispatch({ - type: 'MERGE_EVENTS', - eventStore: asStore, - }); - }, - }); - } - get source() { - let { sourceId } = this._def; - if (sourceId) { - return new EventSourceImpl(this._context, this._context.getCurrentData().eventSources[sourceId]); - } - return null; - } - get start() { - return this._instance ? - this._context.dateEnv.toDate(this._instance.range.start) : - null; - } - get end() { - return (this._instance && this._def.hasEnd) ? - this._context.dateEnv.toDate(this._instance.range.end) : - null; - } - get startStr() { - let instance = this._instance; - if (instance) { - return this._context.dateEnv.formatIso(instance.range.start, { - omitTime: this._def.allDay, - forcedTzo: instance.forcedStartTzo, - }); - } - return ''; - } - get endStr() { - let instance = this._instance; - if (instance && this._def.hasEnd) { - return this._context.dateEnv.formatIso(instance.range.end, { - omitTime: this._def.allDay, - forcedTzo: instance.forcedEndTzo, - }); - } - return ''; - } - // computable props that all access the def - // TODO: find a TypeScript-compatible way to do this at scale - get id() { return this._def.publicId; } - get groupId() { return this._def.groupId; } - get allDay() { return this._def.allDay; } - get title() { return this._def.title; } - get url() { return this._def.url; } - get display() { return this._def.ui.display || 'auto'; } // bad. just normalize the type earlier - get startEditable() { return this._def.ui.startEditable; } - get durationEditable() { return this._def.ui.durationEditable; } - get constraint() { return this._def.ui.constraints[0] || null; } - get overlap() { return this._def.ui.overlap; } - get allow() { return this._def.ui.allows[0] || null; } - get backgroundColor() { return this._def.ui.backgroundColor; } - get borderColor() { return this._def.ui.borderColor; } - get textColor() { return this._def.ui.textColor; } - // NOTE: user can't modify these because Object.freeze was called in event-def parsing - get classNames() { return this._def.ui.classNames; } - get extendedProps() { return this._def.extendedProps; } - toPlainObject(settings = {}) { - let def = this._def; - let { ui } = def; - let { startStr, endStr } = this; - let res = {}; - if (def.title) { - res.title = def.title; - } - if (startStr) { - res.start = startStr; - } - if (endStr) { - res.end = endStr; - } - if (def.publicId) { - res.id = def.publicId; - } - if (def.groupId) { - res.groupId = def.groupId; - } - if (def.url) { - res.url = def.url; - } - if (ui.display && ui.display !== 'auto') { - res.display = ui.display; - } - // TODO: what about recurring-event properties??? - // TODO: include startEditable/durationEditable/constraint/overlap/allow - if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) { - res.color = ui.backgroundColor; - } - else { - if (ui.backgroundColor) { - res.backgroundColor = ui.backgroundColor; - } - if (ui.borderColor) { - res.borderColor = ui.borderColor; - } - } - if (ui.textColor) { - res.textColor = ui.textColor; - } - if (ui.classNames.length) { - res.classNames = ui.classNames; - } - if (Object.keys(def.extendedProps).length) { - if (settings.collapseExtendedProps) { - Object.assign(res, def.extendedProps); - } - else { - res.extendedProps = def.extendedProps; - } - } - return res; - } - toJSON() { - return this.toPlainObject(); - } - } - function eventApiToStore(eventApi) { - let def = eventApi._def; - let instance = eventApi._instance; - return { - defs: { [def.defId]: def }, - instances: instance - ? { [instance.instanceId]: instance } - : {}, - }; - } - function buildEventApis(eventStore, context, excludeInstance) { - let { defs, instances } = eventStore; - let eventApis = []; - let excludeInstanceId = excludeInstance ? excludeInstance.instanceId : ''; - for (let id in instances) { - let instance = instances[id]; - let def = defs[instance.defId]; - if (instance.instanceId !== excludeInstanceId) { - eventApis.push(new EventImpl(context, def, instance)); - } - } - return eventApis; - } - - /* - Specifying nextDayThreshold signals that all-day ranges should be sliced. - */ - function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) { - let inverseBgByGroupId = {}; - let inverseBgByDefId = {}; - let defByGroupId = {}; - let bgRanges = []; - let fgRanges = []; - let eventUis = compileEventUis(eventStore.defs, eventUiBases); - for (let defId in eventStore.defs) { - let def = eventStore.defs[defId]; - let ui = eventUis[def.defId]; - if (ui.display === 'inverse-background') { - if (def.groupId) { - inverseBgByGroupId[def.groupId] = []; - if (!defByGroupId[def.groupId]) { - defByGroupId[def.groupId] = def; - } - } - else { - inverseBgByDefId[defId] = []; - } - } - } - for (let instanceId in eventStore.instances) { - let instance = eventStore.instances[instanceId]; - let def = eventStore.defs[instance.defId]; - let ui = eventUis[def.defId]; - let origRange = instance.range; - let normalRange = (!def.allDay && nextDayThreshold) ? - computeVisibleDayRange(origRange, nextDayThreshold) : - origRange; - let slicedRange = intersectRanges(normalRange, framingRange); - if (slicedRange) { - if (ui.display === 'inverse-background') { - if (def.groupId) { - inverseBgByGroupId[def.groupId].push(slicedRange); - } - else { - inverseBgByDefId[instance.defId].push(slicedRange); - } - } - else if (ui.display !== 'none') { - (ui.display === 'background' ? bgRanges : fgRanges).push({ - def, - ui, - instance, - range: slicedRange, - isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(), - isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf(), - }); - } - } - } - for (let groupId in inverseBgByGroupId) { // BY GROUP - let ranges = inverseBgByGroupId[groupId]; - let invertedRanges = invertRanges(ranges, framingRange); - for (let invertedRange of invertedRanges) { - let def = defByGroupId[groupId]; - let ui = eventUis[def.defId]; - bgRanges.push({ - def, - ui, - instance: null, - range: invertedRange, - isStart: false, - isEnd: false, - }); - } - } - for (let defId in inverseBgByDefId) { - let ranges = inverseBgByDefId[defId]; - let invertedRanges = invertRanges(ranges, framingRange); - for (let invertedRange of invertedRanges) { - bgRanges.push({ - def: eventStore.defs[defId], - ui: eventUis[defId], - instance: null, - range: invertedRange, - isStart: false, - isEnd: false, - }); - } - } - return { bg: bgRanges, fg: fgRanges }; - } - function hasBgRendering(def) { - return def.ui.display === 'background' || def.ui.display === 'inverse-background'; - } - function setElSeg(el, seg) { - el.fcSeg = seg; - } - function getElSeg(el) { - return el.fcSeg || - el.parentNode.fcSeg || // for the harness - null; - } - // event ui computation - function compileEventUis(eventDefs, eventUiBases) { - return mapHash(eventDefs, (eventDef) => compileEventUi(eventDef, eventUiBases)); - } - function compileEventUi(eventDef, eventUiBases) { - let uis = []; - if (eventUiBases['']) { - uis.push(eventUiBases['']); - } - if (eventUiBases[eventDef.defId]) { - uis.push(eventUiBases[eventDef.defId]); - } - uis.push(eventDef.ui); - return combineEventUis(uis); - } - function sortEventSegs(segs, eventOrderSpecs) { - let objs = segs.map(buildSegCompareObj); - objs.sort((obj0, obj1) => compareByFieldSpecs(obj0, obj1, eventOrderSpecs)); - return objs.map((c) => c._seg); - } - // returns a object with all primitive props that can be compared - function buildSegCompareObj(seg) { - let { eventRange } = seg; - let eventDef = eventRange.def; - let range = eventRange.instance ? eventRange.instance.range : eventRange.range; - let start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events - let end = range.end ? range.end.valueOf() : 0; // " - return Object.assign(Object.assign(Object.assign({}, eventDef.extendedProps), eventDef), { id: eventDef.publicId, start, - end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg }); - } - function computeSegDraggable(seg, context) { - let { pluginHooks } = context; - let transformers = pluginHooks.isDraggableTransformers; - let { def, ui } = seg.eventRange; - let val = ui.startEditable; - for (let transformer of transformers) { - val = transformer(val, def, ui, context); - } - return val; - } - function computeSegStartResizable(seg, context) { - return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart; - } - function computeSegEndResizable(seg, context) { - return seg.isEnd && seg.eventRange.ui.durationEditable; - } - function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, // defaults to true - defaultDisplayEventEnd, // defaults to true - startOverride, endOverride) { - let { dateEnv, options } = context; - let { displayEventTime, displayEventEnd } = options; - let eventDef = seg.eventRange.def; - let eventInstance = seg.eventRange.instance; - if (displayEventTime == null) { - displayEventTime = defaultDisplayEventTime !== false; - } - if (displayEventEnd == null) { - displayEventEnd = defaultDisplayEventEnd !== false; - } - let wholeEventStart = eventInstance.range.start; - let wholeEventEnd = eventInstance.range.end; - let segStart = startOverride || seg.start || seg.eventRange.range.start; - let segEnd = endOverride || seg.end || seg.eventRange.range.end; - let isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf(); - let isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf(); - if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) { - segStart = isStartDay ? wholeEventStart : segStart; - segEnd = isEndDay ? wholeEventEnd : segEnd; - if (displayEventEnd && eventDef.hasEnd) { - return dateEnv.formatRange(segStart, segEnd, timeFormat, { - forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo, - forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo, - }); - } - return dateEnv.format(segStart, timeFormat, { - forcedTzo: startOverride ? null : eventInstance.forcedStartTzo, // nooooo, same - }); - } - return ''; - } - function getSegMeta(seg, todayRange, nowDate) { - let segRange = seg.eventRange.range; - return { - isPast: segRange.end < (nowDate || todayRange.start), - isFuture: segRange.start >= (nowDate || todayRange.end), - isToday: todayRange && rangeContainsMarker(todayRange, segRange.start), - }; - } - function getEventClassNames(props) { - let classNames = ['fc-event']; - if (props.isMirror) { - classNames.push('fc-event-mirror'); - } - if (props.isDraggable) { - classNames.push('fc-event-draggable'); - } - if (props.isStartResizable || props.isEndResizable) { - classNames.push('fc-event-resizable'); - } - if (props.isDragging) { - classNames.push('fc-event-dragging'); - } - if (props.isResizing) { - classNames.push('fc-event-resizing'); - } - if (props.isSelected) { - classNames.push('fc-event-selected'); - } - if (props.isStart) { - classNames.push('fc-event-start'); - } - if (props.isEnd) { - classNames.push('fc-event-end'); - } - if (props.isPast) { - classNames.push('fc-event-past'); - } - if (props.isToday) { - classNames.push('fc-event-today'); - } - if (props.isFuture) { - classNames.push('fc-event-future'); - } - return classNames; - } - function buildEventRangeKey(eventRange) { - return eventRange.instance - ? eventRange.instance.instanceId - : `${eventRange.def.defId}:${eventRange.range.start.toISOString()}`; - // inverse-background events don't have specific instances. TODO: better solution - } - function getSegAnchorAttrs(seg, context) { - let { def, instance } = seg.eventRange; - let { url } = def; - if (url) { - return { href: url }; - } - let { emitter, options } = context; - let { eventInteractive } = options; - if (eventInteractive == null) { - eventInteractive = def.interactive; - if (eventInteractive == null) { - eventInteractive = Boolean(emitter.hasHandlers('eventClick')); - } - } - // mock what happens in EventClicking - if (eventInteractive) { - // only attach keyboard-related handlers because click handler is already done in EventClicking - return createAriaKeyboardAttrs((ev) => { - emitter.trigger('eventClick', { - el: ev.target, - event: new EventImpl(context, def, instance), - jsEvent: ev, - view: context.viewApi, - }); - }); - } - return {}; - } - - const STANDARD_PROPS = { - start: identity, - end: identity, - allDay: Boolean, - }; - function parseDateSpan(raw, dateEnv, defaultDuration) { - let span = parseOpenDateSpan(raw, dateEnv); - let { range } = span; - if (!range.start) { - return null; - } - if (!range.end) { - if (defaultDuration == null) { - return null; - } - range.end = dateEnv.add(range.start, defaultDuration); - } - return span; - } - /* - TODO: somehow combine with parseRange? - Will return null if the start/end props were present but parsed invalidly. - */ - function parseOpenDateSpan(raw, dateEnv) { - let { refined: standardProps, extra } = refineProps(raw, STANDARD_PROPS); - let startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; - let endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; - let { allDay } = standardProps; - if (allDay == null) { - allDay = (startMeta && startMeta.isTimeUnspecified) && - (!endMeta || endMeta.isTimeUnspecified); - } - return Object.assign({ range: { - start: startMeta ? startMeta.marker : null, - end: endMeta ? endMeta.marker : null, - }, allDay }, extra); - } - function isDateSpansEqual(span0, span1) { - return rangesEqual(span0.range, span1.range) && - span0.allDay === span1.allDay && - isSpanPropsEqual(span0, span1); - } - // the NON-DATE-RELATED props - function isSpanPropsEqual(span0, span1) { - for (let propName in span1) { - if (propName !== 'range' && propName !== 'allDay') { - if (span0[propName] !== span1[propName]) { - return false; - } - } - } - // are there any props that span0 has that span1 DOESN'T have? - // both have range/allDay, so no need to special-case. - for (let propName in span0) { - if (!(propName in span1)) { - return false; - } - } - return true; - } - function buildDateSpanApi(span, dateEnv) { - return Object.assign(Object.assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay }); - } - function buildRangeApiWithTimeZone(range, dateEnv, omitTime) { - return Object.assign(Object.assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone }); - } - function buildRangeApi(range, dateEnv, omitTime) { - return { - start: dateEnv.toDate(range.start), - end: dateEnv.toDate(range.end), - startStr: dateEnv.formatIso(range.start, { omitTime }), - endStr: dateEnv.formatIso(range.end, { omitTime }), - }; - } - function fabricateEventRange(dateSpan, eventUiBases, context) { - let res = refineEventDef({ editable: false }, context); - let def = parseEventDef(res.refined, res.extra, '', // sourceId - dateSpan.allDay, true, // hasEnd - context); - return { - def, - ui: compileEventUi(def, eventUiBases), - instance: createEventInstance(def.defId, dateSpan.range), - range: dateSpan.range, - isStart: true, - isEnd: true, - }; - } - - let calendarSystemClassMap = {}; - function registerCalendarSystem(name, theClass) { - calendarSystemClassMap[name] = theClass; - } - function createCalendarSystem(name) { - return new calendarSystemClassMap[name](); - } - class GregorianCalendarSystem { - getMarkerYear(d) { - return d.getUTCFullYear(); - } - getMarkerMonth(d) { - return d.getUTCMonth(); - } - getMarkerDay(d) { - return d.getUTCDate(); - } - arrayToMarker(arr) { - return arrayToUtcDate(arr); - } - markerToArray(marker) { - return dateToUtcArray(marker); - } - } - registerCalendarSystem('gregory', GregorianCalendarSystem); - - const ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/; - function parse(str) { - let m = ISO_RE.exec(str); - if (m) { - let marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number(`0.${m[12]}`) * 1000 : 0)); - if (isValidDate(marker)) { - let timeZoneOffset = null; - if (m[13]) { - timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 + - Number(m[18] || 0)); - } - return { - marker, - isTimeUnspecified: !m[6], - timeZoneOffset, - }; - } - } - return null; - } - - class DateEnv { - constructor(settings) { - let timeZone = this.timeZone = settings.timeZone; - let isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC'; - if (settings.namedTimeZoneImpl && isNamedTimeZone) { - this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone); - } - this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl); - this.calendarSystem = createCalendarSystem(settings.calendarSystem); - this.locale = settings.locale; - this.weekDow = settings.locale.week.dow; - this.weekDoy = settings.locale.week.doy; - if (settings.weekNumberCalculation === 'ISO') { - this.weekDow = 1; - this.weekDoy = 4; - } - if (typeof settings.firstDay === 'number') { - this.weekDow = settings.firstDay; - } - if (typeof settings.weekNumberCalculation === 'function') { - this.weekNumberFunc = settings.weekNumberCalculation; - } - this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText; - this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText; - this.cmdFormatter = settings.cmdFormatter; - this.defaultSeparator = settings.defaultSeparator; - } - // Creating / Parsing - createMarker(input) { - let meta = this.createMarkerMeta(input); - if (meta === null) { - return null; - } - return meta.marker; - } - createNowMarker() { - if (this.canComputeOffset) { - return this.timestampToMarker(new Date().valueOf()); - } - // if we can't compute the current date val for a timezone, - // better to give the current local date vals than UTC - return arrayToUtcDate(dateToLocalArray(new Date())); - } - createMarkerMeta(input) { - if (typeof input === 'string') { - return this.parse(input); - } - let marker = null; - if (typeof input === 'number') { - marker = this.timestampToMarker(input); - } - else if (input instanceof Date) { - input = input.valueOf(); - if (!isNaN(input)) { - marker = this.timestampToMarker(input); - } - } - else if (Array.isArray(input)) { - marker = arrayToUtcDate(input); - } - if (marker === null || !isValidDate(marker)) { - return null; - } - return { marker, isTimeUnspecified: false, forcedTzo: null }; - } - parse(s) { - let parts = parse(s); - if (parts === null) { - return null; - } - let { marker } = parts; - let forcedTzo = null; - if (parts.timeZoneOffset !== null) { - if (this.canComputeOffset) { - marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000); - } - else { - forcedTzo = parts.timeZoneOffset; - } - } - return { marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo }; - } - // Accessors - getYear(marker) { - return this.calendarSystem.getMarkerYear(marker); - } - getMonth(marker) { - return this.calendarSystem.getMarkerMonth(marker); - } - // Adding / Subtracting - add(marker, dur) { - let a = this.calendarSystem.markerToArray(marker); - a[0] += dur.years; - a[1] += dur.months; - a[2] += dur.days; - a[6] += dur.milliseconds; - return this.calendarSystem.arrayToMarker(a); - } - subtract(marker, dur) { - let a = this.calendarSystem.markerToArray(marker); - a[0] -= dur.years; - a[1] -= dur.months; - a[2] -= dur.days; - a[6] -= dur.milliseconds; - return this.calendarSystem.arrayToMarker(a); - } - addYears(marker, n) { - let a = this.calendarSystem.markerToArray(marker); - a[0] += n; - return this.calendarSystem.arrayToMarker(a); - } - addMonths(marker, n) { - let a = this.calendarSystem.markerToArray(marker); - a[1] += n; - return this.calendarSystem.arrayToMarker(a); - } - // Diffing Whole Units - diffWholeYears(m0, m1) { - let { calendarSystem } = this; - if (timeAsMs(m0) === timeAsMs(m1) && - calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && - calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) { - return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0); - } - return null; - } - diffWholeMonths(m0, m1) { - let { calendarSystem } = this; - if (timeAsMs(m0) === timeAsMs(m1) && - calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) { - return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) + - (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12; - } - return null; - } - // Range / Duration - greatestWholeUnit(m0, m1) { - let n = this.diffWholeYears(m0, m1); - if (n !== null) { - return { unit: 'year', value: n }; - } - n = this.diffWholeMonths(m0, m1); - if (n !== null) { - return { unit: 'month', value: n }; - } - n = diffWholeWeeks(m0, m1); - if (n !== null) { - return { unit: 'week', value: n }; - } - n = diffWholeDays(m0, m1); - if (n !== null) { - return { unit: 'day', value: n }; - } - n = diffHours(m0, m1); - if (isInt(n)) { - return { unit: 'hour', value: n }; - } - n = diffMinutes(m0, m1); - if (isInt(n)) { - return { unit: 'minute', value: n }; - } - n = diffSeconds(m0, m1); - if (isInt(n)) { - return { unit: 'second', value: n }; - } - return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() }; - } - countDurationsBetween(m0, m1, d) { - // TODO: can use greatestWholeUnit - let diff; - if (d.years) { - diff = this.diffWholeYears(m0, m1); - if (diff !== null) { - return diff / asRoughYears(d); - } - } - if (d.months) { - diff = this.diffWholeMonths(m0, m1); - if (diff !== null) { - return diff / asRoughMonths(d); - } - } - if (d.days) { - diff = diffWholeDays(m0, m1); - if (diff !== null) { - return diff / asRoughDays(d); - } - } - return (m1.valueOf() - m0.valueOf()) / asRoughMs(d); - } - // Start-Of - // these DON'T return zoned-dates. only UTC start-of dates - startOf(m, unit) { - if (unit === 'year') { - return this.startOfYear(m); - } - if (unit === 'month') { - return this.startOfMonth(m); - } - if (unit === 'week') { - return this.startOfWeek(m); - } - if (unit === 'day') { - return startOfDay(m); - } - if (unit === 'hour') { - return startOfHour(m); - } - if (unit === 'minute') { - return startOfMinute(m); - } - if (unit === 'second') { - return startOfSecond(m); - } - return null; - } - startOfYear(m) { - return this.calendarSystem.arrayToMarker([ - this.calendarSystem.getMarkerYear(m), - ]); - } - startOfMonth(m) { - return this.calendarSystem.arrayToMarker([ - this.calendarSystem.getMarkerYear(m), - this.calendarSystem.getMarkerMonth(m), - ]); - } - startOfWeek(m) { - return this.calendarSystem.arrayToMarker([ - this.calendarSystem.getMarkerYear(m), - this.calendarSystem.getMarkerMonth(m), - m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7), - ]); - } - // Week Number - computeWeekNumber(marker) { - if (this.weekNumberFunc) { - return this.weekNumberFunc(this.toDate(marker)); - } - return weekOfYear(marker, this.weekDow, this.weekDoy); - } - // TODO: choke on timeZoneName: long - format(marker, formatter, dateOptions = {}) { - return formatter.format({ - marker, - timeZoneOffset: dateOptions.forcedTzo != null ? - dateOptions.forcedTzo : - this.offsetForMarker(marker), - }, this); - } - formatRange(start, end, formatter, dateOptions = {}) { - if (dateOptions.isEndExclusive) { - end = addMs(end, -1); - } - return formatter.formatRange({ - marker: start, - timeZoneOffset: dateOptions.forcedStartTzo != null ? - dateOptions.forcedStartTzo : - this.offsetForMarker(start), - }, { - marker: end, - timeZoneOffset: dateOptions.forcedEndTzo != null ? - dateOptions.forcedEndTzo : - this.offsetForMarker(end), - }, this, dateOptions.defaultSeparator); - } - /* - DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that, - might as well use buildIsoString or some other util directly - */ - formatIso(marker, extraOptions = {}) { - let timeZoneOffset = null; - if (!extraOptions.omitTimeZoneOffset) { - if (extraOptions.forcedTzo != null) { - timeZoneOffset = extraOptions.forcedTzo; - } - else { - timeZoneOffset = this.offsetForMarker(marker); - } - } - return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime); - } - // TimeZone - timestampToMarker(ms) { - if (this.timeZone === 'local') { - return arrayToUtcDate(dateToLocalArray(new Date(ms))); - } - if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) { - return new Date(ms); - } - return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms)); - } - offsetForMarker(m) { - if (this.timeZone === 'local') { - return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset - } - if (this.timeZone === 'UTC') { - return 0; - } - if (this.namedTimeZoneImpl) { - return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)); - } - return null; - } - // Conversion - toDate(m, forcedTzo) { - if (this.timeZone === 'local') { - return arrayToLocalDate(dateToUtcArray(m)); - } - if (this.timeZone === 'UTC') { - return new Date(m.valueOf()); // make sure it's a copy - } - if (!this.namedTimeZoneImpl) { - return new Date(m.valueOf() - (forcedTzo || 0)); - } - return new Date(m.valueOf() - - this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60); - } - } - - class NamedTimeZoneImpl { - constructor(timeZoneName) { - this.timeZoneName = timeZoneName; - } - } - - class SegHierarchy { - constructor() { - // settings - this.strictOrder = false; - this.allowReslicing = false; - this.maxCoord = -1; // -1 means no max - this.maxStackCnt = -1; // -1 means no max - this.levelCoords = []; // ordered - this.entriesByLevel = []; // parallel with levelCoords - this.stackCnts = {}; // TODO: use better technique!? - } - addSegs(inputs) { - let hiddenEntries = []; - for (let input of inputs) { - this.insertEntry(input, hiddenEntries); - } - return hiddenEntries; - } - insertEntry(entry, hiddenEntries) { - let insertion = this.findInsertion(entry); - if (this.isInsertionValid(insertion, entry)) { - this.insertEntryAt(entry, insertion); - return 1; - } - return this.handleInvalidInsertion(insertion, entry, hiddenEntries); - } - isInsertionValid(insertion, entry) { - return (this.maxCoord === -1 || insertion.levelCoord + entry.thickness <= this.maxCoord) && - (this.maxStackCnt === -1 || insertion.stackCnt < this.maxStackCnt); - } - // returns number of new entries inserted - handleInvalidInsertion(insertion, entry, hiddenEntries) { - if (this.allowReslicing && insertion.touchingEntry) { - return this.splitEntry(entry, insertion.touchingEntry, hiddenEntries); - } - hiddenEntries.push(entry); - return 0; - } - splitEntry(entry, barrier, hiddenEntries) { - let partCnt = 0; - let splitHiddenEntries = []; - let entrySpan = entry.span; - let barrierSpan = barrier.span; - 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({ - index: entry.index, - thickness: entry.thickness, - span: intersectSpans(barrierSpan, entrySpan), // guaranteed to intersect - }, ...splitHiddenEntries); - return partCnt; - } - hiddenEntries.push(entry); - return 0; - } - insertEntryAt(entry, insertion) { - let { entriesByLevel, levelCoords } = this; - if (insertion.lateral === -1) { - // create a new level - insertAt(levelCoords, insertion.level, insertion.levelCoord); - insertAt(entriesByLevel, insertion.level, [entry]); - } - else { - // insert into existing level - insertAt(entriesByLevel[insertion.level], insertion.lateral, entry); - } - this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt; - } - findInsertion(newEntry) { - let { levelCoords, entriesByLevel, strictOrder, stackCnts } = this; - let levelCnt = levelCoords.length; - let candidateCoord = 0; - let touchingLevel = -1; - let touchingLateral = -1; - let touchingEntry = null; - let stackCnt = 0; - for (let trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) { - let 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 && trackingCoord >= candidateCoord + newEntry.thickness) { - break; - } - let trackingEntries = entriesByLevel[trackingLevel]; - let trackingEntry; - let searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd); // find first entry after newEntry's end - let lateralIndex = searchRes[0] + searchRes[1]; // if exact match (which doesn't collide), go to next one - while ( // loop through entries that horizontally intersect - (trackingEntry = trackingEntries[lateralIndex]) && // but not past the whole entry list - trackingEntry.span.start < newEntry.span.end // and not entirely past newEntry - ) { - let trackingEntryBottom = trackingCoord + trackingEntry.thickness; - // intersects into the top of the candidate? - if (trackingEntryBottom > candidateCoord) { - candidateCoord = trackingEntryBottom; - touchingEntry = trackingEntry; - touchingLevel = trackingLevel; - touchingLateral = lateralIndex; - } - // 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 - let 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 - let destLateral = -1; - if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) { - destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0]; - } - return { - touchingLevel, - touchingLateral, - touchingEntry, - stackCnt, - levelCoord: candidateCoord, - level: destLevel, - lateral: destLateral, - }; - } - // sorted by levelCoord (lowest to highest) - toRects() { - let { entriesByLevel, levelCoords } = this; - let levelCnt = entriesByLevel.length; - let rects = []; - for (let level = 0; level < levelCnt; level += 1) { - let entries = entriesByLevel[level]; - let levelCoord = levelCoords[level]; - for (let entry of entries) { - rects.push(Object.assign(Object.assign({}, entry), { levelCoord })); - } - } - return rects; - } - } - function getEntrySpanEnd(entry) { - return entry.span.end; - } - function buildEntryKey(entry) { - return entry.index + ':' + entry.span.start; - } - // returns groups with entries sorted by input order - function groupIntersectingEntries(entries) { - let merges = []; - for (let entry of entries) { - let filteredMerges = []; - let hungryMerge = { - span: entry.span, - entries: [entry], - }; - for (let merge of merges) { - if (intersectSpans(merge.span, hungryMerge.span)) { - hungryMerge = { - entries: merge.entries.concat(hungryMerge.entries), - span: joinSpans(merge.span, hungryMerge.span), - }; - } - else { - filteredMerges.push(merge); - } - } - filteredMerges.push(hungryMerge); - merges = filteredMerges; - } - return merges; - } - function joinSpans(span0, span1) { - return { - start: Math.min(span0.start, span1.start), - end: Math.max(span0.end, span1.end), - }; - } - function intersectSpans(span0, span1) { - let start = Math.max(span0.start, span1.start); - let end = Math.min(span0.end, span1.end); - if (start < end) { - return { start, end }; - } - return null; - } - // general util - // --------------------------------------------------------------------------------------------------------------------- - function insertAt(arr, index, item) { - arr.splice(index, 0, item); - } - function binarySearch(a, searchVal, getItemVal) { - let startIndex = 0; - let endIndex = a.length; // exclusive - if (!endIndex || searchVal < getItemVal(a[startIndex])) { // no items OR before first item - return [0, 0]; - } - if (searchVal > getItemVal(a[endIndex - 1])) { // after last item - return [endIndex, 0]; - } - while (startIndex < endIndex) { - let middleIndex = Math.floor(startIndex + (endIndex - startIndex) / 2); - let middleVal = getItemVal(a[middleIndex]); - if (searchVal < middleVal) { - endIndex = middleIndex; - } - else if (searchVal > middleVal) { - startIndex = middleIndex + 1; - } - else { // equal! - return [middleIndex, 1]; - } - } - return [startIndex, 0]; - } - - class Interaction { - constructor(settings) { - this.component = settings.component; - this.isHitComboAllowed = settings.isHitComboAllowed || null; - } - destroy() { - } - } - function parseInteractionSettings(component, input) { - return { - component, - el: input.el, - useEventCenter: input.useEventCenter != null ? input.useEventCenter : true, - isHitComboAllowed: input.isHitComboAllowed || null, - }; - } - function interactionSettingsToStore(settings) { - return { - [settings.component.uid]: settings, - }; - } - // global state - const interactionSettingsStore = {}; - - /* - An abstraction for a dragging interaction originating on an event. - Does higher-level things than PointerDragger, such as possibly: - - a "mirror" that moves with the pointer - - a minimum number of pixels or other criteria for a true drag to begin - - subclasses must emit: - - pointerdown - - dragstart - - dragmove - - pointerup - - dragend - */ - class ElementDragging { - constructor(el, selector) { - this.emitter = new Emitter(); - } - destroy() { - } - setMirrorIsVisible(bool) { - // optional if subclass doesn't want to support a mirror - } - setMirrorNeedsRevert(bool) { - // optional if subclass doesn't want to support a mirror - } - setAutoScrollEnabled(bool) { - // optional - } - } - - // TODO: get rid of this in favor of options system, - // tho it's really easy to access this globally rather than pass thru options. - const config = {}; - - /* - Information about what will happen when an external element is dragged-and-dropped - onto a calendar. Contains information for creating an event. - */ - const DRAG_META_REFINERS = { - startTime: createDuration, - duration: createDuration, - create: Boolean, - sourceId: String, - }; - function parseDragMeta(raw) { - let { refined, extra } = refineProps(raw, DRAG_META_REFINERS); - return { - startTime: refined.startTime || null, - duration: refined.duration || null, - create: refined.create != null ? refined.create : true, - sourceId: refined.sourceId, - leftoverProps: extra, - }; - } - - class CalendarRoot extends BaseComponent { - constructor() { - super(...arguments); - this.state = { - forPrint: false, - }; - this.handleBeforePrint = () => { - this.setState({ forPrint: true }); - }; - this.handleAfterPrint = () => { - this.setState({ forPrint: false }); - }; - } - render() { - let { props } = this; - let { options } = props; - let { forPrint } = this.state; - let isHeightAuto = forPrint || options.height === 'auto' || options.contentHeight === 'auto'; - let height = (!isHeightAuto && options.height != null) ? options.height : ''; - let classNames = [ - 'fc', - forPrint ? 'fc-media-print' : 'fc-media-screen', - `fc-direction-${options.direction}`, - props.theme.getClass('root'), - ]; - if (!getCanVGrowWithinCell()) { - classNames.push('fc-liquid-hack'); - } - return props.children(classNames, height, isHeightAuto, forPrint); - } - componentDidMount() { - let { emitter } = this.props; - emitter.on('_beforeprint', this.handleBeforePrint); - emitter.on('_afterprint', this.handleAfterPrint); - } - componentWillUnmount() { - let { emitter } = this.props; - emitter.off('_beforeprint', this.handleBeforePrint); - emitter.off('_afterprint', this.handleAfterPrint); - } - } - - // Computes a default column header formatting string if `colFormat` is not explicitly defined - function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) { - // if more than one week row, or if there are a lot of columns with not much space, - // put just the day numbers will be in each cell - if (!datesRepDistinctDays || dayCnt > 10) { - return createFormatter({ weekday: 'short' }); // "Sat" - } - if (dayCnt > 1) { - return createFormatter({ weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }); // "Sat 11/12" - } - return createFormatter({ weekday: 'long' }); // "Saturday" - } - - const CLASS_NAME = 'fc-col-header-cell'; // do the cushion too? no - function renderInner$1(renderProps) { - return renderProps.text; - } - - class ContentInjector extends BaseComponent { - constructor() { - super(...arguments); - this.id = guid(); - this.currentDomNodes = []; - this.queuedDomNodes = []; - this.handleEl = (el) => { - if (this.props.elRef) { - setRef(this.props.elRef, el); - } - }; - } - render() { - const { props, context } = this; - const { options } = context; - const { generator, renderProps } = props; - const attrs = buildElAttrs(props); - let innerContent; - let queuedDomNodes = []; - if (hasCustomRenderingHandler(props.generatorName, options)) { - if (options.customRenderingReplacesEl) { - delete attrs.elRef; // because handleEl will be used - } - } - else { - const customContent = typeof generator === 'function' ? - generator(renderProps, h) : - generator; - if (typeof customContent === 'string' || - i$1(customContent) || - Array.isArray(customContent)) { - innerContent = customContent; - } - else if (typeof customContent === 'object') { - if ('html' in customContent) { - attrs.dangerouslySetInnerHTML = { __html: customContent.html }; - } - else if ('domNodes' in customContent) { - queuedDomNodes = Array.prototype.slice.call(customContent.domNodes); - } - } - } - this.queuedDomNodes = queuedDomNodes; - return h(props.elTag, attrs, innerContent); - } - componentDidMount() { - this.applyQueueudDomNodes(); - this.triggerCustomRendering(true); - } - componentDidUpdate() { - this.applyQueueudDomNodes(); - this.triggerCustomRendering(true); - } - componentWillUnmount() { - this.triggerCustomRendering(false); // TODO: different API for removal? - } - triggerCustomRendering(isActive) { - const { props, context } = this; - const { handleCustomRendering, customRenderingMetaMap } = context.options; - if (handleCustomRendering) { - const customRenderingMeta = customRenderingMetaMap === null || customRenderingMetaMap === void 0 ? void 0 : customRenderingMetaMap[props.generatorName]; - if (customRenderingMeta) { - handleCustomRendering(Object.assign({ id: this.id, isActive, containerEl: this.base, reportNewContainerEl: this.handleEl, generatorMeta: customRenderingMeta }, props)); - } - } - } - applyQueueudDomNodes() { - const { queuedDomNodes, currentDomNodes } = this; - const el = this.base; - if (!isArraysEqual(queuedDomNodes, currentDomNodes)) { - currentDomNodes.forEach(removeElement); - for (let newNode of queuedDomNodes) { - el.appendChild(newNode); - } - this.currentDomNodes = queuedDomNodes; - } - } - } - ContentInjector.addPropsEquality({ - elClasses: isArraysEqual, - elStyle: isPropsEqual, - elAttrs: isPropsEqual, - renderProps: isPropsEqual, - }); - // Util - function hasCustomRenderingHandler(generatorName, options) { - var _a; - return Boolean(options.handleCustomRendering && - generatorName && - ((_a = options.customRenderingMetaMap) === null || _a === void 0 ? void 0 : _a[generatorName])); - } - function buildElAttrs(props, extraClassNames) { - const attrs = Object.assign(Object.assign({}, props.elAttrs), { ref: props.elRef }); - if (props.elClasses || extraClassNames) { - attrs.className = (props.elClasses || []) - .concat(extraClassNames || []) - .concat(attrs.className || []) - .filter(Boolean) - .join(' '); - } - if (props.elStyle) { - attrs.style = props.elStyle; - } - return attrs; - } - - const RenderId = createContext(0); - - class ContentContainer extends d { - constructor() { - super(...arguments); - this.InnerContent = InnerContentInjector.bind(undefined, this); - } - render() { - const { props } = this; - const generatedClassNames = generateClassNames(props.classNameGenerator, props.renderProps); - if (props.children) { - const elAttrs = buildElAttrs(props, generatedClassNames); - const children = props.children(this.InnerContent, props.renderProps, elAttrs); - if (props.elTag) { - return h(props.elTag, elAttrs, children); - } - else { - return children; - } - } - else { - return h((ContentInjector), Object.assign(Object.assign({}, props), { elTag: props.elTag || 'div', elClasses: (props.elClasses || []).concat(generatedClassNames), renderId: this.context })); - } - } - componentDidMount() { - var _a, _b; - (_b = (_a = this.props).didMount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.base })); - } - componentWillUnmount() { - var _a, _b; - (_b = (_a = this.props).willUnmount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.base })); - } - } - ContentContainer.contextType = RenderId; - function InnerContentInjector(containerComponent, props) { - const parentProps = containerComponent.props; - return h((ContentInjector), Object.assign({ renderProps: parentProps.renderProps, generatorName: parentProps.generatorName, generator: parentProps.generator, renderId: containerComponent.context }, props)); - } - // Utils - function generateClassNames(classNameGenerator, renderProps) { - const classNames = typeof classNameGenerator === 'function' ? - classNameGenerator(renderProps) : - classNameGenerator || []; - return typeof classNames === 'string' ? [classNames] : classNames; - } - - // BAD name for this class now. used in the Header - class TableDateCell extends BaseComponent { - render() { - let { dateEnv, options, theme, viewApi } = this.context; - let { props } = this; - let { date, dateProfile } = props; - let dayMeta = getDateMeta(date, props.todayRange, null, dateProfile); - let classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme)); - let text = dateEnv.format(date, props.dayHeaderFormat); - // if colCnt is 1, we are already in a day-view and don't need a navlink - let navLinkAttrs = (!dayMeta.isDisabled && props.colCnt > 1) - ? buildNavLinkAttrs(this.context, date) - : {}; - let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta); - return (h(ContentContainer, { elTag: "th", elClasses: classNames, elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan, 'data-date': !dayMeta.isDisabled ? formatDayString(date) : undefined }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContainer) => (h("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && (h(InnerContainer, { elTag: "a", elAttrs: navLinkAttrs, elClasses: [ - 'fc-col-header-cell-cushion', - props.isSticky && 'fc-sticky', - ] })))))); - } - } - - const WEEKDAY_FORMAT = createFormatter({ weekday: 'long' }); - class TableDowCell extends BaseComponent { - render() { - let { props } = this; - let { dateEnv, theme, viewApi, options } = this.context; - let date = addDays(new Date(259200000), props.dow); // start with Sun, 04 Jan 1970 00:00:00 GMT - let dateMeta = { - dow: props.dow, - isDisabled: false, - isFuture: false, - isPast: false, - isToday: false, - isOther: false, - }; - let text = dateEnv.format(date, props.dayHeaderFormat); - let renderProps = Object.assign(Object.assign(Object.assign(Object.assign({ // TODO: make this public? - date }, dateMeta), { view: viewApi }), props.extraRenderProps), { text }); - return (h(ContentContainer, { elTag: "th", elClasses: [ - CLASS_NAME, - ...getDayClassNames(dateMeta, theme), - ...(props.extraClassNames || []), - ], elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => (h("div", { className: "fc-scrollgrid-sync-inner" }, - h(InnerContent, { elTag: "a", elClasses: [ - 'fc-col-header-cell-cushion', - props.isSticky && 'fc-sticky', - ], elAttrs: { - 'aria-label': dateEnv.format(date, WEEKDAY_FORMAT), - } }))))); - } - } - - class NowTimer extends d { - constructor(props, context) { - super(props, context); - this.initialNowDate = getNow(context.options.now, context.dateEnv); - this.initialNowQueriedMs = new Date().valueOf(); - this.state = this.computeTiming().currentState; - } - render() { - let { props, state } = this; - return props.children(state.nowDate, state.todayRange); - } - componentDidMount() { - this.setTimeout(); - } - componentDidUpdate(prevProps) { - if (prevProps.unit !== this.props.unit) { - this.clearTimeout(); - this.setTimeout(); - } - } - componentWillUnmount() { - this.clearTimeout(); - } - computeTiming() { - let { props, context } = this; - let unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs); - let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit); - let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit)); - let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf(); - // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342) - // ensure no longer than a day - waitMs = Math.min(1000 * 60 * 60 * 24, waitMs); - return { - currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) }, - nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) }, - waitMs, - }; - } - setTimeout() { - let { nextState, waitMs } = this.computeTiming(); - this.timeoutId = setTimeout(() => { - this.setState(nextState, () => { - this.setTimeout(); - }); - }, waitMs); - } - clearTimeout() { - if (this.timeoutId) { - clearTimeout(this.timeoutId); - } - } - } - NowTimer.contextType = ViewContextType; - function buildDayRange(date) { - let start = startOfDay(date); - let end = addDays(start, 1); - return { start, end }; - } - - class DayHeader extends BaseComponent { - constructor() { - super(...arguments); - this.createDayHeaderFormatter = memoize(createDayHeaderFormatter); - } - render() { - let { context } = this; - let { dates, dateProfile, datesRepDistinctDays, renderIntro } = this.props; - let dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length); - return (h(NowTimer, { unit: "day" }, (nowDate, todayRange) => (h("tr", { role: "row" }, - renderIntro && renderIntro('day'), - dates.map((date) => (datesRepDistinctDays ? (h(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat })) : (h(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat })))))))); - } - } - function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) { - return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt); - } - - class DaySeriesModel { - constructor(range, dateProfileGenerator) { - let date = range.start; - let { end } = range; - let indices = []; - let dates = []; - let dayIndex = -1; - while (date < end) { // loop each day from start to end - if (dateProfileGenerator.isHiddenDay(date)) { - indices.push(dayIndex + 0.5); // mark that it's between indices - } - else { - dayIndex += 1; - indices.push(dayIndex); - dates.push(date); - } - date = addDays(date, 1); - } - this.dates = dates; - this.indices = indices; - this.cnt = dates.length; - } - sliceRange(range) { - let firstIndex = this.getDateDayIndex(range.start); // inclusive first index - let lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index - let clippedFirstIndex = Math.max(0, firstIndex); - let clippedLastIndex = Math.min(this.cnt - 1, lastIndex); - // deal with in-between indices - clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell - clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell - if (clippedFirstIndex <= clippedLastIndex) { - return { - firstIndex: clippedFirstIndex, - lastIndex: clippedLastIndex, - isStart: firstIndex === clippedFirstIndex, - isEnd: lastIndex === clippedLastIndex, - }; - } - return null; - } - // Given a date, returns its chronolocial cell-index from the first cell of the grid. - // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets. - // If before the first offset, returns a negative number. - // If after the last offset, returns an offset past the last cell offset. - // Only works for *start* dates of cells. Will not work for exclusive end dates for cells. - getDateDayIndex(date) { - let { indices } = this; - let dayOffset = Math.floor(diffDays(this.dates[0], date)); - if (dayOffset < 0) { - return indices[0] - 1; - } - if (dayOffset >= indices.length) { - return indices[indices.length - 1] + 1; - } - return indices[dayOffset]; - } - } - - class DayTableModel { - constructor(daySeries, breakOnWeeks) { - let { dates } = daySeries; - let daysPerRow; - let firstDay; - let rowCnt; - if (breakOnWeeks) { - // count columns until the day-of-week repeats - firstDay = dates[0].getUTCDay(); - for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow += 1) { - if (dates[daysPerRow].getUTCDay() === firstDay) { - break; - } - } - rowCnt = Math.ceil(dates.length / daysPerRow); - } - else { - rowCnt = 1; - daysPerRow = dates.length; - } - this.rowCnt = rowCnt; - this.colCnt = daysPerRow; - this.daySeries = daySeries; - this.cells = this.buildCells(); - this.headerDates = this.buildHeaderDates(); - } - buildCells() { - let rows = []; - for (let row = 0; row < this.rowCnt; row += 1) { - let cells = []; - for (let col = 0; col < this.colCnt; col += 1) { - cells.push(this.buildCell(row, col)); - } - rows.push(cells); - } - return rows; - } - buildCell(row, col) { - let date = this.daySeries.dates[row * this.colCnt + col]; - return { - key: date.toISOString(), - date, - }; - } - buildHeaderDates() { - let dates = []; - for (let col = 0; col < this.colCnt; col += 1) { - dates.push(this.cells[0][col].date); - } - return dates; - } - sliceRange(range) { - let { colCnt } = this; - let seriesSeg = this.daySeries.sliceRange(range); - let segs = []; - if (seriesSeg) { - let { firstIndex, lastIndex } = seriesSeg; - let index = firstIndex; - while (index <= lastIndex) { - let row = Math.floor(index / colCnt); - let nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1); - segs.push({ - row, - firstCol: index % colCnt, - lastCol: (nextIndex - 1) % colCnt, - isStart: seriesSeg.isStart && index === firstIndex, - isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex, - }); - index = nextIndex; - } - } - return segs; - } - } - - class Slicer { - constructor() { - this.sliceBusinessHours = memoize(this._sliceBusinessHours); - this.sliceDateSelection = memoize(this._sliceDateSpan); - this.sliceEventStore = memoize(this._sliceEventStore); - this.sliceEventDrag = memoize(this._sliceInteraction); - this.sliceEventResize = memoize(this._sliceInteraction); - this.forceDayIfListItem = false; // hack - } - sliceProps(props, dateProfile, nextDayThreshold, context, ...extraArgs) { - let { eventUiBases } = props; - let eventSegs = this.sliceEventStore(props.eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs); - return { - dateSelectionSegs: this.sliceDateSelection(props.dateSelection, eventUiBases, context, ...extraArgs), - businessHourSegs: this.sliceBusinessHours(props.businessHours, dateProfile, nextDayThreshold, context, ...extraArgs), - fgEventSegs: eventSegs.fg, - bgEventSegs: eventSegs.bg, - eventDrag: this.sliceEventDrag(props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs), - eventResize: this.sliceEventResize(props.eventResize, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs), - eventSelection: props.eventSelection, - }; // TODO: give interactionSegs? - } - sliceNowDate(// does not memoize - date, context, ...extraArgs) { - return this._sliceDateSpan({ range: { start: date, end: addMs(date, 1) }, allDay: false }, // add 1 ms, protect against null range - {}, context, ...extraArgs); - } - _sliceBusinessHours(businessHours, dateProfile, nextDayThreshold, context, ...extraArgs) { - if (!businessHours) { - return []; - } - return this._sliceEventStore(expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context), {}, dateProfile, nextDayThreshold, ...extraArgs).bg; - } - _sliceEventStore(eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) { - if (eventStore) { - let rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); - return { - bg: this.sliceEventRanges(rangeRes.bg, extraArgs), - fg: this.sliceEventRanges(rangeRes.fg, extraArgs), - }; - } - return { bg: [], fg: [] }; - } - _sliceInteraction(interaction, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) { - if (!interaction) { - return null; - } - let rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); - return { - segs: this.sliceEventRanges(rangeRes.fg, extraArgs), - affectedInstances: interaction.affectedEvents.instances, - isEvent: interaction.isEvent, - }; - } - _sliceDateSpan(dateSpan, eventUiBases, context, ...extraArgs) { - if (!dateSpan) { - return []; - } - let eventRange = fabricateEventRange(dateSpan, eventUiBases, context); - let segs = this.sliceRange(dateSpan.range, ...extraArgs); - for (let seg of segs) { - seg.eventRange = eventRange; - } - return segs; - } - /* - "complete" seg means it has component and eventRange - */ - sliceEventRanges(eventRanges, extraArgs) { - let segs = []; - for (let eventRange of eventRanges) { - segs.push(...this.sliceEventRange(eventRange, extraArgs)); - } - return segs; - } - /* - "complete" seg means it has component and eventRange - */ - sliceEventRange(eventRange, extraArgs) { - let dateRange = eventRange.range; - // hack to make multi-day events that are being force-displayed as list-items to take up only one day - if (this.forceDayIfListItem && eventRange.ui.display === 'list-item') { - dateRange = { - start: dateRange.start, - end: addDays(dateRange.start, 1), - }; - } - let segs = this.sliceRange(dateRange, ...extraArgs); - for (let seg of segs) { - seg.eventRange = eventRange; - seg.isStart = eventRange.isStart && seg.isStart; - seg.isEnd = eventRange.isEnd && seg.isEnd; - } - return segs; - } - } - /* - for incorporating slotMinTime/slotMaxTime if appropriate - TODO: should be part of DateProfile! - TimelineDateProfile already does this btw - */ - function computeActiveRange(dateProfile, isComponentAllDay) { - let range = dateProfile.activeRange; - if (isComponentAllDay) { - return range; - } - return { - start: addMs(range.start, dateProfile.slotMinTime.milliseconds), - end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5), // 864e5 = ms in a day - }; - } - - function reduceEventStore(eventStore, action, eventSources, dateProfile, context) { - switch (action.type) { - case 'RECEIVE_EVENTS': // raw - return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context); - case 'ADD_EVENTS': // already parsed, but not expanded - return addEvent(eventStore, action.eventStore, // new ones - dateProfile ? dateProfile.activeRange : null, context); - case 'RESET_EVENTS': - return action.eventStore; - case 'MERGE_EVENTS': // already parsed and expanded - return mergeEventStores(eventStore, action.eventStore); - case 'PREV': // TODO: how do we track all actions that affect dateProfile :( - case 'NEXT': - case 'CHANGE_DATE': - case 'CHANGE_VIEW_TYPE': - if (dateProfile) { - return expandRecurring(eventStore, dateProfile.activeRange, context); - } - return eventStore; - case 'REMOVE_EVENTS': - return excludeSubEventStore(eventStore, action.eventStore); - case 'REMOVE_EVENT_SOURCE': - return excludeEventsBySourceId(eventStore, action.sourceId); - case 'REMOVE_ALL_EVENT_SOURCES': - return filterEventStoreDefs(eventStore, (eventDef) => (!eventDef.sourceId // only keep events with no source id - )); - case 'REMOVE_ALL_EVENTS': - return createEmptyEventStore(); - default: - return eventStore; - } - } - function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) { - if (eventSource && // not already removed - fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources - ) { - let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context); - if (fetchRange) { - subset = expandRecurring(subset, fetchRange, context); - } - return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset); - } - return eventStore; - } - function transformRawEvents(rawEvents, eventSource, context) { - let calEachTransform = context.options.eventDataTransform; - let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; - if (sourceEachTransform) { - rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform); - } - if (calEachTransform) { - rawEvents = transformEachRawEvent(rawEvents, calEachTransform); - } - return rawEvents; - } - function transformEachRawEvent(rawEvents, func) { - let refinedEvents; - if (!func) { - refinedEvents = rawEvents; - } - else { - refinedEvents = []; - for (let rawEvent of rawEvents) { - let refinedEvent = func(rawEvent); - if (refinedEvent) { - refinedEvents.push(refinedEvent); - } - else if (refinedEvent == null) { - refinedEvents.push(rawEvent); - } // if a different falsy value, do nothing - } - } - return refinedEvents; - } - function addEvent(eventStore, subset, expandRange, context) { - if (expandRange) { - subset = expandRecurring(subset, expandRange, context); - } - return mergeEventStores(eventStore, subset); - } - function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) { - let { defs } = eventStore; - let instances = mapHash(eventStore.instances, (instance) => { - let def = defs[instance.defId]; - if (def.allDay || def.recurringDef) { - return instance; // isn't dependent on timezone - } - return Object.assign(Object.assign({}, instance), { range: { - start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)), - end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)), - }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo }); - }); - return { defs, instances }; - } - function excludeEventsBySourceId(eventStore, sourceId) { - return filterEventStoreDefs(eventStore, (eventDef) => eventDef.sourceId !== sourceId); - } - // QUESTION: why not just return instances? do a general object-property-exclusion util - function excludeInstances(eventStore, removals) { - return { - defs: eventStore.defs, - instances: filterHash(eventStore.instances, (instance) => !removals[instance.instanceId]), - }; - } - - // high-level segmenting-aware tester functions - // ------------------------------------------------------------------------------------------------------------------------ - function isInteractionValid(interaction, dateProfile, context) { - let { instances } = interaction.mutatedEvents; - for (let instanceId in instances) { - if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) { - return false; - } - } - return isNewPropsValid({ eventDrag: interaction }, context); // HACK: the eventDrag props is used for ALL interactions - } - function isDateSelectionValid(dateSelection, dateProfile, context) { - if (!rangeContainsRange(dateProfile.validRange, dateSelection.range)) { - return false; - } - return isNewPropsValid({ dateSelection }, context); - } - function isNewPropsValid(newProps, context) { - let calendarState = context.getCurrentData(); - let props = Object.assign({ businessHours: calendarState.businessHours, dateSelection: '', eventStore: calendarState.eventStore, eventUiBases: calendarState.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps); - return (context.pluginHooks.isPropsValid || isPropsValid)(props, context); - } - function isPropsValid(state, context, dateSpanMeta = {}, filterConfig) { - if (state.eventDrag && !isInteractionPropsValid(state, context, dateSpanMeta, filterConfig)) { - return false; - } - if (state.dateSelection && !isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) { - return false; - } - return true; - } - // Moving Event Validation - // ------------------------------------------------------------------------------------------------------------------------ - function isInteractionPropsValid(state, context, dateSpanMeta, filterConfig) { - let currentState = context.getCurrentData(); - let interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions - let subjectEventStore = interaction.mutatedEvents; - let subjectDefs = subjectEventStore.defs; - let subjectInstances = subjectEventStore.instances; - let subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ? - state.eventUiBases : - { '': currentState.selectionConfig }); - if (filterConfig) { - subjectConfigs = mapHash(subjectConfigs, filterConfig); - } - // exclude the subject events. TODO: exclude defs too? - let otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); - let otherDefs = otherEventStore.defs; - let otherInstances = otherEventStore.instances; - let otherConfigs = compileEventUis(otherDefs, state.eventUiBases); - for (let subjectInstanceId in subjectInstances) { - let subjectInstance = subjectInstances[subjectInstanceId]; - let subjectRange = subjectInstance.range; - let subjectConfig = subjectConfigs[subjectInstance.defId]; - let subjectDef = subjectDefs[subjectInstance.defId]; - // constraint - if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, context)) { - return false; - } - // overlap - let { eventOverlap } = context.options; - let eventOverlapFunc = typeof eventOverlap === 'function' ? eventOverlap : null; - for (let otherInstanceId in otherInstances) { - let otherInstance = otherInstances[otherInstanceId]; - // intersect! evaluate - if (rangesIntersect(subjectRange, otherInstance.range)) { - let otherOverlap = otherConfigs[otherInstance.defId].overlap; - // consider the other event's overlap. only do this if the subject event is a "real" event - if (otherOverlap === false && interaction.isEvent) { - return false; - } - if (subjectConfig.overlap === false) { - return false; - } - if (eventOverlapFunc && !eventOverlapFunc(new EventImpl(context, otherDefs[otherInstance.defId], otherInstance), // still event - new EventImpl(context, subjectDef, subjectInstance))) { - return false; - } - } - } - // allow (a function) - let calendarEventStore = currentState.eventStore; // need global-to-calendar, not local to component (splittable)state - for (let subjectAllow of subjectConfig.allows) { - let subjectDateSpan = Object.assign(Object.assign({}, dateSpanMeta), { range: subjectInstance.range, allDay: subjectDef.allDay }); - let origDef = calendarEventStore.defs[subjectDef.defId]; - let origInstance = calendarEventStore.instances[subjectInstanceId]; - let eventApi; - if (origDef) { // was previously in the calendar - eventApi = new EventImpl(context, origDef, origInstance); - } - else { // was an external event - eventApi = new EventImpl(context, subjectDef); // no instance, because had no dates - } - if (!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context), eventApi)) { - return false; - } - } - } - return true; - } - // Date Selection Validation - // ------------------------------------------------------------------------------------------------------------------------ - function isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig) { - let relevantEventStore = state.eventStore; - let relevantDefs = relevantEventStore.defs; - let relevantInstances = relevantEventStore.instances; - let selection = state.dateSelection; - let selectionRange = selection.range; - let { selectionConfig } = context.getCurrentData(); - if (filterConfig) { - selectionConfig = filterConfig(selectionConfig); - } - // constraint - if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, context)) { - return false; - } - // overlap - let { selectOverlap } = context.options; - let selectOverlapFunc = typeof selectOverlap === 'function' ? selectOverlap : null; - for (let relevantInstanceId in relevantInstances) { - let relevantInstance = relevantInstances[relevantInstanceId]; - // intersect! evaluate - if (rangesIntersect(selectionRange, relevantInstance.range)) { - if (selectionConfig.overlap === false) { - return false; - } - if (selectOverlapFunc && !selectOverlapFunc(new EventImpl(context, relevantDefs[relevantInstance.defId], relevantInstance), null)) { - return false; - } - } - } - // allow (a function) - for (let selectionAllow of selectionConfig.allows) { - let fullDateSpan = Object.assign(Object.assign({}, dateSpanMeta), selection); - if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan, context), null)) { - return false; - } - } - return true; - } - // Constraint Utils - // ------------------------------------------------------------------------------------------------------------------------ - function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, context) { - for (let constraint of constraints) { - if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context), subjectRange)) { - return false; - } - } - return true; - } - function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours - otherEventStore, // for if constraint is an even group ID - businessHoursUnexpanded, // for if constraint is 'businessHours' - context) { - if (constraint === 'businessHours') { - return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, context)); - } - if (typeof constraint === 'string') { // an group ID - return eventStoreToRanges(filterEventStoreDefs(otherEventStore, (eventDef) => eventDef.groupId === constraint)); - } - if (typeof constraint === 'object' && constraint) { // non-null object - return eventStoreToRanges(expandRecurring(constraint, subjectRange, context)); - } - return []; // if it's false - } - // TODO: move to event-store file? - function eventStoreToRanges(eventStore) { - let { instances } = eventStore; - let ranges = []; - for (let instanceId in instances) { - ranges.push(instances[instanceId].range); - } - return ranges; - } - // TODO: move to geom file? - function anyRangesContainRange(outerRanges, innerRange) { - for (let outerRange of outerRanges) { - if (rangeContainsRange(outerRange, innerRange)) { - return true; - } - } - return false; - } - - class JsonRequestError extends Error { - constructor(message, response) { - super(message); - this.response = response; - } - } - function requestJson(method, url, params) { - method = method.toUpperCase(); - const fetchOptions = { - method, - }; - if (method === 'GET') { - url += (url.indexOf('?') === -1 ? '?' : '&') + - new URLSearchParams(params); - } - else { - fetchOptions.body = new URLSearchParams(params); - fetchOptions.headers = { - 'Content-Type': 'application/x-www-form-urlencoded', - }; - } - return fetch(url, fetchOptions).then((fetchRes) => { - if (fetchRes.ok) { - return fetchRes.json().then((parsedResponse) => { - return [parsedResponse, fetchRes]; - }, () => { - throw new JsonRequestError('Failure parsing JSON', fetchRes); - }); - } - else { - throw new JsonRequestError('Request failed', fetchRes); - } - }); - } - - class DelayedRunner { - constructor(drainedOption) { - this.drainedOption = drainedOption; - this.isRunning = false; - this.isDirty = false; - this.pauseDepths = {}; - this.timeoutId = 0; - } - request(delay) { - this.isDirty = true; - if (!this.isPaused()) { - this.clearTimeout(); - if (delay == null) { - this.tryDrain(); - } - else { - this.timeoutId = setTimeout(// NOT OPTIMAL! TODO: look at debounce - this.tryDrain.bind(this), delay); - } - } - } - pause(scope = '') { - let { pauseDepths } = this; - pauseDepths[scope] = (pauseDepths[scope] || 0) + 1; - this.clearTimeout(); - } - resume(scope = '', force) { - let { pauseDepths } = this; - if (scope in pauseDepths) { - if (force) { - delete pauseDepths[scope]; - } - else { - pauseDepths[scope] -= 1; - let depth = pauseDepths[scope]; - if (depth <= 0) { - delete pauseDepths[scope]; - } - } - this.tryDrain(); - } - } - isPaused() { - return Object.keys(this.pauseDepths).length; - } - tryDrain() { - if (!this.isRunning && !this.isPaused()) { - this.isRunning = true; - while (this.isDirty) { - this.isDirty = false; - this.drained(); // might set isDirty to true again - } - this.isRunning = false; - } - } - clear() { - this.clearTimeout(); - this.isDirty = false; - this.pauseDepths = {}; - } - clearTimeout() { - if (this.timeoutId) { - clearTimeout(this.timeoutId); - this.timeoutId = 0; - } - } - drained() { - if (this.drainedOption) { - this.drainedOption(); - } - } - } - - const VISIBLE_HIDDEN_RE = /^(visible|hidden)$/; - class Scroller extends BaseComponent { - constructor() { - super(...arguments); - this.handleEl = (el) => { - this.el = el; - setRef(this.props.elRef, el); - }; - } - render() { - let { props } = this; - let { liquid, liquidIsAbsolute } = props; - let isAbsolute = liquid && liquidIsAbsolute; - let className = ['fc-scroller']; - if (liquid) { - if (liquidIsAbsolute) { - className.push('fc-scroller-liquid-absolute'); - } - else { - className.push('fc-scroller-liquid'); - } - } - return (h("div", { ref: this.handleEl, className: className.join(' '), style: { - overflowX: props.overflowX, - overflowY: props.overflowY, - left: (isAbsolute && -(props.overcomeLeft || 0)) || '', - right: (isAbsolute && -(props.overcomeRight || 0)) || '', - bottom: (isAbsolute && -(props.overcomeBottom || 0)) || '', - marginLeft: (!isAbsolute && -(props.overcomeLeft || 0)) || '', - marginRight: (!isAbsolute && -(props.overcomeRight || 0)) || '', - marginBottom: (!isAbsolute && -(props.overcomeBottom || 0)) || '', - maxHeight: props.maxHeight || '', - } }, props.children)); - } - needsXScrolling() { - if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { - return false; - } - // testing scrollWidth>clientWidth is unreliable cross-browser when pixel heights aren't integers. - // much more reliable to see if children are taller than the scroller, even tho doesn't account for - // inner-child margins and absolute positioning - let { el } = this; - let realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth(); - let { children } = el; - for (let i = 0; i < children.length; i += 1) { - let childEl = children[i]; - if (childEl.getBoundingClientRect().width > realClientWidth) { - return true; - } - } - return false; - } - needsYScrolling() { - if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { - return false; - } - // testing scrollHeight>clientHeight is unreliable cross-browser when pixel heights aren't integers. - // much more reliable to see if children are taller than the scroller, even tho doesn't account for - // inner-child margins and absolute positioning - let { el } = this; - let realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth(); - let { children } = el; - for (let i = 0; i < children.length; i += 1) { - let childEl = children[i]; - if (childEl.getBoundingClientRect().height > realClientHeight) { - return true; - } - } - return false; - } - getXScrollbarWidth() { - if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { - return 0; - } - return this.el.offsetHeight - this.el.clientHeight; // only works because we guarantee no borders. TODO: add to CSS with important? - } - getYScrollbarWidth() { - if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { - return 0; - } - return this.el.offsetWidth - this.el.clientWidth; // only works because we guarantee no borders. TODO: add to CSS with important? - } - } - - /* - TODO: somehow infer OtherArgs from masterCallback? - TODO: infer RefType from masterCallback if provided - */ - class RefMap { - constructor(masterCallback) { - this.masterCallback = masterCallback; - this.currentMap = {}; - this.depths = {}; - this.callbackMap = {}; - this.handleValue = (val, key) => { - let { depths, currentMap } = this; - let removed = false; - let added = false; - if (val !== null) { - // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore - removed = (key in currentMap); - currentMap[key] = val; - depths[key] = (depths[key] || 0) + 1; - added = true; - } - else { - depths[key] -= 1; - if (!depths[key]) { - delete currentMap[key]; - delete this.callbackMap[key]; - removed = true; - } - } - if (this.masterCallback) { - if (removed) { - this.masterCallback(null, String(key)); - } - if (added) { - this.masterCallback(val, String(key)); - } - } - }; - } - createRef(key) { - let refCallback = this.callbackMap[key]; - if (!refCallback) { - refCallback = this.callbackMap[key] = (val) => { - this.handleValue(val, String(key)); - }; - } - return refCallback; - } - // TODO: check callers that don't care about order. should use getAll instead - // NOTE: this method has become less valuable now that we are encouraged to map order by some other index - // TODO: provide ONE array-export function, buildArray, which fails on non-numeric indexes. caller can manipulate and "collect" - collect(startIndex, endIndex, step) { - return collectFromHash(this.currentMap, startIndex, endIndex, step); - } - getAll() { - return hashValuesToArray(this.currentMap); - } - } - - function computeShrinkWidth(chunkEls) { - let shrinkCells = findElements(chunkEls, '.fc-scrollgrid-shrink'); - let largestWidth = 0; - for (let shrinkCell of shrinkCells) { - largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell)); - } - return Math.ceil(largestWidth); // elements work best with integers. round up to ensure contents fits - } - function getSectionHasLiquidHeight(props, sectionConfig) { - return props.liquid && sectionConfig.liquid; // does the section do liquid-height? (need to have whole scrollgrid liquid-height as well) - } - function getAllowYScrolling(props, sectionConfig) { - return sectionConfig.maxHeight != null || // if its possible for the height to max out, we might need scrollbars - 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, isHeader) { - let { expandRows } = arg; - let content = typeof chunkConfig.content === 'function' ? - chunkConfig.content(arg) : - h('table', { - role: 'presentation', - className: [ - chunkConfig.tableClassName, - sectionConfig.syncRowHeights ? 'fc-scrollgrid-sync-table' : '', - ].join(' '), - style: { - minWidth: arg.tableMinWidth, - width: arg.clientWidth, - height: expandRows ? arg.clientHeight : '', // css `height` on a
serves as a min-height - }, - }, arg.tableColGroupNode, h(isHeader ? 'thead' : 'tbody', { - role: 'presentation', - }, typeof chunkConfig.rowContent === 'function' - ? chunkConfig.rowContent(arg) - : chunkConfig.rowContent)); - return content; - } - function isColPropsEqual(cols0, cols1) { - return isArraysEqual(cols0, cols1, isPropsEqual); - } - function renderMicroColGroup(cols, shrinkWidth) { - let colNodes = []; - /* - for ColProps with spans, it would have been great to make a single - HOWEVER, Chrome was getting messing up distributing the width to elements makes Chrome behave. - */ - for (let colProps of cols) { - let span = colProps.span || 1; - for (let i = 0; i < span; i += 1) { - colNodes.push(h("col", { style: { - width: colProps.width === 'shrink' ? sanitizeShrinkWidth(shrinkWidth) : (colProps.width || ''), - minWidth: colProps.minWidth || '', - } })); - } - } - return h('colgroup', {}, ...colNodes); - } - function sanitizeShrinkWidth(shrinkWidth) { - /* why 4? if we do 0, it will kill any border, which are needed for computeSmallestCellWidth - 4 accounts for 2 2-pixel borders. TODO: better solution? */ - return shrinkWidth == null ? 4 : shrinkWidth; - } - function hasShrinkWidth(cols) { - for (let col of cols) { - if (col.width === 'shrink') { - return true; - } - } - return false; - } - function getScrollGridClassNames(liquid, context) { - let classNames = [ - 'fc-scrollgrid', - context.theme.getClass('table'), - ]; - if (liquid) { - classNames.push('fc-scrollgrid-liquid'); - } - return classNames; - } - function getSectionClassNames(sectionConfig, wholeTableVGrow) { - let classNames = [ - 'fc-scrollgrid-section', - `fc-scrollgrid-section-${sectionConfig.type}`, - sectionConfig.className, // used? - ]; - if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) { - classNames.push('fc-scrollgrid-section-liquid'); - } - if (sectionConfig.isSticky) { - classNames.push('fc-scrollgrid-section-sticky'); - } - return classNames; - } - function renderScrollShim(arg) { - return (h("div", { className: "fc-scrollgrid-sticky-shim", style: { - width: arg.clientWidth, - minWidth: arg.tableMinWidth, - } })); - } - function getStickyHeaderDates(options) { - let { stickyHeaderDates } = options; - if (stickyHeaderDates == null || stickyHeaderDates === 'auto') { - stickyHeaderDates = options.height === 'auto' || options.viewHeight === 'auto'; - } - return stickyHeaderDates; - } - function getStickyFooterScrollbar(options) { - let { stickyFooterScrollbar } = options; - if (stickyFooterScrollbar == null || stickyFooterScrollbar === 'auto') { - stickyFooterScrollbar = options.height === 'auto' || options.viewHeight === 'auto'; - } - return stickyFooterScrollbar; - } - - class SimpleScrollGrid extends BaseComponent { - constructor() { - super(...arguments); - this.processCols = memoize((a) => a, isColPropsEqual); // so we get same `cols` props every time - // yucky to memoize VNodes, but much more efficient for consumers - this.renderMicroColGroup = memoize(renderMicroColGroup); - this.scrollerRefs = new RefMap(); - this.scrollerElRefs = new RefMap(this._handleScrollerEl.bind(this)); - this.state = { - shrinkWidth: null, - forceYScrollbars: false, - scrollerClientWidths: {}, - scrollerClientHeights: {}, - }; - // TODO: can do a really simple print-view. dont need to join rows - this.handleSizing = () => { - this.safeSetState(Object.assign({ shrinkWidth: this.computeShrinkWidth() }, this.computeScrollerDims())); - }; - } - render() { - let { props, state, context } = this; - let sectionConfigs = props.sections || []; - let cols = this.processCols(props.cols); - let microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth); - let classNames = getScrollGridClassNames(props.liquid, context); - if (props.collapsibleWidth) { - classNames.push('fc-scrollgrid-collapsible'); - } - // TODO: make DRY - let configCnt = sectionConfigs.length; - let configI = 0; - let currentConfig; - let headSectionNodes = []; - let bodySectionNodes = []; - let footSectionNodes = []; - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') { - headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); - configI += 1; - } - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') { - bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false)); - configI += 1; - } - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') { - footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); - configI += 1; - } - // firefox bug: when setting height on table and there is a thead or tfoot, - // the necessary height:100% on the liquid-height body section forces the *whole* table to be taller. (bug #5524) - // use getCanVGrowWithinCell as a way to detect table-stupid firefox. - // if so, use a simpler dom structure, jam everything into a lone tbody. - let isBuggy = !getCanVGrowWithinCell(); - const roleAttrs = { role: 'rowgroup' }; - return h('table', { - role: 'grid', - className: classNames.join(' '), - style: { height: props.height }, - }, Boolean(!isBuggy && headSectionNodes.length) && h('thead', roleAttrs, ...headSectionNodes), Boolean(!isBuggy && bodySectionNodes.length) && h('tbody', roleAttrs, ...bodySectionNodes), Boolean(!isBuggy && footSectionNodes.length) && h('tfoot', roleAttrs, ...footSectionNodes), isBuggy && h('tbody', roleAttrs, ...headSectionNodes, ...bodySectionNodes, ...footSectionNodes)); - } - renderSection(sectionConfig, microColGroupNode, isHeader) { - if ('outerContent' in sectionConfig) { - return (h(p, { key: sectionConfig.key }, sectionConfig.outerContent)); - } - return (h("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader))); - } - renderChunkTd(sectionConfig, microColGroupNode, chunkConfig, isHeader) { - if ('outerContent' in chunkConfig) { - return chunkConfig.outerContent; - } - let { props } = this; - let { forceYScrollbars, scrollerClientWidths, scrollerClientHeights } = this.state; - let needsYScrolling = getAllowYScrolling(props, sectionConfig); // TODO: do lazily. do in section config? - let isLiquid = getSectionHasLiquidHeight(props, sectionConfig); - // for `!props.liquid` - is WHOLE scrollgrid natural height? - // TODO: do same thing in advanced scrollgrid? prolly not b/c always has horizontal scrollbars - let overflowY = !props.liquid ? 'visible' : - forceYScrollbars ? 'scroll' : - !needsYScrolling ? 'hidden' : - 'auto'; - let sectionKey = sectionConfig.key; - let content = renderChunkContent(sectionConfig, chunkConfig, { - tableColGroupNode: microColGroupNode, - tableMinWidth: '', - clientWidth: (!props.collapsibleWidth && scrollerClientWidths[sectionKey] !== undefined) ? scrollerClientWidths[sectionKey] : null, - clientHeight: scrollerClientHeights[sectionKey] !== undefined ? scrollerClientHeights[sectionKey] : null, - expandRows: sectionConfig.expandRows, - syncRowHeights: false, - rowSyncHeights: [], - reportRowHeightChange: () => { }, - }, isHeader); - return h(isHeader ? 'th' : 'td', { - ref: chunkConfig.elRef, - role: 'presentation', - }, h("div", { className: `fc-scroller-harness${isLiquid ? ' fc-scroller-harness-liquid' : ''}` }, - h(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))); - } - _handleScrollerEl(scrollerEl, key) { - let section = getSectionByKey(this.props.sections, key); - if (section) { - setRef(section.chunk.scrollerElRef, scrollerEl); - } - } - componentDidMount() { - this.handleSizing(); - this.context.addResizeHandler(this.handleSizing); - } - componentDidUpdate() { - // TODO: need better solution when state contains non-sizing things - this.handleSizing(); - } - componentWillUnmount() { - this.context.removeResizeHandler(this.handleSizing); - } - computeShrinkWidth() { - return hasShrinkWidth(this.props.cols) - ? computeShrinkWidth(this.scrollerElRefs.getAll()) - : 0; - } - computeScrollerDims() { - let scrollbarWidth = getScrollbarWidths(); - let { scrollerRefs, scrollerElRefs } = this; - let forceYScrollbars = false; - let scrollerClientWidths = {}; - let scrollerClientHeights = {}; - for (let sectionKey in scrollerRefs.currentMap) { - let scroller = scrollerRefs.currentMap[sectionKey]; - if (scroller && scroller.needsYScrolling()) { - forceYScrollbars = true; - break; - } - } - for (let section of this.props.sections) { - let sectionKey = section.key; - let scrollerEl = scrollerElRefs.currentMap[sectionKey]; - if (scrollerEl) { - let harnessEl = scrollerEl.parentNode; // TODO: weird way to get this. need harness b/c doesn't include table borders - scrollerClientWidths[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars - ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future - : 0)); - scrollerClientHeights[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().height); - } - } - return { forceYScrollbars, scrollerClientWidths, scrollerClientHeights }; - } - } - SimpleScrollGrid.addStateEquality({ - scrollerClientWidths: isPropsEqual, - scrollerClientHeights: isPropsEqual, - }); - function getSectionByKey(sections, key) { - for (let section of sections) { - if (section.key === key) { - return section; - } - } - return null; - } - - class EventContainer extends BaseComponent { - constructor() { - super(...arguments); - this.handleEl = (el) => { - if (el) { - setElSeg(el, this.props.seg); - } - // TODO: when null, should unset to avoid memory leaks? - }; - } - render() { - const { props, context } = this; - const { options } = context; - const { seg } = props; - const { eventRange } = seg; - const { ui } = eventRange; - const renderProps = { - event: new EventImpl(context, eventRange.def, eventRange.instance), - view: context.viewApi, - timeText: props.timeText, - textColor: ui.textColor, - backgroundColor: ui.backgroundColor, - borderColor: ui.borderColor, - isDraggable: !props.disableDragging && computeSegDraggable(seg, context), - isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context), - isEndResizable: !props.disableResizing && computeSegEndResizable(seg), - isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting), - isStart: Boolean(seg.isStart), - isEnd: Boolean(seg.isEnd), - isPast: Boolean(props.isPast), - isFuture: Boolean(props.isFuture), - isToday: Boolean(props.isToday), - isSelected: Boolean(props.isSelected), - isDragging: Boolean(props.isDragging), - isResizing: Boolean(props.isResizing), - }; - return (h(ContentContainer, Object.assign({}, props /* contains children */, { elRef: this.handleEl, elClasses: [ - ...getEventClassNames(renderProps), - ...seg.eventRange.ui.classNames, - ...(props.elClasses || []), - ], renderProps: renderProps, generatorName: "eventContent", generator: options.eventContent || props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount }))); - } - } - - // should not be a purecomponent - class StandardEvent extends BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let { seg } = props; - let { ui } = seg.eventRange; - let timeFormat = options.eventTimeFormat || props.defaultTimeFormat; - let timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd); - return (h(EventContainer, Object.assign({}, props /* includes elRef */, { elTag: "a", elStyle: { - borderColor: ui.borderColor, - backgroundColor: ui.backgroundColor, - }, elAttrs: getSegAnchorAttrs(seg, context), defaultGenerator: renderInnerContent$1, timeText: timeText }), (InnerContent, eventContentArg) => (h(p, null, - h(InnerContent, { elTag: "div", elClasses: ['fc-event-main'], elStyle: { color: eventContentArg.textColor } }), - Boolean(eventContentArg.isStartResizable) && (h("div", { className: "fc-event-resizer fc-event-resizer-start" })), - Boolean(eventContentArg.isEndResizable) && (h("div", { className: "fc-event-resizer fc-event-resizer-end" })))))); - } - } - function renderInnerContent$1(innerProps) { - return (h("div", { className: "fc-event-main-frame" }, - innerProps.timeText && (h("div", { className: "fc-event-time" }, innerProps.timeText)), - h("div", { className: "fc-event-title-container" }, - h("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || h(p, null, "\u00A0"))))); - } - - const NowIndicatorContainer = (props) => (h(ViewContextType.Consumer, null, (context) => { - let { options } = context; - let renderProps = { - isAxis: props.isAxis, - date: context.dateEnv.toDate(props.date), - view: context.viewApi, - }; - return (h(ContentContainer, Object.assign({}, props /* includes children */, { elTag: props.elTag || 'div', renderProps: renderProps, generatorName: "nowIndicatorContent", generator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }))); - })); - - const DAY_NUM_FORMAT = createFormatter({ day: 'numeric' }); - class DayCellContainer extends BaseComponent { - constructor() { - super(...arguments); - this.refineRenderProps = memoizeObjArg(refineRenderProps); - } - render() { - let { props, context } = this; - let { options } = context; - let renderProps = this.refineRenderProps({ - date: props.date, - dateProfile: props.dateProfile, - todayRange: props.todayRange, - showDayNumber: props.showDayNumber, - extraRenderProps: props.extraRenderProps, - viewApi: context.viewApi, - dateEnv: context.dateEnv, - }); - return (h(ContentContainer, Object.assign({}, props /* includes children */, { elClasses: [ - ...getDayClassNames(renderProps, context.theme), - ...(props.elClasses || []), - ], elAttrs: Object.assign(Object.assign({}, props.elAttrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), renderProps: renderProps, generatorName: "dayCellContent", generator: options.dayCellContent || props.defaultGenerator, classNameGenerator: - // don't use custom classNames if disabled - renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount }))); - } - } - function hasCustomDayCellContent(options) { - return Boolean(options.dayCellContent || hasCustomRenderingHandler('dayCellContent', options)); - } - function refineRenderProps(raw) { - let { date, dateEnv } = raw; - let dayMeta = getDateMeta(date, raw.todayRange, null, raw.dateProfile); - return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ? dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraRenderProps); - } - - class BgEvent extends BaseComponent { - render() { - let { props } = this; - let { seg } = props; - return (h(EventContainer, { elTag: "div", elClasses: ['fc-bg-event'], elStyle: { backgroundColor: seg.eventRange.ui.backgroundColor }, defaultGenerator: renderInnerContent, seg: seg, timeText: "", isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, disableDragging: true, disableResizing: true })); - } - } - function renderInnerContent(props) { - let { title } = props.event; - return title && (h("div", { className: "fc-event-title" }, props.event.title)); - } - function renderFill(fillType) { - return (h("div", { className: `fc-${fillType}` })); - } - - const WeekNumberContainer = (props) => (h(ViewContextType.Consumer, null, (context) => { - let { dateEnv, options } = context; - let { date } = props; - let format = options.weekNumberFormat || props.defaultFormat; - let num = dateEnv.computeWeekNumber(date); // TODO: somehow use for formatting as well? - let text = dateEnv.format(date, format); - let renderProps = { num, text, date }; - return (h(ContentContainer // why isn't WeekNumberContentArg being auto-detected? - , Object.assign({}, props /* includes children */, { renderProps: renderProps, generatorName: "weekNumberContent", generator: options.weekNumberContent || renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }))); - })); - function renderInner(innerProps) { - return innerProps.text; - } - - const PADDING_FROM_VIEWPORT = 10; - class Popover extends BaseComponent { - constructor() { - super(...arguments); - this.state = { - titleId: getUniqueDomId(), - }; - this.handleRootEl = (el) => { - this.rootEl = el; - if (this.props.elRef) { - setRef(this.props.elRef, el); - } - }; - // Triggered when the user clicks *anywhere* in the document, for the autoHide feature - this.handleDocumentMouseDown = (ev) => { - // only hide the popover if the click happened outside the popover - const target = getEventTargetViaRoot(ev); - if (!this.rootEl.contains(target)) { - this.handleCloseClick(); - } - }; - this.handleDocumentKeyDown = (ev) => { - if (ev.key === 'Escape') { - this.handleCloseClick(); - } - }; - this.handleCloseClick = () => { - let { onClose } = this.props; - if (onClose) { - onClose(); - } - }; - } - render() { - let { theme, options } = this.context; - let { props, state } = this; - let classNames = [ - 'fc-popover', - theme.getClass('popover'), - ].concat(props.extraClassNames || []); - return j(h("div", Object.assign({}, props.extraAttrs, { id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId, ref: this.handleRootEl }), - h("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') }, - h("span", { className: "fc-popover-title", id: state.titleId }, props.title), - h("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })), - h("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl); - } - componentDidMount() { - document.addEventListener('mousedown', this.handleDocumentMouseDown); - document.addEventListener('keydown', this.handleDocumentKeyDown); - this.updateSize(); - } - componentWillUnmount() { - document.removeEventListener('mousedown', this.handleDocumentMouseDown); - document.removeEventListener('keydown', this.handleDocumentKeyDown); - } - updateSize() { - let { isRtl } = this.context; - let { alignmentEl, alignGridTop } = this.props; - let { rootEl } = this; - let alignmentRect = computeClippedClientRect(alignmentEl); - if (alignmentRect) { - let popoverDims = rootEl.getBoundingClientRect(); - // position relative to viewport - let popoverTop = alignGridTop - ? elementClosest(alignmentEl, '.fc-scrollgrid').getBoundingClientRect().top - : alignmentRect.top; - let popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left; - // constrain - popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT); - popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width); - popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT); - let origin = rootEl.offsetParent.getBoundingClientRect(); - applyStyle(rootEl, { - top: popoverTop - origin.top, - left: popoverLeft - origin.left, - }); - } - } - } - - class MorePopover extends DateComponent { - constructor() { - super(...arguments); - this.handleRootEl = (rootEl) => { - this.rootEl = rootEl; - if (rootEl) { - this.context.registerInteractiveComponent(this, { - el: rootEl, - useEventCenter: false, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; - } - render() { - let { options, dateEnv } = this.context; - let { props } = this; - let { startDate, todayRange, dateProfile } = props; - let title = dateEnv.format(startDate, options.dayPopoverFormat); - return (h(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateProfile: dateProfile, todayRange: todayRange }, (InnerContent, renderProps, elAttrs) => (h(Popover, { elRef: elAttrs.ref, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(elAttrs.className || []), extraAttrs: elAttrs /* TODO: make these time-based when not whole-day? */, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, - hasCustomDayCellContent(options) && (h(InnerContent, { elTag: "div", elClasses: ['fc-more-popover-misc'] })), - props.children)))); - } - queryHit(positionLeft, positionTop, elWidth, elHeight) { - let { rootEl, props } = this; - if (positionLeft >= 0 && positionLeft < elWidth && - positionTop >= 0 && positionTop < elHeight) { - return { - dateProfile: props.dateProfile, - dateSpan: Object.assign({ allDay: true, range: { - start: props.startDate, - end: props.endDate, - } }, props.extraDateSpan), - dayEl: rootEl, - rect: { - left: 0, - top: 0, - right: elWidth, - bottom: elHeight, - }, - layer: 1, // important when comparing with hits from other components - }; - } - return null; - } - } - - class MoreLinkContainer extends BaseComponent { - constructor() { - super(...arguments); - this.linkElRef = y(); - this.state = { - isPopoverOpen: false, - popoverId: getUniqueDomId(), - }; - this.handleClick = (ev) => { - let { props, context } = this; - let { moreLinkClick } = context.options; - let date = computeRange(props).start; - function buildPublicSeg(seg) { - let { def, instance, range } = seg.eventRange; - return { - event: new EventImpl(context, def, instance), - start: context.dateEnv.toDate(range.start), - end: context.dateEnv.toDate(range.end), - isStart: seg.isStart, - isEnd: seg.isEnd, - }; - } - if (typeof moreLinkClick === 'function') { - moreLinkClick = moreLinkClick({ - date, - allDay: Boolean(props.allDayDate), - allSegs: props.allSegs.map(buildPublicSeg), - hiddenSegs: props.hiddenSegs.map(buildPublicSeg), - jsEvent: ev, - view: context.viewApi, - }); - } - if (!moreLinkClick || moreLinkClick === 'popover') { - this.setState({ isPopoverOpen: true }); - } - else if (typeof moreLinkClick === 'string') { // a view name - context.calendarApi.zoomTo(date, moreLinkClick); - } - }; - this.handlePopoverClose = () => { - this.setState({ isPopoverOpen: false }); - }; - } - render() { - let { props, state } = this; - return (h(ViewContextType.Consumer, null, (context) => { - let { viewApi, options, calendarApi } = context; - let { moreLinkText } = options; - let { moreCnt } = props; - let range = computeRange(props); - let text = typeof moreLinkText === 'function' // TODO: eventually use formatWithOrdinals - ? moreLinkText.call(calendarApi, moreCnt) - : `+${moreCnt} ${moreLinkText}`; - let hint = formatWithOrdinals(options.moreLinkHint, [moreCnt], text); - let renderProps = { - num: moreCnt, - shortText: `+${moreCnt}`, - text, - view: viewApi, - }; - return (h(p, null, - Boolean(props.moreCnt) && (h(ContentContainer, { elTag: props.elTag || 'a', elRef: this.linkElRef, elClasses: [ - ...(props.elClasses || []), - 'fc-more-link', - ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.elAttrs), createAriaClickAttrs(this.handleClick)), { title: hint, 'aria-expanded': state.isPopoverOpen, 'aria-controls': state.isPopoverOpen ? state.popoverId : '' }), renderProps: renderProps, generatorName: "moreLinkContent", generator: options.moreLinkContent || props.defaultGenerator || renderMoreLinkInner, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children)), - state.isPopoverOpen && (h(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 ? - props.alignmentElRef.current : - this.linkElRef.current, alignGridTop: props.alignGridTop, onClose: this.handlePopoverClose }, props.popoverContent())))); - })); - } - componentDidMount() { - this.updateParentEl(); - } - componentDidUpdate() { - this.updateParentEl(); - } - updateParentEl() { - if (this.linkElRef.current) { - this.parentEl = elementClosest(this.linkElRef.current, '.fc-view-harness'); - } - } - } - function renderMoreLinkInner(props) { - return props.text; - } - function computeRange(props) { - if (props.allDayDate) { - return { - start: props.allDayDate, - end: addDays(props.allDayDate, 1), - }; - } - let { hiddenSegs } = props; - return { - start: computeEarliestSegStart(hiddenSegs), - end: computeLatestSegEnd(hiddenSegs), - }; - } - function computeEarliestSegStart(segs) { - return segs.reduce(pickEarliestStart).eventRange.range.start; - } - function pickEarliestStart(seg0, seg1) { - return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1; - } - function computeLatestSegEnd(segs) { - return segs.reduce(pickLatestEnd).eventRange.range.end; - } - function pickLatestEnd(seg0, seg1) { - return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1; - } - - class ViewContainer$1 extends BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let renderProps = { view: context.viewApi }; - return (h(ContentContainer, Object.assign({}, props, { elTag: props.elTag || 'div', elClasses: [ - ...buildViewClassNames(props.viewSpec), - ...(props.elClasses || []), - ], renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, generator: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children)); - } - } - function buildViewClassNames(viewSpec) { - return [ - `fc-${viewSpec.type}-view`, - 'fc-view', - ]; - } - - function injectStyles(css) { - if (!css || typeof document === 'undefined') { - return; - } - const head = document.head || document.getElementsByTagName('head')[0]; - const style = document.createElement('style'); - style.type = 'text/css'; - head.appendChild(style); - if (style.styleSheet) { - style.styleSheet.cssText = css; - } - else { - style.appendChild(document.createTextNode(css)); - } - } - - const EVENT_SOURCE_REFINERS = { - id: String, - defaultAllDay: Boolean, - url: String, - format: String, - events: identity, - eventDataTransform: identity, - // for any network-related sources - success: identity, - failure: identity, - }; - function parseEventSource(raw, context, refiners = buildEventSourceRefiners(context)) { - let rawObj; - if (typeof raw === 'string') { - rawObj = { url: raw }; - } - else if (typeof raw === 'function' || Array.isArray(raw)) { - rawObj = { events: raw }; - } - else if (typeof raw === 'object' && raw) { // not null - rawObj = raw; - } - if (rawObj) { - let { refined, extra } = refineProps(rawObj, refiners); - let metaRes = buildEventSourceMeta(refined, context); - if (metaRes) { - return { - _raw: raw, - isFetching: false, - latestFetchId: '', - fetchRange: null, - defaultAllDay: refined.defaultAllDay, - eventDataTransform: refined.eventDataTransform, - success: refined.success, - failure: refined.failure, - publicId: refined.id || '', - sourceId: guid(), - sourceDefId: metaRes.sourceDefId, - meta: metaRes.meta, - ui: createEventUi(refined, context), - extendedProps: extra, - }; - } - } - return null; - } - function buildEventSourceRefiners(context) { - return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners); - } - function buildEventSourceMeta(raw, context) { - let defs = context.pluginHooks.eventSourceDefs; - for (let i = defs.length - 1; i >= 0; i -= 1) { // later-added plugins take precedence - let def = defs[i]; - let meta = def.parseMeta(raw); - if (meta) { - return { sourceDefId: i, meta }; - } - } - return null; - } - - class CalendarImpl { - getCurrentData() { - return this.currentDataManager.getCurrentData(); - } - dispatch(action) { - this.currentDataManager.dispatch(action); - } - get view() { return this.getCurrentData().viewApi; } - batchRendering(callback) { - callback(); - } - updateSize() { - this.trigger('_resize', true); - } - // Options - // ----------------------------------------------------------------------------------------------------------------- - setOption(name, val) { - this.dispatch({ - type: 'SET_OPTION', - optionName: name, - rawOptionValue: val, - }); - } - getOption(name) { - return this.currentDataManager.currentCalendarOptionsInput[name]; - } - getAvailableLocaleCodes() { - return Object.keys(this.getCurrentData().availableRawLocales); - } - // Trigger - // ----------------------------------------------------------------------------------------------------------------- - on(handlerName, handler) { - let { currentDataManager } = this; - if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) { - currentDataManager.emitter.on(handlerName, handler); - } - else { - console.warn(`Unknown listener name '${handlerName}'`); - } - } - off(handlerName, handler) { - this.currentDataManager.emitter.off(handlerName, handler); - } - // not meant for public use - trigger(handlerName, ...args) { - this.currentDataManager.emitter.trigger(handlerName, ...args); - } - // View - // ----------------------------------------------------------------------------------------------------------------- - changeView(viewType, dateOrRange) { - this.batchRendering(() => { - this.unselect(); - if (dateOrRange) { - if (dateOrRange.start && dateOrRange.end) { // a range - this.dispatch({ - type: 'CHANGE_VIEW_TYPE', - viewType, - }); - this.dispatch({ - type: 'SET_OPTION', - optionName: 'visibleRange', - rawOptionValue: dateOrRange, - }); - } - else { - let { dateEnv } = this.getCurrentData(); - this.dispatch({ - type: 'CHANGE_VIEW_TYPE', - viewType, - dateMarker: dateEnv.createMarker(dateOrRange), - }); - } - } - else { - this.dispatch({ - type: 'CHANGE_VIEW_TYPE', - viewType, - }); - } - }); - } - // Forces navigation to a view for the given date. - // `viewType` can be a specific view name or a generic one like "week" or "day". - // needs to change - zoomTo(dateMarker, viewType) { - let state = this.getCurrentData(); - let spec; - viewType = viewType || 'day'; // day is default zoom - spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType); - this.unselect(); - if (spec) { - this.dispatch({ - type: 'CHANGE_VIEW_TYPE', - viewType: spec.type, - dateMarker, - }); - } - else { - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker, - }); - } - } - // Given a duration singular unit, like "week" or "day", finds a matching view spec. - // Preference is given to views that have corresponding buttons. - getUnitViewSpec(unit) { - let { viewSpecs, toolbarConfig } = this.getCurrentData(); - let viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []); - let i; - let spec; - for (let viewType in viewSpecs) { - viewTypes.push(viewType); - } - for (i = 0; i < viewTypes.length; i += 1) { - spec = viewSpecs[viewTypes[i]]; - if (spec) { - if (spec.singleUnit === unit) { - return spec; - } - } - } - return null; - } - // Current Date - // ----------------------------------------------------------------------------------------------------------------- - prev() { - this.unselect(); - this.dispatch({ type: 'PREV' }); - } - next() { - this.unselect(); - this.dispatch({ type: 'NEXT' }); - } - prevYear() { - let state = this.getCurrentData(); - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: state.dateEnv.addYears(state.currentDate, -1), - }); - } - nextYear() { - let state = this.getCurrentData(); - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: state.dateEnv.addYears(state.currentDate, 1), - }); - } - today() { - let state = this.getCurrentData(); - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: getNow(state.calendarOptions.now, state.dateEnv), - }); - } - gotoDate(zonedDateInput) { - let state = this.getCurrentData(); - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: state.dateEnv.createMarker(zonedDateInput), - }); - } - incrementDate(deltaInput) { - let state = this.getCurrentData(); - let delta = createDuration(deltaInput); - if (delta) { // else, warn about invalid input? - this.unselect(); - this.dispatch({ - type: 'CHANGE_DATE', - dateMarker: state.dateEnv.add(state.currentDate, delta), - }); - } - } - getDate() { - let state = this.getCurrentData(); - return state.dateEnv.toDate(state.currentDate); - } - // Date Formatting Utils - // ----------------------------------------------------------------------------------------------------------------- - formatDate(d, formatter) { - let { dateEnv } = this.getCurrentData(); - return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter)); - } - // `settings` is for formatter AND isEndExclusive - formatRange(d0, d1, settings) { - let { dateEnv } = this.getCurrentData(); - return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings); - } - formatIso(d, omitTime) { - let { dateEnv } = this.getCurrentData(); - return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime }); - } - // Date Selection / Event Selection / DayClick - // ----------------------------------------------------------------------------------------------------------------- - select(dateOrObj, endDate) { - let selectionInput; - if (endDate == null) { - if (dateOrObj.start != null) { - selectionInput = dateOrObj; - } - else { - selectionInput = { - start: dateOrObj, - end: null, - }; - } - } - else { - selectionInput = { - start: dateOrObj, - end: endDate, - }; - } - let state = this.getCurrentData(); - let selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 })); - if (selection) { // throw parse error otherwise? - this.dispatch({ type: 'SELECT_DATES', selection }); - triggerDateSelect(selection, null, state); - } - } - unselect(pev) { - let state = this.getCurrentData(); - if (state.dateSelection) { - this.dispatch({ type: 'UNSELECT_DATES' }); - triggerDateUnselect(pev, state); - } - } - // Public Events API - // ----------------------------------------------------------------------------------------------------------------- - addEvent(eventInput, sourceInput) { - if (eventInput instanceof EventImpl) { - let def = eventInput._def; - let instance = eventInput._instance; - let currentData = this.getCurrentData(); - // not already present? don't want to add an old snapshot - if (!currentData.eventStore.defs[def.defId]) { - this.dispatch({ - type: 'ADD_EVENTS', - eventStore: eventTupleToStore({ def, instance }), // TODO: better util for two args? - }); - this.triggerEventAdd(eventInput); - } - return eventInput; - } - let state = this.getCurrentData(); - let eventSource; - if (sourceInput instanceof EventSourceImpl) { - eventSource = sourceInput.internalEventSource; - } - else if (typeof sourceInput === 'boolean') { - if (sourceInput) { // true. part of the first event source - [eventSource] = hashValuesToArray(state.eventSources); - } - } - else if (sourceInput != null) { // an ID. accepts a number too - let sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function - if (!sourceApi) { - console.warn(`Could not find an event source with ID "${sourceInput}"`); // TODO: test - return null; - } - eventSource = sourceApi.internalEventSource; - } - let tuple = parseEvent(eventInput, eventSource, state, false); - if (tuple) { - let newEventApi = new EventImpl(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance); - this.dispatch({ - type: 'ADD_EVENTS', - eventStore: eventTupleToStore(tuple), - }); - this.triggerEventAdd(newEventApi); - return newEventApi; - } - return null; - } - triggerEventAdd(eventApi) { - let { emitter } = this.getCurrentData(); - emitter.trigger('eventAdd', { - event: eventApi, - relatedEvents: [], - revert: () => { - this.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: eventApiToStore(eventApi), - }); - }, - }); - } - // TODO: optimize - getEventById(id) { - let state = this.getCurrentData(); - let { defs, instances } = state.eventStore; - id = String(id); - for (let defId in defs) { - let def = defs[defId]; - if (def.publicId === id) { - if (def.recurringDef) { - return new EventImpl(state, def, null); - } - for (let instanceId in instances) { - let instance = instances[instanceId]; - if (instance.defId === def.defId) { - return new EventImpl(state, def, instance); - } - } - } - } - return null; - } - getEvents() { - let currentData = this.getCurrentData(); - return buildEventApis(currentData.eventStore, currentData); - } - removeAllEvents() { - this.dispatch({ type: 'REMOVE_ALL_EVENTS' }); - } - // Public Event Sources API - // ----------------------------------------------------------------------------------------------------------------- - getEventSources() { - let state = this.getCurrentData(); - let sourceHash = state.eventSources; - let sourceApis = []; - for (let internalId in sourceHash) { - sourceApis.push(new EventSourceImpl(state, sourceHash[internalId])); - } - return sourceApis; - } - getEventSourceById(id) { - let state = this.getCurrentData(); - let sourceHash = state.eventSources; - id = String(id); - for (let sourceId in sourceHash) { - if (sourceHash[sourceId].publicId === id) { - return new EventSourceImpl(state, sourceHash[sourceId]); - } - } - return null; - } - addEventSource(sourceInput) { - let state = this.getCurrentData(); - if (sourceInput instanceof EventSourceImpl) { - // not already present? don't want to add an old snapshot - if (!state.eventSources[sourceInput.internalEventSource.sourceId]) { - this.dispatch({ - type: 'ADD_EVENT_SOURCES', - sources: [sourceInput.internalEventSource], - }); - } - return sourceInput; - } - let eventSource = parseEventSource(sourceInput, state); - if (eventSource) { // TODO: error otherwise? - this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] }); - return new EventSourceImpl(state, eventSource); - } - return null; - } - removeAllEventSources() { - this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' }); - } - refetchEvents() { - this.dispatch({ type: 'FETCH_EVENT_SOURCES', isRefetch: true }); - } - // Scroll - // ----------------------------------------------------------------------------------------------------------------- - scrollToTime(timeInput) { - let time = createDuration(timeInput); - if (time) { - this.trigger('_scrollRequest', { time }); - } - } - } - - class Store { - constructor() { - this.handlers = []; - } - set(value) { - this.currentValue = value; - for (let handler of this.handlers) { - handler(value); - } - } - subscribe(handler) { - this.handlers.push(handler); - if (this.currentValue !== undefined) { - handler(this.currentValue); - } - } - } - - /* - Subscribers will get a LIST of CustomRenderings - */ - class CustomRenderingStore extends Store { - constructor() { - super(...arguments); - this.map = new Map(); - } - // for consistent order - handle(customRendering) { - const { map } = this; - let updated = false; - if (customRendering.isActive) { - map.set(customRendering.id, customRendering); - updated = true; - } - else if (map.has(customRendering.id)) { - map.delete(customRendering.id); - updated = true; - } - if (updated) { - this.set(map); - } - } - } - - var internal = { - __proto__: null, - BASE_OPTION_DEFAULTS: BASE_OPTION_DEFAULTS, - identity: identity, - refineProps: refineProps, - createEventInstance: createEventInstance, - parseEventDef: parseEventDef, - refineEventDef: refineEventDef, - parseBusinessHours: parseBusinessHours, - padStart: padStart, - isInt: isInt, - parseFieldSpecs: parseFieldSpecs, - compareByFieldSpecs: compareByFieldSpecs, - flexibleCompare: flexibleCompare, - preventSelection: preventSelection, - allowSelection: allowSelection, - preventContextMenu: preventContextMenu, - allowContextMenu: allowContextMenu, - compareNumbers: compareNumbers, - enableCursor: enableCursor, - disableCursor: disableCursor, - guid: guid, - computeVisibleDayRange: computeVisibleDayRange, - isMultiDayRange: isMultiDayRange, - diffDates: diffDates, - removeExact: removeExact, - isArraysEqual: isArraysEqual, - memoize: memoize, - memoizeObjArg: memoizeObjArg, - memoizeArraylike: memoizeArraylike, - memoizeHashlike: memoizeHashlike, - intersectRects: intersectRects, - pointInsideRect: pointInsideRect, - constrainPoint: constrainPoint, - getRectCenter: getRectCenter, - diffPoints: diffPoints, - translateRect: translateRect, - mapHash: mapHash, - filterHash: filterHash, - isPropsEqual: isPropsEqual, - compareObjs: compareObjs, - collectFromHash: collectFromHash, - findElements: findElements, - findDirectChildren: findDirectChildren, - removeElement: removeElement, - applyStyle: applyStyle, - elementMatches: elementMatches, - elementClosest: elementClosest, - getElRoot: getElRoot, - getEventTargetViaRoot: getEventTargetViaRoot, - getUniqueDomId: getUniqueDomId, - parseClassNames: parseClassNames, - getCanVGrowWithinCell: getCanVGrowWithinCell, - createEmptyEventStore: createEmptyEventStore, - mergeEventStores: mergeEventStores, - getRelevantEvents: getRelevantEvents, - eventTupleToStore: eventTupleToStore, - combineEventUis: combineEventUis, - createEventUi: createEventUi, - Splitter: Splitter, - getDayClassNames: getDayClassNames, - getDateMeta: getDateMeta, - getSlotClassNames: getSlotClassNames, - buildNavLinkAttrs: buildNavLinkAttrs, - preventDefault: preventDefault, - whenTransitionDone: whenTransitionDone, - computeInnerRect: computeInnerRect, - computeEdges: computeEdges, - getClippingParents: getClippingParents, - computeRect: computeRect, - unpromisify: unpromisify, - Emitter: Emitter, - rangeContainsMarker: rangeContainsMarker, - intersectRanges: intersectRanges, - rangesEqual: rangesEqual, - rangesIntersect: rangesIntersect, - rangeContainsRange: rangeContainsRange, - PositionCache: PositionCache, - ScrollController: ScrollController, - ElementScrollController: ElementScrollController, - WindowScrollController: WindowScrollController, - Theme: Theme, - ViewContextType: ViewContextType, - DateComponent: DateComponent, - DateProfileGenerator: DateProfileGenerator, - isDateSpansEqual: isDateSpansEqual, - addDays: addDays, - startOfDay: startOfDay, - addMs: addMs, - addWeeks: addWeeks, - diffWeeks: diffWeeks, - diffWholeWeeks: diffWholeWeeks, - diffWholeDays: diffWholeDays, - diffDayAndTime: diffDayAndTime, - diffDays: diffDays, - isValidDate: isValidDate, - createDuration: createDuration, - asCleanDays: asCleanDays, - multiplyDuration: multiplyDuration, - addDurations: addDurations, - asRoughMinutes: asRoughMinutes, - asRoughSeconds: asRoughSeconds, - asRoughMs: asRoughMs, - wholeDivideDurations: wholeDivideDurations, - greatestDurationDenominator: greatestDurationDenominator, - DateEnv: DateEnv, - createFormatter: createFormatter, - formatIsoTimeString: formatIsoTimeString, - formatDayString: formatDayString, - buildIsoString: buildIsoString, - NamedTimeZoneImpl: NamedTimeZoneImpl, - parseMarker: parse, - SegHierarchy: SegHierarchy, - buildEntryKey: buildEntryKey, - getEntrySpanEnd: getEntrySpanEnd, - binarySearch: binarySearch, - groupIntersectingEntries: groupIntersectingEntries, - intersectSpans: intersectSpans, - Interaction: Interaction, - interactionSettingsToStore: interactionSettingsToStore, - interactionSettingsStore: interactionSettingsStore, - ElementDragging: ElementDragging, - config: config, - parseDragMeta: parseDragMeta, - CalendarRoot: CalendarRoot, - DayHeader: DayHeader, - computeFallbackHeaderFormat: computeFallbackHeaderFormat, - TableDateCell: TableDateCell, - TableDowCell: TableDowCell, - DaySeriesModel: DaySeriesModel, - sliceEventStore: sliceEventStore, - hasBgRendering: hasBgRendering, - getElSeg: getElSeg, - buildSegTimeText: buildSegTimeText, - sortEventSegs: sortEventSegs, - getSegMeta: getSegMeta, - buildEventRangeKey: buildEventRangeKey, - getSegAnchorAttrs: getSegAnchorAttrs, - DayTableModel: DayTableModel, - Slicer: Slicer, - applyMutationToEventStore: applyMutationToEventStore, - isPropsValid: isPropsValid, - isInteractionValid: isInteractionValid, - isDateSelectionValid: isDateSelectionValid, - requestJson: requestJson, - BaseComponent: BaseComponent, - setRef: setRef, - DelayedRunner: DelayedRunner, - SimpleScrollGrid: SimpleScrollGrid, - hasShrinkWidth: hasShrinkWidth, - renderMicroColGroup: renderMicroColGroup, - getScrollGridClassNames: getScrollGridClassNames, - getSectionClassNames: getSectionClassNames, - getSectionHasLiquidHeight: getSectionHasLiquidHeight, - getAllowYScrolling: getAllowYScrolling, - renderChunkContent: renderChunkContent, - computeShrinkWidth: computeShrinkWidth, - sanitizeShrinkWidth: sanitizeShrinkWidth, - isColPropsEqual: isColPropsEqual, - renderScrollShim: renderScrollShim, - getStickyFooterScrollbar: getStickyFooterScrollbar, - getStickyHeaderDates: getStickyHeaderDates, - Scroller: Scroller, - getScrollbarWidths: getScrollbarWidths, - RefMap: RefMap, - getIsRtlScrollbarOnLeft: getIsRtlScrollbarOnLeft, - NowTimer: NowTimer, - ScrollResponder: ScrollResponder, - StandardEvent: StandardEvent, - NowIndicatorContainer: NowIndicatorContainer, - DayCellContainer: DayCellContainer, - hasCustomDayCellContent: hasCustomDayCellContent, - EventContainer: EventContainer, - renderFill: renderFill, - BgEvent: BgEvent, - WeekNumberContainer: WeekNumberContainer, - MoreLinkContainer: MoreLinkContainer, - computeEarliestSegStart: computeEarliestSegStart, - ViewContainer: ViewContainer$1, - triggerDateSelect: triggerDateSelect, - getDefaultEventEnd: getDefaultEventEnd, - injectStyles: injectStyles, - CalendarImpl: CalendarImpl, - EventImpl: EventImpl, - buildEventApis: buildEventApis, - buildElAttrs: buildElAttrs, - ContentContainer: ContentContainer, - CustomRenderingStore: CustomRenderingStore - }; - - var css_248z = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{border-style:none;padding:0}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.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:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}"; - injectStyles(css_248z); - - const globalLocales = []; - - const MINIMAL_RAW_EN_LOCALE = { - code: 'en', - week: { - dow: 0, - doy: 4, // 4 days need to be within the year to be considered the first week - }, - 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', - }; - const RAW_EN_LOCALE = Object.assign(Object.assign({}, MINIMAL_RAW_EN_LOCALE), { - // Includes things we don't want other locales to inherit, - // things that derive from other translatable strings. - buttonHints: { - prev: 'Previous $0', - next: 'Next $0', - today(buttonText, unit) { - return (unit === 'day') - ? 'Today' - : `This ${buttonText}`; - }, - }, viewHint: '$0 view', navLinkHint: 'Go to $0', moreLinkHint(eventCnt) { - return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`; - } }); - function organizeRawLocales(explicitRawLocales) { - let defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en'; - let allRawLocales = globalLocales.concat(explicitRawLocales); - let rawLocaleMap = { - en: RAW_EN_LOCALE, - }; - for (let rawLocale of allRawLocales) { - rawLocaleMap[rawLocale.code] = rawLocale; - } - return { - map: rawLocaleMap, - defaultCode, - }; - } - function buildLocale(inputSingular, available) { - if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) { - return parseLocale(inputSingular.code, [inputSingular.code], inputSingular); - } - return queryLocale(inputSingular, available); - } - function queryLocale(codeArg, available) { - let codes = [].concat(codeArg || []); // will convert to array - let raw = queryRawLocale(codes, available) || RAW_EN_LOCALE; - return parseLocale(codeArg, codes, raw); - } - function queryRawLocale(codes, available) { - for (let i = 0; i < codes.length; i += 1) { - let parts = codes[i].toLocaleLowerCase().split('-'); - for (let j = parts.length; j > 0; j -= 1) { - let simpleId = parts.slice(0, j).join('-'); - if (available[simpleId]) { - return available[simpleId]; - } - } - } - return null; - } - function parseLocale(codeArg, codes, raw) { - let merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ['buttonText']); - delete merged.code; // don't want this part of the options - let { week } = merged; - delete merged.week; - return { - codeArg, - codes, - week, - simpleNumberFormat: new Intl.NumberFormat(codeArg), - options: merged, - }; - } - - // TODO: easier way to add new hooks? need to update a million things - function createPlugin(input) { - return { - id: guid(), - name: input.name, - premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : undefined, - deps: input.deps || [], - reducers: input.reducers || [], - isLoadingFuncs: input.isLoadingFuncs || [], - contextInit: [].concat(input.contextInit || []), - eventRefiners: input.eventRefiners || {}, - eventDefMemberAdders: input.eventDefMemberAdders || [], - eventSourceRefiners: input.eventSourceRefiners || {}, - isDraggableTransformers: input.isDraggableTransformers || [], - eventDragMutationMassagers: input.eventDragMutationMassagers || [], - eventDefMutationAppliers: input.eventDefMutationAppliers || [], - dateSelectionTransformers: input.dateSelectionTransformers || [], - datePointTransforms: input.datePointTransforms || [], - dateSpanTransforms: input.dateSpanTransforms || [], - views: input.views || {}, - viewPropsTransformers: input.viewPropsTransformers || [], - isPropsValid: input.isPropsValid || null, - externalDefTransforms: input.externalDefTransforms || [], - viewContainerAppends: input.viewContainerAppends || [], - eventDropTransformers: input.eventDropTransformers || [], - componentInteractions: input.componentInteractions || [], - calendarInteractions: input.calendarInteractions || [], - themeClasses: input.themeClasses || {}, - eventSourceDefs: input.eventSourceDefs || [], - cmdFormatter: input.cmdFormatter, - recurringTypes: input.recurringTypes || [], - namedTimeZonedImpl: input.namedTimeZonedImpl, - initialView: input.initialView || '', - elementDraggingImpl: input.elementDraggingImpl, - optionChangeHandlers: input.optionChangeHandlers || {}, - scrollGridImpl: input.scrollGridImpl || null, - listenerRefiners: input.listenerRefiners || {}, - optionRefiners: input.optionRefiners || {}, - propSetHandlers: input.propSetHandlers || {}, - }; - } - function buildPluginHooks(pluginDefs, globalDefs) { - let currentPluginIds = {}; - let hooks = { - premiumReleaseDate: undefined, - reducers: [], - isLoadingFuncs: [], - contextInit: [], - eventRefiners: {}, - eventDefMemberAdders: [], - eventSourceRefiners: {}, - isDraggableTransformers: [], - eventDragMutationMassagers: [], - eventDefMutationAppliers: [], - dateSelectionTransformers: [], - datePointTransforms: [], - dateSpanTransforms: [], - views: {}, - viewPropsTransformers: [], - isPropsValid: null, - externalDefTransforms: [], - viewContainerAppends: [], - eventDropTransformers: [], - componentInteractions: [], - calendarInteractions: [], - themeClasses: {}, - eventSourceDefs: [], - cmdFormatter: null, - recurringTypes: [], - namedTimeZonedImpl: null, - initialView: '', - elementDraggingImpl: null, - optionChangeHandlers: {}, - scrollGridImpl: null, - listenerRefiners: {}, - optionRefiners: {}, - propSetHandlers: {}, - }; - function addDefs(defs) { - for (let def of defs) { - const pluginName = def.name; - const currentId = currentPluginIds[pluginName]; - if (currentId === undefined) { - currentPluginIds[pluginName] = def.id; - addDefs(def.deps); - hooks = combineHooks(hooks, def); - } - else if (currentId !== def.id) { - // different ID than the one already added - console.warn(`Duplicate plugin '${pluginName}'`); - } - } - } - if (pluginDefs) { - addDefs(pluginDefs); - } - addDefs(globalDefs); - return hooks; - } - function buildBuildPluginHooks() { - let currentOverrideDefs = []; - let currentGlobalDefs = []; - let currentHooks; - return (overrideDefs, globalDefs) => { - if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) { - currentHooks = buildPluginHooks(overrideDefs, globalDefs); - } - currentOverrideDefs = overrideDefs; - currentGlobalDefs = globalDefs; - return currentHooks; - }; - } - function combineHooks(hooks0, hooks1) { - return { - premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate), - reducers: hooks0.reducers.concat(hooks1.reducers), - isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs), - contextInit: hooks0.contextInit.concat(hooks1.contextInit), - eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners), - eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders), - eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners), - isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers), - eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers), - eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers), - dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers), - datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms), - dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms), - views: Object.assign(Object.assign({}, hooks0.views), hooks1.views), - viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers), - isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid, - externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms), - viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends), - eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers), - calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions), - componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions), - themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses), - eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs), - cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter, - recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes), - namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl, - initialView: hooks0.initialView || hooks1.initialView, - elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl, - optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers), - scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl, - listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners), - optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners), - propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers), - }; - } - function compareOptionalDates(date0, date1) { - if (date0 === undefined) { - return date1; - } - if (date1 === undefined) { - return date0; - } - return new Date(Math.max(date0.valueOf(), date1.valueOf())); - } - - class StandardTheme extends Theme { - } - StandardTheme.prototype.classes = { - root: 'fc-theme-standard', - tableCellShaded: 'fc-cell-shaded', - buttonGroup: 'fc-button-group', - button: 'fc-button fc-button-primary', - buttonActive: 'fc-button-active', - }; - StandardTheme.prototype.baseIconClass = 'fc-icon'; - StandardTheme.prototype.iconClasses = { - close: 'fc-icon-x', - prev: 'fc-icon-chevron-left', - next: 'fc-icon-chevron-right', - prevYear: 'fc-icon-chevrons-left', - nextYear: 'fc-icon-chevrons-right', - }; - StandardTheme.prototype.rtlIconClasses = { - prev: 'fc-icon-chevron-right', - next: 'fc-icon-chevron-left', - prevYear: 'fc-icon-chevrons-right', - nextYear: 'fc-icon-chevrons-left', - }; - StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly - StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon'; - StandardTheme.prototype.iconOverridePrefix = 'fc-icon-'; - - function compileViewDefs(defaultConfigs, overrideConfigs) { - let hash = {}; - let viewType; - for (viewType in defaultConfigs) { - ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); - } - for (viewType in overrideConfigs) { - ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); - } - return hash; - } - function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) { - if (hash[viewType]) { - return hash[viewType]; - } - let viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs); - if (viewDef) { - hash[viewType] = viewDef; - } - return viewDef; - } - function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) { - let defaultConfig = defaultConfigs[viewType]; - let overrideConfig = overrideConfigs[viewType]; - let queryProp = (name) => ((defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] : - ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null)); - let theComponent = queryProp('component'); - let superType = queryProp('superType'); - let superDef = null; - if (superType) { - if (superType === viewType) { - throw new Error('Can\'t have a custom view type that references itself'); - } - superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs); - } - if (!theComponent && superDef) { - theComponent = superDef.component; - } - if (!theComponent) { - return null; // don't throw a warning, might be settings for a single-unit view - } - return { - type: viewType, - component: theComponent, - defaults: Object.assign(Object.assign({}, (superDef ? superDef.defaults : {})), (defaultConfig ? defaultConfig.rawOptions : {})), - overrides: Object.assign(Object.assign({}, (superDef ? superDef.overrides : {})), (overrideConfig ? overrideConfig.rawOptions : {})), - }; - } - - function parseViewConfigs(inputs) { - return mapHash(inputs, parseViewConfig); - } - function parseViewConfig(input) { - let rawOptions = typeof input === 'function' ? - { component: input } : - input; - let { component } = rawOptions; - if (rawOptions.content) { - component = createViewHookComponent(rawOptions); - // TODO: remove content/classNames/didMount/etc from options? - } - return { - superType: rawOptions.type, - component: component, - rawOptions, // includes type and component too :( - }; - } - function createViewHookComponent(options) { - return (viewProps) => (h(ViewContextType.Consumer, null, (context) => (h(ContentContainer, { elTag: "div", elClasses: buildViewClassNames(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: undefined, generator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount })))); - } - - function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) { - let defaultConfigs = parseViewConfigs(defaultInputs); - let overrideConfigs = parseViewConfigs(optionOverrides.views); - let viewDefs = compileViewDefs(defaultConfigs, overrideConfigs); - return mapHash(viewDefs, (viewDef) => buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults)); - } - function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) { - let durationInput = viewDef.overrides.duration || - viewDef.defaults.duration || - dynamicOptionOverrides.duration || - optionOverrides.duration; - let duration = null; - let durationUnit = ''; - let singleUnit = ''; - let singleUnitOverrides = {}; - if (durationInput) { - duration = createDurationCached(durationInput); - if (duration) { // valid? - let denom = greatestDurationDenominator(duration); - durationUnit = denom.unit; - if (denom.value === 1) { - singleUnit = durationUnit; - singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {}; - } - } - } - let queryButtonText = (optionsSubset) => { - let buttonTextMap = optionsSubset.buttonText || {}; - let buttonTextKey = viewDef.defaults.buttonTextKey; - if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) { - return buttonTextMap[buttonTextKey]; - } - if (buttonTextMap[viewDef.type] != null) { - return buttonTextMap[viewDef.type]; - } - if (buttonTextMap[singleUnit] != null) { - return buttonTextMap[singleUnit]; - } - return null; - }; - let queryButtonTitle = (optionsSubset) => { - let buttonHints = optionsSubset.buttonHints || {}; - let 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, - duration, - durationUnit, - singleUnit, - optionDefaults: viewDef.defaults, - optionOverrides: Object.assign(Object.assign({}, singleUnitOverrides), viewDef.overrides), - buttonTextOverride: queryButtonText(dynamicOptionOverrides) || - queryButtonText(optionOverrides) || // constructor-specified buttonText lookup hash takes precedence - viewDef.overrides.buttonText, - buttonTextDefault: queryButtonText(localeDefaults) || - viewDef.defaults.buttonText || - queryButtonText(BASE_OPTION_DEFAULTS) || - 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 - let durationInputMap = {}; - function createDurationCached(durationInput) { - let json = JSON.stringify(durationInput); - let res = durationInputMap[json]; - if (res === undefined) { - res = createDuration(durationInput); - durationInputMap[json] = res; - } - return res; - } - - function reduceViewType(viewType, action) { - switch (action.type) { - case 'CHANGE_VIEW_TYPE': - viewType = action.viewType; - } - return viewType; - } - - function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) { - switch (action.type) { - case 'SET_OPTION': - return Object.assign(Object.assign({}, dynamicOptionOverrides), { [action.optionName]: action.rawOptionValue }); - default: - return dynamicOptionOverrides; - } - } - - function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) { - let dp; - switch (action.type) { - case 'CHANGE_VIEW_TYPE': - return dateProfileGenerator.build(action.dateMarker || currentDate); - case 'CHANGE_DATE': - return dateProfileGenerator.build(action.dateMarker); - case 'PREV': - dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate); - if (dp.isValid) { - return dp; - } - break; - case 'NEXT': - dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate); - if (dp.isValid) { - return dp; - } - break; - } - return currentDateProfile; - } - - function initEventSources(calendarOptions, dateProfile, context) { - let activeRange = dateProfile ? dateProfile.activeRange : null; - return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context); - } - function reduceEventSources(eventSources, action, dateProfile, context) { - let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? - switch (action.type) { - case 'ADD_EVENT_SOURCES': // already parsed - return addSources(eventSources, action.sources, activeRange, context); - case 'REMOVE_EVENT_SOURCE': - return removeSource(eventSources, action.sourceId); - case 'PREV': // TODO: how do we track all actions that affect dateProfile :( - case 'NEXT': - case 'CHANGE_DATE': - case 'CHANGE_VIEW_TYPE': - if (dateProfile) { - return fetchDirtySources(eventSources, activeRange, context); - } - return eventSources; - case 'FETCH_EVENT_SOURCES': - return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type? - arrayToHash(action.sourceIds) : - excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context); - case 'RECEIVE_EVENTS': - case 'RECEIVE_EVENT_ERROR': - return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange); - case 'REMOVE_ALL_EVENT_SOURCES': - return {}; - default: - return eventSources; - } - } - function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) { - let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? - return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context); - } - function computeEventSourcesLoading(eventSources) { - for (let sourceId in eventSources) { - if (eventSources[sourceId].isFetching) { - return true; - } - } - return false; - } - function addSources(eventSourceHash, sources, fetchRange, context) { - let hash = {}; - for (let source of sources) { - hash[source.sourceId] = source; - } - if (fetchRange) { - hash = fetchDirtySources(hash, fetchRange, context); - } - return Object.assign(Object.assign({}, eventSourceHash), hash); - } - function removeSource(eventSourceHash, sourceId) { - return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId); - } - function fetchDirtySources(sourceHash, fetchRange, context) { - return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context); - } - function isSourceDirty(eventSource, fetchRange, context) { - if (!doesSourceNeedRange(eventSource, context)) { - return !eventSource.latestFetchId; - } - return !context.options.lazyFetching || - !eventSource.fetchRange || - eventSource.isFetching || // always cancel outdated in-progress fetches - fetchRange.start < eventSource.fetchRange.start || - fetchRange.end > eventSource.fetchRange.end; - } - function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) { - let nextSources = {}; - for (let sourceId in prevSources) { - let source = prevSources[sourceId]; - if (sourceIdHash[sourceId]) { - nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context); - } - else { - nextSources[sourceId] = source; - } - } - return nextSources; - } - function fetchSource(eventSource, fetchRange, isRefetch, context) { - let { options, calendarApi } = context; - let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId]; - let fetchId = guid(); - sourceDef.fetch({ - eventSource, - range: fetchRange, - isRefetch, - context, - }, (res) => { - let { rawEvents } = res; - if (options.eventSourceSuccess) { - rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents; - } - if (eventSource.success) { - rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents; - } - context.dispatch({ - type: 'RECEIVE_EVENTS', - sourceId: eventSource.sourceId, - fetchId, - fetchRange, - rawEvents, - }); - }, (error) => { - let errorHandled = false; - if (options.eventSourceFailure) { - options.eventSourceFailure.call(calendarApi, error); - errorHandled = true; - } - if (eventSource.failure) { - eventSource.failure(error); - errorHandled = true; - } - if (!errorHandled) { - console.warn(error.message, error); - } - context.dispatch({ - type: 'RECEIVE_EVENT_ERROR', - sourceId: eventSource.sourceId, - fetchId, - fetchRange, - error, - }); - }); - return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId }); - } - function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) { - let eventSource = sourceHash[sourceId]; - if (eventSource && // not already removed - fetchId === eventSource.latestFetchId) { - return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) }); - } - return sourceHash; - } - function excludeStaticSources(eventSources, context) { - return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context)); - } - function parseInitialSources(rawOptions, context) { - let refiners = buildEventSourceRefiners(context); - let rawSources = [].concat(rawOptions.eventSources || []); - let sources = []; // parsed - if (rawOptions.initialEvents) { - rawSources.unshift(rawOptions.initialEvents); - } - if (rawOptions.events) { - rawSources.unshift(rawOptions.events); - } - for (let rawSource of rawSources) { - let source = parseEventSource(rawSource, context, refiners); - if (source) { - sources.push(source); - } - } - return sources; - } - function doesSourceNeedRange(eventSource, context) { - let defs = context.pluginHooks.eventSourceDefs; - return !defs[eventSource.sourceDefId].ignoreRange; - } - - function reduceDateSelection(currentSelection, action) { - switch (action.type) { - case 'UNSELECT_DATES': - return null; - case 'SELECT_DATES': - return action.selection; - default: - return currentSelection; - } - } - - function reduceSelectedEvent(currentInstanceId, action) { - switch (action.type) { - case 'UNSELECT_EVENT': - return ''; - case 'SELECT_EVENT': - return action.eventInstanceId; - default: - return currentInstanceId; - } - } - - function reduceEventDrag(currentDrag, action) { - let newDrag; - switch (action.type) { - case 'UNSET_EVENT_DRAG': - return null; - case 'SET_EVENT_DRAG': - newDrag = action.state; - return { - affectedEvents: newDrag.affectedEvents, - mutatedEvents: newDrag.mutatedEvents, - isEvent: newDrag.isEvent, - }; - default: - return currentDrag; - } - } - - function reduceEventResize(currentResize, action) { - let newResize; - switch (action.type) { - case 'UNSET_EVENT_RESIZE': - return null; - case 'SET_EVENT_RESIZE': - newResize = action.state; - return { - affectedEvents: newResize.affectedEvents, - mutatedEvents: newResize.mutatedEvents, - isEvent: newResize.isEvent, - }; - default: - return currentResize; - } - } - - function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { - let header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; - let footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; - return { header, footer }; - } - function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { - let sectionWidgets = {}; - let viewsWithButtons = []; - let hasTitle = false; - for (let sectionName in sectionStrHash) { - let sectionStr = sectionStrHash[sectionName]; - let sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi); - sectionWidgets[sectionName] = sectionRes.widgets; - viewsWithButtons.push(...sectionRes.viewsWithButtons); - hasTitle = hasTitle || sectionRes.hasTitle; - } - return { sectionWidgets, viewsWithButtons, hasTitle }; - } - /* - BAD: querying icons and text here. should be done at render time - */ - function parseSection(sectionStr, calendarOptions, // defaults+overrides, then refined - calendarOptionOverrides, // overrides only!, unrefined :( - theme, viewSpecs, calendarApi) { - let isRtl = calendarOptions.direction === 'rtl'; - let calendarCustomButtons = calendarOptions.customButtons || {}; - let calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {}; - let calendarButtonText = calendarOptions.buttonText || {}; - let calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {}; - let calendarButtonHints = calendarOptions.buttonHints || {}; - let sectionSubstrs = sectionStr ? sectionStr.split(' ') : []; - let viewsWithButtons = []; - let hasTitle = false; - let widgets = sectionSubstrs.map((buttonGroupStr) => (buttonGroupStr.split(',').map((buttonName) => { - if (buttonName === 'title') { - hasTitle = true; - return { buttonName }; - } - let customButtonProps; - let viewSpec; - let buttonClick; - let buttonIcon; // only one of these will be set - let buttonText; // " - let buttonHint; - // ^ for the title="" attribute, for accessibility - if ((customButtonProps = calendarCustomButtons[buttonName])) { - buttonClick = (ev) => { - if (customButtonProps.click) { - customButtonProps.click.call(ev.target, ev, ev.target); // TODO: use Calendar this context? - } - }; - (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); - buttonClick = () => { - calendarApi.changeView(buttonName); - }; - (buttonText = viewSpec.buttonTextOverride) || - (buttonIcon = theme.getIconClass(buttonName, isRtl)) || - (buttonText = viewSpec.buttonTextDefault); - let 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 = () => { - calendarApi[buttonName](); - }; - (buttonText = calendarButtonTextOverrides[buttonName]) || - (buttonIcon = theme.getIconClass(buttonName, isRtl)) || - (buttonText = calendarButtonText[buttonName]); // everything else is considered default - if (buttonName === 'prevYear' || buttonName === 'nextYear') { - let prevOrNext = buttonName === 'prevYear' ? 'prev' : 'next'; - buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] || - calendarButtonHints[prevOrNext], [ - calendarButtonText.year || 'year', - 'year', - ], calendarButtonText[buttonName]); - } - else { - buttonHint = (navUnit) => formatWithOrdinals(calendarButtonHintOverrides[buttonName] || - calendarButtonHints[buttonName], [ - calendarButtonText[navUnit] || navUnit, - navUnit, - ], calendarButtonText[buttonName]); - } - } - return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint }; - }))); - return { widgets, viewsWithButtons, hasTitle }; - } - - // always represents the current view. otherwise, it'd need to change value every time date changes - class ViewImpl { - constructor(type, getCurrentData, dateEnv) { - this.type = type; - this.getCurrentData = getCurrentData; - this.dateEnv = dateEnv; - } - get calendar() { - return this.getCurrentData().calendarApi; - } - get title() { - return this.getCurrentData().viewTitle; - } - get activeStart() { - return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start); - } - get activeEnd() { - return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end); - } - get currentStart() { - return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start); - } - get currentEnd() { - return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end); - } - getOption(name) { - return this.getCurrentData().options[name]; // are the view-specific options - } - } - - let eventSourceDef$2 = { - ignoreRange: true, - parseMeta(refined) { - if (Array.isArray(refined.events)) { - return refined.events; - } - return null; - }, - fetch(arg, successCallback) { - successCallback({ - rawEvents: arg.eventSource.meta, - }); - }, - }; - const arrayEventSourcePlugin = createPlugin({ - name: 'array-event-source', - eventSourceDefs: [eventSourceDef$2], - }); - - let eventSourceDef$1 = { - parseMeta(refined) { - if (typeof refined.events === 'function') { - return refined.events; - } - return null; - }, - fetch(arg, successCallback, errorCallback) { - const { dateEnv } = arg.context; - const func = arg.eventSource.meta; - unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback); - }, - }; - const funcEventSourcePlugin = createPlugin({ - name: 'func-event-source', - eventSourceDefs: [eventSourceDef$1], - }); - - const JSON_FEED_EVENT_SOURCE_REFINERS = { - method: String, - extraParams: identity, - startParam: String, - endParam: String, - timeZoneParam: String, - }; - - let eventSourceDef = { - parseMeta(refined) { - if (refined.url && (refined.format === 'json' || !refined.format)) { - return { - url: refined.url, - format: 'json', - method: (refined.method || 'GET').toUpperCase(), - extraParams: refined.extraParams, - startParam: refined.startParam, - endParam: refined.endParam, - timeZoneParam: refined.timeZoneParam, - }; - } - return null; - }, - fetch(arg, successCallback, errorCallback) { - const { meta } = arg.eventSource; - const requestParams = buildRequestParams(meta, arg.range, arg.context); - requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => { - successCallback({ rawEvents, response }); - }, errorCallback); - }, - }; - const jsonFeedEventSourcePlugin = createPlugin({ - name: 'json-event-source', - eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS, - eventSourceDefs: [eventSourceDef], - }); - function buildRequestParams(meta, range, context) { - let { dateEnv, options } = context; - let startParam; - let endParam; - let timeZoneParam; - let customRequestParams; - let params = {}; - 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; - } - // 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 || {}; - } - Object.assign(params, customRequestParams); - params[startParam] = dateEnv.formatIso(range.start); - params[endParam] = dateEnv.formatIso(range.end); - if (dateEnv.timeZone !== 'local') { - params[timeZoneParam] = dateEnv.timeZone; - } - return params; - } - - const SIMPLE_RECURRING_REFINERS = { - daysOfWeek: identity, - startTime: createDuration, - endTime: createDuration, - duration: createDuration, - startRecur: identity, - endRecur: identity, - }; - - let recurring = { - parse(refined, dateEnv) { - if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) { - let recurringData = { - daysOfWeek: refined.daysOfWeek || null, - startTime: refined.startTime || null, - endTime: refined.endTime || null, - startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null, - endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null, - }; - let duration; - if (refined.duration) { - duration = refined.duration; - } - if (!duration && refined.startTime && refined.endTime) { - duration = subtractDurations(refined.endTime, refined.startTime); - } - return { - allDayGuess: Boolean(!refined.startTime && !refined.endTime), - duration, - typeData: recurringData, // doesn't need endTime anymore but oh well - }; - } - return null; - }, - expand(typeData, framingRange, dateEnv) { - let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur }); - if (clippedFramingRange) { - return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv); - } - return []; - }, - }; - const simpleRecurringEventsPlugin = createPlugin({ - name: 'simple-recurring-event', - recurringTypes: [recurring], - eventRefiners: SIMPLE_RECURRING_REFINERS, - }); - function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) { - let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null; - let dayMarker = startOfDay(framingRange.start); - let endMarker = framingRange.end; - let instanceStarts = []; - while (dayMarker < endMarker) { - let instanceStart; - // if everyday, or this particular day-of-week - if (!dowHash || dowHash[dayMarker.getUTCDay()]) { - if (startTime) { - instanceStart = dateEnv.add(dayMarker, startTime); - } - else { - instanceStart = dayMarker; - } - instanceStarts.push(instanceStart); - } - dayMarker = addDays(dayMarker, 1); - } - return instanceStarts; - } - - const changeHandlerPlugin = createPlugin({ - name: 'change-handler', - optionChangeHandlers: { - events(events, context) { - handleEventSources([events], context); - }, - eventSources: handleEventSources, - }, - }); - /* - BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out - */ - function handleEventSources(inputs, context) { - let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources); - let newInputs = []; - for (let input of inputs) { - let inputFound = false; - for (let i = 0; i < unfoundSources.length; i += 1) { - if (unfoundSources[i]._raw === input) { - unfoundSources.splice(i, 1); // delete - inputFound = true; - break; - } - } - if (!inputFound) { - newInputs.push(input); - } - } - for (let unfoundSource of unfoundSources) { - context.dispatch({ - type: 'REMOVE_EVENT_SOURCE', - sourceId: unfoundSource.sourceId, - }); - } - for (let newInput of newInputs) { - context.calendarApi.addEventSource(newInput); - } - } - - function handleDateProfile(dateProfile, context) { - context.emitter.trigger('datesSet', Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi })); - } - - function handleEventStore(eventStore, context) { - let { emitter } = context; - if (emitter.hasHandlers('eventsSet')) { - emitter.trigger('eventsSet', buildEventApis(eventStore, context)); - } - } - - /* - this array is exposed on the root namespace so that UMD plugins can add to it. - see the rollup-bundles script. - */ - const globalPlugins = [ - arrayEventSourcePlugin, - funcEventSourcePlugin, - jsonFeedEventSourcePlugin, - simpleRecurringEventsPlugin, - changeHandlerPlugin, - createPlugin({ - name: 'misc', - isLoadingFuncs: [ - (state) => computeEventSourcesLoading(state.eventSources), - ], - propSetHandlers: { - dateProfile: handleDateProfile, - eventStore: handleEventStore, - }, - }), - ]; - - class TaskRunner { - constructor(runTaskOption, drainedOption) { - this.runTaskOption = runTaskOption; - this.drainedOption = drainedOption; - this.queue = []; - this.delayedRunner = new DelayedRunner(this.drain.bind(this)); - } - request(task, delay) { - this.queue.push(task); - this.delayedRunner.request(delay); - } - pause(scope) { - this.delayedRunner.pause(scope); - } - resume(scope, force) { - this.delayedRunner.resume(scope, force); - } - drain() { - let { queue } = this; - while (queue.length) { - let completedTasks = []; - let task; - while ((task = queue.shift())) { - this.runTask(task); - completedTasks.push(task); - } - this.drained(completedTasks); - } // keep going, in case new tasks were added in the drained handler - } - runTask(task) { - if (this.runTaskOption) { - this.runTaskOption(task); - } - } - drained(completedTasks) { - if (this.drainedOption) { - this.drainedOption(completedTasks); - } - } - } - - // Computes what the title at the top of the calendarApi should be for this view - function buildTitle(dateProfile, viewOptions, dateEnv) { - let range; - // for views that span a large unit of time, show the proper interval, ignoring stray days before and after - if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) { - range = dateProfile.currentRange; - } - else { // for day units or smaller, use the actual day range - range = dateProfile.activeRange; - } - return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), { - isEndExclusive: dateProfile.isRangeAllDay, - defaultSeparator: viewOptions.titleRangeSeparator, - }); - } - // Generates the format string that should be used to generate the title for the current date range. - // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`. - function buildTitleFormat(dateProfile) { - let { currentRangeUnit } = dateProfile; - if (currentRangeUnit === 'year') { - return { year: 'numeric' }; - } - if (currentRangeUnit === 'month') { - return { year: 'numeric', month: 'long' }; // like "September 2014" - } - let days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end); - if (days !== null && days > 1) { - // multi-day range. shorter, like "Sep 9 - 10 2014" - return { year: 'numeric', month: 'short', day: 'numeric' }; - } - // one day. longer, like "September 9 2014" - return { year: 'numeric', month: 'long', day: 'numeric' }; - } - - // in future refactor, do the redux-style function(state=initial) for initial-state - // also, whatever is happening in constructor, have it happen in action queue too - class CalendarDataManager { - constructor(props) { - this.computeOptionsData = memoize(this._computeOptionsData); - this.computeCurrentViewData = memoize(this._computeCurrentViewData); - this.organizeRawLocales = memoize(organizeRawLocales); - this.buildLocale = memoize(buildLocale); - this.buildPluginHooks = buildBuildPluginHooks(); - this.buildDateEnv = memoize(buildDateEnv$1); - this.buildTheme = memoize(buildTheme); - this.parseToolbars = memoize(parseToolbars); - this.buildViewSpecs = memoize(buildViewSpecs); - this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator); - this.buildViewApi = memoize(buildViewApi); - this.buildViewUiProps = memoizeObjArg(buildViewUiProps); - this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual); - this.buildEventUiBases = memoize(buildEventUiBases); - this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours); - this.buildTitle = memoize(buildTitle); - this.emitter = new Emitter(); - this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this)); - this.currentCalendarOptionsInput = {}; - this.currentCalendarOptionsRefined = {}; - this.currentViewOptionsInput = {}; - this.currentViewOptionsRefined = {}; - this.currentCalendarOptionsRefiners = {}; - this.getCurrentData = () => this.data; - this.dispatch = (action) => { - this.actionRunner.request(action); // protects against recursive calls to _handleAction - }; - this.props = props; - this.actionRunner.pause(); - let dynamicOptionOverrides = {}; - let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); - let currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView; - let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); - // wire things up - // TODO: not DRY - props.calendarApi.currentDataManager = this; - this.emitter.setThisContext(props.calendarApi); - this.emitter.setOptions(currentViewData.options); - let currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv); - let dateProfile = currentViewData.dateProfileGenerator.build(currentDate); - if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) { - currentDate = dateProfile.currentRange.start; - } - let calendarContext = { - dateEnv: optionsData.dateEnv, - options: optionsData.calendarOptions, - pluginHooks: optionsData.pluginHooks, - calendarApi: props.calendarApi, - dispatch: this.dispatch, - emitter: this.emitter, - getCurrentData: this.getCurrentData, - }; - // needs to be after setThisContext - for (let callback of optionsData.pluginHooks.contextInit) { - callback(calendarContext); - } - // NOT DRY - let eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext); - let initialState = { - dynamicOptionOverrides, - currentViewType, - currentDate, - dateProfile, - businessHours: this.parseContextBusinessHours(calendarContext), - eventSources, - eventUiBases: {}, - eventStore: createEmptyEventStore(), - renderableEventStore: createEmptyEventStore(), - dateSelection: null, - eventSelection: '', - eventDrag: null, - eventResize: null, - selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig, - }; - let contextAndState = Object.assign(Object.assign({}, calendarContext), initialState); - for (let reducer of optionsData.pluginHooks.reducers) { - Object.assign(initialState, reducer(null, null, contextAndState)); - } - if (computeIsLoading(initialState, calendarContext)) { - this.emitter.trigger('loading', true); // NOT DRY - } - this.state = initialState; - this.updateData(); - this.actionRunner.resume(); - } - resetOptions(optionOverrides, append) { - let { props } = this; - props.optionOverrides = append - ? Object.assign(Object.assign({}, props.optionOverrides), optionOverrides) : optionOverrides; - this.actionRunner.request({ - type: 'NOTHING', - }); - } - _handleAction(action) { - let { props, state, emitter } = this; - let dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action); - let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); - let currentViewType = reduceViewType(state.currentViewType, action); - let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); - // wire things up - // TODO: not DRY - props.calendarApi.currentDataManager = this; - emitter.setThisContext(props.calendarApi); - emitter.setOptions(currentViewData.options); - let calendarContext = { - dateEnv: optionsData.dateEnv, - options: optionsData.calendarOptions, - pluginHooks: optionsData.pluginHooks, - calendarApi: props.calendarApi, - dispatch: this.dispatch, - emitter, - getCurrentData: this.getCurrentData, - }; - let { currentDate, dateProfile } = state; - if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) { // hack - dateProfile = currentViewData.dateProfileGenerator.build(currentDate); - } - currentDate = reduceCurrentDate(currentDate, action); - dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator); - if (action.type === 'PREV' || // TODO: move this logic into DateProfileGenerator - action.type === 'NEXT' || // " - !rangeContainsMarker(dateProfile.currentRange, currentDate)) { - currentDate = dateProfile.currentRange.start; - } - let eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext); - let eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext); - let isEventsLoading = computeEventSourcesLoading(eventSources); // BAD. also called in this func in computeIsLoading - let renderableEventStore = (isEventsLoading && !currentViewData.options.progressiveEventRendering) ? - (state.renderableEventStore || eventStore) : // try from previous state - eventStore; - let { eventUiSingleBase, selectionConfig } = this.buildViewUiProps(calendarContext); // will memoize obj - let eventUiBySource = this.buildEventUiBySource(eventSources); - let eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource); - let newState = { - dynamicOptionOverrides, - currentViewType, - currentDate, - dateProfile, - eventSources, - eventStore, - renderableEventStore, - selectionConfig, - eventUiBases, - businessHours: this.parseContextBusinessHours(calendarContext), - dateSelection: reduceDateSelection(state.dateSelection, action), - eventSelection: reduceSelectedEvent(state.eventSelection, action), - eventDrag: reduceEventDrag(state.eventDrag, action), - eventResize: reduceEventResize(state.eventResize, action), - }; - let contextAndState = Object.assign(Object.assign({}, calendarContext), newState); - for (let reducer of optionsData.pluginHooks.reducers) { - Object.assign(newState, reducer(state, action, contextAndState)); // give the OLD state, for old value - } - let wasLoading = computeIsLoading(state, calendarContext); - let isLoading = computeIsLoading(newState, calendarContext); - // TODO: use propSetHandlers in plugin system - if (!wasLoading && isLoading) { - emitter.trigger('loading', true); - } - else if (wasLoading && !isLoading) { - emitter.trigger('loading', false); - } - this.state = newState; - if (props.onAction) { - props.onAction(action); - } - } - updateData() { - let { props, state } = this; - let oldData = this.data; - let optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi); - let currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides); - let data = this.data = Object.assign(Object.assign(Object.assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state); - let changeHandlers = optionsData.pluginHooks.optionChangeHandlers; - let oldCalendarOptions = oldData && oldData.calendarOptions; - let newCalendarOptions = optionsData.calendarOptions; - if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) { - if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) { - // hack - state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data); - state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv); - } - for (let optionName in changeHandlers) { - if (oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) { - changeHandlers[optionName](newCalendarOptions[optionName], data); - } - } - } - if (props.onData) { - props.onData(data); - } - } - _computeOptionsData(optionOverrides, dynamicOptionOverrides, calendarApi) { - // TODO: blacklist options that are handled by optionChangeHandlers - let { refinedOptions, pluginHooks, localeDefaults, availableLocaleData, extra, } = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides); - warnUnknownOptions(extra); - let dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator); - let viewSpecs = this.buildViewSpecs(pluginHooks.views, optionOverrides, dynamicOptionOverrides, localeDefaults); - let theme = this.buildTheme(refinedOptions, pluginHooks); - let toolbarConfig = this.parseToolbars(refinedOptions, optionOverrides, theme, viewSpecs, calendarApi); - return { - calendarOptions: refinedOptions, - pluginHooks, - dateEnv, - viewSpecs, - theme, - toolbarConfig, - localeDefaults, - availableRawLocales: availableLocaleData.map, - }; - } - // always called from behind a memoizer - processRawCalendarOptions(optionOverrides, dynamicOptionOverrides) { - let { locales, locale } = mergeRawOptions([ - BASE_OPTION_DEFAULTS, - optionOverrides, - dynamicOptionOverrides, - ]); - let availableLocaleData = this.organizeRawLocales(locales); - let availableRawLocales = availableLocaleData.map; - let localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options; - let pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins); - let refiners = this.currentCalendarOptionsRefiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); - let extra = {}; - let raw = mergeRawOptions([ - BASE_OPTION_DEFAULTS, - localeDefaults, - optionOverrides, - dynamicOptionOverrides, - ]); - let refined = {}; - let currentRaw = this.currentCalendarOptionsInput; - let currentRefined = this.currentCalendarOptionsRefined; - let anyChanges = false; - for (let optionName in raw) { - if (optionName !== 'plugins') { // because plugins is special-cased - if (raw[optionName] === currentRaw[optionName] || - (COMPLEX_OPTION_COMPARATORS[optionName] && - (optionName in currentRaw) && - COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]))) { - refined[optionName] = currentRefined[optionName]; - } - else if (refiners[optionName]) { - refined[optionName] = refiners[optionName](raw[optionName]); - anyChanges = true; - } - else { - extra[optionName] = currentRaw[optionName]; - } - } - } - if (anyChanges) { - this.currentCalendarOptionsInput = raw; - this.currentCalendarOptionsRefined = refined; - } - return { - rawOptions: this.currentCalendarOptionsInput, - refinedOptions: this.currentCalendarOptionsRefined, - pluginHooks, - availableLocaleData, - localeDefaults, - extra, - }; - } - _computeCurrentViewData(viewType, optionsData, optionOverrides, dynamicOptionOverrides) { - let viewSpec = optionsData.viewSpecs[viewType]; - if (!viewSpec) { - throw new Error(`viewType "${viewType}" is not available. Please make sure you've loaded all neccessary plugins`); - } - let { refinedOptions, extra } = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides); - warnUnknownOptions(extra); - let dateProfileGenerator = this.buildDateProfileGenerator({ - dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass, - duration: viewSpec.duration, - durationUnit: viewSpec.durationUnit, - usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime, - dateEnv: optionsData.dateEnv, - calendarApi: this.props.calendarApi, - slotMinTime: refinedOptions.slotMinTime, - slotMaxTime: refinedOptions.slotMaxTime, - showNonCurrentDates: refinedOptions.showNonCurrentDates, - dayCount: refinedOptions.dayCount, - dateAlignment: refinedOptions.dateAlignment, - dateIncrement: refinedOptions.dateIncrement, - hiddenDays: refinedOptions.hiddenDays, - weekends: refinedOptions.weekends, - nowInput: refinedOptions.now, - validRangeInput: refinedOptions.validRange, - visibleRangeInput: refinedOptions.visibleRange, - monthMode: refinedOptions.monthMode, - fixedWeekCount: refinedOptions.fixedWeekCount, - }); - let viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv); - return { viewSpec, options: refinedOptions, dateProfileGenerator, viewApi }; - } - processRawViewOptions(viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) { - let raw = mergeRawOptions([ - BASE_OPTION_DEFAULTS, - viewSpec.optionDefaults, - localeDefaults, - optionOverrides, - viewSpec.optionOverrides, - dynamicOptionOverrides, - ]); - let refiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); - let refined = {}; - let currentRaw = this.currentViewOptionsInput; - let currentRefined = this.currentViewOptionsRefined; - let anyChanges = false; - let extra = {}; - for (let optionName in raw) { - if (raw[optionName] === currentRaw[optionName] || - (COMPLEX_OPTION_COMPARATORS[optionName] && - COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], currentRaw[optionName]))) { - refined[optionName] = currentRefined[optionName]; - } - else { - if (raw[optionName] === this.currentCalendarOptionsInput[optionName] || - (COMPLEX_OPTION_COMPARATORS[optionName] && - COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], this.currentCalendarOptionsInput[optionName]))) { - if (optionName in this.currentCalendarOptionsRefined) { // might be an "extra" prop - refined[optionName] = this.currentCalendarOptionsRefined[optionName]; - } - } - else if (refiners[optionName]) { - refined[optionName] = refiners[optionName](raw[optionName]); - } - else { - extra[optionName] = raw[optionName]; - } - anyChanges = true; - } - } - if (anyChanges) { - this.currentViewOptionsInput = raw; - this.currentViewOptionsRefined = refined; - } - return { - rawOptions: this.currentViewOptionsInput, - refinedOptions: this.currentViewOptionsRefined, - extra, - }; - } - } - function buildDateEnv$1(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) { - let locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map); - return new DateEnv({ - calendarSystem: 'gregory', - timeZone, - namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl, - locale, - weekNumberCalculation, - firstDay, - weekText, - cmdFormatter: pluginHooks.cmdFormatter, - defaultSeparator, - }); - } - function buildTheme(options, pluginHooks) { - let ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme; - return new ThemeClass(options); - } - function buildDateProfileGenerator(props) { - let DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator; - return new DateProfileGeneratorClass(props); - } - function buildViewApi(type, getCurrentData, dateEnv) { - return new ViewImpl(type, getCurrentData, dateEnv); - } - function buildEventUiBySource(eventSources) { - return mapHash(eventSources, (eventSource) => eventSource.ui); - } - function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) { - let eventUiBases = { '': eventUiSingleBase }; - for (let defId in eventDefs) { - let def = eventDefs[defId]; - if (def.sourceId && eventUiBySource[def.sourceId]) { - eventUiBases[defId] = eventUiBySource[def.sourceId]; - } - } - return eventUiBases; - } - function buildViewUiProps(calendarContext) { - let { options } = calendarContext; - return { - eventUiSingleBase: createEventUi({ - display: options.eventDisplay, - editable: options.editable, - startEditable: options.eventStartEditable, - durationEditable: options.eventDurationEditable, - constraint: options.eventConstraint, - overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined, - allow: options.eventAllow, - backgroundColor: options.eventBackgroundColor, - borderColor: options.eventBorderColor, - textColor: options.eventTextColor, - color: options.eventColor, - // classNames: options.eventClassNames // render hook will handle this - }, calendarContext), - selectionConfig: createEventUi({ - constraint: options.selectConstraint, - overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined, - allow: options.selectAllow, - }, calendarContext), - }; - } - function computeIsLoading(state, context) { - for (let isLoadingFunc of context.pluginHooks.isLoadingFuncs) { - if (isLoadingFunc(state)) { - return true; - } - } - return false; - } - function parseContextBusinessHours(calendarContext) { - return parseBusinessHours(calendarContext.options.businessHours, calendarContext); - } - function warnUnknownOptions(options, viewName) { - for (let optionName in options) { - console.warn(`Unknown option '${optionName}'` + - (viewName ? ` for view '${viewName}'` : '')); - } - } - - class ToolbarSection extends BaseComponent { - render() { - let children = this.props.widgetGroups.map((widgetGroup) => this.renderWidgetGroup(widgetGroup)); - return h('div', { className: 'fc-toolbar-chunk' }, ...children); - } - renderWidgetGroup(widgetGroup) { - let { props } = this; - let { theme } = this.context; - let children = []; - let isOnlyButtons = true; - for (let widget of widgetGroup) { - let { buttonName, buttonClick, buttonText, buttonIcon, buttonHint } = widget; - if (buttonName === 'title') { - isOnlyButtons = false; - children.push(h("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); - } - else { - let isPressed = buttonName === props.activeButton; - let isDisabled = (!props.isTodayEnabled && buttonName === 'today') || - (!props.isPrevEnabled && buttonName === 'prev') || - (!props.isNextEnabled && buttonName === 'next'); - let buttonClasses = [`fc-${buttonName}-button`, theme.getClass('button')]; - if (isPressed) { - buttonClasses.push(theme.getClass('buttonActive')); - } - children.push(h("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? h("span", { className: buttonIcon }) : ''))); - } - } - if (children.length > 1) { - let groupClassName = (isOnlyButtons && theme.getClass('buttonGroup')) || ''; - return h('div', { className: groupClassName }, ...children); - } - return children[0]; - } - } - - class Toolbar extends BaseComponent { - render() { - let { model, extraClassName } = this.props; - let forceLtr = false; - let startContent; - let endContent; - let sectionWidgets = model.sectionWidgets; - let centerContent = sectionWidgets.center; - if (sectionWidgets.left) { - forceLtr = true; - startContent = sectionWidgets.left; - } - else { - startContent = sectionWidgets.start; - } - if (sectionWidgets.right) { - forceLtr = true; - endContent = sectionWidgets.right; - } - else { - endContent = sectionWidgets.end; - } - let classNames = [ - extraClassName || '', - 'fc-toolbar', - forceLtr ? 'fc-toolbar-ltr' : '', - ]; - return (h("div", { className: classNames.join(' ') }, - this.renderSection('start', startContent || []), - this.renderSection('center', centerContent || []), - this.renderSection('end', endContent || []))); - } - renderSection(key, widgetGroups) { - let { props } = this; - return (h(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 })); - } - } - - // TODO: do function component? - class ViewContainer extends BaseComponent { - constructor() { - super(...arguments); - this.state = { - availableWidth: null, - }; - this.handleEl = (el) => { - this.el = el; - setRef(this.props.elRef, el); - this.updateAvailableWidth(); - }; - this.handleResize = () => { - this.updateAvailableWidth(); - }; - } - render() { - let { props, state } = this; - let { aspectRatio } = props; - let classNames = [ - 'fc-view-harness', - (aspectRatio || props.liquid || props.height) - ? 'fc-view-harness-active' // harness controls the height - : 'fc-view-harness-passive', // let the view do the height - ]; - let height = ''; - let paddingBottom = ''; - if (aspectRatio) { - if (state.availableWidth !== null) { - height = state.availableWidth / aspectRatio; - } - else { - // while waiting to know availableWidth, we can't set height to *zero* - // because will cause lots of unnecessary scrollbars within scrollgrid. - // BETTER: don't start rendering ANYTHING yet until we know container width - // NOTE: why not always use paddingBottom? Causes height oscillation (issue 5606) - paddingBottom = `${(1 / aspectRatio) * 100}%`; - } - } - else { - height = props.height || ''; - } - return (h("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height, paddingBottom } }, props.children)); - } - componentDidMount() { - this.context.addResizeHandler(this.handleResize); - } - componentWillUnmount() { - this.context.removeResizeHandler(this.handleResize); - } - updateAvailableWidth() { - if (this.el && // needed. but why? - this.props.aspectRatio // aspectRatio is the only height setting that needs availableWidth - ) { - this.setState({ availableWidth: this.el.offsetWidth }); - } - } - } - - /* - Detects when the user clicks on an event within a DateComponent - */ - class EventClicking extends Interaction { - constructor(settings) { - super(settings); - this.handleSegClick = (ev, segEl) => { - let { component } = this; - let { context } = component; - let seg = getElSeg(segEl); - if (seg && // might be the
surrounding the more link - component.isValidSegDownEl(ev.target)) { - // our way to simulate a link click for elements that can't be tags - // grab before trigger fired in case trigger trashes DOM thru rerendering - let hasUrlContainer = elementClosest(ev.target, '.fc-event-forced-url'); - let url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : ''; - context.emitter.trigger('eventClick', { - el: segEl, - event: new EventImpl(component.context, seg.eventRange.def, seg.eventRange.instance), - jsEvent: ev, - view: context.viewApi, - }); - if (url && !ev.defaultPrevented) { - window.location.href = url; - } - } - }; - this.destroy = listenBySelector(settings.el, 'click', '.fc-event', // on both fg and bg events - this.handleSegClick); - } - } - - /* - Triggers events and adds/removes core classNames when the user's pointer - enters/leaves event-elements of a component. - */ - class EventHovering extends Interaction { - constructor(settings) { - super(settings); - // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it - this.handleEventElRemove = (el) => { - if (el === this.currentSegEl) { - this.handleSegLeave(null, this.currentSegEl); - } - }; - this.handleSegEnter = (ev, segEl) => { - if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper - this.currentSegEl = segEl; - this.triggerEvent('eventMouseEnter', ev, segEl); - } - }; - this.handleSegLeave = (ev, segEl) => { - if (this.currentSegEl) { - this.currentSegEl = null; - this.triggerEvent('eventMouseLeave', ev, segEl); - } - }; - this.removeHoverListeners = listenToHoverBySelector(settings.el, '.fc-event', // on both fg and bg events - this.handleSegEnter, this.handleSegLeave); - } - destroy() { - this.removeHoverListeners(); - } - triggerEvent(publicEvName, ev, segEl) { - let { component } = this; - let { context } = component; - let seg = getElSeg(segEl); - if (!ev || component.isValidSegDownEl(ev.target)) { - context.emitter.trigger(publicEvName, { - el: segEl, - event: new EventImpl(context, seg.eventRange.def, seg.eventRange.instance), - jsEvent: ev, - view: context.viewApi, - }); - } - } - } - - class CalendarContent extends PureComponent { - constructor() { - super(...arguments); - this.buildViewContext = memoize(buildViewContext); - this.buildViewPropTransformers = memoize(buildViewPropTransformers); - this.buildToolbarProps = memoize(buildToolbarProps); - this.headerRef = y(); - this.footerRef = y(); - this.interactionsStore = {}; - // eslint-disable-next-line - this.state = { - viewLabelId: getUniqueDomId(), - }; - // Component Registration - // ----------------------------------------------------------------------------------------------------------------- - this.registerInteractiveComponent = (component, settingsInput) => { - let settings = parseInteractionSettings(component, settingsInput); - let DEFAULT_INTERACTIONS = [ - EventClicking, - EventHovering, - ]; - let interactionClasses = DEFAULT_INTERACTIONS.concat(this.props.pluginHooks.componentInteractions); - let interactions = interactionClasses.map((TheInteractionClass) => new TheInteractionClass(settings)); - this.interactionsStore[component.uid] = interactions; - interactionSettingsStore[component.uid] = settings; - }; - this.unregisterInteractiveComponent = (component) => { - let listeners = this.interactionsStore[component.uid]; - if (listeners) { - for (let listener of listeners) { - listener.destroy(); - } - delete this.interactionsStore[component.uid]; - } - delete interactionSettingsStore[component.uid]; - }; - // Resizing - // ----------------------------------------------------------------------------------------------------------------- - this.resizeRunner = new DelayedRunner(() => { - this.props.emitter.trigger('_resize', true); // should window resizes be considered "forced" ? - this.props.emitter.trigger('windowResize', { view: this.props.viewApi }); - }); - this.handleWindowResize = (ev) => { - let { options } = this.props; - if (options.handleWindowResize && - ev.target === window // avoid jqui events - ) { - this.resizeRunner.request(options.windowResizeDelay); - } - }; - } - /* - renders INSIDE of an outer div - */ - render() { - let { props } = this; - let { toolbarConfig, options } = props; - let toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, getNow(props.options.now, props.dateEnv), // TODO: use NowTimer???? - props.viewTitle); - let viewVGrow = false; - let viewHeight = ''; - let viewAspectRatio; - if (props.isHeightAuto || props.forPrint) { - viewHeight = ''; - } - else if (options.height != null) { - viewVGrow = true; - } - else if (options.contentHeight != null) { - viewHeight = options.contentHeight; - } - else { - viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall - } - let viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent); - let viewLabelId = (toolbarConfig.header && toolbarConfig.header.hasTitle) - ? this.state.viewLabelId - : ''; - return (h(ViewContextType.Provider, { value: viewContext }, - toolbarConfig.header && (h(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))), - h(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, - this.renderView(props), - this.buildAppendContent()), - toolbarConfig.footer && (h(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))))); - } - componentDidMount() { - let { props } = this; - this.calendarInteractions = props.pluginHooks.calendarInteractions - .map((CalendarInteractionClass) => new CalendarInteractionClass(props)); - window.addEventListener('resize', this.handleWindowResize); - let { propSetHandlers } = props.pluginHooks; - for (let propName in propSetHandlers) { - propSetHandlers[propName](props[propName], props); - } - } - componentDidUpdate(prevProps) { - let { props } = this; - let { propSetHandlers } = props.pluginHooks; - for (let propName in propSetHandlers) { - if (props[propName] !== prevProps[propName]) { - propSetHandlers[propName](props[propName], props); - } - } - } - componentWillUnmount() { - window.removeEventListener('resize', this.handleWindowResize); - this.resizeRunner.clear(); - for (let interaction of this.calendarInteractions) { - interaction.destroy(); - } - this.props.emitter.trigger('_unmount'); - } - buildAppendContent() { - let { props } = this; - let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props)); - return h(p, {}, ...children); - } - renderView(props) { - let { pluginHooks } = props; - let { viewSpec } = props; - let viewProps = { - dateProfile: props.dateProfile, - businessHours: props.businessHours, - eventStore: props.renderableEventStore, - eventUiBases: props.eventUiBases, - dateSelection: props.dateSelection, - eventSelection: props.eventSelection, - eventDrag: props.eventDrag, - eventResize: props.eventResize, - isHeightAuto: props.isHeightAuto, - forPrint: props.forPrint, - }; - let transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers); - for (let transformer of transformers) { - Object.assign(viewProps, transformer.transform(viewProps, props)); - } - let ViewComponent = viewSpec.component; - return (h(ViewComponent, Object.assign({}, viewProps))); - } - } - function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) { - // don't force any date-profiles to valid date profiles (the `false`) so that we can tell if it's invalid - let todayInfo = dateProfileGenerator.build(now, undefined, false); // TODO: need `undefined` or else INFINITE LOOP for some reason - let prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false); - let nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false); - return { - title, - activeButton: viewSpec.type, - navUnit: viewSpec.singleUnit, - isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now), - isPrevEnabled: prevInfo.isValid, - isNextEnabled: nextInfo.isValid, - }; - } - // Plugin - // ----------------------------------------------------------------------------------------------------------------- - function buildViewPropTransformers(theClasses) { - return theClasses.map((TheClass) => new TheClass()); - } - - class Calendar extends CalendarImpl { - constructor(el, optionOverrides = {}) { - super(); - this.isRendering = false; - this.isRendered = false; - this.currentClassNames = []; - this.customContentRenderId = 0; - this.handleAction = (action) => { - // actions we know we want to render immediately - switch (action.type) { - case 'SET_EVENT_DRAG': - case 'SET_EVENT_RESIZE': - this.renderRunner.tryDrain(); - } - }; - this.handleData = (data) => { - this.currentData = data; - this.renderRunner.request(data.calendarOptions.rerenderDelay); - }; - this.handleRenderRequest = () => { - if (this.isRendering) { - this.isRendered = true; - let { currentData } = this; - flushSync(() => { - P$1(h(CalendarRoot, { options: currentData.calendarOptions, theme: currentData.theme, emitter: currentData.emitter }, (classNames, height, isHeightAuto, forPrint) => { - this.setClassNames(classNames); - this.setHeight(height); - return (h(RenderId.Provider, { value: this.customContentRenderId }, - h(CalendarContent, Object.assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData)))); - }), this.el); - }); - } - else if (this.isRendered) { - this.isRendered = false; - P$1(null, this.el); - this.setClassNames([]); - this.setHeight(''); - } - }; - this.el = el; - this.renderRunner = new DelayedRunner(this.handleRenderRequest); - new CalendarDataManager({ - optionOverrides, - calendarApi: this, - onAction: this.handleAction, - onData: this.handleData, - }); - } - render() { - let wasRendering = this.isRendering; - if (!wasRendering) { - this.isRendering = true; - } - else { - this.customContentRenderId += 1; - } - this.renderRunner.request(); - if (wasRendering) { - this.updateSize(); - } - } - destroy() { - if (this.isRendering) { - this.isRendering = false; - this.renderRunner.request(); - } - } - updateSize() { - flushSync(() => { - super.updateSize(); - }); - } - batchRendering(func) { - this.renderRunner.pause('batchRendering'); - func(); - this.renderRunner.resume('batchRendering'); - } - pauseRendering() { - this.renderRunner.pause('pauseRendering'); - } - resumeRendering() { - this.renderRunner.resume('pauseRendering', true); - } - resetOptions(optionOverrides, append) { - this.currentDataManager.resetOptions(optionOverrides, append); - } - setClassNames(classNames) { - if (!isArraysEqual(classNames, this.currentClassNames)) { - let { classList } = this.el; - for (let className of this.currentClassNames) { - classList.remove(className); - } - for (let className of classNames) { - classList.add(className); - } - this.currentClassNames = classNames; - } - } - setHeight(height) { - applyStyleProp(this.el, 'height', height); - } - } - - function formatDate(dateInput, options = {}) { - let dateEnv = buildDateEnv(options); - let formatter = createFormatter(options); - let dateMeta = dateEnv.createMarkerMeta(dateInput); - if (!dateMeta) { // TODO: warning? - return ''; - } - return dateEnv.format(dateMeta.marker, formatter, { - forcedTzo: dateMeta.forcedTzo, - }); - } - function formatRange(startInput, endInput, options) { - let dateEnv = buildDateEnv(typeof options === 'object' && options ? options : {}); // pass in if non-null object - let formatter = createFormatter(options); - let startMeta = dateEnv.createMarkerMeta(startInput); - let endMeta = dateEnv.createMarkerMeta(endInput); - if (!startMeta || !endMeta) { // TODO: warning? - return ''; - } - return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, { - forcedStartTzo: startMeta.forcedTzo, - forcedEndTzo: endMeta.forcedTzo, - isEndExclusive: options.isEndExclusive, - defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator, - }); - } - // TODO: more DRY and optimized - function buildDateEnv(settings) { - let locale = buildLocale(settings.locale || 'en', organizeRawLocales([]).map); // TODO: don't hardcode 'en' everywhere - return new DateEnv(Object.assign(Object.assign({ timeZone: BASE_OPTION_DEFAULTS.timeZone, calendarSystem: 'gregory' }, settings), { locale })); - } - - // HELPERS - /* - if nextDayThreshold is specified, slicing is done in an all-day fashion. - you can get nextDayThreshold from context.nextDayThreshold - */ - function sliceEvents(props, allDay) { - return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg; - } - - const version = '6.0.1'; - - exports.Calendar = Calendar; - exports.Internal = internal; - exports.JsonRequestError = JsonRequestError; - exports.Preact = preact; - exports.createPlugin = createPlugin; - exports.formatDate = formatDate; - exports.formatRange = formatRange; - exports.globalLocales = globalLocales; - exports.globalPlugins = globalPlugins; - exports.sliceEvents = sliceEvents; - exports.version = version; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/index.global.min.js deleted file mode 100644 index 095dbfe6..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -var FullCalendar=function(e){"use strict";function t(e){e.parentNode&&e.parentNode.removeChild(e)}function n(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(r(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function r(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function i(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e{let i=n(r.target,e);i&&t.call(i,r,i)}}(r,i);return e.addEventListener(t,o),()=>{e.removeEventListener(t,o)}}const h=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function p(e){return Object.assign({onClick:e},g(e))}function g(e){return{tabIndex:0,onKeyDown(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}let m=0;function v(){return m+=1,String(m)}function A(e){let t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;te.replace("$"+n,t||""),e):n}function C(e){return e%1==0}function w(e){let t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}const S=["years","months","days","milliseconds"],T=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function k(e,t){return"string"==typeof e?function(e){let t=T.exec(e);if(t){let e=t[1]?-1:1;return{years:0,months:0,days:e*(t[2]?parseInt(t[2],10):0),milliseconds:e*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?R(e):"number"==typeof e?R({[t||"milliseconds"]:e}):null}function R(e){let t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function x(e){return O(e)/864e5}function O(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function I(e){let t=e.milliseconds;if(t){if(t%1e3!=0)return{unit:"millisecond",value:t};if(t%6e4!=0)return{unit:"second",value:t/1e3};if(t%36e5!=0)return{unit:"minute",value:t/6e4};if(t)return{unit:"hour",value:t/36e5}}return e.days?e.specifiedWeeks&&e.days%7==0?{unit:"week",value:e.days/7}:{unit:"day",value:e.days}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}const{hasOwnProperty:M}=Object.prototype;function N(e,t){let n={};if(t)for(let r in t){let t=[];for(let i=e.length-1;i>=0;i-=1){let o=e[i][r];if("object"==typeof o&&o)t.unshift(o);else if(void 0!==o){n[r]=o;break}}t.length&&(n[r]=N(t))}for(let t=e.length-1;t>=0;t-=1){let r=e[t];for(let e in r)e in n||(n[e]=r[e])}return n}function B(e,t){let n={};for(let r in e)t(e[r],r)&&(n[r]=e[r]);return n}function H(e,t){let n={};for(let r in e)n[r]=t(e[r],r);return n}function P(e){let t={};for(let n of e)t[n]=!0;return t}function U(e){let t=[];for(let n in e)t.push(e[n]);return t}function j(e,t){if(e===t)return!0;for(let n in e)if(M.call(e,n)&&!(n in t))return!1;for(let n in t)if(M.call(t,n)&&e[n]!==t[n])return!1;return!0}function z(e,t){let n=[];for(let r in e)M.call(e,r)&&(r in t||n.push(r));for(let r in t)M.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function L(e,t,n={}){if(e===t)return!0;for(let r in t)if(!(r in e)||!F(e[r],t[r],n[r]))return!1;for(let n in e)if(!(n in t))return!1;return!0}function F(e,t,n){return e===t||!0===n||!!n&&n(e,t)}function V(e,t=0,n,r=1){let i=[];null==n&&(n=Object.keys(e).length);for(let o=t;o10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",le(t,!0)))),r}function ae(e){return e.toISOString().replace(/T.*$/,"")}function le(e,t=!1){let n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),o=Math.round(r%60);return t?`${n+E(i,2)}:${E(o,2)}`:`GMT${n}${i}${o?":"+E(o,2):""}`}function ce(e,t,n){if(e===t)return!0;let r,i=e.length;if(i!==t.length)return!1;for(r=0;r{if(r){if(!j(r,o)){n&&n(i);let r=e.call(this,o);t&&t(r,i)||(i=r)}}else i=e.call(this,o);return r=o,i}}const fe={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},he={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},pe=/\s*([ap])\.?m\.?/i,ge=/,/g,me=/\s+/g,ve=/\u200e/g,Ae=/UTC|GMT/;class be{constructor(e){let t={},n={},r=0;for(let i in e)i in fe?(n[i]=e[i],r=Math.max(fe[i],r)):(t[i]=e[i],i in he&&(r=Math.max(he[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=ue(ye)}format(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)}formatRange(e,t,n,r){let{standardDateProps:i,extendedSettings:o}=this,s=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(oe(e)!==oe(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!s)return this.format(e,n);let a=s;!(a>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(a=1);let l=this.format(e,n),c=this.format(t,n);if(l===c)return l;let u=ye(function(e,t){let n={};for(let r in e)(!(r in he)||he[r]<=t)&&(n[r]=e[r]);return n}(i,a),o,n),d=u(e),f=u(t),h=function(e,t,n,r){let i=0;for(;ile(e.timeZoneOffset):0===r&&t.week?e=>function(e,t,n,r,i){let o=[];"long"===i?o.push(n):"short"!==i&&"narrow"!==i||o.push(t);"long"!==i&&"short"!==i||o.push(" ");o.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&o.reverse();return o.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week):function(e,t,n){e=Object.assign({},e),t=Object.assign({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";let r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){let t=Object.assign({},e);delete t.minute,r=new Intl.DateTimeFormat(n.locale.codes,t)}return o=>{let s,{marker:a}=o;return s=r&&!a.getUTCMinutes()?r:i,function(e,t,n,r,i){e=e.replace(ve,""),"short"===n.timeZoneName&&(e=function(e,t){let n=!1;e=e.replace(Ae,()=>(n=!0,t)),n||(e+=" "+t);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":le(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(ge,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(pe,"").trim():"narrow"===r.meridiem?e=e.replace(pe,(e,t)=>t.toLocaleLowerCase()):"short"===r.meridiem?e=e.replace(pe,(e,t)=>t.toLocaleLowerCase()+"m"):"lowercase"===r.meridiem&&(e=e.replace(pe,e=>e.toLocaleLowerCase()));return e=(e=e.replace(me," ")).trim()}(s.format(a),o,e,t,n)}}(e,t,n)}function _e(e,t){let n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function Ee(e,t,n,r){let i=_e(e,n.calendarSystem);return{date:i,start:i,end:t?_e(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}class De{constructor(e){this.cmdStr=e}format(e,t,n){return t.cmdFormatter(this.cmdStr,Ee(e,null,t,n))}formatRange(e,t,n,r){return n.cmdFormatter(this.cmdStr,Ee(e,t,n,r))}}class Ce{constructor(e){this.func=e}format(e,t,n){return this.func(Ee(e,null,t,n))}formatRange(e,t,n,r){return this.func(Ee(e,t,n,r))}}function we(e){return"object"==typeof e&&e?new be(e):"string"==typeof e?new De(e):"function"==typeof e?new Ce(e):null}const Se={navLinkDayClick:Be,navLinkWeekClick:Be,duration:k,bootstrapFontAwesome:Be,buttonIcons:Be,customButtons:Be,defaultAllDayEventDuration:k,defaultTimedEventDuration:k,nextDayThreshold:k,scrollTime:k,scrollTimeReset:Boolean,slotMinTime:k,slotMaxTime:k,dayPopoverFormat:we,slotDuration:k,snapDuration:k,headerToolbar:Be,footerToolbar:Be,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:we,dayHeaderClassNames:Be,dayHeaderContent:Be,dayHeaderDidMount:Be,dayHeaderWillUnmount:Be,dayCellClassNames:Be,dayCellContent:Be,dayCellDidMount:Be,dayCellWillUnmount:Be,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:Be,weekNumbers:Boolean,weekNumberClassNames:Be,weekNumberContent:Be,weekNumberDidMount:Be,weekNumberWillUnmount:Be,editable:Boolean,viewClassNames:Be,viewDidMount:Be,viewWillUnmount:Be,nowIndicator:Boolean,nowIndicatorClassNames:Be,nowIndicatorContent:Be,nowIndicatorDidMount:Be,nowIndicatorWillUnmount:Be,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:Be,locale:Be,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:Be,eventOrder:A,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:Be,contentHeight:Be,direction:String,weekNumberFormat:we,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:Be,initialDate:Be,now:Be,eventDataTransform:Be,stickyHeaderDates:Be,stickyFooterScrollbar:Be,viewHeight:Be,defaultAllDay:Boolean,eventSourceFailure:Be,eventSourceSuccess:Be,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:Be,eventConstraint:Be,eventAllow:Be,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:Be,eventContent:Be,eventDidMount:Be,eventWillUnmount:Be,selectConstraint:Be,selectOverlap:Be,selectAllow:Be,droppable:Boolean,unselectCancel:String,slotLabelFormat:Be,slotLaneClassNames:Be,slotLaneContent:Be,slotLaneDidMount:Be,slotLaneWillUnmount:Be,slotLabelClassNames:Be,slotLabelContent:Be,slotLabelDidMount:Be,slotLabelWillUnmount:Be,dayMaxEvents:Be,dayMaxEventRows:Be,dayMinWidth:Number,slotLabelInterval:k,allDayText:String,allDayClassNames:Be,allDayContent:Be,allDayDidMount:Be,allDayWillUnmount:Be,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:we,rerenderDelay:Number,moreLinkText:Be,moreLinkHint:Be,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:Be,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:k,hiddenDays:Be,monthMode:Boolean,fixedWeekCount:Boolean,validRange:Be,visibleRange:Be,titleFormat:Be,eventInteractive:Boolean,noEventsText:String,viewHint:Be,navLinkHint:Be,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:Be,moreLinkClassNames:Be,moreLinkContent:Be,moreLinkDidMount:Be,moreLinkWillUnmount:Be,handleCustomRendering:Be,customRenderingMetaMap:Be,customRenderingReplacesEl:Boolean},Te={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},ke={datesSet:Be,eventsSet:Be,eventAdd:Be,eventChange:Be,eventRemove:Be,windowResize:Be,eventClick:Be,eventMouseEnter:Be,eventMouseLeave:Be,select:Be,unselect:Be,loading:Be,_unmount:Be,_beforeprint:Be,_afterprint:Be,_noEventDrop:Be,_noEventResize:Be,_resize:Be,_scrollRequest:Be},Re={buttonText:Be,buttonHints:Be,views:Be,plugins:Be,initialEvents:Be,events:Be,eventSources:Be},xe={headerToolbar:Oe,footerToolbar:Oe,buttonText:Oe,buttonHints:Oe,buttonIcons:Oe,dateIncrement:Oe};function Oe(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?j(e,t):e===t}const Ie={type:String,component:Be,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:Be,usesMinMaxTime:Boolean,classNames:Be,content:Be,didMount:Be,willUnmount:Be};function Me(e){return N(e,xe)}function Ne(e,t){let n={},r={};for(let r in t)r in e&&(n[r]=t[r](e[r]));for(let n in e)n in t||(r[n]=e[n]);return{refined:n,extra:r}}function Be(e){return e}function He(e,t,n,r){return{instanceId:v(),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}function Pe(e,t,n){let{dateEnv:r,pluginHooks:i,options:o}=n,{defs:s,instances:a}=e;a=B(a,e=>!s[e.defId].recurringDef);for(let e in s){let n=s[e];if(n.recurringDef){let{duration:s}=n.recurringDef;s||(s=n.allDay?o.defaultAllDayEventDuration:o.defaultTimedEventDuration);let l=Ue(n,s,t,r,i.recurringTypes);for(let t of l){let n=He(e,{start:t,end:r.add(t,s)});a[n.instanceId]=n}}}return{defs:s,instances:a}}function Ue(e,t,n,r,i){let o=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(o=o.map($)),o}function je(e,t,n,r){let i={defs:{},instances:{}},o=nt(n);for(let s of e){let e=et(s,t,n,r,o);e&&ze(e,i)}return i}function ze(e,t={defs:{},instances:{}}){return t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function Le(e,t){let n=e.instances[t];if(n){let t=e.defs[n.defId],r=We(e,e=>{return n=t,r=e,Boolean(n.groupId&&n.groupId===r.groupId);var n,r});return r.defs[t.defId]=t,r.instances[n.instanceId]=n,r}return{defs:{},instances:{}}}function Fe(){return{defs:{},instances:{}}}function Ve(e,t){return{defs:Object.assign(Object.assign({},e.defs),t.defs),instances:Object.assign(Object.assign({},e.instances),t.instances)}}function We(e,t){let n=B(e.defs,t),r=B(e.instances,e=>n[e.defId]);return{defs:n,instances:r}}function Qe(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}const Ge={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:Be,overlap:Be,allow:Be,className:Qe,classNames:Qe,color:String,backgroundColor:String,borderColor:String,textColor:String},Ze={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Ye(e,t){let n=function(e,t){return Array.isArray(e)?je(e,null,t,!0):"object"==typeof e&&e?je([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function qe(e){return e.reduce(Je,Ze)}function Je(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}const $e={id:String,groupId:String,title:String,url:String,interactive:Boolean},Xe={start:Be,end:Be,date:Be,allDay:Boolean},Ke=Object.assign(Object.assign(Object.assign({},$e),Xe),{extendedProps:Be});function et(e,t,n,r,i=nt(n)){let{refined:o,extra:s}=tt(e,n,i),a=function(e,t){let n=null;e&&(n=e.defaultAllDay);null==n&&(n=t.options.defaultAllDay);return n}(t,n),l=function(e,t,n,r){for(let i=0;ie.daysOfWeek):"object"==typeof e&&e?[e]:[];return t=t.map(e=>Object.assign(Object.assign({},it),e)),t}(e),null,t)}function st(e){let t=Math.floor(Z(e.start,e.end))||1,n=$(e.start);return{start:n,end:Q(n,t)}}function at(e,t=k(0)){let n=null,r=null;if(e.end){r=$(e.end);let n=e.end.valueOf()-r.valueOf();n&&n>=O(t)&&(r=Q(r,1))}return e.start&&(n=$(e.start),r&&r<=n&&(r=Q(n,1))),{start:n,end:r}}function lt(e,t,n,r){return"year"===r?k(n.diffWholeYears(e,t),"year"):"month"===r?k(n.diffWholeMonths(e,t),"month"):Y(e,t)}function ct(e,t){let n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left
/ elements with colspans. - SOLUTION: making individual
",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);let t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),ut}const ft={defs:{},instances:{}};function ht(e,t,n){let r=[];e&&r.push(e),t&&r.push(t);let i={"":qe(r)};return n&&Object.assign(i,n),i}function pt(e,t){let n,r,i=[],{start:o}=t;for(e.sort(gt),n=0;no&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return ot.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function yt(e,t){return(null===e.start||t>=e.start)&&(null===e.end||tn:!!t&&e>=t.end)}}function Et(e,t){let n=["fc-day","fc-day-"+W[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}const Dt=we({year:"numeric",month:"long",day:"numeric"}),Ct=we({week:"long"});function wt(e,t,n="day",r=!0){const{dateEnv:i,options:o,calendarApi:s}=e;let a=i.format(t,"week"===n?Ct:Dt);if(o.navLinks){let e=i.toDate(t);const l=e=>{let r="day"===n?o.navLinkDayClick:"week"===n?o.navLinkWeekClick:null;"function"==typeof r?r.call(s,i.toDate(t),e):("string"==typeof r&&(n=r),s.zoomTo(t,n))};return Object.assign({title:D(o.navLinkHint,[a,e],a),"data-navlink":""},r?p(l):{onClick:l})}return{"aria-label":a}}let St,Tt=null;function kt(){return null===Tt&&(Tt=function(){let e=document.createElement("div");s(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
",document.body.appendChild(e);let n=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return t(e),n}()),Tt}function Rt(){return St||(St=function(){let e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);let t=xt(e);return document.body.removeChild(e),t}()),St}function xt(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function Ot(e,t=!1){let n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,s=parseInt(n.borderBottomWidth,10)||0,a=xt(e),l=a.y-r-i,c={borderLeft:r,borderRight:i,borderTop:o,borderBottom:s,scrollbarBottom:a.x-o-s,scrollbarLeft:0,scrollbarRight:0};return kt()&&"rtl"===n.direction?c.scrollbarLeft=l:c.scrollbarRight=l,t&&(c.paddingLeft=parseInt(n.paddingLeft,10)||0,c.paddingRight=parseInt(n.paddingRight,10)||0,c.paddingTop=parseInt(n.paddingTop,10)||0,c.paddingBottom=parseInt(n.paddingBottom,10)||0),c}function It(e){let 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 Mt(e){let t=[];for(;e instanceof HTMLElement;){let 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 Nt(e,t,n){let r=!1,i=function(e){r||(r=!0,t(e))},o=function(e){r||(r=!0,n(e))},s=e(i,o);s&&"function"==typeof s.then&&s.then(i,o)}class Bt{constructor(){this.handlers={},this.thisContext=null}setThisContext(e){this.thisContext=e}setOptions(e){this.options=e}on(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)}off(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter(e=>e!==n)):delete e[t]}(this.handlers,e,t)}trigger(e,...t){let n=this.handlers[e]||[],r=this.options&&this.options[e],i=[].concat(r||[],n);for(let e of i)e.apply(this.thisContext,t)}hasHandlers(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])}}class Ht{getMaxScrollTop(){return this.getScrollHeight()-this.getClientHeight()}getMaxScrollLeft(){return this.getScrollWidth()-this.getClientWidth()}canScrollVertically(){return this.getMaxScrollTop()>0}canScrollHorizontally(){return this.getMaxScrollLeft()>0}canScrollUp(){return this.getScrollTop()>0}canScrollDown(){return this.getScrollTop()0}canScrollRight(){return this.getScrollLeft()2&&(s.children=arguments.length>3?Ut.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===s[o]&&(s[o]=e.defaultProps[o]);return $t(e,s,r,i,null)}function $t(e,t,n,r,i){var o={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==i?++zt:i};return null==i&&null!=jt.vnode&&jt.vnode(o),o}function Xt(){return{current:null}}function Kt(e){return e.children}function en(e,t){this.props=e,this.context=t}function tn(e,t){if(null==t)return e.__?tn(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t0?$t(h.type,h.props,h.key,h.ref?h.ref:null,h.__v):h)){if(h.__=n,h.__b=n.__b+1,null===(f=v[u])||f&&h.key==f.key&&h.type===f.type)v[u]=void 0;else for(d=0;d3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),yn(Jt(Qn,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function Zn(e,t){var n=Jt(Gn,{__v:e,i:t});return n.containerInfo=t,n}(Vn.prototype=new en).__a=function(e){var t=this,n=Fn(t.__v),r=t.o.get(e);return r[0]++,function(i){var o=function(){t.props.revealOrder?(r.push(i),Wn(t,e,r)):i()};n?n(o):o()}},Vn.prototype.render=function(e){this.u=null,this.o=new Map;var t=ln(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},Vn.prototype.componentDidUpdate=Vn.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){Wn(e,n,t)}))};var Yn="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,qn=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Jn="undefined"!=typeof document,$n=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};en.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(en.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var Xn=jt.event;function Kn(){}function er(){return this.cancelBubble}function tr(){return this.defaultPrevented}jt.event=function(e){return Xn&&(e=Xn(e)),e.persist=Kn,e.isPropagationStopped=er,e.isDefaultPrevented=tr,e.nativeEvent=e};var nr={configurable:!0,get:function(){return this.class}},rr=jt.vnode;jt.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var o in r={},n){var s=n[o];Jn&&"children"===o&&"noscript"===t||"value"===o&&"defaultValue"in n&&null==s||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===s?s="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!$n(n.type)?o="oninput":/^onfocus$/i.test(o)?o="onfocusin":/^onblur$/i.test(o)?o="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(o)?o=o.toLowerCase():i&&qn.test(o)?o=o.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===s&&(s=void 0),/^oninput$/i.test(o)&&(o=o.toLowerCase(),r[o]&&(o="oninputCapture")),r[o]=s)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=ln(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=ln(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,n.class!=n.className&&(nr.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",nr))}e.$$typeof=Yn,rr&&rr(e)};var ir=jt.__r;function or(e){e();let t=jt.debounceRendering,n=[];for(jt.debounceRendering=function(e){n.push(e)},yn(Jt(sr,{}),document.createElement("div"));n.length;)n.shift()();jt.debounceRendering=t}jt.__r=function(e){ir&&ir(e),e.__c};class sr extends en{render(){return Jt("div",{})}componentDidMount(){this.setState({})}}function ar(e){let t=function(e,t){var n={__c:t="__cC"+Wt++,__: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(rn)},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(){let e=!this.getChildContext,t=n.apply(this,arguments);if(e){let e=[];this.shouldComponentUpdate=t=>{this.props.value!==t.value&&e.forEach(e=>{e.context=t.value,e.forceUpdate()})},this.sub=t=>{e.push(t);let n=t.componentWillUnmount;t.componentWillUnmount=()=>{e.splice(e.indexOf(t),1),n&&n.call(t)}}}return t},t}var lr={__proto__:null,flushSync:or,createContext:ar,createPortal:Zn,Component:en,Fragment:Kt,cloneElement:function(e,t,n){var r,i,o,s=Yt({},e.props);for(o in t)"key"==o?r=t[o]:"ref"==o?i=t[o]:s[o]=t[o];return arguments.length>2&&(s.children=arguments.length>3?Ut.call(arguments,2):n),$t(e.type,s,r||e.key,i||e.ref,null)},createElement:Jt,createRef:Xt,h:Jt,hydrate:function e(t,n){yn(t,n,e)},get isValidElement(){return Lt},get options(){return jt},render:yn,toChildArray:ln};class cr{constructor(e,t,n,r){this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=r,this.handleScrollRequest=e=>{this.queuedRequest=Object.assign({},this.queuedRequest||{},e),this.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}detach(){this.emitter.off("_scrollRequest",this.handleScrollRequest)}update(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()}fireInitialScroll(){this.handleScrollRequest({time:this.scrollTime})}drain(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)}}const ur=ar({});function dr(e,t,n,r,i,o,s,a,l,c,u,d,f){return{dateEnv:i,options:n,pluginHooks:s,emitter:c,dispatch:a,getCurrentData:l,calendarApi:u,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:o,isRtl:"rtl"===n.direction,addResizeHandler(e){c.on("_resize",e)},removeResizeHandler(e){c.off("_resize",e)},createScrollResponder:e=>new cr(e,c,k(n.scrollTime),n.scrollTimeReset),registerInteractiveComponent:d,unregisterInteractiveComponent:f}}class fr extends en{shouldComponentUpdate(e,t){return this.debug&&console.log(z(e,this.props),z(t,this.state)),!L(this.props,e,this.propEquality)||!L(this.state,t,this.stateEquality)}safeSetState(e){L(this.state,Object.assign(Object.assign({},this.state),e),this.stateEquality)||this.setState(e)}}fr.addPropsEquality=function(e){let t=Object.create(this.prototype.propEquality);Object.assign(t,e),this.prototype.propEquality=t},fr.addStateEquality=function(e){let t=Object.create(this.prototype.stateEquality);Object.assign(t,e),this.prototype.stateEquality=t},fr.contextType=ur,fr.prototype.propEquality={},fr.prototype.stateEquality={};class hr extends fr{}function pr(e,t){"function"==typeof e?e(t):e&&(e.current=t)}hr.contextType=ur;class gr extends hr{constructor(){super(...arguments),this.uid=v()}prepareHits(){}queryHit(e,t,n,r){return null}isValidSegDownEl(e){return!this.props.eventDrag&&!this.props.eventResize&&!n(e,".fc-event-mirror")}isValidDateDownEl(e){return!(n(e,".fc-event:not(.fc-bg-event)")||n(e,".fc-more-link")||n(e,"a[data-navlink]")||n(e,".fc-popover"))}}function mr(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}class vr{constructor(e){this.props=e,this.nowDate=mr(e.nowInput,e.dateEnv),this.initHiddenDays()}buildPrev(e,t,n){let{dateEnv:r}=this.props,i=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,-1,n)}buildNext(e,t,n){let{dateEnv:r}=this.props,i=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,1,n)}build(e,t,n=!0){let r,i,o,s,a,l,{props:c}=this;var u,d;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(u=e,e=null!=(d=r).start&&u=d.end?new Date(d.end.valueOf()-1):u),i=this.buildCurrentRangeInfo(e,t),o=/^(year|month|week|day)$/.test(i.unit),s=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,o),s=this.trimHiddenDays(s),a=s,c.showNonCurrentDates||(a=mt(a,i.range)),a=this.adjustActiveRange(a),a=mt(a,r),l=At(i.range,r),{validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:o,activeRange:a,renderRange:s,slotMinTime:c.slotMinTime,slotMaxTime:c.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(i.duration)}}buildValidRange(){let e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}}buildCurrentRangeInfo(e,t){let n,{props:r}=this,i=null,o=null,s=null;return r.duration?(i=r.duration,o=r.durationUnit,s=this.buildRangeFromDuration(e,t,i,o)):(n=this.props.dayCount)?(o="day",s=this.buildRangeFromDayCount(e,t,n)):(s=this.buildCustomVisibleRange(e))?o=r.dateEnv.greatestWholeUnit(s.start,s.end).unit:(i=this.getFallbackDuration(),o=I(i).unit,s=this.buildRangeFromDuration(e,t,i,o)),{duration:i,unit:o,range:s}}getFallbackDuration(){return k({day:1})}adjustActiveRange(e){let{dateEnv:t,usesMinMaxTime:n,slotMinTime:r,slotMaxTime:i}=this.props,{start:o,end:s}=e;return n&&(x(r)<0&&(o=$(o),o=t.add(o,r)),x(i)>1&&(s=$(s),s=Q(s,-1),s=t.add(s,i))),{start:o,end:s}}buildRangeFromDuration(e,t,n,r){let i,o,s,{dateEnv:a,dateAlignment:l}=this.props;if(!l){let{dateIncrement:e}=this.props;l=e&&O(e)Or(e,t))}function Or(e,t){let n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),qe(n)}function Ir(e){let{eventRange:t}=e,n=t.def,r=t.instance?t.instance.range:t.range,i=r.start?r.start.valueOf():0,o=r.end?r.end.valueOf():0;return Object.assign(Object.assign(Object.assign({},n.extendedProps),n),{id:n.publicId,start:i,end:o,duration:o-i,allDay:Number(n.allDay),_seg:e})}function Mr(e,t){let{pluginHooks:n}=t,r=n.isDraggableTransformers,{def:i,ui:o}=e.eventRange,s=o.startEditable;for(let e of r)s=e(s,i,o,t);return s}function Nr(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function Br(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function Hr(e,t,n,r,i,o,s){let{dateEnv:a,options:l}=n,{displayEventTime:c,displayEventEnd:u}=l,d=e.eventRange.def,f=e.eventRange.instance;null==c&&(c=!1!==r),null==u&&(u=!1!==i);let h=f.range.start,p=f.range.end,g=o||e.start||e.eventRange.range.start,m=s||e.end||e.eventRange.range.end,v=$(h).valueOf()===$(g).valueOf(),A=$(G(p,-1)).valueOf()===$(G(m,-1)).valueOf();return c&&!d.allDay&&(v||A)?(g=v?h:g,m=A?p:m,u&&d.hasEnd?a.formatRange(g,m,t,{forcedStartTzo:o?null:f.forcedStartTzo,forcedEndTzo:s?null:f.forcedEndTzo}):a.format(g,t,{forcedTzo:o?null:f.forcedStartTzo})):""}function Pr(e){let 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,t){let{def:n,instance:r}=e.eventRange,{url:i}=n;if(i)return{href:i};let{emitter:o,options:s}=t,{eventInteractive:a}=s;return null==a&&(a=n.interactive,null==a&&(a=Boolean(o.hasHandlers("eventClick")))),a?g(e=>{o.trigger("eventClick",{el:e.target,event:new wr(t,n,r),jsEvent:e,view:t.viewApi})}):{}}const jr={start:Be,end:Be,allDay:Boolean};function zr(e,t,n){let r=function(e,t){let{refined:n,extra:r}=Ne(e,jr),i=n.start?t.createMarkerMeta(n.start):null,o=n.end?t.createMarkerMeta(n.end):null,{allDay:s}=n;null==s&&(s=i&&i.isTimeUnspecified&&(!o||o.isTimeUnspecified));return Object.assign({range:{start:i?i.marker:null,end:o?o.marker:null},allDay:s},r)}(e,t),{range:i}=r;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function Lr(e,t,n){return Object.assign(Object.assign({},Fr(e,t,n)),{timeZone:t.timeZone})}function Fr(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})}}let Vr={};var Wr,Qr;Wr="gregory",Qr=class{getMarkerYear(e){return e.getUTCFullYear()}getMarkerMonth(e){return e.getUTCMonth()}getMarkerDay(e){return e.getUTCDate()}arrayToMarker(e){return re(e)}markerToArray(e){return ne(e)}},Vr[Wr]=Qr;const Gr=/^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function Zr(e){let t=Gr.exec(e);if(t){let e=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]?1e3*Number("0."+t[12]):0));if(ie(e)){let n=null;return t[13]&&(n=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:e,isTimeUnspecified:!t[6],timeZoneOffset:n}}}return null}class Yr{constructor(e){let t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new Vr[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.weekTextLong=(null!=e.weekTextLong?e.weekTextLong:e.locale.options.weekTextLong)||this.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}createMarker(e){let t=this.createMarkerMeta(e);return null===t?null:t.marker}createNowMarker(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):re(ee(new Date))}createMarkerMeta(e){if("string"==typeof e)return this.parse(e);let t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=re(e)),null!==t&&ie(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null}parse(e){let t=Zr(e);if(null===t)return null;let{marker:n}=t,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}}getYear(e){return this.calendarSystem.getMarkerYear(e)}getMonth(e){return this.calendarSystem.getMarkerMonth(e)}add(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)}subtract(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)}addYears(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)}addMonths(e,t){let n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)}diffWholeYears(e,t){let{calendarSystem:n}=this;return oe(e)===oe(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null}diffWholeMonths(e,t){let{calendarSystem:n}=this;return oe(e)===oe(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null}greatestWholeUnit(e,t){let n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:(n=this.diffWholeMonths(e,t),null!==n?{unit:"month",value:n}:(n=q(e,t),null!==n?{unit:"week",value:n}:(n=J(e,t),null!==n?{unit:"day",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t),C(n)?{unit:"hour",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t),C(n)?{unit:"minute",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t),C(n)?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}))))))}countDurationsBetween(e,t,n){let r;return n.years&&(r=this.diffWholeYears(e,t),null!==r)?r/(x(n)/365):n.months&&(r=this.diffWholeMonths(e,t),null!==r)?r/function(e){return x(e)/30}(n):n.days&&(r=J(e,t),null!==r)?r/x(n):(t.valueOf()-e.valueOf())/O(n)}startOf(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?$(e):"hour"===t?function(e){return re([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return re([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return re([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):null}startOfYear(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])}startOfMonth(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])}startOfWeek(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])}computeWeekNumber(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){let r=e.getUTCFullYear(),i=X(e,r,t,n);if(i<1)return X(e,r-1,t,n);let o=X(e,r+1,t,n);return o>=1?Math.min(i,o):i}(e,this.weekDow,this.weekDoy)}format(e,t,n={}){return t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)}formatRange(e,t,n,r={}){return r.isEndExclusive&&(t=G(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)}formatIso(e,t={}){let n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),se(e,n,t.omitTime)}timestampToMarker(e){return"local"===this.timeZone?re(ee(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?re(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)}offsetForMarker(e){return"local"===this.timeZone?-te(ne(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(ne(e)):null}toDate(e,t){return"local"===this.timeZone?te(ne(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(ne(e))*60):new Date(e.valueOf()-(t||0))}}function qr(e){return e.span.end}function Jr(e){return e.index+":"+e.span.start}function $r(e,t){let n=Math.max(e.start,t.start),r=Math.min(e.end,t.end);return nn(e[i-1]))return[i,0];for(;rs))return[o,1];r=o+1}}return[r,0]}class ei{constructor(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}destroy(){}}const ti={};const ni={startTime:k,duration:k,create:Boolean,sourceId:String};class ri extends hr{constructor(){super(...arguments),this.state={forPrint:!1},this.handleBeforePrint=()=>{this.setState({forPrint:!0})},this.handleAfterPrint=()=>{this.setState({forPrint:!1})}}render(){let{props:e}=this,{options:t}=e,{forPrint:n}=this.state,r=n||"auto"===t.height||"auto"===t.contentHeight,i=r||null==t.height?"":t.height,o=["fc",n?"fc-media-print":"fc-media-screen","fc-direction-"+t.direction,e.theme.getClass("root")];return dt()||o.push("fc-liquid-hack"),e.children(o,i,r,n)}componentDidMount(){let{emitter:e}=this.props;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)}componentWillUnmount(){let{emitter:e}=this.props;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)}}function ii(e,t){return we(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}const oi="fc-col-header-cell";function si(e){return e.text}class ai extends hr{constructor(){super(...arguments),this.id=v(),this.currentDomNodes=[],this.queuedDomNodes=[],this.handleEl=e=>{this.props.elRef&&pr(this.props.elRef,e)}}render(){const{props:e,context:t}=this,{options:n}=t,{generator:r,renderProps:i}=e,o=ci(e);let s,a=[];if(li(e.generatorName,n))n.customRenderingReplacesEl&&delete o.elRef;else{const e="function"==typeof r?r(i,Jt):r;"string"==typeof e||Lt(e)||Array.isArray(e)?s=e:"object"==typeof e&&("html"in e?o.dangerouslySetInnerHTML={__html:e.html}:"domNodes"in e&&(a=Array.prototype.slice.call(e.domNodes)))}return this.queuedDomNodes=a,Jt(e.elTag,o,s)}componentDidMount(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentDidUpdate(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentWillUnmount(){this.triggerCustomRendering(!1)}triggerCustomRendering(e){const{props:t,context:n}=this,{handleCustomRendering:r,customRenderingMetaMap:i}=n.options;if(r){const n=null==i?void 0:i[t.generatorName];n&&r(Object.assign({id:this.id,isActive:e,containerEl:this.base,reportNewContainerEl:this.handleEl,generatorMeta:n},t))}}applyQueueudDomNodes(){const{queuedDomNodes:e,currentDomNodes:n}=this,r=this.base;if(!ce(e,n)){n.forEach(t);for(let t of e)r.appendChild(t);this.currentDomNodes=e}}}function li(e,t){var n;return Boolean(t.handleCustomRendering&&e&&(null===(n=t.customRenderingMetaMap)||void 0===n?void 0:n[e]))}function ci(e,t){const n=Object.assign(Object.assign({},e.elAttrs),{ref:e.elRef});return(e.elClasses||t)&&(n.className=(e.elClasses||[]).concat(t||[]).concat(n.className||[]).filter(Boolean).join(" ")),e.elStyle&&(n.style=e.elStyle),n}ai.addPropsEquality({elClasses:ce,elStyle:j,elAttrs:j,renderProps:j});const ui=ar(0);class di extends en{constructor(){super(...arguments),this.InnerContent=fi.bind(void 0,this)}render(){const{props:e}=this,t=function(e,t){const n="function"==typeof e?e(t):e||[];return"string"==typeof n?[n]:n}(e.classNameGenerator,e.renderProps);if(e.children){const n=ci(e,t),r=e.children(this.InnerContent,e.renderProps,n);return e.elTag?Jt(e.elTag,n,r):r}return Jt(ai,Object.assign(Object.assign({},e),{elTag:e.elTag||"div",elClasses:(e.elClasses||[]).concat(t),renderId:this.context}))}componentDidMount(){var e,t;null===(t=(e=this.props).didMount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.base}))}componentWillUnmount(){var e,t;null===(t=(e=this.props).willUnmount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.base}))}}function fi(e,t){const n=e.props;return Jt(ai,Object.assign({renderProps:n.renderProps,generatorName:n.generatorName,generator:n.generator,renderId:e.context},t))}di.contextType=ui;class hi extends hr{render(){let{dateEnv:e,options:t,theme:n,viewApi:r}=this.context,{props:i}=this,{date:o,dateProfile:s}=i,a=_t(o,i.todayRange,null,s),l=[oi].concat(Et(a,n)),c=e.format(o,i.dayHeaderFormat),u=!a.isDisabled&&i.colCnt>1?wt(this.context,o):{},d=Object.assign(Object.assign(Object.assign({date:e.toDate(o),view:r},i.extraRenderProps),{text:c}),a);return Jt(di,{elTag:"th",elClasses:l,elAttrs:Object.assign({role:"columnheader",colSpan:i.colSpan,"data-date":a.isDisabled?void 0:ae(o)},i.extraDataAttrs),renderProps:d,generatorName:"dayHeaderContent",generator:t.dayHeaderContent||si,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount},e=>Jt("div",{className:"fc-scrollgrid-sync-inner"},!a.isDisabled&&Jt(e,{elTag:"a",elAttrs:u,elClasses:["fc-col-header-cell-cushion",i.isSticky&&"fc-sticky"]})))}}const pi=we({weekday:"long"});class gi extends hr{render(){let{props:e}=this,{dateEnv:t,theme:n,viewApi:r,options:i}=this.context,o=Q(new Date(2592e5),e.dow),s={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},a=t.format(o,e.dayHeaderFormat),l=Object.assign(Object.assign(Object.assign(Object.assign({date:o},s),{view:r}),e.extraRenderProps),{text:a});return Jt(di,{elTag:"th",elClasses:[oi,...Et(s,n),...e.extraClassNames||[]],elAttrs:Object.assign({role:"columnheader",colSpan:e.colSpan},e.extraDataAttrs),renderProps:l,generatorName:"dayHeaderContent",generator:i.dayHeaderContent||si,classNameGenerator:i.dayHeaderClassNames,didMount:i.dayHeaderDidMount,willUnmount:i.dayHeaderWillUnmount},n=>Jt("div",{className:"fc-scrollgrid-sync-inner"},Jt(n,{elTag:"a",elClasses:["fc-col-header-cell-cushion",e.isSticky&&"fc-sticky"],elAttrs:{"aria-label":t.format(o,pi)}})))}}class mi extends en{constructor(e,t){super(e,t),this.initialNowDate=mr(t.options.now,t.dateEnv),this.initialNowQueriedMs=(new Date).valueOf(),this.state=this.computeTiming().currentState}render(){let{props:e,state:t}=this;return e.children(t.nowDate,t.todayRange)}componentDidMount(){this.setTimeout()}componentDidUpdate(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())}componentWillUnmount(){this.clearTimeout()}computeTiming(){let{props:e,context:t}=this,n=G(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),i=t.dateEnv.add(r,k(1,e.unit)),o=i.valueOf()-n.valueOf();return o=Math.min(864e5,o),{currentState:{nowDate:r,todayRange:vi(r)},nextState:{nowDate:i,todayRange:vi(i)},waitMs:o}}setTimeout(){let{nextState:e,waitMs:t}=this.computeTiming();this.timeoutId=setTimeout(()=>{this.setState(e,()=>{this.setTimeout()})},t)}clearTimeout(){this.timeoutId&&clearTimeout(this.timeoutId)}}function vi(e){let t=$(e);return{start:t,end:Q(t,1)}}mi.contextType=ur;function Ai(e,t,n){return e||ii(t,n)}function bi(e,t){let n=e.activeRange;return t?n:{start:G(n.start,e.slotMinTime.milliseconds),end:G(n.end,e.slotMaxTime.milliseconds-864e5)}}function yi(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,o){if(t&&n===t.latestFetchId){let n=je(function(e,t,n){let r=n.options.eventDataTransform,i=t?t.eventDataTransform:null;i&&(e=_i(e,i));r&&(e=_i(e,r));return e}(i,t,o),t,o);return r&&(n=Pe(n,r,o)),Ve(Ei(e,t.sourceId),n)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=Pe(t,n,r));return Ve(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return Ve(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?Pe(e,r.activeRange,i):e;case"REMOVE_EVENTS":return function(e,t){let{defs:n,instances:r}=e,i={},o={};for(let e in n)t.defs[e]||(i[e]=n[e]);for(let e in r)!t.instances[e]&&i[r[e].defId]&&(o[e]=r[e]);return{defs:i,instances:o}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return Ei(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return We(e,e=>!e.sourceId);case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function _i(e,t){let n;if(t){n=[];for(let r of e){let e=t(r);e?n.push(e):null==e&&n.push(r)}}else n=e;return n}function Ei(e,t){return We(e,e=>e.sourceId!==t)}function Di(e,t){let n=t.getCurrentData(),r=Object.assign({businessHours:n.businessHours,dateSelection:"",eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginHooks.isPropsValid||Ci)(r,t)}function Ci(e,t,n={},r){return!(e.eventDrag&&!function(e,t,n,r){let i=t.getCurrentData(),o=e.eventDrag,s=o.mutatedEvents,a=s.defs,l=s.instances,c=xr(a,o.isEvent?e.eventUiBases:{"":i.selectionConfig});r&&(c=H(c,r));let u=(p=e.eventStore,g=o.affectedEvents.instances,{defs:p.defs,instances:B(p.instances,e=>!g[e.instanceId])}),d=u.defs,f=u.instances,h=xr(d,e.eventUiBases);var p,g;for(let r in l){let s=l[r],p=s.range,g=c[s.defId],m=a[s.defId];if(!wi(g.constraints,p,u,e.businessHours,t))return!1;let{eventOverlap:v}=t.options,A="function"==typeof v?v:null;for(let e in f){let n=f[e];if(At(p,n.range)){if(!1===h[n.defId].overlap&&o.isEvent)return!1;if(!1===g.overlap)return!1;if(A&&!A(new wr(t,d[n.defId],n),new wr(t,m,s)))return!1}}let b=i.eventStore;for(let e of g.allows){let i,o=Object.assign(Object.assign({},n),{range:s.range,allDay:m.allDay}),a=b.defs[m.defId],l=b.instances[r];if(i=a?new wr(t,a,l):new wr(t,m),!e(br(o,t),i))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){let i=e.eventStore,o=i.defs,s=i.instances,a=e.dateSelection,l=a.range,{selectionConfig:c}=t.getCurrentData();r&&(c=r(c));if(!wi(c.constraints,l,i,e.businessHours,t))return!1;let{selectOverlap:u}=t.options,d="function"==typeof u?u:null;for(let e in s){let n=s[e];if(At(l,n.range)){if(!1===c.overlap)return!1;if(d&&!d(new wr(t,o[n.defId],n),null))return!1}}for(let e of c.allows){let r=Object.assign(Object.assign({},n),a);if(!e(br(r,t),null))return!1}return!0}(e,t,n,r))}function wi(e,t,n,r,i){for(let o of e)if(!ki(Si(o,t,n,r,i),t))return!1;return!0}function Si(e,t,n,r,i){return"businessHours"===e?Ti(Pe(r,t,i)):"string"==typeof e?Ti(We(n,t=>t.groupId===e)):"object"==typeof e&&e?Ti(Pe(e,t,i)):[]}function Ti(e){let{instances:t}=e,n=[];for(let e in t)n.push(t[e].range);return n}function ki(e,t){for(let n of e)if(bt(n,t))return!0;return!1}class Ri extends Error{constructor(e,t){super(e),this.response=t}}function xi(e,t,n){const r={method:e=e.toUpperCase()};return"GET"===e?t+=(-1===t.indexOf("?")?"?":"&")+new URLSearchParams(n):(r.body=new URLSearchParams(n),r.headers={"Content-Type":"application/x-www-form-urlencoded"}),fetch(t,r).then(e=>{if(e.ok)return e.json().then(t=>[t,e],()=>{throw new Ri("Failure parsing JSON",e)});throw new Ri("Request failed",e)})}class Oi{constructor(e){this.drainedOption=e,this.isRunning=!1,this.isDirty=!1,this.pauseDepths={},this.timeoutId=0}request(e){this.isDirty=!0,this.isPaused()||(this.clearTimeout(),null==e?this.tryDrain():this.timeoutId=setTimeout(this.tryDrain.bind(this),e))}pause(e=""){let{pauseDepths:t}=this;t[e]=(t[e]||0)+1,this.clearTimeout()}resume(e="",t){let{pauseDepths:n}=this;if(e in n){if(t)delete n[e];else{n[e]-=1,n[e]<=0&&delete n[e]}this.tryDrain()}}isPaused(){return Object.keys(this.pauseDepths).length}tryDrain(){if(!this.isRunning&&!this.isPaused()){for(this.isRunning=!0;this.isDirty;)this.isDirty=!1,this.drained();this.isRunning=!1}}clear(){this.clearTimeout(),this.isDirty=!1,this.pauseDepths={}}clearTimeout(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=0)}drained(){this.drainedOption&&this.drainedOption()}}const Ii=/^(visible|hidden)$/;class Mi extends hr{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,pr(this.props.elRef,e)}}render(){let{props:e}=this,{liquid:t,liquidIsAbsolute:n}=e,r=t&&n,i=["fc-scroller"];return t&&(n?i.push("fc-scroller-liquid-absolute"):i.push("fc-scroller-liquid")),Jt("div",{ref:this.handleEl,className:i.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:r&&-(e.overcomeLeft||0)||"",right:r&&-(e.overcomeRight||0)||"",bottom:r&&-(e.overcomeBottom||0)||"",marginLeft:!r&&-(e.overcomeLeft||0)||"",marginRight:!r&&-(e.overcomeRight||0)||"",marginBottom:!r&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)}needsXScrolling(){if(Ii.test(this.props.overflowX))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0}return!1}needsYScrolling(){if(Ii.test(this.props.overflowY))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0}return!1}getXScrollbarWidth(){return Ii.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight}getYScrollbarWidth(){return Ii.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth}}class Ni{constructor(e){this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=(e,t)=>{let{depths:n,currentMap:r}=this,i=!1,o=!1;null!==e?(i=t in r,r[t]=e,n[t]=(n[t]||0)+1,o=!0):(n[t]-=1,n[t]||(delete r[t],delete this.callbackMap[t],i=!0)),this.masterCallback&&(i&&this.masterCallback(null,String(t)),o&&this.masterCallback(e,String(t)))}}createRef(e){let t=this.callbackMap[e];return t||(t=this.callbackMap[e]=t=>{this.handleValue(t,String(e))}),t}collect(e,t,n){return V(this.currentMap,e,t,n)}getAll(){return U(this.currentMap)}}function Bi(e){let t=i(e,".fc-scrollgrid-shrink"),n=0;for(let e of t)n=Math.max(n,w(e));return Math.ceil(n)}function Hi(e,t){return e.liquid&&t.liquid}function Pi(e,t){return null!=t.maxHeight||Hi(e,t)}function Ui(e,t,n,r){let{expandRows:i}=n;return"function"==typeof t.content?t.content(n):Jt("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:i?n.clientHeight:""}},n.tableColGroupNode,Jt(r?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function ji(e,t){return ce(e,t,j)}function zi(e,t){let n=[];for(let r of e){let e=r.span||1;for(let i=0;ie,ji),this.renderMicroColGroup=ue(zi),this.scrollerRefs=new Ni,this.scrollerElRefs=new Ni(this._handleScrollerEl.bind(this)),this.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},this.handleSizing=()=>{this.safeSetState(Object.assign({shrinkWidth:this.computeShrinkWidth()},this.computeScrollerDims()))}}render(){let{props:e,state:t,context:n}=this,r=e.sections||[],i=this.processCols(e.cols),o=this.renderMicroColGroup(i,t.shrinkWidth),s=Vi(e.liquid,n);e.collapsibleWidth&&s.push("fc-scrollgrid-collapsible");let a,l=r.length,c=0,u=[],d=[],f=[];for(;c{}},r);return Jt(r?"th":"td",{ref:n.elRef,role:"presentation"},Jt("div",{className:"fc-scroller-harness"+(c?" fc-scroller-harness-liquid":"")},Jt(Mi,{ref:this.scrollerRefs.createRef(d),elRef:this.scrollerElRefs.createRef(d),overflowY:u,overflowX:i.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:c,liquidIsAbsolute:!0},f)))}_handleScrollerEl(e,t){let n=function(e,t){for(let n of e)if(n.key===t)return n;return null}(this.props.sections,t);n&&pr(n.chunk.scrollerElRef,e)}componentDidMount(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)}componentDidUpdate(){this.handleSizing()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}computeShrinkWidth(){return Fi(this.props.cols)?Bi(this.scrollerElRefs.getAll()):0}computeScrollerDims(){let e=Rt(),{scrollerRefs:t,scrollerElRefs:n}=this,r=!1,i={},o={};for(let e in t.currentMap){let n=t.currentMap[e];if(n&&n.needsYScrolling()){r=!0;break}}for(let t of this.props.sections){let s=t.key,a=n.currentMap[s];if(a){let t=a.parentNode;i[s]=Math.floor(t.getBoundingClientRect().width-(r?e.y:0)),o[s]=Math.floor(t.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:i,scrollerClientHeights:o}}}Qi.addStateEquality({scrollerClientWidths:j,scrollerClientHeights:j});class Gi extends hr{constructor(){super(...arguments),this.handleEl=e=>{e&&function(e,t){e.fcSeg=t}(e,this.props.seg)}}render(){const{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{eventRange:i}=r,{ui:o}=i,s={event:new wr(t,i.def,i.instance),view:t.viewApi,timeText:e.timeText,textColor:o.textColor,backgroundColor:o.backgroundColor,borderColor:o.borderColor,isDraggable:!e.disableDragging&&Mr(r,t),isStartResizable:!e.disableResizing&&Nr(r,t),isEndResizable:!e.disableResizing&&Br(r),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(r.isStart),isEnd:Boolean(r.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)};return Jt(di,Object.assign({},e,{elRef:this.handleEl,elClasses:[...Pr(s),...r.eventRange.ui.classNames,...e.elClasses||[]],renderProps:s,generatorName:"eventContent",generator:n.eventContent||e.defaultGenerator,classNameGenerator:n.eventClassNames,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount}))}}function Zi(e){return Jt("div",{className:"fc-event-main-frame"},e.timeText&&Jt("div",{className:"fc-event-time"},e.timeText),Jt("div",{className:"fc-event-title-container"},Jt("div",{className:"fc-event-title fc-sticky"},e.event.title||Jt(Kt,null," "))))}const Yi=we({day:"numeric"});class qi extends hr{constructor(){super(...arguments),this.refineRenderProps=de($i)}render(){let{props:e,context:t}=this,{options:n}=t,r=this.refineRenderProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraRenderProps:e.extraRenderProps,viewApi:t.viewApi,dateEnv:t.dateEnv});return Jt(di,Object.assign({},e,{elClasses:[...Et(r,t.theme),...e.elClasses||[]],elAttrs:Object.assign(Object.assign({},e.elAttrs),r.isDisabled?{}:{"data-date":ae(e.date)}),renderProps:r,generatorName:"dayCellContent",generator:n.dayCellContent||e.defaultGenerator,classNameGenerator:r.isDisabled?void 0:n.dayCellClassNames,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount}))}}function Ji(e){return Boolean(e.dayCellContent||li("dayCellContent",e))}function $i(e){let{date:t,dateEnv:n}=e,r=_t(t,e.todayRange,null,e.dateProfile);return Object.assign(Object.assign(Object.assign({date:n.toDate(t),view:e.viewApi},r),{dayNumberText:e.showDayNumber?n.format(t,Yi):""}),e.extraRenderProps)}function Xi(e){let{title:t}=e.event;return t&&Jt("div",{className:"fc-event-title"},e.event.title)}function Ki(e){return e.text}class eo extends hr{constructor(){super(...arguments),this.state={titleId:u()},this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&pr(this.props.elRef,e)},this.handleDocumentMouseDown=e=>{const t=l(e);this.rootEl.contains(t)||this.handleCloseClick()},this.handleDocumentKeyDown=e=>{"Escape"===e.key&&this.handleCloseClick()},this.handleCloseClick=()=>{let{onClose:e}=this.props;e&&e()}}render(){let{theme:e,options:t}=this.context,{props:n,state:r}=this,i=["fc-popover",e.getClass("popover")].concat(n.extraClassNames||[]);return Zn(Jt("div",Object.assign({},n.extraAttrs,{id:n.id,className:i.join(" "),"aria-labelledby":r.titleId,ref:this.handleRootEl}),Jt("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},Jt("span",{className:"fc-popover-title",id:r.titleId},n.title),Jt("span",{className:"fc-popover-close "+e.getIconClass("close"),title:t.closeHint,onClick:this.handleCloseClick})),Jt("div",{className:"fc-popover-body "+e.getClass("popoverContent")},n.children)),n.parentEl)}componentDidMount(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()}componentWillUnmount(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)}updateSize(){let{isRtl:e}=this.context,{alignmentEl:t,alignGridTop:r}=this.props,{rootEl:i}=this,o=function(e){let t=Mt(e),n=e.getBoundingClientRect();for(let e of t){let t=ct(n,e.getBoundingClientRect());if(!t)return null;n=t}return n}(t);if(o){let a=i.getBoundingClientRect(),l=r?n(t,".fc-scrollgrid").getBoundingClientRect().top:o.top,c=e?o.right-a.width:o.left;l=Math.max(l,10),c=Math.min(c,document.documentElement.clientWidth-10-a.width),c=Math.max(c,10);let u=i.offsetParent.getBoundingClientRect();s(i,{top:l-u.top,left:c-u.left})}}}class to extends gr{constructor(){super(...arguments),this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,useEventCenter:!1}):this.context.unregisterInteractiveComponent(this)}}render(){let{options:e,dateEnv:t}=this.context,{props:n}=this,{startDate:r,todayRange:i,dateProfile:o}=n,s=t.format(r,e.dayPopoverFormat);return Jt(qi,{elRef:this.handleRootEl,date:r,dateProfile:o,todayRange:i},(t,r,i)=>Jt(eo,{elRef:i.ref,id:n.id,title:s,extraClassNames:["fc-more-popover"].concat(i.className||[]),extraAttrs:i,parentEl:n.parentEl,alignmentEl:n.alignmentEl,alignGridTop:n.alignGridTop,onClose:n.onClose},Ji(e)&&Jt(t,{elTag:"div",elClasses:["fc-more-popover-misc"]}),n.children))}queryHit(e,t,n,r){let{rootEl:i,props:o}=this;return e>=0&&e=0&&tt.eventRange.range.end?e:t}function ao(e){return[`fc-${e.type}-view`,"fc-view"]}function lo(e){if(!e||"undefined"==typeof document)return;const t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}const co={id:String,defaultAllDay:Boolean,url:String,format:String,events:Be,eventDataTransform:Be,success:Be,failure:Be};function uo(e,t,n=fo(t)){let r;if("string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){let{refined:i,extra:o}=Ne(r,n),s=function(e,t){let n=t.pluginHooks.eventSourceDefs;for(let t=n.length-1;t>=0;t-=1){let r=n[t].parseMeta(e);if(r)return{sourceDefId:t,meta:r}}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:v(),sourceDefId:s.sourceDefId,meta:s.meta,ui:Ye(i,t),extendedProps:o}}return null}function fo(e){return Object.assign(Object.assign(Object.assign({},Ge),co),e.pluginHooks.eventSourceRefiners)}class ho{getCurrentData(){return this.currentDataManager.getCurrentData()}dispatch(e){this.currentDataManager.dispatch(e)}get view(){return this.getCurrentData().viewApi}batchRendering(e){e()}updateSize(){this.trigger("_resize",!0)}setOption(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})}getOption(e){return this.currentDataManager.currentCalendarOptionsInput[e]}getAvailableLocaleCodes(){return Object.keys(this.getCurrentData().availableRawLocales)}on(e,t){let{currentDataManager:n}=this;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn(`Unknown listener name '${e}'`)}off(e,t){this.currentDataManager.emitter.off(e,t)}trigger(e,...t){this.currentDataManager.emitter.trigger(e,...t)}changeView(e,t){this.batchRendering(()=>{if(this.unselect(),t)if(t.start&&t.end)this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),this.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{let{dateEnv:n}=this.getCurrentData();this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:n.createMarker(t)})}else this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})})}zoomTo(e,t){let n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})}getUnitViewSpec(e){let t,n,{viewSpecs:r,toolbarConfig:i}=this.getCurrentData(),o=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(let e in r)o.push(e);for(t=0;t{this.dispatch({type:"REMOVE_EVENTS",eventStore:Sr(e)})}})}getEventById(e){let t=this.getCurrentData(),{defs:n,instances:r}=t.eventStore;e=String(e);for(let i in n){let o=n[i];if(o.publicId===e){if(o.recurringDef)return new wr(t,o,null);for(let e in r){let n=r[e];if(n.defId===o.defId)return new wr(t,o,n)}}}return null}getEvents(){let e=this.getCurrentData();return Tr(e.eventStore,e)}removeAllEvents(){this.dispatch({type:"REMOVE_ALL_EVENTS"})}getEventSources(){let e=this.getCurrentData(),t=e.eventSources,n=[];for(let r in t)n.push(new Cr(e,t[r]));return n}getEventSourceById(e){let t=this.getCurrentData(),n=t.eventSources;e=String(e);for(let r in n)if(n[r].publicId===e)return new Cr(t,n[r]);return null}addEventSource(e){let t=this.getCurrentData();if(e instanceof Cr)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;let n=uo(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new Cr(t,n)):null}removeAllEventSources(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})}refetchEvents(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})}scrollToTime(e){let t=k(e);t&&this.trigger("_scrollRequest",{time:t})}}var po={__proto__:null,BASE_OPTION_DEFAULTS:Te,identity:Be,refineProps:Ne,createEventInstance:He,parseEventDef:rt,refineEventDef:tt,parseBusinessHours:ot,padStart:E,isInt:C,parseFieldSpecs:A,compareByFieldSpecs:b,flexibleCompare:_,preventSelection:function(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",d)},allowSelection:function(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",d)},preventContextMenu:function(e){e.addEventListener("contextmenu",d)},allowContextMenu:function(e){e.removeEventListener("contextmenu",d)},compareNumbers:function(e,t){return e-t},enableCursor:function(){document.body.classList.remove("fc-not-allowed")},disableCursor:function(){document.body.classList.add("fc-not-allowed")},guid:v,computeVisibleDayRange:at,isMultiDayRange:function(e){let t=at(e);return Z(t.start,t.end)>1},diffDates:lt,removeExact:function(e,t){let n=0,r=0;for(;r{let s=r.length,a=o.length,l=0;for(;l{let s={};for(let a in o)if(i[a])if(ce(r[a],o[a]))s[a]=i[a];else{n&&n(i[a]);let r=e.apply(this,o[a]);s[a]=t&&t(r,i[a])?i[a]:r}else s[a]=e.apply(this,o[a]);return r=o,i=s,s}},intersectRects:ct,pointInsideRect:function(e,t){return e.left>=t.left&&e.left=t.top&&e.topthis.eventUiBuilders[t]||ue(ht));for(let n in t){let c=t[n],u=o[n]||ft,d=this.eventUiBuilders[n];l[n]={businessHours:c.businessHours||e.businessHours,dateSelection:r[n]||null,eventStore:u,eventUiBases:d(e.eventUiBases[""],c.ui,i[n]),eventSelection:u.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[n]||null,eventResize:a[n]||null}}return l}_splitDateSpan(e){let t={};if(e){let n=this.getKeysForDateSpan(e);for(let r of n)t[r]=e}return t}_getKeysForEventDefs(e){return H(e.defs,e=>this.getKeysForEventDef(e))}_splitEventStore(e,t){let{defs:n,instances:r}=e,i={};for(let e in n)for(let r of t[e])i[r]||(i[r]={defs:{},instances:{}}),i[r].defs[e]=n[e];for(let e in r){let n=r[e];for(let r of t[n.defId])i[r]&&(i[r].instances[e]=n)}return i}_splitIndividualUi(e,t){let n={};for(let r in e)if(r)for(let i of t[r])n[i]||(n[i]={}),n[i][r]=e[r];return n}_splitInteraction(e){let t={};if(e){let n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),o=r=>{t[r]||(t[r]={affectedEvents:n[r]||ft,mutatedEvents:i[r]||ft,isEvent:e.isEvent})};for(let e in n)o(e);for(let e in i)o(e)}return t}},getDayClassNames:Et,getDateMeta:_t,getSlotClassNames:function(e,t){let n=["fc-slot","fc-slot-"+W[e.dow]];return e.isDisabled?n.push("fc-slot-disabled"):(e.isToday&&(n.push("fc-slot-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-slot-past"),e.isFuture&&n.push("fc-slot-future")),n},buildNavLinkAttrs:wt,preventDefault:d,whenTransitionDone:function(e,t){let n=r=>{t(r),h.forEach(t=>{e.removeEventListener(t,n)})};h.forEach(t=>{e.addEventListener(t,n)})},computeInnerRect:function(e,t=!1,n){let r=n?e.getBoundingClientRect():It(e),i=Ot(e,t),o={left:r.left+i.borderLeft+i.scrollbarLeft,right:r.right-i.borderRight-i.scrollbarRight,top:r.top+i.borderTop,bottom:r.bottom-i.borderBottom-i.scrollbarBottom};return t&&(o.left+=i.paddingLeft,o.right-=i.paddingRight,o.top+=i.paddingTop,o.bottom-=i.paddingBottom),o},computeEdges:Ot,getClippingParents:Mt,computeRect:It,unpromisify:Nt,Emitter:Bt,rangeContainsMarker:yt,intersectRanges:mt,rangesEqual:vt,rangesIntersect:At,rangeContainsRange:bt,PositionCache:class{constructor(e,t,n,r){this.els=t;let i=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(i.left),r&&this.buildElVerticals(i.top)}buildElHorizontals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n}buildElVerticals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n}leftToIndex(e){let t,{lefts:n,rights:r}=this,i=n.length;for(t=0;t=n[t]&&e=n[t]&&es.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.end,end:o.end}},i)),r?(n.push({index:e.index,thickness:e.thickness,span:$r(s,o)},...i),r):(n.push(e),0)}insertEntryAt(e,t){let{entriesByLevel:n,levelCoords:r}=this;-1===t.lateral?(Xr(r,t.level,t.levelCoord),Xr(n,t.level,[e])):Xr(n[t.level],t.lateral,e),this.stackCnts[Jr(e)]=t.stackCnt}findInsertion(e){let{levelCoords:t,entriesByLevel:n,strictOrder:r,stackCnts:i}=this,o=t.length,s=0,a=-1,l=-1,c=null,u=0;for(let d=0;d=s+e.thickness)break;let f,h=n[d],p=Kr(h,e.span.start,qr),g=p[0]+p[1];for(;(f=h[g])&&f.span.starts&&(s=e,c=f,a=d,l=g),e===s&&(u=Math.max(u,i[Jr(f)]+1)),g+=1}}let d=0;if(c)for(d=a+1;dJt("tr",{role:"row"},i&&i("day"),t.map(e=>r?Jt(hi,{key:e.toISOString(),date:e,dateProfile:n,todayRange:s,colCnt:t.length,dayHeaderFormat:o}):Jt(gi,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:o}))))}},computeFallbackHeaderFormat:ii,TableDateCell:hi,TableDowCell:gi,DaySeriesModel:class{constructor(e,t){let n=e.start,{end:r}=e,i=[],o=[],s=-1;for(;n=t.length?t[t.length-1]+1:t[n]}},sliceEventStore:kr,hasBgRendering:function(e){return"background"===e.ui.display||"inverse-background"===e.ui.display},getElSeg:Rr,buildSegTimeText:Hr,sortEventSegs:function(e,t){let n=e.map(Ir);return n.sort((e,n)=>b(e,n,t)),n.map(e=>e._seg)},getSegMeta:function(e,t,n){let r=e.eventRange.range;return{isPast:r.end<(n||t.start),isFuture:r.start>=(n||t.end),isToday:t&&yt(t,r.start)}},buildEventRangeKey:function(e){return e.instance?e.instance.instanceId:`${e.def.defId}:${e.range.start.toISOString()}`},getSegAnchorAttrs:Ur,DayTableModel:class{constructor(e,t){let n,r,i,{dates:o}=e;if(t){for(r=o[0].getUTCDay(),n=1;nJt(Kt,null,Jt(e,{elTag:"div",elClasses:["fc-event-main"],elStyle:{color:t.textColor}}),Boolean(t.isStartResizable)&&Jt("div",{className:"fc-event-resizer fc-event-resizer-start"}),Boolean(t.isEndResizable)&&Jt("div",{className:"fc-event-resizer fc-event-resizer-end"})))}},NowIndicatorContainer:e=>Jt(ur.Consumer,null,t=>{let{options:n}=t,r={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return Jt(di,Object.assign({},e,{elTag:e.elTag||"div",renderProps:r,generatorName:"nowIndicatorContent",generator:n.nowIndicatorContent,classNameGenerator:n.nowIndicatorClassNames,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount}))}),DayCellContainer:qi,hasCustomDayCellContent:Ji,EventContainer:Gi,renderFill:function(e){return Jt("div",{className:"fc-"+e})},BgEvent:class extends hr{render(){let{props:e}=this,{seg:t}=e;return Jt(Gi,{elTag:"div",elClasses:["fc-bg-event"],elStyle:{backgroundColor:t.eventRange.ui.backgroundColor},defaultGenerator:Xi,seg:t,timeText:"",isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,disableDragging:!0,disableResizing:!0})}},WeekNumberContainer:e=>Jt(ur.Consumer,null,t=>{let{dateEnv:n,options:r}=t,{date:i}=e,o=r.weekNumberFormat||e.defaultFormat,s={num:n.computeWeekNumber(i),text:n.format(i,o),date:i};return Jt(di,Object.assign({},e,{renderProps:s,generatorName:"weekNumberContent",generator:r.weekNumberContent||Ki,classNameGenerator:r.weekNumberClassNames,didMount:r.weekNumberDidMount,willUnmount:r.weekNumberWillUnmount}))}),MoreLinkContainer:class extends hr{constructor(){super(...arguments),this.linkElRef={current:null},this.state={isPopoverOpen:!1,popoverId:u()},this.handleClick=e=>{let{props:t,context:n}=this,{moreLinkClick:r}=n.options,i=ro(t).start;function o(e){let{def:t,instance:r,range:i}=e.eventRange;return{event:new wr(n,t,r),start:n.dateEnv.toDate(i.start),end:n.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof r&&(r=r({date:i,allDay:Boolean(t.allDayDate),allSegs:t.allSegs.map(o),hiddenSegs:t.hiddenSegs.map(o),jsEvent:e,view:n.viewApi})),r&&"popover"!==r?"string"==typeof r&&n.calendarApi.zoomTo(i,r):this.setState({isPopoverOpen:!0})},this.handlePopoverClose=()=>{this.setState({isPopoverOpen:!1})}}render(){let{props:e,state:t}=this;return Jt(ur.Consumer,null,n=>{let{viewApi:r,options:i,calendarApi:o}=n,{moreLinkText:s}=i,{moreCnt:a}=e,l=ro(e),c="function"==typeof s?s.call(o,a):`+${a} ${s}`,u=D(i.moreLinkHint,[a],c),d={num:a,shortText:"+"+a,text:c,view:r};return Jt(Kt,null,Boolean(e.moreCnt)&&Jt(di,{elTag:e.elTag||"a",elRef:this.linkElRef,elClasses:[...e.elClasses||[],"fc-more-link"],elAttrs:Object.assign(Object.assign(Object.assign({},e.elAttrs),p(this.handleClick)),{title:u,"aria-expanded":t.isPopoverOpen,"aria-controls":t.isPopoverOpen?t.popoverId:""}),renderProps:d,generatorName:"moreLinkContent",generator:i.moreLinkContent||e.defaultGenerator||no,classNameGenerator:i.moreLinkClassNames,didMount:i.moreLinkDidMount,willUnmount:i.moreLinkWillUnmount},e.children),t.isPopoverOpen&&Jt(to,{id:t.popoverId,startDate:l.start,endDate:l.end,dateProfile:e.dateProfile,todayRange:e.todayRange,extraDateSpan:e.extraDateSpan,parentEl:this.parentEl,alignmentEl:e.alignmentElRef?e.alignmentElRef.current:this.linkElRef.current,alignGridTop:e.alignGridTop,onClose:this.handlePopoverClose},e.popoverContent()))})}componentDidMount(){this.updateParentEl()}componentDidUpdate(){this.updateParentEl()}updateParentEl(){this.linkElRef.current&&(this.parentEl=n(this.linkElRef.current,".fc-view-harness"))}},computeEarliestSegStart:io,ViewContainer:class extends hr{render(){let{props:e,context:t}=this,{options:n}=t,r={view:t.viewApi};return Jt(di,Object.assign({},e,{elTag:e.elTag||"div",elClasses:[...ao(e.viewSpec),...e.elClasses||[]],renderProps:r,classNameGenerator:n.viewClassNames,generatorName:void 0,generator:void 0,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount}),()=>e.children)}},triggerDateSelect:Ar,getDefaultEventEnd:yr,injectStyles:lo,CalendarImpl:ho,EventImpl:wr,buildEventApis:Tr,buildElAttrs:ci,ContentContainer:di,CustomRenderingStore:class extends class{constructor(){this.handlers=[]}set(e){this.currentValue=e;for(let t of this.handlers)t(e)}subscribe(e){this.handlers.push(e),void 0!==this.currentValue&&e(this.currentValue)}}{constructor(){super(...arguments),this.map=new Map}handle(e){const{map:t}=this;let n=!1;e.isActive?(t.set(e.id,e),n=!0):t.has(e.id)&&(t.delete(e.id),n=!0),n&&this.set(t)}}};lo(':root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:"\\e900"}.fc-icon-chevron-right:before{content:"\\e901"}.fc-icon-chevrons-left:before{content:"\\e902"}.fc-icon-chevrons-right:before{content:"\\e903"}.fc-icon-minus-square:before{content:"\\e904"}.fc-icon-plus-square:before{content:"\\e905"}.fc-icon-x:before{content:"\\e906"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{border-style:none;padding:0}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.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:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.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:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}');const go=[],mo={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"},vo=Object.assign(Object.assign({},mo),{buttonHints:{prev:"Previous $0",next:"Next $0",today:(e,t)=>"day"===t?"Today":"This "+e},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`});function Ao(e){let t=e.length>0?e[0].code:"en",n=go.concat(e),r={en:vo};for(let e of n)r[e.code]=e;return{map:r,defaultCode:t}}function bo(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){let n=[].concat(e||[]),r=function(e,t){for(let n=0;n0;e-=1){let n=r.slice(0,e).join("-");if(t[n])return t[n]}}return null}(n,t)||vo;return yo(e,n,r)}(e,t):yo(e.code,[e.code],e)}function yo(e,t,n){let r=N([mo,n],["buttonText"]);delete r.code;let{week:i}=r;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function _o(e){return{id:v(),name:e.name,premiumReleaseDate:e.premiumReleaseDate?new Date(e.premiumReleaseDate):void 0,deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}function Eo(){let e,t=[],n=[];return(r,i)=>(e&&ce(r,t)&&ce(i,n)||(e=function(e,t){let n={},r={premiumReleaseDate:void 0,reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(let s of e){const e=s.name,a=n[e];void 0===a?(n[e]=s.id,i(s.deps),o=s,r={premiumReleaseDate:Do((t=r).premiumReleaseDate,o.premiumReleaseDate),reducers:t.reducers.concat(o.reducers),isLoadingFuncs:t.isLoadingFuncs.concat(o.isLoadingFuncs),contextInit:t.contextInit.concat(o.contextInit),eventRefiners:Object.assign(Object.assign({},t.eventRefiners),o.eventRefiners),eventDefMemberAdders:t.eventDefMemberAdders.concat(o.eventDefMemberAdders),eventSourceRefiners:Object.assign(Object.assign({},t.eventSourceRefiners),o.eventSourceRefiners),isDraggableTransformers:t.isDraggableTransformers.concat(o.isDraggableTransformers),eventDragMutationMassagers:t.eventDragMutationMassagers.concat(o.eventDragMutationMassagers),eventDefMutationAppliers:t.eventDefMutationAppliers.concat(o.eventDefMutationAppliers),dateSelectionTransformers:t.dateSelectionTransformers.concat(o.dateSelectionTransformers),datePointTransforms:t.datePointTransforms.concat(o.datePointTransforms),dateSpanTransforms:t.dateSpanTransforms.concat(o.dateSpanTransforms),views:Object.assign(Object.assign({},t.views),o.views),viewPropsTransformers:t.viewPropsTransformers.concat(o.viewPropsTransformers),isPropsValid:o.isPropsValid||t.isPropsValid,externalDefTransforms:t.externalDefTransforms.concat(o.externalDefTransforms),viewContainerAppends:t.viewContainerAppends.concat(o.viewContainerAppends),eventDropTransformers:t.eventDropTransformers.concat(o.eventDropTransformers),calendarInteractions:t.calendarInteractions.concat(o.calendarInteractions),componentInteractions:t.componentInteractions.concat(o.componentInteractions),themeClasses:Object.assign(Object.assign({},t.themeClasses),o.themeClasses),eventSourceDefs:t.eventSourceDefs.concat(o.eventSourceDefs),cmdFormatter:o.cmdFormatter||t.cmdFormatter,recurringTypes:t.recurringTypes.concat(o.recurringTypes),namedTimeZonedImpl:o.namedTimeZonedImpl||t.namedTimeZonedImpl,initialView:t.initialView||o.initialView,elementDraggingImpl:t.elementDraggingImpl||o.elementDraggingImpl,optionChangeHandlers:Object.assign(Object.assign({},t.optionChangeHandlers),o.optionChangeHandlers),scrollGridImpl:o.scrollGridImpl||t.scrollGridImpl,listenerRefiners:Object.assign(Object.assign({},t.listenerRefiners),o.listenerRefiners),optionRefiners:Object.assign(Object.assign({},t.optionRefiners),o.optionRefiners),propSetHandlers:Object.assign(Object.assign({},t.propSetHandlers),o.propSetHandlers)}):a!==s.id&&console.warn(`Duplicate plugin '${e}'`)}var t,o}return e&&i(e),i(t),r}(r,i)),t=r,n=i,e)}function Do(e,t){return void 0===e?t:void 0===t?e:new Date(Math.max(e.valueOf(),t.valueOf()))}class Co extends Pt{}function wo(e,t,n,r){if(t[e])return t[e];let i=function(e,t,n,r){let i=n[e],o=r[e],s=e=>i&&null!==i[e]?i[e]:o&&null!==o[e]?o[e]:null,a=s("component"),l=s("superType"),c=null;if(l){if(l===e)throw new Error("Can't have a custom view type that references itself");c=wo(l,t,n,r)}!a&&c&&(a=c.component);if(!a)return null;return{type:e,component:a,defaults:Object.assign(Object.assign({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:Object.assign(Object.assign({},c?c.overrides:{}),o?o.rawOptions:{})}}(e,t,n,r);return i&&(t[e]=i),i}function So(e){return H(e,To)}function To(e){let t="function"==typeof e?{component:e}:e,{component:n}=t;var r;return t.content&&(r=t,n=e=>Jt(ur.Consumer,null,t=>Jt(di,{elTag:"div",elClasses:ao(t.viewSpec),renderProps:Object.assign(Object.assign({},e),{nextDayThreshold:t.options.nextDayThreshold}),generatorName:void 0,generator:r.content,classNameGenerator:r.classNames,didMount:r.didMount,willUnmount:r.willUnmount}))),{superType:t.type,component:n,rawOptions:t}}function ko(e,t,n,r){let i=So(e),o=So(t.views);return H(function(e,t){let n,r={};for(n in e)wo(n,r,e,t);for(n in t)wo(n,r,e,t);return r}(i,o),e=>function(e,t,n,r,i){let o=e.overrides.duration||e.defaults.duration||r.duration||n.duration,s=null,a="",l="",c={};if(o&&(s=function(e){let t=JSON.stringify(e),n=Ro[t];void 0===n&&(n=k(e),Ro[t]=n);return n}(o),s)){let e=I(s);a=e.unit,1===e.value&&(l=a,c=t[a]?t[a].rawOptions:{})}let u=t=>{let n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null},d=t=>{let n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null};return{type:e.type,component:e.component,duration:s,durationUnit:a,singleUnit:l,optionDefaults:e.defaults,optionOverrides:Object.assign(Object.assign({},c),e.overrides),buttonTextOverride:u(r)||u(n)||e.overrides.buttonText,buttonTextDefault:u(i)||e.defaults.buttonText||u(Te)||e.type,buttonTitleOverride:d(r)||d(n)||e.overrides.buttonHint,buttonTitleDefault:d(i)||e.defaults.buttonHint||d(Te)}}(e,o,t,n,r))}Co.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},Co.prototype.baseIconClass="fc-icon",Co.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},Co.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},Co.prototype.iconOverrideOption="buttonIcons",Co.prototype.iconOverrideCustomButtonOption="icon",Co.prototype.iconOverridePrefix="fc-icon-";let Ro={};function xo(e,t,n){let r=t?t.activeRange:null;return Mo({},function(e,t){let n=fo(t),r=[].concat(e.eventSources||[]),i=[];e.initialEvents&&r.unshift(e.initialEvents);e.events&&r.unshift(e.events);for(let e of r){let r=uo(e,t,n);r&&i.push(r)}return i}(e,n),r,n)}function Oo(e,t,n,r){let i=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return Mo(e,t.sources,i,r);case"REMOVE_EVENT_SOURCE":return o=e,s=t.sourceId,B(o,e=>e.sourceId!==s);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?No(e,i,r):e;case"FETCH_EVENT_SOURCES":return Bo(e,t.sourceIds?P(t.sourceIds):Po(e,r),i,t.isRefetch||!1,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){let i=e[t];if(i&&n===i.latestFetchId)return Object.assign(Object.assign({},e),{[t]:Object.assign(Object.assign({},i),{isFetching:!1,fetchRange:r})});return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var o,s}function Io(e){for(let t in e)if(e[t].isFetching)return!0;return!1}function Mo(e,t,n,r){let i={};for(let e of t)i[e.sourceId]=e;return n&&(i=No(i,n,r)),Object.assign(Object.assign({},e),i)}function No(e,t,n){return Bo(e,B(e,e=>function(e,t,n){if(!Uo(e,n))return!e.latestFetchId;return!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.starte.fetchRange.end}(e,t,n)),t,!1,n)}function Bo(e,t,n,r,i){let o={};for(let s in e){let a=e[s];t[s]?o[s]=Ho(a,n,r,i):o[s]=a}return o}function Ho(e,t,n,r){let{options:i,calendarApi:o}=r,s=r.pluginHooks.eventSourceDefs[e.sourceDefId],a=v();return s.fetch({eventSource:e,range:t,isRefetch:n,context:r},n=>{let{rawEvents:s}=n;i.eventSourceSuccess&&(s=i.eventSourceSuccess.call(o,s,n.response)||s),e.success&&(s=e.success.call(o,s,n.response)||s),r.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:a,fetchRange:t,rawEvents:s})},n=>{let s=!1;i.eventSourceFailure&&(i.eventSourceFailure.call(o,n),s=!0),e.failure&&(e.failure(n),s=!0),s||console.warn(n.message,n),r.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:a,fetchRange:t,error:n})}),Object.assign(Object.assign({},e),{isFetching:!0,latestFetchId:a})}function Po(e,t){return B(e,e=>Uo(e,t))}function Uo(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function jo(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function zo(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function Lo(e,t){let n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Fo(e,t){let n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Vo(e,t,n,r,i){return{header:e.headerToolbar?Wo(e.headerToolbar,e,t,n,r,i):null,footer:e.footerToolbar?Wo(e.footerToolbar,e,t,n,r,i):null}}function Wo(e,t,n,r,i,o){let s={},a=[],l=!1;for(let c in e){let u=Qo(e[c],t,n,r,i,o);s[c]=u.widgets,a.push(...u.viewsWithButtons),l=l||u.hasTitle}return{sectionWidgets:s,viewsWithButtons:a,hasTitle:l}}function Qo(e,t,n,r,i,o){let s="rtl"===t.direction,a=t.customButtons||{},l=n.buttonText||{},c=t.buttonText||{},u=n.buttonHints||{},d=t.buttonHints||{},f=e?e.split(" "):[],h=[],p=!1;return{widgets:f.map(e=>e.split(",").map(e=>{if("title"===e)return p=!0,{buttonName:e};let n,f,g,m,v,A;if(n=a[e])g=e=>{n.click&&n.click.call(e.target,e,e.target)},(m=r.getCustomButtonIconClass(n))||(m=r.getIconClass(e,s))||(v=n.text),A=n.hint||n.text;else if(f=i[e]){h.push(e),g=()=>{o.changeView(e)},(v=f.buttonTextOverride)||(m=r.getIconClass(e,s))||(v=f.buttonTextDefault);let n=f.buttonTextOverride||f.buttonTextDefault;A=D(f.buttonTitleOverride||f.buttonTitleDefault||t.viewHint,[n,e],n)}else if(o[e])if(g=()=>{o[e]()},(v=l[e])||(m=r.getIconClass(e,s))||(v=c[e]),"prevYear"===e||"nextYear"===e){let t="prevYear"===e?"prev":"next";A=D(u[t]||d[t],[c.year||"year","year"],c[e])}else A=t=>D(u[e]||d[e],[c[t]||t,t],c[e]);return{buttonName:e,buttonClick:g,buttonIcon:m,buttonText:v,buttonHint:A}})),viewsWithButtons:h,hasTitle:p}}class Go{constructor(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}get calendar(){return this.getCurrentData().calendarApi}get title(){return this.getCurrentData().viewTitle}get activeStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)}get activeEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)}get currentStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)}get currentEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)}getOption(e){return this.getCurrentData().options[e]}}function Zo(e,t){let n=U(t.getCurrentData().eventSources),r=[];for(let t of e){let e=!1;for(let r=0;rArray.isArray(e.events)?e.events:null,fetch(e,t){t({rawEvents:e.eventSource.meta})}}]}),_o({name:"func-event-source",eventSourceDefs:[{parseMeta:e=>"function"==typeof e.events?e.events:null,fetch(e,t,n){const{dateEnv:r}=e.context;Nt(e.eventSource.meta.bind(null,Lr(e.range,r)),e=>t({rawEvents:e}),n)}}]}),_o({name:"json-event-source",eventSourceRefiners:{method:String,extraParams:Be,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:e=>!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam},fetch(e,t,n){const{meta:r}=e.eventSource,i=function(e,t,n){let r,i,o,s,{dateEnv:a,options:l}=n,c={};r=e.startParam,null==r&&(r=l.startParam);i=e.endParam,null==i&&(i=l.endParam);o=e.timeZoneParam,null==o&&(o=l.timeZoneParam);s="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Object.assign(c,s),c[r]=a.formatIso(t.start),c[i]=a.formatIso(t.end),"local"!==a.timeZone&&(c[o]=a.timeZone);return c}(r,e.range,e.context);xi(r.method,r.url,i).then(([e,n])=>{t({rawEvents:e,response:n})},n)}}]}),_o({name:"simple-recurring-event",recurringTypes:[{parse(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){let i,o={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null};return e.duration&&(i=e.duration),!i&&e.startTime&&e.endTime&&(n=e.endTime,r=e.startTime,i={years:n.years-r.years,months:n.months-r.months,days:n.days-r.days,milliseconds:n.milliseconds-r.milliseconds}),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:i,typeData:o}}var n,r;return null},expand(e,t,n){let r=mt(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){let i=e?P(e):null,o=$(n.start),s=n.end,a=[];for(;oIo(e.eventSources)],propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",Object.assign(Object.assign({},Lr(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){let{emitter:n}=t;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",Tr(e,t))}}})];class qo{constructor(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new Oi(this.drain.bind(this))}request(e,t){this.queue.push(e),this.delayedRunner.request(t)}pause(e){this.delayedRunner.pause(e)}resume(e,t){this.delayedRunner.resume(e,t)}drain(){let{queue:e}=this;for(;e.length;){let t,n=[];for(;t=e.shift();)this.runTask(t),n.push(t);this.drained(n)}}runTask(e){this.runTaskOption&&this.runTaskOption(e)}drained(e){this.drainedOption&&this.drainedOption(e)}}function Jo(e,t,n){let r;return r=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(r.start,r.end,we(t.titleFormat||function(e){let{currentRangeUnit:t}=e;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};let n=J(e.currentRange.start,e.currentRange.end);if(null!==n&&n>1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}class $o{constructor(e){this.computeOptionsData=ue(this._computeOptionsData),this.computeCurrentViewData=ue(this._computeCurrentViewData),this.organizeRawLocales=ue(Ao),this.buildLocale=ue(bo),this.buildPluginHooks=Eo(),this.buildDateEnv=ue(Xo),this.buildTheme=ue(Ko),this.parseToolbars=ue(Vo),this.buildViewSpecs=ue(ko),this.buildDateProfileGenerator=de(es),this.buildViewApi=ue(ts),this.buildViewUiProps=de(is),this.buildEventUiBySource=ue(ns,j),this.buildEventUiBases=ue(rs),this.parseContextBusinessHours=de(ss),this.buildTitle=ue(Jo),this.emitter=new Bt,this.actionRunner=new qo(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=()=>this.data,this.dispatch=e=>{this.actionRunner.request(e)},this.props=e,this.actionRunner.pause();let t={},n=this.computeOptionsData(e.optionOverrides,t,e.calendarApi),r=n.calendarOptions.initialView||n.pluginHooks.initialView,i=this.computeCurrentViewData(r,n,e.optionOverrides,t);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(i.options);let o=function(e,t){let n=e.initialDate;return null!=n?t.createMarker(n):mr(e.now,t)}(n.calendarOptions,n.dateEnv),s=i.dateProfileGenerator.build(o);yt(s.activeRange,o)||(o=s.currentRange.start);let a={dateEnv:n.dateEnv,options:n.calendarOptions,pluginHooks:n.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData};for(let e of n.pluginHooks.contextInit)e(a);let l=xo(n.calendarOptions,s,a),c={dynamicOptionOverrides:t,currentViewType:r,currentDate:o,dateProfile:s,businessHours:this.parseContextBusinessHours(a),eventSources:l,eventUiBases:{},eventStore:{defs:{},instances:{}},renderableEventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(a).selectionConfig},u=Object.assign(Object.assign({},a),c);for(let e of n.pluginHooks.reducers)Object.assign(c,e(null,null,u));os(c,a)&&this.emitter.trigger("loading",!0),this.state=c,this.updateData(),this.actionRunner.resume()}resetOptions(e,t){let{props:n}=this;n.optionOverrides=t?Object.assign(Object.assign({},n.optionOverrides),e):e,this.actionRunner.request({type:"NOTHING"})}_handleAction(e){let{props:t,state:n,emitter:r}=this,i=function(e,t){switch(t.type){case"SET_OPTION":return Object.assign(Object.assign({},e),{[t.optionName]:t.rawOptionValue});default:return e}}(n.dynamicOptionOverrides,e),o=this.computeOptionsData(t.optionOverrides,i,t.calendarApi),s=function(e,t){switch(t.type){case"CHANGE_VIEW_TYPE":e=t.viewType}return e}(n.currentViewType,e),a=this.computeCurrentViewData(s,o,t.optionOverrides,i);t.calendarApi.currentDataManager=this,r.setThisContext(t.calendarApi),r.setOptions(a.options);let l={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:r,getCurrentData:this.getCurrentData},{currentDate:c,dateProfile:u}=n;this.data&&this.data.dateProfileGenerator!==a.dateProfileGenerator&&(u=a.dateProfileGenerator.build(c)),c=function(e,t){switch(t.type){case"CHANGE_DATE":return t.dateMarker;default:return e}}(c,e),u=function(e,t,n,r){let i;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if(i=r.buildPrev(e,n),i.isValid)return i;break;case"NEXT":if(i=r.buildNext(e,n),i.isValid)return i}return e}(u,e,c,a.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&yt(u.currentRange,c)||(c=u.currentRange.start);let d=Oo(n.eventSources,e,u,l),f=yi(n.eventStore,e,d,u,l),h=Io(d)&&!a.options.progressiveEventRendering&&n.renderableEventStore||f,{eventUiSingleBase:p,selectionConfig:g}=this.buildViewUiProps(l),m=this.buildEventUiBySource(d),v={dynamicOptionOverrides:i,currentViewType:s,currentDate:c,dateProfile:u,eventSources:d,eventStore:f,renderableEventStore:h,selectionConfig:g,eventUiBases:this.buildEventUiBases(h.defs,p,m),businessHours:this.parseContextBusinessHours(l),dateSelection:jo(n.dateSelection,e),eventSelection:zo(n.eventSelection,e),eventDrag:Lo(n.eventDrag,e),eventResize:Fo(n.eventResize,e)},A=Object.assign(Object.assign({},l),v);for(let t of o.pluginHooks.reducers)Object.assign(v,t(n,e,A));let b=os(n,l),y=os(v,l);!b&&y?r.trigger("loading",!0):b&&!y&&r.trigger("loading",!1),this.state=v,t.onAction&&t.onAction(e)}updateData(){let{props:e,state:t}=this,n=this.data,r=this.computeOptionsData(e.optionOverrides,t.dynamicOptionOverrides,e.calendarApi),i=this.computeCurrentViewData(t.currentViewType,r,e.optionOverrides,t.dynamicOptionOverrides),o=this.data=Object.assign(Object.assign(Object.assign({viewTitle:this.buildTitle(t.dateProfile,i.options,r.dateEnv),calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},r),i),t),s=r.pluginHooks.optionChangeHandlers,a=n&&n.calendarOptions,l=r.calendarOptions;if(a&&a!==l){a.timeZone!==l.timeZone&&(t.eventSources=o.eventSources=function(e,t,n){let r=t?t.activeRange:null;return Bo(e,Po(e,n),r,!0,n)}(o.eventSources,t.dateProfile,o),t.eventStore=o.eventStore=function(e,t,n){let{defs:r}=e,i=H(e.instances,e=>{let i=r[e.defId];return i.allDay||i.recurringDef?e:Object.assign(Object.assign({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})});return{defs:r,instances:i}}(o.eventStore,n.dateEnv,o.dateEnv));for(let e in s)a[e]!==l[e]&&s[e](l[e],o)}e.onData&&e.onData(o)}_computeOptionsData(e,t,n){let{refinedOptions:r,pluginHooks:i,localeDefaults:o,availableLocaleData:s,extra:a}=this.processRawCalendarOptions(e,t);as(a);let l=this.buildDateEnv(r.timeZone,r.locale,r.weekNumberCalculation,r.firstDay,r.weekText,i,s,r.defaultRangeSeparator),c=this.buildViewSpecs(i.views,e,t,o),u=this.buildTheme(r,i);return{calendarOptions:r,pluginHooks:i,dateEnv:l,viewSpecs:c,theme:u,toolbarConfig:this.parseToolbars(r,e,u,c,n),localeDefaults:o,availableRawLocales:s.map}}processRawCalendarOptions(e,t){let{locales:n,locale:r}=Me([Te,e,t]),i=this.organizeRawLocales(n),o=i.map,s=this.buildLocale(r||i.defaultCode,o).options,a=this.buildPluginHooks(e.plugins||[],Yo),l=this.currentCalendarOptionsRefiners=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Se),ke),Re),a.listenerRefiners),a.optionRefiners),c={},u=Me([Te,s,e,t]),d={},f=this.currentCalendarOptionsInput,h=this.currentCalendarOptionsRefined,p=!1;for(let e in u)"plugins"!==e&&(u[e]===f[e]||xe[e]&&e in f&&xe[e](f[e],u[e])?d[e]=h[e]:l[e]?(d[e]=l[e](u[e]),p=!0):c[e]=f[e]);return p&&(this.currentCalendarOptionsInput=u,this.currentCalendarOptionsRefined=d),{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:a,availableLocaleData:i,localeDefaults:s,extra:c}}_computeCurrentViewData(e,t,n,r){let i=t.viewSpecs[e];if(!i)throw new Error(`viewType "${e}" is not available. Please make sure you've loaded all neccessary plugins`);let{refinedOptions:o,extra:s}=this.processRawViewOptions(i,t.pluginHooks,t.localeDefaults,n,r);return as(s),{viewSpec:i,options:o,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:i.optionDefaults.dateProfileGeneratorClass,duration:i.duration,durationUnit:i.durationUnit,usesMinMaxTime:i.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:o.slotMinTime,slotMaxTime:o.slotMaxTime,showNonCurrentDates:o.showNonCurrentDates,dayCount:o.dayCount,dateAlignment:o.dateAlignment,dateIncrement:o.dateIncrement,hiddenDays:o.hiddenDays,weekends:o.weekends,nowInput:o.now,validRangeInput:o.validRange,visibleRangeInput:o.visibleRange,monthMode:o.monthMode,fixedWeekCount:o.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}}processRawViewOptions(e,t,n,r,i){let o=Me([Te,e.optionDefaults,n,r,e.optionOverrides,i]),s=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Se),ke),Re),Ie),t.listenerRefiners),t.optionRefiners),a={},l=this.currentViewOptionsInput,c=this.currentViewOptionsRefined,u=!1,d={};for(let e in o)o[e]===l[e]||xe[e]&&xe[e](o[e],l[e])?a[e]=c[e]:(o[e]===this.currentCalendarOptionsInput[e]||xe[e]&&xe[e](o[e],this.currentCalendarOptionsInput[e])?e in this.currentCalendarOptionsRefined&&(a[e]=this.currentCalendarOptionsRefined[e]):s[e]?a[e]=s[e](o[e]):d[e]=o[e],u=!0);return u&&(this.currentViewOptionsInput=o,this.currentViewOptionsRefined=a),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:d}}}function Xo(e,t,n,r,i,o,s,a){let l=bo(t||s.defaultCode,s.map);return new Yr({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:o.namedTimeZonedImpl,locale:l,weekNumberCalculation:n,firstDay:r,weekText:i,cmdFormatter:o.cmdFormatter,defaultSeparator:a})}function Ko(e,t){return new(t.themeClasses[e.themeSystem]||Co)(e)}function es(e){return new(e.dateProfileGeneratorClass||vr)(e)}function ts(e,t,n){return new Go(e,t,n)}function ns(e){return H(e,e=>e.ui)}function rs(e,t,n){let r={"":t};for(let t in e){let i=e[t];i.sourceId&&n[i.sourceId]&&(r[t]=n[i.sourceId])}return r}function is(e){let{options:t}=e;return{eventUiSingleBase:Ye({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:Ye({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function os(e,t){for(let n of t.pluginHooks.isLoadingFuncs)if(n(e))return!0;return!1}function ss(e){return ot(e.options.businessHours,e)}function as(e,t){for(let n in e)console.warn(`Unknown option '${n}'`+(t?` for view '${t}'`:""))}class ls extends hr{render(){return Jt("div",{className:"fc-toolbar-chunk"},...this.props.widgetGroups.map(e=>this.renderWidgetGroup(e)))}renderWidgetGroup(e){let{props:t}=this,{theme:n}=this.context,r=[],i=!0;for(let o of e){let{buttonName:e,buttonClick:s,buttonText:a,buttonIcon:l,buttonHint:c}=o;if("title"===e)i=!1,r.push(Jt("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{let i=e===t.activeButton,o=!t.isTodayEnabled&&"today"===e||!t.isPrevEnabled&&"prev"===e||!t.isNextEnabled&&"next"===e,u=[`fc-${e}-button`,n.getClass("button")];i&&u.push(n.getClass("buttonActive")),r.push(Jt("button",{type:"button",title:"function"==typeof c?c(t.navUnit):c,disabled:o,"aria-pressed":i,className:u.join(" "),onClick:s},a||(l?Jt("span",{className:l}):"")))}}if(r.length>1){return Jt("div",{className:i&&n.getClass("buttonGroup")||""},...r)}return r[0]}}class cs extends hr{render(){let e,t,{model:n,extraClassName:r}=this.props,i=!1,o=n.sectionWidgets,s=o.center;return o.left?(i=!0,e=o.left):e=o.start,o.right?(i=!0,t=o.right):t=o.end,Jt("div",{className:[r||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",s||[]),this.renderSection("end",t||[]))}renderSection(e,t){let{props:n}=this;return Jt(ls,{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})}}class us extends hr{constructor(){super(...arguments),this.state={availableWidth:null},this.handleEl=e=>{this.el=e,pr(this.props.elRef,e),this.updateAvailableWidth()},this.handleResize=()=>{this.updateAvailableWidth()}}render(){let{props:e,state:t}=this,{aspectRatio:n}=e,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],i="",o="";return n?null!==t.availableWidth?i=t.availableWidth/n:o=1/n*100+"%":i=e.height||"",Jt("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:i,paddingBottom:o}},e.children)}componentDidMount(){this.context.addResizeHandler(this.handleResize)}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}updateAvailableWidth(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})}}class ds extends ei{constructor(e){super(e),this.handleSegClick=(e,t)=>{let{component:r}=this,{context:i}=r,o=Rr(t);if(o&&r.isValidSegDownEl(e.target)){let s=n(e.target,".fc-event-forced-url"),a=s?s.querySelector("a[href]").href:"";i.emitter.trigger("eventClick",{el:t,event:new wr(r.context,o.eventRange.def,o.eventRange.instance),jsEvent:e,view:i.viewApi}),a&&!e.defaultPrevented&&(window.location.href=a)}},this.destroy=f(e.el,"click",".fc-event",this.handleSegClick)}}class fs extends ei{constructor(e){super(e),this.handleEventElRemove=e=>{e===this.currentSegEl&&this.handleSegLeave(null,this.currentSegEl)},this.handleSegEnter=(e,t)=>{Rr(t)&&(this.currentSegEl=t,this.triggerEvent("eventMouseEnter",e,t))},this.handleSegLeave=(e,t)=>{this.currentSegEl&&(this.currentSegEl=null,this.triggerEvent("eventMouseLeave",e,t))},this.removeHoverListeners=function(e,t,n,r){let i;return f(e,"mouseover",t,(e,t)=>{if(t!==i){i=t,n(e,t);let o=e=>{i=null,r(e,t),t.removeEventListener("mouseleave",o)};t.addEventListener("mouseleave",o)}})}(e.el,".fc-event",this.handleSegEnter,this.handleSegLeave)}destroy(){this.removeHoverListeners()}triggerEvent(e,t,n){let{component:r}=this,{context:i}=r,o=Rr(n);t&&!r.isValidSegDownEl(t.target)||i.emitter.trigger(e,{el:n,event:new wr(i,o.eventRange.def,o.eventRange.instance),jsEvent:t,view:i.viewApi})}}class hs extends fr{constructor(){super(...arguments),this.buildViewContext=ue(dr),this.buildViewPropTransformers=ue(gs),this.buildToolbarProps=ue(ps),this.headerRef={current:null},this.footerRef={current:null},this.interactionsStore={},this.state={viewLabelId:u()},this.registerInteractiveComponent=(e,t)=>{let n=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}(e,t),r=[ds,fs].concat(this.props.pluginHooks.componentInteractions).map(e=>new e(n));this.interactionsStore[e.uid]=r,ti[e.uid]=n},this.unregisterInteractiveComponent=e=>{let t=this.interactionsStore[e.uid];if(t){for(let e of t)e.destroy();delete this.interactionsStore[e.uid]}delete ti[e.uid]},this.resizeRunner=new Oi(()=>{this.props.emitter.trigger("_resize",!0),this.props.emitter.trigger("windowResize",{view:this.props.viewApi})}),this.handleWindowResize=e=>{let{options:t}=this.props;t.handleWindowResize&&e.target===window&&this.resizeRunner.request(t.windowResizeDelay)}}render(){let e,{props:t}=this,{toolbarConfig:n,options:r}=t,i=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,mr(t.options.now,t.dateEnv),t.viewTitle),o=!1,s="";t.isHeightAuto||t.forPrint?s="":null!=r.height?o=!0:null!=r.contentHeight?s=r.contentHeight:e=Math.max(r.aspectRatio,.5);let a=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),l=n.header&&n.header.hasTitle?this.state.viewLabelId:"";return Jt(ur.Provider,{value:a},n.header&&Jt(cs,Object.assign({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:l},i)),Jt(us,{liquid:o,height:s,aspectRatio:e,labeledById:l},this.renderView(t),this.buildAppendContent()),n.footer&&Jt(cs,Object.assign({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},i)))}componentDidMount(){let{props:e}=this;this.calendarInteractions=e.pluginHooks.calendarInteractions.map(t=>new t(e)),window.addEventListener("resize",this.handleWindowResize);let{propSetHandlers:t}=e.pluginHooks;for(let n in t)t[n](e[n],e)}componentDidUpdate(e){let{props:t}=this,{propSetHandlers:n}=t.pluginHooks;for(let r in n)t[r]!==e[r]&&n[r](t[r],t)}componentWillUnmount(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(let e of this.calendarInteractions)e.destroy();this.props.emitter.trigger("_unmount")}buildAppendContent(){let{props:e}=this;return Jt(Kt,{},...e.pluginHooks.viewContainerAppends.map(t=>t(e)))}renderView(e){let{pluginHooks:t}=e,{viewSpec:n}=e,r={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},i=this.buildViewPropTransformers(t.viewPropsTransformers);for(let t of i)Object.assign(r,t.transform(r,e));return Jt(n.component,Object.assign({},r))}}function ps(e,t,n,r,i,o){let s=n.build(i,void 0,!1),a=n.buildPrev(t,r,!1),l=n.buildNext(t,r,!1);return{title:o,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:s.isValid&&!yt(t.currentRange,i),isPrevEnabled:a.isValid,isNextEnabled:l.isValid}}function gs(e){return e.map(e=>new e)}function ms(e){let t=bo(e.locale||"en",Ao([]).map);return new Yr(Object.assign(Object.assign({timeZone:Te.timeZone,calendarSystem:"gregory"},e),{locale:t}))}return e.Calendar=class extends ho{constructor(e,t={}){super(),this.isRendering=!1,this.isRendered=!1,this.currentClassNames=[],this.customContentRenderId=0,this.handleAction=e=>{switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":this.renderRunner.tryDrain()}},this.handleData=e=>{this.currentData=e,this.renderRunner.request(e.calendarOptions.rerenderDelay)},this.handleRenderRequest=()=>{if(this.isRendering){this.isRendered=!0;let{currentData:e}=this;or(()=>{yn(Jt(ri,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(t,n,r,i)=>(this.setClassNames(t),this.setHeight(n),Jt(ui.Provider,{value:this.customContentRenderId},Jt(hs,Object.assign({isHeightAuto:r,forPrint:i},e))))),this.el)})}else this.isRendered&&(this.isRendered=!1,yn(null,this.el),this.setClassNames([]),this.setHeight(""))},this.el=e,this.renderRunner=new Oi(this.handleRenderRequest),new $o({optionOverrides:t,calendarApi:this,onAction:this.handleAction,onData:this.handleData})}render(){let e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()}destroy(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())}updateSize(){or(()=>{super.updateSize()})}batchRendering(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")}pauseRendering(){this.renderRunner.pause("pauseRendering")}resumeRendering(){this.renderRunner.resume("pauseRendering",!0)}resetOptions(e,t){this.currentDataManager.resetOptions(e,t)}setClassNames(e){if(!ce(e,this.currentClassNames)){let{classList:t}=this.el;for(let e of this.currentClassNames)t.remove(e);for(let n of e)t.add(n);this.currentClassNames=e}}setHeight(e){a(this.el,"height",e)}},e.Internal=po,e.JsonRequestError=Ri,e.Preact=lr,e.createPlugin=_o,e.formatDate=function(e,t={}){let n=ms(t),r=we(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""},e.formatRange=function(e,t,n){let r=ms("object"==typeof n&&n?n:{}),i=we(n),o=r.createMarkerMeta(e),s=r.createMarkerMeta(t);return o&&s?r.formatRange(o.marker,s.marker,i,{forcedStartTzo:o.forcedTzo,forcedEndTzo:s.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:Te.defaultRangeSeparator}):""},e.globalLocales=go,e.globalPlugins=Yo,e.sliceEvents=function(e,t){return kr(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},e.version="6.0.1",Object.defineProperty(e,"__esModule",{value:!0}),e}({}); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales-all.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales-all.global.js deleted file mode 100644 index 126c282e..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales-all.global.js +++ /dev/null @@ -1,1794 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var l0 = { - code: 'af', - week: { - dow: 1, - doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar. - }, - buttonText: { - prev: 'Vorige', - next: 'Volgende', - today: 'Vandag', - year: 'Jaar', - month: 'Maand', - week: 'Week', - day: 'Dag', - list: 'Agenda', - }, - allDayText: 'Heeldag', - moreLinkText: 'Addisionele', - noEventsText: 'Daar is geen gebeurtenisse nie', - }; - - var l1 = { - code: 'ar-dz', - week: { - dow: 0, - doy: 4, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - var l2 = { - code: 'ar-kw', - week: { - dow: 0, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - var l3 = { - code: 'ar-ly', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - var l4 = { - code: 'ar-ma', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - var l5 = { - code: 'ar-sa', - week: { - dow: 0, - doy: 6, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - var l6 = { - code: 'ar-tn', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - var l7 = { - code: 'ar', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - var l8 = { - code: 'az', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Əvvəl', - next: 'Sonra', - today: 'Bu Gün', - month: 'Ay', - week: 'Həftə', - day: 'Gün', - list: 'Gündəm', - }, - weekText: 'Həftə', - allDayText: 'Bütün Gün', - moreLinkText(n) { - return '+ daha çox ' + n; - }, - noEventsText: 'Göstərmək üçün hadisə yoxdur', - }; - - var l9 = { - code: 'bg', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'назад', - next: 'напред', - today: 'днес', - month: 'Месец', - week: 'Седмица', - day: 'Ден', - list: 'График', - }, - allDayText: 'Цял ден', - moreLinkText(n) { - return '+още ' + n; - }, - noEventsText: 'Няма събития за показване', - }; - - var l10 = { - code: 'bn', - week: { - dow: 0, - doy: 6, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'পেছনে', - next: 'সামনে', - today: 'আজ', - month: 'মাস', - week: 'সপ্তাহ', - day: 'দিন', - list: 'তালিকা', - }, - weekText: 'সপ্তাহ', - allDayText: 'সারাদিন', - moreLinkText(n) { - return '+অন্যান্য ' + n; - }, - noEventsText: 'কোনো ইভেন্ট নেই', - }; - - var l11 = { - code: 'bs', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Prošli', - next: 'Sljedeći', - today: 'Danas', - month: 'Mjesec', - week: 'Sedmica', - day: 'Dan', - list: 'Raspored', - }, - weekText: 'Sed', - allDayText: 'Cijeli dan', - moreLinkText(n) { - return '+ još ' + n; - }, - noEventsText: 'Nema događaja za prikazivanje', - }; - - var l12 = { - code: 'ca', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Anterior', - next: 'Següent', - today: 'Avui', - month: 'Mes', - week: 'Setmana', - day: 'Dia', - list: 'Agenda', - }, - weekText: 'Set', - allDayText: 'Tot el dia', - moreLinkText: 'més', - noEventsText: 'No hi ha esdeveniments per mostrar', - }; - - var l13 = { - code: 'cs', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Dříve', - next: 'Později', - today: 'Nyní', - month: 'Měsíc', - week: 'Týden', - day: 'Den', - list: 'Agenda', - }, - weekText: 'Týd', - allDayText: 'Celý den', - moreLinkText(n) { - return '+další: ' + n; - }, - noEventsText: 'Žádné akce k zobrazení', - }; - - var l14 = { - code: 'cy', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Blaenorol', - next: 'Nesaf', - today: 'Heddiw', - year: 'Blwyddyn', - month: 'Mis', - week: 'Wythnos', - day: 'Dydd', - list: 'Rhestr', - }, - weekText: 'Wythnos', - allDayText: 'Trwy\'r dydd', - moreLinkText: 'Mwy', - noEventsText: 'Dim digwyddiadau', - }; - - var l15 = { - code: 'da', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Forrige', - next: 'Næste', - today: 'I dag', - month: 'Måned', - week: 'Uge', - day: 'Dag', - list: 'Agenda', - }, - weekText: 'Uge', - allDayText: 'Hele dagen', - moreLinkText: 'flere', - noEventsText: 'Ingen arrangementer at vise', - }; - - function affix$1(buttonText) { - return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' : - buttonText === 'Jahr' ? 's' : ''; - } - var l16 = { - code: 'de-at', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Zurück', - next: 'Vor', - today: 'Heute', - year: 'Jahr', - month: 'Monat', - week: 'Woche', - day: 'Tag', - list: 'Terminübersicht', - }, - weekText: 'KW', - weekTextLong: 'Woche', - allDayText: 'Ganztägig', - moreLinkText(n) { - return '+ weitere ' + n; - }, - noEventsText: 'Keine Ereignisse anzuzeigen', - buttonHints: { - prev(buttonText) { - return `Vorherige${affix$1(buttonText)} ${buttonText}`; - }, - next(buttonText) { - return `Nächste${affix$1(buttonText)} ${buttonText}`; - }, - today(buttonText) { - // → Heute, Diese Woche, Dieser Monat, Dieses Jahr - if (buttonText === 'Tag') { - return 'Heute'; - } - return `Diese${affix$1(buttonText)} ${buttonText}`; - }, - }, - viewHint(buttonText) { - // → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht - const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es'; - return buttonText + glue + 'ansicht'; - }, - navLinkHint: 'Gehe zu $0', - moreLinkHint(eventCnt) { - return 'Zeige ' + (eventCnt === 1 ? - 'ein weiteres Ereignis' : - eventCnt + ' weitere Ereignisse'); - }, - closeHint: 'Schließen', - timeHint: 'Uhrzeit', - eventHint: 'Ereignis', - }; - - function affix(buttonText) { - return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' : - buttonText === 'Jahr' ? 's' : ''; - } - var l17 = { - code: 'de', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Zurück', - next: 'Vor', - today: 'Heute', - year: 'Jahr', - month: 'Monat', - week: 'Woche', - day: 'Tag', - list: 'Terminübersicht', - }, - weekText: 'KW', - weekTextLong: 'Woche', - allDayText: 'Ganztägig', - moreLinkText(n) { - return '+ weitere ' + n; - }, - noEventsText: 'Keine Ereignisse anzuzeigen', - buttonHints: { - prev(buttonText) { - return `Vorherige${affix(buttonText)} ${buttonText}`; - }, - next(buttonText) { - return `Nächste${affix(buttonText)} ${buttonText}`; - }, - today(buttonText) { - // → Heute, Diese Woche, Dieser Monat, Dieses Jahr - if (buttonText === 'Tag') { - return 'Heute'; - } - return `Diese${affix(buttonText)} ${buttonText}`; - }, - }, - viewHint(buttonText) { - // → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht - const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es'; - return buttonText + glue + 'ansicht'; - }, - navLinkHint: 'Gehe zu $0', - moreLinkHint(eventCnt) { - return 'Zeige ' + (eventCnt === 1 ? - 'ein weiteres Ereignis' : - eventCnt + ' weitere Ereignisse'); - }, - closeHint: 'Schließen', - timeHint: 'Uhrzeit', - eventHint: 'Ereignis', - }; - - var l18 = { - code: 'el', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4st is the first week of the year. - }, - buttonText: { - prev: 'Προηγούμενος', - next: 'Επόμενος', - today: 'Σήμερα', - month: 'Μήνας', - week: 'Εβδομάδα', - day: 'Ημέρα', - list: 'Ατζέντα', - }, - weekText: 'Εβδ', - allDayText: 'Ολοήμερο', - moreLinkText: 'περισσότερα', - noEventsText: 'Δεν υπάρχουν γεγονότα προς εμφάνιση', - }; - - var l19 = { - code: 'en-au', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonHints: { - prev: 'Previous $0', - next: 'Next $0', - today: 'This $0', - }, - viewHint: '$0 view', - navLinkHint: 'Go to $0', - moreLinkHint(eventCnt) { - return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`; - }, - }; - - var l20 = { - code: 'en-gb', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonHints: { - prev: 'Previous $0', - next: 'Next $0', - today: 'This $0', - }, - viewHint: '$0 view', - navLinkHint: 'Go to $0', - moreLinkHint(eventCnt) { - return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`; - }, - }; - - var l21 = { - code: 'en-nz', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonHints: { - prev: 'Previous $0', - next: 'Next $0', - today: 'This $0', - }, - viewHint: '$0 view', - navLinkHint: 'Go to $0', - moreLinkHint(eventCnt) { - return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`; - }, - }; - - var l22 = { - code: 'eo', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Antaŭa', - next: 'Sekva', - today: 'Hodiaŭ', - month: 'Monato', - week: 'Semajno', - day: 'Tago', - list: 'Tagordo', - }, - weekText: 'Sm', - allDayText: 'Tuta tago', - moreLinkText: 'pli', - noEventsText: 'Neniuj eventoj por montri', - }; - - var l23 = { - code: 'es', - week: { - dow: 0, - doy: 6, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Ant', - next: 'Sig', - today: 'Hoy', - month: 'Mes', - week: 'Semana', - day: 'Día', - list: 'Agenda', - }, - weekText: 'Sm', - allDayText: 'Todo el día', - moreLinkText: 'más', - noEventsText: 'No hay eventos para mostrar', - }; - - var l24 = { - code: 'es', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Ant', - next: 'Sig', - today: 'Hoy', - month: 'Mes', - week: 'Semana', - day: 'Día', - list: 'Agenda', - }, - buttonHints: { - prev: '$0 antes', - next: '$0 siguiente', - today(buttonText) { - return (buttonText === 'Día') ? 'Hoy' : - ((buttonText === 'Semana') ? 'Esta' : 'Este') + ' ' + buttonText.toLocaleLowerCase(); - }, - }, - viewHint(buttonText) { - return 'Vista ' + (buttonText === 'Semana' ? 'de la' : 'del') + ' ' + buttonText.toLocaleLowerCase(); - }, - weekText: 'Sm', - weekTextLong: 'Semana', - allDayText: 'Todo el día', - moreLinkText: 'más', - moreLinkHint(eventCnt) { - return `Mostrar ${eventCnt} eventos más`; - }, - noEventsText: 'No hay eventos para mostrar', - navLinkHint: 'Ir al $0', - closeHint: 'Cerrar', - timeHint: 'La hora', - eventHint: 'Evento', - }; - - var l25 = { - code: 'et', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Eelnev', - next: 'Järgnev', - today: 'Täna', - month: 'Kuu', - week: 'Nädal', - day: 'Päev', - list: 'Päevakord', - }, - weekText: 'näd', - allDayText: 'Kogu päev', - moreLinkText(n) { - return '+ veel ' + n; - }, - noEventsText: 'Kuvamiseks puuduvad sündmused', - }; - - var l26 = { - code: 'eu', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Aur', - next: 'Hur', - today: 'Gaur', - month: 'Hilabetea', - week: 'Astea', - day: 'Eguna', - list: 'Agenda', - }, - weekText: 'As', - allDayText: 'Egun osoa', - moreLinkText: 'gehiago', - noEventsText: 'Ez dago ekitaldirik erakusteko', - }; - - var l27 = { - code: 'fa', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'قبلی', - next: 'بعدی', - today: 'امروز', - month: 'ماه', - week: 'هفته', - day: 'روز', - list: 'برنامه', - }, - weekText: 'هف', - allDayText: 'تمام روز', - moreLinkText(n) { - return 'بیش از ' + n; - }, - noEventsText: 'هیچ رویدادی به نمایش', - }; - - var l28 = { - code: 'fi', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Edellinen', - next: 'Seuraava', - today: 'Tänään', - month: 'Kuukausi', - week: 'Viikko', - day: 'Päivä', - list: 'Tapahtumat', - }, - weekText: 'Vk', - allDayText: 'Koko päivä', - moreLinkText: 'lisää', - noEventsText: 'Ei näytettäviä tapahtumia', - }; - - var l29 = { - code: 'fr', - buttonText: { - prev: 'Précédent', - next: 'Suivant', - today: 'Aujourd\'hui', - year: 'Année', - month: 'Mois', - week: 'Semaine', - day: 'Jour', - list: 'Mon planning', - }, - weekText: 'Sem.', - allDayText: 'Toute la journée', - moreLinkText: 'en plus', - noEventsText: 'Aucun événement à afficher', - }; - - var l30 = { - code: 'fr-ch', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Précédent', - next: 'Suivant', - today: 'Courant', - year: 'Année', - month: 'Mois', - week: 'Semaine', - day: 'Jour', - list: 'Mon planning', - }, - weekText: 'Sm', - allDayText: 'Toute la journée', - moreLinkText: 'en plus', - noEventsText: 'Aucun événement à afficher', - }; - - var l31 = { - code: 'fr', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Précédent', - next: 'Suivant', - today: 'Aujourd\'hui', - year: 'Année', - month: 'Mois', - week: 'Semaine', - day: 'Jour', - list: 'Planning', - }, - weekText: 'Sem.', - allDayText: 'Toute la journée', - moreLinkText: 'en plus', - noEventsText: 'Aucun événement à afficher', - }; - - var l32 = { - code: 'gl', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Ant', - next: 'Seg', - today: 'Hoxe', - month: 'Mes', - week: 'Semana', - day: 'Día', - list: 'Axenda', - }, - weekText: 'Sm', - allDayText: 'Todo o día', - moreLinkText: 'máis', - noEventsText: 'Non hai eventos para amosar', - }; - - var l33 = { - code: 'he', - direction: 'rtl', - buttonText: { - prev: 'הקודם', - next: 'הבא', - today: 'היום', - month: 'חודש', - week: 'שבוע', - day: 'יום', - list: 'סדר יום', - }, - allDayText: 'כל היום', - moreLinkText: 'אחר', - noEventsText: 'אין אירועים להצגה', - weekText: 'שבוע', - }; - - var l34 = { - code: 'hi', - week: { - dow: 0, - doy: 6, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'पिछला', - next: 'अगला', - today: 'आज', - month: 'महीना', - week: 'सप्ताह', - day: 'दिन', - list: 'कार्यसूची', - }, - weekText: 'हफ्ता', - allDayText: 'सभी दिन', - moreLinkText(n) { - return '+अधिक ' + n; - }, - noEventsText: 'कोई घटनाओं को प्रदर्शित करने के लिए', - }; - - var l35 = { - code: 'hr', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Prijašnji', - next: 'Sljedeći', - today: 'Danas', - month: 'Mjesec', - week: 'Tjedan', - day: 'Dan', - list: 'Raspored', - }, - weekText: 'Tje', - allDayText: 'Cijeli dan', - moreLinkText(n) { - return '+ još ' + n; - }, - noEventsText: 'Nema događaja za prikaz', - }; - - var l36 = { - code: 'hu', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'vissza', - next: 'előre', - today: 'ma', - month: 'Hónap', - week: 'Hét', - day: 'Nap', - list: 'Lista', - }, - weekText: 'Hét', - allDayText: 'Egész nap', - moreLinkText: 'további', - noEventsText: 'Nincs megjeleníthető esemény', - }; - - var l37 = { - code: 'hy-am', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Նախորդ', - next: 'Հաջորդ', - today: 'Այսօր', - month: 'Ամիս', - week: 'Շաբաթ', - day: 'Օր', - list: 'Օրվա ցուցակ', - }, - weekText: 'Շաբ', - allDayText: 'Ամբողջ օր', - moreLinkText(n) { - return '+ ևս ' + n; - }, - noEventsText: 'Բացակայում է իրադարձությունը ցուցադրելու', - }; - - var l38 = { - code: 'id', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'mundur', - next: 'maju', - today: 'hari ini', - month: 'Bulan', - week: 'Minggu', - day: 'Hari', - list: 'Agenda', - }, - weekText: 'Mg', - allDayText: 'Sehari penuh', - moreLinkText: 'lebih', - noEventsText: 'Tidak ada acara untuk ditampilkan', - }; - - var l39 = { - code: 'is', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Fyrri', - next: 'Næsti', - today: 'Í dag', - month: 'Mánuður', - week: 'Vika', - day: 'Dagur', - list: 'Dagskrá', - }, - weekText: 'Vika', - allDayText: 'Allan daginn', - moreLinkText: 'meira', - noEventsText: 'Engir viðburðir til að sýna', - }; - - var l40 = { - code: 'it', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Prec', - next: 'Succ', - today: 'Oggi', - month: 'Mese', - week: 'Settimana', - day: 'Giorno', - list: 'Agenda', - }, - weekText: 'Sm', - allDayText: 'Tutto il giorno', - moreLinkText(n) { - return '+altri ' + n; - }, - noEventsText: 'Non ci sono eventi da visualizzare', - }; - - var l41 = { - code: 'ja', - buttonText: { - prev: '前', - next: '次', - today: '今日', - month: '月', - week: '週', - day: '日', - list: '予定リスト', - }, - weekText: '週', - allDayText: '終日', - moreLinkText(n) { - return '他 ' + n + ' 件'; - }, - noEventsText: '表示する予定はありません', - }; - - var l42 = { - code: 'ka', - week: { - dow: 1, - doy: 7, - }, - buttonText: { - prev: 'წინა', - next: 'შემდეგი', - today: 'დღეს', - month: 'თვე', - week: 'კვირა', - day: 'დღე', - list: 'დღის წესრიგი', - }, - weekText: 'კვ', - allDayText: 'მთელი დღე', - moreLinkText(n) { - return '+ კიდევ ' + n; - }, - noEventsText: 'ღონისძიებები არ არის', - }; - - var l43 = { - code: 'kk', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Алдыңғы', - next: 'Келесі', - today: 'Бүгін', - month: 'Ай', - week: 'Апта', - day: 'Күн', - list: 'Күн тәртібі', - }, - weekText: 'Не', - allDayText: 'Күні бойы', - moreLinkText(n) { - return '+ тағы ' + n; - }, - noEventsText: 'Көрсету үшін оқиғалар жоқ', - }; - - var l44 = { - code: 'km', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'មុន', - next: 'បន្ទាប់', - today: 'ថ្ងៃនេះ', - year: 'ឆ្នាំ', - month: 'ខែ', - week: 'សប្តាហ៍', - day: 'ថ្ងៃ', - list: 'បញ្ជី', - }, - weekText: 'សប្តាហ៍', - allDayText: 'ពេញមួយថ្ងៃ', - moreLinkText: 'ច្រើនទៀត', - noEventsText: 'គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ', - }; - - var l45 = { - code: 'ko', - buttonText: { - prev: '이전달', - next: '다음달', - today: '오늘', - month: '월', - week: '주', - day: '일', - list: '일정목록', - }, - weekText: '주', - allDayText: '종일', - moreLinkText: '개', - noEventsText: '일정이 없습니다', - }; - - var l46 = { - code: 'ku', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'پێشتر', - next: 'دواتر', - today: 'ئەمڕو', - month: 'مانگ', - week: 'هەفتە', - day: 'ڕۆژ', - list: 'بەرنامە', - }, - weekText: 'هەفتە', - allDayText: 'هەموو ڕۆژەکە', - moreLinkText: 'زیاتر', - noEventsText: 'هیچ ڕووداوێك نیە', - }; - - var l47 = { - code: 'lb', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Zréck', - next: 'Weider', - today: 'Haut', - month: 'Mount', - week: 'Woch', - day: 'Dag', - list: 'Terminiwwersiicht', - }, - weekText: 'W', - allDayText: 'Ganzen Dag', - moreLinkText: 'méi', - noEventsText: 'Nee Evenementer ze affichéieren', - }; - - var l48 = { - code: 'lt', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Atgal', - next: 'Pirmyn', - today: 'Šiandien', - month: 'Mėnuo', - week: 'Savaitė', - day: 'Diena', - list: 'Darbotvarkė', - }, - weekText: 'SAV', - allDayText: 'Visą dieną', - moreLinkText: 'daugiau', - noEventsText: 'Nėra įvykių rodyti', - }; - - var l49 = { - code: 'lv', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Iepr.', - next: 'Nāk.', - today: 'Šodien', - month: 'Mēnesis', - week: 'Nedēļa', - day: 'Diena', - list: 'Dienas kārtība', - }, - weekText: 'Ned.', - allDayText: 'Visu dienu', - moreLinkText(n) { - return '+vēl ' + n; - }, - noEventsText: 'Nav notikumu', - }; - - var l50 = { - code: 'mk', - buttonText: { - prev: 'претходно', - next: 'следно', - today: 'Денес', - month: 'Месец', - week: 'Недела', - day: 'Ден', - list: 'График', - }, - weekText: 'Сед', - allDayText: 'Цел ден', - moreLinkText(n) { - return '+повеќе ' + n; - }, - noEventsText: 'Нема настани за прикажување', - }; - - var l51 = { - code: 'ms', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Sebelum', - next: 'Selepas', - today: 'hari ini', - month: 'Bulan', - week: 'Minggu', - day: 'Hari', - list: 'Agenda', - }, - weekText: 'Mg', - allDayText: 'Sepanjang hari', - moreLinkText(n) { - return 'masih ada ' + n + ' acara'; - }, - noEventsText: 'Tiada peristiwa untuk dipaparkan', - }; - - var l52 = { - code: 'nb', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Forrige', - next: 'Neste', - today: 'I dag', - month: 'Måned', - week: 'Uke', - day: 'Dag', - list: 'Agenda', - }, - weekText: 'Uke', - weekTextLong: 'Uke', - allDayText: 'Hele dagen', - moreLinkText: 'til', - noEventsText: 'Ingen hendelser å vise', - buttonHints: { - prev: 'Forrige $0', - next: 'Neste $0', - today: 'Nåværende $0', - }, - viewHint: '$0 visning', - navLinkHint: 'Gå til $0', - moreLinkHint(eventCnt) { - return `Vis ${eventCnt} flere hendelse${eventCnt === 1 ? '' : 'r'}`; - }, - }; - - var l53 = { - code: 'ne', - week: { - dow: 7, - doy: 1, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'अघिल्लो', - next: 'अर्को', - today: 'आज', - month: 'महिना', - week: 'हप्ता', - day: 'दिन', - list: 'सूची', - }, - weekText: 'हप्ता', - allDayText: 'दिनभरि', - moreLinkText: 'थप लिंक', - noEventsText: 'देखाउनको लागि कुनै घटनाहरू छैनन्', - }; - - var l54 = { - code: 'nl', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Vorige', - next: 'Volgende', - today: 'Vandaag', - year: 'Jaar', - month: 'Maand', - week: 'Week', - day: 'Dag', - list: 'Agenda', - }, - allDayText: 'Hele dag', - moreLinkText: 'extra', - noEventsText: 'Geen evenementen om te laten zien', - }; - - var l55 = { - code: 'nn', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Førre', - next: 'Neste', - today: 'I dag', - month: 'Månad', - week: 'Veke', - day: 'Dag', - list: 'Agenda', - }, - weekText: 'Veke', - allDayText: 'Heile dagen', - moreLinkText: 'til', - noEventsText: 'Ingen hendelser å vise', - }; - - var l56 = { - code: 'pl', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Poprzedni', - next: 'Następny', - today: 'Dziś', - month: 'Miesiąc', - week: 'Tydzień', - day: 'Dzień', - list: 'Plan dnia', - }, - weekText: 'Tydz', - allDayText: 'Cały dzień', - moreLinkText: 'więcej', - noEventsText: 'Brak wydarzeń do wyświetlenia', - }; - - var l57 = { - code: 'pt-br', - buttonText: { - prev: 'Anterior', - next: 'Próximo', - today: 'Hoje', - month: 'Mês', - week: 'Semana', - day: 'Dia', - list: 'Lista', - }, - weekText: 'Sm', - allDayText: 'dia inteiro', - moreLinkText(n) { - return 'mais +' + n; - }, - noEventsText: 'Não há eventos para mostrar', - }; - - var l58 = { - code: 'pt', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Anterior', - next: 'Seguinte', - today: 'Hoje', - month: 'Mês', - week: 'Semana', - day: 'Dia', - list: 'Agenda', - }, - weekText: 'Sem', - allDayText: 'Todo o dia', - moreLinkText: 'mais', - noEventsText: 'Não há eventos para mostrar', - }; - - var l59 = { - code: 'ro', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'precedentă', - next: 'următoare', - today: 'Azi', - month: 'Lună', - week: 'Săptămână', - day: 'Zi', - list: 'Agendă', - }, - weekText: 'Săpt', - allDayText: 'Toată ziua', - moreLinkText(n) { - return '+alte ' + n; - }, - noEventsText: 'Nu există evenimente de afișat', - }; - - var l60 = { - code: 'ru', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Пред', - next: 'След', - today: 'Сегодня', - month: 'Месяц', - week: 'Неделя', - day: 'День', - list: 'Повестка дня', - }, - weekText: 'Нед', - allDayText: 'Весь день', - moreLinkText(n) { - return '+ ещё ' + n; - }, - noEventsText: 'Нет событий для отображения', - }; - - var l61 = { - code: 'si-lk', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'පෙර', - next: 'පසු', - today: 'අද', - month: 'මාසය', - week: 'සතිය', - day: 'දවස', - list: 'ලැයිස්තුව', - }, - weekText: 'සති', - allDayText: 'සියලු', - moreLinkText: 'තවත්', - noEventsText: 'මුකුත් නැත', - }; - - var l62 = { - code: 'sk', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Predchádzajúci', - next: 'Nasledujúci', - today: 'Dnes', - month: 'Mesiac', - week: 'Týždeň', - day: 'Deň', - list: 'Rozvrh', - }, - weekText: 'Ty', - allDayText: 'Celý deň', - moreLinkText(n) { - return '+ďalšie: ' + n; - }, - noEventsText: 'Žiadne akcie na zobrazenie', - }; - - var l63 = { - code: 'sl', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Prejšnji', - next: 'Naslednji', - today: 'Trenutni', - month: 'Mesec', - week: 'Teden', - day: 'Dan', - list: 'Dnevni red', - }, - weekText: 'Teden', - allDayText: 'Ves dan', - moreLinkText: 'več', - noEventsText: 'Ni dogodkov za prikaz', - }; - - var l64 = { - code: 'sm', - buttonText: { - prev: 'Talu ai', - next: 'Mulimuli atu', - today: 'Aso nei', - month: 'Masina', - week: 'Vaiaso', - day: 'Aso', - list: 'Faasologa', - }, - weekText: 'Vaiaso', - allDayText: 'Aso atoa', - moreLinkText: 'sili atu', - noEventsText: 'Leai ni mea na tutupu', - }; - - var l65 = { - code: 'sq', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'mbrapa', - next: 'Përpara', - today: 'sot', - month: 'Muaj', - week: 'Javë', - day: 'Ditë', - list: 'Listë', - }, - weekText: 'Ja', - allDayText: 'Gjithë ditën', - moreLinkText(n) { - return '+më tepër ' + n; - }, - noEventsText: 'Nuk ka evente për të shfaqur', - }; - - var l66 = { - code: 'sr-cyrl', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Претходна', - next: 'следећи', - today: 'Данас', - month: 'Месец', - week: 'Недеља', - day: 'Дан', - list: 'Планер', - }, - weekText: 'Сед', - allDayText: 'Цео дан', - moreLinkText(n) { - return '+ још ' + n; - }, - noEventsText: 'Нема догађаја за приказ', - }; - - var l67 = { - code: 'sr', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Prethodna', - next: 'Sledeći', - today: 'Danas', - month: 'Mеsеc', - week: 'Nеdеlja', - day: 'Dan', - list: 'Planеr', - }, - weekText: 'Sed', - allDayText: 'Cеo dan', - moreLinkText(n) { - return '+ još ' + n; - }, - noEventsText: 'Nеma događaja za prikaz', - }; - - var l68 = { - code: 'sv', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Förra', - next: 'Nästa', - today: 'Idag', - month: 'Månad', - week: 'Vecka', - day: 'Dag', - list: 'Program', - }, - buttonHints: { - prev(buttonText) { - return `Föregående ${buttonText.toLocaleLowerCase()}`; - }, - next(buttonText) { - return `Nästa ${buttonText.toLocaleLowerCase()}`; - }, - today(buttonText) { - return (buttonText === 'Program' ? 'Detta' : 'Denna') + ' ' + buttonText.toLocaleLowerCase(); - }, - }, - viewHint: '$0 vy', - navLinkHint: 'Gå till $0', - moreLinkHint(eventCnt) { - return `Visa ytterligare ${eventCnt} händelse${eventCnt === 1 ? '' : 'r'}`; - }, - weekText: 'v.', - weekTextLong: 'Vecka', - allDayText: 'Heldag', - moreLinkText: 'till', - noEventsText: 'Inga händelser att visa', - closeHint: 'Stäng', - timeHint: 'Klockan', - eventHint: 'Händelse', - }; - - var l69 = { - code: 'ta-in', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'முந்தைய', - next: 'அடுத்தது', - today: 'இன்று', - month: 'மாதம்', - week: 'வாரம்', - day: 'நாள்', - list: 'தினசரி அட்டவணை', - }, - weekText: 'வாரம்', - allDayText: 'நாள் முழுவதும்', - moreLinkText(n) { - return '+ மேலும் ' + n; - }, - noEventsText: 'காண்பிக்க நிகழ்வுகள் இல்லை', - }; - - var l70 = { - code: 'th', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'ก่อนหน้า', - next: 'ถัดไป', - prevYear: 'ปีก่อนหน้า', - nextYear: 'ปีถัดไป', - year: 'ปี', - today: 'วันนี้', - month: 'เดือน', - week: 'สัปดาห์', - day: 'วัน', - list: 'กำหนดการ', - }, - weekText: 'สัปดาห์', - allDayText: 'ตลอดวัน', - moreLinkText: 'เพิ่มเติม', - noEventsText: 'ไม่มีกิจกรรมที่จะแสดง', - }; - - var l71 = { - code: 'tr', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'geri', - next: 'ileri', - today: 'bugün', - month: 'Ay', - week: 'Hafta', - day: 'Gün', - list: 'Ajanda', - }, - weekText: 'Hf', - allDayText: 'Tüm gün', - moreLinkText: 'daha fazla', - noEventsText: 'Gösterilecek etkinlik yok', - }; - - var l72 = { - code: 'ug', - buttonText: { - month: 'ئاي', - week: 'ھەپتە', - day: 'كۈن', - list: 'كۈنتەرتىپ', - }, - allDayText: 'پۈتۈن كۈن', - }; - - var l73 = { - code: 'uk', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Попередній', - next: 'далі', - today: 'Сьогодні', - month: 'Місяць', - week: 'Тиждень', - day: 'День', - list: 'Порядок денний', - }, - weekText: 'Тиж', - allDayText: 'Увесь день', - moreLinkText(n) { - return '+ще ' + n + '...'; - }, - noEventsText: 'Немає подій для відображення', - }; - - var l74 = { - code: 'uz', - buttonText: { - month: 'Oy', - week: 'Xafta', - day: 'Kun', - list: 'Kun tartibi', - }, - allDayText: 'Kun bo\'yi', - moreLinkText(n) { - return '+ yana ' + n; - }, - noEventsText: 'Ko\'rsatish uchun voqealar yo\'q', - }; - - var l75 = { - code: 'vi', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Trước', - next: 'Tiếp', - today: 'Hôm nay', - month: 'Tháng', - week: 'Tuần', - day: 'Ngày', - list: 'Lịch biểu', - }, - weekText: 'Tu', - allDayText: 'Cả ngày', - moreLinkText(n) { - return '+ thêm ' + n; - }, - noEventsText: 'Không có sự kiện để hiển thị', - }; - - var l76 = { - code: 'zh-cn', - week: { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: '上月', - next: '下月', - today: '今天', - month: '月', - week: '周', - day: '日', - list: '日程', - }, - weekText: '周', - allDayText: '全天', - moreLinkText(n) { - return '另外 ' + n + ' 个'; - }, - noEventsText: '没有事件显示', - }; - - var l77 = { - code: 'zh-tw', - buttonText: { - prev: '上月', - next: '下月', - today: '今天', - month: '月', - week: '週', - day: '天', - list: '活動列表', - }, - weekText: '周', - allDayText: '整天', - moreLinkText: '顯示更多', - noEventsText: '没有任何活動', - }; - - var localesAll = [ - l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, l73, l74, l75, l76, l77, - ]; - - index_js.globalLocales.push(...localesAll); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales-all.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales-all.global.min.js deleted file mode 100644 index 4c25dbc5..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales-all.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";function t(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}function n(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}var o=[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Heeldag",moreLinkText:"Addisionele",noEventsText:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"az",week:{dow:1,doy:4},buttonText:{prev:"Əvvəl",next:"Sonra",today:"Bu Gün",month:"Ay",week:"Həftə",day:"Gün",list:"Gündəm"},weekText:"Həftə",allDayText:"Bütün Gün",moreLinkText:e=>"+ daha çox "+e,noEventsText:"Göstərmək üçün hadisə yoxdur"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",moreLinkText:e=>"+още "+e,noEventsText:"Няма събития за показване"},{code:"bn",week:{dow:0,doy:6},buttonText:{prev:"পেছনে",next:"সামনে",today:"আজ",month:"মাস",week:"সপ্তাহ",day:"দিন",list:"তালিকা"},weekText:"সপ্তাহ",allDayText:"সারাদিন",moreLinkText:e=>"+অন্যান্য "+e,noEventsText:"কোনো ইভেন্ট নেই"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekText:"Sed",allDayText:"Cijeli dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekText:"Set",allDayText:"Tot el dia",moreLinkText:"més",noEventsText:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekText:"Týd",allDayText:"Celý den",moreLinkText:e=>"+další: "+e,noEventsText:"Žádné akce k zobrazení"},{code:"cy",week:{dow:1,doy:4},buttonText:{prev:"Blaenorol",next:"Nesaf",today:"Heddiw",year:"Blwyddyn",month:"Mis",week:"Wythnos",day:"Dydd",list:"Rhestr"},weekText:"Wythnos",allDayText:"Trwy'r dydd",moreLinkText:"Mwy",noEventsText:"Dim digwyddiadau"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekText:"Uge",allDayText:"Hele dagen",moreLinkText:"flere",noEventsText:"Ingen arrangementer at vise"},{code:"de-at",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"Ganztägig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${t(e)} ${e}`,next:e=>`Nächste${t(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${t(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"Schließen",timeHint:"Uhrzeit",eventHint:"Ereignis"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"Ganztägig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${n(e)} ${e}`,next:e=>`Nächste${n(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${n(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"Schließen",timeHint:"Uhrzeit",eventHint:"Ereignis"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekText:"Εβδ",allDayText:"Ολοήμερο",moreLinkText:"περισσότερα",noEventsText:"Δεν υπάρχουν γεγονότα προς εμφάνιση"},{code:"en-au",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"en-gb",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"en-nz",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"eo",week:{dow:1,doy:4},buttonText:{prev:"Antaŭa",next:"Sekva",today:"Hodiaŭ",month:"Monato",week:"Semajno",day:"Tago",list:"Tagordo"},weekText:"Sm",allDayText:"Tuta tago",moreLinkText:"pli",noEventsText:"Neniuj eventoj por montri"},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekText:"Sm",allDayText:"Todo el día",moreLinkText:"más",noEventsText:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},buttonHints:{prev:"$0 antes",next:"$0 siguiente",today:e=>"Día"===e?"Hoy":("Semana"===e?"Esta":"Este")+" "+e.toLocaleLowerCase()},viewHint:e=>"Vista "+("Semana"===e?"de la":"del")+" "+e.toLocaleLowerCase(),weekText:"Sm",weekTextLong:"Semana",allDayText:"Todo el día",moreLinkText:"más",moreLinkHint:e=>`Mostrar ${e} eventos más`,noEventsText:"No hay eventos para mostrar",navLinkHint:"Ir al $0",closeHint:"Cerrar",timeHint:"La hora",eventHint:"Evento"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekText:"näd",allDayText:"Kogu päev",moreLinkText:e=>"+ veel "+e,noEventsText:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekText:"As",allDayText:"Egun osoa",moreLinkText:"gehiago",noEventsText:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekText:"هف",allDayText:"تمام روز",moreLinkText:e=>"بیش از "+e,noEventsText:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekText:"Vk",allDayText:"Koko päivä",moreLinkText:"lisää",noEventsText:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sm",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekText:"Sm",allDayText:"Todo o día",moreLinkText:"máis",noEventsText:"Non hai eventos para amosar"},{code:"he",direction:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",moreLinkText:"אחר",noEventsText:"אין אירועים להצגה",weekText:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekText:"हफ्ता",allDayText:"सभी दिन",moreLinkText:e=>"+अधिक "+e,noEventsText:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekText:"Tje",allDayText:"Cijeli dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Lista"},weekText:"Hét",allDayText:"Egész nap",moreLinkText:"további",noEventsText:"Nincs megjeleníthető esemény"},{code:"hy-am",week:{dow:1,doy:4},buttonText:{prev:"Նախորդ",next:"Հաջորդ",today:"Այսօր",month:"Ամիս",week:"Շաբաթ",day:"Օր",list:"Օրվա ցուցակ"},weekText:"Շաբ",allDayText:"Ամբողջ օր",moreLinkText:e=>"+ ևս "+e,noEventsText:"Բացակայում է իրադարձությունը ցուցադրելու"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sehari penuh",moreLinkText:"lebih",noEventsText:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekText:"Vika",allDayText:"Allan daginn",moreLinkText:"meira",noEventsText:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekText:"Sm",allDayText:"Tutto il giorno",moreLinkText:e=>"+altri "+e,noEventsText:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekText:"週",allDayText:"終日",moreLinkText:e=>"他 "+e+" 件",noEventsText:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekText:"კვ",allDayText:"მთელი დღე",moreLinkText:e=>"+ კიდევ "+e,noEventsText:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekText:"Не",allDayText:"Күні бойы",moreLinkText:e=>"+ тағы "+e,noEventsText:"Көрсету үшін оқиғалар жоқ"},{code:"km",week:{dow:1,doy:4},buttonText:{prev:"មុន",next:"បន្ទាប់",today:"ថ្ងៃនេះ",year:"ឆ្នាំ",month:"ខែ",week:"សប្តាហ៍",day:"ថ្ងៃ",list:"បញ្ជី"},weekText:"សប្តាហ៍",allDayText:"ពេញមួយថ្ងៃ",moreLinkText:"ច្រើនទៀត",noEventsText:"គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekText:"주",allDayText:"종일",moreLinkText:"개",noEventsText:"일정이 없습니다"},{code:"ku",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"پێشتر",next:"دواتر",today:"ئەمڕو",month:"مانگ",week:"هەفتە",day:"ڕۆژ",list:"بەرنامە"},weekText:"هەفتە",allDayText:"هەموو ڕۆژەکە",moreLinkText:"زیاتر",noEventsText:"هیچ ڕووداوێك نیە"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekText:"W",allDayText:"Ganzen Dag",moreLinkText:"méi",noEventsText:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekText:"SAV",allDayText:"Visą dieną",moreLinkText:"daugiau",noEventsText:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekText:"Ned.",allDayText:"Visu dienu",moreLinkText:e=>"+vēl "+e,noEventsText:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekText:"Сед",allDayText:"Цел ден",moreLinkText:e=>"+повеќе "+e,noEventsText:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sepanjang hari",moreLinkText:e=>"masih ada "+e+" acara",noEventsText:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekText:"Uke",weekTextLong:"Uke",allDayText:"Hele dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise",buttonHints:{prev:"Forrige $0",next:"Neste $0",today:"Nåværende $0"},viewHint:"$0 visning",navLinkHint:"Gå til $0",moreLinkHint:e=>`Vis ${e} flere hendelse${1===e?"":"r"}`},{code:"ne",week:{dow:7,doy:1},buttonText:{prev:"अघिल्लो",next:"अर्को",today:"आज",month:"महिना",week:"हप्ता",day:"दिन",list:"सूची"},weekText:"हप्ता",allDayText:"दिनभरि",moreLinkText:"थप लिंक",noEventsText:"देखाउनको लागि कुनै घटनाहरू छैनन्"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",moreLinkText:"extra",noEventsText:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekText:"Veke",allDayText:"Heile dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekText:"Tydz",allDayText:"Cały dzień",moreLinkText:"więcej",noEventsText:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista"},weekText:"Sm",allDayText:"dia inteiro",moreLinkText:e=>"mais +"+e,noEventsText:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekText:"Sem",allDayText:"Todo o dia",moreLinkText:"mais",noEventsText:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekText:"Săpt",allDayText:"Toată ziua",moreLinkText:e=>"+alte "+e,noEventsText:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekText:"Нед",allDayText:"Весь день",moreLinkText:e=>"+ ещё "+e,noEventsText:"Нет событий для отображения"},{code:"si-lk",week:{dow:1,doy:4},buttonText:{prev:"පෙර",next:"පසු",today:"අද",month:"මාසය",week:"සතිය",day:"දවස",list:"ලැයිස්තුව"},weekText:"සති",allDayText:"සියලු",moreLinkText:"තවත්",noEventsText:"මුකුත් නැත"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekText:"Ty",allDayText:"Celý deň",moreLinkText:e=>"+ďalšie: "+e,noEventsText:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekText:"Teden",allDayText:"Ves dan",moreLinkText:"več",noEventsText:"Ni dogodkov za prikaz"},{code:"sm",buttonText:{prev:"Talu ai",next:"Mulimuli atu",today:"Aso nei",month:"Masina",week:"Vaiaso",day:"Aso",list:"Faasologa"},weekText:"Vaiaso",allDayText:"Aso atoa",moreLinkText:"sili atu",noEventsText:"Leai ni mea na tutupu"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekText:"Ja",allDayText:"Gjithë ditën",moreLinkText:e=>"+më tepër "+e,noEventsText:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekText:"Сед",allDayText:"Цео дан",moreLinkText:e=>"+ још "+e,noEventsText:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekText:"Sed",allDayText:"Cеo dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},buttonHints:{prev:e=>"Föregående "+e.toLocaleLowerCase(),next:e=>"Nästa "+e.toLocaleLowerCase(),today:e=>("Program"===e?"Detta":"Denna")+" "+e.toLocaleLowerCase()},viewHint:"$0 vy",navLinkHint:"Gå till $0",moreLinkHint:e=>`Visa ytterligare ${e} händelse${1===e?"":"r"}`,weekText:"v.",weekTextLong:"Vecka",allDayText:"Heldag",moreLinkText:"till",noEventsText:"Inga händelser att visa",closeHint:"Stäng",timeHint:"Klockan",eventHint:"Händelse"},{code:"ta-in",week:{dow:1,doy:4},buttonText:{prev:"முந்தைய",next:"அடுத்தது",today:"இன்று",month:"மாதம்",week:"வாரம்",day:"நாள்",list:"தினசரி அட்டவணை"},weekText:"வாரம்",allDayText:"நாள் முழுவதும்",moreLinkText:e=>"+ மேலும் "+e,noEventsText:"காண்பிக்க நிகழ்வுகள் இல்லை"},{code:"th",week:{dow:1,doy:4},buttonText:{prev:"ก่อนหน้า",next:"ถัดไป",prevYear:"ปีก่อนหน้า",nextYear:"ปีถัดไป",year:"ปี",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"กำหนดการ"},weekText:"สัปดาห์",allDayText:"ตลอดวัน",moreLinkText:"เพิ่มเติม",noEventsText:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekText:"Hf",allDayText:"Tüm gün",moreLinkText:"daha fazla",noEventsText:"Gösterilecek etkinlik yok"},{code:"ug",buttonText:{month:"ئاي",week:"ھەپتە",day:"كۈن",list:"كۈنتەرتىپ"},allDayText:"پۈتۈن كۈن"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekText:"Тиж",allDayText:"Увесь день",moreLinkText:e=>"+ще "+e+"...",noEventsText:"Немає подій для відображення"},{code:"uz",buttonText:{month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",moreLinkText:e=>"+ yana "+e,noEventsText:"Ko'rsatish uchun voqealar yo'q"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekText:"Tu",allDayText:"Cả ngày",moreLinkText:e=>"+ thêm "+e,noEventsText:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekText:"周",allDayText:"全天",moreLinkText:e=>"另外 "+e+" 个",noEventsText:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekText:"周",allDayText:"整天",moreLinkText:"顯示更多",noEventsText:"没有任何活動"}];FullCalendar.globalLocales.push(...o)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/af.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/af.global.js deleted file mode 100644 index c0e08e4e..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/af.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'af', - week: { - dow: 1, - doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar. - }, - buttonText: { - prev: 'Vorige', - next: 'Volgende', - today: 'Vandag', - year: 'Jaar', - month: 'Maand', - week: 'Week', - day: 'Dag', - list: 'Agenda', - }, - allDayText: 'Heeldag', - moreLinkText: 'Addisionele', - noEventsText: 'Daar is geen gebeurtenisse nie', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/af.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/af.global.min.js deleted file mode 100644 index 9a12170f..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/af.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Heeldag",moreLinkText:"Addisionele",noEventsText:"Daar is geen gebeurtenisse nie"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-dz.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-dz.global.js deleted file mode 100644 index 53aee37e..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-dz.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ar-dz', - week: { - dow: 0, - doy: 4, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-dz.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-dz.global.min.js deleted file mode 100644 index 0fce44ba..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-dz.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-dz",week:{dow:0,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-kw.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-kw.global.js deleted file mode 100644 index e8cc58d6..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-kw.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ar-kw', - week: { - dow: 0, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-kw.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-kw.global.min.js deleted file mode 100644 index 29a6009b..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-kw.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-kw",week:{dow:0,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ly.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ly.global.js deleted file mode 100644 index 4b2edce9..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ly.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ar-ly', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ly.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ly.global.min.js deleted file mode 100644 index a0c11cdb..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ly.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-ly",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ma.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ma.global.js deleted file mode 100644 index 6b3084ba..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ma.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ar-ma', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ma.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ma.global.min.js deleted file mode 100644 index 7cb1524d..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-ma.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-ma",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-sa.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-sa.global.js deleted file mode 100644 index a9e07849..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-sa.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ar-sa', - week: { - dow: 0, - doy: 6, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-sa.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-sa.global.min.js deleted file mode 100644 index 23444b19..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-sa.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-sa",week:{dow:0,doy:6},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-tn.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-tn.global.js deleted file mode 100644 index 9942b092..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-tn.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ar-tn', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-tn.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-tn.global.min.js deleted file mode 100644 index 80660744..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar-tn.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-tn",week:{dow:1,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar.global.js deleted file mode 100644 index 92ad6741..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ar', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'السابق', - next: 'التالي', - today: 'اليوم', - month: 'شهر', - week: 'أسبوع', - day: 'يوم', - list: 'أجندة', - }, - weekText: 'أسبوع', - allDayText: 'اليوم كله', - moreLinkText: 'أخرى', - noEventsText: 'أي أحداث لعرض', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar.global.min.js deleted file mode 100644 index 46c0570b..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ar.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/az.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/az.global.js deleted file mode 100644 index b7d1ffca..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/az.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'az', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Əvvəl', - next: 'Sonra', - today: 'Bu Gün', - month: 'Ay', - week: 'Həftə', - day: 'Gün', - list: 'Gündəm', - }, - weekText: 'Həftə', - allDayText: 'Bütün Gün', - moreLinkText(n) { - return '+ daha çox ' + n; - }, - noEventsText: 'Göstərmək üçün hadisə yoxdur', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/az.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/az.global.min.js deleted file mode 100644 index 1ba9ce54..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/az.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"az",week:{dow:1,doy:4},buttonText:{prev:"Əvvəl",next:"Sonra",today:"Bu Gün",month:"Ay",week:"Həftə",day:"Gün",list:"Gündəm"},weekText:"Həftə",allDayText:"Bütün Gün",moreLinkText:e=>"+ daha çox "+e,noEventsText:"Göstərmək üçün hadisə yoxdur"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bg.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bg.global.js deleted file mode 100644 index a0137555..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bg.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'bg', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'назад', - next: 'напред', - today: 'днес', - month: 'Месец', - week: 'Седмица', - day: 'Ден', - list: 'График', - }, - allDayText: 'Цял ден', - moreLinkText(n) { - return '+още ' + n; - }, - noEventsText: 'Няма събития за показване', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bg.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bg.global.min.js deleted file mode 100644 index 8979c431..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bg.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",moreLinkText:e=>"+още "+e,noEventsText:"Няма събития за показване"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bn.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bn.global.js deleted file mode 100644 index af7fe225..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bn.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'bn', - week: { - dow: 0, - doy: 6, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'পেছনে', - next: 'সামনে', - today: 'আজ', - month: 'মাস', - week: 'সপ্তাহ', - day: 'দিন', - list: 'তালিকা', - }, - weekText: 'সপ্তাহ', - allDayText: 'সারাদিন', - moreLinkText(n) { - return '+অন্যান্য ' + n; - }, - noEventsText: 'কোনো ইভেন্ট নেই', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bn.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bn.global.min.js deleted file mode 100644 index 251e3d7d..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bn.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"bn",week:{dow:0,doy:6},buttonText:{prev:"পেছনে",next:"সামনে",today:"আজ",month:"মাস",week:"সপ্তাহ",day:"দিন",list:"তালিকা"},weekText:"সপ্তাহ",allDayText:"সারাদিন",moreLinkText:e=>"+অন্যান্য "+e,noEventsText:"কোনো ইভেন্ট নেই"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bs.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bs.global.js deleted file mode 100644 index 1961791d..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bs.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'bs', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Prošli', - next: 'Sljedeći', - today: 'Danas', - month: 'Mjesec', - week: 'Sedmica', - day: 'Dan', - list: 'Raspored', - }, - weekText: 'Sed', - allDayText: 'Cijeli dan', - moreLinkText(n) { - return '+ još ' + n; - }, - noEventsText: 'Nema događaja za prikazivanje', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bs.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bs.global.min.js deleted file mode 100644 index 6ad4ed9c..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/bs.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var a={code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekText:"Sed",allDayText:"Cijeli dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nema događaja za prikazivanje"};FullCalendar.globalLocales.push(a)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ca.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ca.global.js deleted file mode 100644 index 7cf56720..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ca.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ca', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Anterior', - next: 'Següent', - today: 'Avui', - month: 'Mes', - week: 'Setmana', - day: 'Dia', - list: 'Agenda', - }, - weekText: 'Set', - allDayText: 'Tot el dia', - moreLinkText: 'més', - noEventsText: 'No hi ha esdeveniments per mostrar', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ca.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ca.global.min.js deleted file mode 100644 index 30207ff2..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ca.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekText:"Set",allDayText:"Tot el dia",moreLinkText:"més",noEventsText:"No hi ha esdeveniments per mostrar"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cs.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cs.global.js deleted file mode 100644 index e112cbf8..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cs.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'cs', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Dříve', - next: 'Později', - today: 'Nyní', - month: 'Měsíc', - week: 'Týden', - day: 'Den', - list: 'Agenda', - }, - weekText: 'Týd', - allDayText: 'Celý den', - moreLinkText(n) { - return '+další: ' + n; - }, - noEventsText: 'Žádné akce k zobrazení', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cs.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cs.global.min.js deleted file mode 100644 index 01d5b6ad..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cs.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var n={code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekText:"Týd",allDayText:"Celý den",moreLinkText:e=>"+další: "+e,noEventsText:"Žádné akce k zobrazení"};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cy.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cy.global.js deleted file mode 100644 index 65b3135c..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cy.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'cy', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Blaenorol', - next: 'Nesaf', - today: 'Heddiw', - year: 'Blwyddyn', - month: 'Mis', - week: 'Wythnos', - day: 'Dydd', - list: 'Rhestr', - }, - weekText: 'Wythnos', - allDayText: 'Trwy\'r dydd', - moreLinkText: 'Mwy', - noEventsText: 'Dim digwyddiadau', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cy.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cy.global.min.js deleted file mode 100644 index 719e1e39..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/cy.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"cy",week:{dow:1,doy:4},buttonText:{prev:"Blaenorol",next:"Nesaf",today:"Heddiw",year:"Blwyddyn",month:"Mis",week:"Wythnos",day:"Dydd",list:"Rhestr"},weekText:"Wythnos",allDayText:"Trwy'r dydd",moreLinkText:"Mwy",noEventsText:"Dim digwyddiadau"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/da.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/da.global.js deleted file mode 100644 index 25d236d7..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/da.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'da', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Forrige', - next: 'Næste', - today: 'I dag', - month: 'Måned', - week: 'Uge', - day: 'Dag', - list: 'Agenda', - }, - weekText: 'Uge', - allDayText: 'Hele dagen', - moreLinkText: 'flere', - noEventsText: 'Ingen arrangementer at vise', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/da.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/da.global.min.js deleted file mode 100644 index 3881fb66..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/da.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekText:"Uge",allDayText:"Hele dagen",moreLinkText:"flere",noEventsText:"Ingen arrangementer at vise"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de-at.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de-at.global.js deleted file mode 100644 index a4f190d0..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de-at.global.js +++ /dev/null @@ -1,69 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - function affix(buttonText) { - return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' : - buttonText === 'Jahr' ? 's' : ''; - } - var locale = { - code: 'de-at', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Zurück', - next: 'Vor', - today: 'Heute', - year: 'Jahr', - month: 'Monat', - week: 'Woche', - day: 'Tag', - list: 'Terminübersicht', - }, - weekText: 'KW', - weekTextLong: 'Woche', - allDayText: 'Ganztägig', - moreLinkText(n) { - return '+ weitere ' + n; - }, - noEventsText: 'Keine Ereignisse anzuzeigen', - buttonHints: { - prev(buttonText) { - return `Vorherige${affix(buttonText)} ${buttonText}`; - }, - next(buttonText) { - return `Nächste${affix(buttonText)} ${buttonText}`; - }, - today(buttonText) { - // → Heute, Diese Woche, Dieser Monat, Dieses Jahr - if (buttonText === 'Tag') { - return 'Heute'; - } - return `Diese${affix(buttonText)} ${buttonText}`; - }, - }, - viewHint(buttonText) { - // → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht - const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es'; - return buttonText + glue + 'ansicht'; - }, - navLinkHint: 'Gehe zu $0', - moreLinkHint(eventCnt) { - return 'Zeige ' + (eventCnt === 1 ? - 'ein weiteres Ereignis' : - eventCnt + ' weitere Ereignisse'); - }, - closeHint: 'Schließen', - timeHint: 'Uhrzeit', - eventHint: 'Ereignis', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de-at.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de-at.global.min.js deleted file mode 100644 index 1ee26425..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de-at.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";function t(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}var n={code:"de-at",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"Ganztägig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${t(e)} ${e}`,next:e=>`Nächste${t(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${t(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"Schließen",timeHint:"Uhrzeit",eventHint:"Ereignis"};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de.global.js deleted file mode 100644 index 09ea2683..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de.global.js +++ /dev/null @@ -1,69 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - function affix(buttonText) { - return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' : - buttonText === 'Jahr' ? 's' : ''; - } - var locale = { - code: 'de', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Zurück', - next: 'Vor', - today: 'Heute', - year: 'Jahr', - month: 'Monat', - week: 'Woche', - day: 'Tag', - list: 'Terminübersicht', - }, - weekText: 'KW', - weekTextLong: 'Woche', - allDayText: 'Ganztägig', - moreLinkText(n) { - return '+ weitere ' + n; - }, - noEventsText: 'Keine Ereignisse anzuzeigen', - buttonHints: { - prev(buttonText) { - return `Vorherige${affix(buttonText)} ${buttonText}`; - }, - next(buttonText) { - return `Nächste${affix(buttonText)} ${buttonText}`; - }, - today(buttonText) { - // → Heute, Diese Woche, Dieser Monat, Dieses Jahr - if (buttonText === 'Tag') { - return 'Heute'; - } - return `Diese${affix(buttonText)} ${buttonText}`; - }, - }, - viewHint(buttonText) { - // → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht - const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es'; - return buttonText + glue + 'ansicht'; - }, - navLinkHint: 'Gehe zu $0', - moreLinkHint(eventCnt) { - return 'Zeige ' + (eventCnt === 1 ? - 'ein weiteres Ereignis' : - eventCnt + ' weitere Ereignisse'); - }, - closeHint: 'Schließen', - timeHint: 'Uhrzeit', - eventHint: 'Ereignis', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de.global.min.js deleted file mode 100644 index 0e9131e6..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/de.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";function t(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}var n={code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"Ganztägig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${t(e)} ${e}`,next:e=>`Nächste${t(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${t(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"Schließen",timeHint:"Uhrzeit",eventHint:"Ereignis"};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/el.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/el.global.js deleted file mode 100644 index 0d9e32ad..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/el.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'el', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4st is the first week of the year. - }, - buttonText: { - prev: 'Προηγούμενος', - next: 'Επόμενος', - today: 'Σήμερα', - month: 'Μήνας', - week: 'Εβδομάδα', - day: 'Ημέρα', - list: 'Ατζέντα', - }, - weekText: 'Εβδ', - allDayText: 'Ολοήμερο', - moreLinkText: 'περισσότερα', - noEventsText: 'Δεν υπάρχουν γεγονότα προς εμφάνιση', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/el.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/el.global.min.js deleted file mode 100644 index edb014b0..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/el.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekText:"Εβδ",allDayText:"Ολοήμερο",moreLinkText:"περισσότερα",noEventsText:"Δεν υπάρχουν γεγονότα προς εμφάνιση"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-au.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-au.global.js deleted file mode 100644 index 6238197f..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-au.global.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'en-au', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonHints: { - prev: 'Previous $0', - next: 'Next $0', - today: 'This $0', - }, - viewHint: '$0 view', - navLinkHint: 'Go to $0', - moreLinkHint(eventCnt) { - return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`; - }, - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-au.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-au.global.min.js deleted file mode 100644 index 568f129b..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-au.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var n={code:"en-au",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-gb.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-gb.global.js deleted file mode 100644 index 3db6ad1c..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-gb.global.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'en-gb', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonHints: { - prev: 'Previous $0', - next: 'Next $0', - today: 'This $0', - }, - viewHint: '$0 view', - navLinkHint: 'Go to $0', - moreLinkHint(eventCnt) { - return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`; - }, - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-gb.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-gb.global.min.js deleted file mode 100644 index 0e4b90b6..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-gb.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var n={code:"en-gb",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-nz.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-nz.global.js deleted file mode 100644 index c9d452d6..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-nz.global.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'en-nz', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonHints: { - prev: 'Previous $0', - next: 'Next $0', - today: 'This $0', - }, - viewHint: '$0 view', - navLinkHint: 'Go to $0', - moreLinkHint(eventCnt) { - return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`; - }, - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-nz.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-nz.global.min.js deleted file mode 100644 index 1e6e16db..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/en-nz.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var n={code:"en-nz",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eo.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eo.global.js deleted file mode 100644 index 72362777..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eo.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'eo', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Antaŭa', - next: 'Sekva', - today: 'Hodiaŭ', - month: 'Monato', - week: 'Semajno', - day: 'Tago', - list: 'Tagordo', - }, - weekText: 'Sm', - allDayText: 'Tuta tago', - moreLinkText: 'pli', - noEventsText: 'Neniuj eventoj por montri', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eo.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eo.global.min.js deleted file mode 100644 index 4b44f0d9..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eo.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"eo",week:{dow:1,doy:4},buttonText:{prev:"Antaŭa",next:"Sekva",today:"Hodiaŭ",month:"Monato",week:"Semajno",day:"Tago",list:"Tagordo"},weekText:"Sm",allDayText:"Tuta tago",moreLinkText:"pli",noEventsText:"Neniuj eventoj por montri"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es-us.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es-us.global.js deleted file mode 100644 index e8dd2eb8..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es-us.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'es', - week: { - dow: 0, - doy: 6, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Ant', - next: 'Sig', - today: 'Hoy', - month: 'Mes', - week: 'Semana', - day: 'Día', - list: 'Agenda', - }, - weekText: 'Sm', - allDayText: 'Todo el día', - moreLinkText: 'más', - noEventsText: 'No hay eventos para mostrar', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es-us.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es-us.global.min.js deleted file mode 100644 index 85781620..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es-us.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekText:"Sm",allDayText:"Todo el día",moreLinkText:"más",noEventsText:"No hay eventos para mostrar"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es.global.js deleted file mode 100644 index 6c5c2470..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es.global.js +++ /dev/null @@ -1,51 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'es', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Ant', - next: 'Sig', - today: 'Hoy', - month: 'Mes', - week: 'Semana', - day: 'Día', - list: 'Agenda', - }, - buttonHints: { - prev: '$0 antes', - next: '$0 siguiente', - today(buttonText) { - return (buttonText === 'Día') ? 'Hoy' : - ((buttonText === 'Semana') ? 'Esta' : 'Este') + ' ' + buttonText.toLocaleLowerCase(); - }, - }, - viewHint(buttonText) { - return 'Vista ' + (buttonText === 'Semana' ? 'de la' : 'del') + ' ' + buttonText.toLocaleLowerCase(); - }, - weekText: 'Sm', - weekTextLong: 'Semana', - allDayText: 'Todo el día', - moreLinkText: 'más', - moreLinkHint(eventCnt) { - return `Mostrar ${eventCnt} eventos más`; - }, - noEventsText: 'No hay eventos para mostrar', - navLinkHint: 'Ir al $0', - closeHint: 'Cerrar', - timeHint: 'La hora', - eventHint: 'Evento', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es.global.min.js deleted file mode 100644 index 25c3c07d..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/es.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},buttonHints:{prev:"$0 antes",next:"$0 siguiente",today:e=>"Día"===e?"Hoy":("Semana"===e?"Esta":"Este")+" "+e.toLocaleLowerCase()},viewHint:e=>"Vista "+("Semana"===e?"de la":"del")+" "+e.toLocaleLowerCase(),weekText:"Sm",weekTextLong:"Semana",allDayText:"Todo el día",moreLinkText:"más",moreLinkHint:e=>`Mostrar ${e} eventos más`,noEventsText:"No hay eventos para mostrar",navLinkHint:"Ir al $0",closeHint:"Cerrar",timeHint:"La hora",eventHint:"Evento"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/et.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/et.global.js deleted file mode 100644 index eb21257b..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/et.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'et', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Eelnev', - next: 'Järgnev', - today: 'Täna', - month: 'Kuu', - week: 'Nädal', - day: 'Päev', - list: 'Päevakord', - }, - weekText: 'näd', - allDayText: 'Kogu päev', - moreLinkText(n) { - return '+ veel ' + n; - }, - noEventsText: 'Kuvamiseks puuduvad sündmused', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/et.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/et.global.min.js deleted file mode 100644 index 873db817..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/et.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekText:"näd",allDayText:"Kogu päev",moreLinkText:e=>"+ veel "+e,noEventsText:"Kuvamiseks puuduvad sündmused"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eu.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eu.global.js deleted file mode 100644 index d8b547db..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eu.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'eu', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Aur', - next: 'Hur', - today: 'Gaur', - month: 'Hilabetea', - week: 'Astea', - day: 'Eguna', - list: 'Agenda', - }, - weekText: 'As', - allDayText: 'Egun osoa', - moreLinkText: 'gehiago', - noEventsText: 'Ez dago ekitaldirik erakusteko', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eu.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eu.global.min.js deleted file mode 100644 index 18984778..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/eu.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekText:"As",allDayText:"Egun osoa",moreLinkText:"gehiago",noEventsText:"Ez dago ekitaldirik erakusteko"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fa.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fa.global.js deleted file mode 100644 index f74d7236..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fa.global.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'fa', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'قبلی', - next: 'بعدی', - today: 'امروز', - month: 'ماه', - week: 'هفته', - day: 'روز', - list: 'برنامه', - }, - weekText: 'هف', - allDayText: 'تمام روز', - moreLinkText(n) { - return 'بیش از ' + n; - }, - noEventsText: 'هیچ رویدادی به نمایش', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fa.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fa.global.min.js deleted file mode 100644 index 0817c0c9..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fa.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"fa",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekText:"هف",allDayText:"تمام روز",moreLinkText:e=>"بیش از "+e,noEventsText:"هیچ رویدادی به نمایش"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fi.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fi.global.js deleted file mode 100644 index 5fd145c4..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fi.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'fi', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Edellinen', - next: 'Seuraava', - today: 'Tänään', - month: 'Kuukausi', - week: 'Viikko', - day: 'Päivä', - list: 'Tapahtumat', - }, - weekText: 'Vk', - allDayText: 'Koko päivä', - moreLinkText: 'lisää', - noEventsText: 'Ei näytettäviä tapahtumia', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fi.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fi.global.min.js deleted file mode 100644 index 8bf28e58..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fi.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekText:"Vk",allDayText:"Koko päivä",moreLinkText:"lisää",noEventsText:"Ei näytettäviä tapahtumia"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ca.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ca.global.js deleted file mode 100644 index deb14ca8..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ca.global.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'fr', - buttonText: { - prev: 'Précédent', - next: 'Suivant', - today: 'Aujourd\'hui', - year: 'Année', - month: 'Mois', - week: 'Semaine', - day: 'Jour', - list: 'Mon planning', - }, - weekText: 'Sem.', - allDayText: 'Toute la journée', - moreLinkText: 'en plus', - noEventsText: 'Aucun événement à afficher', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ca.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ca.global.min.js deleted file mode 100644 index 8eb53b57..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ca.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ch.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ch.global.js deleted file mode 100644 index 8b88d43a..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ch.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'fr-ch', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Précédent', - next: 'Suivant', - today: 'Courant', - year: 'Année', - month: 'Mois', - week: 'Semaine', - day: 'Jour', - list: 'Mon planning', - }, - weekText: 'Sm', - allDayText: 'Toute la journée', - moreLinkText: 'en plus', - noEventsText: 'Aucun événement à afficher', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ch.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ch.global.min.js deleted file mode 100644 index 1289aa36..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr-ch.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sm",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr.global.js deleted file mode 100644 index 88d47f98..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'fr', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Précédent', - next: 'Suivant', - today: 'Aujourd\'hui', - year: 'Année', - month: 'Mois', - week: 'Semaine', - day: 'Jour', - list: 'Planning', - }, - weekText: 'Sem.', - allDayText: 'Toute la journée', - moreLinkText: 'en plus', - noEventsText: 'Aucun événement à afficher', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr.global.min.js deleted file mode 100644 index cec96379..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/fr.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/gl.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/gl.global.js deleted file mode 100644 index 1e8b3925..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/gl.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'gl', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Ant', - next: 'Seg', - today: 'Hoxe', - month: 'Mes', - week: 'Semana', - day: 'Día', - list: 'Axenda', - }, - weekText: 'Sm', - allDayText: 'Todo o día', - moreLinkText: 'máis', - noEventsText: 'Non hai eventos para amosar', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/gl.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/gl.global.min.js deleted file mode 100644 index d46da07d..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/gl.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekText:"Sm",allDayText:"Todo o día",moreLinkText:"máis",noEventsText:"Non hai eventos para amosar"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/he.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/he.global.js deleted file mode 100644 index 52069944..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/he.global.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'he', - direction: 'rtl', - buttonText: { - prev: 'הקודם', - next: 'הבא', - today: 'היום', - month: 'חודש', - week: 'שבוע', - day: 'יום', - list: 'סדר יום', - }, - allDayText: 'כל היום', - moreLinkText: 'אחר', - noEventsText: 'אין אירועים להצגה', - weekText: 'שבוע', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/he.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/he.global.min.js deleted file mode 100644 index 306812bb..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/he.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"he",direction:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",moreLinkText:"אחר",noEventsText:"אין אירועים להצגה",weekText:"שבוע"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hi.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hi.global.js deleted file mode 100644 index 6331a5b1..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hi.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'hi', - week: { - dow: 0, - doy: 6, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'पिछला', - next: 'अगला', - today: 'आज', - month: 'महीना', - week: 'सप्ताह', - day: 'दिन', - list: 'कार्यसूची', - }, - weekText: 'हफ्ता', - allDayText: 'सभी दिन', - moreLinkText(n) { - return '+अधिक ' + n; - }, - noEventsText: 'कोई घटनाओं को प्रदर्शित करने के लिए', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hi.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hi.global.min.js deleted file mode 100644 index 8330ce66..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hi.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekText:"हफ्ता",allDayText:"सभी दिन",moreLinkText:e=>"+अधिक "+e,noEventsText:"कोई घटनाओं को प्रदर्शित करने के लिए"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hr.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hr.global.js deleted file mode 100644 index f9099ff2..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hr.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'hr', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Prijašnji', - next: 'Sljedeći', - today: 'Danas', - month: 'Mjesec', - week: 'Tjedan', - day: 'Dan', - list: 'Raspored', - }, - weekText: 'Tje', - allDayText: 'Cijeli dan', - moreLinkText(n) { - return '+ još ' + n; - }, - noEventsText: 'Nema događaja za prikaz', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hr.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hr.global.min.js deleted file mode 100644 index 51b52be8..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hr.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var a={code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekText:"Tje",allDayText:"Cijeli dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nema događaja za prikaz"};FullCalendar.globalLocales.push(a)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hu.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hu.global.js deleted file mode 100644 index ea3d08ba..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hu.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'hu', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'vissza', - next: 'előre', - today: 'ma', - month: 'Hónap', - week: 'Hét', - day: 'Nap', - list: 'Lista', - }, - weekText: 'Hét', - allDayText: 'Egész nap', - moreLinkText: 'további', - noEventsText: 'Nincs megjeleníthető esemény', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hu.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hu.global.min.js deleted file mode 100644 index 387710a6..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hu.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Lista"},weekText:"Hét",allDayText:"Egész nap",moreLinkText:"további",noEventsText:"Nincs megjeleníthető esemény"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hy-am.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hy-am.global.js deleted file mode 100644 index ce70a9c1..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hy-am.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'hy-am', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Նախորդ', - next: 'Հաջորդ', - today: 'Այսօր', - month: 'Ամիս', - week: 'Շաբաթ', - day: 'Օր', - list: 'Օրվա ցուցակ', - }, - weekText: 'Շաբ', - allDayText: 'Ամբողջ օր', - moreLinkText(n) { - return '+ ևս ' + n; - }, - noEventsText: 'Բացակայում է իրադարձությունը ցուցադրելու', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hy-am.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hy-am.global.min.js deleted file mode 100644 index 5f8bb900..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/hy-am.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"hy-am",week:{dow:1,doy:4},buttonText:{prev:"Նախորդ",next:"Հաջորդ",today:"Այսօր",month:"Ամիս",week:"Շաբաթ",day:"Օր",list:"Օրվա ցուցակ"},weekText:"Շաբ",allDayText:"Ամբողջ օր",moreLinkText:e=>"+ ևս "+e,noEventsText:"Բացակայում է իրադարձությունը ցուցադրելու"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/id.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/id.global.js deleted file mode 100644 index 880d1f73..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/id.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'id', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'mundur', - next: 'maju', - today: 'hari ini', - month: 'Bulan', - week: 'Minggu', - day: 'Hari', - list: 'Agenda', - }, - weekText: 'Mg', - allDayText: 'Sehari penuh', - moreLinkText: 'lebih', - noEventsText: 'Tidak ada acara untuk ditampilkan', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/id.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/id.global.min.js deleted file mode 100644 index 396f8574..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/id.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sehari penuh",moreLinkText:"lebih",noEventsText:"Tidak ada acara untuk ditampilkan"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/is.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/is.global.js deleted file mode 100644 index 499005cd..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/is.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'is', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Fyrri', - next: 'Næsti', - today: 'Í dag', - month: 'Mánuður', - week: 'Vika', - day: 'Dagur', - list: 'Dagskrá', - }, - weekText: 'Vika', - allDayText: 'Allan daginn', - moreLinkText: 'meira', - noEventsText: 'Engir viðburðir til að sýna', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/is.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/is.global.min.js deleted file mode 100644 index 3fa76376..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/is.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekText:"Vika",allDayText:"Allan daginn",moreLinkText:"meira",noEventsText:"Engir viðburðir til að sýna"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/it.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/it.global.js deleted file mode 100644 index 351f5d34..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/it.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'it', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Prec', - next: 'Succ', - today: 'Oggi', - month: 'Mese', - week: 'Settimana', - day: 'Giorno', - list: 'Agenda', - }, - weekText: 'Sm', - allDayText: 'Tutto il giorno', - moreLinkText(n) { - return '+altri ' + n; - }, - noEventsText: 'Non ci sono eventi da visualizzare', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/it.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/it.global.min.js deleted file mode 100644 index bf0366cf..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/it.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekText:"Sm",allDayText:"Tutto il giorno",moreLinkText:e=>"+altri "+e,noEventsText:"Non ci sono eventi da visualizzare"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ja.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ja.global.js deleted file mode 100644 index 5cc1fc33..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ja.global.js +++ /dev/null @@ -1,30 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ja', - buttonText: { - prev: '前', - next: '次', - today: '今日', - month: '月', - week: '週', - day: '日', - list: '予定リスト', - }, - weekText: '週', - allDayText: '終日', - moreLinkText(n) { - return '他 ' + n + ' 件'; - }, - noEventsText: '表示する予定はありません', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ja.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ja.global.min.js deleted file mode 100644 index 53232693..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ja.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekText:"週",allDayText:"終日",moreLinkText:e=>"他 "+e+" 件",noEventsText:"表示する予定はありません"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ka.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ka.global.js deleted file mode 100644 index 59d920ac..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ka.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ka', - week: { - dow: 1, - doy: 7, - }, - buttonText: { - prev: 'წინა', - next: 'შემდეგი', - today: 'დღეს', - month: 'თვე', - week: 'კვირა', - day: 'დღე', - list: 'დღის წესრიგი', - }, - weekText: 'კვ', - allDayText: 'მთელი დღე', - moreLinkText(n) { - return '+ კიდევ ' + n; - }, - noEventsText: 'ღონისძიებები არ არის', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ka.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ka.global.min.js deleted file mode 100644 index 52993d3e..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ka.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekText:"კვ",allDayText:"მთელი დღე",moreLinkText:e=>"+ კიდევ "+e,noEventsText:"ღონისძიებები არ არის"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/kk.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/kk.global.js deleted file mode 100644 index 537adde2..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/kk.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'kk', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Алдыңғы', - next: 'Келесі', - today: 'Бүгін', - month: 'Ай', - week: 'Апта', - day: 'Күн', - list: 'Күн тәртібі', - }, - weekText: 'Не', - allDayText: 'Күні бойы', - moreLinkText(n) { - return '+ тағы ' + n; - }, - noEventsText: 'Көрсету үшін оқиғалар жоқ', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/kk.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/kk.global.min.js deleted file mode 100644 index 88febbea..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/kk.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekText:"Не",allDayText:"Күні бойы",moreLinkText:e=>"+ тағы "+e,noEventsText:"Көрсету үшін оқиғалар жоқ"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/km.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/km.global.js deleted file mode 100644 index bedf7d5e..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/km.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'km', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'មុន', - next: 'បន្ទាប់', - today: 'ថ្ងៃនេះ', - year: 'ឆ្នាំ', - month: 'ខែ', - week: 'សប្តាហ៍', - day: 'ថ្ងៃ', - list: 'បញ្ជី', - }, - weekText: 'សប្តាហ៍', - allDayText: 'ពេញមួយថ្ងៃ', - moreLinkText: 'ច្រើនទៀត', - noEventsText: 'គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/km.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/km.global.min.js deleted file mode 100644 index 52254230..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/km.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"km",week:{dow:1,doy:4},buttonText:{prev:"មុន",next:"បន្ទាប់",today:"ថ្ងៃនេះ",year:"ឆ្នាំ",month:"ខែ",week:"សប្តាហ៍",day:"ថ្ងៃ",list:"បញ្ជី"},weekText:"សប្តាហ៍",allDayText:"ពេញមួយថ្ងៃ",moreLinkText:"ច្រើនទៀត",noEventsText:"គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ko.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ko.global.js deleted file mode 100644 index adc846bf..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ko.global.js +++ /dev/null @@ -1,28 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ko', - buttonText: { - prev: '이전달', - next: '다음달', - today: '오늘', - month: '월', - week: '주', - day: '일', - list: '일정목록', - }, - weekText: '주', - allDayText: '종일', - moreLinkText: '개', - noEventsText: '일정이 없습니다', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ko.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ko.global.min.js deleted file mode 100644 index 299b4f86..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ko.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekText:"주",allDayText:"종일",moreLinkText:"개",noEventsText:"일정이 없습니다"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ku.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ku.global.js deleted file mode 100644 index 2070f719..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ku.global.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ku', - week: { - dow: 6, - doy: 12, // The week that contains Jan 1st is the first week of the year. - }, - direction: 'rtl', - buttonText: { - prev: 'پێشتر', - next: 'دواتر', - today: 'ئەمڕو', - month: 'مانگ', - week: 'هەفتە', - day: 'ڕۆژ', - list: 'بەرنامە', - }, - weekText: 'هەفتە', - allDayText: 'هەموو ڕۆژەکە', - moreLinkText: 'زیاتر', - noEventsText: 'هیچ ڕووداوێك نیە', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ku.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ku.global.min.js deleted file mode 100644 index 05d51d15..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ku.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ku",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"پێشتر",next:"دواتر",today:"ئەمڕو",month:"مانگ",week:"هەفتە",day:"ڕۆژ",list:"بەرنامە"},weekText:"هەفتە",allDayText:"هەموو ڕۆژەکە",moreLinkText:"زیاتر",noEventsText:"هیچ ڕووداوێك نیە"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lb.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lb.global.js deleted file mode 100644 index d1f50613..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lb.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'lb', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Zréck', - next: 'Weider', - today: 'Haut', - month: 'Mount', - week: 'Woch', - day: 'Dag', - list: 'Terminiwwersiicht', - }, - weekText: 'W', - allDayText: 'Ganzen Dag', - moreLinkText: 'méi', - noEventsText: 'Nee Evenementer ze affichéieren', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lb.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lb.global.min.js deleted file mode 100644 index c1e43de7..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lb.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekText:"W",allDayText:"Ganzen Dag",moreLinkText:"méi",noEventsText:"Nee Evenementer ze affichéieren"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lt.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lt.global.js deleted file mode 100644 index b0806005..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lt.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'lt', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Atgal', - next: 'Pirmyn', - today: 'Šiandien', - month: 'Mėnuo', - week: 'Savaitė', - day: 'Diena', - list: 'Darbotvarkė', - }, - weekText: 'SAV', - allDayText: 'Visą dieną', - moreLinkText: 'daugiau', - noEventsText: 'Nėra įvykių rodyti', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lt.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lt.global.min.js deleted file mode 100644 index 54ef6a9a..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lt.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekText:"SAV",allDayText:"Visą dieną",moreLinkText:"daugiau",noEventsText:"Nėra įvykių rodyti"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lv.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lv.global.js deleted file mode 100644 index 3a99acac..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lv.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'lv', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Iepr.', - next: 'Nāk.', - today: 'Šodien', - month: 'Mēnesis', - week: 'Nedēļa', - day: 'Diena', - list: 'Dienas kārtība', - }, - weekText: 'Ned.', - allDayText: 'Visu dienu', - moreLinkText(n) { - return '+vēl ' + n; - }, - noEventsText: 'Nav notikumu', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lv.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lv.global.min.js deleted file mode 100644 index 911fc8b3..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/lv.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekText:"Ned.",allDayText:"Visu dienu",moreLinkText:e=>"+vēl "+e,noEventsText:"Nav notikumu"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/mk.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/mk.global.js deleted file mode 100644 index 78994ca2..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/mk.global.js +++ /dev/null @@ -1,30 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'mk', - buttonText: { - prev: 'претходно', - next: 'следно', - today: 'Денес', - month: 'Месец', - week: 'Недела', - day: 'Ден', - list: 'График', - }, - weekText: 'Сед', - allDayText: 'Цел ден', - moreLinkText(n) { - return '+повеќе ' + n; - }, - noEventsText: 'Нема настани за прикажување', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/mk.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/mk.global.min.js deleted file mode 100644 index 82109c5f..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/mk.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekText:"Сед",allDayText:"Цел ден",moreLinkText:e=>"+повеќе "+e,noEventsText:"Нема настани за прикажување"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ms.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ms.global.js deleted file mode 100644 index 22394cc8..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ms.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ms', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Sebelum', - next: 'Selepas', - today: 'hari ini', - month: 'Bulan', - week: 'Minggu', - day: 'Hari', - list: 'Agenda', - }, - weekText: 'Mg', - allDayText: 'Sepanjang hari', - moreLinkText(n) { - return 'masih ada ' + n + ' acara'; - }, - noEventsText: 'Tiada peristiwa untuk dipaparkan', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ms.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ms.global.min.js deleted file mode 100644 index 127d31df..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ms.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(a){"use strict";var e={code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sepanjang hari",moreLinkText:a=>"masih ada "+a+" acara",noEventsText:"Tiada peristiwa untuk dipaparkan"};FullCalendar.globalLocales.push(e)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nb.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nb.global.js deleted file mode 100644 index fa9ca75a..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nb.global.js +++ /dev/null @@ -1,43 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'nb', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Forrige', - next: 'Neste', - today: 'I dag', - month: 'Måned', - week: 'Uke', - day: 'Dag', - list: 'Agenda', - }, - weekText: 'Uke', - weekTextLong: 'Uke', - allDayText: 'Hele dagen', - moreLinkText: 'til', - noEventsText: 'Ingen hendelser å vise', - buttonHints: { - prev: 'Forrige $0', - next: 'Neste $0', - today: 'Nåværende $0', - }, - viewHint: '$0 visning', - navLinkHint: 'Gå til $0', - moreLinkHint(eventCnt) { - return `Vis ${eventCnt} flere hendelse${eventCnt === 1 ? '' : 'r'}`; - }, - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nb.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nb.global.min.js deleted file mode 100644 index 072cc0a3..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nb.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var n={code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekText:"Uke",weekTextLong:"Uke",allDayText:"Hele dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise",buttonHints:{prev:"Forrige $0",next:"Neste $0",today:"Nåværende $0"},viewHint:"$0 visning",navLinkHint:"Gå til $0",moreLinkHint:e=>`Vis ${e} flere hendelse${1===e?"":"r"}`};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ne.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ne.global.js deleted file mode 100644 index d46a19a4..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ne.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ne', - week: { - dow: 7, - doy: 1, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'अघिल्लो', - next: 'अर्को', - today: 'आज', - month: 'महिना', - week: 'हप्ता', - day: 'दिन', - list: 'सूची', - }, - weekText: 'हप्ता', - allDayText: 'दिनभरि', - moreLinkText: 'थप लिंक', - noEventsText: 'देखाउनको लागि कुनै घटनाहरू छैनन्', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ne.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ne.global.min.js deleted file mode 100644 index 1be88feb..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ne.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"ne",week:{dow:7,doy:1},buttonText:{prev:"अघिल्लो",next:"अर्को",today:"आज",month:"महिना",week:"हप्ता",day:"दिन",list:"सूची"},weekText:"हप्ता",allDayText:"दिनभरि",moreLinkText:"थप लिंक",noEventsText:"देखाउनको लागि कुनै घटनाहरू छैनन्"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nl.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nl.global.js deleted file mode 100644 index 6d97bf3c..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nl.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'nl', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Vorige', - next: 'Volgende', - today: 'Vandaag', - year: 'Jaar', - month: 'Maand', - week: 'Week', - day: 'Dag', - list: 'Agenda', - }, - allDayText: 'Hele dag', - moreLinkText: 'extra', - noEventsText: 'Geen evenementen om te laten zien', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nl.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nl.global.min.js deleted file mode 100644 index 5001f81c..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nl.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",moreLinkText:"extra",noEventsText:"Geen evenementen om te laten zien"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nn.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nn.global.js deleted file mode 100644 index e30ab831..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nn.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'nn', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Førre', - next: 'Neste', - today: 'I dag', - month: 'Månad', - week: 'Veke', - day: 'Dag', - list: 'Agenda', - }, - weekText: 'Veke', - allDayText: 'Heile dagen', - moreLinkText: 'til', - noEventsText: 'Ingen hendelser å vise', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nn.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nn.global.min.js deleted file mode 100644 index 8e3f65c9..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/nn.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekText:"Veke",allDayText:"Heile dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pl.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pl.global.js deleted file mode 100644 index 32b7ef4b..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pl.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'pl', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Poprzedni', - next: 'Następny', - today: 'Dziś', - month: 'Miesiąc', - week: 'Tydzień', - day: 'Dzień', - list: 'Plan dnia', - }, - weekText: 'Tydz', - allDayText: 'Cały dzień', - moreLinkText: 'więcej', - noEventsText: 'Brak wydarzeń do wyświetlenia', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pl.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pl.global.min.js deleted file mode 100644 index 66d31452..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pl.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekText:"Tydz",allDayText:"Cały dzień",moreLinkText:"więcej",noEventsText:"Brak wydarzeń do wyświetlenia"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt-br.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt-br.global.js deleted file mode 100644 index 37f6ea74..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt-br.global.js +++ /dev/null @@ -1,30 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'pt-br', - buttonText: { - prev: 'Anterior', - next: 'Próximo', - today: 'Hoje', - month: 'Mês', - week: 'Semana', - day: 'Dia', - list: 'Lista', - }, - weekText: 'Sm', - allDayText: 'dia inteiro', - moreLinkText(n) { - return 'mais +' + n; - }, - noEventsText: 'Não há eventos para mostrar', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt-br.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt-br.global.min.js deleted file mode 100644 index 9707f2c2..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt-br.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista"},weekText:"Sm",allDayText:"dia inteiro",moreLinkText:e=>"mais +"+e,noEventsText:"Não há eventos para mostrar"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt.global.js deleted file mode 100644 index 6e69533d..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'pt', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Anterior', - next: 'Seguinte', - today: 'Hoje', - month: 'Mês', - week: 'Semana', - day: 'Dia', - list: 'Agenda', - }, - weekText: 'Sem', - allDayText: 'Todo o dia', - moreLinkText: 'mais', - noEventsText: 'Não há eventos para mostrar', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt.global.min.js deleted file mode 100644 index bb71bf00..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/pt.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekText:"Sem",allDayText:"Todo o dia",moreLinkText:"mais",noEventsText:"Não há eventos para mostrar"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ro.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ro.global.js deleted file mode 100644 index 58c60b9a..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ro.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ro', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'precedentă', - next: 'următoare', - today: 'Azi', - month: 'Lună', - week: 'Săptămână', - day: 'Zi', - list: 'Agendă', - }, - weekText: 'Săpt', - allDayText: 'Toată ziua', - moreLinkText(n) { - return '+alte ' + n; - }, - noEventsText: 'Nu există evenimente de afișat', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ro.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ro.global.min.js deleted file mode 100644 index 022296f3..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ro.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekText:"Săpt",allDayText:"Toată ziua",moreLinkText:e=>"+alte "+e,noEventsText:"Nu există evenimente de afișat"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ru.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ru.global.js deleted file mode 100644 index 3a3c3e17..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ru.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ru', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Пред', - next: 'След', - today: 'Сегодня', - month: 'Месяц', - week: 'Неделя', - day: 'День', - list: 'Повестка дня', - }, - weekText: 'Нед', - allDayText: 'Весь день', - moreLinkText(n) { - return '+ ещё ' + n; - }, - noEventsText: 'Нет событий для отображения', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ru.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ru.global.min.js deleted file mode 100644 index 89a95f73..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ru.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekText:"Нед",allDayText:"Весь день",moreLinkText:e=>"+ ещё "+e,noEventsText:"Нет событий для отображения"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/si-lk.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/si-lk.global.js deleted file mode 100644 index c41664f9..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/si-lk.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'si-lk', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'පෙර', - next: 'පසු', - today: 'අද', - month: 'මාසය', - week: 'සතිය', - day: 'දවස', - list: 'ලැයිස්තුව', - }, - weekText: 'සති', - allDayText: 'සියලු', - moreLinkText: 'තවත්', - noEventsText: 'මුකුත් නැත', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/si-lk.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/si-lk.global.min.js deleted file mode 100644 index 36609031..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/si-lk.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"si-lk",week:{dow:1,doy:4},buttonText:{prev:"පෙර",next:"පසු",today:"අද",month:"මාසය",week:"සතිය",day:"දවස",list:"ලැයිස්තුව"},weekText:"සති",allDayText:"සියලු",moreLinkText:"තවත්",noEventsText:"මුකුත් නැත"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sk.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sk.global.js deleted file mode 100644 index 73ff1a97..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sk.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'sk', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Predchádzajúci', - next: 'Nasledujúci', - today: 'Dnes', - month: 'Mesiac', - week: 'Týždeň', - day: 'Deň', - list: 'Rozvrh', - }, - weekText: 'Ty', - allDayText: 'Celý deň', - moreLinkText(n) { - return '+ďalšie: ' + n; - }, - noEventsText: 'Žiadne akcie na zobrazenie', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sk.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sk.global.min.js deleted file mode 100644 index 936e18fe..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sk.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var a={code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekText:"Ty",allDayText:"Celý deň",moreLinkText:e=>"+ďalšie: "+e,noEventsText:"Žiadne akcie na zobrazenie"};FullCalendar.globalLocales.push(a)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sl.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sl.global.js deleted file mode 100644 index 3756b169..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sl.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'sl', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Prejšnji', - next: 'Naslednji', - today: 'Trenutni', - month: 'Mesec', - week: 'Teden', - day: 'Dan', - list: 'Dnevni red', - }, - weekText: 'Teden', - allDayText: 'Ves dan', - moreLinkText: 'več', - noEventsText: 'Ni dogodkov za prikaz', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sl.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sl.global.min.js deleted file mode 100644 index 1f039476..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sl.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekText:"Teden",allDayText:"Ves dan",moreLinkText:"več",noEventsText:"Ni dogodkov za prikaz"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sm.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sm.global.js deleted file mode 100644 index 90ead889..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sm.global.js +++ /dev/null @@ -1,28 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'sm', - buttonText: { - prev: 'Talu ai', - next: 'Mulimuli atu', - today: 'Aso nei', - month: 'Masina', - week: 'Vaiaso', - day: 'Aso', - list: 'Faasologa', - }, - weekText: 'Vaiaso', - allDayText: 'Aso atoa', - moreLinkText: 'sili atu', - noEventsText: 'Leai ni mea na tutupu', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sm.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sm.global.min.js deleted file mode 100644 index 80b159cb..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sm.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(a){"use strict";FullCalendar.globalLocales.push({code:"sm",buttonText:{prev:"Talu ai",next:"Mulimuli atu",today:"Aso nei",month:"Masina",week:"Vaiaso",day:"Aso",list:"Faasologa"},weekText:"Vaiaso",allDayText:"Aso atoa",moreLinkText:"sili atu",noEventsText:"Leai ni mea na tutupu"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sq.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sq.global.js deleted file mode 100644 index fe4459d1..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sq.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'sq', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'mbrapa', - next: 'Përpara', - today: 'sot', - month: 'Muaj', - week: 'Javë', - day: 'Ditë', - list: 'Listë', - }, - weekText: 'Ja', - allDayText: 'Gjithë ditën', - moreLinkText(n) { - return '+më tepër ' + n; - }, - noEventsText: 'Nuk ka evente për të shfaqur', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sq.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sq.global.min.js deleted file mode 100644 index c246a1cb..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sq.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekText:"Ja",allDayText:"Gjithë ditën",moreLinkText:e=>"+më tepër "+e,noEventsText:"Nuk ka evente për të shfaqur"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr-cyrl.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr-cyrl.global.js deleted file mode 100644 index 273e4dc0..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr-cyrl.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'sr-cyrl', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Претходна', - next: 'следећи', - today: 'Данас', - month: 'Месец', - week: 'Недеља', - day: 'Дан', - list: 'Планер', - }, - weekText: 'Сед', - allDayText: 'Цео дан', - moreLinkText(n) { - return '+ још ' + n; - }, - noEventsText: 'Нема догађаја за приказ', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr-cyrl.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr-cyrl.global.min.js deleted file mode 100644 index acb547fa..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr-cyrl.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekText:"Сед",allDayText:"Цео дан",moreLinkText:e=>"+ још "+e,noEventsText:"Нема догађаја за приказ"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr.global.js deleted file mode 100644 index 579c149a..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'sr', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Prethodna', - next: 'Sledeći', - today: 'Danas', - month: 'Mеsеc', - week: 'Nеdеlja', - day: 'Dan', - list: 'Planеr', - }, - weekText: 'Sed', - allDayText: 'Cеo dan', - moreLinkText(n) { - return '+ još ' + n; - }, - noEventsText: 'Nеma događaja za prikaz', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr.global.min.js deleted file mode 100644 index 4097f989..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sr.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var a={code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekText:"Sed",allDayText:"Cеo dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nеma događaja za prikaz"};FullCalendar.globalLocales.push(a)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sv.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sv.global.js deleted file mode 100644 index e0082ab5..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sv.global.js +++ /dev/null @@ -1,52 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'sv', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Förra', - next: 'Nästa', - today: 'Idag', - month: 'Månad', - week: 'Vecka', - day: 'Dag', - list: 'Program', - }, - buttonHints: { - prev(buttonText) { - return `Föregående ${buttonText.toLocaleLowerCase()}`; - }, - next(buttonText) { - return `Nästa ${buttonText.toLocaleLowerCase()}`; - }, - today(buttonText) { - return (buttonText === 'Program' ? 'Detta' : 'Denna') + ' ' + buttonText.toLocaleLowerCase(); - }, - }, - viewHint: '$0 vy', - navLinkHint: 'Gå till $0', - moreLinkHint(eventCnt) { - return `Visa ytterligare ${eventCnt} händelse${eventCnt === 1 ? '' : 'r'}`; - }, - weekText: 'v.', - weekTextLong: 'Vecka', - allDayText: 'Heldag', - moreLinkText: 'till', - noEventsText: 'Inga händelser att visa', - closeHint: 'Stäng', - timeHint: 'Klockan', - eventHint: 'Händelse', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sv.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sv.global.min.js deleted file mode 100644 index e2240aa4..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/sv.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},buttonHints:{prev:e=>"Föregående "+e.toLocaleLowerCase(),next:e=>"Nästa "+e.toLocaleLowerCase(),today:e=>("Program"===e?"Detta":"Denna")+" "+e.toLocaleLowerCase()},viewHint:"$0 vy",navLinkHint:"Gå till $0",moreLinkHint:e=>`Visa ytterligare ${e} händelse${1===e?"":"r"}`,weekText:"v.",weekTextLong:"Vecka",allDayText:"Heldag",moreLinkText:"till",noEventsText:"Inga händelser att visa",closeHint:"Stäng",timeHint:"Klockan",eventHint:"Händelse"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ta-in.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ta-in.global.js deleted file mode 100644 index 5a920148..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ta-in.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ta-in', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'முந்தைய', - next: 'அடுத்தது', - today: 'இன்று', - month: 'மாதம்', - week: 'வாரம்', - day: 'நாள்', - list: 'தினசரி அட்டவணை', - }, - weekText: 'வாரம்', - allDayText: 'நாள் முழுவதும்', - moreLinkText(n) { - return '+ மேலும் ' + n; - }, - noEventsText: 'காண்பிக்க நிகழ்வுகள் இல்லை', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ta-in.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ta-in.global.min.js deleted file mode 100644 index e94e3354..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ta-in.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"ta-in",week:{dow:1,doy:4},buttonText:{prev:"முந்தைய",next:"அடுத்தது",today:"இன்று",month:"மாதம்",week:"வாரம்",day:"நாள்",list:"தினசரி அட்டவணை"},weekText:"வாரம்",allDayText:"நாள் முழுவதும்",moreLinkText:e=>"+ மேலும் "+e,noEventsText:"காண்பிக்க நிகழ்வுகள் இல்லை"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/th.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/th.global.js deleted file mode 100644 index 93e4ec17..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/th.global.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'th', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'ก่อนหน้า', - next: 'ถัดไป', - prevYear: 'ปีก่อนหน้า', - nextYear: 'ปีถัดไป', - year: 'ปี', - today: 'วันนี้', - month: 'เดือน', - week: 'สัปดาห์', - day: 'วัน', - list: 'กำหนดการ', - }, - weekText: 'สัปดาห์', - allDayText: 'ตลอดวัน', - moreLinkText: 'เพิ่มเติม', - noEventsText: 'ไม่มีกิจกรรมที่จะแสดง', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/th.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/th.global.min.js deleted file mode 100644 index 7687c038..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/th.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"th",week:{dow:1,doy:4},buttonText:{prev:"ก่อนหน้า",next:"ถัดไป",prevYear:"ปีก่อนหน้า",nextYear:"ปีถัดไป",year:"ปี",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"กำหนดการ"},weekText:"สัปดาห์",allDayText:"ตลอดวัน",moreLinkText:"เพิ่มเติม",noEventsText:"ไม่มีกิจกรรมที่จะแสดง"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/tr.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/tr.global.js deleted file mode 100644 index 60453714..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/tr.global.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'tr', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'geri', - next: 'ileri', - today: 'bugün', - month: 'Ay', - week: 'Hafta', - day: 'Gün', - list: 'Ajanda', - }, - weekText: 'Hf', - allDayText: 'Tüm gün', - moreLinkText: 'daha fazla', - noEventsText: 'Gösterilecek etkinlik yok', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/tr.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/tr.global.min.js deleted file mode 100644 index 6d878a0e..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/tr.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekText:"Hf",allDayText:"Tüm gün",moreLinkText:"daha fazla",noEventsText:"Gösterilecek etkinlik yok"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ug.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ug.global.js deleted file mode 100644 index f11a28ae..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ug.global.js +++ /dev/null @@ -1,22 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'ug', - buttonText: { - month: 'ئاي', - week: 'ھەپتە', - day: 'كۈن', - list: 'كۈنتەرتىپ', - }, - allDayText: 'پۈتۈن كۈن', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ug.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ug.global.min.js deleted file mode 100644 index 689358ab..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/ug.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(l){"use strict";FullCalendar.globalLocales.push({code:"ug",buttonText:{month:"ئاي",week:"ھەپتە",day:"كۈن",list:"كۈنتەرتىپ"},allDayText:"پۈتۈن كۈن"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uk.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uk.global.js deleted file mode 100644 index 3055e15a..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uk.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'uk', - week: { - dow: 1, - doy: 7, // The week that contains Jan 1st is the first week of the year. - }, - buttonText: { - prev: 'Попередній', - next: 'далі', - today: 'Сьогодні', - month: 'Місяць', - week: 'Тиждень', - day: 'День', - list: 'Порядок денний', - }, - weekText: 'Тиж', - allDayText: 'Увесь день', - moreLinkText(n) { - return '+ще ' + n + '...'; - }, - noEventsText: 'Немає подій для відображення', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uk.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uk.global.min.js deleted file mode 100644 index bffc75ac..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uk.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekText:"Тиж",allDayText:"Увесь день",moreLinkText:e=>"+ще "+e+"...",noEventsText:"Немає подій для відображення"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uz.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uz.global.js deleted file mode 100644 index 13caa874..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uz.global.js +++ /dev/null @@ -1,26 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'uz', - buttonText: { - month: 'Oy', - week: 'Xafta', - day: 'Kun', - list: 'Kun tartibi', - }, - allDayText: 'Kun bo\'yi', - moreLinkText(n) { - return '+ yana ' + n; - }, - noEventsText: 'Ko\'rsatish uchun voqealar yo\'q', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uz.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uz.global.min.js deleted file mode 100644 index 97a74595..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/uz.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(a){"use strict";var t={code:"uz",buttonText:{month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",moreLinkText:a=>"+ yana "+a,noEventsText:"Ko'rsatish uchun voqealar yo'q"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/vi.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/vi.global.js deleted file mode 100644 index 1376182b..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/vi.global.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'vi', - week: { - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: 'Trước', - next: 'Tiếp', - today: 'Hôm nay', - month: 'Tháng', - week: 'Tuần', - day: 'Ngày', - list: 'Lịch biểu', - }, - weekText: 'Tu', - allDayText: 'Cả ngày', - moreLinkText(n) { - return '+ thêm ' + n; - }, - noEventsText: 'Không có sự kiện để hiển thị', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/vi.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/vi.global.min.js deleted file mode 100644 index e0f48bc4..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/vi.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekText:"Tu",allDayText:"Cả ngày",moreLinkText:e=>"+ thêm "+e,noEventsText:"Không có sự kiện để hiển thị"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-cn.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-cn.global.js deleted file mode 100644 index f5cdf5a5..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-cn.global.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'zh-cn', - week: { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow: 1, - doy: 4, // The week that contains Jan 4th is the first week of the year. - }, - buttonText: { - prev: '上月', - next: '下月', - today: '今天', - month: '月', - week: '周', - day: '日', - list: '日程', - }, - weekText: '周', - allDayText: '全天', - moreLinkText(n) { - return '另外 ' + n + ' 个'; - }, - noEventsText: '没有事件显示', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-cn.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-cn.global.min.js deleted file mode 100644 index 49e7deda..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-cn.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";var t={code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekText:"周",allDayText:"全天",moreLinkText:e=>"另外 "+e+" 个",noEventsText:"没有事件显示"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-tw.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-tw.global.js deleted file mode 100644 index 94943870..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-tw.global.js +++ /dev/null @@ -1,28 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (index_js) { - 'use strict'; - - var locale = { - code: 'zh-tw', - buttonText: { - prev: '上月', - next: '下月', - today: '今天', - month: '月', - week: '週', - day: '天', - list: '活動列表', - }, - weekText: '周', - allDayText: '整天', - moreLinkText: '顯示更多', - noEventsText: '没有任何活動', - }; - - index_js.globalLocales.push(locale); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-tw.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-tw.global.min.js deleted file mode 100644 index 8449648a..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/core/locales/zh-tw.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Core v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(e){"use strict";FullCalendar.globalLocales.push({code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekText:"周",allDayText:"整天",moreLinkText:"顯示更多",noEventsText:"没有任何活動"})}(); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/daygrid/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/daygrid/index.global.js deleted file mode 100644 index bd837c86..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/daygrid/index.global.js +++ /dev/null @@ -1,905 +0,0 @@ -/*! -FullCalendar Day Grid Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/month-view -(c) 2022 Adam Shaw -*/ -FullCalendar.DayGrid = (function (exports, core, internal$1, preact) { - 'use strict'; - - /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. - ----------------------------------------------------------------------------------------------------------------------*/ - // It is a manager for a Table subcomponent, which does most of the heavy lifting. - // It is responsible for managing width/height. - class TableView extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.headerElRef = preact.createRef(); - } - renderSimpleLayout(headerRowContent, bodyContent) { - let { props, context } = this; - let sections = []; - let stickyHeaderDates = internal$1.getStickyHeaderDates(context.options); - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunk: { - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }, - }); - } - sections.push({ - type: 'body', - key: 'body', - liquid: true, - chunk: { content: bodyContent }, - }); - return (preact.createElement(internal$1.ViewContainer, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec }, - preact.createElement(internal$1.SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections }))); - } - renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) { - let ScrollGrid = this.context.pluginHooks.scrollGridImpl; - if (!ScrollGrid) { - throw new Error('No ScrollGrid implementation'); - } - let { props, context } = this; - let stickyHeaderDates = !props.forPrint && internal$1.getStickyHeaderDates(context.options); - let stickyFooterScrollbar = !props.forPrint && internal$1.getStickyFooterScrollbar(context.options); - let sections = []; - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunks: [{ - key: 'main', - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }], - }); - } - sections.push({ - type: 'body', - key: 'body', - liquid: true, - chunks: [{ - key: 'main', - content: bodyContent, - }], - }); - if (stickyFooterScrollbar) { - sections.push({ - type: 'footer', - key: 'footer', - isSticky: true, - chunks: [{ - key: 'main', - content: internal$1.renderScrollShim, - }], - }); - } - return (preact.createElement(internal$1.ViewContainer, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec }, - preact.createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections }))); - } - } - - function splitSegsByRow(segs, rowCnt) { - let byRow = []; - for (let i = 0; i < rowCnt; i += 1) { - byRow[i] = []; - } - for (let seg of segs) { - byRow[seg.row].push(seg); - } - return byRow; - } - function splitSegsByFirstCol(segs, colCnt) { - let byCol = []; - for (let i = 0; i < colCnt; i += 1) { - byCol[i] = []; - } - for (let seg of segs) { - byCol[seg.firstCol].push(seg); - } - return byCol; - } - function splitInteractionByRow(ui, rowCnt) { - let byRow = []; - if (!ui) { - for (let i = 0; i < rowCnt; i += 1) { - byRow[i] = null; - } - } - else { - for (let i = 0; i < rowCnt; i += 1) { - byRow[i] = { - affectedInstances: ui.affectedInstances, - isEvent: ui.isEvent, - segs: [], - }; - } - for (let seg of ui.segs) { - byRow[seg.row].segs.push(seg); - } - } - return byRow; - } - - const DEFAULT_TABLE_EVENT_TIME_FORMAT = internal$1.createFormatter({ - hour: 'numeric', - minute: '2-digit', - omitZeroMinute: true, - meridiem: 'narrow', - }); - function hasListItemDisplay(seg) { - let { display } = seg.eventRange.ui; - return display === 'list-item' || (display === 'auto' && - !seg.eventRange.def.allDay && - seg.firstCol === seg.lastCol && // can't be multi-day - seg.isStart && // " - seg.isEnd // " - ); - } - - class TableBlockEvent extends internal$1.BaseComponent { - render() { - let { props } = this; - return (preact.createElement(internal$1.StandardEvent, Object.assign({}, props, { elClasses: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay }))); - } - } - - class TableListItemEvent extends internal$1.BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let { seg } = props; - let timeFormat = options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT; - let timeText = internal$1.buildSegTimeText(seg, timeFormat, context, true, props.defaultDisplayEventEnd); - return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { elTag: "a", elClasses: ['fc-daygrid-event', 'fc-daygrid-dot-event'], elAttrs: internal$1.getSegAnchorAttrs(props.seg, context), defaultGenerator: renderInnerContent, timeText: timeText, isResizing: false, isDateSelecting: false }))); - } - } - function renderInnerContent(renderProps) { - return (preact.createElement(preact.Fragment, null, - preact.createElement("div", { className: "fc-daygrid-event-dot", style: { borderColor: renderProps.borderColor || renderProps.backgroundColor } }), - renderProps.timeText && (preact.createElement("div", { className: "fc-event-time" }, renderProps.timeText)), - preact.createElement("div", { className: "fc-event-title" }, renderProps.event.title || preact.createElement(preact.Fragment, null, "\u00A0")))); - } - - class TableCellMoreLink extends internal$1.BaseComponent { - constructor() { - super(...arguments); - this.compileSegs = internal$1.memoize(compileSegs); - } - render() { - let { props } = this; - let { allSegs, invisibleSegs } = this.compileSegs(props.singlePlacements); - return (preact.createElement(internal$1.MoreLinkContainer, { elClasses: ['fc-daygrid-more-link'], dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs: allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: () => { - let isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) || - (props.eventResize ? props.eventResize.affectedInstances : null) || - {}; - return (preact.createElement(preact.Fragment, null, allSegs.map((seg) => { - let instanceId = seg.eventRange.instance.instanceId; - return (preact.createElement("div", { className: "fc-daygrid-event-harness", key: instanceId, style: { - visibility: isForcedInvisible[instanceId] ? 'hidden' : '', - } }, hasListItemDisplay(seg) ? (preact.createElement(TableListItemEvent, Object.assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, internal$1.getSegMeta(seg, props.todayRange)))) : (preact.createElement(TableBlockEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, internal$1.getSegMeta(seg, props.todayRange)))))); - }))); - } })); - } - } - function compileSegs(singlePlacements) { - let allSegs = []; - let invisibleSegs = []; - for (let placement of singlePlacements) { - allSegs.push(placement.seg); - if (!placement.isVisible) { - invisibleSegs.push(placement.seg); - } - } - return { allSegs, invisibleSegs }; - } - - const DEFAULT_WEEK_NUM_FORMAT = internal$1.createFormatter({ week: 'narrow' }); - class TableCell extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.rootElRef = preact.createRef(); - this.state = { - dayNumberId: internal$1.getUniqueDomId(), - }; - this.handleRootEl = (el) => { - internal$1.setRef(this.rootElRef, el); - internal$1.setRef(this.props.elRef, el); - }; - } - render() { - let { context, props, state, rootElRef } = this; - let { options } = context; - let { date, dateProfile } = props; - return (preact.createElement(internal$1.DayCellContainer, { elTag: "td", elRef: this.handleRootEl, elClasses: [ - 'fc-daygrid-day', - ...(props.extraClassNames || []), - ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.extraDataAttrs), (props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {})), { role: 'gridcell' }), defaultGenerator: renderTopInner, date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraRenderProps: props.extraRenderProps }, (InnerContent, renderProps) => (preact.createElement("div", { className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref: props.innerElRef }, - props.showWeekNumber && (preact.createElement(internal$1.WeekNumberContainer, { elTag: "a", elClasses: ['fc-daygrid-week-number'], elAttrs: internal$1.buildNavLinkAttrs(context, date, 'week'), date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT })), - Boolean(!renderProps.isDisabled && - (props.showDayNumber || internal$1.hasCustomDayCellContent(options) || props.forceDayTop)) && (preact.createElement("div", { className: "fc-daygrid-day-top" }, - preact.createElement(InnerContent, { elTag: "a", elClasses: ['fc-daygrid-day-number'], elAttrs: Object.assign(Object.assign({}, internal$1.buildNavLinkAttrs(context, date)), { id: state.dayNumberId }) }))), - preact.createElement("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, - props.fgContent, - preact.createElement("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, - preact.createElement(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))), - preact.createElement("div", { className: "fc-daygrid-day-bg" }, props.bgContent))))); - } - } - function renderTopInner(props) { - return props.dayNumberText || preact.createElement(preact.Fragment, null, "\u00A0"); - } - - function computeFgSegPlacement(segs, // assumed already sorted - dayMaxEvents, dayMaxEventRows, strictOrder, eventInstanceHeights, maxContentHeight, cells) { - let hierarchy = new DayGridSegHierarchy(); - hierarchy.allowReslicing = true; - hierarchy.strictOrder = strictOrder; - if (dayMaxEvents === true || dayMaxEventRows === true) { - hierarchy.maxCoord = maxContentHeight; - hierarchy.hiddenConsumes = true; - } - else if (typeof dayMaxEvents === 'number') { - hierarchy.maxStackCnt = dayMaxEvents; - } - else if (typeof dayMaxEventRows === 'number') { - hierarchy.maxStackCnt = dayMaxEventRows; - hierarchy.hiddenConsumes = true; - } - // create segInputs only for segs with known heights - let segInputs = []; - let unknownHeightSegs = []; - for (let i = 0; i < segs.length; i += 1) { - let seg = segs[i]; - let { instanceId } = seg.eventRange.instance; - let eventHeight = eventInstanceHeights[instanceId]; - if (eventHeight != null) { - segInputs.push({ - index: i, - thickness: eventHeight, - span: { - start: seg.firstCol, - end: seg.lastCol + 1, - }, - }); - } - else { - unknownHeightSegs.push(seg); - } - } - let hiddenEntries = hierarchy.addSegs(segInputs); - let segRects = hierarchy.toRects(); - let { singleColPlacements, multiColPlacements, leftoverMargins } = placeRects(segRects, segs, cells); - let moreCnts = []; - let moreMarginTops = []; - // add segs with unknown heights - for (let seg of unknownHeightSegs) { - multiColPlacements[seg.firstCol].push({ - seg, - isVisible: false, - isAbsolute: true, - absoluteTop: 0, - marginTop: 0, - }); - for (let col = seg.firstCol; col <= seg.lastCol; col += 1) { - singleColPlacements[col].push({ - seg: resliceSeg(seg, col, col + 1, cells), - isVisible: false, - isAbsolute: false, - absoluteTop: 0, - marginTop: 0, - }); - } - } - // add the hidden entries - for (let col = 0; col < cells.length; col += 1) { - moreCnts.push(0); - } - for (let hiddenEntry of hiddenEntries) { - let seg = segs[hiddenEntry.index]; - let hiddenSpan = hiddenEntry.span; - multiColPlacements[hiddenSpan.start].push({ - seg: resliceSeg(seg, hiddenSpan.start, hiddenSpan.end, cells), - isVisible: false, - isAbsolute: true, - absoluteTop: 0, - marginTop: 0, - }); - for (let col = hiddenSpan.start; col < hiddenSpan.end; col += 1) { - moreCnts[col] += 1; - singleColPlacements[col].push({ - seg: resliceSeg(seg, col, col + 1, cells), - isVisible: false, - isAbsolute: false, - absoluteTop: 0, - marginTop: 0, - }); - } - } - // deal with leftover margins - for (let col = 0; col < cells.length; col += 1) { - moreMarginTops.push(leftoverMargins[col]); - } - return { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops }; - } - // rects ordered by top coord, then left - function placeRects(allRects, segs, cells) { - let rectsByEachCol = groupRectsByEachCol(allRects, cells.length); - let singleColPlacements = []; - let multiColPlacements = []; - let leftoverMargins = []; - for (let col = 0; col < cells.length; col += 1) { - let rects = rectsByEachCol[col]; - // compute all static segs in singlePlacements - let singlePlacements = []; - let currentHeight = 0; - let currentMarginTop = 0; - for (let rect of rects) { - let seg = segs[rect.index]; - singlePlacements.push({ - seg: resliceSeg(seg, col, col + 1, cells), - isVisible: true, - isAbsolute: false, - absoluteTop: rect.levelCoord, - marginTop: rect.levelCoord - currentHeight, - }); - currentHeight = rect.levelCoord + rect.thickness; - } - // compute mixed static/absolute segs in multiPlacements - let multiPlacements = []; - currentHeight = 0; - currentMarginTop = 0; - for (let rect of rects) { - let seg = segs[rect.index]; - let isAbsolute = rect.span.end - rect.span.start > 1; // multi-column? - let isFirstCol = rect.span.start === col; - currentMarginTop += rect.levelCoord - currentHeight; // amount of space since bottom of previous seg - currentHeight = rect.levelCoord + rect.thickness; // height will now be bottom of current seg - if (isAbsolute) { - currentMarginTop += rect.thickness; - if (isFirstCol) { - multiPlacements.push({ - seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), - isVisible: true, - isAbsolute: true, - absoluteTop: rect.levelCoord, - marginTop: 0, - }); - } - } - else if (isFirstCol) { - multiPlacements.push({ - seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), - isVisible: true, - isAbsolute: false, - absoluteTop: rect.levelCoord, - marginTop: currentMarginTop, // claim the margin - }); - currentMarginTop = 0; - } - } - singleColPlacements.push(singlePlacements); - multiColPlacements.push(multiPlacements); - leftoverMargins.push(currentMarginTop); - } - return { singleColPlacements, multiColPlacements, leftoverMargins }; - } - function groupRectsByEachCol(rects, colCnt) { - let rectsByEachCol = []; - for (let col = 0; col < colCnt; col += 1) { - rectsByEachCol.push([]); - } - for (let rect of rects) { - for (let col = rect.span.start; col < rect.span.end; col += 1) { - rectsByEachCol[col].push(rect); - } - } - return rectsByEachCol; - } - function resliceSeg(seg, spanStart, spanEnd, cells) { - if (seg.firstCol === spanStart && seg.lastCol === spanEnd - 1) { - return seg; - } - let eventRange = seg.eventRange; - let origRange = eventRange.range; - let slicedRange = internal$1.intersectRanges(origRange, { - start: cells[spanStart].date, - end: internal$1.addDays(cells[spanEnd - 1].date, 1), - }); - return Object.assign(Object.assign({}, seg), { firstCol: spanStart, lastCol: spanEnd - 1, eventRange: { - def: eventRange.def, - ui: Object.assign(Object.assign({}, eventRange.ui), { durationEditable: false }), - instance: eventRange.instance, - range: slicedRange, - }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }); - } - class DayGridSegHierarchy extends internal$1.SegHierarchy { - constructor() { - super(...arguments); - // config - this.hiddenConsumes = false; - // allows us to keep hidden entries in the hierarchy so they take up space - this.forceHidden = {}; - } - addSegs(segInputs) { - const hiddenSegs = super.addSegs(segInputs); - const { entriesByLevel } = this; - const excludeHidden = (entry) => !this.forceHidden[internal$1.buildEntryKey(entry)]; - // remove the forced-hidden segs - for (let level = 0; level < entriesByLevel.length; level += 1) { - entriesByLevel[level] = entriesByLevel[level].filter(excludeHidden); - } - return hiddenSegs; - } - handleInvalidInsertion(insertion, entry, hiddenEntries) { - const { entriesByLevel, forceHidden } = this; - const { touchingEntry, touchingLevel, touchingLateral } = insertion; - if (this.hiddenConsumes && touchingEntry) { - const touchingEntryId = internal$1.buildEntryKey(touchingEntry); - // if not already hidden - if (!forceHidden[touchingEntryId]) { - if (this.allowReslicing) { - const placeholderEntry = Object.assign(Object.assign({}, touchingEntry), { span: internal$1.intersectSpans(touchingEntry.span, entry.span) }); - const placeholderEntryId = internal$1.buildEntryKey(placeholderEntry); - forceHidden[placeholderEntryId] = true; - entriesByLevel[touchingLevel][touchingLateral] = placeholderEntry; // replace touchingEntry with our placeholder - this.splitEntry(touchingEntry, entry, hiddenEntries); // split up the touchingEntry, reinsert it - } - else { - forceHidden[touchingEntryId] = true; - hiddenEntries.push(touchingEntry); - } - } - } - return super.handleInvalidInsertion(insertion, entry, hiddenEntries); - } - } - - class TableRow extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.cellElRefs = new internal$1.RefMap(); // the - this.frameElRefs = new internal$1.RefMap(); // the fc-daygrid-day-frame - this.fgElRefs = new internal$1.RefMap(); // the fc-daygrid-day-events - this.segHarnessRefs = new internal$1.RefMap(); // indexed by "instanceId:firstCol" - this.rootElRef = preact.createRef(); - this.state = { - framePositions: null, - maxContentHeight: null, - eventInstanceHeights: {}, - }; - this.handleResize = (isForced) => { - if (isForced) { - this.updateSizing(true); // isExternal=true - } - }; - } - render() { - let { props, state, context } = this; - let { options } = context; - let colCnt = props.cells.length; - let businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt); - let bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt); - let highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt); - let mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt); - let { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops } = computeFgSegPlacement(internal$1.sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.eventInstanceHeights, state.maxContentHeight, props.cells); - let isForcedInvisible = // TODO: messy way to compute this - (props.eventDrag && props.eventDrag.affectedInstances) || - (props.eventResize && props.eventResize.affectedInstances) || - {}; - return (preact.createElement("tr", { ref: this.rootElRef, role: "row" }, - props.renderIntro && props.renderIntro(), - props.cells.map((cell, col) => { - let normalFgNodes = this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible); - let mirrorFgNodes = this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); - return (preact.createElement(TableCell, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), innerElRef: this.frameElRefs.createRef(cell.key) /* FF 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, extraRenderProps: cell.extraRenderProps, 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 - preact.createElement(preact.Fragment, null, - preact.createElement(preact.Fragment, null, normalFgNodes), - preact.createElement(preact.Fragment, null, mirrorFgNodes))), bgContent: ( // Fragment scopes the keys - preact.createElement(preact.Fragment, null, - this.renderFillSegs(highlightSegsByCol[col], 'highlight'), - this.renderFillSegs(businessHoursByCol[col], 'non-business'), - this.renderFillSegs(bgEventSegsByCol[col], 'bg-event'))) })); - }))); - } - componentDidMount() { - this.updateSizing(true); - this.context.addResizeHandler(this.handleResize); - } - componentDidUpdate(prevProps, prevState) { - let currentProps = this.props; - this.updateSizing(!internal$1.isPropsEqual(prevProps, currentProps)); - } - componentWillUnmount() { - this.context.removeResizeHandler(this.handleResize); - } - getHighlightSegs() { - let { props } = this; - if (props.eventDrag && props.eventDrag.segs.length) { // messy check - return props.eventDrag.segs; - } - if (props.eventResize && props.eventResize.segs.length) { // messy check - return props.eventResize.segs; - } - return props.dateSelectionSegs; - } - getMirrorSegs() { - let { props } = this; - if (props.eventResize && props.eventResize.segs.length) { // messy check - return props.eventResize.segs; - } - return []; - } - renderFgSegs(col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) { - let { context } = this; - let { eventSelection } = this.props; - let { framePositions } = this.state; - let defaultDisplayEventEnd = this.props.cells.length === 1; // colCnt === 1 - let isMirror = isDragging || isResizing || isDateSelecting; - let nodes = []; - if (framePositions) { - for (let placement of segPlacements) { - let { seg } = placement; - let { instanceId } = seg.eventRange.instance; - let key = instanceId + ':' + col; - let isVisible = placement.isVisible && !isForcedInvisible[instanceId]; - let isAbsolute = placement.isAbsolute; - let left = ''; - let right = ''; - if (isAbsolute) { - if (context.isRtl) { - right = 0; - left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]; - } - else { - left = 0; - right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol]; - } - } - /* - known bug: events that are force to be list-item but span multiple days still take up space in later columns - todo: in print view, for multi-day events, don't display title within non-start/end segs - */ - nodes.push(preact.createElement("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: { - visibility: isVisible ? '' : 'hidden', - marginTop: isAbsolute ? '' : placement.marginTop, - top: isAbsolute ? placement.absoluteTop : '', - left, - right, - } }, hasListItemDisplay(seg) ? (preact.createElement(TableListItemEvent, Object.assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, internal$1.getSegMeta(seg, todayRange)))) : (preact.createElement(TableBlockEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, internal$1.getSegMeta(seg, todayRange)))))); - } - } - return nodes; - } - renderFillSegs(segs, fillType) { - let { isRtl } = this.context; - let { todayRange } = this.props; - let { framePositions } = this.state; - let nodes = []; - if (framePositions) { - for (let seg of segs) { - let leftRightCss = isRtl ? { - right: 0, - left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol], - } : { - left: 0, - right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol], - }; - nodes.push(preact.createElement("div", { key: internal$1.buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === 'bg-event' ? - preact.createElement(internal$1.BgEvent, Object.assign({ seg: seg }, internal$1.getSegMeta(seg, todayRange))) : - internal$1.renderFill(fillType))); - } - } - return preact.createElement(preact.Fragment, {}, ...nodes); - } - updateSizing(isExternalSizingChange) { - let { props, frameElRefs } = this; - if (!props.forPrint && - props.clientWidth !== null // positioning ready? - ) { - if (isExternalSizingChange) { - let frameEls = props.cells.map((cell) => frameElRefs.currentMap[cell.key]); - if (frameEls.length) { - let originEl = this.rootElRef.current; - this.setState({ - framePositions: new internal$1.PositionCache(originEl, frameEls, true, // isHorizontal - false), - }); - } - } - const oldInstanceHeights = this.state.eventInstanceHeights; - const newInstanceHeights = this.queryEventInstanceHeights(); - const limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true; - this.safeSetState({ - // 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: Object.assign(Object.assign({}, oldInstanceHeights), newInstanceHeights), - maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null, - }); - } - } - queryEventInstanceHeights() { - let segElMap = this.segHarnessRefs.currentMap; - let eventInstanceHeights = {}; - // get the max height amongst instance segs - for (let key in segElMap) { - let height = Math.round(segElMap[key].getBoundingClientRect().height); - let instanceId = key.split(':')[0]; // deconstruct how renderFgSegs makes the key - eventInstanceHeights[instanceId] = Math.max(eventInstanceHeights[instanceId] || 0, height); - } - return eventInstanceHeights; - } - computeMaxContentHeight() { - let firstKey = this.props.cells[0].key; - let cellEl = this.cellElRefs.currentMap[firstKey]; - let fcContainerEl = this.fgElRefs.currentMap[firstKey]; - return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top; - } - getCellEls() { - let elMap = this.cellElRefs.currentMap; - return this.props.cells.map((cell) => elMap[cell.key]); - } - } - TableRow.addStateEquality({ - eventInstanceHeights: internal$1.isPropsEqual, - }); - function buildMirrorPlacements(mirrorSegs, colPlacements) { - if (!mirrorSegs.length) { - return []; - } - let topsByInstanceId = buildAbsoluteTopHash(colPlacements); // TODO: cache this at first render? - return mirrorSegs.map((seg) => ({ - seg, - isVisible: true, - isAbsolute: true, - absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId], - marginTop: 0, - })); - } - function buildAbsoluteTopHash(colPlacements) { - let topsByInstanceId = {}; - for (let placements of colPlacements) { - for (let placement of placements) { - topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop; - } - } - return topsByInstanceId; - } - - class Table extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.splitBusinessHourSegs = internal$1.memoize(splitSegsByRow); - this.splitBgEventSegs = internal$1.memoize(splitSegsByRow); - this.splitFgEventSegs = internal$1.memoize(splitSegsByRow); - this.splitDateSelectionSegs = internal$1.memoize(splitSegsByRow); - this.splitEventDrag = internal$1.memoize(splitInteractionByRow); - this.splitEventResize = internal$1.memoize(splitInteractionByRow); - this.rowRefs = new internal$1.RefMap(); - this.handleRootEl = (rootEl) => { - this.rootEl = rootEl; - if (rootEl) { - this.context.registerInteractiveComponent(this, { - el: rootEl, - isHitComboAllowed: this.props.isHitComboAllowed, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; - } - render() { - let { props } = this; - let { dateProfile, dayMaxEventRows, dayMaxEvents, expandRows } = props; - let rowCnt = props.cells.length; - let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt); - let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt); - let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt); - let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt); - let eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt); - let eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt); - let limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; - // if rows can't expand to fill fixed height, can't do balanced-height event limit - // TODO: best place to normalize these options? - if (limitViaBalanced && !expandRows) { - limitViaBalanced = false; - dayMaxEventRows = null; - dayMaxEvents = null; - } - let classNames = [ - 'fc-daygrid-body', - limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced', - expandRows ? '' : 'fc-daygrid-body-natural', // will height of one row depend on the others? - ]; - return (preact.createElement("div", { className: classNames.join(' '), ref: this.handleRootEl, style: { - // these props are important to give this wrapper correct dimensions for interactions - // TODO: if we set it here, can we avoid giving to inner tables? - width: props.clientWidth, - minWidth: props.tableMinWidth, - } }, - preact.createElement(internal$1.NowTimer, { unit: "day" }, (nowDate, todayRange) => (preact.createElement(preact.Fragment, null, - preact.createElement("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: { - width: props.clientWidth, - minWidth: props.tableMinWidth, - height: expandRows ? props.clientHeight : '', - } }, - props.colGroupNode, - preact.createElement("tbody", { role: "presentation" }, props.cells.map((cells, row) => (preact.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 })))))))))); - } - // Hit System - // ---------------------------------------------------------------------------------------------------- - prepareHits() { - this.rowPositions = new internal$1.PositionCache(this.rootEl, this.rowRefs.collect().map((rowObj) => rowObj.getCellEls()[0]), // first cell el in each row. TODO: not optimal - false, true); - this.colPositions = new internal$1.PositionCache(this.rootEl, this.rowRefs.currentMap[0].getCellEls(), // cell els in first row - true, // horizontal - false); - } - queryHit(positionLeft, positionTop) { - let { colPositions, rowPositions } = this; - let col = colPositions.leftToIndex(positionLeft); - let row = rowPositions.topToIndex(positionTop); - if (row != null && col != null) { - let cell = this.props.cells[row][col]; - return { - dateProfile: this.props.dateProfile, - dateSpan: Object.assign({ range: this.getCellRange(row, col), allDay: true }, cell.extraDateSpan), - dayEl: this.getCellEl(row, col), - rect: { - left: colPositions.lefts[col], - right: colPositions.rights[col], - top: rowPositions.tops[row], - bottom: rowPositions.bottoms[row], - }, - layer: 0, - }; - } - return null; - } - getCellEl(row, col) { - return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO: not optimal - } - getCellRange(row, col) { - let start = this.props.cells[row][col].date; - let end = internal$1.addDays(start, 1); - return { start, end }; - } - } - function isSegAllDay(seg) { - return seg.eventRange.def.allDay; - } - - class DayTableSlicer extends internal$1.Slicer { - constructor() { - super(...arguments); - this.forceDayIfListItem = true; - } - sliceRange(dateRange, dayTableModel) { - return dayTableModel.sliceRange(dateRange); - } - } - - class DayTable extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.slicer = new DayTableSlicer(); - this.tableRef = preact.createRef(); - } - render() { - let { props, context } = this; - return (preact.createElement(Table, Object.assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, 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, forPrint: props.forPrint }))); - } - } - - class DayTableView extends TableView { - constructor() { - super(...arguments); - this.buildDayTableModel = internal$1.memoize(buildDayTableModel); - this.headerRef = preact.createRef(); - this.tableRef = preact.createRef(); - } - render() { - let { options, dateProfileGenerator } = this.context; - let { props } = this; - let dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator); - let headerContent = options.dayHeaders && (preact.createElement(internal$1.DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 })); - let bodyContent = (contentArg) => (preact.createElement(DayTable, { ref: this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, 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, dayTableModel.colCnt, options.dayMinWidth) - : this.renderSimpleLayout(headerContent, bodyContent); - } - } - function buildDayTableModel(dateProfile, dateProfileGenerator) { - let daySeries = new internal$1.DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); - return new internal$1.DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); - } - - class TableDateProfileGenerator extends internal$1.DateProfileGenerator { - // Computes the date range that will be rendered. - buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) { - let { dateEnv } = this.props; - let renderRange = super.buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay); - let start = renderRange.start; - let end = renderRange.end; - let endOfWeek; - // year and month views should be aligned with weeks. this is already done for week - if (/^(year|month)$/.test(currentRangeUnit)) { - start = dateEnv.startOfWeek(start); - // make end-of-week if not already - endOfWeek = dateEnv.startOfWeek(end); - if (endOfWeek.valueOf() !== end.valueOf()) { - end = internal$1.addWeeks(endOfWeek, 1); - } - } - // ensure 6 weeks - if (this.props.monthMode && - this.props.fixedWeekCount) { - let rowCnt = Math.ceil(// could be partial weeks due to hiddenDays - internal$1.diffWeeks(start, end)); - end = internal$1.addWeeks(end, 6 - rowCnt); - } - return { start, end }; - } - } - - var css_248z = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}"; - internal$1.injectStyles(css_248z); - - var plugin = core.createPlugin({ - name: '@fullcalendar/daygrid', - initialView: 'dayGridMonth', - views: { - dayGrid: { - component: DayTableView, - dateProfileGeneratorClass: TableDateProfileGenerator, - }, - dayGridDay: { - type: 'dayGrid', - duration: { days: 1 }, - }, - dayGridWeek: { - type: 'dayGrid', - duration: { weeks: 1 }, - }, - dayGridMonth: { - type: 'dayGrid', - duration: { months: 1 }, - monthMode: true, - fixedWeekCount: true, - }, - }, - }); - - var internal = { - __proto__: null, - DayTable: DayTable, - DayTableSlicer: DayTableSlicer, - Table: Table, - TableView: TableView, - buildDayTableModel: buildDayTableModel, - DayGridView: DayTableView - }; - - core.globalPlugins.push(plugin); - - exports.Internal = internal; - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, FullCalendar.Internal, FullCalendar.Preact); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/daygrid/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/daygrid/index.global.min.js deleted file mode 100644 index d2a13101..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/daygrid/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Day Grid Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/month-view -(c) 2022 Adam Shaw -*/ -FullCalendar.DayGrid=function(e,t,n,s){"use strict";class i extends n.DateComponent{constructor(){super(...arguments),this.headerElRef=s.createRef()}renderSimpleLayout(e,t){let{props:i,context:r}=this,a=[],l=n.getStickyHeaderDates(r.options);return e&&a.push({type:"header",key:"header",isSticky:l,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),a.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),s.createElement(n.ViewContainer,{elClasses:["fc-daygrid"],viewSpec:r.viewSpec},s.createElement(n.SimpleScrollGrid,{liquid:!i.isHeightAuto&&!i.forPrint,collapsibleWidth:i.forPrint,cols:[],sections:a}))}renderHScrollLayout(e,t,i,r){let a=this.context.pluginHooks.scrollGridImpl;if(!a)throw new Error("No ScrollGrid implementation");let{props:l,context:o}=this,d=!l.forPrint&&n.getStickyHeaderDates(o.options),c=!l.forPrint&&n.getStickyFooterScrollbar(o.options),g=[];return e&&g.push({type:"header",key:"header",isSticky:d,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),g.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),c&&g.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:n.renderScrollShim}]}),s.createElement(n.ViewContainer,{elClasses:["fc-daygrid"],viewSpec:o.viewSpec},s.createElement(a,{liquid:!l.isHeightAuto&&!l.forPrint,collapsibleWidth:l.forPrint,colGroups:[{cols:[{span:i,minWidth:r}]}],sections:g}))}}function r(e,t){let n=[];for(let e=0;e{let i=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return s.createElement(s.Fragment,null,t.map(t=>{let r=t.eventRange.instance.instanceId;return s.createElement("div",{className:"fc-daygrid-event-harness",key:r,style:{visibility:i[r]?"hidden":""}},d(t)?s.createElement(g,Object.assign({seg:t,isDragging:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},n.getSegMeta(t,e.todayRange))):s.createElement(c,Object.assign({seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},n.getSegMeta(t,e.todayRange))))}))}})}}function u(e){let t=[],n=[];for(let s of e)t.push(s.seg),s.isVisible||n.push(s.seg);return{allSegs:t,invisibleSegs:n}}const p=n.createFormatter({week:"narrow"});class y extends n.DateComponent{constructor(){super(...arguments),this.rootElRef=s.createRef(),this.state={dayNumberId:n.getUniqueDomId()},this.handleRootEl=e=>{n.setRef(this.rootElRef,e),n.setRef(this.props.elRef,e)}}render(){let{context:e,props:t,state:i,rootElRef:r}=this,{options:a}=e,{date:l,dateProfile:o}=t;return s.createElement(n.DayCellContainer,{elTag:"td",elRef:this.handleRootEl,elClasses:["fc-daygrid-day",...t.extraClassNames||[]],elAttrs:Object.assign(Object.assign(Object.assign({},t.extraDataAttrs),t.showDayNumber?{"aria-labelledby":i.dayNumberId}:{}),{role:"gridcell"}),defaultGenerator:m,date:l,dateProfile:o,todayRange:t.todayRange,showDayNumber:t.showDayNumber,extraRenderProps:t.extraRenderProps},(o,d)=>s.createElement("div",{className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",ref:t.innerElRef},t.showWeekNumber&&s.createElement(n.WeekNumberContainer,{elTag:"a",elClasses:["fc-daygrid-week-number"],elAttrs:n.buildNavLinkAttrs(e,l,"week"),date:l,defaultFormat:p}),Boolean(!d.isDisabled&&(t.showDayNumber||n.hasCustomDayCellContent(a)||t.forceDayTop))&&s.createElement("div",{className:"fc-daygrid-day-top"},s.createElement(o,{elTag:"a",elClasses:["fc-daygrid-day-number"],elAttrs:Object.assign(Object.assign({},n.buildNavLinkAttrs(e,l)),{id:i.dayNumberId})})),s.createElement("div",{className:"fc-daygrid-day-events",ref:t.fgContentElRef},t.fgContent,s.createElement("div",{className:"fc-daygrid-day-bottom",style:{marginTop:t.moreMarginTop}},s.createElement(h,{allDayDate:l,singlePlacements:t.singlePlacements,moreCnt:t.moreCnt,alignmentElRef:r,alignGridTop:!t.showDayNumber,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,todayRange:t.todayRange}))),s.createElement("div",{className:"fc-daygrid-day-bg"},t.bgContent)))}}function m(e){return e.dayNumberText||s.createElement(s.Fragment,null," ")}function v(e,t,n,s,i,r,a){let l=new R;l.allowReslicing=!0,l.strictOrder=s,!0===t||!0===n?(l.maxCoord=r,l.hiddenConsumes=!0):"number"==typeof t?l.maxStackCnt=t:"number"==typeof n&&(l.maxStackCnt=n,l.hiddenConsumes=!0);let o=[],d=[];for(let t=0;t1,a=s.span.start===e;c+=s.levelCoord-d,d=s.levelCoord+s.thickness,r?(c+=s.thickness,a&&g.push({seg:b(i,s.span.start,s.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:s.levelCoord,marginTop:0})):a&&(g.push({seg:b(i,s.span.start,s.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:s.levelCoord,marginTop:c}),c=0)}i.push(o),r.push(g),a.push(c)}return{singleColPlacements:i,multiColPlacements:r,leftoverMargins:a}}(g,e,a),p=[],y=[];for(let e of d){h[e.firstCol].push({seg:e,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let t=e.firstCol;t<=e.lastCol;t+=1)f[t].push({seg:b(e,t,t+1,a),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e!this.forceHidden[n.buildEntryKey(e)];for(let e=0;e{e&&this.updateSizing(!0)}}render(){let{props:e,state:t,context:i}=this,{options:r}=i,l=e.cells.length,o=a(e.businessHourSegs,l),d=a(e.bgEventSegs,l),c=a(this.getHighlightSegs(),l),g=a(this.getMirrorSegs(),l),{singleColPlacements:f,multiColPlacements:h,moreCnts:u,moreMarginTops:p}=v(n.sortEventSegs(e.fgEventSegs,r.eventOrder),e.dayMaxEvents,e.dayMaxEventRows,r.eventOrderStrict,t.eventInstanceHeights,t.maxContentHeight,e.cells),m=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{};return s.createElement("tr",{ref:this.rootElRef,role:"row"},e.renderIntro&&e.renderIntro(),e.cells.map((t,n)=>{let i=this.renderFgSegs(n,e.forPrint?f[n]:h[n],e.todayRange,m),r=this.renderFgSegs(n,function(e,t){if(!e.length)return[];let n=function(e){let t={};for(let n of e)for(let e of n)t[e.seg.eventRange.instance.instanceId]=e.absoluteTop;return t}(t);return e.map(e=>({seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0}))}(g[n],h),e.todayRange,{},Boolean(e.eventDrag),Boolean(e.eventResize),!1);return s.createElement(y,{key:t.key,elRef:this.cellElRefs.createRef(t.key),innerElRef:this.frameElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,showDayNumber:e.showDayNumbers,showWeekNumber:e.showWeekNumbers&&0===n,forceDayTop:e.showWeekNumbers,todayRange:e.todayRange,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:u[n],moreMarginTop:p[n],singlePlacements:f[n],fgContentElRef:this.fgElRefs.createRef(t.key),fgContent:s.createElement(s.Fragment,null,s.createElement(s.Fragment,null,i),s.createElement(s.Fragment,null,r)),bgContent:s.createElement(s.Fragment,null,this.renderFillSegs(c[n],"highlight"),this.renderFillSegs(o[n],"non-business"),this.renderFillSegs(d[n],"bg-event"))})}))}componentDidMount(){this.updateSizing(!0),this.context.addResizeHandler(this.handleResize)}componentDidUpdate(e,t){let s=this.props;this.updateSizing(!n.isPropsEqual(e,s))}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}getHighlightSegs(){let{props:e}=this;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs}getMirrorSegs(){let{props:e}=this;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]}renderFgSegs(e,t,i,r,a,l,o){let{context:f}=this,{eventSelection:h}=this.props,{framePositions:u}=this.state,p=1===this.props.cells.length,y=a||l||o,m=[];if(u)for(let v of t){let{seg:t}=v,{instanceId:b}=t.eventRange.instance,R=b+":"+e,E=v.isVisible&&!r[b],S=v.isAbsolute,x="",C="";S&&(f.isRtl?(C=0,x=u.lefts[t.lastCol]-u.lefts[t.firstCol]):(x=0,C=u.rights[t.firstCol]-u.rights[t.lastCol])),m.push(s.createElement("div",{className:"fc-daygrid-event-harness"+(S?" fc-daygrid-event-harness-abs":""),key:R,ref:y?null:this.segHarnessRefs.createRef(R),style:{visibility:E?"":"hidden",marginTop:S?"":v.marginTop,top:S?v.absoluteTop:"",left:x,right:C}},d(t)?s.createElement(g,Object.assign({seg:t,isDragging:a,isSelected:b===h,defaultDisplayEventEnd:p},n.getSegMeta(t,i))):s.createElement(c,Object.assign({seg:t,isDragging:a,isResizing:l,isDateSelecting:o,isSelected:b===h,defaultDisplayEventEnd:p},n.getSegMeta(t,i)))))}return m}renderFillSegs(e,t){let{isRtl:i}=this.context,{todayRange:r}=this.props,{framePositions:a}=this.state,l=[];if(a)for(let o of e){let e=i?{right:0,left:a.lefts[o.lastCol]-a.lefts[o.firstCol]}:{left:0,right:a.rights[o.firstCol]-a.rights[o.lastCol]};l.push(s.createElement("div",{key:n.buildEventRangeKey(o.eventRange),className:"fc-daygrid-bg-harness",style:e},"bg-event"===t?s.createElement(n.BgEvent,Object.assign({seg:o},n.getSegMeta(o,r))):n.renderFill(t)))}return s.createElement(s.Fragment,{},...l)}updateSizing(e){let{props:t,frameElRefs:s}=this;if(!t.forPrint&&null!==t.clientWidth){if(e){let e=t.cells.map(e=>s.currentMap[e.key]);if(e.length){let t=this.rootElRef.current;this.setState({framePositions:new n.PositionCache(t,e,!0,!1)})}}const i=this.state.eventInstanceHeights,r=this.queryEventInstanceHeights(),a=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.safeSetState({eventInstanceHeights:Object.assign(Object.assign({},i),r),maxContentHeight:a?this.computeMaxContentHeight():null})}}queryEventInstanceHeights(){let e=this.segHarnessRefs.currentMap,t={};for(let n in e){let s=Math.round(e[n].getBoundingClientRect().height),i=n.split(":")[0];t[i]=Math.max(t[i]||0,s)}return t}computeMaxContentHeight(){let e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top}getCellEls(){let e=this.cellElRefs.currentMap;return this.props.cells.map(t=>e[t.key])}}E.addStateEquality({eventInstanceHeights:n.isPropsEqual});class S extends n.DateComponent{constructor(){super(...arguments),this.splitBusinessHourSegs=n.memoize(r),this.splitBgEventSegs=n.memoize(r),this.splitFgEventSegs=n.memoize(r),this.splitDateSelectionSegs=n.memoize(r),this.splitEventDrag=n.memoize(l),this.splitEventResize=n.memoize(l),this.rowRefs=new n.RefMap,this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e}=this,{dateProfile:t,dayMaxEventRows:i,dayMaxEvents:r,expandRows:a}=e,l=e.cells.length,o=this.splitBusinessHourSegs(e.businessHourSegs,l),d=this.splitBgEventSegs(e.bgEventSegs,l),c=this.splitFgEventSegs(e.fgEventSegs,l),g=this.splitDateSelectionSegs(e.dateSelectionSegs,l),f=this.splitEventDrag(e.eventDrag,l),h=this.splitEventResize(e.eventResize,l),u=!0===r||!0===i;u&&!a&&(u=!1,i=null,r=null);let p=["fc-daygrid-body",u?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",a?"":"fc-daygrid-body-natural"];return s.createElement("div",{className:p.join(" "),ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},s.createElement(n.NowTimer,{unit:"day"},(n,u)=>s.createElement(s.Fragment,null,s.createElement("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:e.clientWidth,minWidth:e.tableMinWidth,height:a?e.clientHeight:""}},e.colGroupNode,s.createElement("tbody",{role:"presentation"},e.cells.map((n,a)=>s.createElement(E,{ref:this.rowRefs.createRef(a),key:n.length?n[0].date.toISOString():a,showDayNumbers:l>1,showWeekNumbers:e.showWeekNumbers,todayRange:u,dateProfile:t,cells:n,renderIntro:e.renderRowIntro,businessHourSegs:o[a],eventSelection:e.eventSelection,bgEventSegs:d[a].filter(x),fgEventSegs:c[a],dateSelectionSegs:g[a],eventDrag:f[a],eventResize:h[a],dayMaxEvents:r,dayMaxEventRows:i,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint})))))))}prepareHits(){this.rowPositions=new n.PositionCache(this.rootEl,this.rowRefs.collect().map(e=>e.getCellEls()[0]),!1,!0),this.colPositions=new n.PositionCache(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)}queryHit(e,t){let{colPositions:n,rowPositions:s}=this,i=n.leftToIndex(e),r=s.topToIndex(t);if(null!=r&&null!=i){let e=this.props.cells[r][i];return{dateProfile:this.props.dateProfile,dateSpan:Object.assign({range:this.getCellRange(r,i),allDay:!0},e.extraDateSpan),dayEl:this.getCellEl(r,i),rect:{left:n.lefts[i],right:n.rights[i],top:s.tops[r],bottom:s.bottoms[r]},layer:0}}return null}getCellEl(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]}getCellRange(e,t){let s=this.props.cells[e][t].date;return{start:s,end:n.addDays(s,1)}}}function x(e){return e.eventRange.def.allDay}class C extends n.Slicer{constructor(){super(...arguments),this.forceDayIfListItem=!0}sliceRange(e,t){return t.sliceRange(e)}}class w extends n.DateComponent{constructor(){super(...arguments),this.slicer=new C,this.tableRef=s.createRef()}render(){let{props:e,context:t}=this;return s.createElement(S,Object.assign({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}))}}class D extends i{constructor(){super(...arguments),this.buildDayTableModel=n.memoize(k),this.headerRef=s.createRef(),this.tableRef=s.createRef()}render(){let{options:e,dateProfileGenerator:t}=this.context,{props:i}=this,r=this.buildDayTableModel(i.dateProfile,t),a=e.dayHeaders&&s.createElement(n.DayHeader,{ref:this.headerRef,dateProfile:i.dateProfile,dates:r.headerDates,datesRepDistinctDays:1===r.rowCnt}),l=t=>s.createElement(w,{ref:this.tableRef,dateProfile:i.dateProfile,dayTableModel:r,businessHours:i.businessHours,dateSelection:i.dateSelection,eventStore:i.eventStore,eventUiBases:i.eventUiBases,eventSelection:i.eventSelection,eventDrag:i.eventDrag,eventResize:i.eventResize,nextDayThreshold:e.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.weekNumbers,expandRows:!i.isHeightAuto,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:i.forPrint});return e.dayMinWidth?this.renderHScrollLayout(a,l,r.colCnt,e.dayMinWidth):this.renderSimpleLayout(a,l)}}function k(e,t){let s=new n.DaySeriesModel(e.renderRange,t);return new n.DayTableModel(s,/year|month|week/.test(e.currentRangeUnit))}class P extends n.DateProfileGenerator{buildRenderRange(e,t,s){let i,{dateEnv:r}=this.props,a=super.buildRenderRange(e,t,s),l=a.start,o=a.end;if(/^(year|month)$/.test(t)&&(l=r.startOfWeek(l),i=r.startOfWeek(o),i.valueOf()!==o.valueOf()&&(o=n.addWeeks(i,1))),this.props.monthMode&&this.props.fixedWeekCount){let e=Math.ceil(n.diffWeeks(l,o));o=n.addWeeks(o,6-e)}return{start:l,end:o}}}n.injectStyles(':root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:"";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:"";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}');var M=t.createPlugin({name:"@fullcalendar/daygrid",initialView:"dayGridMonth",views:{dayGrid:{component:D,dateProfileGeneratorClass:P},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),T={__proto__:null,DayTable:w,DayTableSlicer:C,Table:S,TableView:i,buildDayTableModel:k,DayGridView:D};return t.globalPlugins.push(M),e.Internal=T,e.default=M,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,FullCalendar.Preact); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/google-calendar/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/google-calendar/index.global.js deleted file mode 100644 index 460862e1..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/google-calendar/index.global.js +++ /dev/null @@ -1,150 +0,0 @@ -/*! -FullCalendar Google Calendar Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/google-calendar -(c) 2022 Adam Shaw -*/ -FullCalendar.GoogleCalendar = (function (exports, core, internal) { - 'use strict'; - - // TODO: expose somehow - const API_BASE = 'https://www.googleapis.com/calendar/v3/calendars'; - const eventSourceDef = { - parseMeta(refined) { - let { googleCalendarId } = refined; - if (!googleCalendarId && refined.url) { - googleCalendarId = parseGoogleCalendarId(refined.url); - } - if (googleCalendarId) { - return { - googleCalendarId, - googleCalendarApiKey: refined.googleCalendarApiKey, - googleCalendarApiBase: refined.googleCalendarApiBase, - extraParams: refined.extraParams, - }; - } - return null; - }, - fetch(arg, successCallback, errorCallback) { - let { dateEnv, options } = arg.context; - let meta = arg.eventSource.meta; - let apiKey = meta.googleCalendarApiKey || options.googleCalendarApiKey; - if (!apiKey) { - errorCallback(new Error('Specify a googleCalendarApiKey. See https://fullcalendar.io/docs/google-calendar')); - } - else { - let url = buildUrl(meta); - // TODO: make DRY with json-feed-event-source - let { extraParams } = meta; - let extraParamsObj = typeof extraParams === 'function' ? extraParams() : extraParams; - let requestParams = buildRequestParams(arg.range, apiKey, extraParamsObj, dateEnv); - return internal.requestJson('GET', url, requestParams).then(([body, response]) => { - if (body.error) { - errorCallback(new core.JsonRequestError('Google Calendar API: ' + body.error.message, response)); - } - else { - successCallback({ - rawEvents: gcalItemsToRawEventDefs(body.items, requestParams.timeZone), - response, - }); - } - }, errorCallback); - } - }, - }; - function parseGoogleCalendarId(url) { - let match; - // detect if the ID was specified as a single string. - // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars. - if (/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) { - return url; - } - if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(url)) || - (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(url))) { - return decodeURIComponent(match[1]); - } - return null; - } - function buildUrl(meta) { - let apiBase = meta.googleCalendarApiBase; - if (!apiBase) { - apiBase = API_BASE; - } - return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events'; - } - function buildRequestParams(range, apiKey, extraParams, dateEnv) { - let params; - let startStr; - let endStr; - if (dateEnv.canComputeOffset) { - // strings will naturally have offsets, which GCal needs - startStr = dateEnv.formatIso(range.start); - endStr = dateEnv.formatIso(range.end); - } - else { - // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day - // from the UTC day-start to guarantee we're getting all the events - // (start/end will be UTC-coerced dates, so toISOString is okay) - startStr = internal.addDays(range.start, -1).toISOString(); - endStr = internal.addDays(range.end, 1).toISOString(); - } - params = Object.assign(Object.assign({}, (extraParams || {})), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 }); - if (dateEnv.timeZone !== 'local') { - params.timeZone = dateEnv.timeZone; - } - return params; - } - function gcalItemsToRawEventDefs(items, gcalTimezone) { - return items.map((item) => gcalItemToRawEventDef(item, gcalTimezone)); - } - function gcalItemToRawEventDef(item, gcalTimezone) { - let url = item.htmlLink || null; - // make the URLs for each event show times in the correct timezone - if (url && gcalTimezone) { - url = injectQsComponent(url, 'ctz=' + gcalTimezone); - } - return { - id: item.id, - title: item.summary, - start: item.start.dateTime || item.start.date, - end: item.end.dateTime || item.end.date, - url, - location: item.location, - description: item.description, - attachments: item.attachments || [], - extendedProps: (item.extendedProperties || {}).shared || {}, - }; - } - // Injects a string like "arg=value" into the querystring of a URL - // TODO: move to a general util file? - function injectQsComponent(url, component) { - // inject it after the querystring but before the fragment - return url.replace(/(\?.*?)?(#|$)/, (whole, qs, hash) => (qs ? qs + '&' : '?') + component + hash); - } - - const OPTION_REFINERS = { - googleCalendarApiKey: String, - }; - - const EVENT_SOURCE_REFINERS = { - googleCalendarApiKey: String, - googleCalendarId: String, - googleCalendarApiBase: String, - extraParams: internal.identity, - }; - - var plugin = core.createPlugin({ - name: '@fullcalendar/google-calendar', - eventSourceDefs: [eventSourceDef], - optionRefiners: OPTION_REFINERS, - eventSourceRefiners: EVENT_SOURCE_REFINERS, - }); - - core.globalPlugins.push(plugin); - - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/google-calendar/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/google-calendar/index.global.min.js deleted file mode 100644 index 896dc9ea..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/google-calendar/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Google Calendar Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/google-calendar -(c) 2022 Adam Shaw -*/ -FullCalendar.GoogleCalendar=function(e,a,t){"use strict";const n={parseMeta(e){let{googleCalendarId:a}=e;return!a&&e.url&&(a=function(e){let a;if(/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(e))return e;if((a=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(e))||(a=/^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(e)))return decodeURIComponent(a[1]);return null}(e.url)),a?{googleCalendarId:a,googleCalendarApiKey:e.googleCalendarApiKey,googleCalendarApiBase:e.googleCalendarApiBase,extraParams:e.extraParams}:null},fetch(e,n,r){let{dateEnv:o,options:l}=e.context,s=e.eventSource.meta,i=s.googleCalendarApiKey||l.googleCalendarApiKey;if(i){let l=function(e){let a=e.googleCalendarApiBase;a||(a="https://www.googleapis.com/calendar/v3/calendars");return a+"/"+encodeURIComponent(e.googleCalendarId)+"/events"}(s),{extraParams:d}=s,g="function"==typeof d?d():d,c=function(e,a,n,r){let o,l,s;r.canComputeOffset?(l=r.formatIso(e.start),s=r.formatIso(e.end)):(l=t.addDays(e.start,-1).toISOString(),s=t.addDays(e.end,1).toISOString());o=Object.assign(Object.assign({},n||{}),{key:a,timeMin:l,timeMax:s,singleEvents:!0,maxResults:9999}),"local"!==r.timeZone&&(o.timeZone=r.timeZone);return o}(e.range,i,g,o);return t.requestJson("GET",l,c).then(([e,t])=>{var o,l;e.error?r(new a.JsonRequestError("Google Calendar API: "+e.error.message,t)):n({rawEvents:(o=e.items,l=c.timeZone,o.map(e=>function(e,a){let t=e.htmlLink||null;t&&a&&(t=function(e,a){return e.replace(/(\?.*?)?(#|$)/,(e,t,n)=>(t?t+"&":"?")+a+n)}(t,"ctz="+a));return{id:e.id,title:e.summary,start:e.start.dateTime||e.start.date,end:e.end.dateTime||e.end.date,url:t,location:e.location,description:e.description,attachments:e.attachments||[],extendedProps:(e.extendedProperties||{}).shared||{}}}(e,l))),response:t})},r)}r(new Error("Specify a googleCalendarApiKey. See https://fullcalendar.io/docs/google-calendar"))}};const r={googleCalendarApiKey:String},o={googleCalendarApiKey:String,googleCalendarId:String,googleCalendarApiBase:String,extraParams:t.identity};var l=a.createPlugin({name:"@fullcalendar/google-calendar",eventSourceDefs:[n],optionRefiners:r,eventSourceRefiners:o});return a.globalPlugins.push(l),e.default=l,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/icalendar/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/icalendar/index.global.js deleted file mode 100644 index e3640a68..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/icalendar/index.global.js +++ /dev/null @@ -1,225 +0,0 @@ -/*! -FullCalendar iCalendar Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/icalendar -(c) 2022 Adam Shaw -*/ -FullCalendar.ICalendar = (function (exports, core, internal, ICAL) { - 'use strict'; - - function _interopNamespace(e) { - if (e && e.__esModule) return e; - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== 'default') { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function () { return e[k]; } - }); - } - }); - } - n["default"] = e; - return n; - } - - var ICAL__namespace = /*#__PURE__*/_interopNamespace(ICAL); - - /* eslint-disable */ - class IcalExpander { - constructor(opts) { - this.maxIterations = opts.maxIterations != null ? opts.maxIterations : 1000; - this.skipInvalidDates = opts.skipInvalidDates != null ? opts.skipInvalidDates : false; - this.jCalData = ICAL__namespace.parse(opts.ics); - this.component = new ICAL__namespace.Component(this.jCalData); - this.events = this.component.getAllSubcomponents('vevent').map(vevent => new ICAL__namespace.Event(vevent)); - if (this.skipInvalidDates) { - this.events = this.events.filter((evt) => { - try { - evt.startDate.toJSDate(); - evt.endDate.toJSDate(); - return true; - } - catch (err) { - // skipping events with invalid time - return false; - } - }); - } - } - between(after, before) { - function isEventWithinRange(startTime, endTime) { - return (!after || endTime >= after.getTime()) && - (!before || startTime <= before.getTime()); - } - function getTimes(eventOrOccurrence) { - const startTime = eventOrOccurrence.startDate.toJSDate().getTime(); - let endTime = eventOrOccurrence.endDate.toJSDate().getTime(); - // If it is an all day event, the end date is set to 00:00 of the next day - // So we need to make it be 23:59:59 to compare correctly with the given range - if (eventOrOccurrence.endDate.isDate && (endTime > startTime)) { - endTime -= 1; - } - return { startTime, endTime }; - } - const exceptions = []; - this.events.forEach((event) => { - if (event.isRecurrenceException()) - exceptions.push(event); - }); - const ret = { - events: [], - occurrences: [], - }; - this.events.filter(e => !e.isRecurrenceException()).forEach((event) => { - const exdates = []; - event.component.getAllProperties('exdate').forEach((exdateProp) => { - const exdate = exdateProp.getFirstValue(); - exdates.push(exdate.toJSDate().getTime()); - }); - // Recurring event is handled differently - if (event.isRecurring()) { - const iterator = event.iterator(); - let next; - let i = 0; - do { - i += 1; - next = iterator.next(); - if (next) { - const occurrence = event.getOccurrenceDetails(next); - const { startTime, endTime } = getTimes(occurrence); - const isOccurrenceExcluded = exdates.indexOf(startTime) !== -1; - // TODO check that within same day? - const exception = exceptions.find(ex => ex.uid === event.uid && ex.recurrenceId.toJSDate().getTime() === occurrence.startDate.toJSDate().getTime()); - // We have passed the max date, stop - if (before && startTime > before.getTime()) - break; - // Check that we are within our range - if (isEventWithinRange(startTime, endTime)) { - if (exception) { - ret.events.push(exception); - } - else if (!isOccurrenceExcluded) { - ret.occurrences.push(occurrence); - } - } - } - } while (next && (!this.maxIterations || i < this.maxIterations)); - return; - } - // Non-recurring event: - const { startTime, endTime } = getTimes(event); - if (isEventWithinRange(startTime, endTime)) - ret.events.push(event); - }); - return ret; - } - before(before) { - return this.between(undefined, before); - } - after(after) { - return this.between(after); - } - all() { - return this.between(); - } - } - - const eventSourceDef = { - parseMeta(refined) { - if (refined.url && refined.format === 'ics') { - return { - url: refined.url, - format: 'ics', - }; - } - return null; - }, - fetch(arg, successCallback, errorCallback) { - let meta = arg.eventSource.meta; - let { internalState } = meta; - /* - NOTE: isRefetch is a HACK. we would do the recurring-expanding in a separate plugin hook, - but we couldn't leverage built-in allDay-guessing, among other things. - */ - if (!internalState || arg.isRefetch) { - internalState = meta.internalState = { - response: null, - iCalExpanderPromise: fetch(meta.url, { method: 'GET' }).then((response) => { - return response.text().then((icsText) => { - internalState.response = response; - return new IcalExpander({ - ics: icsText, - skipInvalidDates: true, - }); - }); - }), - }; - } - internalState.iCalExpanderPromise.then((iCalExpander) => { - successCallback({ - rawEvents: expandICalEvents(iCalExpander, arg.range), - response: internalState.response, - }); - }, errorCallback); - }, - }; - function expandICalEvents(iCalExpander, range) { - // expand the range. because our `range` is timeZone-agnostic UTC - // or maybe because ical.js always produces dates in local time? i forget - let rangeStart = internal.addDays(range.start, -1); - let rangeEnd = internal.addDays(range.end, 1); - let iCalRes = iCalExpander.between(rangeStart, rangeEnd); // end inclusive. will give extra results - let expanded = []; - // TODO: instead of using startDate/endDate.toString to communicate allDay, - // we can query startDate/endDate.isDate. More efficient to avoid formatting/reparsing. - // single events - for (let iCalEvent of iCalRes.events) { - expanded.push(Object.assign(Object.assign({}, buildNonDateProps(iCalEvent)), { start: iCalEvent.startDate.toString(), end: (specifiesEnd(iCalEvent) && iCalEvent.endDate) - ? iCalEvent.endDate.toString() - : null })); - } - // recurring event instances - for (let iCalOccurence of iCalRes.occurrences) { - let iCalEvent = iCalOccurence.item; - expanded.push(Object.assign(Object.assign({}, buildNonDateProps(iCalEvent)), { start: iCalOccurence.startDate.toString(), end: (specifiesEnd(iCalEvent) && iCalOccurence.endDate) - ? iCalOccurence.endDate.toString() - : null })); - } - return expanded; - } - function buildNonDateProps(iCalEvent) { - return { - title: iCalEvent.summary, - url: extractEventUrl(iCalEvent), - extendedProps: { - location: iCalEvent.location, - organizer: iCalEvent.organizer, - description: iCalEvent.description, - }, - }; - } - function extractEventUrl(iCalEvent) { - let urlProp = iCalEvent.component.getFirstProperty('url'); - return urlProp ? urlProp.getFirstValue() : ''; - } - function specifiesEnd(iCalEvent) { - return Boolean(iCalEvent.component.getFirstProperty('dtend')) || - Boolean(iCalEvent.component.getFirstProperty('duration')); - } - - var plugin = core.createPlugin({ - name: '@fullcalendar/icalendar', - eventSourceDefs: [eventSourceDef], - }); - - core.globalPlugins.push(plugin); - - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, FullCalendar.Internal, ICAL); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/icalendar/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/icalendar/index.global.min.js deleted file mode 100644 index f7005f25..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/icalendar/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar iCalendar Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/icalendar -(c) 2022 Adam Shaw -*/ -FullCalendar.ICalendar=function(e,t,n,r){"use strict";function a(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,t}var s=a(r);class i{constructor(e){this.maxIterations=null!=e.maxIterations?e.maxIterations:1e3,this.skipInvalidDates=null!=e.skipInvalidDates&&e.skipInvalidDates,this.jCalData=s.parse(e.ics),this.component=new s.Component(this.jCalData),this.events=this.component.getAllSubcomponents("vevent").map(e=>new s.Event(e)),this.skipInvalidDates&&(this.events=this.events.filter(e=>{try{return e.startDate.toJSDate(),e.endDate.toJSDate(),!0}catch(e){return!1}}))}between(e,t){function n(n,r){return(!e||r>=e.getTime())&&(!t||n<=t.getTime())}function r(e){const t=e.startDate.toJSDate().getTime();let n=e.endDate.toJSDate().getTime();return e.endDate.isDate&&n>t&&(n-=1),{startTime:t,endTime:n}}const a=[];this.events.forEach(e=>{e.isRecurrenceException()&&a.push(e)});const s={events:[],occurrences:[]};return this.events.filter(e=>!e.isRecurrenceException()).forEach(e=>{const i=[];if(e.component.getAllProperties("exdate").forEach(e=>{const t=e.getFirstValue();i.push(t.toJSDate().getTime())}),e.isRecurring()){const o=e.iterator();let c,l=0;do{if(l+=1,c=o.next(),c){const o=e.getOccurrenceDetails(c),{startTime:l,endTime:u}=r(o),d=-1!==i.indexOf(l),p=a.find(t=>t.uid===e.uid&&t.recurrenceId.toJSDate().getTime()===o.startDate.toJSDate().getTime());if(t&&l>t.getTime())break;n(l,u)&&(p?s.events.push(p):d||s.occurrences.push(o))}}while(c&&(!this.maxIterations||le.url&&"ics"===e.format?{url:e.url,format:"ics"}:null,fetch(e,t,n){let r=e.eventSource.meta,{internalState:a}=r;a&&!e.isRefetch||(a=r.internalState={response:null,iCalExpanderPromise:fetch(r.url,{method:"GET"}).then(e=>e.text().then(t=>(a.response=e,new i({ics:t,skipInvalidDates:!0}))))}),a.iCalExpanderPromise.then(n=>{t({rawEvents:c(n,e.range),response:a.response})},n)}};function c(e,t){let r=n.addDays(t.start,-1),a=n.addDays(t.end,1),s=e.between(r,a),i=[];for(let e of s.events)i.push(Object.assign(Object.assign({},l(e)),{start:e.startDate.toString(),end:d(e)&&e.endDate?e.endDate.toString():null}));for(let e of s.occurrences){let t=e.item;i.push(Object.assign(Object.assign({},l(t)),{start:e.startDate.toString(),end:d(t)&&e.endDate?e.endDate.toString():null}))}return i}function l(e){return{title:e.summary,url:u(e),extendedProps:{location:e.location,organizer:e.organizer,description:e.description}}}function u(e){let t=e.component.getFirstProperty("url");return t?t.getFirstValue():""}function d(e){return Boolean(e.component.getFirstProperty("dtend"))||Boolean(e.component.getFirstProperty("duration"))}var p=t.createPlugin({name:"@fullcalendar/icalendar",eventSourceDefs:[o]});return t.globalPlugins.push(p),e.default=p,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,ICAL); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/interaction/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/interaction/index.global.js deleted file mode 100644 index 043fdc1b..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/interaction/index.global.js +++ /dev/null @@ -1,2114 +0,0 @@ -/*! -FullCalendar Interaction Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/editable -(c) 2022 Adam Shaw -*/ -FullCalendar.Interaction = (function (exports, core, internal) { - 'use strict'; - - internal.config.touchMouseIgnoreWait = 500; - let ignoreMouseDepth = 0; - let listenerCnt = 0; - let isWindowTouchMoveCancelled = false; - /* - Uses a "pointer" abstraction, which monitors UI events for both mouse and touch. - Tracks when the pointer "drags" on a certain element, meaning down+move+up. - - Also, tracks if there was touch-scrolling. - Also, can prevent touch-scrolling from happening. - Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement. - - emits: - - pointerdown - - pointermove - - pointerup - */ - class PointerDragging { - constructor(containerEl) { - this.subjectEl = null; - // options that can be directly assigned by caller - this.selector = ''; // will cause subjectEl in all emitted events to be this element - this.handleSelector = ''; - this.shouldIgnoreMove = false; - this.shouldWatchScroll = true; // for simulating pointermove on scroll - // internal states - this.isDragging = false; - this.isTouchDragging = false; - this.wasTouchScroll = false; - // Mouse - // ---------------------------------------------------------------------------------------------------- - this.handleMouseDown = (ev) => { - if (!this.shouldIgnoreMouse() && - isPrimaryMouseButton(ev) && - this.tryStart(ev)) { - let pev = this.createEventFromMouse(ev, true); - this.emitter.trigger('pointerdown', pev); - this.initScrollWatch(pev); - if (!this.shouldIgnoreMove) { - document.addEventListener('mousemove', this.handleMouseMove); - } - document.addEventListener('mouseup', this.handleMouseUp); - } - }; - this.handleMouseMove = (ev) => { - let pev = this.createEventFromMouse(ev); - this.recordCoords(pev); - this.emitter.trigger('pointermove', pev); - }; - this.handleMouseUp = (ev) => { - document.removeEventListener('mousemove', this.handleMouseMove); - document.removeEventListener('mouseup', this.handleMouseUp); - this.emitter.trigger('pointerup', this.createEventFromMouse(ev)); - this.cleanup(); // call last so that pointerup has access to props - }; - // Touch - // ---------------------------------------------------------------------------------------------------- - this.handleTouchStart = (ev) => { - if (this.tryStart(ev)) { - this.isTouchDragging = true; - let pev = this.createEventFromTouch(ev, true); - this.emitter.trigger('pointerdown', pev); - this.initScrollWatch(pev); - // unlike mouse, need to attach to target, not document - // https://stackoverflow.com/a/45760014 - let targetEl = ev.target; - if (!this.shouldIgnoreMove) { - targetEl.addEventListener('touchmove', this.handleTouchMove); - } - targetEl.addEventListener('touchend', this.handleTouchEnd); - targetEl.addEventListener('touchcancel', this.handleTouchEnd); // treat it as a touch end - // attach a handler to get called when ANY scroll action happens on the page. - // this was impossible to do with normal on/off because 'scroll' doesn't bubble. - // http://stackoverflow.com/a/32954565/96342 - window.addEventListener('scroll', this.handleTouchScroll, true); - } - }; - this.handleTouchMove = (ev) => { - let pev = this.createEventFromTouch(ev); - this.recordCoords(pev); - this.emitter.trigger('pointermove', pev); - }; - this.handleTouchEnd = (ev) => { - if (this.isDragging) { // done to guard against touchend followed by touchcancel - let targetEl = ev.target; - targetEl.removeEventListener('touchmove', this.handleTouchMove); - targetEl.removeEventListener('touchend', this.handleTouchEnd); - targetEl.removeEventListener('touchcancel', this.handleTouchEnd); - window.removeEventListener('scroll', this.handleTouchScroll, true); // useCaptured=true - this.emitter.trigger('pointerup', this.createEventFromTouch(ev)); - this.cleanup(); // call last so that pointerup has access to props - this.isTouchDragging = false; - startIgnoringMouse(); - } - }; - this.handleTouchScroll = () => { - this.wasTouchScroll = true; - }; - this.handleScroll = (ev) => { - if (!this.shouldIgnoreMove) { - let pageX = (window.pageXOffset - this.prevScrollX) + this.prevPageX; - let pageY = (window.pageYOffset - this.prevScrollY) + this.prevPageY; - this.emitter.trigger('pointermove', { - origEvent: ev, - isTouch: this.isTouchDragging, - subjectEl: this.subjectEl, - pageX, - pageY, - deltaX: pageX - this.origPageX, - deltaY: pageY - this.origPageY, - }); - } - }; - this.containerEl = containerEl; - this.emitter = new internal.Emitter(); - containerEl.addEventListener('mousedown', this.handleMouseDown); - containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true }); - listenerCreated(); - } - destroy() { - this.containerEl.removeEventListener('mousedown', this.handleMouseDown); - this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true }); - listenerDestroyed(); - } - tryStart(ev) { - let subjectEl = this.querySubjectEl(ev); - let downEl = ev.target; - if (subjectEl && - (!this.handleSelector || internal.elementClosest(downEl, this.handleSelector))) { - this.subjectEl = subjectEl; - this.isDragging = true; // do this first so cancelTouchScroll will work - this.wasTouchScroll = false; - return true; - } - return false; - } - cleanup() { - isWindowTouchMoveCancelled = false; - this.isDragging = false; - this.subjectEl = null; - // keep wasTouchScroll around for later access - this.destroyScrollWatch(); - } - querySubjectEl(ev) { - if (this.selector) { - return internal.elementClosest(ev.target, this.selector); - } - return this.containerEl; - } - shouldIgnoreMouse() { - return ignoreMouseDepth || this.isTouchDragging; - } - // can be called by user of this class, to cancel touch-based scrolling for the current drag - cancelTouchScroll() { - if (this.isDragging) { - isWindowTouchMoveCancelled = true; - } - } - // Scrolling that simulates pointermoves - // ---------------------------------------------------------------------------------------------------- - initScrollWatch(ev) { - if (this.shouldWatchScroll) { - this.recordCoords(ev); - window.addEventListener('scroll', this.handleScroll, true); // useCapture=true - } - } - recordCoords(ev) { - if (this.shouldWatchScroll) { - this.prevPageX = ev.pageX; - this.prevPageY = ev.pageY; - this.prevScrollX = window.pageXOffset; - this.prevScrollY = window.pageYOffset; - } - } - destroyScrollWatch() { - if (this.shouldWatchScroll) { - window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true - } - } - // Event Normalization - // ---------------------------------------------------------------------------------------------------- - createEventFromMouse(ev, isFirst) { - let deltaX = 0; - let deltaY = 0; - // TODO: repeat code - if (isFirst) { - this.origPageX = ev.pageX; - this.origPageY = ev.pageY; - } - else { - deltaX = ev.pageX - this.origPageX; - deltaY = ev.pageY - this.origPageY; - } - return { - origEvent: ev, - isTouch: false, - subjectEl: this.subjectEl, - pageX: ev.pageX, - pageY: ev.pageY, - deltaX, - deltaY, - }; - } - createEventFromTouch(ev, isFirst) { - let touches = ev.touches; - let pageX; - let pageY; - let deltaX = 0; - let deltaY = 0; - // if touch coords available, prefer, - // because FF would give bad ev.pageX ev.pageY - if (touches && touches.length) { - pageX = touches[0].pageX; - pageY = touches[0].pageY; - } - else { - pageX = ev.pageX; - pageY = ev.pageY; - } - // TODO: repeat code - if (isFirst) { - this.origPageX = pageX; - this.origPageY = pageY; - } - else { - deltaX = pageX - this.origPageX; - deltaY = pageY - this.origPageY; - } - return { - origEvent: ev, - isTouch: true, - subjectEl: this.subjectEl, - pageX, - pageY, - deltaX, - deltaY, - }; - } - } - // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) - function isPrimaryMouseButton(ev) { - return ev.button === 0 && !ev.ctrlKey; - } - // Ignoring fake mouse events generated by touch - // ---------------------------------------------------------------------------------------------------- - function startIgnoringMouse() { - ignoreMouseDepth += 1; - setTimeout(() => { - ignoreMouseDepth -= 1; - }, internal.config.touchMouseIgnoreWait); - } - // We want to attach touchmove as early as possible for Safari - // ---------------------------------------------------------------------------------------------------- - function listenerCreated() { - listenerCnt += 1; - if (listenerCnt === 1) { - window.addEventListener('touchmove', onWindowTouchMove, { passive: false }); - } - } - function listenerDestroyed() { - listenerCnt -= 1; - if (!listenerCnt) { - window.removeEventListener('touchmove', onWindowTouchMove, { passive: false }); - } - } - function onWindowTouchMove(ev) { - if (isWindowTouchMoveCancelled) { - ev.preventDefault(); - } - } - - /* - An effect in which an element follows the movement of a pointer across the screen. - The moving element is a clone of some other element. - Must call start + handleMove + stop. - */ - class ElementMirror { - constructor() { - this.isVisible = false; // must be explicitly enabled - this.sourceEl = null; - this.mirrorEl = null; - this.sourceElRect = null; // screen coords relative to viewport - // options that can be set directly by caller - this.parentNode = document.body; // HIGHLY SUGGESTED to set this to sidestep ShadowDOM issues - this.zIndex = 9999; - this.revertDuration = 0; - } - start(sourceEl, pageX, pageY) { - this.sourceEl = sourceEl; - this.sourceElRect = this.sourceEl.getBoundingClientRect(); - this.origScreenX = pageX - window.pageXOffset; - this.origScreenY = pageY - window.pageYOffset; - this.deltaX = 0; - this.deltaY = 0; - this.updateElPosition(); - } - handleMove(pageX, pageY) { - this.deltaX = (pageX - window.pageXOffset) - this.origScreenX; - this.deltaY = (pageY - window.pageYOffset) - this.origScreenY; - this.updateElPosition(); - } - // can be called before start - setIsVisible(bool) { - if (bool) { - if (!this.isVisible) { - if (this.mirrorEl) { - this.mirrorEl.style.display = ''; - } - this.isVisible = bool; // needs to happen before updateElPosition - this.updateElPosition(); // because was not updating the position while invisible - } - } - else if (this.isVisible) { - if (this.mirrorEl) { - this.mirrorEl.style.display = 'none'; - } - this.isVisible = bool; - } - } - // always async - stop(needsRevertAnimation, callback) { - let done = () => { - this.cleanup(); - callback(); - }; - if (needsRevertAnimation && - this.mirrorEl && - this.isVisible && - this.revertDuration && // if 0, transition won't work - (this.deltaX || this.deltaY) // if same coords, transition won't work - ) { - this.doRevertAnimation(done, this.revertDuration); - } - else { - setTimeout(done, 0); - } - } - doRevertAnimation(callback, revertDuration) { - let mirrorEl = this.mirrorEl; - let finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened - mirrorEl.style.transition = - 'top ' + revertDuration + 'ms,' + - 'left ' + revertDuration + 'ms'; - internal.applyStyle(mirrorEl, { - left: finalSourceElRect.left, - top: finalSourceElRect.top, - }); - internal.whenTransitionDone(mirrorEl, () => { - mirrorEl.style.transition = ''; - callback(); - }); - } - cleanup() { - if (this.mirrorEl) { - internal.removeElement(this.mirrorEl); - this.mirrorEl = null; - } - this.sourceEl = null; - } - updateElPosition() { - if (this.sourceEl && this.isVisible) { - internal.applyStyle(this.getMirrorEl(), { - left: this.sourceElRect.left + this.deltaX, - top: this.sourceElRect.top + this.deltaY, - }); - } - } - getMirrorEl() { - let sourceElRect = this.sourceElRect; - let mirrorEl = this.mirrorEl; - if (!mirrorEl) { - mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true - // we don't want long taps or any mouse interaction causing selection/menus. - // would use preventSelection(), but that prevents selectstart, causing problems. - mirrorEl.classList.add('fc-unselectable'); - mirrorEl.classList.add('fc-event-dragging'); - internal.applyStyle(mirrorEl, { - position: 'fixed', - zIndex: this.zIndex, - visibility: '', - boxSizing: 'border-box', - width: sourceElRect.right - sourceElRect.left, - height: sourceElRect.bottom - sourceElRect.top, - right: 'auto', - bottom: 'auto', - margin: 0, - }); - this.parentNode.appendChild(mirrorEl); - } - return mirrorEl; - } - } - - /* - Is a cache for a given element's scroll information (all the info that ScrollController stores) - in addition the "client rectangle" of the element.. the area within the scrollbars. - - The cache can be in one of two modes: - - doesListening:false - ignores when the container is scrolled by someone else - - doesListening:true - watch for scrolling and update the cache - */ - class ScrollGeomCache extends internal.ScrollController { - constructor(scrollController, doesListening) { - super(); - this.handleScroll = () => { - this.scrollTop = this.scrollController.getScrollTop(); - this.scrollLeft = this.scrollController.getScrollLeft(); - this.handleScrollChange(); - }; - this.scrollController = scrollController; - this.doesListening = doesListening; - this.scrollTop = this.origScrollTop = scrollController.getScrollTop(); - this.scrollLeft = this.origScrollLeft = scrollController.getScrollLeft(); - this.scrollWidth = scrollController.getScrollWidth(); - this.scrollHeight = scrollController.getScrollHeight(); - this.clientWidth = scrollController.getClientWidth(); - this.clientHeight = scrollController.getClientHeight(); - this.clientRect = this.computeClientRect(); // do last in case it needs cached values - if (this.doesListening) { - this.getEventTarget().addEventListener('scroll', this.handleScroll); - } - } - destroy() { - if (this.doesListening) { - this.getEventTarget().removeEventListener('scroll', this.handleScroll); - } - } - getScrollTop() { - return this.scrollTop; - } - getScrollLeft() { - return this.scrollLeft; - } - setScrollTop(top) { - this.scrollController.setScrollTop(top); - if (!this.doesListening) { - // we are not relying on the element to normalize out-of-bounds scroll values - // so we need to sanitize ourselves - this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0); - this.handleScrollChange(); - } - } - setScrollLeft(top) { - this.scrollController.setScrollLeft(top); - if (!this.doesListening) { - // we are not relying on the element to normalize out-of-bounds scroll values - // so we need to sanitize ourselves - this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0); - this.handleScrollChange(); - } - } - getClientWidth() { - return this.clientWidth; - } - getClientHeight() { - return this.clientHeight; - } - getScrollWidth() { - return this.scrollWidth; - } - getScrollHeight() { - return this.scrollHeight; - } - handleScrollChange() { - } - } - - class ElementScrollGeomCache extends ScrollGeomCache { - constructor(el, doesListening) { - super(new internal.ElementScrollController(el), doesListening); - } - getEventTarget() { - return this.scrollController.el; - } - computeClientRect() { - return internal.computeInnerRect(this.scrollController.el); - } - } - - class WindowScrollGeomCache extends ScrollGeomCache { - constructor(doesListening) { - super(new internal.WindowScrollController(), doesListening); - } - getEventTarget() { - return window; - } - computeClientRect() { - return { - left: this.scrollLeft, - right: this.scrollLeft + this.clientWidth, - top: this.scrollTop, - bottom: this.scrollTop + this.clientHeight, - }; - } - // the window is the only scroll object that changes it's rectangle relative - // to the document's topleft as it scrolls - handleScrollChange() { - this.clientRect = this.computeClientRect(); - } - } - - // If available we are using native "performance" API instead of "Date" - // Read more about it on MDN: - // https://developer.mozilla.org/en-US/docs/Web/API/Performance - const getTime = typeof performance === 'function' ? performance.now : Date.now; - /* - For a pointer interaction, automatically scrolls certain scroll containers when the pointer - approaches the edge. - - The caller must call start + handleMove + stop. - */ - class AutoScroller { - constructor() { - // options that can be set by caller - this.isEnabled = true; - this.scrollQuery = [window, '.fc-scroller']; - this.edgeThreshold = 50; // pixels - this.maxVelocity = 300; // pixels per second - // internal state - this.pointerScreenX = null; - this.pointerScreenY = null; - this.isAnimating = false; - this.scrollCaches = null; - // protect against the initial pointerdown being too close to an edge and starting the scroll - this.everMovedUp = false; - this.everMovedDown = false; - this.everMovedLeft = false; - this.everMovedRight = false; - this.animate = () => { - if (this.isAnimating) { // wasn't cancelled between animation calls - let edge = this.computeBestEdge(this.pointerScreenX + window.pageXOffset, this.pointerScreenY + window.pageYOffset); - if (edge) { - let now = getTime(); - this.handleSide(edge, (now - this.msSinceRequest) / 1000); - this.requestAnimation(now); - } - else { - this.isAnimating = false; // will stop animation - } - } - }; - } - start(pageX, pageY, scrollStartEl) { - if (this.isEnabled) { - this.scrollCaches = this.buildCaches(scrollStartEl); - this.pointerScreenX = null; - this.pointerScreenY = null; - this.everMovedUp = false; - this.everMovedDown = false; - this.everMovedLeft = false; - this.everMovedRight = false; - this.handleMove(pageX, pageY); - } - } - handleMove(pageX, pageY) { - if (this.isEnabled) { - let pointerScreenX = pageX - window.pageXOffset; - let pointerScreenY = pageY - window.pageYOffset; - let yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY; - let xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX; - if (yDelta < 0) { - this.everMovedUp = true; - } - else if (yDelta > 0) { - this.everMovedDown = true; - } - if (xDelta < 0) { - this.everMovedLeft = true; - } - else if (xDelta > 0) { - this.everMovedRight = true; - } - this.pointerScreenX = pointerScreenX; - this.pointerScreenY = pointerScreenY; - if (!this.isAnimating) { - this.isAnimating = true; - this.requestAnimation(getTime()); - } - } - } - stop() { - if (this.isEnabled) { - this.isAnimating = false; // will stop animation - for (let scrollCache of this.scrollCaches) { - scrollCache.destroy(); - } - this.scrollCaches = null; - } - } - requestAnimation(now) { - this.msSinceRequest = now; - requestAnimationFrame(this.animate); - } - handleSide(edge, seconds) { - let { scrollCache } = edge; - let { edgeThreshold } = this; - let invDistance = edgeThreshold - edge.distance; - let velocity = // the closer to the edge, the faster we scroll - ((invDistance * invDistance) / (edgeThreshold * edgeThreshold)) * // quadratic - this.maxVelocity * seconds; - let sign = 1; - switch (edge.name) { - case 'left': - sign = -1; - // falls through - case 'right': - scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign); - break; - case 'top': - sign = -1; - // falls through - case 'bottom': - scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign); - break; - } - } - // left/top are relative to document topleft - computeBestEdge(left, top) { - let { edgeThreshold } = this; - let bestSide = null; - let scrollCaches = this.scrollCaches || []; - for (let scrollCache of scrollCaches) { - let rect = scrollCache.clientRect; - let leftDist = left - rect.left; - let rightDist = rect.right - left; - let topDist = top - rect.top; - let bottomDist = rect.bottom - top; - // completely within the rect? - if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) { - if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() && - (!bestSide || bestSide.distance > topDist)) { - bestSide = { scrollCache, name: 'top', distance: topDist }; - } - if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() && - (!bestSide || bestSide.distance > bottomDist)) { - bestSide = { scrollCache, name: 'bottom', distance: bottomDist }; - } - if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() && - (!bestSide || bestSide.distance > leftDist)) { - bestSide = { scrollCache, name: 'left', distance: leftDist }; - } - if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() && - (!bestSide || bestSide.distance > rightDist)) { - bestSide = { scrollCache, name: 'right', distance: rightDist }; - } - } - } - return bestSide; - } - buildCaches(scrollStartEl) { - return this.queryScrollEls(scrollStartEl).map((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 - }); - } - queryScrollEls(scrollStartEl) { - let els = []; - for (let query of this.scrollQuery) { - if (typeof query === 'object') { - els.push(query); - } - else { - els.push(...Array.prototype.slice.call(internal.getElRoot(scrollStartEl).querySelectorAll(query))); - } - } - return els; - } - } - - /* - Monitors dragging on an element. Has a number of high-level features: - - minimum distance required before dragging - - minimum wait time ("delay") before dragging - - a mirror element that follows the pointer - */ - class FeaturefulElementDragging extends internal.ElementDragging { - constructor(containerEl, selector) { - super(containerEl); - 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; - this.minDistance = 0; - this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag - this.mirrorNeedsRevert = false; - this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup - this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation - this.isDelayEnded = false; - this.isDistanceSurpassed = false; - this.delayTimeoutId = null; - this.onPointerDown = (ev) => { - if (!this.isDragging) { // so new drag doesn't happen while revert animation is going - this.isInteracting = true; - this.isDelayEnded = false; - this.isDistanceSurpassed = false; - internal.preventSelection(document.body); - internal.preventContextMenu(document.body); - // prevent links from being visited if there's an eventual drag. - // also prevents selection in older browsers (maybe?). - // not necessary for touch, besides, browser would complain about passiveness. - if (!ev.isTouch) { - ev.origEvent.preventDefault(); - } - this.emitter.trigger('pointerdown', ev); - if (this.isInteracting && // not destroyed via pointerdown handler - !this.pointer.shouldIgnoreMove) { - // actions related to initiating dragstart+dragmove+dragend... - this.mirror.setIsVisible(false); // reset. caller must set-visible - this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down - this.startDelay(ev); - if (!this.minDistance) { - this.handleDistanceSurpassed(ev); - } - } - } - }; - this.onPointerMove = (ev) => { - if (this.isInteracting) { - this.emitter.trigger('pointermove', ev); - if (!this.isDistanceSurpassed) { - let minDistance = this.minDistance; - let distanceSq; // current distance from the origin, squared - let { deltaX, deltaY } = ev; - distanceSq = deltaX * deltaX + deltaY * deltaY; - if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem - this.handleDistanceSurpassed(ev); - } - } - if (this.isDragging) { - // a real pointer move? (not one simulated by scrolling) - if (ev.origEvent.type !== 'scroll') { - this.mirror.handleMove(ev.pageX, ev.pageY); - this.autoScroller.handleMove(ev.pageX, ev.pageY); - } - this.emitter.trigger('dragmove', ev); - } - } - }; - this.onPointerUp = (ev) => { - if (this.isInteracting) { - this.isInteracting = false; - internal.allowSelection(document.body); - internal.allowContextMenu(document.body); - this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert - if (this.isDragging) { - this.autoScroller.stop(); - this.tryStopDrag(ev); // which will stop the mirror - } - if (this.delayTimeoutId) { - clearTimeout(this.delayTimeoutId); - this.delayTimeoutId = null; - } - } - }; - let pointer = this.pointer = new PointerDragging(containerEl); - pointer.emitter.on('pointerdown', this.onPointerDown); - pointer.emitter.on('pointermove', this.onPointerMove); - pointer.emitter.on('pointerup', this.onPointerUp); - if (selector) { - pointer.selector = selector; - } - this.mirror = new ElementMirror(); - this.autoScroller = new AutoScroller(); - } - destroy() { - this.pointer.destroy(); - // HACK: simulate a pointer-up to end the current drag - // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire) - this.onPointerUp({}); - } - startDelay(ev) { - if (typeof this.delay === 'number') { - this.delayTimeoutId = setTimeout(() => { - this.delayTimeoutId = null; - this.handleDelayEnd(ev); - }, this.delay); // not assignable to number! - } - else { - this.handleDelayEnd(ev); - } - } - handleDelayEnd(ev) { - this.isDelayEnded = true; - this.tryStartDrag(ev); - } - handleDistanceSurpassed(ev) { - this.isDistanceSurpassed = true; - this.tryStartDrag(ev); - } - tryStartDrag(ev) { - if (this.isDelayEnded && this.isDistanceSurpassed) { - if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) { - this.isDragging = true; - this.mirrorNeedsRevert = false; - this.autoScroller.start(ev.pageX, ev.pageY, this.containerEl); - this.emitter.trigger('dragstart', ev); - if (this.touchScrollAllowed === false) { - this.pointer.cancelTouchScroll(); - } - } - } - } - tryStopDrag(ev) { - // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events - // that come from the document to fire beforehand. much more convenient this way. - this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev)); - } - stopDrag(ev) { - this.isDragging = false; - this.emitter.trigger('dragend', ev); - } - // fill in the implementations... - setIgnoreMove(bool) { - this.pointer.shouldIgnoreMove = bool; - } - setMirrorIsVisible(bool) { - this.mirror.setIsVisible(bool); - } - setMirrorNeedsRevert(bool) { - this.mirrorNeedsRevert = bool; - } - setAutoScrollEnabled(bool) { - this.autoScroller.isEnabled = bool; - } - } - - /* - When this class is instantiated, it records the offset of an element (relative to the document topleft), - and continues to monitor scrolling, updating the cached coordinates if it needs to. - Does not access the DOM after instantiation, so highly performant. - - Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element - and an determine if a given point is inside the combined clipping rectangle. - */ - class OffsetTracker { - constructor(el) { - this.origRect = internal.computeRect(el); - // will work fine for divs that have overflow:hidden - this.scrollCaches = internal.getClippingParents(el).map((scrollEl) => new ElementScrollGeomCache(scrollEl, true)); - } - destroy() { - for (let scrollCache of this.scrollCaches) { - scrollCache.destroy(); - } - } - computeLeft() { - let left = this.origRect.left; - for (let scrollCache of this.scrollCaches) { - left += scrollCache.origScrollLeft - scrollCache.getScrollLeft(); - } - return left; - } - computeTop() { - let top = this.origRect.top; - for (let scrollCache of this.scrollCaches) { - top += scrollCache.origScrollTop - scrollCache.getScrollTop(); - } - return top; - } - isWithinClipping(pageX, pageY) { - let point = { left: pageX, top: pageY }; - for (let scrollCache of this.scrollCaches) { - if (!isIgnoredClipping(scrollCache.getEventTarget()) && - !internal.pointInsideRect(point, scrollCache.clientRect)) { - return false; - } - } - return true; - } - } - // certain clipping containers should never constrain interactions, like and - // https://github.com/fullcalendar/fullcalendar/issues/3615 - function isIgnoredClipping(node) { - let tagName = node.tagName; - return tagName === 'HTML' || tagName === 'BODY'; - } - - /* - Tracks movement over multiple droppable areas (aka "hits") - that exist in one or more DateComponents. - Relies on an existing draggable. - - emits: - - pointerdown - - dragstart - - hitchange - fires initially, even if not over a hit - - pointerup - - (hitchange - again, to null, if ended over a hit) - - dragend - */ - class HitDragging { - constructor(dragging, droppableStore) { - // options that can be set by caller - this.useSubjectCenter = false; - this.requireInitial = true; // if doesn't start out on a hit, won't emit any events - this.initialHit = null; - this.movingHit = null; - this.finalHit = null; // won't ever be populated if shouldIgnoreMove - this.handlePointerDown = (ev) => { - let { dragging } = this; - this.initialHit = null; - this.movingHit = null; - this.finalHit = null; - this.prepareHits(); - this.processFirstCoord(ev); - if (this.initialHit || !this.requireInitial) { - dragging.setIgnoreMove(false); - // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :( - this.emitter.trigger('pointerdown', ev); - } - else { - dragging.setIgnoreMove(true); - } - }; - this.handleDragStart = (ev) => { - this.emitter.trigger('dragstart', ev); - this.handleMove(ev, true); // force = fire even if initially null - }; - this.handleDragMove = (ev) => { - this.emitter.trigger('dragmove', ev); - this.handleMove(ev); - }; - this.handlePointerUp = (ev) => { - this.releaseHits(); - this.emitter.trigger('pointerup', ev); - }; - this.handleDragEnd = (ev) => { - if (this.movingHit) { - this.emitter.trigger('hitupdate', null, true, ev); - } - this.finalHit = this.movingHit; - this.movingHit = null; - this.emitter.trigger('dragend', ev); - }; - this.droppableStore = droppableStore; - dragging.emitter.on('pointerdown', this.handlePointerDown); - dragging.emitter.on('dragstart', this.handleDragStart); - dragging.emitter.on('dragmove', this.handleDragMove); - dragging.emitter.on('pointerup', this.handlePointerUp); - dragging.emitter.on('dragend', this.handleDragEnd); - this.dragging = dragging; - this.emitter = new internal.Emitter(); - } - // sets initialHit - // sets coordAdjust - processFirstCoord(ev) { - let origPoint = { left: ev.pageX, top: ev.pageY }; - let adjustedPoint = origPoint; - let subjectEl = ev.subjectEl; - let subjectRect; - if (subjectEl instanceof HTMLElement) { // i.e. not a Document/ShadowRoot - subjectRect = internal.computeRect(subjectEl); - adjustedPoint = internal.constrainPoint(adjustedPoint, subjectRect); - } - let initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top); - if (initialHit) { - if (this.useSubjectCenter && subjectRect) { - let slicedSubjectRect = internal.intersectRects(subjectRect, initialHit.rect); - if (slicedSubjectRect) { - adjustedPoint = internal.getRectCenter(slicedSubjectRect); - } - } - this.coordAdjust = internal.diffPoints(adjustedPoint, origPoint); - } - else { - this.coordAdjust = { left: 0, top: 0 }; - } - } - handleMove(ev, forceHandle) { - let hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top); - if (forceHandle || !isHitsEqual(this.movingHit, hit)) { - this.movingHit = hit; - this.emitter.trigger('hitupdate', hit, false, ev); - } - } - prepareHits() { - this.offsetTrackers = internal.mapHash(this.droppableStore, (interactionSettings) => { - interactionSettings.component.prepareHits(); - return new OffsetTracker(interactionSettings.el); - }); - } - releaseHits() { - let { offsetTrackers } = this; - for (let id in offsetTrackers) { - offsetTrackers[id].destroy(); - } - this.offsetTrackers = {}; - } - queryHitForOffset(offsetLeft, offsetTop) { - let { droppableStore, offsetTrackers } = this; - let bestHit = null; - for (let id in droppableStore) { - let component = droppableStore[id].component; - let offsetTracker = offsetTrackers[id]; - if (offsetTracker && // wasn't destroyed mid-drag - offsetTracker.isWithinClipping(offsetLeft, offsetTop)) { - let originLeft = offsetTracker.computeLeft(); - let originTop = offsetTracker.computeTop(); - let positionLeft = offsetLeft - originLeft; - let positionTop = offsetTop - originTop; - let { origRect } = offsetTracker; - let width = origRect.right - origRect.left; - let height = origRect.bottom - origRect.top; - if ( - // must be within the element's bounds - positionLeft >= 0 && positionLeft < width && - positionTop >= 0 && positionTop < height) { - let hit = component.queryHit(positionLeft, positionTop, width, height); - if (hit && ( - // make sure the hit is within activeRange, meaning it's not a dead cell - internal.rangeContainsRange(hit.dateProfile.activeRange, hit.dateSpan.range)) && - (!bestHit || hit.layer > bestHit.layer)) { - hit.componentId = id; - hit.context = component.context; - // TODO: better way to re-orient rectangle - hit.rect.left += originLeft; - hit.rect.right += originLeft; - hit.rect.top += originTop; - hit.rect.bottom += originTop; - bestHit = hit; - } - } - } - } - return bestHit; - } - } - function isHitsEqual(hit0, hit1) { - if (!hit0 && !hit1) { - return true; - } - if (Boolean(hit0) !== Boolean(hit1)) { - return false; - } - return internal.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan); - } - - function buildDatePointApiWithContext(dateSpan, context) { - let props = {}; - for (let transform of context.pluginHooks.datePointTransforms) { - Object.assign(props, transform(dateSpan, context)); - } - Object.assign(props, buildDatePointApi(dateSpan, context.dateEnv)); - return props; - } - function buildDatePointApi(span, dateEnv) { - return { - date: dateEnv.toDate(span.range.start), - dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), - allDay: span.allDay, - }; - } - - /* - Monitors when the user clicks on a specific date/time of a component. - A pointerdown+pointerup on the same "hit" constitutes a click. - */ - class DateClicking extends internal.Interaction { - constructor(settings) { - super(settings); - this.handlePointerDown = (pev) => { - let { dragging } = this; - let downEl = pev.origEvent.target; - // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired - dragging.setIgnoreMove(!this.component.isValidDateDownEl(downEl)); - }; - // won't even fire if moving was ignored - this.handleDragEnd = (ev) => { - let { component } = this; - let { pointer } = this.dragging; - if (!pointer.wasTouchScroll) { - let { initialHit, finalHit } = this.hitDragging; - if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) { - let { context } = component; - let arg = Object.assign(Object.assign({}, buildDatePointApiWithContext(initialHit.dateSpan, context)), { dayEl: initialHit.dayEl, jsEvent: ev.origEvent, view: context.viewApi || context.calendarApi.view }); - context.emitter.trigger('dateClick', arg); - } - } - }; - // we DO want to watch pointer moves because otherwise finalHit won't get populated - this.dragging = new FeaturefulElementDragging(settings.el); - this.dragging.autoScroller.isEnabled = false; - let hitDragging = this.hitDragging = new HitDragging(this.dragging, internal.interactionSettingsToStore(settings)); - hitDragging.emitter.on('pointerdown', this.handlePointerDown); - hitDragging.emitter.on('dragend', this.handleDragEnd); - } - destroy() { - this.dragging.destroy(); - } - } - - /* - Tracks when the user selects a portion of time of a component, - constituted by a drag over date cells, with a possible delay at the beginning of the drag. - */ - class DateSelecting extends internal.Interaction { - constructor(settings) { - super(settings); - this.dragSelection = null; - this.handlePointerDown = (ev) => { - let { component, dragging } = this; - let { options } = component.context; - let canSelect = options.selectable && - component.isValidDateDownEl(ev.origEvent.target); - // don't bother to watch expensive moves if component won't do selection - dragging.setIgnoreMove(!canSelect); - // if touch, require user to hold down - dragging.delay = ev.isTouch ? getComponentTouchDelay$1(component) : null; - }; - this.handleDragStart = (ev) => { - this.component.context.calendarApi.unselect(ev); // unselect previous selections - }; - this.handleHitUpdate = (hit, isFinal) => { - let { context } = this.component; - let dragSelection = null; - let isInvalid = false; - if (hit) { - let initialHit = this.hitDragging.initialHit; - let disallowed = hit.componentId === initialHit.componentId - && this.isHitComboAllowed - && !this.isHitComboAllowed(initialHit, hit); - if (!disallowed) { - dragSelection = joinHitsIntoSelection(initialHit, hit, context.pluginHooks.dateSelectionTransformers); - } - if (!dragSelection || !internal.isDateSelectionValid(dragSelection, hit.dateProfile, context)) { - isInvalid = true; - dragSelection = null; - } - } - if (dragSelection) { - context.dispatch({ type: 'SELECT_DATES', selection: dragSelection }); - } - else if (!isFinal) { // only unselect if moved away while dragging - context.dispatch({ type: 'UNSELECT_DATES' }); - } - if (!isInvalid) { - internal.enableCursor(); - } - else { - internal.disableCursor(); - } - if (!isFinal) { - this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging - } - }; - this.handlePointerUp = (pev) => { - if (this.dragSelection) { - // selection is already rendered, so just need to report selection - internal.triggerDateSelect(this.dragSelection, pev, this.component.context); - this.dragSelection = null; - } - }; - let { component } = settings; - let { options } = component.context; - let dragging = this.dragging = new FeaturefulElementDragging(settings.el); - dragging.touchScrollAllowed = false; - dragging.minDistance = options.selectMinDistance || 0; - dragging.autoScroller.isEnabled = options.dragScroll; - let hitDragging = this.hitDragging = new HitDragging(this.dragging, internal.interactionSettingsToStore(settings)); - hitDragging.emitter.on('pointerdown', this.handlePointerDown); - hitDragging.emitter.on('dragstart', this.handleDragStart); - hitDragging.emitter.on('hitupdate', this.handleHitUpdate); - hitDragging.emitter.on('pointerup', this.handlePointerUp); - } - destroy() { - this.dragging.destroy(); - } - } - function getComponentTouchDelay$1(component) { - let { options } = component.context; - let delay = options.selectLongPressDelay; - if (delay == null) { - delay = options.longPressDelay; - } - return delay; - } - function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) { - let dateSpan0 = hit0.dateSpan; - let dateSpan1 = hit1.dateSpan; - let ms = [ - dateSpan0.range.start, - dateSpan0.range.end, - dateSpan1.range.start, - dateSpan1.range.end, - ]; - ms.sort(internal.compareNumbers); - let props = {}; - for (let transformer of dateSelectionTransformers) { - let res = transformer(hit0, hit1); - if (res === false) { - return null; - } - if (res) { - Object.assign(props, res); - } - } - props.range = { start: ms[0], end: ms[3] }; - props.allDay = dateSpan0.allDay; - return props; - } - - class EventDragging extends internal.Interaction { - constructor(settings) { - super(settings); - // internal state - this.subjectEl = null; - this.subjectSeg = null; // the seg being selected/dragged - this.isDragging = false; - this.eventRange = null; - this.relevantEvents = null; // the events being dragged - this.receivingContext = null; - this.validMutation = null; - this.mutatedRelevantEvents = null; - this.handlePointerDown = (ev) => { - let origTarget = ev.origEvent.target; - let { component, dragging } = this; - let { mirror } = dragging; - let { options } = component.context; - let initialContext = component.context; - this.subjectEl = ev.subjectEl; - let subjectSeg = this.subjectSeg = internal.getElSeg(ev.subjectEl); - let eventRange = this.eventRange = subjectSeg.eventRange; - let eventInstanceId = eventRange.instance.instanceId; - this.relevantEvents = internal.getRelevantEvents(initialContext.getCurrentData().eventStore, eventInstanceId); - dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance; - dragging.delay = - // only do a touch delay if touch and this event hasn't been selected yet - (ev.isTouch && eventInstanceId !== component.props.eventSelection) ? - getComponentTouchDelay(component) : - null; - if (options.fixedMirrorParent) { - mirror.parentNode = options.fixedMirrorParent; - } - else { - mirror.parentNode = internal.elementClosest(origTarget, '.fc'); - } - mirror.revertDuration = options.dragRevertDuration; - let isValid = component.isValidSegDownEl(origTarget) && - !internal.elementClosest(origTarget, '.fc-event-resizer'); // NOT on a resizer - dragging.setIgnoreMove(!isValid); - // disable dragging for elements that are resizable (ie, selectable) - // but are not draggable - this.isDragging = isValid && - ev.subjectEl.classList.contains('fc-event-draggable'); - }; - this.handleDragStart = (ev) => { - let initialContext = this.component.context; - let eventRange = this.eventRange; - let eventInstanceId = eventRange.instance.instanceId; - if (ev.isTouch) { - // need to select a different event? - if (eventInstanceId !== this.component.props.eventSelection) { - initialContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId }); - } - } - else { - // if now using mouse, but was previous touch interaction, clear selected event - initialContext.dispatch({ type: 'UNSELECT_EVENT' }); - } - if (this.isDragging) { - initialContext.calendarApi.unselect(ev); // unselect *date* selection - initialContext.emitter.trigger('eventDragStart', { - el: this.subjectEl, - event: new internal.EventImpl(initialContext, eventRange.def, eventRange.instance), - jsEvent: ev.origEvent, - view: initialContext.viewApi, - }); - } - }; - this.handleHitUpdate = (hit, isFinal) => { - if (!this.isDragging) { - return; - } - let relevantEvents = this.relevantEvents; - let initialHit = this.hitDragging.initialHit; - let initialContext = this.component.context; - // states based on new hit - let receivingContext = null; - let mutation = null; - let mutatedRelevantEvents = null; - let isInvalid = false; - let interaction = { - affectedEvents: relevantEvents, - mutatedEvents: internal.createEmptyEventStore(), - isEvent: true, - }; - if (hit) { - receivingContext = hit.context; - let receivingOptions = receivingContext.options; - if (initialContext === receivingContext || - (receivingOptions.editable && receivingOptions.droppable)) { - mutation = computeEventMutation(initialHit, hit, receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers); - if (mutation) { - mutatedRelevantEvents = internal.applyMutationToEventStore(relevantEvents, receivingContext.getCurrentData().eventUiBases, mutation, receivingContext); - interaction.mutatedEvents = mutatedRelevantEvents; - if (!internal.isInteractionValid(interaction, hit.dateProfile, receivingContext)) { - isInvalid = true; - mutation = null; - mutatedRelevantEvents = null; - interaction.mutatedEvents = internal.createEmptyEventStore(); - } - } - } - else { - receivingContext = null; - } - } - this.displayDrag(receivingContext, interaction); - if (!isInvalid) { - internal.enableCursor(); - } - else { - internal.disableCursor(); - } - if (!isFinal) { - if (initialContext === receivingContext && // TODO: write test for this - isHitsEqual(initialHit, hit)) { - mutation = null; - } - 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 || !internal.getElRoot(this.subjectEl).querySelector('.fc-event-mirror')); - // assign states based on new hit - this.receivingContext = receivingContext; - this.validMutation = mutation; - this.mutatedRelevantEvents = mutatedRelevantEvents; - } - }; - this.handlePointerUp = () => { - if (!this.isDragging) { - this.cleanup(); // because handleDragEnd won't fire - } - }; - this.handleDragEnd = (ev) => { - if (this.isDragging) { - let initialContext = this.component.context; - let initialView = initialContext.viewApi; - let { receivingContext, validMutation } = this; - let eventDef = this.eventRange.def; - let eventInstance = this.eventRange.instance; - let eventApi = new internal.EventImpl(initialContext, eventDef, eventInstance); - let relevantEvents = this.relevantEvents; - let mutatedRelevantEvents = this.mutatedRelevantEvents; - let { finalHit } = this.hitDragging; - this.clearDrag(); // must happen after revert animation - initialContext.emitter.trigger('eventDragStop', { - el: this.subjectEl, - event: eventApi, - jsEvent: ev.origEvent, - view: initialView, - }); - if (validMutation) { - // dropped within same calendar - if (receivingContext === initialContext) { - let updatedEventApi = new internal.EventImpl(initialContext, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null); - initialContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: mutatedRelevantEvents, - }); - let eventChangeArg = { - oldEvent: eventApi, - event: updatedEventApi, - relatedEvents: internal.buildEventApis(mutatedRelevantEvents, initialContext, eventInstance), - revert() { - initialContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: relevantEvents, // the pre-change data - }); - }, - }; - let transformed = {}; - for (let transformer of initialContext.getCurrentData().pluginHooks.eventDropTransformers) { - Object.assign(transformed, transformer(validMutation, initialContext)); - } - initialContext.emitter.trigger('eventDrop', Object.assign(Object.assign(Object.assign({}, eventChangeArg), transformed), { el: ev.subjectEl, delta: validMutation.datesDelta, jsEvent: ev.origEvent, view: initialView })); - initialContext.emitter.trigger('eventChange', eventChangeArg); - // dropped in different calendar - } - else if (receivingContext) { - let eventRemoveArg = { - event: eventApi, - relatedEvents: internal.buildEventApis(relevantEvents, initialContext, eventInstance), - revert() { - initialContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: relevantEvents, - }); - }, - }; - initialContext.emitter.trigger('eventLeave', Object.assign(Object.assign({}, eventRemoveArg), { draggedEl: ev.subjectEl, view: initialView })); - initialContext.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: relevantEvents, - }); - initialContext.emitter.trigger('eventRemove', eventRemoveArg); - let addedEventDef = mutatedRelevantEvents.defs[eventDef.defId]; - let addedEventInstance = mutatedRelevantEvents.instances[eventInstance.instanceId]; - let addedEventApi = new internal.EventImpl(receivingContext, addedEventDef, addedEventInstance); - receivingContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: mutatedRelevantEvents, - }); - let eventAddArg = { - event: addedEventApi, - relatedEvents: internal.buildEventApis(mutatedRelevantEvents, receivingContext, addedEventInstance), - revert() { - receivingContext.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: mutatedRelevantEvents, - }); - }, - }; - receivingContext.emitter.trigger('eventAdd', eventAddArg); - if (ev.isTouch) { - receivingContext.dispatch({ - type: 'SELECT_EVENT', - eventInstanceId: eventInstance.instanceId, - }); - } - receivingContext.emitter.trigger('drop', Object.assign(Object.assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.context.viewApi })); - receivingContext.emitter.trigger('eventReceive', Object.assign(Object.assign({}, eventAddArg), { draggedEl: ev.subjectEl, view: finalHit.context.viewApi })); - } - } - else { - initialContext.emitter.trigger('_noEventDrop'); - } - } - this.cleanup(); - }; - let { component } = this; - let { options } = component.context; - let dragging = this.dragging = new FeaturefulElementDragging(settings.el); - dragging.pointer.selector = EventDragging.SELECTOR; - dragging.touchScrollAllowed = false; - dragging.autoScroller.isEnabled = options.dragScroll; - let hitDragging = this.hitDragging = new HitDragging(this.dragging, internal.interactionSettingsStore); - hitDragging.useSubjectCenter = settings.useEventCenter; - hitDragging.emitter.on('pointerdown', this.handlePointerDown); - hitDragging.emitter.on('dragstart', this.handleDragStart); - hitDragging.emitter.on('hitupdate', this.handleHitUpdate); - hitDragging.emitter.on('pointerup', this.handlePointerUp); - hitDragging.emitter.on('dragend', this.handleDragEnd); - } - destroy() { - this.dragging.destroy(); - } - // render a drag state on the next receivingCalendar - displayDrag(nextContext, state) { - let initialContext = this.component.context; - let prevContext = this.receivingContext; - // does the previous calendar need to be cleared? - if (prevContext && prevContext !== nextContext) { - // does the initial calendar need to be cleared? - // if so, don't clear all the way. we still need to to hide the affectedEvents - if (prevContext === initialContext) { - prevContext.dispatch({ - type: 'SET_EVENT_DRAG', - state: { - affectedEvents: state.affectedEvents, - mutatedEvents: internal.createEmptyEventStore(), - isEvent: true, - }, - }); - // completely clear the old calendar if it wasn't the initial - } - else { - prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - } - if (nextContext) { - nextContext.dispatch({ type: 'SET_EVENT_DRAG', state }); - } - } - clearDrag() { - let initialCalendar = this.component.context; - let { receivingContext } = this; - if (receivingContext) { - receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - // the initial calendar might have an dummy drag state from displayDrag - if (initialCalendar !== receivingContext) { - initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - } - cleanup() { - this.subjectSeg = null; - this.isDragging = false; - this.eventRange = null; - this.relevantEvents = null; - this.receivingContext = null; - this.validMutation = null; - this.mutatedRelevantEvents = null; - } - } - // TODO: test this in IE11 - // QUESTION: why do we need it on the resizable??? - EventDragging.SELECTOR = '.fc-event-draggable, .fc-event-resizable'; - function computeEventMutation(hit0, hit1, massagers) { - let dateSpan0 = hit0.dateSpan; - let dateSpan1 = hit1.dateSpan; - let date0 = dateSpan0.range.start; - let date1 = dateSpan1.range.start; - let standardProps = {}; - if (dateSpan0.allDay !== dateSpan1.allDay) { - standardProps.allDay = dateSpan1.allDay; - standardProps.hasEnd = hit1.context.options.allDayMaintainDuration; - if (dateSpan1.allDay) { - // means date1 is already start-of-day, - // but date0 needs to be converted - date0 = internal.startOfDay(date0); - } - } - let delta = internal.diffDates(date0, date1, hit0.context.dateEnv, hit0.componentId === hit1.componentId ? - hit0.largeUnit : - null); - if (delta.milliseconds) { // has hours/minutes/seconds - standardProps.allDay = false; - } - let mutation = { - datesDelta: delta, - standardProps, - }; - for (let massager of massagers) { - massager(mutation, hit0, hit1); - } - return mutation; - } - function getComponentTouchDelay(component) { - let { options } = component.context; - let delay = options.eventLongPressDelay; - if (delay == null) { - delay = options.longPressDelay; - } - return delay; - } - - class EventResizing extends internal.Interaction { - constructor(settings) { - super(settings); - // internal state - this.draggingSegEl = null; - this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg? - this.eventRange = null; - this.relevantEvents = null; - this.validMutation = null; - this.mutatedRelevantEvents = null; - this.handlePointerDown = (ev) => { - let { component } = this; - let segEl = this.querySegEl(ev); - let seg = internal.getElSeg(segEl); - let eventRange = this.eventRange = seg.eventRange; - this.dragging.minDistance = component.context.options.eventDragMinDistance; - // if touch, need to be working with a selected event - this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(ev.origEvent.target) || - (ev.isTouch && this.component.props.eventSelection !== eventRange.instance.instanceId)); - }; - this.handleDragStart = (ev) => { - let { context } = this.component; - let eventRange = this.eventRange; - this.relevantEvents = internal.getRelevantEvents(context.getCurrentData().eventStore, this.eventRange.instance.instanceId); - let segEl = this.querySegEl(ev); - this.draggingSegEl = segEl; - this.draggingSeg = internal.getElSeg(segEl); - context.calendarApi.unselect(); - context.emitter.trigger('eventResizeStart', { - el: segEl, - event: new internal.EventImpl(context, eventRange.def, eventRange.instance), - jsEvent: ev.origEvent, - view: context.viewApi, - }); - }; - this.handleHitUpdate = (hit, isFinal, ev) => { - let { context } = this.component; - let relevantEvents = this.relevantEvents; - let initialHit = this.hitDragging.initialHit; - let eventInstance = this.eventRange.instance; - let mutation = null; - let mutatedRelevantEvents = null; - let isInvalid = false; - let interaction = { - affectedEvents: relevantEvents, - mutatedEvents: internal.createEmptyEventStore(), - isEvent: true, - }; - if (hit) { - let disallowed = hit.componentId === initialHit.componentId - && this.isHitComboAllowed - && !this.isHitComboAllowed(initialHit, hit); - if (!disallowed) { - mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-event-resizer-start'), eventInstance.range); - } - } - if (mutation) { - mutatedRelevantEvents = internal.applyMutationToEventStore(relevantEvents, context.getCurrentData().eventUiBases, mutation, context); - interaction.mutatedEvents = mutatedRelevantEvents; - if (!internal.isInteractionValid(interaction, hit.dateProfile, context)) { - isInvalid = true; - mutation = null; - mutatedRelevantEvents = null; - interaction.mutatedEvents = null; - } - } - if (mutatedRelevantEvents) { - context.dispatch({ - type: 'SET_EVENT_RESIZE', - state: interaction, - }); - } - else { - context.dispatch({ type: 'UNSET_EVENT_RESIZE' }); - } - if (!isInvalid) { - internal.enableCursor(); - } - else { - internal.disableCursor(); - } - if (!isFinal) { - if (mutation && isHitsEqual(initialHit, hit)) { - mutation = null; - } - this.validMutation = mutation; - this.mutatedRelevantEvents = mutatedRelevantEvents; - } - }; - this.handleDragEnd = (ev) => { - let { context } = this.component; - let eventDef = this.eventRange.def; - let eventInstance = this.eventRange.instance; - let eventApi = new internal.EventImpl(context, eventDef, eventInstance); - let relevantEvents = this.relevantEvents; - let mutatedRelevantEvents = this.mutatedRelevantEvents; - context.emitter.trigger('eventResizeStop', { - el: this.draggingSegEl, - event: eventApi, - jsEvent: ev.origEvent, - view: context.viewApi, - }); - if (this.validMutation) { - let updatedEventApi = new internal.EventImpl(context, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null); - context.dispatch({ - type: 'MERGE_EVENTS', - eventStore: mutatedRelevantEvents, - }); - let eventChangeArg = { - oldEvent: eventApi, - event: updatedEventApi, - relatedEvents: internal.buildEventApis(mutatedRelevantEvents, context, eventInstance), - revert() { - context.dispatch({ - type: 'MERGE_EVENTS', - eventStore: relevantEvents, // the pre-change events - }); - }, - }; - context.emitter.trigger('eventResize', Object.assign(Object.assign({}, eventChangeArg), { el: this.draggingSegEl, startDelta: this.validMutation.startDelta || internal.createDuration(0), endDelta: this.validMutation.endDelta || internal.createDuration(0), jsEvent: ev.origEvent, view: context.viewApi })); - context.emitter.trigger('eventChange', eventChangeArg); - } - else { - context.emitter.trigger('_noEventResize'); - } - // reset all internal state - this.draggingSeg = null; - this.relevantEvents = null; - this.validMutation = null; - // okay to keep eventInstance around. useful to set it in handlePointerDown - }; - let { component } = settings; - let dragging = this.dragging = new FeaturefulElementDragging(settings.el); - dragging.pointer.selector = '.fc-event-resizer'; - dragging.touchScrollAllowed = false; - dragging.autoScroller.isEnabled = component.context.options.dragScroll; - let hitDragging = this.hitDragging = new HitDragging(this.dragging, internal.interactionSettingsToStore(settings)); - hitDragging.emitter.on('pointerdown', this.handlePointerDown); - hitDragging.emitter.on('dragstart', this.handleDragStart); - hitDragging.emitter.on('hitupdate', this.handleHitUpdate); - hitDragging.emitter.on('dragend', this.handleDragEnd); - } - destroy() { - this.dragging.destroy(); - } - querySegEl(ev) { - return internal.elementClosest(ev.subjectEl, '.fc-event'); - } - } - function computeMutation(hit0, hit1, isFromStart, instanceRange) { - let dateEnv = hit0.context.dateEnv; - let date0 = hit0.dateSpan.range.start; - let date1 = hit1.dateSpan.range.start; - let delta = internal.diffDates(date0, date1, dateEnv, hit0.largeUnit); - if (isFromStart) { - if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) { - return { startDelta: delta }; - } - } - else if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) { - return { endDelta: delta }; - } - return null; - } - - class UnselectAuto { - constructor(context) { - this.context = context; - this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system - this.matchesCancel = false; - this.matchesEvent = false; - this.onSelect = (selectInfo) => { - if (selectInfo.jsEvent) { - this.isRecentPointerDateSelect = true; - } - }; - this.onDocumentPointerDown = (pev) => { - let unselectCancel = this.context.options.unselectCancel; - let downEl = internal.getEventTargetViaRoot(pev.origEvent); - this.matchesCancel = !!internal.elementClosest(downEl, unselectCancel); - this.matchesEvent = !!internal.elementClosest(downEl, EventDragging.SELECTOR); // interaction started on an event? - }; - this.onDocumentPointerUp = (pev) => { - let { context } = this; - let { documentPointer } = this; - let calendarState = context.getCurrentData(); - // touch-scrolling should never unfocus any type of selection - if (!documentPointer.wasTouchScroll) { - if (calendarState.dateSelection && // an existing date selection? - !this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp? - ) { - let unselectAuto = context.options.unselectAuto; - if (unselectAuto && (!unselectAuto || !this.matchesCancel)) { - context.calendarApi.unselect(pev); - } - } - if (calendarState.eventSelection && // an existing event selected? - !this.matchesEvent // interaction DIDN'T start on an event - ) { - context.dispatch({ type: 'UNSELECT_EVENT' }); - } - } - this.isRecentPointerDateSelect = false; - }; - let documentPointer = this.documentPointer = new PointerDragging(document); - documentPointer.shouldIgnoreMove = true; - documentPointer.shouldWatchScroll = false; - documentPointer.emitter.on('pointerdown', this.onDocumentPointerDown); - documentPointer.emitter.on('pointerup', this.onDocumentPointerUp); - /* - TODO: better way to know about whether there was a selection with the pointer - */ - context.emitter.on('select', this.onSelect); - } - destroy() { - this.context.emitter.off('select', this.onSelect); - this.documentPointer.destroy(); - } - } - - const OPTION_REFINERS = { - fixedMirrorParent: internal.identity, - }; - const LISTENER_REFINERS = { - dateClick: internal.identity, - eventDragStart: internal.identity, - eventDragStop: internal.identity, - eventDrop: internal.identity, - eventResizeStart: internal.identity, - eventResizeStop: internal.identity, - eventResize: internal.identity, - drop: internal.identity, - eventReceive: internal.identity, - eventLeave: internal.identity, - }; - - /* - Given an already instantiated draggable object for one-or-more elements, - Interprets any dragging as an attempt to drag an events that lives outside - of a calendar onto a calendar. - */ - class ExternalElementDragging { - constructor(dragging, suppliedDragMeta) { - this.receivingContext = null; - this.droppableEvent = null; // will exist for all drags, even if create:false - this.suppliedDragMeta = null; - this.dragMeta = null; - this.handleDragStart = (ev) => { - this.dragMeta = this.buildDragMeta(ev.subjectEl); - }; - this.handleHitUpdate = (hit, isFinal, ev) => { - let { dragging } = this.hitDragging; - let receivingContext = null; - let droppableEvent = null; - let isInvalid = false; - let interaction = { - affectedEvents: internal.createEmptyEventStore(), - mutatedEvents: internal.createEmptyEventStore(), - isEvent: this.dragMeta.create, - }; - if (hit) { - receivingContext = hit.context; - if (this.canDropElOnCalendar(ev.subjectEl, receivingContext)) { - droppableEvent = computeEventForDateSpan(hit.dateSpan, this.dragMeta, receivingContext); - interaction.mutatedEvents = internal.eventTupleToStore(droppableEvent); - isInvalid = !internal.isInteractionValid(interaction, hit.dateProfile, receivingContext); - if (isInvalid) { - interaction.mutatedEvents = internal.createEmptyEventStore(); - droppableEvent = null; - } - } - } - this.displayDrag(receivingContext, interaction); - // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?) - // TODO: wish we could somehow wait for dispatch to guarantee render - dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-event-mirror')); - if (!isInvalid) { - internal.enableCursor(); - } - else { - internal.disableCursor(); - } - if (!isFinal) { - dragging.setMirrorNeedsRevert(!droppableEvent); - this.receivingContext = receivingContext; - this.droppableEvent = droppableEvent; - } - }; - this.handleDragEnd = (pev) => { - let { receivingContext, droppableEvent } = this; - this.clearDrag(); - if (receivingContext && droppableEvent) { - let finalHit = this.hitDragging.finalHit; - let finalView = finalHit.context.viewApi; - let dragMeta = this.dragMeta; - receivingContext.emitter.trigger('drop', Object.assign(Object.assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView })); - if (dragMeta.create) { - let addingEvents = internal.eventTupleToStore(droppableEvent); - receivingContext.dispatch({ - type: 'MERGE_EVENTS', - eventStore: addingEvents, - }); - if (pev.isTouch) { - receivingContext.dispatch({ - type: 'SELECT_EVENT', - eventInstanceId: droppableEvent.instance.instanceId, - }); - } - // signal that an external event landed - receivingContext.emitter.trigger('eventReceive', { - event: new internal.EventImpl(receivingContext, droppableEvent.def, droppableEvent.instance), - relatedEvents: [], - revert() { - receivingContext.dispatch({ - type: 'REMOVE_EVENTS', - eventStore: addingEvents, - }); - }, - draggedEl: pev.subjectEl, - view: finalView, - }); - } - } - this.receivingContext = null; - this.droppableEvent = null; - }; - let hitDragging = this.hitDragging = new HitDragging(dragging, internal.interactionSettingsStore); - hitDragging.requireInitial = false; // will start outside of a component - hitDragging.emitter.on('dragstart', this.handleDragStart); - hitDragging.emitter.on('hitupdate', this.handleHitUpdate); - hitDragging.emitter.on('dragend', this.handleDragEnd); - this.suppliedDragMeta = suppliedDragMeta; - } - buildDragMeta(subjectEl) { - if (typeof this.suppliedDragMeta === 'object') { - return internal.parseDragMeta(this.suppliedDragMeta); - } - if (typeof this.suppliedDragMeta === 'function') { - return internal.parseDragMeta(this.suppliedDragMeta(subjectEl)); - } - return getDragMetaFromEl(subjectEl); - } - displayDrag(nextContext, state) { - let prevContext = this.receivingContext; - if (prevContext && prevContext !== nextContext) { - prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - if (nextContext) { - nextContext.dispatch({ type: 'SET_EVENT_DRAG', state }); - } - } - clearDrag() { - if (this.receivingContext) { - this.receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); - } - } - canDropElOnCalendar(el, receivingContext) { - let dropAccept = receivingContext.options.dropAccept; - if (typeof dropAccept === 'function') { - return dropAccept.call(receivingContext.calendarApi, el); - } - if (typeof dropAccept === 'string' && dropAccept) { - return Boolean(internal.elementMatches(el, dropAccept)); - } - return true; - } - } - // Utils for computing event store from the DragMeta - // ---------------------------------------------------------------------------------------------------- - function computeEventForDateSpan(dateSpan, dragMeta, context) { - let defProps = Object.assign({}, dragMeta.leftoverProps); - for (let transform of context.pluginHooks.externalDefTransforms) { - Object.assign(defProps, transform(dateSpan, dragMeta)); - } - let { refined, extra } = internal.refineEventDef(defProps, context); - let def = internal.parseEventDef(refined, extra, dragMeta.sourceId, dateSpan.allDay, context.options.forceEventDuration || Boolean(dragMeta.duration), // hasEnd - context); - let start = dateSpan.range.start; - // only rely on time info if drop zone is all-day, - // otherwise, we already know the time - if (dateSpan.allDay && dragMeta.startTime) { - start = context.dateEnv.add(start, dragMeta.startTime); - } - let end = dragMeta.duration ? - context.dateEnv.add(start, dragMeta.duration) : - internal.getDefaultEventEnd(dateSpan.allDay, start, context); - let instance = internal.createEventInstance(def.defId, { start, end }); - return { def, instance }; - } - // Utils for extracting data from element - // ---------------------------------------------------------------------------------------------------- - function getDragMetaFromEl(el) { - let str = getEmbeddedElData(el, 'event'); - let obj = str ? - JSON.parse(str) : - { create: false }; // if no embedded data, assume no event creation - return internal.parseDragMeta(obj); - } - internal.config.dataAttrPrefix = ''; - function getEmbeddedElData(el, name) { - let prefix = internal.config.dataAttrPrefix; - let prefixedName = (prefix ? prefix + '-' : '') + name; - return el.getAttribute('data-' + prefixedName) || ''; - } - - /* - Makes an element (that is *external* to any calendar) draggable. - Can pass in data that determines how an event will be created when dropped onto a calendar. - Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system. - */ - class ExternalDraggable { - constructor(el, settings = {}) { - this.handlePointerDown = (ev) => { - let { dragging } = this; - let { minDistance, longPressDelay } = this.settings; - dragging.minDistance = - minDistance != null ? - minDistance : - (ev.isTouch ? 0 : internal.BASE_OPTION_DEFAULTS.eventDragMinDistance); - dragging.delay = - ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv - (longPressDelay != null ? longPressDelay : internal.BASE_OPTION_DEFAULTS.longPressDelay) : - 0; - }; - this.handleDragStart = (ev) => { - if (ev.isTouch && - this.dragging.delay && - ev.subjectEl.classList.contains('fc-event')) { - this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected'); - } - }; - this.settings = settings; - let dragging = this.dragging = new FeaturefulElementDragging(el); - dragging.touchScrollAllowed = false; - if (settings.itemSelector != null) { - dragging.pointer.selector = settings.itemSelector; - } - if (settings.appendTo != null) { - dragging.mirror.parentNode = settings.appendTo; // TODO: write tests - } - dragging.emitter.on('pointerdown', this.handlePointerDown); - dragging.emitter.on('dragstart', this.handleDragStart); - new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new - } - destroy() { - this.dragging.destroy(); - } - } - - /* - Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements. - The third-party system is responsible for drawing the visuals effects of the drag. - This class simply monitors for pointer movements and fires events. - It also has the ability to hide the moving element (the "mirror") during the drag. - */ - class InferredElementDragging extends internal.ElementDragging { - constructor(containerEl) { - super(containerEl); - this.shouldIgnoreMove = false; - this.mirrorSelector = ''; - this.currentMirrorEl = null; - this.handlePointerDown = (ev) => { - this.emitter.trigger('pointerdown', ev); - if (!this.shouldIgnoreMove) { - // fire dragstart right away. does not support delay or min-distance - this.emitter.trigger('dragstart', ev); - } - }; - this.handlePointerMove = (ev) => { - if (!this.shouldIgnoreMove) { - this.emitter.trigger('dragmove', ev); - } - }; - this.handlePointerUp = (ev) => { - this.emitter.trigger('pointerup', ev); - if (!this.shouldIgnoreMove) { - // fire dragend right away. does not support a revert animation - this.emitter.trigger('dragend', ev); - } - }; - let pointer = this.pointer = new PointerDragging(containerEl); - pointer.emitter.on('pointerdown', this.handlePointerDown); - pointer.emitter.on('pointermove', this.handlePointerMove); - pointer.emitter.on('pointerup', this.handlePointerUp); - } - destroy() { - this.pointer.destroy(); - } - setIgnoreMove(bool) { - this.shouldIgnoreMove = bool; - } - setMirrorIsVisible(bool) { - if (bool) { - // restore a previously hidden element. - // use the reference in case the selector class has already been removed. - if (this.currentMirrorEl) { - this.currentMirrorEl.style.visibility = ''; - this.currentMirrorEl = null; - } - } - else { - let mirrorEl = this.mirrorSelector - // TODO: somehow query FullCalendars WITHIN shadow-roots - ? document.querySelector(this.mirrorSelector) - : null; - if (mirrorEl) { - this.currentMirrorEl = mirrorEl; - mirrorEl.style.visibility = 'hidden'; - } - } - } - } - - /* - Bridges third-party drag-n-drop systems with FullCalendar. - Must be instantiated and destroyed by caller. - */ - class ThirdPartyDraggable { - constructor(containerOrSettings, settings) { - let containerEl = document; - if ( - // wish we could just test instanceof EventTarget, but doesn't work in IE11 - containerOrSettings === document || - containerOrSettings instanceof Element) { - containerEl = containerOrSettings; - settings = settings || {}; - } - else { - settings = (containerOrSettings || {}); - } - let dragging = this.dragging = new InferredElementDragging(containerEl); - if (typeof settings.itemSelector === 'string') { - dragging.pointer.selector = settings.itemSelector; - } - else if (containerEl === document) { - dragging.pointer.selector = '[data-event]'; - } - if (typeof settings.mirrorSelector === 'string') { - dragging.mirrorSelector = settings.mirrorSelector; - } - new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new - } - destroy() { - this.dragging.destroy(); - } - } - - var plugin = core.createPlugin({ - name: '@fullcalendar/interaction', - componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing], - calendarInteractions: [UnselectAuto], - elementDraggingImpl: FeaturefulElementDragging, - optionRefiners: OPTION_REFINERS, - listenerRefiners: LISTENER_REFINERS, - }); - - core.globalPlugins.push(plugin); - - exports.Draggable = ExternalDraggable; - exports.ThirdPartyDraggable = ThirdPartyDraggable; - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/interaction/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/interaction/index.global.min.js deleted file mode 100644 index 1bf2421c..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/interaction/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Interaction Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/editable -(c) 2022 Adam Shaw -*/ -FullCalendar.Interaction=function(t,e,i){"use strict";i.config.touchMouseIgnoreWait=500;let n=0,s=0,r=!1;class o{constructor(t){this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=t=>{if(!this.shouldIgnoreMouse()&&function(t){return 0===t.button&&!t.ctrlKey}(t)&&this.tryStart(t)){let e=this.createEventFromMouse(t,!0);this.emitter.trigger("pointerdown",e),this.initScrollWatch(e),this.shouldIgnoreMove||document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}},this.handleMouseMove=t=>{let e=this.createEventFromMouse(t);this.recordCoords(e),this.emitter.trigger("pointermove",e)},this.handleMouseUp=t=>{document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.emitter.trigger("pointerup",this.createEventFromMouse(t)),this.cleanup()},this.handleTouchStart=t=>{if(this.tryStart(t)){this.isTouchDragging=!0;let e=this.createEventFromTouch(t,!0);this.emitter.trigger("pointerdown",e),this.initScrollWatch(e);let i=t.target;this.shouldIgnoreMove||i.addEventListener("touchmove",this.handleTouchMove),i.addEventListener("touchend",this.handleTouchEnd),i.addEventListener("touchcancel",this.handleTouchEnd),window.addEventListener("scroll",this.handleTouchScroll,!0)}},this.handleTouchMove=t=>{let e=this.createEventFromTouch(t);this.recordCoords(e),this.emitter.trigger("pointermove",e)},this.handleTouchEnd=t=>{if(this.isDragging){let e=t.target;e.removeEventListener("touchmove",this.handleTouchMove),e.removeEventListener("touchend",this.handleTouchEnd),e.removeEventListener("touchcancel",this.handleTouchEnd),window.removeEventListener("scroll",this.handleTouchScroll,!0),this.emitter.trigger("pointerup",this.createEventFromTouch(t)),this.cleanup(),this.isTouchDragging=!1,n+=1,setTimeout(()=>{n-=1},i.config.touchMouseIgnoreWait)}},this.handleTouchScroll=()=>{this.wasTouchScroll=!0},this.handleScroll=t=>{if(!this.shouldIgnoreMove){let e=window.pageXOffset-this.prevScrollX+this.prevPageX,i=window.pageYOffset-this.prevScrollY+this.prevPageY;this.emitter.trigger("pointermove",{origEvent:t,isTouch:this.isTouchDragging,subjectEl:this.subjectEl,pageX:e,pageY:i,deltaX:e-this.origPageX,deltaY:i-this.origPageY})}},this.containerEl=t,this.emitter=new i.Emitter,t.addEventListener("mousedown",this.handleMouseDown),t.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),s+=1,1===s&&window.addEventListener("touchmove",l,{passive:!1})}destroy(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),s-=1,s||window.removeEventListener("touchmove",l,{passive:!1})}tryStart(t){let e=this.querySubjectEl(t),n=t.target;return!(!e||this.handleSelector&&!i.elementClosest(n,this.handleSelector))&&(this.subjectEl=e,this.isDragging=!0,this.wasTouchScroll=!1,!0)}cleanup(){r=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()}querySubjectEl(t){return this.selector?i.elementClosest(t.target,this.selector):this.containerEl}shouldIgnoreMouse(){return n||this.isTouchDragging}cancelTouchScroll(){this.isDragging&&(r=!0)}initScrollWatch(t){this.shouldWatchScroll&&(this.recordCoords(t),window.addEventListener("scroll",this.handleScroll,!0))}recordCoords(t){this.shouldWatchScroll&&(this.prevPageX=t.pageX,this.prevPageY=t.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)}destroyScrollWatch(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)}createEventFromMouse(t,e){let i=0,n=0;return e?(this.origPageX=t.pageX,this.origPageY=t.pageY):(i=t.pageX-this.origPageX,n=t.pageY-this.origPageY),{origEvent:t,isTouch:!1,subjectEl:this.subjectEl,pageX:t.pageX,pageY:t.pageY,deltaX:i,deltaY:n}}createEventFromTouch(t,e){let i,n,s=t.touches,r=0,o=0;return s&&s.length?(i=s[0].pageX,n=s[0].pageY):(i=t.pageX,n=t.pageY),e?(this.origPageX=i,this.origPageY=n):(r=i-this.origPageX,o=n-this.origPageY),{origEvent:t,isTouch:!0,subjectEl:this.subjectEl,pageX:i,pageY:n,deltaX:r,deltaY:o}}}function l(t){r&&t.preventDefault()}class a{constructor(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}start(t,e,i){this.sourceEl=t,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=e-window.pageXOffset,this.origScreenY=i-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()}handleMove(t,e){this.deltaX=t-window.pageXOffset-this.origScreenX,this.deltaY=e-window.pageYOffset-this.origScreenY,this.updateElPosition()}setIsVisible(t){t?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=t,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=t)}stop(t,e){let i=()=>{this.cleanup(),e()};t&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(i,this.revertDuration):setTimeout(i,0)}doRevertAnimation(t,e){let n=this.mirrorEl,s=this.sourceEl.getBoundingClientRect();n.style.transition="top "+e+"ms,left "+e+"ms",i.applyStyle(n,{left:s.left,top:s.top}),i.whenTransitionDone(n,()=>{n.style.transition="",t()})}cleanup(){this.mirrorEl&&(i.removeElement(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null}updateElPosition(){this.sourceEl&&this.isVisible&&i.applyStyle(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})}getMirrorEl(){let t=this.sourceElRect,e=this.mirrorEl;return e||(e=this.mirrorEl=this.sourceEl.cloneNode(!0),e.classList.add("fc-unselectable"),e.classList.add("fc-event-dragging"),i.applyStyle(e,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:t.right-t.left,height:t.bottom-t.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(e)),e}}class h extends i.ScrollController{constructor(t,e){super(),this.handleScroll=()=>{this.scrollTop=this.scrollController.getScrollTop(),this.scrollLeft=this.scrollController.getScrollLeft(),this.handleScrollChange()},this.scrollController=t,this.doesListening=e,this.scrollTop=this.origScrollTop=t.getScrollTop(),this.scrollLeft=this.origScrollLeft=t.getScrollLeft(),this.scrollWidth=t.getScrollWidth(),this.scrollHeight=t.getScrollHeight(),this.clientWidth=t.getClientWidth(),this.clientHeight=t.getClientHeight(),this.clientRect=this.computeClientRect(),this.doesListening&&this.getEventTarget().addEventListener("scroll",this.handleScroll)}destroy(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}setScrollTop(t){this.scrollController.setScrollTop(t),this.doesListening||(this.scrollTop=Math.max(Math.min(t,this.getMaxScrollTop()),0),this.handleScrollChange())}setScrollLeft(t){this.scrollController.setScrollLeft(t),this.doesListening||(this.scrollLeft=Math.max(Math.min(t,this.getMaxScrollLeft()),0),this.handleScrollChange())}getClientWidth(){return this.clientWidth}getClientHeight(){return this.clientHeight}getScrollWidth(){return this.scrollWidth}getScrollHeight(){return this.scrollHeight}handleScrollChange(){}}class c extends h{constructor(t,e){super(new i.ElementScrollController(t),e)}getEventTarget(){return this.scrollController.el}computeClientRect(){return i.computeInnerRect(this.scrollController.el)}}class d extends h{constructor(t){super(new i.WindowScrollController,t)}getEventTarget(){return window}computeClientRect(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}}handleScrollChange(){this.clientRect=this.computeClientRect()}}const g="function"==typeof performance?performance.now:Date.now;class u{constructor(){this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=()=>{if(this.isAnimating){let t=this.computeBestEdge(this.pointerScreenX+window.pageXOffset,this.pointerScreenY+window.pageYOffset);if(t){let e=g();this.handleSide(t,(e-this.msSinceRequest)/1e3),this.requestAnimation(e)}else this.isAnimating=!1}}}start(t,e,i){this.isEnabled&&(this.scrollCaches=this.buildCaches(i),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(t,e))}handleMove(t,e){if(this.isEnabled){let i=t-window.pageXOffset,n=e-window.pageYOffset,s=null===this.pointerScreenY?0:n-this.pointerScreenY,r=null===this.pointerScreenX?0:i-this.pointerScreenX;s<0?this.everMovedUp=!0:s>0&&(this.everMovedDown=!0),r<0?this.everMovedLeft=!0:r>0&&(this.everMovedRight=!0),this.pointerScreenX=i,this.pointerScreenY=n,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(g()))}}stop(){if(this.isEnabled){this.isAnimating=!1;for(let t of this.scrollCaches)t.destroy();this.scrollCaches=null}}requestAnimation(t){this.msSinceRequest=t,requestAnimationFrame(this.animate)}handleSide(t,e){let{scrollCache:i}=t,{edgeThreshold:n}=this,s=n-t.distance,r=s*s/(n*n)*this.maxVelocity*e,o=1;switch(t.name){case"left":o=-1;case"right":i.setScrollLeft(i.getScrollLeft()+r*o);break;case"top":o=-1;case"bottom":i.setScrollTop(i.getScrollTop()+r*o)}}computeBestEdge(t,e){let{edgeThreshold:i}=this,n=null,s=this.scrollCaches||[];for(let r of s){let s=r.clientRect,o=t-s.left,l=s.right-t,a=e-s.top,h=s.bottom-e;o>=0&&l>=0&&a>=0&&h>=0&&(a<=i&&this.everMovedUp&&r.canScrollUp()&&(!n||n.distance>a)&&(n={scrollCache:r,name:"top",distance:a}),h<=i&&this.everMovedDown&&r.canScrollDown()&&(!n||n.distance>h)&&(n={scrollCache:r,name:"bottom",distance:h}),o<=i&&this.everMovedLeft&&r.canScrollLeft()&&(!n||n.distance>o)&&(n={scrollCache:r,name:"left",distance:o}),l<=i&&this.everMovedRight&&r.canScrollRight()&&(!n||n.distance>l)&&(n={scrollCache:r,name:"right",distance:l}))}return n}buildCaches(t){return this.queryScrollEls(t).map(t=>t===window?new d(!1):new c(t,!1))}queryScrollEls(t){let e=[];for(let n of this.scrollQuery)"object"==typeof n?e.push(n):e.push(...Array.prototype.slice.call(i.getElRoot(t).querySelectorAll(n)));return e}}class p extends i.ElementDragging{constructor(t,e){super(t),this.containerEl=t,this.delay=null,this.minDistance=0,this.touchScrollAllowed=!0,this.mirrorNeedsRevert=!1,this.isInteracting=!1,this.isDragging=!1,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.delayTimeoutId=null,this.onPointerDown=t=>{this.isDragging||(this.isInteracting=!0,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,i.preventSelection(document.body),i.preventContextMenu(document.body),t.isTouch||t.origEvent.preventDefault(),this.emitter.trigger("pointerdown",t),this.isInteracting&&!this.pointer.shouldIgnoreMove&&(this.mirror.setIsVisible(!1),this.mirror.start(t.subjectEl,t.pageX,t.pageY),this.startDelay(t),this.minDistance||this.handleDistanceSurpassed(t)))},this.onPointerMove=t=>{if(this.isInteracting){if(this.emitter.trigger("pointermove",t),!this.isDistanceSurpassed){let e,i=this.minDistance,{deltaX:n,deltaY:s}=t;e=n*n+s*s,e>=i*i&&this.handleDistanceSurpassed(t)}this.isDragging&&("scroll"!==t.origEvent.type&&(this.mirror.handleMove(t.pageX,t.pageY),this.autoScroller.handleMove(t.pageX,t.pageY)),this.emitter.trigger("dragmove",t))}},this.onPointerUp=t=>{this.isInteracting&&(this.isInteracting=!1,i.allowSelection(document.body),i.allowContextMenu(document.body),this.emitter.trigger("pointerup",t),this.isDragging&&(this.autoScroller.stop(),this.tryStopDrag(t)),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null))};let n=this.pointer=new o(t);n.emitter.on("pointerdown",this.onPointerDown),n.emitter.on("pointermove",this.onPointerMove),n.emitter.on("pointerup",this.onPointerUp),e&&(n.selector=e),this.mirror=new a,this.autoScroller=new u}destroy(){this.pointer.destroy(),this.onPointerUp({})}startDelay(t){"number"==typeof this.delay?this.delayTimeoutId=setTimeout(()=>{this.delayTimeoutId=null,this.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)}handleDelayEnd(t){this.isDelayEnded=!0,this.tryStartDrag(t)}handleDistanceSurpassed(t){this.isDistanceSurpassed=!0,this.tryStartDrag(t)}tryStartDrag(t){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(t.pageX,t.pageY,this.containerEl),this.emitter.trigger("dragstart",t),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))}tryStopDrag(t){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,t))}stopDrag(t){this.isDragging=!1,this.emitter.trigger("dragend",t)}setIgnoreMove(t){this.pointer.shouldIgnoreMove=t}setMirrorIsVisible(t){this.mirror.setIsVisible(t)}setMirrorNeedsRevert(t){this.mirrorNeedsRevert=t}setAutoScrollEnabled(t){this.autoScroller.isEnabled=t}}class v{constructor(t){this.origRect=i.computeRect(t),this.scrollCaches=i.getClippingParents(t).map(t=>new c(t,!0))}destroy(){for(let t of this.scrollCaches)t.destroy()}computeLeft(){let t=this.origRect.left;for(let e of this.scrollCaches)t+=e.origScrollLeft-e.getScrollLeft();return t}computeTop(){let t=this.origRect.top;for(let e of this.scrollCaches)t+=e.origScrollTop-e.getScrollTop();return t}isWithinClipping(t,e){let n={left:t,top:e};for(let t of this.scrollCaches)if(!E(t.getEventTarget())&&!i.pointInsideRect(n,t.clientRect))return!1;return!0}}function E(t){let e=t.tagName;return"HTML"===e||"BODY"===e}class m{constructor(t,e){this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=t=>{let{dragging:e}=this;this.initialHit=null,this.movingHit=null,this.finalHit=null,this.prepareHits(),this.processFirstCoord(t),this.initialHit||!this.requireInitial?(e.setIgnoreMove(!1),this.emitter.trigger("pointerdown",t)):e.setIgnoreMove(!0)},this.handleDragStart=t=>{this.emitter.trigger("dragstart",t),this.handleMove(t,!0)},this.handleDragMove=t=>{this.emitter.trigger("dragmove",t),this.handleMove(t)},this.handlePointerUp=t=>{this.releaseHits(),this.emitter.trigger("pointerup",t)},this.handleDragEnd=t=>{this.movingHit&&this.emitter.trigger("hitupdate",null,!0,t),this.finalHit=this.movingHit,this.movingHit=null,this.emitter.trigger("dragend",t)},this.droppableStore=e,t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("dragstart",this.handleDragStart),t.emitter.on("dragmove",this.handleDragMove),t.emitter.on("pointerup",this.handlePointerUp),t.emitter.on("dragend",this.handleDragEnd),this.dragging=t,this.emitter=new i.Emitter}processFirstCoord(t){let e,n={left:t.pageX,top:t.pageY},s=n,r=t.subjectEl;r instanceof HTMLElement&&(e=i.computeRect(r),s=i.constrainPoint(s,e));let o=this.initialHit=this.queryHitForOffset(s.left,s.top);if(o){if(this.useSubjectCenter&&e){let t=i.intersectRects(e,o.rect);t&&(s=i.getRectCenter(t))}this.coordAdjust=i.diffPoints(s,n)}else this.coordAdjust={left:0,top:0}}handleMove(t,e){let i=this.queryHitForOffset(t.pageX+this.coordAdjust.left,t.pageY+this.coordAdjust.top);!e&&S(this.movingHit,i)||(this.movingHit=i,this.emitter.trigger("hitupdate",i,!1,t))}prepareHits(){this.offsetTrackers=i.mapHash(this.droppableStore,t=>(t.component.prepareHits(),new v(t.el)))}releaseHits(){let{offsetTrackers:t}=this;for(let e in t)t[e].destroy();this.offsetTrackers={}}queryHitForOffset(t,e){let{droppableStore:n,offsetTrackers:s}=this,r=null;for(let o in n){let l=n[o].component,a=s[o];if(a&&a.isWithinClipping(t,e)){let n=a.computeLeft(),s=a.computeTop(),h=t-n,c=e-s,{origRect:d}=a,g=d.right-d.left,u=d.bottom-d.top;if(h>=0&&h=0&&cr.layer)&&(t.componentId=o,t.context=l.context,t.rect.left+=n,t.rect.right+=n,t.rect.top+=s,t.rect.bottom+=s,r=t)}}}return r}}function S(t,e){return!t&&!e||Boolean(t)===Boolean(e)&&i.isDateSpansEqual(t.dateSpan,e.dateSpan)}function f(t,e){let i={};for(let n of e.pluginHooks.datePointTransforms)Object.assign(i,n(t,e));var n,s;return Object.assign(i,(n=t,{date:(s=e.dateEnv).toDate(n.range.start),dateStr:s.formatIso(n.range.start,{omitTime:n.allDay}),allDay:n.allDay})),i}class D extends i.Interaction{constructor(t){super(t),this.handlePointerDown=t=>{let{dragging:e}=this,i=t.origEvent.target;e.setIgnoreMove(!this.component.isValidDateDownEl(i))},this.handleDragEnd=t=>{let{component:e}=this,{pointer:i}=this.dragging;if(!i.wasTouchScroll){let{initialHit:i,finalHit:n}=this.hitDragging;if(i&&n&&S(i,n)){let{context:n}=e,s=Object.assign(Object.assign({},f(i.dateSpan,n)),{dayEl:i.dayEl,jsEvent:t.origEvent,view:n.viewApi||n.calendarApi.view});n.emitter.trigger("dateClick",s)}}},this.dragging=new p(t.el),this.dragging.autoScroller.isEnabled=!1;let e=this.hitDragging=new m(this.dragging,i.interactionSettingsToStore(t));e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}}class y extends i.Interaction{constructor(t){super(t),this.dragSelection=null,this.handlePointerDown=t=>{let{component:e,dragging:i}=this,{options:n}=e.context,s=n.selectable&&e.isValidDateDownEl(t.origEvent.target);i.setIgnoreMove(!s),i.delay=t.isTouch?function(t){let{options:e}=t.context,i=e.selectLongPressDelay;null==i&&(i=e.longPressDelay);return i}(e):null},this.handleDragStart=t=>{this.component.context.calendarApi.unselect(t)},this.handleHitUpdate=(t,e)=>{let{context:n}=this.component,s=null,r=!1;if(t){let e=this.hitDragging.initialHit;t.componentId===e.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(e,t)||(s=function(t,e,n){let s=t.dateSpan,r=e.dateSpan,o=[s.range.start,s.range.end,r.range.start,r.range.end];o.sort(i.compareNumbers);let l={};for(let i of n){let n=i(t,e);if(!1===n)return null;n&&Object.assign(l,n)}return l.range={start:o[0],end:o[3]},l.allDay=s.allDay,l}(e,t,n.pluginHooks.dateSelectionTransformers)),s&&i.isDateSelectionValid(s,t.dateProfile,n)||(r=!0,s=null)}s?n.dispatch({type:"SELECT_DATES",selection:s}):e||n.dispatch({type:"UNSELECT_DATES"}),r?i.disableCursor():i.enableCursor(),e||(this.dragSelection=s)},this.handlePointerUp=t=>{this.dragSelection&&(i.triggerDateSelect(this.dragSelection,t,this.component.context),this.dragSelection=null)};let{component:e}=t,{options:n}=e.context,s=this.dragging=new p(t.el);s.touchScrollAllowed=!1,s.minDistance=n.selectMinDistance||0,s.autoScroller.isEnabled=n.dragScroll;let r=this.hitDragging=new m(this.dragging,i.interactionSettingsToStore(t));r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.dragging.destroy()}}class w extends i.Interaction{constructor(t){super(t),this.subjectEl=null,this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=t=>{let e=t.origEvent.target,{component:n,dragging:s}=this,{mirror:r}=s,{options:o}=n.context,l=n.context;this.subjectEl=t.subjectEl;let a=this.subjectSeg=i.getElSeg(t.subjectEl),h=(this.eventRange=a.eventRange).instance.instanceId;this.relevantEvents=i.getRelevantEvents(l.getCurrentData().eventStore,h),s.minDistance=t.isTouch?0:o.eventDragMinDistance,s.delay=t.isTouch&&h!==n.props.eventSelection?function(t){let{options:e}=t.context,i=e.eventLongPressDelay;null==i&&(i=e.longPressDelay);return i}(n):null,o.fixedMirrorParent?r.parentNode=o.fixedMirrorParent:r.parentNode=i.elementClosest(e,".fc"),r.revertDuration=o.dragRevertDuration;let c=n.isValidSegDownEl(e)&&!i.elementClosest(e,".fc-event-resizer");s.setIgnoreMove(!c),this.isDragging=c&&t.subjectEl.classList.contains("fc-event-draggable")},this.handleDragStart=t=>{let e=this.component.context,n=this.eventRange,s=n.instance.instanceId;t.isTouch?s!==this.component.props.eventSelection&&e.dispatch({type:"SELECT_EVENT",eventInstanceId:s}):e.dispatch({type:"UNSELECT_EVENT"}),this.isDragging&&(e.calendarApi.unselect(t),e.emitter.trigger("eventDragStart",{el:this.subjectEl,event:new i.EventImpl(e,n.def,n.instance),jsEvent:t.origEvent,view:e.viewApi}))},this.handleHitUpdate=(t,e)=>{if(!this.isDragging)return;let n=this.relevantEvents,s=this.hitDragging.initialHit,r=this.component.context,o=null,l=null,a=null,h=!1,c={affectedEvents:n,mutatedEvents:i.createEmptyEventStore(),isEvent:!0};if(t){o=t.context;let e=o.options;r===o||e.editable&&e.droppable?(l=function(t,e,n){let s=t.dateSpan,r=e.dateSpan,o=s.range.start,l=r.range.start,a={};s.allDay!==r.allDay&&(a.allDay=r.allDay,a.hasEnd=e.context.options.allDayMaintainDuration,r.allDay&&(o=i.startOfDay(o)));let h=i.diffDates(o,l,t.context.dateEnv,t.componentId===e.componentId?t.largeUnit:null);h.milliseconds&&(a.allDay=!1);let c={datesDelta:h,standardProps:a};for(let i of n)i(c,t,e);return c}(s,t,o.getCurrentData().pluginHooks.eventDragMutationMassagers),l&&(a=i.applyMutationToEventStore(n,o.getCurrentData().eventUiBases,l,o),c.mutatedEvents=a,i.isInteractionValid(c,t.dateProfile,o)||(h=!0,l=null,a=null,c.mutatedEvents=i.createEmptyEventStore()))):o=null}this.displayDrag(o,c),h?i.disableCursor():i.enableCursor(),e||(r===o&&S(s,t)&&(l=null),this.dragging.setMirrorNeedsRevert(!l),this.dragging.setMirrorIsVisible(!t||!i.getElRoot(this.subjectEl).querySelector(".fc-event-mirror")),this.receivingContext=o,this.validMutation=l,this.mutatedRelevantEvents=a)},this.handlePointerUp=()=>{this.isDragging||this.cleanup()},this.handleDragEnd=t=>{if(this.isDragging){let e=this.component.context,n=e.viewApi,{receivingContext:s,validMutation:r}=this,o=this.eventRange.def,l=this.eventRange.instance,a=new i.EventImpl(e,o,l),h=this.relevantEvents,c=this.mutatedRelevantEvents,{finalHit:d}=this.hitDragging;if(this.clearDrag(),e.emitter.trigger("eventDragStop",{el:this.subjectEl,event:a,jsEvent:t.origEvent,view:n}),r){if(s===e){let s=new i.EventImpl(e,c.defs[o.defId],l?c.instances[l.instanceId]:null);e.dispatch({type:"MERGE_EVENTS",eventStore:c});let d={oldEvent:a,event:s,relatedEvents:i.buildEventApis(c,e,l),revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:h})}},g={};for(let t of e.getCurrentData().pluginHooks.eventDropTransformers)Object.assign(g,t(r,e));e.emitter.trigger("eventDrop",Object.assign(Object.assign(Object.assign({},d),g),{el:t.subjectEl,delta:r.datesDelta,jsEvent:t.origEvent,view:n})),e.emitter.trigger("eventChange",d)}else if(s){let r={event:a,relatedEvents:i.buildEventApis(h,e,l),revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:h})}};e.emitter.trigger("eventLeave",Object.assign(Object.assign({},r),{draggedEl:t.subjectEl,view:n})),e.dispatch({type:"REMOVE_EVENTS",eventStore:h}),e.emitter.trigger("eventRemove",r);let g=c.defs[o.defId],u=c.instances[l.instanceId],p=new i.EventImpl(s,g,u);s.dispatch({type:"MERGE_EVENTS",eventStore:c});let v={event:p,relatedEvents:i.buildEventApis(c,s,u),revert(){s.dispatch({type:"REMOVE_EVENTS",eventStore:c})}};s.emitter.trigger("eventAdd",v),t.isTouch&&s.dispatch({type:"SELECT_EVENT",eventInstanceId:l.instanceId}),s.emitter.trigger("drop",Object.assign(Object.assign({},f(d.dateSpan,s)),{draggedEl:t.subjectEl,jsEvent:t.origEvent,view:d.context.viewApi})),s.emitter.trigger("eventReceive",Object.assign(Object.assign({},v),{draggedEl:t.subjectEl,view:d.context.viewApi}))}}else e.emitter.trigger("_noEventDrop")}this.cleanup()};let{component:e}=this,{options:n}=e.context,s=this.dragging=new p(t.el);s.pointer.selector=w.SELECTOR,s.touchScrollAllowed=!1,s.autoScroller.isEnabled=n.dragScroll;let r=this.hitDragging=new m(this.dragging,i.interactionSettingsStore);r.useSubjectCenter=t.useEventCenter,r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("pointerup",this.handlePointerUp),r.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}displayDrag(t,e){let n=this.component.context,s=this.receivingContext;s&&s!==t&&(s===n?s.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:e.affectedEvents,mutatedEvents:i.createEmptyEventStore(),isEvent:!0}}):s.dispatch({type:"UNSET_EVENT_DRAG"})),t&&t.dispatch({type:"SET_EVENT_DRAG",state:e})}clearDrag(){let t=this.component.context,{receivingContext:e}=this;e&&e.dispatch({type:"UNSET_EVENT_DRAG"}),t!==e&&t.dispatch({type:"UNSET_EVENT_DRAG"})}cleanup(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null}}w.SELECTOR=".fc-event-draggable, .fc-event-resizable";class T extends i.Interaction{constructor(t){super(t),this.draggingSegEl=null,this.draggingSeg=null,this.eventRange=null,this.relevantEvents=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=t=>{let{component:e}=this,n=this.querySegEl(t),s=i.getElSeg(n),r=this.eventRange=s.eventRange;this.dragging.minDistance=e.context.options.eventDragMinDistance,this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(t.origEvent.target)||t.isTouch&&this.component.props.eventSelection!==r.instance.instanceId)},this.handleDragStart=t=>{let{context:e}=this.component,n=this.eventRange;this.relevantEvents=i.getRelevantEvents(e.getCurrentData().eventStore,this.eventRange.instance.instanceId);let s=this.querySegEl(t);this.draggingSegEl=s,this.draggingSeg=i.getElSeg(s),e.calendarApi.unselect(),e.emitter.trigger("eventResizeStart",{el:s,event:new i.EventImpl(e,n.def,n.instance),jsEvent:t.origEvent,view:e.viewApi})},this.handleHitUpdate=(t,e,n)=>{let{context:s}=this.component,r=this.relevantEvents,o=this.hitDragging.initialHit,l=this.eventRange.instance,a=null,h=null,c=!1,d={affectedEvents:r,mutatedEvents:i.createEmptyEventStore(),isEvent:!0};if(t){t.componentId===o.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(o,t)||(a=function(t,e,n,s){let r=t.context.dateEnv,o=t.dateSpan.range.start,l=e.dateSpan.range.start,a=i.diffDates(o,l,r,t.largeUnit);if(n){if(r.add(s.start,a)s.start)return{endDelta:a};return null}(o,t,n.subjectEl.classList.contains("fc-event-resizer-start"),l.range))}a&&(h=i.applyMutationToEventStore(r,s.getCurrentData().eventUiBases,a,s),d.mutatedEvents=h,i.isInteractionValid(d,t.dateProfile,s)||(c=!0,a=null,h=null,d.mutatedEvents=null)),h?s.dispatch({type:"SET_EVENT_RESIZE",state:d}):s.dispatch({type:"UNSET_EVENT_RESIZE"}),c?i.disableCursor():i.enableCursor(),e||(a&&S(o,t)&&(a=null),this.validMutation=a,this.mutatedRelevantEvents=h)},this.handleDragEnd=t=>{let{context:e}=this.component,n=this.eventRange.def,s=this.eventRange.instance,r=new i.EventImpl(e,n,s),o=this.relevantEvents,l=this.mutatedRelevantEvents;if(e.emitter.trigger("eventResizeStop",{el:this.draggingSegEl,event:r,jsEvent:t.origEvent,view:e.viewApi}),this.validMutation){let a=new i.EventImpl(e,l.defs[n.defId],s?l.instances[s.instanceId]:null);e.dispatch({type:"MERGE_EVENTS",eventStore:l});let h={oldEvent:r,event:a,relatedEvents:i.buildEventApis(l,e,s),revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:o})}};e.emitter.trigger("eventResize",Object.assign(Object.assign({},h),{el:this.draggingSegEl,startDelta:this.validMutation.startDelta||i.createDuration(0),endDelta:this.validMutation.endDelta||i.createDuration(0),jsEvent:t.origEvent,view:e.viewApi})),e.emitter.trigger("eventChange",h)}else e.emitter.trigger("_noEventResize");this.draggingSeg=null,this.relevantEvents=null,this.validMutation=null};let{component:e}=t,n=this.dragging=new p(t.el);n.pointer.selector=".fc-event-resizer",n.touchScrollAllowed=!1,n.autoScroller.isEnabled=e.context.options.dragScroll;let s=this.hitDragging=new m(this.dragging,i.interactionSettingsToStore(t));s.emitter.on("pointerdown",this.handlePointerDown),s.emitter.on("dragstart",this.handleDragStart),s.emitter.on("hitupdate",this.handleHitUpdate),s.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}querySegEl(t){return i.elementClosest(t.subjectEl,".fc-event")}}const b={fixedMirrorParent:i.identity},M={dateClick:i.identity,eventDragStart:i.identity,eventDragStop:i.identity,eventDrop:i.identity,eventResizeStart:i.identity,eventResizeStop:i.identity,eventResize:i.identity,drop:i.identity,eventReceive:i.identity,eventLeave:i.identity};class C{constructor(t,e){this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=t=>{this.dragMeta=this.buildDragMeta(t.subjectEl)},this.handleHitUpdate=(t,e,n)=>{let{dragging:s}=this.hitDragging,r=null,o=null,l=!1,a={affectedEvents:i.createEmptyEventStore(),mutatedEvents:i.createEmptyEventStore(),isEvent:this.dragMeta.create};t&&(r=t.context,this.canDropElOnCalendar(n.subjectEl,r)&&(o=function(t,e,n){let s=Object.assign({},e.leftoverProps);for(let i of n.pluginHooks.externalDefTransforms)Object.assign(s,i(t,e));let{refined:r,extra:o}=i.refineEventDef(s,n),l=i.parseEventDef(r,o,e.sourceId,t.allDay,n.options.forceEventDuration||Boolean(e.duration),n),a=t.range.start;t.allDay&&e.startTime&&(a=n.dateEnv.add(a,e.startTime));let h=e.duration?n.dateEnv.add(a,e.duration):i.getDefaultEventEnd(t.allDay,a,n),c=i.createEventInstance(l.defId,{start:a,end:h});return{def:l,instance:c}}(t.dateSpan,this.dragMeta,r),a.mutatedEvents=i.eventTupleToStore(o),l=!i.isInteractionValid(a,t.dateProfile,r),l&&(a.mutatedEvents=i.createEmptyEventStore(),o=null))),this.displayDrag(r,a),s.setMirrorIsVisible(e||!o||!document.querySelector(".fc-event-mirror")),l?i.disableCursor():i.enableCursor(),e||(s.setMirrorNeedsRevert(!o),this.receivingContext=r,this.droppableEvent=o)},this.handleDragEnd=t=>{let{receivingContext:e,droppableEvent:n}=this;if(this.clearDrag(),e&&n){let s=this.hitDragging.finalHit,r=s.context.viewApi,o=this.dragMeta;if(e.emitter.trigger("drop",Object.assign(Object.assign({},f(s.dateSpan,e)),{draggedEl:t.subjectEl,jsEvent:t.origEvent,view:r})),o.create){let s=i.eventTupleToStore(n);e.dispatch({type:"MERGE_EVENTS",eventStore:s}),t.isTouch&&e.dispatch({type:"SELECT_EVENT",eventInstanceId:n.instance.instanceId}),e.emitter.trigger("eventReceive",{event:new i.EventImpl(e,n.def,n.instance),relatedEvents:[],revert(){e.dispatch({type:"REMOVE_EVENTS",eventStore:s})},draggedEl:t.subjectEl,view:r})}}this.receivingContext=null,this.droppableEvent=null};let n=this.hitDragging=new m(t,i.interactionSettingsStore);n.requireInitial=!1,n.emitter.on("dragstart",this.handleDragStart),n.emitter.on("hitupdate",this.handleHitUpdate),n.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=e}buildDragMeta(t){return"object"==typeof this.suppliedDragMeta?i.parseDragMeta(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?i.parseDragMeta(this.suppliedDragMeta(t)):function(t){let e=function(t,e){let n=i.config.dataAttrPrefix,s=(n?n+"-":"")+e;return t.getAttribute("data-"+s)||""}(t,"event"),n=e?JSON.parse(e):{create:!1};return i.parseDragMeta(n)}(t)}displayDrag(t,e){let i=this.receivingContext;i&&i!==t&&i.dispatch({type:"UNSET_EVENT_DRAG"}),t&&t.dispatch({type:"SET_EVENT_DRAG",state:e})}clearDrag(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})}canDropElOnCalendar(t,e){let n=e.options.dropAccept;return"function"==typeof n?n.call(e.calendarApi,t):"string"!=typeof n||!n||Boolean(i.elementMatches(t,n))}}i.config.dataAttrPrefix="";class R extends i.ElementDragging{constructor(t){super(t),this.shouldIgnoreMove=!1,this.mirrorSelector="",this.currentMirrorEl=null,this.handlePointerDown=t=>{this.emitter.trigger("pointerdown",t),this.shouldIgnoreMove||this.emitter.trigger("dragstart",t)},this.handlePointerMove=t=>{this.shouldIgnoreMove||this.emitter.trigger("dragmove",t)},this.handlePointerUp=t=>{this.emitter.trigger("pointerup",t),this.shouldIgnoreMove||this.emitter.trigger("dragend",t)};let e=this.pointer=new o(t);e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("pointermove",this.handlePointerMove),e.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.pointer.destroy()}setIgnoreMove(t){this.shouldIgnoreMove=t}setMirrorIsVisible(t){if(t)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{let t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}}}var I=e.createPlugin({name:"@fullcalendar/interaction",componentInteractions:[D,y,w,T],calendarInteractions:[class{constructor(t){this.context=t,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=t=>{t.jsEvent&&(this.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=t=>{let e=this.context.options.unselectCancel,n=i.getEventTargetViaRoot(t.origEvent);this.matchesCancel=!!i.elementClosest(n,e),this.matchesEvent=!!i.elementClosest(n,w.SELECTOR)},this.onDocumentPointerUp=t=>{let{context:e}=this,{documentPointer:i}=this,n=e.getCurrentData();if(!i.wasTouchScroll){if(n.dateSelection&&!this.isRecentPointerDateSelect){let i=e.options.unselectAuto;!i||i&&this.matchesCancel||e.calendarApi.unselect(t)}n.eventSelection&&!this.matchesEvent&&e.dispatch({type:"UNSELECT_EVENT"})}this.isRecentPointerDateSelect=!1};let e=this.documentPointer=new o(document);e.shouldIgnoreMove=!0,e.shouldWatchScroll=!1,e.emitter.on("pointerdown",this.onDocumentPointerDown),e.emitter.on("pointerup",this.onDocumentPointerUp),t.emitter.on("select",this.onSelect)}destroy(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()}}],elementDraggingImpl:p,optionRefiners:b,listenerRefiners:M});return e.globalPlugins.push(I),t.Draggable=class{constructor(t,e={}){this.handlePointerDown=t=>{let{dragging:e}=this,{minDistance:n,longPressDelay:s}=this.settings;e.minDistance=null!=n?n:t.isTouch?0:i.BASE_OPTION_DEFAULTS.eventDragMinDistance,e.delay=t.isTouch?null!=s?s:i.BASE_OPTION_DEFAULTS.longPressDelay:0},this.handleDragStart=t=>{t.isTouch&&this.dragging.delay&&t.subjectEl.classList.contains("fc-event")&&this.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=e;let n=this.dragging=new p(t);n.touchScrollAllowed=!1,null!=e.itemSelector&&(n.pointer.selector=e.itemSelector),null!=e.appendTo&&(n.mirror.parentNode=e.appendTo),n.emitter.on("pointerdown",this.handlePointerDown),n.emitter.on("dragstart",this.handleDragStart),new C(n,e.eventData)}destroy(){this.dragging.destroy()}},t.ThirdPartyDraggable=class{constructor(t,e){let i=document;t===document||t instanceof Element?(i=t,e=e||{}):e=t||{};let n=this.dragging=new R(i);"string"==typeof e.itemSelector?n.pointer.selector=e.itemSelector:i===document&&(n.pointer.selector="[data-event]"),"string"==typeof e.mirrorSelector&&(n.mirrorSelector=e.mirrorSelector),new C(n,e.eventData)}destroy(){this.dragging.destroy()}},t.default=I,Object.defineProperty(t,"__esModule",{value:!0}),t}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/list/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/list/index.global.js deleted file mode 100644 index 932d3cce..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/list/index.global.js +++ /dev/null @@ -1,332 +0,0 @@ -/*! -FullCalendar List View Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/list-view -(c) 2022 Adam Shaw -*/ -FullCalendar.List = (function (exports, core, internal$1, preact) { - 'use strict'; - - class ListViewHeaderRow extends internal$1.BaseComponent { - constructor() { - super(...arguments); - this.state = { - textId: internal$1.getUniqueDomId(), - }; - } - render() { - let { theme, dateEnv, options, viewApi } = this.context; - let { cellId, dayDate, todayRange } = this.props; - let { textId } = this.state; - let dayMeta = internal$1.getDateMeta(dayDate, todayRange); - // will ever be falsy? - let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ''; - // will ever be falsy? also, BAD NAME "alt" - let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ''; - let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId, - text, - sideText, navLinkAttrs: internal$1.buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: internal$1.buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta); - // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too) - return (preact.createElement(internal$1.ContentContainer, { elTag: "tr", elClasses: [ - 'fc-list-day', - ...internal$1.getDayClassNames(dayMeta, theme), - ], elAttrs: { - 'data-date': internal$1.formatDayString(dayDate), - }, renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => ( // TODO: force-hide top border based on :first-child - preact.createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, - preact.createElement(InnerContent, { elTag: "div", elClasses: [ - 'fc-list-day-cushion', - theme.getClass('tableCellShaded'), - ] }))))); - } - } - function renderInnerContent(props) { - return (preact.createElement(preact.Fragment, null, - props.text && (preact.createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)), - props.sideText && ( /* not keyboard tabbable */preact.createElement("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText)))); - } - - const DEFAULT_TIME_FORMAT = internal$1.createFormatter({ - hour: 'numeric', - minute: '2-digit', - meridiem: 'short', - }); - class ListViewEventRow extends internal$1.BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props; - let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT; - return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [ - 'fc-list-event', - seg.eventRange.def.url && 'fc-event-forced-url', - ], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (preact.createElement(preact.Fragment, null, - buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId), - preact.createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" }, - preact.createElement("span", { className: "fc-list-event-dot", style: { - borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor, - } })), - preact.createElement(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } }))))); - } - } - function renderEventInnerContent(seg, context) { - let interactiveAttrs = internal$1.getSegAnchorAttrs(seg, context); - return (preact.createElement("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title)); - } - function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) { - let { options } = context; - if (options.displayEventTime !== false) { - let eventDef = seg.eventRange.def; - let eventInstance = seg.eventRange.instance; - let doAllDay = false; - let timeText; - if (eventDef.allDay) { - doAllDay = true; - } - else if (internal$1.isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead? - if (seg.isStart) { - timeText = internal$1.buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end); - } - else if (seg.isEnd) { - timeText = internal$1.buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end); - } - else { - doAllDay = true; - } - } - else { - timeText = internal$1.buildSegTimeText(seg, timeFormat, context); - } - if (doAllDay) { - let renderProps = { - text: context.options.allDayText, - view: context.viewApi, - }; - return (preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: { - headers: `${timeHeaderId} ${dateHeaderId}`, - }, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount })); - } - return (preact.createElement("td", { className: "fc-list-event-time" }, timeText)); - } - return null; - } - function renderAllDayInner(renderProps) { - return renderProps.text; - } - - /* - Responsible for the scroller, and forwarding event-related actions into the "grid". - */ - class ListView extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.computeDateVars = internal$1.memoize(computeDateVars); - this.eventStoreToSegs = internal$1.memoize(this._eventStoreToSegs); - this.state = { - timeHeaderId: internal$1.getUniqueDomId(), - eventHeaderId: internal$1.getUniqueDomId(), - dateHeaderIdRoot: internal$1.getUniqueDomId(), - }; - this.setRootEl = (rootEl) => { - if (rootEl) { - this.context.registerInteractiveComponent(this, { - el: rootEl, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; - } - render() { - let { props, context } = this; - let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile); - let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges); - return (preact.createElement(internal$1.ViewContainer, { elRef: this.setRootEl, elClasses: [ - 'fc-list', - context.theme.getClass('table'), - context.options.stickyHeaderDates !== false ? - 'fc-list-sticky' : - '', - ], viewSpec: context.viewSpec }, - preact.createElement(internal$1.Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ? - this.renderSegList(eventSegs, dayDates) : - this.renderEmptyMessage()))); - } - renderEmptyMessage() { - let { options, viewApi } = this.context; - let renderProps = { - text: options.noEventsText, - view: viewApi, - }; - return (preact.createElement(internal$1.ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", generator: options.noEventsContent || renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (preact.createElement(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] })))); - } - renderSegList(allSegs, dayDates) { - let { theme, options } = this.context; - let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state; - let segsByDay = groupSegsByDay(allSegs); // sparse array - return (preact.createElement(internal$1.NowTimer, { unit: "day" }, (nowDate, todayRange) => { - let innerNodes = []; - for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) { - let daySegs = segsByDay[dayIndex]; - if (daySegs) { // sparse array, so might be undefined - let dayStr = internal$1.formatDayString(dayDates[dayIndex]); - let dateHeaderId = dateHeaderIdRoot + '-' + dayStr; - // append a day header - innerNodes.push(preact.createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange })); - daySegs = internal$1.sortEventSegs(daySegs, options.eventOrder); - for (let seg of daySegs) { - innerNodes.push(preact.createElement(ListViewEventRow, Object.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 }, internal$1.getSegMeta(seg, todayRange, nowDate)))); - } - } - } - return (preact.createElement("table", { className: 'fc-list-table ' + theme.getClass('table') }, - preact.createElement("thead", null, - preact.createElement("tr", null, - preact.createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint), - preact.createElement("th", { scope: "col", "aria-hidden": true }), - preact.createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))), - preact.createElement("tbody", null, innerNodes))); - })); - } - _eventStoreToSegs(eventStore, eventUiBases, dayRanges) { - return this.eventRangesToSegs(internal$1.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges); - } - eventRangesToSegs(eventRanges, dayRanges) { - let segs = []; - for (let eventRange of eventRanges) { - segs.push(...this.eventRangeToSegs(eventRange, dayRanges)); - } - return segs; - } - eventRangeToSegs(eventRange, dayRanges) { - let { dateEnv } = this.context; - let { nextDayThreshold } = this.context.options; - let range = eventRange.range; - let allDay = eventRange.def.allDay; - let dayIndex; - let segRange; - let seg; - let segs = []; - for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) { - segRange = internal$1.intersectRanges(range, dayRanges[dayIndex]); - if (segRange) { - seg = { - component: this, - eventRange, - start: segRange.start, - end: segRange.end, - isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(), - isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(), - dayIndex, - }; - segs.push(seg); - // detect when range won't go fully into the next day, - // and mutate the latest seg to the be the end. - if (!seg.isEnd && !allDay && - dayIndex + 1 < dayRanges.length && - range.end < - dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) { - seg.end = range.end; - seg.isEnd = true; - break; - } - } - } - return segs; - } - } - function renderNoEventsInner(renderProps) { - return renderProps.text; - } - function computeDateVars(dateProfile) { - let dayStart = internal$1.startOfDay(dateProfile.renderRange.start); - let viewEnd = dateProfile.renderRange.end; - let dayDates = []; - let dayRanges = []; - while (dayStart < viewEnd) { - dayDates.push(dayStart); - dayRanges.push({ - start: dayStart, - end: internal$1.addDays(dayStart, 1), - }); - dayStart = internal$1.addDays(dayStart, 1); - } - return { dayDates, dayRanges }; - } - // Returns a sparse array of arrays, segs grouped by their dayIndex - function groupSegsByDay(segs) { - let segsByDay = []; // sparse array - let i; - let seg; - for (i = 0; i < segs.length; i += 1) { - seg = segs[i]; - (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = [])) - .push(seg); - } - return segsByDay; - } - - const OPTION_REFINERS = { - listDayFormat: createFalsableFormatter, - listDaySideFormat: createFalsableFormatter, - noEventsClassNames: internal$1.identity, - noEventsContent: internal$1.identity, - noEventsDidMount: internal$1.identity, - noEventsWillUnmount: internal$1.identity, - // noEventsText is defined in base options - }; - function createFalsableFormatter(input) { - return input === false ? null : internal$1.createFormatter(input); - } - - var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}"; - internal$1.injectStyles(css_248z); - - var plugin = core.createPlugin({ - name: '@fullcalendar/list', - optionRefiners: OPTION_REFINERS, - views: { - list: { - component: ListView, - buttonTextKey: 'list', - listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016" - }, - listDay: { - type: 'list', - duration: { days: 1 }, - listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar - }, - listWeek: { - type: 'list', - duration: { weeks: 1 }, - listDayFormat: { weekday: 'long' }, - listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' }, - }, - listMonth: { - type: 'list', - duration: { month: 1 }, - listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have - }, - listYear: { - type: 'list', - duration: { year: 1 }, - listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have - }, - }, - }); - - var internal = { - __proto__: null, - ListView: ListView - }; - - core.globalPlugins.push(plugin); - - exports.Internal = internal; - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, FullCalendar.Internal, FullCalendar.Preact); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/list/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/list/index.global.min.js deleted file mode 100644 index a22f1e5d..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/list/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar List View Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/list-view -(c) 2022 Adam Shaw -*/ -FullCalendar.List=function(e,t,n,a){"use strict";class i extends n.BaseComponent{constructor(){super(...arguments),this.state={textId:n.getUniqueDomId()}}render(){let{theme:e,dateEnv:t,options:i,viewApi:s}=this.context,{cellId:l,dayDate:o,todayRange:d}=this.props,{textId:c}=this.state,f=n.getDateMeta(o,d),g=i.listDayFormat?t.format(o,i.listDayFormat):"",u=i.listDaySideFormat?t.format(o,i.listDaySideFormat):"",m=Object.assign({date:t.toDate(o),view:s,textId:c,text:g,sideText:u,navLinkAttrs:n.buildNavLinkAttrs(this.context,o),sideNavLinkAttrs:n.buildNavLinkAttrs(this.context,o,"day",!1)},f);return a.createElement(n.ContentContainer,{elTag:"tr",elClasses:["fc-list-day",...n.getDayClassNames(f,e)],elAttrs:{"data-date":n.formatDayString(o)},renderProps:m,generatorName:"dayHeaderContent",generator:i.dayHeaderContent||r,classNameGenerator:i.dayHeaderClassNames,didMount:i.dayHeaderDidMount,willUnmount:i.dayHeaderWillUnmount},t=>a.createElement("th",{scope:"colgroup",colSpan:3,id:l,"aria-labelledby":c},a.createElement(t,{elTag:"div",elClasses:["fc-list-day-cushion",e.getClass("tableCellShaded")]})))}}function r(e){return a.createElement(a.Fragment,null,e.text&&a.createElement("a",Object.assign({id:e.textId,className:"fc-list-day-text"},e.navLinkAttrs),e.text),e.sideText&&a.createElement("a",Object.assign({"aria-hidden":!0,className:"fc-list-day-side-text"},e.sideNavLinkAttrs),e.sideText))}const s=n.createFormatter({hour:"numeric",minute:"2-digit",meridiem:"short"});class l extends n.BaseComponent{render(){let{props:e,context:t}=this,{options:i}=t,{seg:r,timeHeaderId:l,eventHeaderId:d,dateHeaderId:c}=e,f=i.eventTimeFormat||s;return a.createElement(n.EventContainer,Object.assign({},e,{elTag:"tr",elClasses:["fc-list-event",r.eventRange.def.url&&"fc-event-forced-url"],defaultGenerator:()=>function(e,t){let i=n.getSegAnchorAttrs(e,t);return a.createElement("a",Object.assign({},i),e.eventRange.def.title)}(r,t),seg:r,timeText:"",disableDragging:!0,disableResizing:!0}),(e,i)=>a.createElement(a.Fragment,null,function(e,t,i,r,s){let{options:l}=i;if(!1!==l.displayEventTime){let d,c=e.eventRange.def,f=e.eventRange.instance,g=!1;if(c.allDay?g=!0:n.isMultiDayRange(e.eventRange.range)?e.isStart?d=n.buildSegTimeText(e,t,i,null,null,f.range.start,e.end):e.isEnd?d=n.buildSegTimeText(e,t,i,null,null,e.start,f.range.end):g=!0:d=n.buildSegTimeText(e,t,i),g){let e={text:i.options.allDayText,view:i.viewApi};return a.createElement(n.ContentContainer,{elTag:"td",elClasses:["fc-list-event-time"],elAttrs:{headers:`${r} ${s}`},renderProps:e,generatorName:"allDayContent",generator:l.allDayContent||o,classNameGenerator:l.allDayClassNames,didMount:l.allDayDidMount,willUnmount:l.allDayWillUnmount})}return a.createElement("td",{className:"fc-list-event-time"},d)}return null}(r,f,t,l,c),a.createElement("td",{"aria-hidden":!0,className:"fc-list-event-graphic"},a.createElement("span",{className:"fc-list-event-dot",style:{borderColor:i.borderColor||i.backgroundColor}})),a.createElement(e,{elTag:"td",elClasses:["fc-list-event-title"],elAttrs:{headers:`${d} ${c}`}})))}}function o(e){return e.text}class d extends n.DateComponent{constructor(){super(...arguments),this.computeDateVars=n.memoize(f),this.eventStoreToSegs=n.memoize(this._eventStoreToSegs),this.state={timeHeaderId:n.getUniqueDomId(),eventHeaderId:n.getUniqueDomId(),dateHeaderIdRoot:n.getUniqueDomId()},this.setRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e,context:t}=this,{dayDates:i,dayRanges:r}=this.computeDateVars(e.dateProfile),s=this.eventStoreToSegs(e.eventStore,e.eventUiBases,r);return a.createElement(n.ViewContainer,{elRef:this.setRootEl,elClasses:["fc-list",t.theme.getClass("table"),!1!==t.options.stickyHeaderDates?"fc-list-sticky":""],viewSpec:t.viewSpec},a.createElement(n.Scroller,{liquid:!e.isHeightAuto,overflowX:e.isHeightAuto?"visible":"hidden",overflowY:e.isHeightAuto?"visible":"auto"},s.length>0?this.renderSegList(s,i):this.renderEmptyMessage()))}renderEmptyMessage(){let{options:e,viewApi:t}=this.context,i={text:e.noEventsText,view:t};return a.createElement(n.ContentContainer,{elTag:"div",elClasses:["fc-list-empty"],renderProps:i,generatorName:"noEventsContent",generator:e.noEventsContent||c,classNameGenerator:e.noEventsClassNames,didMount:e.noEventsDidMount,willUnmount:e.noEventsWillUnmount},e=>a.createElement(e,{elTag:"div",elClasses:["fc-list-empty-cushion"]}))}renderSegList(e,t){let{theme:r,options:s}=this.context,{timeHeaderId:o,eventHeaderId:d,dateHeaderIdRoot:c}=this.state,f=function(e){let t,n,a=[];for(t=0;t{let u=[];for(let r=0;r*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:"";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}');var m=t.createPlugin({name:"@fullcalendar/list",optionRefiners:g,views:{list:{component:d,buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDaySideFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDaySideFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDaySideFormat:{weekday:"long"}}}}),h={__proto__:null,ListView:d};return t.globalPlugins.push(m),e.Internal=h,e.default=m,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,FullCalendar.Preact); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon1/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon1/index.global.js deleted file mode 100644 index 96ee2500..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon1/index.global.js +++ /dev/null @@ -1,128 +0,0 @@ -/*! -FullCalendar Luxon 1 Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/luxon1 -(c) 2022 Adam Shaw -*/ -FullCalendar.Luxon = (function (exports, core, luxon, internal) { - 'use strict'; - - function toLuxonDateTime(date, calendar) { - if (!(calendar instanceof internal.CalendarImpl)) { - throw new Error('must supply a CalendarApi instance'); - } - let { dateEnv } = calendar.getCurrentData(); - return luxon.DateTime.fromJSDate(date, { - zone: dateEnv.timeZone, - locale: dateEnv.locale.codes[0], - }); - } - function toLuxonDuration(duration, calendar) { - if (!(calendar instanceof internal.CalendarImpl)) { - throw new Error('must supply a CalendarApi instance'); - } - let { dateEnv } = calendar.getCurrentData(); - return luxon.Duration.fromObject(Object.assign(Object.assign({}, duration), { locale: dateEnv.locale.codes[0] })); - } - // Internal Utils - function luxonToArray(datetime) { - return [ - datetime.year, - datetime.month - 1, - datetime.day, - datetime.hour, - datetime.minute, - datetime.second, - datetime.millisecond, - ]; - } - function arrayToLuxon(arr, timeZone, locale) { - return luxon.DateTime.fromObject({ - zone: timeZone, - locale, - year: arr[0], - month: arr[1] + 1, - day: arr[2], - hour: arr[3], - minute: arr[4], - second: arr[5], - millisecond: arr[6], - }); - } - - class LuxonNamedTimeZone extends internal.NamedTimeZoneImpl { - offsetForArray(a) { - return arrayToLuxon(a, this.timeZoneName).offset; - } - timestampToArray(ms) { - return luxonToArray(luxon.DateTime.fromMillis(ms, { - zone: this.timeZoneName, - })); - } - } - - function formatWithCmdStr(cmdStr, arg) { - let cmd = parseCmdStr(cmdStr); - if (arg.end) { - let start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]); - let end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]); - return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.defaultSeparator); - } - return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole); - } - function parseCmdStr(cmdStr) { - let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters - if (parts) { - let middle = parseCmdStr(parts[2]); - return { - head: parts[1], - middle, - tail: parts[3], - whole: parts[1] + middle.whole + parts[3], - }; - } - return { - head: null, - middle: null, - tail: null, - whole: cmdStr, - }; - } - function formatRange(cmd, formatStart, formatEnd, separator) { - if (cmd.middle) { - let startHead = formatStart(cmd.head); - let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator); - let startTail = formatStart(cmd.tail); - let endHead = formatEnd(cmd.head); - let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator); - let endTail = formatEnd(cmd.tail); - if (startHead === endHead && startTail === endTail) { - return startHead + - (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) + - startTail; - } - } - let startWhole = formatStart(cmd.whole); - let endWhole = formatEnd(cmd.whole); - if (startWhole === endWhole) { - return startWhole; - } - return startWhole + separator + endWhole; - } - - var plugin = core.createPlugin({ - name: '@fullcalendar/luxon', - cmdFormatter: formatWithCmdStr, - namedTimeZonedImpl: LuxonNamedTimeZone, - }); - - core.globalPlugins.push(plugin); - - exports["default"] = plugin; - exports.toLuxonDateTime = toLuxonDateTime; - exports.toLuxonDuration = toLuxonDuration; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, luxon, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon1/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon1/index.global.min.js deleted file mode 100644 index fbcde8d8..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon1/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Luxon 1 Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/luxon1 -(c) 2022 Adam Shaw -*/ -FullCalendar.Luxon=function(e,t,n,a){"use strict";function l(e,t,a){return n.DateTime.fromObject({zone:t,locale:a,year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]})}class r extends a.NamedTimeZoneImpl{offsetForArray(e){return l(e,this.timeZoneName).offset}timestampToArray(e){return[(t=n.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,t.month-1,t.day,t.hour,t.minute,t.second,t.millisecond];var t}}var o=t.createPlugin({name:"@fullcalendar/luxon",cmdFormatter:function(e,t){let n=function e(t){let n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){let t=e(n[2]);return{head:n[1],middle:t,tail:n[3],whole:n[1]+t.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=l(t.start.array,t.timeZone,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,a,l){if(t.middle){let r=n(t.head),o=e(t.middle,n,a,l),i=n(t.tail),u=a(t.head),d=e(t.middle,n,a,l),m=a(t.tail);if(r===u&&i===m)return r+(o===d?o:o+l+d)+i}let r=n(t.whole),o=a(t.whole);if(r===o)return r;return r+l+o}(n,e.toFormat.bind(e),a.toFormat.bind(a),t.defaultSeparator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:r});return t.globalPlugins.push(o),e.default=o,e.toLuxonDateTime=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.DateTime.fromJSDate(e,{zone:l.timeZone,locale:l.locale.codes[0]})},e.toLuxonDuration=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.Duration.fromObject(Object.assign(Object.assign({},e),{locale:l.locale.codes[0]}))},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,luxon,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon2/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon2/index.global.js deleted file mode 100644 index 5071624e..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon2/index.global.js +++ /dev/null @@ -1,131 +0,0 @@ -/*! -FullCalendar Luxon 2 Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/luxon2 -(c) 2022 Adam Shaw -*/ -FullCalendar.Luxon2 = (function (exports, core, luxon, internal) { - 'use strict'; - - function toLuxonDateTime(date, calendar) { - if (!(calendar instanceof internal.CalendarImpl)) { - throw new Error('must supply a CalendarApi instance'); - } - let { dateEnv } = calendar.getCurrentData(); - return luxon.DateTime.fromJSDate(date, { - zone: dateEnv.timeZone, - locale: dateEnv.locale.codes[0], - }); - } - function toLuxonDuration(duration, calendar) { - if (!(calendar instanceof internal.CalendarImpl)) { - throw new Error('must supply a CalendarApi instance'); - } - let { dateEnv } = calendar.getCurrentData(); - return luxon.Duration.fromObject(duration, { - locale: dateEnv.locale.codes[0], - }); - } - // Internal Utils - function luxonToArray(datetime) { - return [ - datetime.year, - datetime.month - 1, - datetime.day, - datetime.hour, - datetime.minute, - datetime.second, - datetime.millisecond, - ]; - } - function arrayToLuxon(arr, timeZone, locale) { - return luxon.DateTime.fromObject({ - year: arr[0], - month: arr[1] + 1, - day: arr[2], - hour: arr[3], - minute: arr[4], - second: arr[5], - millisecond: arr[6], - }, { - locale, - zone: timeZone, - }); - } - - class LuxonNamedTimeZone extends internal.NamedTimeZoneImpl { - offsetForArray(a) { - return arrayToLuxon(a, this.timeZoneName).offset; - } - timestampToArray(ms) { - return luxonToArray(luxon.DateTime.fromMillis(ms, { - zone: this.timeZoneName, - })); - } - } - - function formatWithCmdStr(cmdStr, arg) { - let cmd = parseCmdStr(cmdStr); - if (arg.end) { - let start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]); - let end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]); - return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.defaultSeparator); - } - return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole); - } - function parseCmdStr(cmdStr) { - let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters - if (parts) { - let middle = parseCmdStr(parts[2]); - return { - head: parts[1], - middle, - tail: parts[3], - whole: parts[1] + middle.whole + parts[3], - }; - } - return { - head: null, - middle: null, - tail: null, - whole: cmdStr, - }; - } - function formatRange(cmd, formatStart, formatEnd, separator) { - if (cmd.middle) { - let startHead = formatStart(cmd.head); - let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator); - let startTail = formatStart(cmd.tail); - let endHead = formatEnd(cmd.head); - let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator); - let endTail = formatEnd(cmd.tail); - if (startHead === endHead && startTail === endTail) { - return startHead + - (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) + - startTail; - } - } - let startWhole = formatStart(cmd.whole); - let endWhole = formatEnd(cmd.whole); - if (startWhole === endWhole) { - return startWhole; - } - return startWhole + separator + endWhole; - } - - var plugin = core.createPlugin({ - name: '@fullcalendar/luxon2', - cmdFormatter: formatWithCmdStr, - namedTimeZonedImpl: LuxonNamedTimeZone, - }); - - core.globalPlugins.push(plugin); - - exports["default"] = plugin; - exports.toLuxonDateTime = toLuxonDateTime; - exports.toLuxonDuration = toLuxonDuration; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, luxon, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon2/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon2/index.global.min.js deleted file mode 100644 index 4af20a00..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/luxon2/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Luxon 2 Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/luxon2 -(c) 2022 Adam Shaw -*/ -FullCalendar.Luxon2=function(e,t,n,a){"use strict";function l(e,t,a){return n.DateTime.fromObject({year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]},{locale:a,zone:t})}class r extends a.NamedTimeZoneImpl{offsetForArray(e){return l(e,this.timeZoneName).offset}timestampToArray(e){return[(t=n.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,t.month-1,t.day,t.hour,t.minute,t.second,t.millisecond];var t}}var o=t.createPlugin({name:"@fullcalendar/luxon2",cmdFormatter:function(e,t){let n=function e(t){let n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){let t=e(n[2]);return{head:n[1],middle:t,tail:n[3],whole:n[1]+t.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=l(t.start.array,t.timeZone,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,a,l){if(t.middle){let r=n(t.head),o=e(t.middle,n,a,l),i=n(t.tail),u=a(t.head),d=e(t.middle,n,a,l),m=a(t.tail);if(r===u&&i===m)return r+(o===d?o:o+l+d)+i}let r=n(t.whole),o=a(t.whole);if(r===o)return r;return r+l+o}(n,e.toFormat.bind(e),a.toFormat.bind(a),t.defaultSeparator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:r});return t.globalPlugins.push(o),e.default=o,e.toLuxonDateTime=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.DateTime.fromJSDate(e,{zone:l.timeZone,locale:l.locale.codes[0]})},e.toLuxonDuration=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.Duration.fromObject(e,{locale:l.locale.codes[0]})},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,luxon,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment-timezone/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment-timezone/index.global.js deleted file mode 100644 index 1f240c20..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment-timezone/index.global.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! -FullCalendar Moment Timezone Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/moment-timezone-plugin -(c) 2022 Adam Shaw -*/ -FullCalendar.MomentTimezone = (function (exports, core, moment, internal) { - 'use strict'; - - function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; } - - var moment__default = /*#__PURE__*/_interopDefault(moment); - - class MomentNamedTimeZone extends internal.NamedTimeZoneImpl { - offsetForArray(a) { - return moment__default["default"].tz(a, this.timeZoneName).utcOffset(); - } - timestampToArray(ms) { - return moment__default["default"].tz(ms, this.timeZoneName).toArray(); - } - } - - var plugin = core.createPlugin({ - name: '@fullcalendar/moment-timezone', - namedTimeZonedImpl: MomentNamedTimeZone, - }); - - core.globalPlugins.push(plugin); - - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, moment, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment-timezone/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment-timezone/index.global.min.js deleted file mode 100644 index 26cff4bb..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment-timezone/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Moment Timezone Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/moment-timezone-plugin -(c) 2022 Adam Shaw -*/ -FullCalendar.MomentTimezone=function(e,t,n,a){"use strict";function l(e){return e&&e.__esModule?e:{default:e}}var r=l(n);class u extends a.NamedTimeZoneImpl{offsetForArray(e){return r.default.tz(e,this.timeZoneName).utcOffset()}timestampToArray(e){return r.default.tz(e,this.timeZoneName).toArray()}}var m=t.createPlugin({name:"@fullcalendar/moment-timezone",namedTimeZonedImpl:u});return t.globalPlugins.push(m),e.default=m,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,moment,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment/index.global.js deleted file mode 100644 index fd2a68f6..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment/index.global.js +++ /dev/null @@ -1,113 +0,0 @@ -/*! -FullCalendar Moment Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/moment-plugin -(c) 2022 Adam Shaw -*/ -FullCalendar.Moment = (function (exports, core, moment, internal) { - 'use strict'; - - function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; } - - var moment__default = /*#__PURE__*/_interopDefault(moment); - - function toMoment(date, calendar) { - if (!(calendar instanceof internal.CalendarImpl)) { - throw new Error('must supply a CalendarApi instance'); - } - let { dateEnv } = calendar.getCurrentData(); - return convertToMoment(date, dateEnv.timeZone, null, dateEnv.locale.codes[0]); - } - function toMomentDuration(fcDuration) { - return moment__default["default"].duration(fcDuration); // moment accepts all the props that fc.Duration already has! - } - // Internal Utils - function convertToMoment(input, timeZone, timeZoneOffset, locale) { - let mom; - if (timeZone === 'local') { - mom = moment__default["default"](input); - } - else if (timeZone === 'UTC') { - mom = moment__default["default"].utc(input); - } - else if (moment__default["default"].tz) { - mom = moment__default["default"].tz(input, timeZone); - } - else { - mom = moment__default["default"].utc(input); - if (timeZoneOffset != null) { - mom.utcOffset(timeZoneOffset); - } - } - mom.locale(locale); - return mom; - } - - function formatWithCmdStr(cmdStr, arg) { - let cmd = parseCmdStr(cmdStr); - if (arg.end) { - let startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]); - let endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]); - return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.defaultSeparator); - } - return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this - } - function createMomentFormatFunc(mom) { - return (cmdStr) => (cmdStr ? mom.format(cmdStr) : '' // because calling with blank string results in ISO8601 :( - ); - } - function parseCmdStr(cmdStr) { - let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters - if (parts) { - let middle = parseCmdStr(parts[2]); - return { - head: parts[1], - middle, - tail: parts[3], - whole: parts[1] + middle.whole + parts[3], - }; - } - return { - head: null, - middle: null, - tail: null, - whole: cmdStr, - }; - } - function formatRange(cmd, formatStart, formatEnd, separator) { - if (cmd.middle) { - let startHead = formatStart(cmd.head); - let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator); - let startTail = formatStart(cmd.tail); - let endHead = formatEnd(cmd.head); - let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator); - let endTail = formatEnd(cmd.tail); - if (startHead === endHead && startTail === endTail) { - return startHead + - (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) + - startTail; - } - } - let startWhole = formatStart(cmd.whole); - let endWhole = formatEnd(cmd.whole); - if (startWhole === endWhole) { - return startWhole; - } - return startWhole + separator + endWhole; - } - - var plugin = core.createPlugin({ - name: '@fullcalendar/moment', - cmdFormatter: formatWithCmdStr, - }); - - core.globalPlugins.push(plugin); - - exports["default"] = plugin; - exports.toMoment = toMoment; - exports.toMomentDuration = toMomentDuration; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, moment, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment/index.global.min.js deleted file mode 100644 index 291bb43f..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/moment/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Moment Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/moment-plugin -(c) 2022 Adam Shaw -*/ -FullCalendar.Moment=function(e,t,l,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}var r=a(l);function u(e,t,l,n){let a;return"local"===t?a=r.default(e):"UTC"===t?a=r.default.utc(e):r.default.tz?a=r.default.tz(e,t):(a=r.default.utc(e),null!=l&&a.utcOffset(l)),a.locale(n),a}function o(e){return t=>t?e.format(t):""}var d=t.createPlugin({name:"@fullcalendar/moment",cmdFormatter:function(e,t){let l=function e(t){let l=t.match(/^(.*?)\{(.*)\}(.*)$/);if(l){let t=e(l[2]);return{head:l[1],middle:t,tail:l[3],whole:l[1]+t.whole+l[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=u(t.start.array,t.timeZone,t.start.timeZoneOffset,t.localeCodes[0]),n=u(t.end.array,t.timeZone,t.end.timeZoneOffset,t.localeCodes[0]);return function e(t,l,n,a){if(t.middle){let r=l(t.head),u=e(t.middle,l,n,a),o=l(t.tail),d=n(t.head),i=e(t.middle,l,n,a),f=n(t.tail);if(r===d&&o===f)return r+(u===i?u:u+a+i)+o}let r=l(t.whole),u=n(t.whole);if(r===u)return r;return r+a+u}(l,o(e),o(n),t.defaultSeparator)}return u(t.date.array,t.timeZone,t.date.timeZoneOffset,t.localeCodes[0]).format(l.whole)}});return t.globalPlugins.push(d),e.default=d,e.toMoment=function(e,t){if(!(t instanceof n.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return u(e,l.timeZone,null,l.locale.codes[0])},e.toMomentDuration=function(e){return r.default.duration(e)},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,moment,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/rrule/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/rrule/index.global.js deleted file mode 100644 index 4ea09af4..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/rrule/index.global.js +++ /dev/null @@ -1,145 +0,0 @@ -/*! -FullCalendar RRule Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/rrule-plugin -(c) 2022 Adam Shaw -*/ -FullCalendar.RRule = (function (exports, core, rrule, internal) { - 'use strict'; - - const recurringType = { - parse(eventProps, dateEnv) { - if (eventProps.rrule != null) { - let eventRRuleData = parseEventRRule(eventProps, dateEnv); - if (eventRRuleData) { - return { - typeData: { rruleSet: eventRRuleData.rruleSet, isTimeZoneSpecified: eventRRuleData.isTimeZoneSpecified }, - allDayGuess: !eventRRuleData.isTimeSpecified, - duration: eventProps.duration, - }; - } - } - return null; - }, - expand(eventRRuleData, framingRange, dateEnv) { - let dates; - if (eventRRuleData.isTimeZoneSpecified) { - dates = eventRRuleData.rruleSet.between(dateEnv.toDate(framingRange.start), // rrule lib will treat as UTC-zoned - dateEnv.toDate(framingRange.end), // (same) - true).map((date) => dateEnv.createMarker(date)); // convert UTC-zoned-date to locale datemarker - } - else { - // when no timezone in given start/end, the rrule lib will assume UTC, - // which is same as our DateMarkers. no need to manipulate - dates = eventRRuleData.rruleSet.between(framingRange.start, framingRange.end, true); - } - return dates; - }, - }; - function parseEventRRule(eventProps, dateEnv) { - let rruleSet; - let isTimeSpecified = false; - let isTimeZoneSpecified = false; - if (typeof eventProps.rrule === 'string') { - let res = parseRRuleString(eventProps.rrule); - rruleSet = res.rruleSet; - isTimeSpecified = res.isTimeSpecified; - isTimeZoneSpecified = res.isTimeZoneSpecified; - } - if (typeof eventProps.rrule === 'object' && eventProps.rrule) { // non-null object - let res = parseRRuleObject(eventProps.rrule, dateEnv); - rruleSet = new rrule.RRuleSet(); - rruleSet.rrule(res.rrule); - isTimeSpecified = res.isTimeSpecified; - isTimeZoneSpecified = res.isTimeZoneSpecified; - } - // convery to arrays. TODO: general util? - let exdateInputs = [].concat(eventProps.exdate || []); - let exruleInputs = [].concat(eventProps.exrule || []); - for (let exdateInput of exdateInputs) { - let res = internal.parseMarker(exdateInput); - isTimeSpecified = isTimeSpecified || !res.isTimeUnspecified; - isTimeZoneSpecified = isTimeZoneSpecified || res.timeZoneOffset !== null; - rruleSet.exdate(new Date(res.marker.valueOf() - (res.timeZoneOffset || 0) * 60 * 1000)); - } - // TODO: exrule is deprecated. what to do? (https://icalendar.org/iCalendar-RFC-5545/a-3-deprecated-features.html) - for (let exruleInput of exruleInputs) { - let res = parseRRuleObject(exruleInput, dateEnv); - isTimeSpecified = isTimeSpecified || res.isTimeSpecified; - isTimeZoneSpecified = isTimeZoneSpecified || res.isTimeZoneSpecified; - rruleSet.exrule(res.rrule); - } - return { rruleSet, isTimeSpecified, isTimeZoneSpecified }; - } - function parseRRuleObject(rruleInput, dateEnv) { - let isTimeSpecified = false; - let isTimeZoneSpecified = false; - function processDateInput(dateInput) { - if (typeof dateInput === 'string') { - let markerData = internal.parseMarker(dateInput); - if (markerData) { - isTimeSpecified = isTimeSpecified || !markerData.isTimeUnspecified; - isTimeZoneSpecified = isTimeZoneSpecified || markerData.timeZoneOffset !== null; - return new Date(markerData.marker.valueOf() - (markerData.timeZoneOffset || 0) * 60 * 1000); // NOT DRY - } - return null; - } - return dateInput; // TODO: what about number timestamps? - } - let rruleOptions = Object.assign(Object.assign({}, rruleInput), { dtstart: processDateInput(rruleInput.dtstart), until: processDateInput(rruleInput.until), freq: convertConstant(rruleInput.freq), wkst: rruleInput.wkst == null - ? (dateEnv.weekDow - 1 + 7) % 7 // convert Sunday-first to Monday-first - : convertConstant(rruleInput.wkst), byweekday: convertConstants(rruleInput.byweekday) }); - return { rrule: new rrule.RRule(rruleOptions), isTimeSpecified, isTimeZoneSpecified }; - } - function parseRRuleString(str) { - let rruleSet = rrule.rrulestr(str, { forceset: true }); - let analysis = analyzeRRuleString(str); - return Object.assign({ rruleSet }, analysis); - } - function analyzeRRuleString(str) { - let isTimeSpecified = false; - let isTimeZoneSpecified = false; - function processMatch(whole, introPart, datePart) { - let result = internal.parseMarker(datePart); - isTimeSpecified = isTimeSpecified || !result.isTimeUnspecified; - isTimeZoneSpecified = isTimeZoneSpecified || result.timeZoneOffset !== null; - } - str.replace(/\b(DTSTART:)([^\n]*)/, processMatch); - str.replace(/\b(EXDATE:)([^\n]*)/, processMatch); - str.replace(/\b(UNTIL=)([^;\n]*)/, processMatch); - return { isTimeSpecified, isTimeZoneSpecified }; - } - function convertConstants(input) { - if (Array.isArray(input)) { - return input.map(convertConstant); - } - return convertConstant(input); - } - function convertConstant(input) { - if (typeof input === 'string') { - return rrule.RRule[input.toUpperCase()]; - } - return input; - } - - const RRULE_EVENT_REFINERS = { - rrule: internal.identity, - exrule: internal.identity, - exdate: internal.identity, - duration: internal.createDuration, - }; - - var plugin = core.createPlugin({ - name: '@fullcalendar/rrule', - recurringTypes: [recurringType], - eventRefiners: RRULE_EVENT_REFINERS, - }); - - core.globalPlugins.push(plugin); - - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, rrule, FullCalendar.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/rrule/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/rrule/index.global.min.js deleted file mode 100644 index bdbbf103..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/rrule/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar RRule Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/rrule-plugin -(c) 2022 Adam Shaw -*/ -FullCalendar.RRule=function(e,r,t,i){"use strict";const n={parse(e,r){if(null!=e.rrule){let n=function(e,r){let n,u=!1,a=!1;if("string"==typeof e.rrule){let r=function(e){let r=t.rrulestr(e,{forceset:!0}),n=function(e){let r=!1,t=!1;function n(e,n,l){let u=i.parseMarker(l);r=r||!u.isTimeUnspecified,t=t||null!==u.timeZoneOffset}return e.replace(/\b(DTSTART:)([^\n]*)/,n),e.replace(/\b(EXDATE:)([^\n]*)/,n),e.replace(/\b(UNTIL=)([^;\n]*)/,n),{isTimeSpecified:r,isTimeZoneSpecified:t}}(e);return Object.assign({rruleSet:r},n)}(e.rrule);n=r.rruleSet,u=r.isTimeSpecified,a=r.isTimeZoneSpecified}if("object"==typeof e.rrule&&e.rrule){let i=l(e.rrule,r);n=new t.RRuleSet,n.rrule(i.rrule),u=i.isTimeSpecified,a=i.isTimeZoneSpecified}let s=[].concat(e.exdate||[]),f=[].concat(e.exrule||[]);for(let e of s){let r=i.parseMarker(e);u=u||!r.isTimeUnspecified,a=a||null!==r.timeZoneOffset,n.exdate(new Date(r.marker.valueOf()-60*(r.timeZoneOffset||0)*1e3))}for(let e of f){let t=l(e,r);u=u||t.isTimeSpecified,a=a||t.isTimeZoneSpecified,n.exrule(t.rrule)}return{rruleSet:n,isTimeSpecified:u,isTimeZoneSpecified:a}}(e,r);if(n)return{typeData:{rruleSet:n.rruleSet,isTimeZoneSpecified:n.isTimeZoneSpecified},allDayGuess:!n.isTimeSpecified,duration:e.duration}}return null},expand(e,r,t){let i;return i=e.isTimeZoneSpecified?e.rruleSet.between(t.toDate(r.start),t.toDate(r.end),!0).map(e=>t.createMarker(e)):e.rruleSet.between(r.start,r.end,!0),i}};function l(e,r){let n=!1,l=!1;function s(e){if("string"==typeof e){let r=i.parseMarker(e);return r?(n=n||!r.isTimeUnspecified,l=l||null!==r.timeZoneOffset,new Date(r.marker.valueOf()-60*(r.timeZoneOffset||0)*1e3)):null}return e}let f=Object.assign(Object.assign({},e),{dtstart:s(e.dtstart),until:s(e.until),freq:a(e.freq),wkst:null==e.wkst?(r.weekDow-1+7)%7:a(e.wkst),byweekday:u(e.byweekday)});return{rrule:new t.RRule(f),isTimeSpecified:n,isTimeZoneSpecified:l}}function u(e){return Array.isArray(e)?e.map(a):a(e)}function a(e){return"string"==typeof e?t.RRule[e.toUpperCase()]:e}const s={rrule:i.identity,exrule:i.identity,exdate:i.identity,duration:i.createDuration};var f=r.createPlugin({name:"@fullcalendar/rrule",recurringTypes:[n],eventRefiners:s});return r.globalPlugins.push(f),e.default=f,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,rrule,FullCalendar.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/timegrid/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/timegrid/index.global.js deleted file mode 100644 index e4d7e26a..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/timegrid/index.global.js +++ /dev/null @@ -1,1198 +0,0 @@ -/*! -FullCalendar Time Grid Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/timegrid-view -(c) 2022 Adam Shaw -*/ -FullCalendar.TimeGrid = (function (exports, core, internal$1, preact, internal$2) { - 'use strict'; - - class AllDaySplitter extends internal$1.Splitter { - getKeyInfo() { - return { - allDay: {}, - timed: {}, - }; - } - getKeysForDateSpan(dateSpan) { - if (dateSpan.allDay) { - return ['allDay']; - } - return ['timed']; - } - getKeysForEventDef(eventDef) { - if (!eventDef.allDay) { - return ['timed']; - } - if (internal$1.hasBgRendering(eventDef)) { - return ['timed', 'allDay']; - } - return ['allDay']; - } - } - - const DEFAULT_SLAT_LABEL_FORMAT = internal$1.createFormatter({ - hour: 'numeric', - minute: '2-digit', - omitZeroMinute: true, - meridiem: 'short', - }); - function TimeColsAxisCell(props) { - let classNames = [ - 'fc-timegrid-slot', - 'fc-timegrid-slot-label', - props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor', - ]; - return (preact.createElement(internal$1.ViewContextType.Consumer, null, (context) => { - if (!props.isLabeled) { - return (preact.createElement("td", { className: classNames.join(' '), "data-time": props.isoTimeStr })); - } - let { dateEnv, options, viewApi } = context; - let labelFormat = // TODO: fully pre-parse - options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT : - Array.isArray(options.slotLabelFormat) ? internal$1.createFormatter(options.slotLabelFormat[0]) : - internal$1.createFormatter(options.slotLabelFormat); - let renderProps = { - level: 0, - time: props.time, - date: dateEnv.toDate(props.date), - view: viewApi, - text: dateEnv.format(props.date, labelFormat), - }; - return (preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: classNames, elAttrs: { - 'data-time': props.isoTimeStr, - }, renderProps: renderProps, generatorName: "slotLabelContent", generator: options.slotLabelContent || renderInnerContent, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (preact.createElement("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, - preact.createElement(InnerContent, { elTag: "div", elClasses: [ - 'fc-timegrid-slot-label-cushion', - 'fc-scrollgrid-shrink-cushion', - ] }))))); - })); - } - function renderInnerContent(props) { - return props.text; - } - - class TimeBodyAxis extends internal$1.BaseComponent { - render() { - return this.props.slatMetas.map((slatMeta) => (preact.createElement("tr", { key: slatMeta.key }, - preact.createElement(TimeColsAxisCell, Object.assign({}, slatMeta))))); - } - } - - const DEFAULT_WEEK_NUM_FORMAT = internal$1.createFormatter({ week: 'short' }); - const AUTO_ALL_DAY_MAX_EVENT_ROWS = 5; - class TimeColsView extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.allDaySplitter = new AllDaySplitter(); // for use by subclasses - this.headerElRef = preact.createRef(); - this.rootElRef = preact.createRef(); - this.scrollerElRef = preact.createRef(); - this.state = { - slatCoords: null, - }; - this.handleScrollTopRequest = (scrollTop) => { - let scrollerEl = this.scrollerElRef.current; - if (scrollerEl) { // TODO: not sure how this could ever be null. weirdness with the reducer - scrollerEl.scrollTop = scrollTop; - } - }; - /* Header Render Methods - ------------------------------------------------------------------------------------------------------------------*/ - this.renderHeadAxis = (rowKey, frameHeight = '') => { - let { options } = this.context; - let { dateProfile } = this.props; - let range = dateProfile.renderRange; - let dayCnt = internal$1.diffDays(range.start, range.end); - // only do in day views (to avoid doing in week views that dont need it) - let navLinkAttrs = (dayCnt === 1) - ? internal$1.buildNavLinkAttrs(this.context, range.start, 'week') - : {}; - if (options.weekNumbers && rowKey === 'day') { - return (preact.createElement(internal$1.WeekNumberContainer, { elTag: "th", elClasses: [ - 'fc-timegrid-axis', - 'fc-scrollgrid-shrink', - ], elAttrs: { - 'aria-hidden': true, - }, date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, (InnerContent) => (preact.createElement("div", { className: [ - 'fc-timegrid-axis-frame', - 'fc-scrollgrid-shrink-frame', - 'fc-timegrid-axis-frame-liquid', - ].join(' '), style: { height: frameHeight } }, - preact.createElement(InnerContent, { elTag: "a", elClasses: [ - 'fc-timegrid-axis-cushion', - 'fc-scrollgrid-shrink-cushion', - 'fc-scrollgrid-sync-inner', - ], elAttrs: navLinkAttrs }))))); - } - return (preact.createElement("th", { "aria-hidden": true, className: "fc-timegrid-axis" }, - preact.createElement("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } }))); - }; - /* Table Component Render Methods - ------------------------------------------------------------------------------------------------------------------*/ - // only a one-way height sync. we don't send the axis inner-content height to the DayGrid, - // but DayGrid still needs to have classNames on inner elements in order to measure. - this.renderTableRowAxis = (rowHeight) => { - let { options, viewApi } = this.context; - let renderProps = { - text: options.allDayText, - view: viewApi, - }; - return ( - // TODO: make reusable hook. used in list view too - preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: [ - 'fc-timegrid-axis', - 'fc-scrollgrid-shrink', - ], elAttrs: { - 'aria-hidden': true, - }, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, (InnerContent) => (preact.createElement("div", { className: [ - 'fc-timegrid-axis-frame', - 'fc-scrollgrid-shrink-frame', - rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : '', - ].join(' '), style: { height: rowHeight } }, - preact.createElement(InnerContent, { elTag: "span", elClasses: [ - 'fc-timegrid-axis-cushion', - 'fc-scrollgrid-shrink-cushion', - 'fc-scrollgrid-sync-inner', - ] }))))); - }; - this.handleSlatCoords = (slatCoords) => { - this.setState({ slatCoords }); - }; - } - // rendering - // ---------------------------------------------------------------------------------------------------- - renderSimpleLayout(headerRowContent, allDayContent, timeContent) { - let { context, props } = this; - let sections = []; - let stickyHeaderDates = internal$1.getStickyHeaderDates(context.options); - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunk: { - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }, - }); - } - if (allDayContent) { - sections.push({ - type: 'body', - key: 'all-day', - chunk: { content: allDayContent }, - }); - sections.push({ - type: 'body', - key: 'all-day-divider', - outerContent: ( // TODO: rename to cellContent so don't need to define ? - preact.createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, - preact.createElement("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), - }); - } - sections.push({ - type: 'body', - key: 'body', - liquid: true, - expandRows: Boolean(context.options.expandRows), - chunk: { - scrollerElRef: this.scrollerElRef, - content: timeContent, - }, - }); - return (preact.createElement(internal$1.ViewContainer, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec }, - preact.createElement(internal$1.SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: 'shrink' }], sections: sections }))); - } - renderHScrollLayout(headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) { - let ScrollGrid = this.context.pluginHooks.scrollGridImpl; - if (!ScrollGrid) { - throw new Error('No ScrollGrid implementation'); - } - let { context, props } = this; - let stickyHeaderDates = !props.forPrint && internal$1.getStickyHeaderDates(context.options); - let stickyFooterScrollbar = !props.forPrint && internal$1.getStickyFooterScrollbar(context.options); - let sections = []; - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - syncRowHeights: true, - chunks: [ - { - key: 'axis', - rowContent: (arg) => (preact.createElement("tr", { role: "presentation" }, this.renderHeadAxis('day', arg.rowSyncHeights[0]))), - }, - { - key: 'cols', - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }, - ], - }); - } - if (allDayContent) { - sections.push({ - type: 'body', - key: 'all-day', - syncRowHeights: true, - chunks: [ - { - key: 'axis', - rowContent: (contentArg) => (preact.createElement("tr", { role: "presentation" }, this.renderTableRowAxis(contentArg.rowSyncHeights[0]))), - }, - { - key: 'cols', - content: allDayContent, - }, - ], - }); - sections.push({ - key: 'all-day-divider', - type: 'body', - outerContent: ( // TODO: rename to cellContent so don't need to define ? - preact.createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, - preact.createElement("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), - }); - } - let isNowIndicator = context.options.nowIndicator; - sections.push({ - type: 'body', - key: 'body', - liquid: true, - expandRows: Boolean(context.options.expandRows), - chunks: [ - { - key: 'axis', - content: (arg) => ( - // TODO: make this now-indicator arrow more DRY with TimeColsContent - preact.createElement("div", { className: "fc-timegrid-axis-chunk" }, - preact.createElement("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } }, - arg.tableColGroupNode, - preact.createElement("tbody", null, - preact.createElement(TimeBodyAxis, { slatMetas: slatMetas }))), - preact.createElement("div", { className: "fc-timegrid-now-indicator-container" }, - preact.createElement(internal$1.NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, (nowDate) => { - let nowIndicatorTop = isNowIndicator && - slatCoords && - slatCoords.safeComputeTop(nowDate); // might return void - if (typeof nowIndicatorTop === 'number') { - return (preact.createElement(internal$1.NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: nowDate })); - } - return null; - })))), - }, - { - key: 'cols', - scrollerElRef: this.scrollerElRef, - content: timeContent, - }, - ], - }); - if (stickyFooterScrollbar) { - sections.push({ - key: 'footer', - type: 'footer', - isSticky: true, - chunks: [ - { - key: 'axis', - content: internal$1.renderScrollShim, - }, - { - key: 'cols', - content: internal$1.renderScrollShim, - }, - ], - }); - } - return (preact.createElement(internal$1.ViewContainer, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec }, - preact.createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [ - { width: 'shrink', cols: [{ width: 'shrink' }] }, - { cols: [{ span: colCnt, minWidth: dayMinWidth }] }, - ], sections: sections }))); - } - /* Dimensions - ------------------------------------------------------------------------------------------------------------------*/ - getAllDayMaxEventProps() { - let { dayMaxEvents, dayMaxEventRows } = this.context.options; - if (dayMaxEvents === true || dayMaxEventRows === true) { // is auto? - dayMaxEvents = undefined; - dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; // make sure "auto" goes to a real number - } - return { dayMaxEvents, dayMaxEventRows }; - } - } - function renderAllDayInner(renderProps) { - return renderProps.text; - } - - class TimeColsSlatsCoords { - constructor(positions, dateProfile, slotDuration) { - this.positions = positions; - this.dateProfile = dateProfile; - this.slotDuration = slotDuration; - } - safeComputeTop(date) { - let { dateProfile } = this; - if (internal$1.rangeContainsMarker(dateProfile.currentRange, date)) { - let startOfDayDate = internal$1.startOfDay(date); - let timeMs = date.valueOf() - startOfDayDate.valueOf(); - if (timeMs >= internal$1.asRoughMs(dateProfile.slotMinTime) && - timeMs < internal$1.asRoughMs(dateProfile.slotMaxTime)) { - return this.computeTimeTop(internal$1.createDuration(timeMs)); - } - } - return null; - } - // Computes the top coordinate, relative to the bounds of the grid, of the given date. - // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. - computeDateTop(when, startOfDayDate) { - if (!startOfDayDate) { - startOfDayDate = internal$1.startOfDay(when); - } - return this.computeTimeTop(internal$1.createDuration(when.valueOf() - startOfDayDate.valueOf())); - } - // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). - // This is a makeshify way to compute the time-top. Assumes all slatMetas dates are uniform. - // Eventually allow computation with arbirary slat dates. - computeTimeTop(duration) { - let { positions, dateProfile } = this; - let len = positions.els.length; - // floating-point value of # of slots covered - let slatCoverage = (duration.milliseconds - internal$1.asRoughMs(dateProfile.slotMinTime)) / internal$1.asRoughMs(this.slotDuration); - let slatIndex; - let slatRemainder; - // compute a floating-point number for how many slats should be progressed through. - // from 0 to number of slats (inclusive) - // constrained because slotMinTime/slotMaxTime might be customized. - slatCoverage = Math.max(0, slatCoverage); - slatCoverage = Math.min(len, slatCoverage); - // an integer index of the furthest whole slat - // from 0 to number slats (*exclusive*, so len-1) - slatIndex = Math.floor(slatCoverage); - slatIndex = Math.min(slatIndex, len - 1); - // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition. - // could be 1.0 if slatCoverage is covering *all* the slots - slatRemainder = slatCoverage - slatIndex; - return positions.tops[slatIndex] + - positions.getHeight(slatIndex) * slatRemainder; - } - } - - class TimeColsSlatsBody extends internal$1.BaseComponent { - render() { - let { props, context } = this; - let { options } = context; - let { slatElRefs } = props; - return (preact.createElement("tbody", null, props.slatMetas.map((slatMeta, i) => { - let renderProps = { - time: slatMeta.time, - date: context.dateEnv.toDate(slatMeta.date), - view: context.viewApi, - }; - return (preact.createElement("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) }, - props.axis && (preact.createElement(TimeColsAxisCell, Object.assign({}, slatMeta))), - preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: [ - 'fc-timegrid-slot', - 'fc-timegrid-slot-lane', - !slatMeta.isLabeled && 'fc-timegrid-slot-minor', - ], elAttrs: { - 'data-time': slatMeta.isoTimeStr, - }, renderProps: renderProps, generatorName: "slotLaneContent", generator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }))); - }))); - } - } - - /* - for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. - */ - class TimeColsSlats extends internal$1.BaseComponent { - constructor() { - super(...arguments); - this.rootElRef = preact.createRef(); - this.slatElRefs = new internal$1.RefMap(); - } - render() { - let { props, context } = this; - return (preact.createElement("div", { ref: this.rootElRef, className: "fc-timegrid-slots" }, - preact.createElement("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { - minWidth: props.tableMinWidth, - width: props.clientWidth, - height: props.minHeight, - } }, - props.tableColGroupNode /* relies on there only being a single for the axis */, - preact.createElement(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas })))); - } - componentDidMount() { - this.updateSizing(); - } - componentDidUpdate() { - this.updateSizing(); - } - componentWillUnmount() { - if (this.props.onCoords) { - this.props.onCoords(null); - } - } - updateSizing() { - let { context, props } = this; - if (props.onCoords && - props.clientWidth !== null // means sizing has stabilized - ) { - let rootEl = this.rootElRef.current; - if (rootEl.offsetHeight) { // not hidden by css - props.onCoords(new TimeColsSlatsCoords(new internal$1.PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true), this.props.dateProfile, context.options.slotDuration)); - } - } - } - } - function collectSlatEls(elMap, slatMetas) { - return slatMetas.map((slatMeta) => elMap[slatMeta.key]); - } - - function splitSegsByCol(segs, colCnt) { - let segsByCol = []; - let i; - for (i = 0; i < colCnt; i += 1) { - segsByCol.push([]); - } - if (segs) { - for (i = 0; i < segs.length; i += 1) { - segsByCol[segs[i].col].push(segs[i]); - } - } - return segsByCol; - } - function splitInteractionByCol(ui, colCnt) { - let byRow = []; - if (!ui) { - for (let i = 0; i < colCnt; i += 1) { - byRow[i] = null; - } - } - else { - for (let i = 0; i < colCnt; i += 1) { - byRow[i] = { - affectedInstances: ui.affectedInstances, - isEvent: ui.isEvent, - segs: [], - }; - } - for (let seg of ui.segs) { - byRow[seg.col].segs.push(seg); - } - } - return byRow; - } - - class TimeColMoreLink extends internal$1.BaseComponent { - render() { - let { props } = this; - return (preact.createElement(internal$1.MoreLinkContainer, { elClasses: ['fc-timegrid-more-link'], elStyle: { - top: props.top, - bottom: props.bottom, - }, allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: () => renderPlainFgSegs(props.hiddenSegs, props), defaultGenerator: renderMoreLinkInner }, (InnerContent) => (preact.createElement(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-more-link-inner', 'fc-sticky'] })))); - } - } - function renderMoreLinkInner(props) { - return props.shortText; - } - - // segInputs assumed sorted - function buildPositioning(segInputs, strictOrder, maxStackCnt) { - let hierarchy = new internal$1.SegHierarchy(); - if (strictOrder != null) { - hierarchy.strictOrder = strictOrder; - } - if (maxStackCnt != null) { - hierarchy.maxStackCnt = maxStackCnt; - } - let hiddenEntries = hierarchy.addSegs(segInputs); - let hiddenGroups = internal$1.groupIntersectingEntries(hiddenEntries); - let web = buildWeb(hierarchy); - web = stretchWeb(web, 1); // all levelCoords/thickness will have 0.0-1.0 - let segRects = webToRects(web); - return { segRects, hiddenGroups }; - } - function buildWeb(hierarchy) { - const { entriesByLevel } = hierarchy; - const buildNode = cacheable((level, lateral) => level + ':' + lateral, (level, lateral) => { - let siblingRange = findNextLevelSegs(hierarchy, level, lateral); - let nextLevelRes = buildNodes(siblingRange, buildNode); - let entry = entriesByLevel[level][lateral]; - return [ - Object.assign(Object.assign({}, entry), { nextLevelNodes: nextLevelRes[0] }), - entry.thickness + nextLevelRes[1], // the pressure builds - ]; - }); - return buildNodes(entriesByLevel.length - ? { level: 0, lateralStart: 0, lateralEnd: entriesByLevel[0].length } - : null, buildNode)[0]; - } - function buildNodes(siblingRange, buildNode) { - if (!siblingRange) { - return [[], 0]; - } - let { level, lateralStart, lateralEnd } = siblingRange; - let lateral = lateralStart; - let pairs = []; - while (lateral < lateralEnd) { - pairs.push(buildNode(level, lateral)); - lateral += 1; - } - pairs.sort(cmpDescPressures); - return [ - pairs.map(extractNode), - pairs[0][1], // first item's pressure - ]; - } - function cmpDescPressures(a, b) { - return b[1] - a[1]; - } - function extractNode(a) { - return a[0]; - } - function findNextLevelSegs(hierarchy, subjectLevel, subjectLateral) { - let { levelCoords, entriesByLevel } = hierarchy; - let subjectEntry = entriesByLevel[subjectLevel][subjectLateral]; - let afterSubject = levelCoords[subjectLevel] + subjectEntry.thickness; - let levelCnt = levelCoords.length; - let level = subjectLevel; - // skip past levels that are too high up - for (; level < levelCnt && levelCoords[level] < afterSubject; level += 1) - ; // do nothing - for (; level < levelCnt; level += 1) { - let entries = entriesByLevel[level]; - let entry; - let searchIndex = internal$1.binarySearch(entries, subjectEntry.span.start, internal$1.getEntrySpanEnd); - let lateralStart = searchIndex[0] + searchIndex[1]; // if exact match (which doesn't collide), go to next one - let lateralEnd = lateralStart; - while ( // loop through entries that horizontally intersect - (entry = entries[lateralEnd]) && // but not past the whole seg list - entry.span.start < subjectEntry.span.end) { - lateralEnd += 1; - } - if (lateralStart < lateralEnd) { - return { level, lateralStart, lateralEnd }; - } - } - return null; - } - function stretchWeb(topLevelNodes, totalThickness) { - const stretchNode = cacheable((node, startCoord, prevThickness) => internal$1.buildEntryKey(node), (node, startCoord, prevThickness) => { - let { nextLevelNodes, thickness } = node; - let allThickness = thickness + prevThickness; - let thicknessFraction = thickness / allThickness; - let endCoord; - let newChildren = []; - if (!nextLevelNodes.length) { - endCoord = totalThickness; - } - else { - for (let childNode of nextLevelNodes) { - if (endCoord === undefined) { - let res = stretchNode(childNode, startCoord, allThickness); - endCoord = res[0]; - newChildren.push(res[1]); - } - else { - let res = stretchNode(childNode, endCoord, 0); - newChildren.push(res[1]); - } - } - } - let newThickness = (endCoord - startCoord) * thicknessFraction; - return [endCoord - newThickness, Object.assign(Object.assign({}, node), { thickness: newThickness, nextLevelNodes: newChildren })]; - }); - return topLevelNodes.map((node) => stretchNode(node, 0, 0)[1]); - } - // not sorted in any particular order - function webToRects(topLevelNodes) { - let rects = []; - const processNode = cacheable((node, levelCoord, stackDepth) => internal$1.buildEntryKey(node), (node, levelCoord, stackDepth) => { - let rect = Object.assign(Object.assign({}, node), { levelCoord, - stackDepth, stackForward: 0 }); - rects.push(rect); - return (rect.stackForward = processNodes(node.nextLevelNodes, levelCoord + node.thickness, stackDepth + 1) + 1); - }); - function processNodes(nodes, levelCoord, stackDepth) { - let stackForward = 0; - for (let node of nodes) { - stackForward = Math.max(processNode(node, levelCoord, stackDepth), stackForward); - } - return stackForward; - } - processNodes(topLevelNodes, 0, 0); - return rects; // TODO: sort rects by levelCoord to be consistent with toRects? - } - // TODO: move to general util - function cacheable(keyFunc, workFunc) { - const cache = {}; - return (...args) => { - let key = keyFunc(...args); - return (key in cache) - ? cache[key] - : (cache[key] = workFunc(...args)); - }; - } - - function computeSegVCoords(segs, colDate, slatCoords = null, eventMinHeight = 0) { - let vcoords = []; - if (slatCoords) { - for (let i = 0; i < segs.length; i += 1) { - let seg = segs[i]; - let spanStart = slatCoords.computeDateTop(seg.start, colDate); - let spanEnd = Math.max(spanStart + (eventMinHeight || 0), // :( - slatCoords.computeDateTop(seg.end, colDate)); - vcoords.push({ - start: Math.round(spanStart), - end: Math.round(spanEnd), // - }); - } - } - return vcoords; - } - function computeFgSegPlacements(segs, segVCoords, // might not have for every seg - eventOrderStrict, eventMaxStack) { - let segInputs = []; - let dumbSegs = []; // segs without coords - for (let i = 0; i < segs.length; i += 1) { - let vcoords = segVCoords[i]; - if (vcoords) { - segInputs.push({ - index: i, - thickness: 1, - span: vcoords, - }); - } - else { - dumbSegs.push(segs[i]); - } - } - let { segRects, hiddenGroups } = buildPositioning(segInputs, eventOrderStrict, eventMaxStack); - let segPlacements = []; - for (let segRect of segRects) { - segPlacements.push({ - seg: segs[segRect.index], - rect: segRect, - }); - } - for (let dumbSeg of dumbSegs) { - segPlacements.push({ seg: dumbSeg, rect: null }); - } - return { segPlacements, hiddenGroups }; - } - - const DEFAULT_TIME_FORMAT = internal$1.createFormatter({ - hour: 'numeric', - minute: '2-digit', - meridiem: false, - }); - class TimeColEvent extends internal$1.BaseComponent { - render() { - return (preact.createElement(internal$1.StandardEvent, Object.assign({}, this.props, { elClasses: [ - 'fc-timegrid-event', - 'fc-v-event', - this.props.isShort && 'fc-timegrid-event-short', - ], defaultTimeFormat: DEFAULT_TIME_FORMAT }))); - } - } - - class TimeCol extends internal$1.BaseComponent { - constructor() { - super(...arguments); - this.sortEventSegs = internal$1.memoize(internal$1.sortEventSegs); - } - // TODO: memoize event-placement? - render() { - let { props, context } = this; - let { options } = context; - let isSelectMirror = options.selectMirror; - let mirrorSegs = // yuck - (props.eventDrag && props.eventDrag.segs) || - (props.eventResize && props.eventResize.segs) || - (isSelectMirror && props.dateSelectionSegs) || - []; - let interactionAffectedInstances = // TODO: messy way to compute this - (props.eventDrag && props.eventDrag.affectedInstances) || - (props.eventResize && props.eventResize.affectedInstances) || - {}; - let sortedFgSegs = this.sortEventSegs(props.fgEventSegs, options.eventOrder); - return (preact.createElement(internal$1.DayCellContainer, { elTag: "td", elRef: props.elRef, elClasses: [ - 'fc-timegrid-col', - ...(props.extraClassNames || []), - ], elAttrs: Object.assign({ role: 'gridcell' }, props.extraDataAttrs), date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraRenderProps: props.extraRenderProps }, (InnerContent) => (preact.createElement("div", { className: "fc-timegrid-col-frame" }, - preact.createElement("div", { className: "fc-timegrid-col-bg" }, - this.renderFillSegs(props.businessHourSegs, 'non-business'), - this.renderFillSegs(props.bgEventSegs, 'bg-event'), - this.renderFillSegs(props.dateSelectionSegs, 'highlight')), - preact.createElement("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)), - preact.createElement("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror))), - preact.createElement("div", { className: "fc-timegrid-now-indicator-container" }, this.renderNowIndicator(props.nowIndicatorSegs)), - internal$1.hasCustomDayCellContent(options) && (preact.createElement(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-col-misc'] })))))); - } - renderFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting) { - let { props } = this; - if (props.forPrint) { - return renderPlainFgSegs(sortedFgSegs, props); - } - return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting); - } - renderPositionedFgSegs(segs, // if not mirror, needs to be sorted - segIsInvisible, isDragging, isResizing, isDateSelecting) { - let { eventMaxStack, eventShortHeight, eventOrderStrict, eventMinHeight } = this.context.options; - let { date, slatCoords, eventSelection, todayRange, nowDate } = this.props; - let isMirror = isDragging || isResizing || isDateSelecting; - let segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight); - let { segPlacements, hiddenGroups } = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack); - return (preact.createElement(preact.Fragment, null, - this.renderHiddenGroups(hiddenGroups, segs), - segPlacements.map((segPlacement) => { - let { seg, rect } = segPlacement; - let instanceId = seg.eventRange.instance.instanceId; - let isVisible = isMirror || Boolean(!segIsInvisible[instanceId] && rect); - let vStyle = computeSegVStyle(rect && rect.span); - let hStyle = (!isMirror && rect) ? this.computeSegHStyle(rect) : { left: 0, right: 0 }; - let isInset = Boolean(rect) && rect.stackForward > 0; - let isShort = Boolean(rect) && (rect.span.end - rect.span.start) < eventShortHeight; // look at other places for this problem - return (preact.createElement("div", { className: 'fc-timegrid-event-harness' + - (isInset ? ' fc-timegrid-event-harness-inset' : ''), key: instanceId, style: Object.assign(Object.assign({ visibility: isVisible ? '' : 'hidden' }, vStyle), hStyle) }, - preact.createElement(TimeColEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, isShort: isShort }, internal$1.getSegMeta(seg, todayRange, nowDate))))); - }))); - } - // will already have eventMinHeight applied because segInputs already had it - renderHiddenGroups(hiddenGroups, segs) { - let { extraDateSpan, dateProfile, todayRange, nowDate, eventSelection, eventDrag, eventResize } = this.props; - return (preact.createElement(preact.Fragment, null, hiddenGroups.map((hiddenGroup) => { - let positionCss = computeSegVStyle(hiddenGroup.span); - let hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs); - return (preact.createElement(TimeColMoreLink, { key: internal$1.buildIsoString(internal$1.computeEarliestSegStart(hiddenSegs)), hiddenSegs: hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan: extraDateSpan, dateProfile: dateProfile, todayRange: todayRange, nowDate: nowDate, eventSelection: eventSelection, eventDrag: eventDrag, eventResize: eventResize })); - }))); - } - renderFillSegs(segs, fillType) { - let { props, context } = this; - let segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight); // don't assume all populated - let children = segVCoords.map((vcoords, i) => { - let seg = segs[i]; - return (preact.createElement("div", { key: internal$1.buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === 'bg-event' ? - preact.createElement(internal$1.BgEvent, Object.assign({ seg: seg }, internal$1.getSegMeta(seg, props.todayRange, props.nowDate))) : - internal$1.renderFill(fillType))); - }); - return preact.createElement(preact.Fragment, null, children); - } - renderNowIndicator(segs) { - let { slatCoords, date } = this.props; - if (!slatCoords) { - return null; - } - return segs.map((seg, i) => (preact.createElement(internal$1.NowIndicatorContainer - // key doesn't matter. will only ever be one - , { - // key doesn't matter. will only ever be one - key: i, elClasses: ['fc-timegrid-now-indicator-line'], elStyle: { - top: slatCoords.computeDateTop(seg.start, date), - }, isAxis: false, date: date }))); - } - computeSegHStyle(segHCoords) { - let { isRtl, options } = this.context; - let shouldOverlap = options.slotEventOverlap; - let nearCoord = segHCoords.levelCoord; // the left side if LTR. the right side if RTL. floating-point - let farCoord = segHCoords.levelCoord + segHCoords.thickness; // the right side if LTR. the left side if RTL. floating-point - let left; // amount of space from left edge, a fraction of the total width - let right; // amount of space from right edge, a fraction of the total width - if (shouldOverlap) { - // double the width, but don't go beyond the maximum forward coordinate (1.0) - farCoord = Math.min(1, nearCoord + (farCoord - nearCoord) * 2); - } - if (isRtl) { - left = 1 - farCoord; - right = nearCoord; - } - else { - left = nearCoord; - right = 1 - farCoord; - } - let props = { - zIndex: segHCoords.stackDepth + 1, - left: left * 100 + '%', - right: right * 100 + '%', - }; - if (shouldOverlap && !segHCoords.stackForward) { - // add padding to the edge so that forward stacked events don't cover the resizer's icon - props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width - } - return props; - } - } - function renderPlainFgSegs(sortedFgSegs, { todayRange, nowDate, eventSelection, eventDrag, eventResize }) { - let hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) || - (eventResize ? eventResize.affectedInstances : null) || - {}; - return (preact.createElement(preact.Fragment, null, sortedFgSegs.map((seg) => { - let instanceId = seg.eventRange.instance.instanceId; - return (preact.createElement("div", { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? 'hidden' : '' } }, - preact.createElement(TimeColEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, internal$1.getSegMeta(seg, todayRange, nowDate))))); - }))); - } - function computeSegVStyle(segVCoords) { - if (!segVCoords) { - return { top: '', bottom: '' }; - } - return { - top: segVCoords.start, - bottom: -segVCoords.end, - }; - } - function compileSegsFromEntries(segEntries, allSegs) { - return segEntries.map((segEntry) => allSegs[segEntry.index]); - } - - class TimeColsContent extends internal$1.BaseComponent { - constructor() { - super(...arguments); - this.splitFgEventSegs = internal$1.memoize(splitSegsByCol); - this.splitBgEventSegs = internal$1.memoize(splitSegsByCol); - this.splitBusinessHourSegs = internal$1.memoize(splitSegsByCol); - this.splitNowIndicatorSegs = internal$1.memoize(splitSegsByCol); - this.splitDateSelectionSegs = internal$1.memoize(splitSegsByCol); - this.splitEventDrag = internal$1.memoize(splitInteractionByCol); - this.splitEventResize = internal$1.memoize(splitInteractionByCol); - this.rootElRef = preact.createRef(); - this.cellElRefs = new internal$1.RefMap(); - } - render() { - let { props, context } = this; - let nowIndicatorTop = context.options.nowIndicator && - props.slatCoords && - props.slatCoords.safeComputeTop(props.nowDate); // might return void - let colCnt = props.cells.length; - let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt); - let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt); - let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt); - let nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt); - let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt); - let eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt); - let eventResizeByRow = this.splitEventResize(props.eventResize, colCnt); - return (preact.createElement("div", { className: "fc-timegrid-cols", ref: this.rootElRef }, - preact.createElement("table", { role: "presentation", style: { - minWidth: props.tableMinWidth, - width: props.clientWidth, - } }, - props.tableColGroupNode, - preact.createElement("tbody", { role: "presentation" }, - preact.createElement("tr", { role: "row" }, - props.axis && (preact.createElement("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, - preact.createElement("div", { className: "fc-timegrid-col-frame" }, - preact.createElement("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && (preact.createElement(internal$1.NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: props.nowDate })))))), - props.cells.map((cell, i) => (preact.createElement(TimeCol, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraRenderProps: cell.extraRenderProps, 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 })))))))); - } - componentDidMount() { - this.updateCoords(); - } - componentDidUpdate() { - this.updateCoords(); - } - updateCoords() { - let { props } = this; - if (props.onColCoords && - props.clientWidth !== null // means sizing has stabilized - ) { - props.onColCoords(new internal$1.PositionCache(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.cells), true, // horizontal - false)); - } - } - } - function collectCellEls(elMap, cells) { - return cells.map((cell) => elMap[cell.key]); - } - - /* A component that renders one or more columns of vertical time slots - ----------------------------------------------------------------------------------------------------------------------*/ - class TimeCols extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.processSlotOptions = internal$1.memoize(processSlotOptions); - this.state = { - slatCoords: null, - }; - this.handleRootEl = (el) => { - if (el) { - this.context.registerInteractiveComponent(this, { - el, - isHitComboAllowed: this.props.isHitComboAllowed, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; - this.handleScrollRequest = (request) => { - let { onScrollTopRequest } = this.props; - let { slatCoords } = this.state; - if (onScrollTopRequest && slatCoords) { - if (request.time) { - let top = slatCoords.computeTimeTop(request.time); - top = Math.ceil(top); // zoom can give weird floating-point values. rather scroll a little bit further - if (top) { - top += 1; // to overcome top border that slots beyond the first have. looks better - } - onScrollTopRequest(top); - } - return true; - } - return false; - }; - this.handleColCoords = (colCoords) => { - this.colCoords = colCoords; - }; - this.handleSlatCoords = (slatCoords) => { - this.setState({ slatCoords }); - if (this.props.onSlatCoords) { - this.props.onSlatCoords(slatCoords); - } - }; - } - render() { - let { props, state } = this; - return (preact.createElement("div", { className: "fc-timegrid-body", ref: this.handleRootEl, style: { - // these props are important to give this wrapper correct dimensions for interactions - // TODO: if we set it here, can we avoid giving to inner tables? - width: props.clientWidth, - minWidth: props.tableMinWidth, - } }, - preact.createElement(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */, onCoords: this.handleSlatCoords }), - preact.createElement(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint }))); - } - componentDidMount() { - this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); - } - componentDidUpdate(prevProps) { - this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); - } - componentWillUnmount() { - this.scrollResponder.detach(); - } - queryHit(positionLeft, positionTop) { - let { dateEnv, options } = this.context; - let { colCoords } = this; - let { dateProfile } = this.props; - let { slatCoords } = this.state; - let { snapDuration, snapsPerSlot } = this.processSlotOptions(this.props.slotDuration, options.snapDuration); - let colIndex = colCoords.leftToIndex(positionLeft); - let slatIndex = slatCoords.positions.topToIndex(positionTop); - if (colIndex != null && slatIndex != null) { - let cell = this.props.cells[colIndex]; - let slatTop = slatCoords.positions.tops[slatIndex]; - let slatHeight = slatCoords.positions.getHeight(slatIndex); - let partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1 - let localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat - let snapIndex = slatIndex * snapsPerSlot + localSnapIndex; - let dayDate = this.props.cells[colIndex].date; - let time = internal$1.addDurations(dateProfile.slotMinTime, internal$1.multiplyDuration(snapDuration, snapIndex)); - let start = dateEnv.add(dayDate, time); - let end = dateEnv.add(start, snapDuration); - return { - dateProfile, - dateSpan: Object.assign({ range: { start, end }, allDay: false }, cell.extraDateSpan), - dayEl: colCoords.els[colIndex], - rect: { - left: colCoords.lefts[colIndex], - right: colCoords.rights[colIndex], - top: slatTop, - bottom: slatTop + slatHeight, - }, - layer: 0, - }; - } - return null; - } - } - function processSlotOptions(slotDuration, snapDurationOverride) { - let snapDuration = snapDurationOverride || slotDuration; - let snapsPerSlot = internal$1.wholeDivideDurations(slotDuration, snapDuration); - if (snapsPerSlot === null) { - snapDuration = slotDuration; - snapsPerSlot = 1; - // TODO: say warning? - } - return { snapDuration, snapsPerSlot }; - } - - class DayTimeColsSlicer extends internal$1.Slicer { - sliceRange(range, dayRanges) { - let segs = []; - for (let col = 0; col < dayRanges.length; col += 1) { - let segRange = internal$1.intersectRanges(range, dayRanges[col]); - if (segRange) { - segs.push({ - start: segRange.start, - end: segRange.end, - isStart: segRange.start.valueOf() === range.start.valueOf(), - isEnd: segRange.end.valueOf() === range.end.valueOf(), - col, - }); - } - } - return segs; - } - } - - class DayTimeCols extends internal$1.DateComponent { - constructor() { - super(...arguments); - this.buildDayRanges = internal$1.memoize(buildDayRanges); - this.slicer = new DayTimeColsSlicer(); - this.timeColsRef = preact.createRef(); - } - render() { - let { props, context } = this; - let { dateProfile, dayTableModel } = props; - let isNowIndicator = context.options.nowIndicator; - let dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv); - // give it the first row of cells - // TODO: would move this further down hierarchy, but sliceNowDate needs it - return (preact.createElement(internal$1.NowTimer, { unit: isNowIndicator ? 'minute' : 'day' }, (nowDate, todayRange) => (preact.createElement(TimeCols, Object.assign({ ref: this.timeColsRef }, this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: isNowIndicator && this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords }))))); - } - } - function buildDayRanges(dayTableModel, dateProfile, dateEnv) { - let ranges = []; - for (let date of dayTableModel.headerDates) { - ranges.push({ - start: dateEnv.add(date, dateProfile.slotMinTime), - end: dateEnv.add(date, dateProfile.slotMaxTime), - }); - } - return ranges; - } - - // potential nice values for the slot-duration and interval-duration - // from largest to smallest - const STOCK_SUB_DURATIONS = [ - { hours: 1 }, - { minutes: 30 }, - { minutes: 15 }, - { seconds: 30 }, - { seconds: 15 }, - ]; - function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) { - let dayStart = new Date(0); - let slatTime = slotMinTime; - let slatIterator = internal$1.createDuration(0); - let labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration); - let metas = []; - while (internal$1.asRoughMs(slatTime) < internal$1.asRoughMs(slotMaxTime)) { - let date = dateEnv.add(dayStart, slatTime); - let isLabeled = internal$1.wholeDivideDurations(slatIterator, labelInterval) !== null; - metas.push({ - date, - time: slatTime, - key: date.toISOString(), - isoTimeStr: internal$1.formatIsoTimeString(date), - isLabeled, - }); - slatTime = internal$1.addDurations(slatTime, slotDuration); - slatIterator = internal$1.addDurations(slatIterator, slotDuration); - } - return metas; - } - // Computes an automatic value for slotLabelInterval - function computeLabelInterval(slotDuration) { - let i; - let labelInterval; - let slotsPerLabel; - // find the smallest stock label interval that results in more than one slots-per-label - for (i = STOCK_SUB_DURATIONS.length - 1; i >= 0; i -= 1) { - labelInterval = internal$1.createDuration(STOCK_SUB_DURATIONS[i]); - slotsPerLabel = internal$1.wholeDivideDurations(labelInterval, slotDuration); - if (slotsPerLabel !== null && slotsPerLabel > 1) { - return labelInterval; - } - } - return slotDuration; // fall back - } - - class DayTimeColsView extends TimeColsView { - constructor() { - super(...arguments); - this.buildTimeColsModel = internal$1.memoize(buildTimeColsModel); - this.buildSlatMetas = internal$1.memoize(buildSlatMetas); - } - render() { - let { options, dateEnv, dateProfileGenerator } = this.context; - let { props } = this; - let { dateProfile } = props; - let dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator); - let splitProps = this.allDaySplitter.splitProps(props); - let slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv); - let { dayMinWidth } = options; - let hasAttachedAxis = !dayMinWidth; - let hasDetachedAxis = dayMinWidth; - let headerContent = options.dayHeaders && (preact.createElement(internal$1.DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null })); - let allDayContent = (options.allDaySlot !== false) && ((contentArg) => (preact.createElement(internal$2.DayTable, Object.assign({}, splitProps.allDay, { dateProfile: dateProfile, dayTableModel: dayTableModel, 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())))); - let timeGridContent = (contentArg) => (preact.createElement(DayTimeCols, Object.assign({}, splitProps.timed, { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: this.handleScrollTopRequest }))); - return hasDetachedAxis - ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) - : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); - } - } - function buildTimeColsModel(dateProfile, dateProfileGenerator) { - let daySeries = new internal$1.DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); - return new internal$1.DayTableModel(daySeries, false); - } - - const OPTION_REFINERS = { - allDaySlot: Boolean, - }; - - var css_248z = ".fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:\"\\00a0\"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:\"\\00a0-\\00a0\"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}"; - internal$1.injectStyles(css_248z); - - var plugin = core.createPlugin({ - name: '@fullcalendar/timegrid', - initialView: 'timeGridWeek', - optionRefiners: OPTION_REFINERS, - views: { - timeGrid: { - component: DayTimeColsView, - usesMinMaxTime: true, - allDaySlot: true, - slotDuration: '00:30:00', - slotEventOverlap: true, // a bad name. confused with overlap/constraint system - }, - timeGridDay: { - type: 'timeGrid', - duration: { days: 1 }, - }, - timeGridWeek: { - type: 'timeGrid', - duration: { weeks: 1 }, - }, - }, - }); - - var internal = { - __proto__: null, - TimeColsView: TimeColsView, - DayTimeColsView: DayTimeColsView, - buildTimeColsModel: buildTimeColsModel, - DayTimeCols: DayTimeCols, - buildDayRanges: buildDayRanges, - DayTimeColsSlicer: DayTimeColsSlicer, - TimeCols: TimeCols, - buildSlatMetas: buildSlatMetas, - TimeColsSlatsCoords: TimeColsSlatsCoords - }; - - core.globalPlugins.push(plugin); - - exports.Internal = internal; - exports["default"] = plugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, FullCalendar, FullCalendar.Internal, FullCalendar.Preact, FullCalendar.DayGrid.Internal); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/timegrid/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/timegrid/index.global.min.js deleted file mode 100644 index b0275cef..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/timegrid/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Time Grid Plugin v6.0.1 -Docs & License: https://fullcalendar.io/docs/timegrid-view -(c) 2022 Adam Shaw -*/ -FullCalendar.TimeGrid=function(e,t,i,r,n){"use strict";class o extends i.Splitter{getKeyInfo(){return{allDay:{},timed:{}}}getKeysForDateSpan(e){return e.allDay?["allDay"]:["timed"]}getKeysForEventDef(e){return e.allDay?i.hasBgRendering(e)?["timed","allDay"]:["allDay"]:["timed"]}}const s=i.createFormatter({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function l(e){let t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return r.createElement(i.ViewContextType.Consumer,null,n=>{if(!e.isLabeled)return r.createElement("td",{className:t.join(" "),"data-time":e.isoTimeStr});let{dateEnv:o,options:l,viewApi:c}=n,d=null==l.slotLabelFormat?s:Array.isArray(l.slotLabelFormat)?i.createFormatter(l.slotLabelFormat[0]):i.createFormatter(l.slotLabelFormat),m={level:0,time:e.time,date:o.toDate(e.date),view:c,text:o.format(e.date,d)};return r.createElement(i.ContentContainer,{elTag:"td",elClasses:t,elAttrs:{"data-time":e.isoTimeStr},renderProps:m,generatorName:"slotLabelContent",generator:l.slotLabelContent||a,classNameGenerator:l.slotLabelClassNames,didMount:l.slotLabelDidMount,willUnmount:l.slotLabelWillUnmount},e=>r.createElement("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},r.createElement(e,{elTag:"div",elClasses:["fc-timegrid-slot-label-cushion","fc-scrollgrid-shrink-cushion"]})))})}function a(e){return e.text}class c extends i.BaseComponent{render(){return this.props.slatMetas.map(e=>r.createElement("tr",{key:e.key},r.createElement(l,Object.assign({},e))))}}const d=i.createFormatter({week:"short"});class m extends i.DateComponent{constructor(){super(...arguments),this.allDaySplitter=new o,this.headerElRef=r.createRef(),this.rootElRef=r.createRef(),this.scrollerElRef=r.createRef(),this.state={slatCoords:null},this.handleScrollTopRequest=e=>{let t=this.scrollerElRef.current;t&&(t.scrollTop=e)},this.renderHeadAxis=(e,t="")=>{let{options:n}=this.context,{dateProfile:o}=this.props,s=o.renderRange,l=1===i.diffDays(s.start,s.end)?i.buildNavLinkAttrs(this.context,s.start,"week"):{};return n.weekNumbers&&"day"===e?r.createElement(i.WeekNumberContainer,{elTag:"th",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},date:s.start,defaultFormat:d},e=>r.createElement("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame","fc-timegrid-axis-frame-liquid"].join(" "),style:{height:t}},r.createElement(e,{elTag:"a",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"],elAttrs:l}))):r.createElement("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},r.createElement("div",{className:"fc-timegrid-axis-frame",style:{height:t}}))},this.renderTableRowAxis=e=>{let{options:t,viewApi:n}=this.context,o={text:t.allDayText,view:n};return r.createElement(i.ContentContainer,{elTag:"td",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},renderProps:o,generatorName:"allDayContent",generator:t.allDayContent||f,classNameGenerator:t.allDayClassNames,didMount:t.allDayDidMount,willUnmount:t.allDayWillUnmount},t=>r.createElement("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame",null==e?" fc-timegrid-axis-frame-liquid":""].join(" "),style:{height:e}},r.createElement(t,{elTag:"span",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"]})))},this.handleSlatCoords=e=>{this.setState({slatCoords:e})}}renderSimpleLayout(e,t,n){let{context:o,props:s}=this,l=[],a=i.getStickyHeaderDates(o.options);return e&&l.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(l.push({type:"body",key:"all-day",chunk:{content:t}}),l.push({type:"body",key:"all-day-divider",outerContent:r.createElement("tr",{role:"presentation",className:"fc-scrollgrid-section"},r.createElement("td",{className:"fc-timegrid-divider "+o.theme.getClass("tableCellShaded")}))})),l.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(o.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),r.createElement(i.ViewContainer,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:o.viewSpec},r.createElement(i.SimpleScrollGrid,{liquid:!s.isHeightAuto&&!s.forPrint,collapsibleWidth:s.forPrint,cols:[{width:"shrink"}],sections:l}))}renderHScrollLayout(e,t,n,o,s,l,a){let d=this.context.pluginHooks.scrollGridImpl;if(!d)throw new Error("No ScrollGrid implementation");let{context:m,props:f}=this,h=!f.forPrint&&i.getStickyHeaderDates(m.options),g=!f.forPrint&&i.getStickyFooterScrollbar(m.options),p=[];e&&p.push({type:"header",key:"header",isSticky:h,syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>r.createElement("tr",{role:"presentation"},this.renderHeadAxis("day",e.rowSyncHeights[0]))},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(p.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>r.createElement("tr",{role:"presentation"},this.renderTableRowAxis(e.rowSyncHeights[0]))},{key:"cols",content:t}]}),p.push({key:"all-day-divider",type:"body",outerContent:r.createElement("tr",{role:"presentation",className:"fc-scrollgrid-section"},r.createElement("td",{colSpan:2,className:"fc-timegrid-divider "+m.theme.getClass("tableCellShaded")}))}));let u=m.options.nowIndicator;return p.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(m.options.expandRows),chunks:[{key:"axis",content:e=>r.createElement("div",{className:"fc-timegrid-axis-chunk"},r.createElement("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,r.createElement("tbody",null,r.createElement(c,{slatMetas:l}))),r.createElement("div",{className:"fc-timegrid-now-indicator-container"},r.createElement(i.NowTimer,{unit:u?"minute":"day"},e=>{let t=u&&a&&a.safeComputeTop(e);return"number"==typeof t?r.createElement(i.NowIndicatorContainer,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:t},isAxis:!0,date:e}):null})))},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),g&&p.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:i.renderScrollShim},{key:"cols",content:i.renderScrollShim}]}),r.createElement(i.ViewContainer,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:m.viewSpec},r.createElement(d,{liquid:!f.isHeightAuto&&!f.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:o,minWidth:s}]}],sections:p}))}getAllDayMaxEventProps(){let{dayMaxEvents:e,dayMaxEventRows:t}=this.context.options;return!0!==e&&!0!==t||(e=void 0,t=5),{dayMaxEvents:e,dayMaxEventRows:t}}}function f(e){return e.text}class h{constructor(e,t,i){this.positions=e,this.dateProfile=t,this.slotDuration=i}safeComputeTop(e){let{dateProfile:t}=this;if(i.rangeContainsMarker(t.currentRange,e)){let r=i.startOfDay(e),n=e.valueOf()-r.valueOf();if(n>=i.asRoughMs(t.slotMinTime)&&n{let c={time:s.time,date:t.dateEnv.toDate(s.date),view:t.viewApi};return r.createElement("tr",{key:s.key,ref:o.createRef(s.key)},e.axis&&r.createElement(l,Object.assign({},s)),r.createElement(i.ContentContainer,{elTag:"td",elClasses:["fc-timegrid-slot","fc-timegrid-slot-lane",!s.isLabeled&&"fc-timegrid-slot-minor"],elAttrs:{"data-time":s.isoTimeStr},renderProps:c,generatorName:"slotLaneContent",generator:n.slotLaneContent,classNameGenerator:n.slotLaneClassNames,didMount:n.slotLaneDidMount,willUnmount:n.slotLaneWillUnmount}))}))}}class p extends i.BaseComponent{constructor(){super(...arguments),this.rootElRef=r.createRef(),this.slatElRefs=new i.RefMap}render(){let{props:e,context:t}=this;return r.createElement("div",{ref:this.rootElRef,className:"fc-timegrid-slots"},r.createElement("table",{"aria-hidden":!0,className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},e.tableColGroupNode,r.createElement(g,{slatElRefs:this.slatElRefs,axis:e.axis,slatMetas:e.slatMetas})))}componentDidMount(){this.updateSizing()}componentDidUpdate(){this.updateSizing()}componentWillUnmount(){this.props.onCoords&&this.props.onCoords(null)}updateSizing(){let{context:e,props:t}=this;if(t.onCoords&&null!==t.clientWidth){this.rootElRef.current.offsetHeight&&t.onCoords(new h(new i.PositionCache(this.rootElRef.current,(r=this.slatElRefs.currentMap,t.slatMetas.map(e=>r[e.key])),!1,!0),this.props.dateProfile,e.options.slotDuration))}var r}}function u(e,t){let i,r=[];for(i=0;iT(e.hiddenSegs,e),defaultGenerator:y},e=>r.createElement(e,{elTag:"div",elClasses:["fc-timegrid-more-link-inner","fc-sticky"]}))}}function y(e){return e.shortText}function x(e,t,r){let n=new i.SegHierarchy;null!=t&&(n.strictOrder=t),null!=r&&(n.maxStackCnt=r);let o=n.addSegs(e),s=i.groupIntersectingEntries(o),l=function(e){const{entriesByLevel:t}=e,r=w((e,t)=>e+":"+t,(n,o)=>{let s=S(function(e,t,r){let{levelCoords:n,entriesByLevel:o}=e,s=o[t][r],l=n[t]+s.thickness,a=n.length,c=t;for(;ci.buildEntryKey(e),(e,i,n)=>{let o,{nextLevelNodes:s,thickness:l}=e,a=l+n,c=l/a,d=[];if(s.length)for(let e of s)if(void 0===o){let t=r(e,i,a);o=t[0],d.push(t[1])}else{let t=r(e,o,0);d.push(t[1])}else o=t;let m=(o-i)*c;return[o-m,Object.assign(Object.assign({},e),{thickness:m,nextLevelNodes:d})]});return e.map(e=>r(e,0,0)[1])}(l,1),{segRects:function(e){let t=[];const r=w((e,t,r)=>i.buildEntryKey(e),(e,i,r)=>{let o=Object.assign(Object.assign({},e),{levelCoord:i,stackDepth:r,stackForward:0});return t.push(o),o.stackForward=n(e.nextLevelNodes,i+e.thickness,r+1)+1});function n(e,t,i){let n=0;for(let o of e)n=Math.max(r(o,t,i),n);return n}return n(e,0,0),t}(l),hiddenGroups:s}}function S(e,t){if(!e)return[[],0];let{level:i,lateralStart:r,lateralEnd:n}=e,o=r,s=[];for(;o{let n=e(...r);return n in i?i[n]:i[n]=t(...r)}}function D(e,t,i=null,r=0){let n=[];if(i)for(let o=0;or.createElement("div",{className:"fc-timegrid-col-frame"},r.createElement("div",{className:"fc-timegrid-col-bg"},this.renderFillSegs(e.businessHourSegs,"non-business"),this.renderFillSegs(e.bgEventSegs,"bg-event"),this.renderFillSegs(e.dateSelectionSegs,"highlight")),r.createElement("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(a,l,!1,!1,!1)),r.createElement("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(s,{},Boolean(e.eventDrag),Boolean(e.eventResize),Boolean(o))),r.createElement("div",{className:"fc-timegrid-now-indicator-container"},this.renderNowIndicator(e.nowIndicatorSegs)),i.hasCustomDayCellContent(n)&&r.createElement(t,{elTag:"div",elClasses:["fc-timegrid-col-misc"]})))}renderFgSegs(e,t,i,r,n){let{props:o}=this;return o.forPrint?T(e,o):this.renderPositionedFgSegs(e,t,i,r,n)}renderPositionedFgSegs(e,t,n,o,s){let{eventMaxStack:l,eventShortHeight:a,eventOrderStrict:c,eventMinHeight:d}=this.context.options,{date:m,slatCoords:f,eventSelection:h,todayRange:g,nowDate:p}=this.props,u=n||o||s,v=D(e,m,f,d),{segPlacements:b,hiddenGroups:y}=function(e,t,i,r){let n=[],o=[];for(let i=0;i{let{seg:l,rect:c}=e,d=l.eventRange.instance.instanceId,m=u||Boolean(!t[d]&&c),f=N(c&&c.span),v=!u&&c?this.computeSegHStyle(c):{left:0,right:0},b=Boolean(c)&&c.stackForward>0,y=Boolean(c)&&c.span.end-c.span.start{let m=N(e.span),f=(h=e.entries,g=t,h.map(e=>g[e.index]));var h,g;return r.createElement(b,{key:i.buildIsoString(i.computeEarliestSegStart(f)),hiddenSegs:f,top:m.top,bottom:m.bottom,extraDateSpan:n,dateProfile:o,todayRange:s,nowDate:l,eventSelection:a,eventDrag:c,eventResize:d})}))}renderFillSegs(e,t){let{props:n,context:o}=this,s=D(e,n.date,n.slatCoords,o.options.eventMinHeight).map((o,s)=>{let l=e[s];return r.createElement("div",{key:i.buildEventRangeKey(l.eventRange),className:"fc-timegrid-bg-harness",style:N(o)},"bg-event"===t?r.createElement(i.BgEvent,Object.assign({seg:l},i.getSegMeta(l,n.todayRange,n.nowDate))):i.renderFill(t))});return r.createElement(r.Fragment,null,s)}renderNowIndicator(e){let{slatCoords:t,date:n}=this.props;return t?e.map((e,o)=>r.createElement(i.NowIndicatorContainer,{key:o,elClasses:["fc-timegrid-now-indicator-line"],elStyle:{top:t.computeDateTop(e.start,n)},isAxis:!1,date:n})):null}computeSegHStyle(e){let t,i,{isRtl:r,options:n}=this.context,o=n.slotEventOverlap,s=e.levelCoord,l=e.levelCoord+e.thickness;o&&(l=Math.min(1,s+2*(l-s))),r?(t=1-l,i=s):(t=s,i=1-l);let a={zIndex:e.stackDepth+1,left:100*t+"%",right:100*i+"%"};return o&&!e.stackForward&&(a[r?"marginLeft":"marginRight"]=20),a}}function T(e,{todayRange:t,nowDate:n,eventSelection:o,eventDrag:s,eventResize:l}){let a=(s?s.affectedInstances:null)||(l?l.affectedInstances:null)||{};return r.createElement(r.Fragment,null,e.map(e=>{let s=e.eventRange.instance.instanceId;return r.createElement("div",{key:s,style:{visibility:a[s]?"hidden":""}},r.createElement(k,Object.assign({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:s===o,isShort:!1},i.getSegMeta(e,t,n))))}))}function N(e){return e?{top:e.start,bottom:-e.end}:{top:"",bottom:""}}class P extends i.BaseComponent{constructor(){super(...arguments),this.splitFgEventSegs=i.memoize(u),this.splitBgEventSegs=i.memoize(u),this.splitBusinessHourSegs=i.memoize(u),this.splitNowIndicatorSegs=i.memoize(u),this.splitDateSelectionSegs=i.memoize(u),this.splitEventDrag=i.memoize(v),this.splitEventResize=i.memoize(v),this.rootElRef=r.createRef(),this.cellElRefs=new i.RefMap}render(){let{props:e,context:t}=this,n=t.options.nowIndicator&&e.slatCoords&&e.slatCoords.safeComputeTop(e.nowDate),o=e.cells.length,s=this.splitFgEventSegs(e.fgEventSegs,o),l=this.splitBgEventSegs(e.bgEventSegs,o),a=this.splitBusinessHourSegs(e.businessHourSegs,o),c=this.splitNowIndicatorSegs(e.nowIndicatorSegs,o),d=this.splitDateSelectionSegs(e.dateSelectionSegs,o),m=this.splitEventDrag(e.eventDrag,o),f=this.splitEventResize(e.eventResize,o);return r.createElement("div",{className:"fc-timegrid-cols",ref:this.rootElRef},r.createElement("table",{role:"presentation",style:{minWidth:e.tableMinWidth,width:e.clientWidth}},e.tableColGroupNode,r.createElement("tbody",{role:"presentation"},r.createElement("tr",{role:"row"},e.axis&&r.createElement("td",{"aria-hidden":!0,className:"fc-timegrid-col fc-timegrid-axis"},r.createElement("div",{className:"fc-timegrid-col-frame"},r.createElement("div",{className:"fc-timegrid-now-indicator-container"},"number"==typeof n&&r.createElement(i.NowIndicatorContainer,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:n},isAxis:!0,date:e.nowDate})))),e.cells.map((t,i)=>r.createElement(M,{key:t.key,elRef:this.cellElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,nowDate:e.nowDate,todayRange:e.todayRange,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,fgEventSegs:s[i],bgEventSegs:l[i],businessHourSegs:a[i],nowIndicatorSegs:c[i],dateSelectionSegs:d[i],eventDrag:m[i],eventResize:f[i],slatCoords:e.slatCoords,eventSelection:e.eventSelection,forPrint:e.forPrint}))))))}componentDidMount(){this.updateCoords()}componentDidUpdate(){this.updateCoords()}updateCoords(){let{props:e}=this;var t;e.onColCoords&&null!==e.clientWidth&&e.onColCoords(new i.PositionCache(this.rootElRef.current,(t=this.cellElRefs.currentMap,e.cells.map(e=>t[e.key])),!0,!1))}}class z extends i.DateComponent{constructor(){super(...arguments),this.processSlotOptions=i.memoize(H),this.state={slatCoords:null},this.handleRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)},this.handleScrollRequest=e=>{let{onScrollTopRequest:t}=this.props,{slatCoords:i}=this.state;if(t&&i){if(e.time){let r=i.computeTimeTop(e.time);r=Math.ceil(r),r&&(r+=1),t(r)}return!0}return!1},this.handleColCoords=e=>{this.colCoords=e},this.handleSlatCoords=e=>{this.setState({slatCoords:e}),this.props.onSlatCoords&&this.props.onSlatCoords(e)}}render(){let{props:e,state:t}=this;return r.createElement("div",{className:"fc-timegrid-body",ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},r.createElement(p,{axis:e.axis,dateProfile:e.dateProfile,slatMetas:e.slatMetas,clientWidth:e.clientWidth,minHeight:e.expandRows?e.clientHeight:"",tableMinWidth:e.tableMinWidth,tableColGroupNode:e.axis?e.tableColGroupNode:null,onCoords:this.handleSlatCoords}),r.createElement(P,{cells:e.cells,axis:e.axis,dateProfile:e.dateProfile,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,todayRange:e.todayRange,nowDate:e.nowDate,nowIndicatorSegs:e.nowIndicatorSegs,clientWidth:e.clientWidth,tableMinWidth:e.tableMinWidth,tableColGroupNode:e.tableColGroupNode,slatCoords:t.slatCoords,onColCoords:this.handleColCoords,forPrint:e.forPrint}))}componentDidMount(){this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)}componentDidUpdate(e){this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)}componentWillUnmount(){this.scrollResponder.detach()}queryHit(e,t){let{dateEnv:r,options:n}=this.context,{colCoords:o}=this,{dateProfile:s}=this.props,{slatCoords:l}=this.state,{snapDuration:a,snapsPerSlot:c}=this.processSlotOptions(this.props.slotDuration,n.snapDuration),d=o.leftToIndex(e),m=l.positions.topToIndex(t);if(null!=d&&null!=m){let e=this.props.cells[d],n=l.positions.tops[m],f=l.positions.getHeight(m),h=(t-n)/f,g=m*c+Math.floor(h*c),p=this.props.cells[d].date,u=i.addDurations(s.slotMinTime,i.multiplyDuration(a,g)),v=r.add(p,u),b=r.add(v,a);return{dateProfile:s,dateSpan:Object.assign({range:{start:v,end:b},allDay:!1},e.extraDateSpan),dayEl:o.els[d],rect:{left:o.lefts[d],right:o.rights[d],top:n,bottom:n+f},layer:0}}return null}}function H(e,t){let r=t||e,n=i.wholeDivideDurations(e,r);return null===n&&(r=e,n=1),{snapDuration:r,snapsPerSlot:n}}class W extends i.Slicer{sliceRange(e,t){let r=[];for(let n=0;nr.createElement(z,Object.assign({ref:this.timeColsRef},this.slicer.sliceProps(e,n,null,t,l),{forPrint:e.forPrint,axis:e.axis,dateProfile:n,slatMetas:e.slatMetas,slotDuration:e.slotDuration,cells:o.cells[0],tableColGroupNode:e.tableColGroupNode,tableMinWidth:e.tableMinWidth,clientWidth:e.clientWidth,clientHeight:e.clientHeight,expandRows:e.expandRows,nowDate:i,nowIndicatorSegs:s&&this.slicer.sliceNowDate(i,t,l),todayRange:a,onScrollTopRequest:e.onScrollTopRequest,onSlatCoords:e.onSlatCoords})))}}function F(e,t,i){let r=[];for(let n of e.headerDates)r.push({start:i.add(n,t.slotMinTime),end:i.add(n,t.slotMaxTime)});return r}const O=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];function G(e,t,r,n,o){let s=new Date(0),l=e,a=i.createDuration(0),c=r||function(e){let t,r,n;for(t=O.length-1;t>=0;t-=1)if(r=i.createDuration(O[t]),n=i.wholeDivideDurations(r,e),null!==n&&n>1)return r;return e}(n),d=[];for(;i.asRoughMs(l)r.createElement(n.DayTable,Object.assign({},c.allDay,{dateProfile:l,dayTableModel:a,nextDayThreshold:e.nextDayThreshold,tableMinWidth:t.tableMinWidth,colGroupNode:t.tableColGroupNode,renderRowIntro:f?this.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:s.forPrint},this.getAllDayMaxEventProps()))),u=t=>r.createElement(I,Object.assign({},c.timed,{dayTableModel:a,dateProfile:l,axis:f,slotDuration:e.slotDuration,slatMetas:d,forPrint:s.forPrint,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,onSlatCoords:this.handleSlatCoords,expandRows:t.expandRows,onScrollTopRequest:this.handleScrollTopRequest}));return h?this.renderHScrollLayout(g,p,u,a.colCnt,m,d,this.state.slatCoords):this.renderSimpleLayout(g,p,u)}}function A(e,t){let r=new i.DaySeriesModel(e.renderRange,t);return new i.DayTableModel(r,!1)}const j={allDaySlot:Boolean};i.injectStyles('.fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:"\\00a0"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:"\\00a0-\\00a0"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}');var B=t.createPlugin({name:"@fullcalendar/timegrid",initialView:"timeGridWeek",optionRefiners:j,views:{timeGrid:{component:L,usesMinMaxTime:!0,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}}),q={__proto__:null,TimeColsView:m,DayTimeColsView:L,buildTimeColsModel:A,DayTimeCols:I,buildDayRanges:F,DayTimeColsSlicer:W,TimeCols:z,buildSlatMetas:G,TimeColsSlatsCoords:h};return t.globalPlugins.push(B),e.Internal=q,e.default=B,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,FullCalendar.Preact,FullCalendar.DayGrid.Internal); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/web-component/index.global.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/web-component/index.global.js deleted file mode 100644 index 30023f08..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/web-component/index.global.js +++ /dev/null @@ -1,70 +0,0 @@ -/*! -FullCalendar Web Component v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -(function (core) { - 'use strict'; - - class FullCalendarElement extends HTMLElement { - constructor() { - super(...arguments); - this._calendar = null; - this._options = null; - } - connectedCallback() { - this._handleOptionsStr(this.getAttribute('options')); - } - disconnectedCallback() { - this._handleOptionsStr(null); - } - attributeChangedCallback(name, oldVal, newVal) { - if (name === 'options' && - this._calendar // initial render happened - ) { - this._handleOptionsStr(newVal); - } - } - get options() { - return this._options; - } - set options(options) { - this._handleOptions(options); - } - getApi() { - return this._calendar; - } - _handleOptionsStr(optionsStr) { - this._handleOptions(optionsStr ? JSON.parse(optionsStr) : null); - } - _handleOptions(options) { - if (options) { - if (this._calendar) { - this._calendar.resetOptions(options); - } - else { - this.innerHTML = '
'; - let calendarEl = this.querySelector('div'); - let calendar = new core.Calendar(calendarEl, options); - calendar.render(); - this._calendar = calendar; - } - this._options = options; - } - else { - if (this._calendar) { - this._calendar.destroy(); - this._calendar = null; - } - this._options = null; - } - } - static get observedAttributes() { - return ['options']; - } - } - - globalThis.FullCalendarElement = FullCalendarElement; - customElements.define('full-calendar', FullCalendarElement); - -})(FullCalendar); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/web-component/index.global.min.js b/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/web-component/index.global.min.js deleted file mode 100644 index e9a8d2f4..00000000 --- a/force-app/main/default/staticresources/SummitEventsAssets/fullcalendar/packages/web-component/index.global.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -FullCalendar Web Component v6.0.1 -Docs & License: https://fullcalendar.io -(c) 2022 Adam Shaw -*/ -!function(t){"use strict";class e extends HTMLElement{constructor(){super(...arguments),this._calendar=null,this._options=null}connectedCallback(){this._handleOptionsStr(this.getAttribute("options"))}disconnectedCallback(){this._handleOptionsStr(null)}attributeChangedCallback(t,e,n){"options"===t&&this._calendar&&this._handleOptionsStr(n)}get options(){return this._options}set options(t){this._handleOptions(t)}getApi(){return this._calendar}_handleOptionsStr(t){this._handleOptions(t?JSON.parse(t):null)}_handleOptions(e){if(e){if(this._calendar)this._calendar.resetOptions(e);else{this.innerHTML="
";let n=this.querySelector("div"),s=new t.Calendar(n,e);s.render(),this._calendar=s}this._options=e}else this._calendar&&(this._calendar.destroy(),this._calendar=null),this._options=null}static get observedAttributes(){return["options"]}}globalThis.FullCalendarElement=e,customElements.define("full-calendar",e)}(FullCalendar); \ No newline at end of file diff --git a/force-app/main/default/staticresources/SummitEventsAssets/js/calendar.js b/force-app/main/default/staticresources/SummitEventsAssets/js/calendar.js index 68897fba..7099cc08 100644 --- a/force-app/main/default/staticresources/SummitEventsAssets/js/calendar.js +++ b/force-app/main/default/staticresources/SummitEventsAssets/js/calendar.js @@ -72,14 +72,6 @@ const initCalendar = function () { const audienceDD = document.getElementById(audienceDropDownId); - /* - if(feedURL.endsWith('/')) { - feedURL += 'services/apexrest/summit/summiteventsfeed'; - } else { - feedURL += '/services/apexrest/summit/summiteventsfeed'; - } - */ - if (Object.keys(hardCodeAudience).length === 1) { audienceDD.closest('.slds-col').style.display = 'none'; } @@ -121,19 +113,25 @@ const initCalendar = function () { }, eventDisplay: "auto", eventTextColor: "#000", + eventClick: function (info) { + info.jsEvent.preventDefault(); + if (info.event.extendedProps.eventClosed.toLowerCase() === 'false') { + if (info.event.url) { + console.log(info.event.url); + window.open(info.event.url, "_blank"); + } + } + }, eventContent: function (info) { - let wrap = document.createElement("div"); + let wrap = document.createElement("a"); + wrap.href = info.event.url; let titleWrap = document.createElement("span"); eventCount++; let toolTipId = 'tool-tip-' + eventCount; titleWrap.classList.add("summitEventsTitle"); - if (info.event.extendedProps.eventClosed.toLowerCase() === 'false') { - titleWrap.innerHTML = info.event.title; - wrap.href = info.event.url; - wrap.target = "_blank"; - } + titleWrap.innerHTML = info.event.title; if (info.event.extendedProps.eventClosed.toLowerCase() === 'true') { - titleWrap.innerHTML = info.event.title + "
Event is closed.
"; + titleWrap.innerHTML += "
Event is closed.
"; } wrap.classList.add('SummitEventsItem', 'aria-describedby-tooltip'); wrap.setAttribute('aria-describedby', toolTipId) @@ -152,32 +150,28 @@ const initCalendar = function () { } else { wrap.append(descWrap); } - let tooltip = document.createElement('div') - tooltip.id = toolTipId; - tooltip.classList.add('slds-popover', 'slds-popover_tooltip', 'slds-fall-into-ground'); - tooltip.style.position = 'absolute'; - let tooltipDesc = document.createElement('div'); - tooltipDesc.classList.add('slds-popover__body'); - tooltipDesc.style.whiteSpace = 'normal'; - tooltipDesc.innerHTML = info.event.extendedProps.description; - tooltip.append(tooltipDesc); - let calWrap = document.getElementById('eventCalWrap'); - calWrap.parentNode.insertBefore(tooltip, calWrap.nextSibling); + if (info.event.extendedProps.description && info.view.type === "dayGridMonth") { + let tooltip = document.createElement('div') + tooltip.id = toolTipId; + tooltip.classList.add('slds-popover', 'slds-popover_tooltip', 'slds-fall-into-ground'); + tooltip.style.position = 'absolute'; + let tooltipDesc = document.createElement('div'); + tooltipDesc.classList.add('slds-popover__body'); + tooltipDesc.style.whiteSpace = 'normal'; + tooltipDesc.innerHTML = info.event.extendedProps.description; + tooltip.append(tooltipDesc); + let calWrap = document.getElementById('eventCalWrap'); + calWrap.parentNode.insertBefore(tooltip, calWrap.nextSibling); + } let arrayOfDomNodes = [wrap] return {domNodes: arrayOfDomNodes} }, - /* - eventMouseEnter: function (info) { - let desc = info.event.extendedProps.description; - tippy(info.el, {animate: "fade", content: desc}); - }, - */ windowResize: function () { this.changeView(getCalView()); this.refetchEvents(); activateTooltips(); }, - eventDidMount: function () { + eventDidMount: function (info) { activateTooltips(); } }); diff --git a/force-app/main/default/staticresources/SummitEventsAssets/js/moment.min.js b/force-app/main/default/staticresources/SummitEventsAssets/js/moment.min.js index 3427886d..8b80f200 100644 --- a/force-app/main/default/staticresources/SummitEventsAssets/js/moment.min.js +++ b/force-app/main/default/staticresources/SummitEventsAssets/js/moment.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var H;function f(){return H.apply(null,arguments)}function a(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function F(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function c(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function L(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;for(var t in e)if(c(e,t))return;return 1}function o(e){return void 0===e}function u(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function V(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function G(e,t){for(var n=[],s=e.length,i=0;i>>0,s=0;sAe(e)?(r=e+1,t-Ae(e)):(r=e,t);return{year:r,dayOfYear:n}}function qe(e,t,n){var s,i,r=ze(e.year(),t,n),r=Math.floor((e.dayOfYear()-r-1)/7)+1;return r<1?s=r+P(i=e.year()-1,t,n):r>P(e.year(),t,n)?(s=r-P(e.year(),t,n),i=e.year()+1):(i=e.year(),s=r),{week:s,year:i}}function P(e,t,n){var s=ze(e,t,n),t=ze(e+1,t,n);return(Ae(e)-s+t)/7}s("w",["ww",2],"wo","week"),s("W",["WW",2],"Wo","isoWeek"),t("week","w"),t("isoWeek","W"),n("week",5),n("isoWeek",5),v("w",p),v("ww",p,w),v("W",p),v("WW",p,w),Te(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=g(e)});function Be(e,t){return e.slice(t,7).concat(e.slice(0,t))}s("d",0,"do","day"),s("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),s("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),s("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),s("e",0,0,"weekday"),s("E",0,0,"isoWeekday"),t("day","d"),t("weekday","e"),t("isoWeekday","E"),n("day",11),n("weekday",11),n("isoWeekday",11),v("d",p),v("e",p),v("E",p),v("dd",function(e,t){return t.weekdaysMinRegex(e)}),v("ddd",function(e,t){return t.weekdaysShortRegex(e)}),v("dddd",function(e,t){return t.weekdaysRegex(e)}),Te(["dd","ddd","dddd"],function(e,t,n,s){s=n._locale.weekdaysParse(e,s,n._strict);null!=s?t.d=s:m(n).invalidWeekday=e}),Te(["d","e","E"],function(e,t,n,s){t[s]=g(e)});var Je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Qe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Xe="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Ke=k,et=k,tt=k;function nt(){function e(e,t){return t.length-e.length}for(var t,n,s,i=[],r=[],a=[],o=[],u=0;u<7;u++)s=l([2e3,1]).day(u),t=M(this.weekdaysMin(s,"")),n=M(this.weekdaysShort(s,"")),s=M(this.weekdays(s,"")),i.push(t),r.push(n),a.push(s),o.push(t),o.push(n),o.push(s);i.sort(e),r.sort(e),a.sort(e),o.sort(e),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function st(){return this.hours()%12||12}function it(e,t){s(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function rt(e,t){return t._meridiemParse}s("H",["HH",2],0,"hour"),s("h",["hh",2],0,st),s("k",["kk",2],0,function(){return this.hours()||24}),s("hmm",0,0,function(){return""+st.apply(this)+r(this.minutes(),2)}),s("hmmss",0,0,function(){return""+st.apply(this)+r(this.minutes(),2)+r(this.seconds(),2)}),s("Hmm",0,0,function(){return""+this.hours()+r(this.minutes(),2)}),s("Hmmss",0,0,function(){return""+this.hours()+r(this.minutes(),2)+r(this.seconds(),2)}),it("a",!0),it("A",!1),t("hour","h"),n("hour",13),v("a",rt),v("A",rt),v("H",p),v("h",p),v("k",p),v("HH",p,w),v("hh",p,w),v("kk",p,w),v("hmm",ge),v("hmmss",we),v("Hmm",ge),v("Hmmss",we),D(["H","HH"],x),D(["k","kk"],function(e,t,n){e=g(e);t[x]=24===e?0:e}),D(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),D(["h","hh"],function(e,t,n){t[x]=g(e),m(n).bigHour=!0}),D("hmm",function(e,t,n){var s=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s)),m(n).bigHour=!0}),D("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s,2)),t[N]=g(e.substr(i)),m(n).bigHour=!0}),D("Hmm",function(e,t,n){var s=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s))}),D("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s,2)),t[N]=g(e.substr(i))});k=de("Hours",!0);var at,ot={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Ce,monthsShort:Ue,week:{dow:0,doy:6},weekdays:Je,weekdaysMin:Xe,weekdaysShort:Qe,meridiemParse:/[ap]\.?m?\.?/i},R={},ut={};function lt(e){return e&&e.toLowerCase().replace("_","-")}function ht(e){for(var t,n,s,i,r=0;r=t&&function(e,t){for(var n=Math.min(e.length,t.length),s=0;s=t-1)break;t--}r++}return at}function dt(t){var e;if(void 0===R[t]&&"undefined"!=typeof module&&module&&module.exports&&null!=t.match("^[^/\\\\]*$"))try{e=at._abbr,require("./locale/"+t),ct(e)}catch(e){R[t]=null}return R[t]}function ct(e,t){return e&&((t=o(t)?mt(e):ft(e,t))?at=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),at._abbr}function ft(e,t){if(null===t)return delete R[e],null;var n,s=ot;if(t.abbr=e,null!=R[e])Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=R[e]._config;else if(null!=t.parentLocale)if(null!=R[t.parentLocale])s=R[t.parentLocale]._config;else{if(null==(n=dt(t.parentLocale)))return ut[t.parentLocale]||(ut[t.parentLocale]=[]),ut[t.parentLocale].push({name:e,config:t}),null;s=n._config}return R[e]=new K(X(s,t)),ut[e]&&ut[e].forEach(function(e){ft(e.name,e.config)}),ct(e),R[e]}function mt(e){var t;if(!(e=e&&e._locale&&e._locale._abbr?e._locale._abbr:e))return at;if(!a(e)){if(t=dt(e))return t;e=[e]}return ht(e)}function _t(e){var t=e._a;return t&&-2===m(e).overflow&&(t=t[O]<0||11We(t[Y],t[O])?b:t[x]<0||24P(r,u,l)?m(s)._overflowWeeks=!0:null!=h?m(s)._overflowWeekday=!0:(d=$e(r,a,o,u,l),s._a[Y]=d.year,s._dayOfYear=d.dayOfYear)),null!=e._dayOfYear&&(i=bt(e._a[Y],n[Y]),(e._dayOfYear>Ae(i)||0===e._dayOfYear)&&(m(e)._overflowDayOfYear=!0),h=Ze(i,0,e._dayOfYear),e._a[O]=h.getUTCMonth(),e._a[b]=h.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=c[t]=n[t];for(;t<7;t++)e._a[t]=c[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[x]&&0===e._a[T]&&0===e._a[N]&&0===e._a[Ne]&&(e._nextDay=!0,e._a[x]=0),e._d=(e._useUTC?Ze:je).apply(null,c),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[x]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(m(e).weekdayMismatch=!0)}}function Tt(e){if(e._f===f.ISO_8601)St(e);else if(e._f===f.RFC_2822)Ot(e);else{e._a=[],m(e).empty=!0;for(var t,n,s,i,r,a=""+e._i,o=a.length,u=0,l=ae(e._f,e._locale).match(te)||[],h=l.length,d=0;de.valueOf():e.valueOf()"}),i.toJSON=function(){return this.isValid()?this.toISOString():null},i.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},i.unix=function(){return Math.floor(this.valueOf()/1e3)},i.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},i.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},i.eraName=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},i.isLocal=function(){return!!this.isValid()&&!this._isUTC},i.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},i.isUtc=At,i.isUTC=At,i.zoneAbbr=function(){return this._isUTC?"UTC":""},i.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},i.dates=e("dates accessor is deprecated. Use date instead.",ke),i.months=e("months accessor is deprecated. Use month instead",Ge),i.years=e("years accessor is deprecated. Use year instead",Ie),i.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?(this.utcOffset(e="string"!=typeof e?-e:e,t),this):-this.utcOffset()}),i.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var e,t={};return $(t,this),(t=Nt(t))._a?(e=(t._isUTC?l:W)(t._a),this._isDSTShifted=this.isValid()&&0>>0,s=0;sWe(e)?(r=e+1,t-We(e)):(r=e,t);return{year:r,dayOfYear:n}}function Be(e,t,n){var s,i,r=qe(e.year(),t,n),r=Math.floor((e.dayOfYear()-r-1)/7)+1;return r<1?s=r+N(i=e.year()-1,t,n):r>N(e.year(),t,n)?(s=r-N(e.year(),t,n),i=e.year()+1):(i=e.year(),s=r),{week:s,year:i}}function N(e,t,n){var s=qe(e,t,n),t=qe(e+1,t,n);return(We(e)-s+t)/7}s("w",["ww",2],"wo","week"),s("W",["WW",2],"Wo","isoWeek"),h("w",n,u),h("ww",n,t),h("W",n,u),h("WW",n,t),Oe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=M(e)});function Je(e,t){return e.slice(t,7).concat(e.slice(0,t))}s("d",0,"do","day"),s("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),s("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),s("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),s("e",0,0,"weekday"),s("E",0,0,"isoWeekday"),h("d",n),h("e",n),h("E",n),h("dd",function(e,t){return t.weekdaysMinRegex(e)}),h("ddd",function(e,t){return t.weekdaysShortRegex(e)}),h("dddd",function(e,t){return t.weekdaysRegex(e)}),Oe(["dd","ddd","dddd"],function(e,t,n,s){s=n._locale.weekdaysParse(e,s,n._strict);null!=s?t.d=s:p(n).invalidWeekday=e}),Oe(["d","e","E"],function(e,t,n,s){t[s]=M(e)});var Qe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Xe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ke="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),et=i,tt=i,nt=i;function st(){function e(e,t){return t.length-e.length}for(var t,n,s,i=[],r=[],a=[],o=[],u=0;u<7;u++)s=l([2e3,1]).day(u),t=f(this.weekdaysMin(s,"")),n=f(this.weekdaysShort(s,"")),s=f(this.weekdays(s,"")),i.push(t),r.push(n),a.push(s),o.push(t),o.push(n),o.push(s);i.sort(e),r.sort(e),a.sort(e),o.sort(e),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function it(){return this.hours()%12||12}function rt(e,t){s(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function at(e,t){return t._meridiemParse}s("H",["HH",2],0,"hour"),s("h",["hh",2],0,it),s("k",["kk",2],0,function(){return this.hours()||24}),s("hmm",0,0,function(){return""+it.apply(this)+r(this.minutes(),2)}),s("hmmss",0,0,function(){return""+it.apply(this)+r(this.minutes(),2)+r(this.seconds(),2)}),s("Hmm",0,0,function(){return""+this.hours()+r(this.minutes(),2)}),s("Hmmss",0,0,function(){return""+this.hours()+r(this.minutes(),2)+r(this.seconds(),2)}),rt("a",!0),rt("A",!1),h("a",at),h("A",at),h("H",n,d),h("h",n,u),h("k",n,u),h("HH",n,t),h("hh",n,t),h("kk",n,t),h("hmm",me),h("hmmss",_e),h("Hmm",me),h("Hmmss",_e),v(["H","HH"],O),v(["k","kk"],function(e,t,n){e=M(e);t[O]=24===e?0:e}),v(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),v(["h","hh"],function(e,t,n){t[O]=M(e),p(n).bigHour=!0}),v("hmm",function(e,t,n){var s=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s)),p(n).bigHour=!0}),v("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s,2)),t[T]=M(e.substr(i)),p(n).bigHour=!0}),v("Hmm",function(e,t,n){var s=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s))}),v("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s,2)),t[T]=M(e.substr(i))});i=Re("Hours",!0);var ot,ut={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Fe,monthsShort:Le,week:{dow:0,doy:6},weekdays:Qe,weekdaysMin:Ke,weekdaysShort:Xe,meridiemParse:/[ap]\.?m?\.?/i},W={},lt={};function dt(e){return e&&e.toLowerCase().replace("_","-")}function ht(e){for(var t,n,s,i,r=0;r=t&&function(e,t){for(var n=Math.min(e.length,t.length),s=0;s=t-1)break;t--}r++}return ot}function ct(t){var e,n;if(void 0===W[t]&&"undefined"!=typeof module&&module&&module.exports&&(n=t)&&n.match("^[^/\\\\]*$"))try{e=ot._abbr,require("./locale/"+t),ft(e)}catch(e){W[t]=null}return W[t]}function ft(e,t){return e&&((t=g(t)?P(e):mt(e,t))?ot=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ot._abbr}function mt(e,t){if(null===t)return delete W[e],null;var n,s=ut;if(t.abbr=e,null!=W[e])Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=W[e]._config;else if(null!=t.parentLocale)if(null!=W[t.parentLocale])s=W[t.parentLocale]._config;else{if(null==(n=ct(t.parentLocale)))return lt[t.parentLocale]||(lt[t.parentLocale]=[]),lt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return W[e]=new K(X(s,t)),lt[e]&<[e].forEach(function(e){mt(e.name,e.config)}),ft(e),W[e]}function P(e){var t;if(!(e=e&&e._locale&&e._locale._abbr?e._locale._abbr:e))return ot;if(!y(e)){if(t=ct(e))return t;e=[e]}return ht(e)}function _t(e){var t=e._a;return t&&-2===p(e).overflow&&(t=t[Y]<0||11He(t[D],t[Y])?S:t[O]<0||24N(r,u,l)?p(s)._overflowWeeks=!0:null!=d?p(s)._overflowWeekday=!0:(h=$e(r,a,o,u,l),s._a[D]=h.year,s._dayOfYear=h.dayOfYear)),null!=e._dayOfYear&&(i=bt(e._a[D],n[D]),(e._dayOfYear>We(i)||0===e._dayOfYear)&&(p(e)._overflowDayOfYear=!0),d=ze(i,0,e._dayOfYear),e._a[Y]=d.getUTCMonth(),e._a[S]=d.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=c[t]=n[t];for(;t<7;t++)e._a[t]=c[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[O]&&0===e._a[b]&&0===e._a[T]&&0===e._a[Te]&&(e._nextDay=!0,e._a[O]=0),e._d=(e._useUTC?ze:Ze).apply(null,c),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[O]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(p(e).weekdayMismatch=!0)}}function xt(e){if(e._f===_.ISO_8601)Yt(e);else if(e._f===_.RFC_2822)Ot(e);else{e._a=[],p(e).empty=!0;for(var t,n,s,i,r,a=""+e._i,o=a.length,u=0,l=ae(e._f,e._locale).match(te)||[],d=l.length,h=0;he.valueOf():e.valueOf()"}),u.toJSON=function(){return this.isValid()?this.toISOString():null},u.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},u.unix=function(){return Math.floor(this.valueOf()/1e3)},u.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},u.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},u.eraName=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},u.isLocal=function(){return!!this.isValid()&&!this._isUTC},u.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},u.isUtc=At,u.isUTC=At,u.zoneAbbr=function(){return this._isUTC?"UTC":""},u.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},u.dates=e("dates accessor is deprecated. Use date instead.",ge),u.months=e("months accessor is deprecated. Use month instead",Ie),u.years=e("years accessor is deprecated. Use year instead",Pe),u.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?(this.utcOffset(e="string"!=typeof e?-e:e,t),this):-this.utcOffset()}),u.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){var e,t;return g(this._isDSTShifted)&&(q(e={},this),(e=Nt(e))._a?(t=(e._isUTC?l:R)(e._a),this._isDSTShifted=this.isValid()&&0 - 49.0 + 56.0 Active diff --git a/force-app/test/default/classes/SummitEventsRegistration_TEST.cls b/force-app/test/default/classes/SummitEventsRegistration_TEST.cls index b056e250..2f24f571 100644 --- a/force-app/test/default/classes/SummitEventsRegistration_TEST.cls +++ b/force-app/test/default/classes/SummitEventsRegistration_TEST.cls @@ -10,9 +10,9 @@ public class SummitEventsRegistration_TEST { List seaTestInstances = SummitEventsTestSharedDataFactory.createTestEvent(); Summit_Events_Registration__c seaTestRegistration = SummitEventsTestSharedDataFactory.createEventRegistration(seaTestInstances[1], 'Test', 'Tester', 'test@test.net', '55555', '1971-03-22', '2012', null); + Summit_Events__c seaTestEvent = SummitEventsTestSharedDataFactory.getEventRecord(seaTestInstances[1].Event__c); - Test.startTest(); Summit_Events_Email__c email1 = new Summit_Events_Email__c(); email1.Event__c = seaTestInstances[1].Event__c; email1.Action_Status__c = 'Registered'; @@ -30,6 +30,7 @@ public class SummitEventsRegistration_TEST { email2.BCC_Email__c = 'bcc@example.com'; insert email2; + Test.startTest(); seaTestRegistration.Status__c = 'Registered'; update seaTestRegistration; @@ -37,7 +38,7 @@ public class SummitEventsRegistration_TEST { update seaTestRegistration; List emailTasks = [ - SELECT Id, Subject + SELECT Id, Subject, Description FROM Task WHERE WhatId = :seaTestRegistration.Id AND Type = 'Email' @@ -46,8 +47,54 @@ public class SummitEventsRegistration_TEST { AND WhoId = :seaTestRegistration.Contact__c ]; + System.debug(JSON.serialize(emailTasks)); //Two tasks should have been created when both status emails were sent System.assertEquals(emailTasks.size(), 2); Test.stopTest(); } + + @IsTest + public static void TestSummitEventsMultiRegistration() { + + List seaTestInstances = SummitEventsTestSharedDataFactory.createTestEvent(); + + List seaRegistrations = new List(); + + for (Integer x = 0; x < 5; x++) { + Summit_Events_Registration__c seaTestRegistration = SummitEventsTestSharedDataFactory.createEventRegistration(seaTestInstances[1], 'Test' + x, 'Tester' + x, 'test+' + x + '@test.net', '55555', '1971-03-22', '2012', null); + seaRegistrations.add(seaTestRegistration); + } + + Summit_Events__c seaTestEvent = SummitEventsTestSharedDataFactory.getEventRecord(seaTestInstances[1].Event__c); + + Summit_Events_Email__c email1 = new Summit_Events_Email__c(); + email1.Event__c = seaTestInstances[1].Event__c; + email1.Action_Status__c = 'Registered'; + email1.Email_Content__c = 'Sample text here'; + email1.Letterhead_HTML__c = 'Letterhead goes here
[[DONT_DELETE_CONTENT_HERE]]'; + email1.BCC_Email__c = 'bcc@example.com'; + insert email1; + + Test.startTest(); + List contactIds = new List(); + List registrationIds = new List(); + for (Summit_Events_Registration__c seaRegistration : seaRegistrations) { + seaRegistration.Status__c = 'Registered'; + contactIds.add(seaRegistration.Contact__c); + registrationIds.add(seaRegistration.Id); + } + update seaRegistrations; + + List emailTasks = [ + SELECT Id, Subject, Description + FROM Task + WHERE WhatId IN :registrationIds + AND Type = 'Email' + AND Status = 'Completed' + AND Priority = 'Low' + AND WhoId IN :contactIds + ]; + System.assertEquals(emailTasks.size(), 5); + Test.stopTest(); + } } \ No newline at end of file diff --git a/force-app/test/default/classes/SummitEventsRegistration_TEST.cls-meta.xml b/force-app/test/default/classes/SummitEventsRegistration_TEST.cls-meta.xml index 8e4d11f8..fbbad0af 100644 --- a/force-app/test/default/classes/SummitEventsRegistration_TEST.cls-meta.xml +++ b/force-app/test/default/classes/SummitEventsRegistration_TEST.cls-meta.xml @@ -1,5 +1,5 @@ - 49.0 + 56.0 Active