/*!FullCalendarCorePackagev4.4.0Docs&License:https://fullcalendar.io/(c)2019AdamShaw*/(function (global, base_factory) { typeof exports === 'object' && typeof module !== 'undefined' ? base_factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], base_factory) :(global = global || self, base_factory(global.FullCalendar = {}));}(this, function (exports) { 'use strict'; //Creating// ----------------------------------------------------------------------------------------------------------------varelementPropHash={className:true,colSpan:true,rowSpan:true};varcontainerTagHash={'<tr':'tbody','<td':'tr'};functioncreateElement(tagName,attrs,content){varel=document.createElement(tagName);if(attrs){for(varattrNameinattrs){if(attrName==='style'){applyStyle(el,attrs[attrName]);}elseif(elementPropHash[attrName]){el[attrName]=attrs[attrName];}else{el.setAttribute(attrName,attrs[attrName]);}}}if(typeofcontent==='string'){el.innerHTML=content;// shortcut. no need to process HTML in any way}elseif(content!=null){appendToElement(el,content);}returnel;}functionhtmlToElement(html){html=html.trim();varcontainer=document.createElement(computeContainerTag(html));container.innerHTML=html;returncontainer.firstChild;}functionhtmlToElements(html){returnArray.prototype.slice.call(htmlToNodeList(html));}functionhtmlToNodeList(html){html=html.trim();varcontainer=document.createElement(computeContainerTag(html));container.innerHTML=html;returncontainer.childNodes;}// assumes html already trimmed and tag names are lowercasefunctioncomputeContainerTag(html){returncontainerTagHash[html.substr(0,3)// faster than using regex]||'div';}functionappendToElement(el,content){varchildNodes=normalizeContent(content);for(vari=0;i<childNodes.length;i++){el.appendChild(childNodes[i]);}}functionprependToElement(parent,content){varnewEls=normalizeContent(content);varafterEl=parent.firstChild||null;// if no firstChild, will append to end, but that's okay, b/c there were no childrenfor(vari=0;i<newEls.length;i++){parent.insertBefore(newEls[i],afterEl);}}functioninsertAfterElement(refEl,content){varnewEls=normalizeContent(content);varafterEl=refEl.nextSibling||null;for(vari=0;i<newEls.length;i++){refEl.parentNode.insertBefore(newEls[i],afterEl);}}functionnormalizeContent(content){varels;if(typeofcontent==='string'){els=htmlToElements(content);}elseif(contentinstanceofNode){els=[content];}else{// Node[] or NodeListels=Array.prototype.slice.call(content);}returnels;}functionremoveElement(el){if(el.parentNode){el.parentNode.removeChild(el);}}// Querying// ----------------------------------------------------------------------------------------------------------------// from https://developer.mozilla.org/en-US/docs/Web/API/Element/closestvarmatchesMethod=Element.prototype.matches||Element.prototype.matchesSelector||Element.prototype.msMatchesSelector;varclosestMethod=Element.prototype.closest||function(selector){// polyfillvarel=this;if(!document.documentElement.contains(el)){returnnull;}do{if(elementMatches(el,selector)){returnel;}el=el.parentElement||el.parentNode;}while(el!==null&&el.nodeType===1);returnnull;};functionelementClosest(el,selector){returnclosestMethod.call(el,selector);}functionelementMatches(el,selector){returnmatchesMethod.call(el,selector);}// accepts multiple subject els// returns a real array. good for methods like forEachfunctionfindElements(container,selector){varcontainers=containerinstanceofHTMLElement?[container]:container;varallMatches=[];for(vari=0;i<containers.length;i++){varmatches=containers[i].querySelectorAll(selector);for(varj=0;j<matches.length;j++){allMatches.push(matches[j]);}}returnallMatches;}// accepts multiple subject els// only queries direct child elementsfunctionfindChildren(parent,selector){varparents=parentinstanceofHTMLElement?[parent]:parent;varallMatches=[];for(vari=0;i<parents.length;i++){varchildNodes=parents[i].children;// only ever elementsfor(varj=0;j<childNodes.length;j++){varchildNode=childNodes[j];if(!selector||elementMatches(childNode,selector)){allMatches.push(childNode);}}}returnallMatches;}// Attributes// ----------------------------------------------------------------------------------------------------------------functionforceClassName(el,className,bool){if(bool){el.classList.add(className);}else{el.classList.remove(className);}}// Style// ----------------------------------------------------------------------------------------------------------------varPIXEL_PROP_RE=/(top|left|right|bottom|width|height)$/i;functionapplyStyle(el,props){for(varpropNameinprops){applyStyleProp(el,propName,props[propName]);}}functionapplyStyleProp(el,name,val){if(val==null){el.style[name]='';}elseif(typeofval==='number'&&PIXEL_PROP_RE.test(name)){el.style[name]=val+'px';}else{el.style[name]=val;}}functionpointInsideRect(point,rect){returnpoint.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 falsefunctionintersectRects(rect1,rect2){varres={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){returnres;}returnfalse;}functiontranslateRect(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 rectanglefunctionconstrainPoint(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 rectanglefunctiongetRectCenter(rect){return{left:(rect.left+rect.right)/2,top:(rect.top+rect.bottom)/2};}// Subtracts point2's coordinates from point1's coordinates, returning a deltafunctiondiffPoints(point1,point2){return{left:point1.left-point2.left,top:point1.top-point2.top};}// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left sidevarisRtlScrollbarOnLeft=null;functiongetIsRtlScrollbarOnLeft(){if(isRtlScrollbarOnLeft===null){isRtlScrollbarOnLeft=computeIsRtlScrollbarOnLeft();}returnisRtlScrollbarOnLeft;}functioncomputeIsRtlScrollbarOnLeft(){varouterEl=createElement('div',{style:{position:'absolute',top:-1000,left:0,border:0,padding:0,overflow:'scroll',direction:'rtl'}},'<div></div>');document.body.appendChild(outerEl);varinnerEl=outerEl.firstChild;varres=innerEl.getBoundingClientRect().left>outerEl.getBoundingClientRect().left;removeElement(outerEl);returnres;}// The scrollbar width computations in computeEdges are sometimes flawed when it comes to// retina displays, rounding, and IE11. Massage them into a usable value.functionsanitizeScrollbarWidth(width){width=Math.max(0,width);// no negativeswidth=Math.round(width);returnwidth;}functioncomputeEdges(el,getPadding){if(getPadding===void0){getPadding=false;}varcomputedStyle=window.getComputedStyle(el);varborderLeft=parseInt(computedStyle.borderLeftWidth,10)||0;varborderRight=parseInt(computedStyle.borderRightWidth,10)||0;varborderTop=parseInt(computedStyle.borderTopWidth,10)||0;varborderBottom=parseInt(computedStyle.borderBottomWidth,10)||0;// must use offset(Width|Height) because compatible with client(Width|Height)varscrollbarLeftRight=sanitizeScrollbarWidth(el.offsetWidth-el.clientWidth-borderLeft-borderRight);varscrollbarBottom=sanitizeScrollbarWidth(el.offsetHeight-el.clientHeight-borderTop-borderBottom);varres={borderLeft:borderLeft,borderRight:borderRight,borderTop:borderTop,borderBottom:borderBottom,scrollbarBottom: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;}returnres;}functioncomputeInnerRect(el,goWithinPadding){if(goWithinPadding===void0){goWithinPadding=false;}varouterRect=computeRect(el);varedges=computeEdges(el,goWithinPadding);varres={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;}returnres;}functioncomputeRect(el){varrect=el.getBoundingClientRect();return{left:rect.left+window.pageXOffset,top:rect.top+window.pageYOffset,right:rect.right+window.pageXOffset,bottom:rect.bottom+window.pageYOffset};}functioncomputeViewportRect(){return{left:window.pageXOffset,right:window.pageXOffset+document.documentElement.clientWidth,top:window.pageYOffset,bottom:window.pageYOffset+document.documentElement.clientHeight};}functioncomputeHeightAndMargins(el){returnel.getBoundingClientRect().height+computeVMargins(el);}functioncomputeVMargins(el){varcomputed=window.getComputedStyle(el);returnparseInt(computed.marginTop,10)+parseInt(computed.marginBottom,10);}// does not return windowfunctiongetClippingParents(el){varparents=[];while(elinstanceofHTMLElement){// will stop when gets to document or nullvarcomputedStyle=window.getComputedStyle(el);if(computedStyle.position==='fixed'){break;}if((/(auto|scroll)/).test(computedStyle.overflow+computedStyle.overflowY+computedStyle.overflowX)){parents.push(el);}el=el.parentNode;}returnparents;}functioncomputeClippingRect(el){returngetClippingParents(el).map(function(el){returncomputeInnerRect(el);}).concat(computeViewportRect()).reduce(function(rect0,rect1){returnintersectRects(rect0,rect1)||rect1;// should always intersect});}// Stops a mouse/touch event from doing it's native browser actionfunctionpreventDefault(ev){ev.preventDefault();}// Event Delegation// ----------------------------------------------------------------------------------------------------------------functionlistenBySelector(container,eventType,selector,handler){functionrealHandler(ev){varmatchedChild=elementClosest(ev.target,selector);if(matchedChild){handler.call(matchedChild,ev,matchedChild);}}container.addEventListener(eventType,realHandler);returnfunction(){container.removeEventListener(eventType,realHandler);};}functionlistenToHoverBySelector(container,selector,onMouseEnter,onMouseLeave){varcurrentMatchedChild;returnlistenBySelector(container,'mouseover',selector,function(ev,matchedChild){if(matchedChild!==currentMatchedChild){currentMatchedChild=matchedChild;onMouseEnter(ev,matchedChild);varrealOnMouseLeave_1=function(ev){currentMatchedChild=null;onMouseLeave(ev,matchedChild);matchedChild.removeEventListener('mouseleave',realOnMouseLeave_1);};// listen to the next mouseleave, and then unattachmatchedChild.addEventListener('mouseleave',realOnMouseLeave_1);}});}// Animation// ----------------------------------------------------------------------------------------------------------------vartransitionEventNames=['webkitTransitionEnd','otransitionend','oTransitionEnd','msTransitionEnd','transitionend'];// triggered only when the next single subsequent transition finishesfunctionwhenTransitionDone(el,callback){varrealCallback=function(ev){callback(ev);transitionEventNames.forEach(function(eventName){el.removeEventListener(eventName,realCallback);});};transitionEventNames.forEach(function(eventName){el.addEventListener(eventName,realCallback);// cross-browser way to determine when the transition finishes});}varDAY_IDS=['sun','mon','tue','wed','thu','fri','sat'];// AddingfunctionaddWeeks(m,n){vara=dateToUtcArray(m);a[2]+=n*7;returnarrayToUtcDate(a);}functionaddDays(m,n){vara=dateToUtcArray(m);a[2]+=n;returnarrayToUtcDate(a);}functionaddMs(m,n){vara=dateToUtcArray(m);a[6]+=n;returnarrayToUtcDate(a);}// Diffing (all return floats)functiondiffWeeks(m0,m1){returndiffDays(m0,m1)/7;}functiondiffDays(m0,m1){return(m1.valueOf()-m0.valueOf())/(1000*60*60*24);}functiondiffHours(m0,m1){return(m1.valueOf()-m0.valueOf())/(1000*60*60);}functiondiffMinutes(m0,m1){return(m1.valueOf()-m0.valueOf())/(1000*60);}functiondiffSeconds(m0,m1){return(m1.valueOf()-m0.valueOf())/1000;}functiondiffDayAndTime(m0,m1){varm0day=startOfDay(m0);varm1day=startOfDay(m1);return{years:0,months:0,days:Math.round(diffDays(m0day,m1day)),milliseconds:(m1.valueOf()-m1day.valueOf())-(m0.valueOf()-m0day.valueOf())};}// Diffing Whole UnitsfunctiondiffWholeWeeks(m0,m1){vard=diffWholeDays(m0,m1);if(d!==null&&d%7===0){returnd/7;}returnnull;}functiondiffWholeDays(m0,m1){if(timeAsMs(m0)===timeAsMs(m1)){returnMath.round(diffDays(m0,m1));}returnnull;}// Start-OffunctionstartOfDay(m){returnarrayToUtcDate([m.getUTCFullYear(),m.getUTCMonth(),m.getUTCDate()]);}functionstartOfHour(m){returnarrayToUtcDate([m.getUTCFullYear(),m.getUTCMonth(),m.getUTCDate(),m.getUTCHours()]);}functionstartOfMinute(m){returnarrayToUtcDate([m.getUTCFullYear(),m.getUTCMonth(),m.getUTCDate(),m.getUTCHours(),m.getUTCMinutes()]);}functionstartOfSecond(m){returnarrayToUtcDate([m.getUTCFullYear(),m.getUTCMonth(),m.getUTCDate(),m.getUTCHours(),m.getUTCMinutes(),m.getUTCSeconds()]);}// Week ComputationfunctionweekOfYear(marker,dow,doy){vary=marker.getUTCFullYear();varw=weekOfGivenYear(marker,y,dow,doy);if(w<1){returnweekOfGivenYear(marker,y-1,dow,doy);}varnextW=weekOfGivenYear(marker,y+1,dow,doy);if(nextW>=1){returnMath.min(w,nextW);}returnw;}functionweekOfGivenYear(marker,year,dow,doy){varfirstWeekStart=arrayToUtcDate([year,0,1+firstWeekOffset(year,dow,doy)]);vardayStart=startOfDay(marker);vardays=Math.round(diffDays(firstWeekStart,dayStart));returnMath.floor(days/7)+1;// zero-indexed}// start-of-first-week - start-of-yearfunctionfirstWeekOffset(year,dow,doy){// first-week day -- which january is always in the first week (4 for iso, 1 for other)varfwd=7+dow-doy;// first-week day local weekday -- which local weekday is fwdvarfwdlw=(7+arrayToUtcDate([year,0,fwd]).getUTCDay()-dow)%7;return-fwdlw+fwd-1;}// Array ConversionfunctiondateToLocalArray(date){return[date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()];}functionarrayToLocalDate(a){returnnewDate(a[0],a[1]||0,a[2]==null?1:a[2],// day of montha[3]||0,a[4]||0,a[5]||0);}functiondateToUtcArray(date){return[date.getUTCFullYear(),date.getUTCMonth(),date.getUTCDate(),date.getUTCHours(),date.getUTCMinutes(),date.getUTCSeconds(),date.getUTCMilliseconds()];}functionarrayToUtcDate(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]);}returnnewDate(Date.UTC.apply(Date,a));}// Other UtilsfunctionisValidDate(m){return!isNaN(m.valueOf());}functiontimeAsMs(m){returnm.getUTCHours()*1000*60*60+m.getUTCMinutes()*1000*60+m.getUTCSeconds()*1000+m.getUTCMilliseconds();}varINTERNAL_UNITS=['years','months','days','milliseconds'];varPARSE_RE=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;// Parsing and CreationfunctioncreateDuration(input,unit){var_a;if(typeofinput==='string'){returnparseString(input);}elseif(typeofinput==='object'&&input){// non-null objectreturnnormalizeObject(input);}elseif(typeofinput==='number'){returnnormalizeObject((_a={},_a[unit||'milliseconds']=input,_a));}else{returnnull;}}functionparseString(s){varm=PARSE_RE.exec(s);if(m){varsign=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)};}returnnull;}functionnormalizeObject(obj){return{years:obj.years||obj.year||0,months:obj.months||obj.month||0,days:(obj.days||obj.day||0)+getWeeksFromInput(obj)*7,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};}functiongetWeeksFromInput(obj){returnobj.weeks||obj.week||0;}// EqualityfunctiondurationsEqual(d0,d1){returnd0.years===d1.years&&d0.months===d1.months&&d0.days===d1.days&&d0.milliseconds===d1.milliseconds;}functionisSingleDay(dur){returndur.years===0&&dur.months===0&&dur.days===1&&dur.milliseconds===0;}// Simple MathfunctionaddDurations(d0,d1){return{years:d0.years+d1.years,months:d0.months+d1.months,days:d0.days+d1.days,milliseconds:d0.milliseconds+d1.milliseconds};}functionsubtractDurations(d1,d0){return{years:d1.years-d0.years,months:d1.months-d0.months,days:d1.days-d0.days,milliseconds:d1.milliseconds-d0.milliseconds};}functionmultiplyDuration(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/yearsfunctionasRoughYears(dur){returnasRoughDays(dur)/365;}functionasRoughMonths(dur){returnasRoughDays(dur)/30;}functionasRoughDays(dur){returnasRoughMs(dur)/864e5;}functionasRoughMinutes(dur){returnasRoughMs(dur)/(1000*60);}functionasRoughSeconds(dur){returnasRoughMs(dur)/1000;}functionasRoughMs(dur){returndur.years*(365*864e5)+dur.months*(30*864e5)+dur.days*864e5+dur.milliseconds;}// Advanced MathfunctionwholeDivideDurations(numerator,denominator){varres=null;for(vari=0;i<INTERNAL_UNITS.length;i++){varunit=INTERNAL_UNITS[i];if(denominator[unit]){varlocalRes=numerator[unit]/denominator[unit];if(!isInt(localRes)||(res!==null&&res!==localRes)){returnnull;}res=localRes;}elseif(numerator[unit]){// needs to divide by something but can't!returnnull;}}returnres;}functiongreatestDurationDenominator(dur,dontReturnWeeks){varms=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(!dontReturnWeeks&&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};}/* FullCalendar-specific DOM Utilities ----------------------------------------------------------------------------------------------------------------------*/// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.functioncompensateScroll(rowEl,scrollbarWidths){if(scrollbarWidths.left){applyStyle(rowEl,{borderLeftWidth:1,marginLeft:scrollbarWidths.left-1});}if(scrollbarWidths.right){applyStyle(rowEl,{borderRightWidth:1,marginRight:scrollbarWidths.right-1});}}// Undoes compensateScroll and restores all borders/marginsfunctionuncompensateScroll(rowEl){applyStyle(rowEl,{marginLeft:'',marginRight:'',borderLeftWidth:'',borderRightWidth:''});}// Make the mouse cursor express that an event is not allowed in the current areafunctiondisableCursor(){document.body.classList.add('fc-not-allowed');}// Returns the mouse cursor to its original lookfunctionenableCursor(){document.body.classList.remove('fc-not-allowed');}// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and// reduces the available height.functiondistributeHeight(els,availableHeight,shouldRedistribute){// *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,// and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.varminOffset1=Math.floor(availableHeight/els.length);// for non-last elementvarminOffset2=Math.floor(availableHeight-minOffset1*(els.length-1));// for last element *FLOORING NOTE*varflexEls=[];// elements that are allowed to expand. array of DOM nodesvarflexOffsets=[];// amount of vertical space it takes upvarflexHeights=[];// actual css heightvarusedHeight=0;undistributeHeight(els);// give all elements their natural height// find elements that are below the recommended height (expandable).// important to query for heights in a single first pass (to avoid reflow oscillation).els.forEach(function(el,i){varminOffset=i===els.length-1?minOffset2:minOffset1;varnaturalHeight=el.getBoundingClientRect().height;varnaturalOffset=naturalHeight+computeVMargins(el);if(naturalOffset<minOffset){flexEls.push(el);flexOffsets.push(naturalOffset);flexHeights.push(naturalHeight);}else{// this element stretches past recommended height (non-expandable). mark the space as occupied.usedHeight+=naturalOffset;}});// readjust the recommended height to only consider the height available to non-maxed-out rows.if(shouldRedistribute){availableHeight-=usedHeight;minOffset1=Math.floor(availableHeight/flexEls.length);minOffset2=Math.floor(availableHeight-minOffset1*(flexEls.length-1));// *FLOORING NOTE*}// assign heights to all expandable elementsflexEls.forEach(function(el,i){varminOffset=i===flexEls.length-1?minOffset2:minOffset1;varnaturalOffset=flexOffsets[i];varnaturalHeight=flexHeights[i];varnewHeight=minOffset-(naturalOffset-naturalHeight);// subtract the margin/paddingif(naturalOffset<minOffset){// we check this again because redistribution might have changed thingsel.style.height=newHeight+'px';}});}// Undoes distrubuteHeight, restoring all els to their natural heightfunctionundistributeHeight(els){els.forEach(function(el){el.style.height='';});}// Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the// cells to be that width.// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inlinefunctionmatchCellWidths(els){varmaxInnerWidth=0;els.forEach(function(el){varinnerEl=el.firstChild;// hopefully an elementif(innerElinstanceofHTMLElement){varinnerWidth_1=innerEl.getBoundingClientRect().width;if(innerWidth_1>maxInnerWidth){maxInnerWidth=innerWidth_1;}}});maxInnerWidth++;// sometimes not accurate of width the text needs to stay on one line. insuranceels.forEach(function(el){el.style.width=maxInnerWidth+'px';});returnmaxInnerWidth;}// Given one element that resides inside another,// Subtracts the height of the inner element from the outer element.functionsubtractInnerElHeight(outerEl,innerEl){// effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that workedvarreflowStyleProps={position:'relative',left:-1// ensure reflow in case the el was already relative. negative is less likely to cause new scroll};applyStyle(outerEl,reflowStyleProps);applyStyle(innerEl,reflowStyleProps);vardiff=// grab the dimensionsouterEl.getBoundingClientRect().height-innerEl.getBoundingClientRect().height;// undo hackvarresetStyleProps={position:'',left:''};applyStyle(outerEl,resetStyleProps);applyStyle(innerEl,resetStyleProps);returndiff;}/* Selection ----------------------------------------------------------------------------------------------------------------------*/functionpreventSelection(el){el.classList.add('fc-unselectable');el.addEventListener('selectstart',preventDefault);}functionallowSelection(el){el.classList.remove('fc-unselectable');el.removeEventListener('selectstart',preventDefault);}/* Context Menu ----------------------------------------------------------------------------------------------------------------------*/functionpreventContextMenu(el){el.addEventListener('contextmenu',preventDefault);}functionallowContextMenu(el){el.removeEventListener('contextmenu',preventDefault);}/* Object Ordering by Field ----------------------------------------------------------------------------------------------------------------------*/functionparseFieldSpecs(input){varspecs=[];vartokens=[];vari;vartoken;if(typeofinput==='string'){tokens=input.split(/\s*,\s*/);}elseif(typeofinput==='function'){tokens=[input];}elseif(Array.isArray(input)){tokens=input;}for(i=0;i<tokens.length;i++){token=tokens[i];if(typeoftoken==='string'){specs.push(token.charAt(0)==='-'?{field:token.substring(1),order:-1}:{field:token,order:1});}elseif(typeoftoken==='function'){specs.push({func:token});}}returnspecs;}functioncompareByFieldSpecs(obj0,obj1,fieldSpecs){vari;varcmp;for(i=0;i<fieldSpecs.length;i++){cmp=compareByFieldSpec(obj0,obj1,fieldSpecs[i]);if(cmp){returncmp;}}return0;}functioncompareByFieldSpec(obj0,obj1,fieldSpec){if(fieldSpec.func){returnfieldSpec.func(obj0,obj1);}returnflexibleCompare(obj0[fieldSpec.field],obj1[fieldSpec.field])*(fieldSpec.order||1);}functionflexibleCompare(a,b){if(!a&&!b){return0;}if(b==null){return-1;}if(a==null){return1;}if(typeofa==='string'||typeofb==='string'){returnString(a).localeCompare(String(b));}returna-b;}/* String Utilities ----------------------------------------------------------------------------------------------------------------------*/functioncapitaliseFirstLetter(str){returnstr.charAt(0).toUpperCase()+str.slice(1);}functionpadStart(val,len){vars=String(val);return'000'.substr(0,len-s.length)+s;}/* Number Utilities ----------------------------------------------------------------------------------------------------------------------*/functioncompareNumbers(a,b){returna-b;}functionisInt(n){returnn%1===0;}/* Weird Utilities ----------------------------------------------------------------------------------------------------------------------*/functionapplyAll(functions,thisObj,args){if(typeoffunctions==='function'){// supplied a single functionfunctions=[functions];}if(functions){vari=void0;varret=void0;for(i=0;i<functions.length;i++){ret=functions[i].apply(thisObj,args)||ret;}returnret;}}functionfirstDefined(){varargs=[];for(var_i=0;_i<arguments.length;_i++){args[_i]=arguments[_i];}for(vari=0;i<args.length;i++){if(args[i]!==undefined){returnargs[i];}}}// Returns a function, that, as long as it continues to be invoked, will not// be triggered. The function will be called after it stops being called for// N milliseconds. If `immediate` is passed, trigger the function on the// leading edge, instead of the trailing.// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714functiondebounce(func,wait){vartimeout;varargs;varcontext;vartimestamp;varresult;varlater=function(){varlast=newDate().valueOf()-timestamp;if(last<wait){timeout=setTimeout(later,wait-last);}else{timeout=null;result=func.apply(context,args);context=args=null;}};returnfunction(){context=this;args=arguments;timestamp=newDate().valueOf();if(!timeout){timeout=setTimeout(later,wait);}returnresult;};}// Number and Boolean are only types that defaults or not computed for// TODO: write more commentsfunctionrefineProps(rawProps,processors,defaults,leftoverProps){if(defaults===void0){defaults={};}varrefined={};for(varkeyinprocessors){varprocessor=processors[key];if(rawProps[key]!==undefined){// foundif(processor===Function){refined[key]=typeofrawProps[key]==='function'?rawProps[key]:null;}elseif(processor){// a refining function?refined[key]=processor(rawProps[key]);}else{refined[key]=rawProps[key];}}elseif(defaults[key]!==undefined){// there's an explicit defaultrefined[key]=defaults[key];}else{// must compute a defaultif(processor===String){refined[key]='';// empty string is default for String}elseif(!processor||processor===Number||processor===Boolean||processor===Function){refined[key]=null;// assign null for other non-custom processor funcs}else{refined[key]=processor(null);// run the custom processor func}}}if(leftoverProps){for(varkeyinrawProps){if(processors[key]===undefined){leftoverProps[key]=rawProps[key];}}}returnrefined;}/* 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.functioncomputeAlignedDayRange(timedRange){vardayCnt=Math.floor(diffDays(timedRange.start,timedRange.end))||1;varstart=startOfDay(timedRange.start);varend=addDays(start,dayCnt);return{start:start,end: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 argfunctioncomputeVisibleDayRange(timedRange,nextDayThreshold){if(nextDayThreshold===void0){nextDayThreshold=createDuration(0);}varstartDay=null;varendDay=null;if(timedRange.end){endDay=startOfDay(timedRange.end);varendTimeMS=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?functionisMultiDayRange(range){varvisibleRange=computeVisibleDayRange(range);returndiffDays(visibleRange.start,visibleRange.end)>1;}functiondiffDates(date0,date1,dateEnv,largeUnit){if(largeUnit==='year'){returncreateDuration(dateEnv.diffWholeYears(date0,date1),'year');}elseif(largeUnit==='month'){returncreateDuration(dateEnv.diffWholeMonths(date0,date1),'month');}else{returndiffDayAndTime(date0,date1);// returns a duration}}/*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0THISCODEISPROVIDEDONAN*ASIS*BASIS,WITHOUTWARRANTIESORCONDITIONSOFANYKIND,EITHEREXPRESSORIMPLIED,INCLUDINGWITHOUTLIMITATIONANYIMPLIEDWARRANTIESORCONDITIONSOFTITLE,FITNESSFORAPARTICULARPURPOSE,MERCHANTABLITYORNON-INFRINGEMENT.SeetheApacheVersion2.0LicenseforspecificlanguagegoverningpermissionsandlimitationsundertheLicense.******************************************************************************/ /*globalReflect,Promise*/ var extendStatics = function(d, b) { extendStatics = Object.setPrototypeOf ||({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; function __extends(d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) { for (var i = 0; i < recurringTypes.length; i++) { var localLeftovers = {}; var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv); if (parsed) { var allDay = localLeftovers.allDay; delete localLeftovers.allDay; //removefromleftoversif(allDay==null){allDay=allDayDefault;if(allDay==null){allDay=parsed.allDayGuess;if(allDay==null){allDay=false;}}}__assign(leftovers,localLeftovers);return{allDay:allDay,duration:parsed.duration,typeData:parsed.typeData,typeId:i};}}returnnull;}/* Event MUST have a recurringDef */functionexpandRecurringRanges(eventDef,duration,framingRange,dateEnv,recurringTypes){vartypeDef=recurringTypes[eventDef.recurringDef.typeId];varmarkers=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 toif(eventDef.allDay){markers=markers.map(startOfDay);}returnmarkers;}varhasOwnProperty=Object.prototype.hasOwnProperty;// 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.functionmergeProps(propObjs,complexProps){vardest={};vari;varname;varcomplexObjs;varj;varval;varprops;if(complexProps){for(i=0;i<complexProps.length;i++){name=complexProps[i];complexObjs=[];// collect the trailing object values, stopping when a non-object is discoveredfor(j=propObjs.length-1;j>=0;j--){val=propObjs[j][name];if(typeofval==='object'&&val){// non-null objectcomplexObjs.unshift(val);}elseif(val!==undefined){dest[name]=val;// if there were no objects, this value will be usedbreak;}}// if the trailing values were objects, use the merged valueif(complexObjs.length){dest[name]=mergeProps(complexObjs);}}}// copy values into the destination, going from last to firstfor(i=propObjs.length-1;i>=0;i--){props=propObjs[i];for(nameinprops){if(!(nameindest)){// if already assigned by previous props or complex props, don't reassigndest[name]=props[name];}}}returndest;}functionfilterHash(hash,func){varfiltered={};for(varkeyinhash){if(func(hash[key],key)){filtered[key]=hash[key];}}returnfiltered;}functionmapHash(hash,func){varnewHash={};for(varkeyinhash){newHash[key]=func(hash[key],key);}returnnewHash;}functionarrayToHash(a){varhash={};for(var_i=0,a_1=a;_i<a_1.length;_i++){varitem=a_1[_i];hash[item]=true;}returnhash;}functionhashValuesToArray(obj){vara=[];for(varkeyinobj){a.push(obj[key]);}returna;}functionisPropsEqual(obj0,obj1){for(varkeyinobj0){if(hasOwnProperty.call(obj0,key)){if(!(keyinobj1)){returnfalse;}}}for(varkeyinobj1){if(hasOwnProperty.call(obj1,key)){if(obj0[key]!==obj1[key]){returnfalse;}}}returntrue;}functionparseEvents(rawEvents,sourceId,calendar,allowOpenRange){vareventStore=createEmptyEventStore();for(var_i=0,rawEvents_1=rawEvents;_i<rawEvents_1.length;_i++){varrawEvent=rawEvents_1[_i];vartuple=parseEvent(rawEvent,sourceId,calendar,allowOpenRange);if(tuple){eventTupleToStore(tuple,eventStore);}}returneventStore;}functioneventTupleToStore(tuple,eventStore){if(eventStore===void0){eventStore=createEmptyEventStore();}eventStore.defs[tuple.def.defId]=tuple.def;if(tuple.instance){eventStore.instances[tuple.instance.instanceId]=tuple.instance;}returneventStore;}functionexpandRecurring(eventStore,framingRange,calendar){vardateEnv=calendar.dateEnv;vardefs=eventStore.defs,instances=eventStore.instances;// remove existing recurring instancesinstances=filterHash(instances,function(instance){return!defs[instance.defId].recurringDef;});for(vardefIdindefs){vardef=defs[defId];if(def.recurringDef){varduration=def.recurringDef.duration;if(!duration){duration=def.allDay?calendar.defaultAllDayEventDuration:calendar.defaultTimedEventDuration;}varstarts=expandRecurringRanges(def,duration,framingRange,calendar.dateEnv,calendar.pluginSystem.hooks.recurringTypes);for(var_i=0,starts_1=starts;_i<starts_1.length;_i++){varstart=starts_1[_i];varinstance=createEventInstance(defId,{start:start,end:dateEnv.add(start,duration)});instances[instance.instanceId]=instance;}}}return{defs:defs,instances:instances};}// 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?functiongetRelevantEvents(eventStore,instanceId){varinstance=eventStore.instances[instanceId];if(instance){vardef_1=eventStore.defs[instance.defId];// get events/instances with same groupvarnewStore=filterEventStoreDefs(eventStore,function(lookDef){returnisEventDefsGrouped(def_1,lookDef);});// add the original// TODO: wish we could use eventTupleToStore or something like itnewStore.defs[def_1.defId]=def_1;newStore.instances[instance.instanceId]=instance;returnnewStore;}returncreateEmptyEventStore();}functionisEventDefsGrouped(def0,def1){returnBoolean(def0.groupId&&def0.groupId===def1.groupId);}functiontransformRawEvents(rawEvents,eventSource,calendar){varcalEachTransform=calendar.opt('eventDataTransform');varsourceEachTransform=eventSource?eventSource.eventDataTransform:null;if(sourceEachTransform){rawEvents=transformEachRawEvent(rawEvents,sourceEachTransform);}if(calEachTransform){rawEvents=transformEachRawEvent(rawEvents,calEachTransform);}returnrawEvents;}functiontransformEachRawEvent(rawEvents,func){varrefinedEvents;if(!func){refinedEvents=rawEvents;}else{refinedEvents=[];for(var_i=0,rawEvents_2=rawEvents;_i<rawEvents_2.length;_i++){varrawEvent=rawEvents_2[_i];varrefinedEvent=func(rawEvent);if(refinedEvent){refinedEvents.push(refinedEvent);}elseif(refinedEvent==null){refinedEvents.push(rawEvent);}// if a different falsy value, do nothing}}returnrefinedEvents;}functioncreateEmptyEventStore(){return{defs:{},instances:{}};}functionmergeEventStores(store0,store1){return{defs:__assign({},store0.defs,store1.defs),instances:__assign({},store0.instances,store1.instances)};}functionfilterEventStoreDefs(eventStore,filterFunc){vardefs=filterHash(eventStore.defs,filterFunc);varinstances=filterHash(eventStore.instances,function(instance){returndefs[instance.defId];// still exists?});return{defs:defs,instances:instances};}functionparseRange(input,dateEnv){varstart=null;varend=null;if(input.start){start=dateEnv.createMarker(input.start);}if(input.end){end=dateEnv.createMarker(input.end);}if(!start&&!end){returnnull;}if(start&&end&&end<start){returnnull;}return{start:start,end:end};}// SIDE-EFFECT: will mutate ranges.// Will return a new array result.functioninvertRanges(ranges,constraintRange){varinvertedRanges=[];varstart=constraintRange.start;// the end of the previous range. the start of the new rangevari;vardateRange;// ranges need to be in order. required for our date-walking algorithmranges.sort(compareRanges);for(i=0;i<ranges.length;i++){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: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:start,end:constraintRange.end});}returninvertedRanges;}functioncompareRanges(range0,range1){returnrange0.start.valueOf()-range1.start.valueOf();// earlier ranges go first}functionintersectRanges(range0,range1){varstart=range0.start;varend=range0.end;varnewRange=null;if(range1.start!==null){if(start===null){start=range1.start;}else{start=newDate(Math.max(start.valueOf(),range1.start.valueOf()));}}if(range1.end!=null){if(end===null){end=range1.end;}else{end=newDate(Math.min(end.valueOf(),range1.end.valueOf()));}}if(start===null||end===null||start<end){newRange={start:start,end:end};}returnnewRange;}functionrangesEqual(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());}functionrangesIntersect(range0,range1){return(range0.end===null||range1.start===null||range0.end>range1.start)&&(range0.start===null||range1.end===null||range0.start<range1.end);}functionrangeContainsRange(outerRange,innerRange){return(outerRange.start===null||(innerRange.start!==null&&innerRange.start>=outerRange.start))&&(outerRange.end===null||(innerRange.end!==null&&innerRange.end<=outerRange.end));}functionrangeContainsMarker(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).functionconstrainMarkerToRange(date,range){if(range.start!=null&&date<range.start){returnrange.start;}if(range.end!=null&&date>=range.end){returnnewDate(range.end.valueOf()-1);}returndate;}functionremoveExact(array,exactVal){varremoveCnt=0;vari=0;while(i<array.length){if(array[i]===exactVal){array.splice(i,1);removeCnt++;}else{i++;}}returnremoveCnt;}functionisArraysEqual(a0,a1){varlen=a0.length;vari;if(len!==a1.length){// not array? or not same length?returnfalse;}for(i=0;i<len;i++){if(a0[i]!==a1[i]){returnfalse;}}returntrue;}functionmemoize(workerFunc){varargs;varres;returnfunction(){if(!args||!isArraysEqual(args,arguments)){args=arguments;res=workerFunc.apply(this,arguments);}returnres;};}/* always executes the workerFunc, but if the result is equal to the previous result, return the previous result instead. */functionmemoizeOutput(workerFunc,equalityFunc){varcachedRes=null;returnfunction(){varnewRes=workerFunc.apply(this,arguments);if(cachedRes===null||!(cachedRes===newRes||equalityFunc(cachedRes,newRes))){cachedRes=newRes;}returncachedRes;};}varEXTENDED_SETTINGS_AND_SEVERITIES={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0};varSTANDARD_DATE_PROP_SEVERITIES={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1};varMERIDIEM_RE=/\s*([ap])\.?m\.?/i;// eats up leading spaces toovarCOMMA_RE=/,/g;// we need re for globalnessvarMULTI_SPACE_RE=/\s+/g;varLTR_RE=/\u200e/g;// control charactervarUTC_RE=/UTC|GMT/;varNativeFormatter=/** @class */(function(){functionNativeFormatter(formatSettings){varstandardDateProps={};varextendedSettings={};varseverity=0;for(varname_1informatSettings){if(name_1inEXTENDED_SETTINGS_AND_SEVERITIES){extendedSettings[name_1]=formatSettings[name_1];severity=Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1],severity);}else{standardDateProps[name_1]=formatSettings[name_1];if(name_1inSTANDARD_DATE_PROP_SEVERITIES){severity=Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1],severity);}}}this.standardDateProps=standardDateProps;this.extendedSettings=extendedSettings;this.severity=severity;this.buildFormattingFunc=memoize(buildFormattingFunc);}NativeFormatter.prototype.format=function(date,context){returnthis.buildFormattingFunc(this.standardDateProps,this.extendedSettings,context)(date);};NativeFormatter.prototype.formatRange=function(start,end,context){var_a=this,standardDateProps=_a.standardDateProps,extendedSettings=_a.extendedSettings;vardiffSeverity=computeMarkerDiffSeverity(start.marker,end.marker,context.calendarSystem);if(!diffSeverity){returnthis.format(start,context);}varbiggestUnitForPartial=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}varfull0=this.format(start,context);varfull1=this.format(end,context);if(full0===full1){returnfull0;}varpartialDateProps=computePartialFormattingOptions(standardDateProps,biggestUnitForPartial);varpartialFormattingFunc=buildFormattingFunc(partialDateProps,extendedSettings,context);varpartial0=partialFormattingFunc(start);varpartial1=partialFormattingFunc(end);varinsertion=findCommonInsertion(full0,partial0,full1,partial1);varseparator=extendedSettings.separator||'';if(insertion){returninsertion.before+partial0+separator+partial1+insertion.after;}returnfull0+separator+full1;};NativeFormatter.prototype.getLargestUnit=function(){switch(this.severity){case7:case6:case5:return'year';case4:return'month';case3:return'week';default:return'day';}};returnNativeFormatter;}());functionbuildFormattingFunc(standardDateProps,extendedSettings,context){varstandardDatePropCnt=Object.keys(standardDateProps).length;if(standardDatePropCnt===1&&standardDateProps.timeZoneName==='short'){returnfunction(date){returnformatTimeZoneOffset(date.timeZoneOffset);};}if(standardDatePropCnt===0&&extendedSettings.week){returnfunction(date){returnformatWeekNumber(context.computeWeekNumber(date.marker),context.weekLabel,context.locale,extendedSettings.week);};}returnbuildNativeFormattingFunc(standardDateProps,extendedSettings,context);}functionbuildNativeFormattingFunc(standardDateProps,extendedSettings,context){standardDateProps=__assign({},standardDateProps);// copyextendedSettings=__assign({},extendedSettings);// copysanitizeSettings(standardDateProps,extendedSettings);standardDateProps.timeZone='UTC';// we leverage the only guaranteed timeZone for our UTC markersvarnormalFormat=newIntl.DateTimeFormat(context.locale.codes,standardDateProps);varzeroFormat;// needed?if(extendedSettings.omitZeroMinute){varzeroProps=__assign({},standardDateProps);deletezeroProps.minute;// seconds and ms were already considered in sanitizeSettingszeroFormat=newIntl.DateTimeFormat(context.locale.codes,zeroProps);}returnfunction(date){varmarker=date.marker;varformat;if(zeroFormat&&!marker.getUTCMinutes()){format=zeroFormat;}else{format=normalFormat;}vars=format.format(marker);returnpostProcess(s,date,standardDateProps,extendedSettings,context);};}functionsanitizeSettings(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 namesif(standardDateProps.timeZoneName==='long'){standardDateProps.timeZoneName='short';}// if requesting to display seconds, MUST display minutesif(extendedSettings.omitZeroMinute&&(standardDateProps.second||standardDateProps.millisecond)){deleteextendedSettings.omitZeroMinute;}}functionpostProcess(s,date,standardDateProps,extendedSettings,context){s=s.replace(LTR_RE,'');// remove left-to-right control chars. do first. good for other regexesif(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 spacesif(extendedSettings.meridiem===false){s=s.replace(MERIDIEM_RE,'').trim();}elseif(extendedSettings.meridiem==='narrow'){// a/ps=s.replace(MERIDIEM_RE,function(m0,m1){returnm1.toLocaleLowerCase();});}elseif(extendedSettings.meridiem==='short'){// am/pms=s.replace(MERIDIEM_RE,function(m0,m1){returnm1.toLocaleLowerCase()+'m';});}elseif(extendedSettings.meridiem==='lowercase'){// other meridiem transformers already converted to lowercases=s.replace(MERIDIEM_RE,function(m0){returnm0.toLocaleLowerCase();});}s=s.replace(MULTI_SPACE_RE,' ');s=s.trim();returns;}functioninjectTzoStr(s,tzoStr){varreplaced=false;s=s.replace(UTC_RE,function(){replaced=true;returntzoStr;});// IE11 doesn't include UTC/GMT in the original string, so append to endif(!replaced){s+=' '+tzoStr;}returns;}functionformatWeekNumber(num,weekLabel,locale,display){varparts=[];if(display==='narrow'){parts.push(weekLabel);}elseif(display==='short'){parts.push(weekLabel,' ');}// otherwise, considered 'numeric'parts.push(locale.simpleNumberFormat.format(num));if(locale.options.isRtl){// TODO: use control characters instead?parts.reverse();}returnparts.join('');}// Range Formatting Utils// 0 = exactly the same// 1 = different by time// and biggerfunctioncomputeMarkerDiffSeverity(d0,d1,ca){if(ca.getMarkerYear(d0)!==ca.getMarkerYear(d1)){return5;}if(ca.getMarkerMonth(d0)!==ca.getMarkerMonth(d1)){return4;}if(ca.getMarkerDay(d0)!==ca.getMarkerDay(d1)){return2;}if(timeAsMs(d0)!==timeAsMs(d1)){return1;}return0;}functioncomputePartialFormattingOptions(options,biggestUnit){varpartialOptions={};for(varname_2inoptions){if(!(name_2inSTANDARD_DATE_PROP_SEVERITIES)||// not a date part prop (like timeZone)STANDARD_DATE_PROP_SEVERITIES[name_2]<=biggestUnit){partialOptions[name_2]=options[name_2];}}returnpartialOptions;}functionfindCommonInsertion(full0,partial0,full1,partial1){vari0=0;while(i0<full0.length){varfound0=full0.indexOf(partial0,i0);if(found0===-1){break;}varbefore0=full0.substr(0,found0);i0=found0+partial0.length;varafter0=full0.substr(i0);vari1=0;while(i1<full1.length){varfound1=full1.indexOf(partial1,i1);if(found1===-1){break;}varbefore1=full1.substr(0,found1);i1=found1+partial1.length;varafter1=full1.substr(i1);if(before0===before1&&after0===after1){return{before:before0,after:after0};}}}returnnull;}/* TODO: fix the terminology of "formatter" vs "formatting func" *//*Atthetimeofinstantiation,thisobjectdoesnotknowwhichcmd-formattingsystemitwilluse.Itreceivesthisatthetimeofformatting,asasetting.*/ var CmdFormatter = /**@class*/ (function () { function CmdFormatter(cmdStr, separator) { this.cmdStr = cmdStr; this.separator = separator; } CmdFormatter.prototype.format = function (date, context) { return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator)); }; CmdFormatter.prototype.formatRange = function (start, end, context) { return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator)); }; return CmdFormatter; }()); var FuncFormatter = /**@class*/ (function () { function FuncFormatter(func) { this.func = func; } FuncFormatter.prototype.format = function (date, context) { return this.func(createVerboseFormattingArg(date, null, context)); }; FuncFormatter.prototype.formatRange = function (start, end, context) { return this.func(createVerboseFormattingArg(start, end, context)); }; return FuncFormatter; }()); //FormatterObjectCreationfunctioncreateFormatter(input,defaultSeparator){if(typeofinput==='object'&&input){// non-null objectif(typeofdefaultSeparator==='string'){input=__assign({separator:defaultSeparator},input);}returnnewNativeFormatter(input);}elseif(typeofinput==='string'){returnnewCmdFormatter(input,defaultSeparator);}elseif(typeofinput==='function'){returnnewFuncFormatter(input);}}// String Utils// timeZoneOffset is in minutesfunctionbuildIsoString(marker,timeZoneOffset,stripZeroTime){if(stripZeroTime===void0){stripZeroTime=false;}vars=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 infoif(timeZoneOffset==null){s=s.replace('Z','');}elseif(timeZoneOffset!==0){s=s.replace('Z',formatTimeZoneOffset(timeZoneOffset,true));}// otherwise, its UTC-0 and we want to keep the Z}returns;}functionformatIsoTimeString(marker){returnpadStart(marker.getUTCHours(),2)+':'+padStart(marker.getUTCMinutes(),2)+':'+padStart(marker.getUTCSeconds(),2);}functionformatTimeZoneOffset(minutes,doIso){if(doIso===void0){doIso=false;}varsign=minutes<0?'-':'+';varabs=Math.abs(minutes);varhours=Math.floor(abs/60);varmins=Math.round(abs%60);if(doIso){returnsign+padStart(hours,2)+':'+padStart(mins,2);}else{return'GMT'+sign+hours+(mins?':'+padStart(mins,2):'');}}// Arg UtilsfunctioncreateVerboseFormattingArg(start,end,context,separator){varstartInfo=expandZonedMarker(start,context.calendarSystem);varendInfo=end?expandZonedMarker(end,context.calendarSystem):null;return{date:startInfo,start:startInfo,end:endInfo,timeZone:context.timeZone,localeCodes:context.locale.codes,separator:separator};}functionexpandZonedMarker(dateInfo,calendarSystem){vara=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]};}varEventSourceApi=/** @class */(function(){functionEventSourceApi(calendar,internalEventSource){this.calendar=calendar;this.internalEventSource=internalEventSource;}EventSourceApi.prototype.remove=function(){this.calendar.dispatch({type:'REMOVE_EVENT_SOURCE',sourceId:this.internalEventSource.sourceId});};EventSourceApi.prototype.refetch=function(){this.calendar.dispatch({type:'FETCH_EVENT_SOURCES',sourceIds:[this.internalEventSource.sourceId]});};Object.defineProperty(EventSourceApi.prototype,"id",{get:function(){returnthis.internalEventSource.publicId;},enumerable:true,configurable:true});Object.defineProperty(EventSourceApi.prototype,"url",{// only relevant to json-feed event sourcesget:function(){returnthis.internalEventSource.meta.url;},enumerable:true,configurable:true});returnEventSourceApi;}());varEventApi=/** @class */(function(){functionEventApi(calendar,def,instance){this._calendar=calendar;this._def=def;this._instance=instance||null;}/* TODO: make event struct more responsible for this */EventApi.prototype.setProp=function(name,val){var_a,_b;if(nameinDATE_PROPS);elseif(nameinNON_DATE_PROPS){if(typeofNON_DATE_PROPS[name]==='function'){val=NON_DATE_PROPS[name](val);}this.mutate({standardProps:(_a={},_a[name]=val,_a)});}elseif(nameinUNSCOPED_EVENT_UI_PROPS){varui=void0;if(typeofUNSCOPED_EVENT_UI_PROPS[name]==='function'){val=UNSCOPED_EVENT_UI_PROPS[name](val);}if(name==='color'){ui={backgroundColor:val,borderColor:val};}elseif(name==='editable'){ui={startEditable:val,durationEditable:val};}else{ui=(_b={},_b[name]=val,_b);}this.mutate({standardProps:{ui:ui}});}};EventApi.prototype.setExtendedProp=function(name,val){var_a;this.mutate({extendedProps:(_a={},_a[name]=val,_a)});};EventApi.prototype.setStart=function(startInput,options){if(options===void0){options={};}vardateEnv=this._calendar.dateEnv;varstart=dateEnv.createMarker(startInput);if(start&&this._instance){// TODO: warning if parsed badvarinstanceRange=this._instance.range;varstartDelta=diffDates(instanceRange.start,start,dateEnv,options.granularity);// what if parsed bad!?if(options.maintainDuration){this.mutate({datesDelta:startDelta});}else{this.mutate({startDelta:startDelta});}}};EventApi.prototype.setEnd=function(endInput,options){if(options===void0){options={};}vardateEnv=this._calendar.dateEnv;varend;if(endInput!=null){end=dateEnv.createMarker(endInput);if(!end){return;// TODO: warning if parsed bad}}if(this._instance){if(end){varendDelta=diffDates(this._instance.range.end,end,dateEnv,options.granularity);this.mutate({endDelta:endDelta});}else{this.mutate({standardProps:{hasEnd:false}});}}};EventApi.prototype.setDates=function(startInput,endInput,options){if(options===void0){options={};}vardateEnv=this._calendar.dateEnv;varstandardProps={allDay:options.allDay};varstart=dateEnv.createMarker(startInput);varend;if(!start){return;// TODO: warning if parsed bad}if(endInput!=null){end=dateEnv.createMarker(endInput);if(!end){// TODO: warning if parsed badreturn;}}if(this._instance){varinstanceRange=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);}varstartDelta=diffDates(instanceRange.start,start,dateEnv,options.granularity);if(end){varendDelta=diffDates(instanceRange.end,end,dateEnv,options.granularity);if(durationsEqual(startDelta,endDelta)){this.mutate({datesDelta:startDelta,standardProps:standardProps});}else{this.mutate({startDelta:startDelta,endDelta:endDelta,standardProps:standardProps});}}else{// means "clear the end"standardProps.hasEnd=false;this.mutate({datesDelta:startDelta,standardProps:standardProps});}}};EventApi.prototype.moveStart=function(deltaInput){vardelta=createDuration(deltaInput);if(delta){// TODO: warning if parsed badthis.mutate({startDelta:delta});}};EventApi.prototype.moveEnd=function(deltaInput){vardelta=createDuration(deltaInput);if(delta){// TODO: warning if parsed badthis.mutate({endDelta:delta});}};EventApi.prototype.moveDates=function(deltaInput){vardelta=createDuration(deltaInput);if(delta){// TODO: warning if parsed badthis.mutate({datesDelta:delta});}};EventApi.prototype.setAllDay=function(allDay,options){if(options===void0){options={};}varstandardProps={allDay:allDay};varmaintainDuration=options.maintainDuration;if(maintainDuration==null){maintainDuration=this._calendar.opt('allDayMaintainDuration');}if(this._def.allDay!==allDay){standardProps.hasEnd=maintainDuration;}this.mutate({standardProps:standardProps});};EventApi.prototype.formatRange=function(formatInput){vardateEnv=this._calendar.dateEnv;varinstance=this._instance;varformatter=createFormatter(formatInput,this._calendar.opt('defaultRangeSeparator'));if(this._def.hasEnd){returndateEnv.formatRange(instance.range.start,instance.range.end,formatter,{forcedStartTzo:instance.forcedStartTzo,forcedEndTzo:instance.forcedEndTzo});}else{returndateEnv.format(instance.range.start,formatter,{forcedTzo:instance.forcedStartTzo});}};EventApi.prototype.mutate=function(mutation){vardef=this._def;varinstance=this._instance;if(instance){this._calendar.dispatch({type:'MUTATE_EVENTS',instanceId:instance.instanceId,mutation:mutation,fromApi:true});vareventStore=this._calendar.state.eventStore;this._def=eventStore.defs[def.defId];this._instance=eventStore.instances[instance.instanceId];}};EventApi.prototype.remove=function(){this._calendar.dispatch({type:'REMOVE_EVENT_DEF',defId:this._def.defId});};Object.defineProperty(EventApi.prototype,"source",{get:function(){varsourceId=this._def.sourceId;if(sourceId){returnnewEventSourceApi(this._calendar,this._calendar.state.eventSources[sourceId]);}returnnull;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"start",{get:function(){returnthis._instance?this._calendar.dateEnv.toDate(this._instance.range.start):null;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"end",{get:function(){return(this._instance&&this._def.hasEnd)?this._calendar.dateEnv.toDate(this._instance.range.end):null;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"id",{// computable props that all access the def// TODO: find a TypeScript-compatible way to do this at scaleget:function(){returnthis._def.publicId;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"groupId",{get:function(){returnthis._def.groupId;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"allDay",{get:function(){returnthis._def.allDay;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"title",{get:function(){returnthis._def.title;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"url",{get:function(){returnthis._def.url;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"rendering",{get:function(){returnthis._def.rendering;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"startEditable",{get:function(){returnthis._def.ui.startEditable;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"durationEditable",{get:function(){returnthis._def.ui.durationEditable;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"constraint",{get:function(){returnthis._def.ui.constraints[0]||null;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"overlap",{get:function(){returnthis._def.ui.overlap;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"allow",{get:function(){returnthis._def.ui.allows[0]||null;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"backgroundColor",{get:function(){returnthis._def.ui.backgroundColor;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"borderColor",{get:function(){returnthis._def.ui.borderColor;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"textColor",{get:function(){returnthis._def.ui.textColor;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"classNames",{// NOTE: user can't modify these because Object.freeze was called in event-def parsingget:function(){returnthis._def.ui.classNames;},enumerable:true,configurable:true});Object.defineProperty(EventApi.prototype,"extendedProps",{get:function(){returnthis._def.extendedProps;},enumerable:true,configurable:true});returnEventApi;}());/* Specifying nextDayThreshold signals that all-day ranges should be sliced. */functionsliceEventStore(eventStore,eventUiBases,framingRange,nextDayThreshold){varinverseBgByGroupId={};varinverseBgByDefId={};vardefByGroupId={};varbgRanges=[];varfgRanges=[];vareventUis=compileEventUis(eventStore.defs,eventUiBases);for(vardefIdineventStore.defs){vardef=eventStore.defs[defId];if(def.rendering==='inverse-background'){if(def.groupId){inverseBgByGroupId[def.groupId]=[];if(!defByGroupId[def.groupId]){defByGroupId[def.groupId]=def;}}else{inverseBgByDefId[defId]=[];}}}for(varinstanceIdineventStore.instances){varinstance=eventStore.instances[instanceId];vardef=eventStore.defs[instance.defId];varui=eventUis[def.defId];varorigRange=instance.range;varnormalRange=(!def.allDay&&nextDayThreshold)?computeVisibleDayRange(origRange,nextDayThreshold):origRange;varslicedRange=intersectRanges(normalRange,framingRange);if(slicedRange){if(def.rendering==='inverse-background'){if(def.groupId){inverseBgByGroupId[def.groupId].push(slicedRange);}else{inverseBgByDefId[instance.defId].push(slicedRange);}}else{(def.rendering==='background'?bgRanges:fgRanges).push({def:def,ui:ui,instance:instance,range:slicedRange,isStart:normalRange.start&&normalRange.start.valueOf()===slicedRange.start.valueOf(),isEnd:normalRange.end&&normalRange.end.valueOf()===slicedRange.end.valueOf()});}}}for(vargroupIdininverseBgByGroupId){// BY GROUPvarranges=inverseBgByGroupId[groupId];varinvertedRanges=invertRanges(ranges,framingRange);for(var_i=0,invertedRanges_1=invertedRanges;_i<invertedRanges_1.length;_i++){varinvertedRange=invertedRanges_1[_i];vardef=defByGroupId[groupId];varui=eventUis[def.defId];bgRanges.push({def:def,ui:ui,instance:null,range:invertedRange,isStart:false,isEnd:false});}}for(vardefIdininverseBgByDefId){varranges=inverseBgByDefId[defId];varinvertedRanges=invertRanges(ranges,framingRange);for(var_a=0,invertedRanges_2=invertedRanges;_a<invertedRanges_2.length;_a++){varinvertedRange=invertedRanges_2[_a];bgRanges.push({def:eventStore.defs[defId],ui:eventUis[defId],instance:null,range:invertedRange,isStart:false,isEnd:false});}}return{bg:bgRanges,fg:fgRanges};}functionhasBgRendering(def){returndef.rendering==='background'||def.rendering==='inverse-background';}functionfilterSegsViaEls(context,segs,isMirror){varcalendar=context.calendar,view=context.view;if(calendar.hasPublicHandlers('eventRender')){segs=segs.filter(function(seg){varcustom=calendar.publiclyTrigger('eventRender',[{event:newEventApi(calendar,seg.eventRange.def,seg.eventRange.instance),isMirror:isMirror,isStart:seg.isStart,isEnd:seg.isEnd,// TODO: include seg.range once all components consistently generate itel:seg.el,view:view}]);if(custom===false){// means don't render at allreturnfalse;}elseif(custom&&custom!==true){seg.el=custom;}returntrue;});}for(var_i=0,segs_1=segs;_i<segs_1.length;_i++){varseg=segs_1[_i];setElSeg(seg.el,seg);}returnsegs;}functionsetElSeg(el,seg){el.fcSeg=seg;}functiongetElSeg(el){returnel.fcSeg||null;}// event ui computationfunctioncompileEventUis(eventDefs,eventUiBases){returnmapHash(eventDefs,function(eventDef){returncompileEventUi(eventDef,eventUiBases);});}functioncompileEventUi(eventDef,eventUiBases){varuis=[];if(eventUiBases['']){uis.push(eventUiBases['']);}if(eventUiBases[eventDef.defId]){uis.push(eventUiBases[eventDef.defId]);}uis.push(eventDef.ui);returncombineEventUis(uis);}// triggersfunctiontriggerRenderedSegs(context,segs,isMirrors){varcalendar=context.calendar,view=context.view;if(calendar.hasPublicHandlers('eventPositioned')){for(var_i=0,segs_2=segs;_i<segs_2.length;_i++){varseg=segs_2[_i];calendar.publiclyTriggerAfterSizing('eventPositioned',[{event:newEventApi(calendar,seg.eventRange.def,seg.eventRange.instance),isMirror:isMirrors,isStart:seg.isStart,isEnd:seg.isEnd,el:seg.el,view:view}]);}}if(!calendar.state.loadingLevel){// avoid initial empty state while pendingcalendar.afterSizingTriggers._eventsPositioned=[null];// fire once}}functiontriggerWillRemoveSegs(context,segs,isMirrors){varcalendar=context.calendar,view=context.view;for(var_i=0,segs_3=segs;_i<segs_3.length;_i++){varseg=segs_3[_i];calendar.trigger('eventElRemove',seg.el);}if(calendar.hasPublicHandlers('eventDestroy')){for(var_a=0,segs_4=segs;_a<segs_4.length;_a++){varseg=segs_4[_a];calendar.publiclyTrigger('eventDestroy',[{event:newEventApi(calendar,seg.eventRange.def,seg.eventRange.instance),isMirror:isMirrors,el:seg.el,view:view}]);}}}// is-interactablefunctioncomputeEventDraggable(context,eventDef,eventUi){varcalendar=context.calendar,view=context.view;vartransformers=calendar.pluginSystem.hooks.isDraggableTransformers;varval=eventUi.startEditable;for(var_i=0,transformers_1=transformers;_i<transformers_1.length;_i++){vartransformer=transformers_1[_i];val=transformer(val,eventDef,eventUi,view);}returnval;}functioncomputeEventStartResizable(context,eventDef,eventUi){returneventUi.durationEditable&&context.options.eventResizableFromStart;}functioncomputeEventEndResizable(context,eventDef,eventUi){returneventUi.durationEditable;}// applies the mutation to ALL defs/instances within the event storefunctionapplyMutationToEventStore(eventStore,eventConfigBase,mutation,calendar){vareventConfigs=compileEventUis(eventStore.defs,eventConfigBase);vardest=createEmptyEventStore();for(vardefIdineventStore.defs){vardef=eventStore.defs[defId];dest.defs[defId]=applyMutationToEventDef(def,eventConfigs[defId],mutation,calendar.pluginSystem.hooks.eventDefMutationAppliers,calendar);}for(varinstanceIdineventStore.instances){varinstance=eventStore.instances[instanceId];vardef=dest.defs[instance.defId];// important to grab the newly modified defdest.instances[instanceId]=applyMutationToEventInstance(instance,def,eventConfigs[instance.defId],mutation,calendar);}returndest;}functionapplyMutationToEventDef(eventDef,eventConfig,mutation,appliers,calendar){varstandardProps=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 endif(standardProps.hasEnd==null&&eventConfig.durationEditable&&(mutation.startDelta||mutation.endDelta)){standardProps.hasEnd=true;// TODO: is this mutation okay?}varcopy=__assign({},eventDef,standardProps,{ui:__assign({},eventDef.ui,standardProps.ui)});if(mutation.extendedProps){copy.extendedProps=__assign({},copy.extendedProps,mutation.extendedProps);}for(var_i=0,appliers_1=appliers;_i<appliers_1.length;_i++){varapplier=appliers_1[_i];applier(copy,mutation,calendar);}if(!copy.hasEnd&&calendar.opt('forceEventDuration')){copy.hasEnd=true;}returncopy;}functionapplyMutationToEventInstance(eventInstance,eventDef,// must first be modified by applyMutationToEventDefeventConfig,mutation,calendar){vardateEnv=calendar.dateEnv;varforceAllDay=mutation.standardProps&&mutation.standardProps.allDay===true;varclearEnd=mutation.standardProps&&mutation.standardProps.hasEnd===false;varcopy=__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:calendar.getDefaultEventEnd(eventDef.allDay,copy.range.start)};}// 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 durationsif(copy.range.end<copy.range.start){copy.range.end=calendar.getDefaultEventEnd(eventDef.allDay,copy.range.start);}returncopy;}functionreduceEventStore(eventStore,action,eventSources,dateProfile,calendar){switch(action.type){case'RECEIVE_EVENTS':// rawreturnreceiveRawEvents(eventStore,eventSources[action.sourceId],action.fetchId,action.fetchRange,action.rawEvents,calendar);case'ADD_EVENTS':// already parsed, but not expandedreturnaddEvent(eventStore,action.eventStore,// new onesdateProfile?dateProfile.activeRange:null,calendar);case'MERGE_EVENTS':// already parsed and expandedreturnmergeEventStores(eventStore,action.eventStore);case'PREV':// TODO: how do we track all actions that affect dateProfile :(case'NEXT':case'SET_DATE':case'SET_VIEW_TYPE':if(dateProfile){returnexpandRecurring(eventStore,dateProfile.activeRange,calendar);}else{returneventStore;}case'CHANGE_TIMEZONE':returnrezoneDates(eventStore,action.oldDateEnv,calendar.dateEnv);case'MUTATE_EVENTS':returnapplyMutationToRelated(eventStore,action.instanceId,action.mutation,action.fromApi,calendar);case'REMOVE_EVENT_INSTANCES':returnexcludeInstances(eventStore,action.instances);case'REMOVE_EVENT_DEF':returnfilterEventStoreDefs(eventStore,function(eventDef){returneventDef.defId!==action.defId;});case'REMOVE_EVENT_SOURCE':returnexcludeEventsBySourceId(eventStore,action.sourceId);case'REMOVE_ALL_EVENT_SOURCES':returnfilterEventStoreDefs(eventStore,function(eventDef){return!eventDef.sourceId;// only keep events with no source id});case'REMOVE_ALL_EVENTS':returncreateEmptyEventStore();case'RESET_EVENTS':return{defs:eventStore.defs,instances:eventStore.instances};default:returneventStore;}}functionreceiveRawEvents(eventStore,eventSource,fetchId,fetchRange,rawEvents,calendar){if(eventSource&&// not already removedfetchId===eventSource.latestFetchId// TODO: wish this logic was always in event-sources){varsubset=parseEvents(transformRawEvents(rawEvents,eventSource,calendar),eventSource.sourceId,calendar);if(fetchRange){subset=expandRecurring(subset,fetchRange,calendar);}returnmergeEventStores(excludeEventsBySourceId(eventStore,eventSource.sourceId),subset);}returneventStore;}functionaddEvent(eventStore,subset,expandRange,calendar){if(expandRange){subset=expandRecurring(subset,expandRange,calendar);}returnmergeEventStores(eventStore,subset);}functionrezoneDates(eventStore,oldDateEnv,newDateEnv){vardefs=eventStore.defs;varinstances=mapHash(eventStore.instances,function(instance){vardef=defs[instance.defId];if(def.allDay||def.recurringDef){returninstance;// isn't dependent on timezone}else{return__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:defs,instances:instances};}functionapplyMutationToRelated(eventStore,instanceId,mutation,fromApi,calendar){varrelevant=getRelevantEvents(eventStore,instanceId);vareventConfigBase=fromApi?{'':{startEditable:true,durationEditable:true,constraints:[],overlap:null,allows:[],backgroundColor:'',borderColor:'',textColor:'',classNames:[]}}:calendar.eventUiBases;relevant=applyMutationToEventStore(relevant,eventConfigBase,mutation,calendar);returnmergeEventStores(eventStore,relevant);}functionexcludeEventsBySourceId(eventStore,sourceId){returnfilterEventStoreDefs(eventStore,function(eventDef){returneventDef.sourceId!==sourceId;});}// QUESTION: why not just return instances? do a general object-property-exclusion utilfunctionexcludeInstances(eventStore,removals){return{defs:eventStore.defs,instances:filterHash(eventStore.instances,function(instance){return!removals[instance.instanceId];})};}// high-level segmenting-aware tester functions// ------------------------------------------------------------------------------------------------------------------------functionisInteractionValid(interaction,calendar){returnisNewPropsValid({eventDrag:interaction},calendar);// HACK: the eventDrag props is used for ALL interactions}functionisDateSelectionValid(dateSelection,calendar){returnisNewPropsValid({dateSelection:dateSelection},calendar);}functionisNewPropsValid(newProps,calendar){varview=calendar.view;varprops=__assign({businessHours:view?view.props.businessHours:createEmptyEventStore(),dateSelection:'',eventStore:calendar.state.eventStore,eventUiBases:calendar.eventUiBases,eventSelection:'',eventDrag:null,eventResize:null},newProps);return(calendar.pluginSystem.hooks.isPropsValid||isPropsValid)(props,calendar);}functionisPropsValid(state,calendar,dateSpanMeta,filterConfig){if(dateSpanMeta===void0){dateSpanMeta={};}if(state.eventDrag&&!isInteractionPropsValid(state,calendar,dateSpanMeta,filterConfig)){returnfalse;}if(state.dateSelection&&!isDateSelectionPropsValid(state,calendar,dateSpanMeta,filterConfig)){returnfalse;}returntrue;}// Moving Event Validation// ------------------------------------------------------------------------------------------------------------------------functionisInteractionPropsValid(state,calendar,dateSpanMeta,filterConfig){varinteraction=state.eventDrag;// HACK: the eventDrag props is used for ALL interactionsvarsubjectEventStore=interaction.mutatedEvents;varsubjectDefs=subjectEventStore.defs;varsubjectInstances=subjectEventStore.instances;varsubjectConfigs=compileEventUis(subjectDefs,interaction.isEvent?state.eventUiBases:{'':calendar.selectionConfig}// if not a real event, validate as a selection);if(filterConfig){subjectConfigs=mapHash(subjectConfigs,filterConfig);}varotherEventStore=excludeInstances(state.eventStore,interaction.affectedEvents.instances);// exclude the subject events. TODO: exclude defs too?varotherDefs=otherEventStore.defs;varotherInstances=otherEventStore.instances;varotherConfigs=compileEventUis(otherDefs,state.eventUiBases);for(varsubjectInstanceIdinsubjectInstances){varsubjectInstance=subjectInstances[subjectInstanceId];varsubjectRange=subjectInstance.range;varsubjectConfig=subjectConfigs[subjectInstance.defId];varsubjectDef=subjectDefs[subjectInstance.defId];// constraintif(!allConstraintsPass(subjectConfig.constraints,subjectRange,otherEventStore,state.businessHours,calendar)){returnfalse;}// overlapvaroverlapFunc=calendar.opt('eventOverlap');if(typeofoverlapFunc!=='function'){overlapFunc=null;}for(varotherInstanceIdinotherInstances){varotherInstance=otherInstances[otherInstanceId];// intersect! evaluateif(rangesIntersect(subjectRange,otherInstance.range)){varotherOverlap=otherConfigs[otherInstance.defId].overlap;// consider the other event's overlap. only do this if the subject event is a "real" eventif(otherOverlap===false&&interaction.isEvent){returnfalse;}if(subjectConfig.overlap===false){returnfalse;}if(overlapFunc&&!overlapFunc(newEventApi(calendar,otherDefs[otherInstance.defId],otherInstance),// still eventnewEventApi(calendar,subjectDef,subjectInstance)// moving event)){returnfalse;}}}// allow (a function)varcalendarEventStore=calendar.state.eventStore;// need global-to-calendar, not local to component (splittable)statefor(var_i=0,_a=subjectConfig.allows;_i<_a.length;_i++){varsubjectAllow=_a[_i];varsubjectDateSpan=__assign({},dateSpanMeta,{range:subjectInstance.range,allDay:subjectDef.allDay});varorigDef=calendarEventStore.defs[subjectDef.defId];varorigInstance=calendarEventStore.instances[subjectInstanceId];vareventApi=void0;if(origDef){// was previously in the calendareventApi=newEventApi(calendar,origDef,origInstance);}else{// was an external eventeventApi=newEventApi(calendar,subjectDef);// no instance, because had no dates}if(!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan),eventApi)){returnfalse;}}}returntrue;}// Date Selection Validation// ------------------------------------------------------------------------------------------------------------------------functionisDateSelectionPropsValid(state,calendar,dateSpanMeta,filterConfig){varrelevantEventStore=state.eventStore;varrelevantDefs=relevantEventStore.defs;varrelevantInstances=relevantEventStore.instances;varselection=state.dateSelection;varselectionRange=selection.range;varselectionConfig=calendar.selectionConfig;if(filterConfig){selectionConfig=filterConfig(selectionConfig);}// constraintif(!allConstraintsPass(selectionConfig.constraints,selectionRange,relevantEventStore,state.businessHours,calendar)){returnfalse;}// overlapvaroverlapFunc=calendar.opt('selectOverlap');if(typeofoverlapFunc!=='function'){overlapFunc=null;}for(varrelevantInstanceIdinrelevantInstances){varrelevantInstance=relevantInstances[relevantInstanceId];// intersect! evaluateif(rangesIntersect(selectionRange,relevantInstance.range)){if(selectionConfig.overlap===false){returnfalse;}if(overlapFunc&&!overlapFunc(newEventApi(calendar,relevantDefs[relevantInstance.defId],relevantInstance))){returnfalse;}}}// allow (a function)for(var_i=0,_a=selectionConfig.allows;_i<_a.length;_i++){varselectionAllow=_a[_i];varfullDateSpan=__assign({},dateSpanMeta,selection);if(!selectionAllow(calendar.buildDateSpanApi(fullDateSpan),null)){returnfalse;}}returntrue;}// Constraint Utils// ------------------------------------------------------------------------------------------------------------------------functionallConstraintsPass(constraints,subjectRange,otherEventStore,businessHoursUnexpanded,calendar){for(var_i=0,constraints_1=constraints;_i<constraints_1.length;_i++){varconstraint=constraints_1[_i];if(!anyRangesContainRange(constraintToRanges(constraint,subjectRange,otherEventStore,businessHoursUnexpanded,calendar),subjectRange)){returnfalse;}}returntrue;}functionconstraintToRanges(constraint,subjectRange,// for expanding a recurring constraint, or expanding business hoursotherEventStore,// for if constraint is an even group IDbusinessHoursUnexpanded,// for if constraint is 'businessHours'calendar// for expanding businesshours){if(constraint==='businessHours'){returneventStoreToRanges(expandRecurring(businessHoursUnexpanded,subjectRange,calendar));}elseif(typeofconstraint==='string'){// an group IDreturneventStoreToRanges(filterEventStoreDefs(otherEventStore,function(eventDef){returneventDef.groupId===constraint;}));}elseif(typeofconstraint==='object'&&constraint){// non-null objectreturneventStoreToRanges(expandRecurring(constraint,subjectRange,calendar));}return[];// if it's false}// TODO: move to event-store file?functioneventStoreToRanges(eventStore){varinstances=eventStore.instances;varranges=[];for(varinstanceIdininstances){ranges.push(instances[instanceId].range);}returnranges;}// TODO: move to geom file?functionanyRangesContainRange(outerRanges,innerRange){for(var_i=0,outerRanges_1=outerRanges;_i<outerRanges_1.length;_i++){varouterRange=outerRanges_1[_i];if(rangeContainsRange(outerRange,innerRange)){returntrue;}}returnfalse;}// Parsing// ------------------------------------------------------------------------------------------------------------------------functionnormalizeConstraint(input,calendar){if(Array.isArray(input)){returnparseEvents(input,'',calendar,true);// allowOpenRange=true}elseif(typeofinput==='object'&&input){// non-null objectreturnparseEvents([input],'',calendar,true);// allowOpenRange=true}elseif(input!=null){returnString(input);}else{returnnull;}}functionhtmlEscape(s){return(s+'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/'/g,''').replace(/"/g,'"').replace(/\n/g,'<br />');}// Given a hash of CSS properties, returns a string of CSS.// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.functioncssToStr(cssProps){varstatements=[];for(varname_1incssProps){varval=cssProps[name_1];if(val!=null&&val!==''){statements.push(name_1+':'+val);}}returnstatements.join(';');}// Given an object hash of HTML attribute names to values,// generates a string that can be injected between < > in HTMLfunctionattrsToStr(attrs){varparts=[];for(varname_2inattrs){varval=attrs[name_2];if(val!=null){parts.push(name_2+'="'+htmlEscape(val)+'"');}}returnparts.join(' ');}functionparseClassName(raw){if(Array.isArray(raw)){returnraw;}elseif(typeofraw==='string'){returnraw.split(/\s+/);}else{return[];}}varUNSCOPED_EVENT_UI_PROPS={editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:null,overlap:null,allow:null,className:parseClassName,classNames:parseClassName,color:String,backgroundColor:String,borderColor:String,textColor:String};functionprocessUnscopedUiProps(rawProps,calendar,leftovers){varprops=refineProps(rawProps,UNSCOPED_EVENT_UI_PROPS,{},leftovers);varconstraint=normalizeConstraint(props.constraint,calendar);return{startEditable:props.startEditable!=null?props.startEditable:props.editable,durationEditable:props.durationEditable!=null?props.durationEditable:props.editable,constraints:constraint!=null?[constraint]:[],overlap:props.overlap,allows:props.allow!=null?[props.allow]:[],backgroundColor:props.backgroundColor||props.color,borderColor:props.borderColor||props.color,textColor:props.textColor,classNames:props.classNames.concat(props.className)};}functionprocessScopedUiProps(prefix,rawScoped,calendar,leftovers){varrawUnscoped={};varwasFound={};for(varkeyinUNSCOPED_EVENT_UI_PROPS){varscopedKey=prefix+capitaliseFirstLetter(key);rawUnscoped[key]=rawScoped[scopedKey];wasFound[scopedKey]=true;}if(prefix==='event'){rawUnscoped.editable=rawScoped.editable;// special case. there is no 'eventEditable', just 'editable'}if(leftovers){for(varkeyinrawScoped){if(!wasFound[key]){leftovers[key]=rawScoped[key];}}}returnprocessUnscopedUiProps(rawUnscoped,calendar);}varEMPTY_EVENT_UI={startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:'',borderColor:'',textColor:'',classNames:[]};// prevent against problems with <2 args!functioncombineEventUis(uis){returnuis.reduce(combineTwoEventUis,EMPTY_EVENT_UI);}functioncombineTwoEventUis(item0,item1){return{startEditable:item1.startEditable!=null?item1.startEditable:item0.startEditable,durationEditable:item1.durationEditable!=null?item1.durationEditable:item0.durationEditable,constraints:item0.constraints.concat(item1.constraints),overlap:typeofitem1.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)};}varNON_DATE_PROPS={id:String,groupId:String,title:String,url:String,rendering:String,extendedProps:null};varDATE_PROPS={start:null,date:null,end:null,allDay:null};varuid=0;functionparseEvent(raw,sourceId,calendar,allowOpenRange){varallDayDefault=computeIsAllDayDefault(sourceId,calendar);varleftovers0={};varrecurringRes=parseRecurring(raw,// raw, but with single-event stuff stripped outallDayDefault,calendar.dateEnv,calendar.pluginSystem.hooks.recurringTypes,leftovers0// will populate with non-recurring props);if(recurringRes){vardef=parseEventDef(leftovers0,sourceId,recurringRes.allDay,Boolean(recurringRes.duration),calendar);def.recurringDef={typeId:recurringRes.typeId,typeData:recurringRes.typeData,duration:recurringRes.duration};return{def:def,instance:null};}else{varleftovers1={};varsingleRes=parseSingle(raw,allDayDefault,calendar,leftovers1,allowOpenRange);if(singleRes){vardef=parseEventDef(leftovers1,sourceId,singleRes.allDay,singleRes.hasEnd,calendar);varinstance=createEventInstance(def.defId,singleRes.range,singleRes.forcedStartTzo,singleRes.forcedEndTzo);return{def:def,instance:instance};}}returnnull;}/* Will NOT populate extendedProps with the leftover properties. Will NOT populate date-related props. The EventNonDateInput has been normalized (id => publicId, etc). */functionparseEventDef(raw,sourceId,allDay,hasEnd,calendar){varleftovers={};vardef=pluckNonDateProps(raw,calendar,leftovers);def.defId=String(uid++);def.sourceId=sourceId;def.allDay=allDay;def.hasEnd=hasEnd;for(var_i=0,_a=calendar.pluginSystem.hooks.eventDefParsers;_i<_a.length;_i++){vareventDefParser=_a[_i];varnewLeftovers={};eventDefParser(def,leftovers,newLeftovers);leftovers=newLeftovers;}def.extendedProps=__assign(leftovers,def.extendedProps||{});// help out EventApi from having user modify propsObject.freeze(def.ui.classNames);Object.freeze(def.extendedProps);returndef;}functioncreateEventInstance(defId,range,forcedStartTzo,forcedEndTzo){return{instanceId:String(uid++),defId:defId,range:range,forcedStartTzo:forcedStartTzo==null?null:forcedStartTzo,forcedEndTzo:forcedEndTzo==null?null:forcedEndTzo};}functionparseSingle(raw,allDayDefault,calendar,leftovers,allowOpenRange){varprops=pluckDateProps(raw,leftovers);varallDay=props.allDay;varstartMeta;varstartMarker=null;varhasEnd=false;varendMeta;varendMarker=null;startMeta=calendar.dateEnv.createMarkerMeta(props.start);if(startMeta){startMarker=startMeta.marker;}elseif(!allowOpenRange){returnnull;}if(props.end!=null){endMeta=calendar.dateEnv.createMarkerMeta(props.end);}if(allDay==null){if(allDayDefault!=null){allDay=allDayDefault;}else{// fall back to the date props LASTallDay=(!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;}elseif(!allowOpenRange){hasEnd=calendar.opt('forceEventDuration')||false;endMarker=calendar.dateEnv.add(startMarker,allDay?calendar.defaultAllDayEventDuration:calendar.defaultTimedEventDuration);}return{allDay:allDay,hasEnd:hasEnd,range:{start:startMarker,end:endMarker},forcedStartTzo:startMeta?startMeta.forcedTzo:null,forcedEndTzo:endMeta?endMeta.forcedTzo:null};}functionpluckDateProps(raw,leftovers){varprops=refineProps(raw,DATE_PROPS,{},leftovers);props.start=(props.start!==null)?props.start:props.date;deleteprops.date;returnprops;}functionpluckNonDateProps(raw,calendar,leftovers){varpreLeftovers={};varprops=refineProps(raw,NON_DATE_PROPS,{},preLeftovers);varui=processUnscopedUiProps(preLeftovers,calendar,leftovers);props.publicId=props.id;deleteprops.id;props.ui=ui;returnprops;}functioncomputeIsAllDayDefault(sourceId,calendar){varres=null;if(sourceId){varsource=calendar.state.eventSources[sourceId];res=source.allDayDefault;}if(res==null){res=calendar.opt('allDayDefault');}returnres;}varDEF_DEFAULTS={startTime:'09:00',endTime:'17:00',daysOfWeek:[1,2,3,4,5],rendering:'inverse-background',classNames:'fc-nonbusiness',groupId:'_businessHours'// so multiple defs get grouped};/* TODO: pass around as EventDefHash!!! */functionparseBusinessHours(input,calendar){returnparseEvents(refineInputs(input),'',calendar);}functionrefineInputs(input){varrawDefs;if(input===true){rawDefs=[{}];// will get DEF_DEFAULTS verbatim}elseif(Array.isArray(input)){// if specifying an array, every sub-definition NEEDS a day-of-weekrawDefs=input.filter(function(rawDef){returnrawDef.daysOfWeek;});}elseif(typeofinput==='object'&&input){// non-null objectrawDefs=[input];}else{// is probably falserawDefs=[];}rawDefs=rawDefs.map(function(rawDef){return__assign({},DEF_DEFAULTS,rawDef);});returnrawDefs;}functionmemoizeRendering(renderFunc,unrenderFunc,dependencies){if(dependencies===void0){dependencies=[];}vardependents=[];varthisContext;varprevArgs;functionunrender(){if(prevArgs){for(var_i=0,dependents_1=dependents;_i<dependents_1.length;_i++){vardependent=dependents_1[_i];dependent.unrender();}if(unrenderFunc){unrenderFunc.apply(thisContext,prevArgs);}prevArgs=null;}}functionres(){if(!prevArgs||!isArraysEqual(prevArgs,arguments)){unrender();thisContext=this;prevArgs=arguments;renderFunc.apply(this,arguments);}}res.dependents=dependents;res.unrender=unrender;for(var_i=0,dependencies_1=dependencies;_i<dependencies_1.length;_i++){vardependency=dependencies_1[_i];dependency.dependents.push(res);}returnres;}varEMPTY_EVENT_STORE=createEmptyEventStore();// for purecomponents. TODO: keep elsewherevarSplitter=/** @class */(function(){functionSplitter(){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}Splitter.prototype.splitProps=function(props){var_this=this;varkeyInfos=this.getKeyInfo(props);vardefKeys=this.getKeysForEventDefs(props.eventStore);vardateSelections=this.splitDateSelection(props.dateSelection);varindividualUi=this.splitIndividualUi(props.eventUiBases,defKeys);// the individual *bases*vareventStores=this.splitEventStore(props.eventStore,defKeys);vareventDrags=this.splitEventDrag(props.eventDrag);vareventResizes=this.splitEventResize(props.eventResize);varsplitProps={};this.eventUiBuilders=mapHash(keyInfos,function(info,key){return_this.eventUiBuilders[key]||memoize(buildEventUiForKey);});for(varkeyinkeyInfos){varkeyInfo=keyInfos[key];vareventStore=eventStores[key]||EMPTY_EVENT_STORE;varbuildEventUi=this.eventUiBuilders[key];splitProps[key]={businessHours:keyInfo.businessHours||props.businessHours,dateSelection:dateSelections[key]||null,eventStore:eventStore,eventUiBases:buildEventUi(props.eventUiBases[''],keyInfo.ui,individualUi[key]),eventSelection:eventStore.instances[props.eventSelection]?props.eventSelection:'',eventDrag:eventDrags[key]||null,eventResize:eventResizes[key]||null};}returnsplitProps;};Splitter.prototype._splitDateSpan=function(dateSpan){vardateSpans={};if(dateSpan){varkeys=this.getKeysForDateSpan(dateSpan);for(var_i=0,keys_1=keys;_i<keys_1.length;_i++){varkey=keys_1[_i];dateSpans[key]=dateSpan;}}returndateSpans;};Splitter.prototype._getKeysForEventDefs=function(eventStore){var_this=this;returnmapHash(eventStore.defs,function(eventDef){return_this.getKeysForEventDef(eventDef);});};Splitter.prototype._splitEventStore=function(eventStore,defKeys){vardefs=eventStore.defs,instances=eventStore.instances;varsplitStores={};for(vardefIdindefs){for(var_i=0,_a=defKeys[defId];_i<_a.length;_i++){varkey=_a[_i];if(!splitStores[key]){splitStores[key]=createEmptyEventStore();}splitStores[key].defs[defId]=defs[defId];}}for(varinstanceIdininstances){varinstance=instances[instanceId];for(var_b=0,_c=defKeys[instance.defId];_b<_c.length;_b++){varkey=_c[_b];if(splitStores[key]){// must have already been createdsplitStores[key].instances[instanceId]=instance;}}}returnsplitStores;};Splitter.prototype._splitIndividualUi=function(eventUiBases,defKeys){varsplitHashes={};for(vardefIdineventUiBases){if(defId){// not the '' keyfor(var_i=0,_a=defKeys[defId];_i<_a.length;_i++){varkey=_a[_i];if(!splitHashes[key]){splitHashes[key]={};}splitHashes[key][defId]=eventUiBases[defId];}}}returnsplitHashes;};Splitter.prototype._splitInteraction=function(interaction){varsplitStates={};if(interaction){varaffectedStores_1=this._splitEventStore(interaction.affectedEvents,this._getKeysForEventDefs(interaction.affectedEvents)// can't use cached. might be events from other calendar);// can't rely on defKeys because event data is mutatedvarmutatedKeysByDefId=this._getKeysForEventDefs(interaction.mutatedEvents);varmutatedStores_1=this._splitEventStore(interaction.mutatedEvents,mutatedKeysByDefId);varpopulate=function(key){if(!splitStates[key]){splitStates[key]={affectedEvents:affectedStores_1[key]||EMPTY_EVENT_STORE,mutatedEvents:mutatedStores_1[key]||EMPTY_EVENT_STORE,isEvent:interaction.isEvent,origSeg:interaction.origSeg};}};for(varkeyinaffectedStores_1){populate(key);}for(varkeyinmutatedStores_1){populate(key);}}returnsplitStates;};returnSplitter;}());functionbuildEventUiForKey(allUi,eventUiForKey,individualUi){varbaseParts=[];if(allUi){baseParts.push(allUi);}if(eventUiForKey){baseParts.push(eventUiForKey);}varstuff={'':combineEventUis(baseParts)};if(individualUi){__assign(stuff,individualUi);}returnstuff;}// Generates HTML for an anchor to another view into the calendar.// Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.// `gotoOptions` can either be a DateMarker, or an object with the form:// { date, type, forceOff }// `type` is a view-type like "day" or "week". default value is "day".// `attrs` and `innerHtml` are use to generate the rest of the HTML tag.functionbuildGotoAnchorHtml(allOptions,dateEnv,gotoOptions,attrs,innerHtml){vardate;vartype;varforceOff;varfinalOptions;if(gotoOptionsinstanceofDate){date=gotoOptions;// a single date-like input}else{date=gotoOptions.date;type=gotoOptions.type;forceOff=gotoOptions.forceOff;}finalOptions={date:dateEnv.formatIso(date,{omitTime:true}),type:type||'day'};if(typeofattrs==='string'){innerHtml=attrs;attrs=null;}attrs=attrs?' '+attrsToStr(attrs):'';// will have a leading spaceinnerHtml=innerHtml||'';if(!forceOff&&allOptions.navLinks){return'<a'+attrs+' data-goto="'+htmlEscape(JSON.stringify(finalOptions))+'">'+innerHtml+'</a>';}else{return'<span'+attrs+'>'+innerHtml+'</span>';}}functiongetAllDayHtml(allOptions){returnallOptions.allDayHtml||htmlEscape(allOptions.allDayText);}// Computes HTML classNames for a single-day elementfunctiongetDayClasses(date,dateProfile,context,noThemeHighlight){varcalendar=context.calendar,options=context.options,theme=context.theme,dateEnv=context.dateEnv;varclasses=[];vartodayStart;vartodayEnd;if(!rangeContainsMarker(dateProfile.activeRange,date)){classes.push('fc-disabled-day');}else{classes.push('fc-'+DAY_IDS[date.getUTCDay()]);if(options.monthMode&&dateEnv.getMonth(date)!==dateEnv.getMonth(dateProfile.currentRange.start)){classes.push('fc-other-month');}todayStart=startOfDay(calendar.getNow());todayEnd=addDays(todayStart,1);if(date<todayStart){classes.push('fc-past');}elseif(date>=todayEnd){classes.push('fc-future');}else{classes.push('fc-today');if(noThemeHighlight!==true){classes.push(theme.getClass('today'));}}}returnclasses;}// 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.functionunpromisify(func,success,failure){// guard against success/failure callbacks being called more than once// and guard against a promise AND callback being used together.varisResolved=false;varwrappedSuccess=function(){if(!isResolved){isResolved=true;success.apply(this,arguments);}};varwrappedFailure=function(){if(!isResolved){isResolved=true;if(failure){failure.apply(this,arguments);}}};varres=func(wrappedSuccess,wrappedFailure);if(res&&typeofres.then==='function'){res.then(wrappedSuccess,wrappedFailure);}}varMixin=/** @class */(function(){functionMixin(){}// mix into a CLASSMixin.mixInto=function(destClass){this.mixIntoObj(destClass.prototype);};// mix into ANY objectMixin.mixIntoObj=function(destObj){var_this=this;Object.getOwnPropertyNames(this.prototype).forEach(function(name){if(!destObj[name]){// if destination doesn't already define itdestObj[name]=_this.prototype[name];}});};/* will override existing methods TODO: remove! not used anymore */Mixin.mixOver=function(destClass){var_this=this;Object.getOwnPropertyNames(this.prototype).forEach(function(name){destClass.prototype[name]=_this.prototype[name];});};returnMixin;}());/* USAGE: import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'inclass:on:EmitterInterface['on']one:EmitterInterface['one']off:EmitterInterface['off']trigger:EmitterInterface['trigger']triggerWith:EmitterInterface['triggerWith']hasHandlers:EmitterInterface['hasHandlers']afterclass:EmitterMixin.mixInto(TheClass)*/ var EmitterMixin = /**@class*/ (function (_super) { __extends(EmitterMixin, _super); function EmitterMixin() { return _super !== null && _super.apply(this, arguments) || this; } EmitterMixin.prototype.on = function (type, handler) { addToHash(this._handlers || (this._handlers = {}), type, handler); return this; //forchaining};// todo: add commentsEmitterMixin.prototype.one=function(type,handler){addToHash(this._oneHandlers||(this._oneHandlers={}),type,handler);returnthis;// for chaining};EmitterMixin.prototype.off=function(type,handler){if(this._handlers){removeFromHash(this._handlers,type,handler);}if(this._oneHandlers){removeFromHash(this._oneHandlers,type,handler);}returnthis;// for chaining};EmitterMixin.prototype.trigger=function(type){varargs=[];for(var_i=1;_i<arguments.length;_i++){args[_i-1]=arguments[_i];}this.triggerWith(type,this,args);returnthis;// for chaining};EmitterMixin.prototype.triggerWith=function(type,context,args){if(this._handlers){applyAll(this._handlers[type],context,args);}if(this._oneHandlers){applyAll(this._oneHandlers[type],context,args);deletethis._oneHandlers[type];// will never fire again}returnthis;// for chaining};EmitterMixin.prototype.hasHandlers=function(type){return(this._handlers&&this._handlers[type]&&this._handlers[type].length)||(this._oneHandlers&&this._oneHandlers[type]&&this._oneHandlers[type].length);};returnEmitterMixin;}(Mixin));functionaddToHash(hash,type,handler){(hash[type]||(hash[type]=[])).push(handler);}functionremoveFromHash(hash,type,handler){if(handler){if(hash[type]){hash[type]=hash[type].filter(function(func){returnfunc!==handler;});}}else{deletehash[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/rightORthetop/bottomORboth.Providesmethodsforqueryingthecachebyposition.*/ var PositionCache = /**@class*/ (function () { function PositionCache(originEl, els, isHorizontal, isVertical) { this.originEl = originEl; this.els = els; this.isHorizontal = isHorizontal; this.isVertical = isVertical; } //Queriestheelsforcoordinatesandstoresthem.// Call this method before using and of the get* methods below.PositionCache.prototype.build=function(){varoriginEl=this.originEl;varoriginClientRect=this.originClientRect=originEl.getBoundingClientRect();// relative to viewport top-leftif(this.isHorizontal){this.buildElHorizontals(originClientRect.left);}if(this.isVertical){this.buildElVerticals(originClientRect.top);}};// Populates the left/right internal coordinate arraysPositionCache.prototype.buildElHorizontals=function(originClientLeft){varlefts=[];varrights=[];for(var_i=0,_a=this.els;_i<_a.length;_i++){varel=_a[_i];varrect=el.getBoundingClientRect();lefts.push(rect.left-originClientLeft);rights.push(rect.right-originClientLeft);}this.lefts=lefts;this.rights=rights;};// Populates the top/bottom internal coordinate arraysPositionCache.prototype.buildElVerticals=function(originClientTop){vartops=[];varbottoms=[];for(var_i=0,_a=this.els;_i<_a.length;_i++){varel=_a[_i];varrect=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.PositionCache.prototype.leftToIndex=function(leftPosition){varlefts=this.lefts;varrights=this.rights;varlen=lefts.length;vari;for(i=0;i<len;i++){if(leftPosition>=lefts[i]&&leftPosition<rights[i]){returni;}}};// Given a top offset (from document top), returns the index of the el that it vertically intersects.// If no intersection is made, returns undefined.PositionCache.prototype.topToIndex=function(topPosition){vartops=this.tops;varbottoms=this.bottoms;varlen=tops.length;vari;for(i=0;i<len;i++){if(topPosition>=tops[i]&&topPosition<bottoms[i]){returni;}}};// Gets the width of the element at the given indexPositionCache.prototype.getWidth=function(leftIndex){returnthis.rights[leftIndex]-this.lefts[leftIndex];};// Gets the height of the element at the given indexPositionCache.prototype.getHeight=function(topIndex){returnthis.bottoms[topIndex]-this.tops[topIndex];};returnPositionCache;}());/* An object for getting/settingscroll-relatedinformationforanelement.Internally,thisisdoneverydifferentlyforwindowversusDOMelement,sothisobjectservesasacommoninterface.*/ var ScrollController = /**@class*/ (function () { function ScrollController() { } ScrollController.prototype.getMaxScrollTop = function () { return this.getScrollHeight() - this.getClientHeight(); }; ScrollController.prototype.getMaxScrollLeft = function () { return this.getScrollWidth() - this.getClientWidth(); }; ScrollController.prototype.canScrollVertically = function () { return this.getMaxScrollTop() > 0; }; ScrollController.prototype.canScrollHorizontally = function () { return this.getMaxScrollLeft() > 0; }; ScrollController.prototype.canScrollUp = function () { return this.getScrollTop() > 0; }; ScrollController.prototype.canScrollDown = function () { return this.getScrollTop() < this.getMaxScrollTop(); }; ScrollController.prototype.canScrollLeft = function () { return this.getScrollLeft() > 0; }; ScrollController.prototype.canScrollRight = function () { return this.getScrollLeft() < this.getMaxScrollLeft(); }; return ScrollController; }()); var ElementScrollController = /**@class*/ (function (_super) { __extends(ElementScrollController, _super); function ElementScrollController(el) { var _this = _super.call(this) || this; _this.el = el; return _this; } ElementScrollController.prototype.getScrollTop = function () { return this.el.scrollTop; }; ElementScrollController.prototype.getScrollLeft = function () { return this.el.scrollLeft; }; ElementScrollController.prototype.setScrollTop = function (top) { this.el.scrollTop = top; }; ElementScrollController.prototype.setScrollLeft = function (left) { this.el.scrollLeft = left; }; ElementScrollController.prototype.getScrollWidth = function () { return this.el.scrollWidth; }; ElementScrollController.prototype.getScrollHeight = function () { return this.el.scrollHeight; }; ElementScrollController.prototype.getClientHeight = function () { return this.el.clientHeight; }; ElementScrollController.prototype.getClientWidth = function () { return this.el.clientWidth; }; return ElementScrollController; }(ScrollController)); var WindowScrollController = /**@class*/ (function (_super) { __extends(WindowScrollController, _super); function WindowScrollController() { return _super !== null && _super.apply(this, arguments) || this; } WindowScrollController.prototype.getScrollTop = function () { return window.pageYOffset; }; WindowScrollController.prototype.getScrollLeft = function () { return window.pageXOffset; }; WindowScrollController.prototype.setScrollTop = function (n) { window.scroll(window.pageXOffset, n); }; WindowScrollController.prototype.setScrollLeft = function (n) { window.scroll(n, window.pageYOffset); }; WindowScrollController.prototype.getScrollWidth = function () { return document.documentElement.scrollWidth; }; WindowScrollController.prototype.getScrollHeight = function () { return document.documentElement.scrollHeight; }; WindowScrollController.prototype.getClientHeight = function () { return document.documentElement.clientHeight; }; WindowScrollController.prototype.getClientWidth = function () { return document.documentElement.clientWidth; }; return WindowScrollController; }(ScrollController)); /*Embodiesadivthathaspotentialscrollbars*/ var ScrollComponent = /**@class*/ (function (_super) { __extends(ScrollComponent, _super); function ScrollComponent(overflowX, overflowY) { var _this = _super.call(this, createElement('div', { className: 'fc-scroller' })) || this; _this.overflowX = overflowX; _this.overflowY = overflowY; _this.applyOverflow(); return _this; } //setstonaturalheight,unlocksoverflowScrollComponent.prototype.clear=function(){this.setHeight('auto');this.applyOverflow();};ScrollComponent.prototype.destroy=function(){removeElement(this.el);};// Overflow// -----------------------------------------------------------------------------------------------------------------ScrollComponent.prototype.applyOverflow=function(){applyStyle(this.el,{overflowX:this.overflowX,overflowY:this.overflowY});};// Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.// Useful for preserving scrollbar widths regardless of future resizes.// Can pass in scrollbarWidths for optimization.ScrollComponent.prototype.lockOverflow=function(scrollbarWidths){varoverflowX=this.overflowX;varoverflowY=this.overflowY;scrollbarWidths=scrollbarWidths||this.getScrollbarWidths();if(overflowX==='auto'){overflowX=(scrollbarWidths.bottom||// horizontal scrollbars?this.canScrollHorizontally()// OR scrolling pane with massless scrollbars?)?'scroll':'hidden';}if(overflowY==='auto'){overflowY=(scrollbarWidths.left||scrollbarWidths.right||// horizontal scrollbars?this.canScrollVertically()// OR scrolling pane with massless scrollbars?)?'scroll':'hidden';}applyStyle(this.el,{overflowX:overflowX,overflowY:overflowY});};ScrollComponent.prototype.setHeight=function(height){applyStyleProp(this.el,'height',height);};ScrollComponent.prototype.getScrollbarWidths=function(){varedges=computeEdges(this.el);return{left:edges.scrollbarLeft,right:edges.scrollbarRight,bottom:edges.scrollbarBottom};};returnScrollComponent;}(ElementScrollController));varTheme=/** @class */(function(){functionTheme(calendarOptions){this.calendarOptions=calendarOptions;this.processIconOverride();}Theme.prototype.processIconOverride=function(){if(this.iconOverrideOption){this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);}};Theme.prototype.setIconOverride=function(iconOverrideHash){variconClassesCopy;varbuttonName;if(typeoficonOverrideHash==='object'&&iconOverrideHash){// non-null objecticonClassesCopy=__assign({},this.iconClasses);for(buttonNameiniconOverrideHash){iconClassesCopy[buttonName]=this.applyIconOverridePrefix(iconOverrideHash[buttonName]);}this.iconClasses=iconClassesCopy;}elseif(iconOverrideHash===false){this.iconClasses={};}};Theme.prototype.applyIconOverridePrefix=function(className){varprefix=this.iconOverridePrefix;if(prefix&&className.indexOf(prefix)!==0){// if not already presentclassName=prefix+className;}returnclassName;};Theme.prototype.getClass=function(key){returnthis.classes[key]||'';};Theme.prototype.getIconClass=function(buttonName){varclassName=this.iconClasses[buttonName];if(className){returnthis.baseIconClass+' '+className;}return'';};Theme.prototype.getCustomButtonIconClass=function(customButtonProps){varclassName;if(this.iconOverrideCustomButtonOption){className=customButtonProps[this.iconOverrideCustomButtonOption];if(className){returnthis.baseIconClass+' '+this.applyIconOverridePrefix(className);}}return'';};returnTheme;}());Theme.prototype.classes={};Theme.prototype.iconClasses={};Theme.prototype.baseIconClass='';Theme.prototype.iconOverridePrefix='';varguid=0;varComponentContext=/** @class */(function(){functionComponentContext(calendar,theme,dateEnv,options,view){this.calendar=calendar;this.theme=theme;this.dateEnv=dateEnv;this.options=options;this.view=view;this.isRtl=options.dir==='rtl';this.eventOrderSpecs=parseFieldSpecs(options.eventOrder);this.nextDayThreshold=createDuration(options.nextDayThreshold);}ComponentContext.prototype.extend=function(options,view){returnnewComponentContext(this.calendar,this.theme,this.dateEnv,options||this.options,view||this.view);};returnComponentContext;}());varComponent=/** @class */(function(){functionComponent(){this.uid=String(guid++);}Component.addEqualityFuncs=function(newFuncs){this.prototype.equalityFuncs=__assign({},this.prototype.equalityFuncs,newFuncs);};Component.prototype.receiveProps=function(props,context){varoldContext=this.context;this.context=context;if(!oldContext){this.firstContext(context);}var_a=recycleProps(this.props||{},props,this.equalityFuncs),anyChanges=_a.anyChanges,comboProps=_a.comboProps;this.props=comboProps;if(anyChanges){if(oldContext){this.beforeUpdate();}this.render(comboProps,context);if(oldContext){this.afterUpdate();}}};Component.prototype.render=function(props,context){};Component.prototype.firstContext=function(context){};Component.prototype.beforeUpdate=function(){};Component.prototype.afterUpdate=function(){};// after destroy is called, this component won't ever be used againComponent.prototype.destroy=function(){};returnComponent;}());Component.prototype.equalityFuncs={};/* Reuses old values when equal. If anything is unequal, returns newProps as-is. Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing. */functionrecycleProps(oldProps,newProps,equalityFuncs){varcomboProps={};// some old, some newvaranyChanges=false;for(varkeyinnewProps){if(keyinoldProps&&(oldProps[key]===newProps[key]||(equalityFuncs[key]&&equalityFuncs[key](oldProps[key],newProps[key])))){// equal to old? use old propcomboProps[key]=oldProps[key];}else{comboProps[key]=newProps[key];anyChanges=true;}}for(varkeyinoldProps){if(!(keyinnewProps)){anyChanges=true;break;}}return{anyChanges:anyChanges,comboProps:comboProps};}/* PURPOSES: - hook up to fg, fill, and mirror renderers - interface for dragging and hits */varDateComponent=/** @class */(function(_super){__extends(DateComponent,_super);functionDateComponent(el){var_this=_super.call(this)||this;_this.el=el;return_this;}DateComponent.prototype.destroy=function(){_super.prototype.destroy.call(this);removeElement(this.el);};// Hit System// -----------------------------------------------------------------------------------------------------------------DateComponent.prototype.buildPositionCaches=function(){};DateComponent.prototype.queryHit=function(positionLeft,positionTop,elWidth,elHeight){returnnull;// this should be abstract};// Validation// -----------------------------------------------------------------------------------------------------------------DateComponent.prototype.isInteractionValid=function(interaction){varcalendar=this.context.calendar;vardateProfile=this.props.dateProfile;// HACKvarinstances=interaction.mutatedEvents.instances;if(dateProfile){// HACK for DayTilefor(varinstanceIdininstances){if(!rangeContainsRange(dateProfile.validRange,instances[instanceId].range)){returnfalse;}}}returnisInteractionValid(interaction,calendar);};DateComponent.prototype.isDateSelectionValid=function(selection){varcalendar=this.context.calendar;vardateProfile=this.props.dateProfile;// HACKif(dateProfile&&// HACK for DayTile!rangeContainsRange(dateProfile.validRange,selection.range)){returnfalse;}returnisDateSelectionValid(selection,calendar);};// Pointer Interaction Utils// -----------------------------------------------------------------------------------------------------------------DateComponent.prototype.isValidSegDownEl=function(el){return!this.props.eventDrag&&// HACK!this.props.eventResize&&// HACK!elementClosest(el,'.fc-mirror')&&(this.isPopover()||!this.isInPopover(el));// ^above line ensures we don't detect a seg interaction within a nested component.// it's a HACK because it only supports a popover as the nested component.};DateComponent.prototype.isValidDateDownEl=function(el){varsegEl=elementClosest(el,this.fgSegSelector);return(!segEl||segEl.classList.contains('fc-mirror'))&&!elementClosest(el,'.fc-more')&&// a "more.." link!elementClosest(el,'a[data-goto]')&&// a clickable nav link!this.isInPopover(el);};DateComponent.prototype.isPopover=function(){returnthis.el.classList.contains('fc-popover');};DateComponent.prototype.isInPopover=function(el){returnBoolean(elementClosest(el,'.fc-popover'));};returnDateComponent;}(Component));DateComponent.prototype.fgSegSelector='.fc-event-container > *';DateComponent.prototype.bgSegSelector='.fc-bgevent:not(.fc-nonbusiness)';varuid$1=0;functioncreatePlugin(input){return{id:String(uid$1++),deps:input.deps||[],reducers:input.reducers||[],eventDefParsers:input.eventDefParsers||[],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||[],eventResizeJoinTransforms:input.eventResizeJoinTransforms||[],viewContainerModifiers:input.viewContainerModifiers||[],eventDropTransformers:input.eventDropTransformers||[],componentInteractions:input.componentInteractions||[],calendarInteractions:input.calendarInteractions||[],themeClasses:input.themeClasses||{},eventSourceDefs:input.eventSourceDefs||[],cmdFormatter:input.cmdFormatter,recurringTypes:input.recurringTypes||[],namedTimeZonedImpl:input.namedTimeZonedImpl,defaultView:input.defaultView||'',elementDraggingImpl:input.elementDraggingImpl,optionChangeHandlers:input.optionChangeHandlers||{}};}varPluginSystem=/** @class */(function(){functionPluginSystem(){this.hooks={reducers:[],eventDefParsers:[],isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],eventResizeJoinTransforms:[],viewContainerModifiers:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,defaultView:'',elementDraggingImpl:null,optionChangeHandlers:{}};this.addedHash={};}PluginSystem.prototype.add=function(plugin){if(!this.addedHash[plugin.id]){this.addedHash[plugin.id]=true;for(var_i=0,_a=plugin.deps;_i<_a.length;_i++){vardep=_a[_i];this.add(dep);}this.hooks=combineHooks(this.hooks,plugin);}};returnPluginSystem;}());functioncombineHooks(hooks0,hooks1){return{reducers:hooks0.reducers.concat(hooks1.reducers),eventDefParsers:hooks0.eventDefParsers.concat(hooks1.eventDefParsers),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:__assign({},hooks0.views,hooks1.views),viewPropsTransformers:hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),isPropsValid:hooks1.isPropsValid||hooks0.isPropsValid,externalDefTransforms:hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),eventResizeJoinTransforms:hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),viewContainerModifiers:hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),eventDropTransformers:hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),calendarInteractions:hooks0.calendarInteractions.concat(hooks1.calendarInteractions),componentInteractions:hooks0.componentInteractions.concat(hooks1.componentInteractions),themeClasses:__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,defaultView:hooks0.defaultView||hooks1.defaultView,elementDraggingImpl:hooks0.elementDraggingImpl||hooks1.elementDraggingImpl,optionChangeHandlers:__assign({},hooks0.optionChangeHandlers,hooks1.optionChangeHandlers)};}vareventSourceDef={ignoreRange:true,parseMeta:function(raw){if(Array.isArray(raw)){// short formreturnraw;}elseif(Array.isArray(raw.events)){returnraw.events;}returnnull;},fetch:function(arg,success){success({rawEvents:arg.eventSource.meta});}};varArrayEventSourcePlugin=createPlugin({eventSourceDefs:[eventSourceDef]});vareventSourceDef$1={parseMeta:function(raw){if(typeofraw==='function'){// short formreturnraw;}elseif(typeofraw.events==='function'){returnraw.events;}returnnull;},fetch:function(arg,success,failure){vardateEnv=arg.calendar.dateEnv;varfunc=arg.eventSource.meta;unpromisify(func.bind(null,{start:dateEnv.toDate(arg.range.start),end:dateEnv.toDate(arg.range.end),startStr:dateEnv.formatIso(arg.range.start),endStr:dateEnv.formatIso(arg.range.end),timeZone:dateEnv.timeZone}),function(rawEvents){success({rawEvents:rawEvents});// needs an object response},failure// send errorObj directly to failure callback);}};varFuncEventSourcePlugin=createPlugin({eventSourceDefs:[eventSourceDef$1]});functionrequestJson(method,url,params,successCallback,failureCallback){method=method.toUpperCase();varbody=null;if(method==='GET'){url=injectQueryStringParams(url,params);}else{body=encodeParams(params);}varxhr=newXMLHttpRequest();xhr.open(method,url,true);if(method!=='GET'){xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');}xhr.onload=function(){if(xhr.status>=200&&xhr.status<400){try{varres=JSON.parse(xhr.responseText);successCallback(res,xhr);}catch(err){failureCallback('Failure parsing JSON',xhr);}}else{failureCallback('Request failed',xhr);}};xhr.onerror=function(){failureCallback('Request failed',xhr);};xhr.send(body);}functioninjectQueryStringParams(url,params){returnurl+(url.indexOf('?')===-1?'?':'&')+encodeParams(params);}functionencodeParams(params){varparts=[];for(varkeyinparams){parts.push(encodeURIComponent(key)+'='+encodeURIComponent(params[key]));}returnparts.join('&');}vareventSourceDef$2={parseMeta:function(raw){if(typeofraw==='string'){// short formraw={url:raw};}elseif(!raw||typeofraw!=='object'||!raw.url){returnnull;}return{url:raw.url,method:(raw.method||'GET').toUpperCase(),extraParams:raw.extraParams,startParam:raw.startParam,endParam:raw.endParam,timeZoneParam:raw.timeZoneParam};},fetch:function(arg,success,failure){varmeta=arg.eventSource.meta;varrequestParams=buildRequestParams(meta,arg.range,arg.calendar);requestJson(meta.method,meta.url,requestParams,function(rawEvents,xhr){success({rawEvents:rawEvents,xhr:xhr});},function(errorMessage,xhr){failure({message:errorMessage,xhr:xhr});});}};varJsonFeedEventSourcePlugin=createPlugin({eventSourceDefs:[eventSourceDef$2]});functionbuildRequestParams(meta,range,calendar){vardateEnv=calendar.dateEnv;varstartParam;varendParam;vartimeZoneParam;varcustomRequestParams;varparams={};startParam=meta.startParam;if(startParam==null){startParam=calendar.opt('startParam');}endParam=meta.endParam;if(endParam==null){endParam=calendar.opt('endParam');}timeZoneParam=meta.timeZoneParam;if(timeZoneParam==null){timeZoneParam=calendar.opt('timeZoneParam');}// retrieve any outbound GET/POST data from the optionsif(typeofmeta.extraParams==='function'){// supplied as a function that returns a key/value objectcustomRequestParams=meta.extraParams();}else{// probably supplied as a straight key/value objectcustomRequestParams=meta.extraParams||{};}__assign(params,customRequestParams);params[startParam]=dateEnv.formatIso(range.start);params[endParam]=dateEnv.formatIso(range.end);if(dateEnv.timeZone!=='local'){params[timeZoneParam]=dateEnv.timeZone;}returnparams;}varrecurring={parse:function(rawEvent,leftoverProps,dateEnv){varcreateMarker=dateEnv.createMarker.bind(dateEnv);varprocessors={daysOfWeek:null,startTime:createDuration,endTime:createDuration,startRecur:createMarker,endRecur:createMarker};varprops=refineProps(rawEvent,processors,{},leftoverProps);varanyValid=false;for(varpropNameinprops){if(props[propName]!=null){anyValid=true;break;}}if(anyValid){varduration=null;if('duration'inleftoverProps){duration=createDuration(leftoverProps.duration);deleteleftoverProps.duration;}if(!duration&&props.startTime&&props.endTime){duration=subtractDurations(props.endTime,props.startTime);}return{allDayGuess:Boolean(!props.startTime&&!props.endTime),duration:duration,typeData:props// doesn't need endTime anymore but oh well};}returnnull;},expand:function(typeData,framingRange,dateEnv){varclippedFramingRange=intersectRanges(framingRange,{start:typeData.startRecur,end:typeData.endRecur});if(clippedFramingRange){returnexpandRanges(typeData.daysOfWeek,typeData.startTime,clippedFramingRange,dateEnv);}else{return[];}}};varSimpleRecurrencePlugin=createPlugin({recurringTypes:[recurring]});functionexpandRanges(daysOfWeek,startTime,framingRange,dateEnv){vardowHash=daysOfWeek?arrayToHash(daysOfWeek):null;vardayMarker=startOfDay(framingRange.start);varendMarker=framingRange.end;varinstanceStarts=[];while(dayMarker<endMarker){varinstanceStart// if everyday, or this particular day-of-week=void0;// if everyday, or this particular day-of-weekif(!dowHash||dowHash[dayMarker.getUTCDay()]){if(startTime){instanceStart=dateEnv.add(dayMarker,startTime);}else{instanceStart=dayMarker;}instanceStarts.push(instanceStart);}dayMarker=addDays(dayMarker,1);}returninstanceStarts;}varDefaultOptionChangeHandlers=createPlugin({optionChangeHandlers:{events:function(events,calendar,deepEqual){handleEventSources([events],calendar,deepEqual);},eventSources:handleEventSources,plugins:handlePlugins}});functionhandleEventSources(inputs,calendar,deepEqual){varunfoundSources=hashValuesToArray(calendar.state.eventSources);varnewInputs=[];for(var_i=0,inputs_1=inputs;_i<inputs_1.length;_i++){varinput=inputs_1[_i];varinputFound=false;for(vari=0;i<unfoundSources.length;i++){if(deepEqual(unfoundSources[i]._raw,input)){unfoundSources.splice(i,1);// deleteinputFound=true;break;}}if(!inputFound){newInputs.push(input);}}for(var_a=0,unfoundSources_1=unfoundSources;_a<unfoundSources_1.length;_a++){varunfoundSource=unfoundSources_1[_a];calendar.dispatch({type:'REMOVE_EVENT_SOURCE',sourceId:unfoundSource.sourceId});}for(var_b=0,newInputs_1=newInputs;_b<newInputs_1.length;_b++){varnewInput=newInputs_1[_b];calendar.addEventSource(newInput);}}// shortcoming: won't remove pluginsfunctionhandlePlugins(inputs,calendar){calendar.addPluginInputs(inputs);// will gracefully handle duplicates}varconfig={};// TODO: make these optionsvarglobalDefaults={defaultRangeSeparator:' - ',titleRangeSeparator:' \u2013 ',defaultTimedEventDuration:'01:00:00',defaultAllDayEventDuration:{day:1},forceEventDuration:false,nextDayThreshold:'00:00:00',// displaycolumnHeader:true,defaultView:'',aspectRatio:1.35,header:{left:'title',center:'',right:'today prev,next'},weekends:true,weekNumbers:false,weekNumberCalculation:'local',editable:false,// nowIndicator: false,scrollTime:'06:00:00',minTime:'00:00:00',maxTime:'24:00:00',showNonCurrentDates:true,// event ajaxlazyFetching:true,startParam:'start',endParam:'end',timeZoneParam:'timeZone',timeZone:'local',// allDayDefault: undefined,// localelocales:[],locale:'',// dir: will get this from the default locale// buttonIcons: null,// allows setting a min-height to the event segment to prevent short events overlapping each othertimeGridEventMinHeight:0,themeSystem:'standard',// eventResizableFromStart: false,dragRevertDuration:500,dragScroll:true,allDayMaintainDuration:false,// selectable: false,unselectAuto:true,// selectMinDistance: 0,dropAccept:'*',eventOrder:'start,-duration,allDay,title',// ^ if start tie, longer events go before shorter. final tie-breaker is title text// rerenderDelay: null,eventLimit:false,eventLimitClick:'popover',dayPopoverFormat:{month:'long',day:'numeric',year:'numeric'},handleWindowResize:true,windowResizeDelay:100,longPressDelay:1000,eventDragMinDistance:5// only applies to mouse};varrtlDefaults={header:{left:'next,prev today',center:'',right:'title'},buttonIcons:{// TODO: make RTL support the responibility of the themeprev:'fc-icon-chevron-right',next:'fc-icon-chevron-left',prevYear:'fc-icon-chevrons-right',nextYear:'fc-icon-chevrons-left'}};varcomplexOptions=['header','footer','buttonText','buttonIcons'];// Merges an array of option objects into a single objectfunctionmergeOptions(optionObjs){returnmergeProps(optionObjs,complexOptions);}// TODO: move this stuff to a "plugin"-related file...varINTERNAL_PLUGINS=[ArrayEventSourcePlugin,FuncEventSourcePlugin,JsonFeedEventSourcePlugin,SimpleRecurrencePlugin,DefaultOptionChangeHandlers];functionrefinePluginDefs(pluginInputs){varplugins=[];for(var_i=0,pluginInputs_1=pluginInputs;_i<pluginInputs_1.length;_i++){varpluginInput=pluginInputs_1[_i];if(typeofpluginInput==='string'){varglobalName='FullCalendar'+capitaliseFirstLetter(pluginInput);if(!window[globalName]){console.warn('Plugin file not loaded for '+pluginInput);}else{plugins.push(window[globalName].default);// is an ES6 module}}else{plugins.push(pluginInput);}}returnINTERNAL_PLUGINS.concat(plugins);}varRAW_EN_LOCALE={code:'en',week:{dow:0,doy:4// 4 days need to be within the year to be considered the first week},dir:'ltr',buttonText:{prev:'prev',next:'next',prevYear:'prev year',nextYear:'next year',year:'year',today:'today',month:'month',week:'week',day:'day',list:'list'},weekLabel:'W',allDayText:'all-day',eventLimitText:'more',noEventsMessage:'No events to display'};functionparseRawLocales(explicitRawLocales){vardefaultCode=explicitRawLocales.length>0?explicitRawLocales[0].code:'en';varglobalArray=window['FullCalendarLocalesAll']||[];// from locales-all.jsvarglobalObject=window['FullCalendarLocales']||{};// from locales/*.js. keys are meaninglessvarallRawLocales=globalArray.concat(// globalArray is low priohashValuesToArray(globalObject),// medium prioexplicitRawLocales// highest prio);varrawLocaleMap={en:RAW_EN_LOCALE// necessary?};for(var_i=0,allRawLocales_1=allRawLocales;_i<allRawLocales_1.length;_i++){varrawLocale=allRawLocales_1[_i];rawLocaleMap[rawLocale.code]=rawLocale;}return{map:rawLocaleMap,defaultCode:defaultCode};}functionbuildLocale(inputSingular,available){if(typeofinputSingular==='object'&&!Array.isArray(inputSingular)){returnparseLocale(inputSingular.code,[inputSingular.code],inputSingular);}else{returnqueryLocale(inputSingular,available);}}functionqueryLocale(codeArg,available){varcodes=[].concat(codeArg||[]);// will convert to arrayvarraw=queryRawLocale(codes,available)||RAW_EN_LOCALE;returnparseLocale(codeArg,codes,raw);}functionqueryRawLocale(codes,available){for(vari=0;i<codes.length;i++){varparts=codes[i].toLocaleLowerCase().split('-');for(varj=parts.length;j>0;j--){varsimpleId=parts.slice(0,j).join('-');if(available[simpleId]){returnavailable[simpleId];}}}returnnull;}functionparseLocale(codeArg,codes,raw){varmerged=mergeProps([RAW_EN_LOCALE,raw],['buttonText']);deletemerged.code;// don't want this part of the optionsvarweek=merged.week;deletemerged.week;return{codeArg:codeArg,codes:codes,week:week,simpleNumberFormat:newIntl.NumberFormat(codeArg),options:merged};}varOptionsManager=/** @class */(function(){functionOptionsManager(overrides){this.overrides=__assign({},overrides);// make a copythis.dynamicOverrides={};this.compute();}OptionsManager.prototype.mutate=function(updates,removals,isDynamic){if(!Object.keys(updates).length&&!removals.length){return;}varoverrideHash=isDynamic?this.dynamicOverrides:this.overrides;__assign(overrideHash,updates);for(var_i=0,removals_1=removals;_i<removals_1.length;_i++){varpropName=removals_1[_i];deleteoverrideHash[propName];}this.compute();};// Computes the flattened options hash for the calendar and assigns to `this.options`.// Assumes this.overrides and this.dynamicOverrides have already been initialized.OptionsManager.prototype.compute=function(){// TODO: not a very efficient systemvarlocales=firstDefined(// explicit locale option given?this.dynamicOverrides.locales,this.overrides.locales,globalDefaults.locales);varlocale=firstDefined(// explicit locales option given?this.dynamicOverrides.locale,this.overrides.locale,globalDefaults.locale);varavailable=parseRawLocales(locales);varlocaleDefaults=buildLocale(locale||available.defaultCode,available.map).options;vardir=firstDefined(// based on options computed so far, is direction RTL?this.dynamicOverrides.dir,this.overrides.dir,localeDefaults.dir);vardirDefaults=dir==='rtl'?rtlDefaults:{};this.dirDefaults=dirDefaults;this.localeDefaults=localeDefaults;this.computed=mergeOptions([globalDefaults,dirDefaults,localeDefaults,this.overrides,this.dynamicOverrides]);};returnOptionsManager;}());varcalendarSystemClassMap={};functionregisterCalendarSystem(name,theClass){calendarSystemClassMap[name]=theClass;}functioncreateCalendarSystem(name){returnnewcalendarSystemClassMap[name]();}varGregorianCalendarSystem=/** @class */(function(){functionGregorianCalendarSystem(){}GregorianCalendarSystem.prototype.getMarkerYear=function(d){returnd.getUTCFullYear();};GregorianCalendarSystem.prototype.getMarkerMonth=function(d){returnd.getUTCMonth();};GregorianCalendarSystem.prototype.getMarkerDay=function(d){returnd.getUTCDate();};GregorianCalendarSystem.prototype.arrayToMarker=function(arr){returnarrayToUtcDate(arr);};GregorianCalendarSystem.prototype.markerToArray=function(marker){returndateToUtcArray(marker);};returnGregorianCalendarSystem;}());registerCalendarSystem('gregory',GregorianCalendarSystem);varISO_RE=/^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;functionparse(str){varm=ISO_RE.exec(str);if(m){varmarker=newDate(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)){vartimeZoneOffset=null;if(m[13]){timeZoneOffset=(m[15]==='-'?-1:1)*(Number(m[16]||0)*60+Number(m[18]||0));}return{marker:marker,isTimeUnspecified:!m[6],timeZoneOffset:timeZoneOffset};}}returnnull;}varDateEnv=/** @class */(function(){functionDateEnv(settings){vartimeZone=this.timeZone=settings.timeZone;varisNamedTimeZone=timeZone!=='local'&&timeZone!=='UTC';if(settings.namedTimeZoneImpl&&isNamedTimeZone){this.namedTimeZoneImpl=newsettings.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(typeofsettings.firstDay==='number'){this.weekDow=settings.firstDay;}if(typeofsettings.weekNumberCalculation==='function'){this.weekNumberFunc=settings.weekNumberCalculation;}this.weekLabel=settings.weekLabel!=null?settings.weekLabel:settings.locale.options.weekLabel;this.cmdFormatter=settings.cmdFormatter;}// Creating / ParsingDateEnv.prototype.createMarker=function(input){varmeta=this.createMarkerMeta(input);if(meta===null){returnnull;}returnmeta.marker;};DateEnv.prototype.createNowMarker=function(){if(this.canComputeOffset){returnthis.timestampToMarker(newDate().valueOf());}else{// if we can't compute the current date val for a timezone,// better to give the current local date vals than UTCreturnarrayToUtcDate(dateToLocalArray(newDate()));}};DateEnv.prototype.createMarkerMeta=function(input){if(typeofinput==='string'){returnthis.parse(input);}varmarker=null;if(typeofinput==='number'){marker=this.timestampToMarker(input);}elseif(inputinstanceofDate){input=input.valueOf();if(!isNaN(input)){marker=this.timestampToMarker(input);}}elseif(Array.isArray(input)){marker=arrayToUtcDate(input);}if(marker===null||!isValidDate(marker)){returnnull;}return{marker:marker,isTimeUnspecified:false,forcedTzo:null};};DateEnv.prototype.parse=function(s){varparts=parse(s);if(parts===null){returnnull;}varmarker=parts.marker;varforcedTzo=null;if(parts.timeZoneOffset!==null){if(this.canComputeOffset){marker=this.timestampToMarker(marker.valueOf()-parts.timeZoneOffset*60*1000);}else{forcedTzo=parts.timeZoneOffset;}}return{marker:marker,isTimeUnspecified:parts.isTimeUnspecified,forcedTzo:forcedTzo};};// AccessorsDateEnv.prototype.getYear=function(marker){returnthis.calendarSystem.getMarkerYear(marker);};DateEnv.prototype.getMonth=function(marker){returnthis.calendarSystem.getMarkerMonth(marker);};// Adding / SubtractingDateEnv.prototype.add=function(marker,dur){vara=this.calendarSystem.markerToArray(marker);a[0]+=dur.years;a[1]+=dur.months;a[2]+=dur.days;a[6]+=dur.milliseconds;returnthis.calendarSystem.arrayToMarker(a);};DateEnv.prototype.subtract=function(marker,dur){vara=this.calendarSystem.markerToArray(marker);a[0]-=dur.years;a[1]-=dur.months;a[2]-=dur.days;a[6]-=dur.milliseconds;returnthis.calendarSystem.arrayToMarker(a);};DateEnv.prototype.addYears=function(marker,n){vara=this.calendarSystem.markerToArray(marker);a[0]+=n;returnthis.calendarSystem.arrayToMarker(a);};DateEnv.prototype.addMonths=function(marker,n){vara=this.calendarSystem.markerToArray(marker);a[1]+=n;returnthis.calendarSystem.arrayToMarker(a);};// Diffing Whole UnitsDateEnv.prototype.diffWholeYears=function(m0,m1){varcalendarSystem=this.calendarSystem;if(timeAsMs(m0)===timeAsMs(m1)&&calendarSystem.getMarkerDay(m0)===calendarSystem.getMarkerDay(m1)&&calendarSystem.getMarkerMonth(m0)===calendarSystem.getMarkerMonth(m1)){returncalendarSystem.getMarkerYear(m1)-calendarSystem.getMarkerYear(m0);}returnnull;};DateEnv.prototype.diffWholeMonths=function(m0,m1){varcalendarSystem=this.calendarSystem;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;}returnnull;};// Range / DurationDateEnv.prototype.greatestWholeUnit=function(m0,m1){varn=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()};};DateEnv.prototype.countDurationsBetween=function(m0,m1,d){// TODO: can use greatestWholeUnitvardiff;if(d.years){diff=this.diffWholeYears(m0,m1);if(diff!==null){returndiff/asRoughYears(d);}}if(d.months){diff=this.diffWholeMonths(m0,m1);if(diff!==null){returndiff/asRoughMonths(d);}}if(d.days){diff=diffWholeDays(m0,m1);if(diff!==null){returndiff/asRoughDays(d);}}return(m1.valueOf()-m0.valueOf())/asRoughMs(d);};// Start-OfDateEnv.prototype.startOf=function(m,unit){if(unit==='year'){returnthis.startOfYear(m);}elseif(unit==='month'){returnthis.startOfMonth(m);}elseif(unit==='week'){returnthis.startOfWeek(m);}elseif(unit==='day'){returnstartOfDay(m);}elseif(unit==='hour'){returnstartOfHour(m);}elseif(unit==='minute'){returnstartOfMinute(m);}elseif(unit==='second'){returnstartOfSecond(m);}};DateEnv.prototype.startOfYear=function(m){returnthis.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m)]);};DateEnv.prototype.startOfMonth=function(m){returnthis.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m),this.calendarSystem.getMarkerMonth(m)]);};DateEnv.prototype.startOfWeek=function(m){returnthis.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m),this.calendarSystem.getMarkerMonth(m),m.getUTCDate()-((m.getUTCDay()-this.weekDow+7)%7)]);};// Week NumberDateEnv.prototype.computeWeekNumber=function(marker){if(this.weekNumberFunc){returnthis.weekNumberFunc(this.toDate(marker));}else{returnweekOfYear(marker,this.weekDow,this.weekDoy);}};// TODO: choke on timeZoneName: longDateEnv.prototype.format=function(marker,formatter,dateOptions){if(dateOptions===void0){dateOptions={};}returnformatter.format({marker:marker,timeZoneOffset:dateOptions.forcedTzo!=null?dateOptions.forcedTzo:this.offsetForMarker(marker)},this);};DateEnv.prototype.formatRange=function(start,end,formatter,dateOptions){if(dateOptions===void0){dateOptions={};}if(dateOptions.isEndExclusive){end=addMs(end,-1);}returnformatter.formatRange({marker:start,timeZoneOffset:dateOptions.forcedStartTzo!=null?dateOptions.forcedStartTzo:this.offsetForMarker(start)},{marker:end,timeZoneOffset:dateOptions.forcedEndTzo!=null?dateOptions.forcedEndTzo:this.offsetForMarker(end)},this);};DateEnv.prototype.formatIso=function(marker,extraOptions){if(extraOptions===void0){extraOptions={};}vartimeZoneOffset=null;if(!extraOptions.omitTimeZoneOffset){if(extraOptions.forcedTzo!=null){timeZoneOffset=extraOptions.forcedTzo;}else{timeZoneOffset=this.offsetForMarker(marker);}}returnbuildIsoString(marker,timeZoneOffset,extraOptions.omitTime);};// TimeZoneDateEnv.prototype.timestampToMarker=function(ms){if(this.timeZone==='local'){returnarrayToUtcDate(dateToLocalArray(newDate(ms)));}elseif(this.timeZone==='UTC'||!this.namedTimeZoneImpl){returnnewDate(ms);}else{returnarrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));}};DateEnv.prototype.offsetForMarker=function(m){if(this.timeZone==='local'){return-arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset();// convert "inverse" offset to "normal" offset}elseif(this.timeZone==='UTC'){return0;}elseif(this.namedTimeZoneImpl){returnthis.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));}returnnull;};// ConversionDateEnv.prototype.toDate=function(m,forcedTzo){if(this.timeZone==='local'){returnarrayToLocalDate(dateToUtcArray(m));}elseif(this.timeZone==='UTC'){returnnewDate(m.valueOf());// make sure it's a copy}elseif(!this.namedTimeZoneImpl){returnnewDate(m.valueOf()-(forcedTzo||0));}else{returnnewDate(m.valueOf()-this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m))*1000*60// convert minutes -> ms);}};returnDateEnv;}());varSIMPLE_SOURCE_PROPS={id:String,allDayDefault:Boolean,eventDataTransform:Function,success:Function,failure:Function};varuid$2=0;functiondoesSourceNeedRange(eventSource,calendar){vardefs=calendar.pluginSystem.hooks.eventSourceDefs;return!defs[eventSource.sourceDefId].ignoreRange;}functionparseEventSource(raw,calendar){vardefs=calendar.pluginSystem.hooks.eventSourceDefs;for(vari=defs.length-1;i>=0;i--){// later-added plugins take precedencevardef=defs[i];varmeta=def.parseMeta(raw);if(meta){varres=parseEventSourceProps(typeofraw==='object'?raw:{},meta,i,calendar);res._raw=raw;returnres;}}returnnull;}functionparseEventSourceProps(raw,meta,sourceDefId,calendar){varleftovers0={};varprops=refineProps(raw,SIMPLE_SOURCE_PROPS,{},leftovers0);varleftovers1={};varui=processUnscopedUiProps(leftovers0,calendar,leftovers1);props.isFetching=false;props.latestFetchId='';props.fetchRange=null;props.publicId=String(raw.id||'');props.sourceId=String(uid$2++);props.sourceDefId=sourceDefId;props.meta=meta;props.ui=ui;props.extendedProps=leftovers1;returnprops;}functionreduceEventSources(eventSources,action,dateProfile,calendar){switch(action.type){case'ADD_EVENT_SOURCES':// already parsedreturnaddSources(eventSources,action.sources,dateProfile?dateProfile.activeRange:null,calendar);case'REMOVE_EVENT_SOURCE':returnremoveSource(eventSources,action.sourceId);case'PREV':// TODO: how do we track all actions that affect dateProfile :(case'NEXT':case'SET_DATE':case'SET_VIEW_TYPE':if(dateProfile){returnfetchDirtySources(eventSources,dateProfile.activeRange,calendar);}else{returneventSources;}case'FETCH_EVENT_SOURCES':case'CHANGE_TIMEZONE':returnfetchSourcesByIds(eventSources,action.sourceIds?arrayToHash(action.sourceIds):excludeStaticSources(eventSources,calendar),dateProfile?dateProfile.activeRange:null,calendar);case'RECEIVE_EVENTS':case'RECEIVE_EVENT_ERROR':returnreceiveResponse(eventSources,action.sourceId,action.fetchId,action.fetchRange);case'REMOVE_ALL_EVENT_SOURCES':return{};default:returneventSources;}}varuid$3=0;functionaddSources(eventSourceHash,sources,fetchRange,calendar){varhash={};for(var_i=0,sources_1=sources;_i<sources_1.length;_i++){varsource=sources_1[_i];hash[source.sourceId]=source;}if(fetchRange){hash=fetchDirtySources(hash,fetchRange,calendar);}return__assign({},eventSourceHash,hash);}functionremoveSource(eventSourceHash,sourceId){returnfilterHash(eventSourceHash,function(eventSource){returneventSource.sourceId!==sourceId;});}functionfetchDirtySources(sourceHash,fetchRange,calendar){returnfetchSourcesByIds(sourceHash,filterHash(sourceHash,function(eventSource){returnisSourceDirty(eventSource,fetchRange,calendar);}),fetchRange,calendar);}functionisSourceDirty(eventSource,fetchRange,calendar){if(!doesSourceNeedRange(eventSource,calendar)){return!eventSource.latestFetchId;}else{return!calendar.opt('lazyFetching')||!eventSource.fetchRange||eventSource.isFetching||// always cancel outdated in-progress fetchesfetchRange.start<eventSource.fetchRange.start||fetchRange.end>eventSource.fetchRange.end;}}functionfetchSourcesByIds(prevSources,sourceIdHash,fetchRange,calendar){varnextSources={};for(varsourceIdinprevSources){varsource=prevSources[sourceId];if(sourceIdHash[sourceId]){nextSources[sourceId]=fetchSource(source,fetchRange,calendar);}else{nextSources[sourceId]=source;}}returnnextSources;}functionfetchSource(eventSource,fetchRange,calendar){varsourceDef=calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];varfetchId=String(uid$3++);sourceDef.fetch({eventSource:eventSource,calendar:calendar,range:fetchRange},function(res){varrawEvents=res.rawEvents;varcalSuccess=calendar.opt('eventSourceSuccess');varcalSuccessRes;varsourceSuccessRes;if(eventSource.success){sourceSuccessRes=eventSource.success(rawEvents,res.xhr);}if(calSuccess){calSuccessRes=calSuccess(rawEvents,res.xhr);}rawEvents=sourceSuccessRes||calSuccessRes||rawEvents;calendar.dispatch({type:'RECEIVE_EVENTS',sourceId:eventSource.sourceId,fetchId:fetchId,fetchRange:fetchRange,rawEvents:rawEvents});},function(error){varcallFailure=calendar.opt('eventSourceFailure');console.warn(error.message,error);if(eventSource.failure){eventSource.failure(error);}if(callFailure){callFailure(error);}calendar.dispatch({type:'RECEIVE_EVENT_ERROR',sourceId:eventSource.sourceId,fetchId:fetchId,fetchRange:fetchRange,error:error});});return__assign({},eventSource,{isFetching:true,latestFetchId:fetchId});}functionreceiveResponse(sourceHash,sourceId,fetchId,fetchRange){var_a;vareventSource=sourceHash[sourceId];if(eventSource&&// not already removedfetchId===eventSource.latestFetchId){return__assign({},sourceHash,(_a={},_a[sourceId]=__assign({},eventSource,{isFetching:false,fetchRange:fetchRange// also serves as a marker that at least one fetch has completed}),_a));}returnsourceHash;}functionexcludeStaticSources(eventSources,calendar){returnfilterHash(eventSources,function(eventSource){returndoesSourceNeedRange(eventSource,calendar);});}varDateProfileGenerator=/** @class */(function(){functionDateProfileGenerator(viewSpec,calendar){this.viewSpec=viewSpec;this.options=viewSpec.options;this.dateEnv=calendar.dateEnv;this.calendar=calendar;this.initHiddenDays();}/* Date Range Computation ------------------------------------------------------------------------------------------------------------------*/// Builds a structure with info about what the dates/ranges will be for the "prev" view.DateProfileGenerator.prototype.buildPrev=function(currentDateProfile,currentDate){vardateEnv=this.dateEnv;varprevDate=dateEnv.subtract(dateEnv.startOf(currentDate,currentDateProfile.currentRangeUnit),// important for start-of-monthcurrentDateProfile.dateIncrement);returnthis.build(prevDate,-1);};// Builds a structure with info about what the dates/ranges will be for the "next" view.DateProfileGenerator.prototype.buildNext=function(currentDateProfile,currentDate){vardateEnv=this.dateEnv;varnextDate=dateEnv.add(dateEnv.startOf(currentDate,currentDateProfile.currentRangeUnit),// important for start-of-monthcurrentDateProfile.dateIncrement);returnthis.build(nextDate,1);};// 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).DateProfileGenerator.prototype.build=function(currentDate,direction,forceToValid){if(forceToValid===void0){forceToValid=false;}varvalidRange;varminTime=null;varmaxTime=null;varcurrentInfo;varisRangeAllDay;varrenderRange;varactiveRange;varisValid;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(!this.options.showNonCurrentDates){activeRange=intersectRanges(activeRange,currentInfo.range);}minTime=createDuration(this.options.minTime);maxTime=createDuration(this.options.maxTime);activeRange=this.adjustActiveRange(activeRange,minTime,maxTime);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:validRange,// range the view is formally responsible for.// for example, a month view might have 1st-31st, excluding padded datescurrentRange:currentInfo.range,// name of largest unit being displayed, like "month" or "week"currentRangeUnit:currentInfo.unit,isRangeAllDay:isRangeAllDay,// dates that display events and accept drag-n-drop// will be `null` if no dates accept eventsactiveRange:activeRange,// date range with a rendered skeleton// includes not-active days that need some sort of DOMrenderRange:renderRange,// Duration object that denotes the first visible time of any given dayminTime:minTime,// Duration object that denotes the exclusive visible end time of any given daymaxTime:maxTime,isValid:isValid,// how far the current date will move for a prev/next operationdateIncrement: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.DateProfileGenerator.prototype.buildValidRange=function(){returnthis.getRangeOption('validRange',this.calendar.getNow())||{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.DateProfileGenerator.prototype.buildCurrentRangeInfo=function(date,direction){var_a=this,viewSpec=_a.viewSpec,dateEnv=_a.dateEnv;varduration=null;varunit=null;varrange=null;vardayCount;if(viewSpec.duration){duration=viewSpec.duration;unit=viewSpec.durationUnit;range=this.buildRangeFromDuration(date,direction,duration,unit);}elseif((dayCount=this.options.dayCount)){unit='day';range=this.buildRangeFromDayCount(date,direction,dayCount);}elseif((range=this.buildCustomVisibleRange(date))){unit=dateEnv.greatestWholeUnit(range.start,range.end).unit;}else{duration=this.getFallbackDuration();unit=greatestDurationDenominator(duration).unit;range=this.buildRangeFromDuration(date,direction,duration,unit);}return{duration:duration,unit:unit,range:range};};DateProfileGenerator.prototype.getFallbackDuration=function(){returncreateDuration({day:1});};// Returns a new activeRange to have time values (un-ambiguate)// minTime or maxTime causes the range to expand.DateProfileGenerator.prototype.adjustActiveRange=function(range,minTime,maxTime){vardateEnv=this.dateEnv;varstart=range.start;varend=range.end;if(this.viewSpec.class.prototype.usesMinMaxTime){// expand active range if minTime is negative (why not when positive?)if(asRoughDays(minTime)<0){start=startOfDay(start);// necessary?start=dateEnv.add(start,minTime);}// expand active range if maxTime is beyond one day (why not when positive?)if(asRoughDays(maxTime)>1){end=startOfDay(end);// necessary?end=addDays(end,-1);end=dateEnv.add(end,maxTime);}}return{start:start,end:end};};// Builds the "current" range when it is specified as an explicit duration.// `unit` is the already-computed greatestDurationDenominator unit of duration.DateProfileGenerator.prototype.buildRangeFromDuration=function(date,direction,duration,unit){vardateEnv=this.dateEnv;varalignment=this.options.dateAlignment;vardateIncrementInput;vardateIncrementDuration;varstart;varend;varres;// compute what the alignment should beif(!alignment){dateIncrementInput=this.options.dateIncrement;if(dateIncrementInput){dateIncrementDuration=createDuration(dateIncrementInput);// use the smaller of the two unitsif(asRoughMs(dateIncrementDuration)<asRoughMs(duration)){alignment=greatestDurationDenominator(dateIncrementDuration,!getWeeksFromInput(dateIncrementInput)).unit;}else{alignment=unit;}}else{alignment=unit;}}// if the view displays a single day or smallerif(asRoughDays(duration)<=1){if(this.isHiddenDay(start)){start=this.skipHiddenDays(start,direction);start=startOfDay(start);}}functioncomputeRes(){start=dateEnv.startOf(date,alignment);end=dateEnv.add(start,duration);res={start:start,end:end};}computeRes();// if range is completely enveloped by hidden days, go past the hidden daysif(!this.trimHiddenDays(res)){date=this.skipHiddenDays(date,direction);computeRes();}returnres;};// Builds the "current" range when a dayCount is specified.DateProfileGenerator.prototype.buildRangeFromDayCount=function(date,direction,dayCount){vardateEnv=this.dateEnv;varcustomAlignment=this.options.dateAlignment;varrunningCount=0;varstart=date;varend;if(customAlignment){start=dateEnv.startOf(start,customAlignment);}start=startOfDay(start);start=this.skipHiddenDays(start,direction);end=start;do{end=addDays(end,1);if(!this.isHiddenDay(end)){runningCount++;}}while(runningCount<dayCount);return{start:start,end:end};};// Builds a normalized range object for the "visible" range,// which is a way to define the currentRange and activeRange at the same time.DateProfileGenerator.prototype.buildCustomVisibleRange=function(date){vardateEnv=this.dateEnv;varvisibleRange=this.getRangeOption('visibleRange',dateEnv.toDate(date));if(visibleRange&&(visibleRange.start==null||visibleRange.end==null)){returnnull;}returnvisibleRange;};// Computes the range that will represent the element/cells for *rendering*,// but which may have voided days/times.// not responsible for trimming hidden days.DateProfileGenerator.prototype.buildRenderRange=function(currentRange,currentRangeUnit,isRangeAllDay){returncurrentRange;};// Compute the duration value that should be added/substracted to the current date// when a prev/next operation happens.DateProfileGenerator.prototype.buildDateIncrement=function(fallback){vardateIncrementInput=this.options.dateIncrement;varcustomAlignment;if(dateIncrementInput){returncreateDuration(dateIncrementInput);}elseif((customAlignment=this.options.dateAlignment)){returncreateDuration(1,customAlignment);}elseif(fallback){returnfallback;}else{returncreateDuration({days:1});}};// Arguments after name will be forwarded to a hypothetical function value// WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.// Always clone your objects if you fear mutation.DateProfileGenerator.prototype.getRangeOption=function(name){varotherArgs=[];for(var_i=1;_i<arguments.length;_i++){otherArgs[_i-1]=arguments[_i];}varval=this.options[name];if(typeofval==='function'){val=val.apply(null,otherArgs);}if(val){val=parseRange(val,this.dateEnv);}if(val){val=computeVisibleDayRange(val);}returnval;};/* Hidden Days ------------------------------------------------------------------------------------------------------------------*/// Initializes internal variables related to calculating hidden days-of-weekDateProfileGenerator.prototype.initHiddenDays=function(){varhiddenDays=this.options.hiddenDays||[];// array of day-of-week indices that are hiddenvarisHiddenDayHash=[];// is the day-of-week hidden? (hash with day-of-week-index -> bool)vardayCnt=0;vari;if(this.options.weekends===false){hiddenDays.push(0,6);// 0=sunday, 6=saturday}for(i=0;i<7;i++){if(!(isHiddenDayHash[i]=hiddenDays.indexOf(i)!==-1)){dayCnt++;}}if(!dayCnt){thrownewError('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 nullDateProfileGenerator.prototype.trimHiddenDays=function(range){varstart=range.start;varend=range.end;if(start){start=this.skipHiddenDays(start);}if(end){end=this.skipHiddenDays(end,-1,true);}if(start==null||end==null||start<end){return{start:start,end:end};}returnnull;};// Is the current day hidden?// `day` is a day-of-week index (0-6), or a Date (used for UTC)DateProfileGenerator.prototype.isHiddenDay=function(day){if(dayinstanceofDate){day=day.getUTCDay();}returnthis.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)DateProfileGenerator.prototype.skipHiddenDays=function(date,inc,isExclusive){if(inc===void0){inc=1;}if(isExclusive===void0){isExclusive=false;}while(this.isHiddenDayHash[(date.getUTCDay()+(isExclusive?inc:0)+7)%7]){date=addDays(date,inc);}returndate;};returnDateProfileGenerator;}());// TODO: find a way to avoid comparing DateProfiles. it's tediousfunctionisDateProfilesEqual(p0,p1){returnrangesEqual(p0.validRange,p1.validRange)&&rangesEqual(p0.activeRange,p1.activeRange)&&rangesEqual(p0.renderRange,p1.renderRange)&&durationsEqual(p0.minTime,p1.minTime)&&durationsEqual(p0.maxTime,p1.maxTime);/* TODO: compare more? currentRange: DateRange currentRangeUnit: string isRangeAllDay: boolean isValid: boolean dateIncrement: Duration */}functionreduce(state,action,calendar){varviewType=reduceViewType(state.viewType,action);vardateProfile=reduceDateProfile(state.dateProfile,action,state.currentDate,viewType,calendar);vareventSources=reduceEventSources(state.eventSources,action,dateProfile,calendar);varnextState=__assign({},state,{viewType:viewType,dateProfile:dateProfile,currentDate:reduceCurrentDate(state.currentDate,action,dateProfile),eventSources:eventSources,eventStore:reduceEventStore(state.eventStore,action,eventSources,dateProfile,calendar),dateSelection:reduceDateSelection(state.dateSelection,action,calendar),eventSelection:reduceSelectedEvent(state.eventSelection,action),eventDrag:reduceEventDrag(state.eventDrag,action,eventSources,calendar),eventResize:reduceEventResize(state.eventResize,action,eventSources,calendar),eventSourceLoadingLevel:computeLoadingLevel(eventSources),loadingLevel:computeLoadingLevel(eventSources)});for(var_i=0,_a=calendar.pluginSystem.hooks.reducers;_i<_a.length;_i++){varreducerFunc=_a[_i];nextState=reducerFunc(nextState,action,calendar);}// console.log(action.type, nextState)returnnextState;}functionreduceViewType(currentViewType,action){switch(action.type){case'SET_VIEW_TYPE':returnaction.viewType;default:returncurrentViewType;}}functionreduceDateProfile(currentDateProfile,action,currentDate,viewType,calendar){varnewDateProfile;switch(action.type){case'PREV':newDateProfile=calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile,currentDate);break;case'NEXT':newDateProfile=calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile,currentDate);break;case'SET_DATE':if(!currentDateProfile.activeRange||!rangeContainsMarker(currentDateProfile.currentRange,action.dateMarker)){newDateProfile=calendar.dateProfileGenerators[viewType].build(action.dateMarker,undefined,true// forceToValid);}break;case'SET_VIEW_TYPE':vargenerator=calendar.dateProfileGenerators[viewType];if(!generator){thrownewError(viewType?'The FullCalendar view "'+viewType+'" does not exist. Make sure your plugins are loaded correctly.':'No available FullCalendar view plugins.');}newDateProfile=generator.build(action.dateMarker||currentDate,undefined,true// forceToValid);break;}if(newDateProfile&&newDateProfile.isValid&&!(currentDateProfile&&isDateProfilesEqual(currentDateProfile,newDateProfile))){returnnewDateProfile;}else{returncurrentDateProfile;}}functionreduceCurrentDate(currentDate,action,dateProfile){switch(action.type){case'PREV':case'NEXT':if(!rangeContainsMarker(dateProfile.currentRange,currentDate)){returndateProfile.currentRange.start;}else{returncurrentDate;}case'SET_DATE':case'SET_VIEW_TYPE':varnewDate=action.dateMarker||currentDate;if(dateProfile.activeRange&&!rangeContainsMarker(dateProfile.activeRange,newDate)){returndateProfile.currentRange.start;}else{returnnewDate;}default:returncurrentDate;}}functionreduceDateSelection(currentSelection,action,calendar){switch(action.type){case'SELECT_DATES':returnaction.selection;case'UNSELECT_DATES':returnnull;default:returncurrentSelection;}}functionreduceSelectedEvent(currentInstanceId,action){switch(action.type){case'SELECT_EVENT':returnaction.eventInstanceId;case'UNSELECT_EVENT':return'';default:returncurrentInstanceId;}}functionreduceEventDrag(currentDrag,action,sources,calendar){switch(action.type){case'SET_EVENT_DRAG':varnewDrag=action.state;return{affectedEvents:newDrag.affectedEvents,mutatedEvents:newDrag.mutatedEvents,isEvent:newDrag.isEvent,origSeg:newDrag.origSeg};case'UNSET_EVENT_DRAG':returnnull;default:returncurrentDrag;}}functionreduceEventResize(currentResize,action,sources,calendar){switch(action.type){case'SET_EVENT_RESIZE':varnewResize=action.state;return{affectedEvents:newResize.affectedEvents,mutatedEvents:newResize.mutatedEvents,isEvent:newResize.isEvent,origSeg:newResize.origSeg};case'UNSET_EVENT_RESIZE':returnnull;default:returncurrentResize;}}functioncomputeLoadingLevel(eventSources){varcnt=0;for(varsourceIdineventSources){if(eventSources[sourceId].isFetching){cnt++;}}returncnt;}varSTANDARD_PROPS={start:null,end:null,allDay:Boolean};functionparseDateSpan(raw,dateEnv,defaultDuration){varspan=parseOpenDateSpan(raw,dateEnv);varrange=span.range;if(!range.start){returnnull;}if(!range.end){if(defaultDuration==null){returnnull;}else{range.end=dateEnv.add(range.start,defaultDuration);}}returnspan;}/* TODO: somehow combine with parseRange? Will return null if the start/endpropswerepresentbutparsedinvalidly.*/ function parseOpenDateSpan(raw, dateEnv) { var leftovers = {}; var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers); var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; var allDay = standardProps.allDay; if (allDay == null) { allDay = (startMeta && startMeta.isTimeUnspecified) &&(!endMeta || endMeta.isTimeUnspecified); } //usethisleftoverobjectastheselectionobjectleftovers.range={start:startMeta?startMeta.marker:null,end:endMeta?endMeta.marker:null};leftovers.allDay=allDay;returnleftovers;}functionisDateSpansEqual(span0,span1){returnrangesEqual(span0.range,span1.range)&&span0.allDay===span1.allDay&&isSpanPropsEqual(span0,span1);}// the NON-DATE-RELATED propsfunctionisSpanPropsEqual(span0,span1){for(varpropNameinspan1){if(propName!=='range'&&propName!=='allDay'){if(span0[propName]!==span1[propName]){returnfalse;}}}// are there any props that span0 has that span1 DOESN'T have?// both have range/allDay, so no need to special-case.for(varpropNameinspan0){if(!(propNameinspan1)){returnfalse;}}returntrue;}functionbuildDateSpanApi(span,dateEnv){return{start:dateEnv.toDate(span.range.start),end:dateEnv.toDate(span.range.end),startStr:dateEnv.formatIso(span.range.start,{omitTime:span.allDay}),endStr:dateEnv.formatIso(span.range.end,{omitTime:span.allDay}),allDay:span.allDay};}functionbuildDatePointApi(span,dateEnv){return{date:dateEnv.toDate(span.range.start),dateStr:dateEnv.formatIso(span.range.start,{omitTime:span.allDay}),allDay:span.allDay};}functionfabricateEventRange(dateSpan,eventUiBases,calendar){vardef=parseEventDef({editable:false},'',// sourceIddateSpan.allDay,true,// hasEndcalendar);return{def:def,ui:compileEventUi(def,eventUiBases),instance:createEventInstance(def.defId,dateSpan.range),range:dateSpan.range,isStart:true,isEnd:true};}functioncompileViewDefs(defaultConfigs,overrideConfigs){varhash={};varviewType;for(viewTypeindefaultConfigs){ensureViewDef(viewType,hash,defaultConfigs,overrideConfigs);}for(viewTypeinoverrideConfigs){ensureViewDef(viewType,hash,defaultConfigs,overrideConfigs);}returnhash;}functionensureViewDef(viewType,hash,defaultConfigs,overrideConfigs){if(hash[viewType]){returnhash[viewType];}varviewDef=buildViewDef(viewType,hash,defaultConfigs,overrideConfigs);if(viewDef){hash[viewType]=viewDef;}returnviewDef;}functionbuildViewDef(viewType,hash,defaultConfigs,overrideConfigs){vardefaultConfig=defaultConfigs[viewType];varoverrideConfig=overrideConfigs[viewType];varqueryProp=function(name){return(defaultConfig&&defaultConfig[name]!==null)?defaultConfig[name]:((overrideConfig&&overrideConfig[name]!==null)?overrideConfig[name]:null);};vartheClass=queryProp('class');varsuperType=queryProp('superType');if(!superType&&theClass){superType=findViewNameBySubclass(theClass,overrideConfigs)||findViewNameBySubclass(theClass,defaultConfigs);}varsuperDef=null;if(superType){if(superType===viewType){thrownewError('Can\'t have a custom view type that references itself');}superDef=ensureViewDef(superType,hash,defaultConfigs,overrideConfigs);}if(!theClass&&superDef){theClass=superDef.class;}if(!theClass){returnnull;// don't throw a warning, might be settings for a single-unit view}return{type:viewType,class:theClass,defaults:__assign({},(superDef?superDef.defaults:{}),(defaultConfig?defaultConfig.options:{})),overrides:__assign({},(superDef?superDef.overrides:{}),(overrideConfig?overrideConfig.options:{}))};}functionfindViewNameBySubclass(viewSubclass,configs){varsuperProto=Object.getPrototypeOf(viewSubclass.prototype);for(varviewTypeinconfigs){varparsed=configs[viewType];// need DIRECT subclass, so instanceof won't do itif(parsed.class&&parsed.class.prototype===superProto){returnviewType;}}return'';}functionparseViewConfigs(inputs){returnmapHash(inputs,parseViewConfig);}varVIEW_DEF_PROPS={type:String,class:null};functionparseViewConfig(input){if(typeofinput==='function'){input={class:input};}varoptions={};varprops=refineProps(input,VIEW_DEF_PROPS,{},options);return{superType:props.type,class:props.class,options:options};}functionbuildViewSpecs(defaultInputs,optionsManager){vardefaultConfigs=parseViewConfigs(defaultInputs);varoverrideConfigs=parseViewConfigs(optionsManager.overrides.views);varviewDefs=compileViewDefs(defaultConfigs,overrideConfigs);returnmapHash(viewDefs,function(viewDef){returnbuildViewSpec(viewDef,overrideConfigs,optionsManager);});}functionbuildViewSpec(viewDef,overrideConfigs,optionsManager){vardurationInput=viewDef.overrides.duration||viewDef.defaults.duration||optionsManager.dynamicOverrides.duration||optionsManager.overrides.duration;varduration=null;vardurationUnit='';varsingleUnit='';varsingleUnitOverrides={};if(durationInput){duration=createDuration(durationInput);if(duration){// valid?vardenom=greatestDurationDenominator(duration,!getWeeksFromInput(durationInput));durationUnit=denom.unit;if(denom.value===1){singleUnit=durationUnit;singleUnitOverrides=overrideConfigs[durationUnit]?overrideConfigs[durationUnit].options:{};}}}varqueryButtonText=function(options){varbuttonTextMap=options.buttonText||{};varbuttonTextKey=viewDef.defaults.buttonTextKey;if(buttonTextKey!=null&&buttonTextMap[buttonTextKey]!=null){returnbuttonTextMap[buttonTextKey];}if(buttonTextMap[viewDef.type]!=null){returnbuttonTextMap[viewDef.type];}if(buttonTextMap[singleUnit]!=null){returnbuttonTextMap[singleUnit];}};return{type:viewDef.type,class:viewDef.class,duration:duration,durationUnit:durationUnit,singleUnit:singleUnit,options:__assign({},globalDefaults,viewDef.defaults,optionsManager.dirDefaults,optionsManager.localeDefaults,optionsManager.overrides,singleUnitOverrides,viewDef.overrides,optionsManager.dynamicOverrides),buttonTextOverride:queryButtonText(optionsManager.dynamicOverrides)||queryButtonText(optionsManager.overrides)||// constructor-specified buttonText lookup hash takes precedenceviewDef.overrides.buttonText,buttonTextDefault:queryButtonText(optionsManager.localeDefaults)||queryButtonText(optionsManager.dirDefaults)||viewDef.defaults.buttonText||queryButtonText(globalDefaults)||viewDef.type// fall back to given view name};}varToolbar=/** @class */(function(_super){__extends(Toolbar,_super);functionToolbar(extraClassName){var_this=_super.call(this)||this;_this._renderLayout=memoizeRendering(_this.renderLayout,_this.unrenderLayout);_this._updateTitle=memoizeRendering(_this.updateTitle,null,[_this._renderLayout]);_this._updateActiveButton=memoizeRendering(_this.updateActiveButton,null,[_this._renderLayout]);_this._updateToday=memoizeRendering(_this.updateToday,null,[_this._renderLayout]);_this._updatePrev=memoizeRendering(_this.updatePrev,null,[_this._renderLayout]);_this._updateNext=memoizeRendering(_this.updateNext,null,[_this._renderLayout]);_this.el=createElement('div',{className:'fc-toolbar '+extraClassName});return_this;}Toolbar.prototype.destroy=function(){_super.prototype.destroy.call(this);this._renderLayout.unrender();// should unrender everything elseremoveElement(this.el);};Toolbar.prototype.render=function(props){this._renderLayout(props.layout);this._updateTitle(props.title);this._updateActiveButton(props.activeButton);this._updateToday(props.isTodayEnabled);this._updatePrev(props.isPrevEnabled);this._updateNext(props.isNextEnabled);};Toolbar.prototype.renderLayout=function(layout){varel=this.el;this.viewsWithButtons=[];appendToElement(el,this.renderSection('left',layout.left));appendToElement(el,this.renderSection('center',layout.center));appendToElement(el,this.renderSection('right',layout.right));};Toolbar.prototype.unrenderLayout=function(){this.el.innerHTML='';};Toolbar.prototype.renderSection=function(position,buttonStr){var_this=this;var_a=this.context,theme=_a.theme,calendar=_a.calendar;varoptionsManager=calendar.optionsManager;varviewSpecs=calendar.viewSpecs;varsectionEl=createElement('div',{className:'fc-'+position});varcalendarCustomButtons=optionsManager.computed.customButtons||{};varcalendarButtonTextOverrides=optionsManager.overrides.buttonText||{};varcalendarButtonText=optionsManager.computed.buttonText||{};if(buttonStr){buttonStr.split(' ').forEach(function(buttonGroupStr,i){vargroupChildren=[];varisOnlyButtons=true;vargroupEl;buttonGroupStr.split(',').forEach(function(buttonName,j){varcustomButtonProps;varviewSpec;varbuttonClick;varbuttonIcon;// only one of these will be setvarbuttonText;// "varbuttonInnerHtml;varbuttonClasses;varbuttonEl;varbuttonAriaAttr;if(buttonName==='title'){groupChildren.push(htmlToElement('<h2> </h2>'));// we always want it to take up heightisOnlyButtons=false;}else{if((customButtonProps=calendarCustomButtons[buttonName])){buttonClick=function(ev){if(customButtonProps.click){customButtonProps.click.call(buttonEl,ev);}};(buttonIcon=theme.getCustomButtonIconClass(customButtonProps))||(buttonIcon=theme.getIconClass(buttonName))||(buttonText=customButtonProps.text);}elseif((viewSpec=viewSpecs[buttonName])){_this.viewsWithButtons.push(buttonName);buttonClick=function(){calendar.changeView(buttonName);};(buttonText=viewSpec.buttonTextOverride)||(buttonIcon=theme.getIconClass(buttonName))||(buttonText=viewSpec.buttonTextDefault);}elseif(calendar[buttonName]){// a calendar methodbuttonClick=function(){calendar[buttonName]();};(buttonText=calendarButtonTextOverrides[buttonName])||(buttonIcon=theme.getIconClass(buttonName))||(buttonText=calendarButtonText[buttonName]);// ^ everything else is considered default}if(buttonClick){buttonClasses=['fc-'+buttonName+'-button',theme.getClass('button')];if(buttonText){buttonInnerHtml=htmlEscape(buttonText);buttonAriaAttr='';}elseif(buttonIcon){buttonInnerHtml="<span class='"+buttonIcon+"'></span>";buttonAriaAttr=' aria-label="'+buttonName+'"';}buttonEl=htmlToElement(// type="button" so that it doesn't submit a form'<button type="button" class="'+buttonClasses.join(' ')+'"'+buttonAriaAttr+'>'+buttonInnerHtml+'</button>');buttonEl.addEventListener('click',buttonClick);groupChildren.push(buttonEl);}}});if(groupChildren.length>1){groupEl=document.createElement('div');varbuttonGroupClassName=theme.getClass('buttonGroup');if(isOnlyButtons&&buttonGroupClassName){groupEl.classList.add(buttonGroupClassName);}appendToElement(groupEl,groupChildren);sectionEl.appendChild(groupEl);}else{appendToElement(sectionEl,groupChildren);// 1 or 0 children}});}returnsectionEl;};Toolbar.prototype.updateToday=function(isTodayEnabled){this.toggleButtonEnabled('today',isTodayEnabled);};Toolbar.prototype.updatePrev=function(isPrevEnabled){this.toggleButtonEnabled('prev',isPrevEnabled);};Toolbar.prototype.updateNext=function(isNextEnabled){this.toggleButtonEnabled('next',isNextEnabled);};Toolbar.prototype.updateTitle=function(text){findElements(this.el,'h2').forEach(function(titleEl){titleEl.innerText=text;});};Toolbar.prototype.updateActiveButton=function(buttonName){vartheme=this.context.theme;varclassName=theme.getClass('buttonActive');findElements(this.el,'button').forEach(function(buttonEl){if(buttonName&&buttonEl.classList.contains('fc-'+buttonName+'-button')){buttonEl.classList.add(className);}else{buttonEl.classList.remove(className);}});};Toolbar.prototype.toggleButtonEnabled=function(buttonName,bool){findElements(this.el,'.fc-'+buttonName+'-button').forEach(function(buttonEl){buttonEl.disabled=!bool;});};returnToolbar;}(Component));varCalendarComponent=/** @class */(function(_super){__extends(CalendarComponent,_super);functionCalendarComponent(el){var_this=_super.call(this)||this;_this.elClassNames=[];_this.renderSkeleton=memoizeRendering(_this._renderSkeleton,_this._unrenderSkeleton);_this.renderToolbars=memoizeRendering(_this._renderToolbars,_this._unrenderToolbars,[_this.renderSkeleton]);_this.buildComponentContext=memoize(buildComponentContext);_this.buildViewPropTransformers=memoize(buildViewPropTransformers);_this.el=el;_this.computeTitle=memoize(computeTitle);_this.parseBusinessHours=memoize(function(input){returnparseBusinessHours(input,_this.context.calendar);});return_this;}CalendarComponent.prototype.render=function(props,context){this.freezeHeight();vartitle=this.computeTitle(props.dateProfile,props.viewSpec.options);this.renderSkeleton(context);this.renderToolbars(props.viewSpec,props.dateProfile,props.currentDate,title);this.renderView(props,title);this.updateSize();this.thawHeight();};CalendarComponent.prototype.destroy=function(){if(this.header){this.header.destroy();}if(this.footer){this.footer.destroy();}this.renderSkeleton.unrender();// will call destroyView_super.prototype.destroy.call(this);};CalendarComponent.prototype._renderSkeleton=function(context){this.updateElClassNames(context);prependToElement(this.el,this.contentEl=createElement('div',{className:'fc-view-container'}));varcalendar=context.calendar;for(var_i=0,_a=calendar.pluginSystem.hooks.viewContainerModifiers;_i<_a.length;_i++){varmodifyViewContainer=_a[_i];modifyViewContainer(this.contentEl,calendar);}};CalendarComponent.prototype._unrenderSkeleton=function(){// weird to have this hereif(this.view){this.savedScroll=this.view.queryScroll();this.view.destroy();this.view=null;}removeElement(this.contentEl);this.removeElClassNames();};CalendarComponent.prototype.removeElClassNames=function(){varclassList=this.el.classList;for(var_i=0,_a=this.elClassNames;_i<_a.length;_i++){varclassName=_a[_i];classList.remove(className);}this.elClassNames=[];};CalendarComponent.prototype.updateElClassNames=function(context){this.removeElClassNames();vartheme=context.theme,options=context.options;this.elClassNames=['fc','fc-'+options.dir,theme.getClass('widget')];varclassList=this.el.classList;for(var_i=0,_a=this.elClassNames;_i<_a.length;_i++){varclassName=_a[_i];classList.add(className);}};CalendarComponent.prototype._renderToolbars=function(viewSpec,dateProfile,currentDate,title){var_a=this,context=_a.context,header=_a.header,footer=_a.footer;varoptions=context.options,calendar=context.calendar;varheaderLayout=options.header;varfooterLayout=options.footer;vardateProfileGenerator=this.props.dateProfileGenerator;varnow=calendar.getNow();vartodayInfo=dateProfileGenerator.build(now);varprevInfo=dateProfileGenerator.buildPrev(dateProfile,currentDate);varnextInfo=dateProfileGenerator.buildNext(dateProfile,currentDate);vartoolbarProps={title:title,activeButton:viewSpec.type,isTodayEnabled:todayInfo.isValid&&!rangeContainsMarker(dateProfile.currentRange,now),isPrevEnabled:prevInfo.isValid,isNextEnabled:nextInfo.isValid};if(headerLayout){if(!header){header=this.header=newToolbar('fc-header-toolbar');prependToElement(this.el,header.el);}header.receiveProps(__assign({layout:headerLayout},toolbarProps),context);}elseif(header){header.destroy();header=this.header=null;}if(footerLayout){if(!footer){footer=this.footer=newToolbar('fc-footer-toolbar');appendToElement(this.el,footer.el);}footer.receiveProps(__assign({layout:footerLayout},toolbarProps),context);}elseif(footer){footer.destroy();footer=this.footer=null;}};CalendarComponent.prototype._unrenderToolbars=function(){if(this.header){this.header.destroy();this.header=null;}if(this.footer){this.footer.destroy();this.footer=null;}};CalendarComponent.prototype.renderView=function(props,title){varview=this.view;var_a=this.context,calendar=_a.calendar,options=_a.options;varviewSpec=props.viewSpec,dateProfileGenerator=props.dateProfileGenerator;if(!view||view.viewSpec!==viewSpec){if(view){view.destroy();}view=this.view=newviewSpec['class'](viewSpec,this.contentEl);if(this.savedScroll){view.addScroll(this.savedScroll,true);this.savedScroll=null;}}view.title=title;// for the APIvarviewProps={dateProfileGenerator:dateProfileGenerator,dateProfile:props.dateProfile,businessHours:this.parseBusinessHours(viewSpec.options.businessHours),eventStore:props.eventStore,eventUiBases:props.eventUiBases,dateSelection:props.dateSelection,eventSelection:props.eventSelection,eventDrag:props.eventDrag,eventResize:props.eventResize};vartransformers=this.buildViewPropTransformers(calendar.pluginSystem.hooks.viewPropsTransformers);for(var_i=0,transformers_1=transformers;_i<transformers_1.length;_i++){vartransformer=transformers_1[_i];__assign(viewProps,transformer.transform(viewProps,viewSpec,props,options));}view.receiveProps(viewProps,this.buildComponentContext(this.context,viewSpec,view));};// Sizing// -----------------------------------------------------------------------------------------------------------------CalendarComponent.prototype.updateSize=function(isResize){if(isResize===void0){isResize=false;}varview=this.view;if(!view){return;// why?}if(isResize||this.isHeightAuto==null){this.computeHeightVars();}view.updateSize(isResize,this.viewHeight,this.isHeightAuto);view.updateNowIndicator();// we need to guarantee this will run after updateSizeview.popScroll(isResize);};CalendarComponent.prototype.computeHeightVars=function(){varcalendar=this.context.calendar;// yuck. need to handle dynamic optionsvarheightInput=calendar.opt('height');varcontentHeightInput=calendar.opt('contentHeight');this.isHeightAuto=heightInput==='auto'||contentHeightInput==='auto';if(typeofcontentHeightInput==='number'){// exists and not 'auto'this.viewHeight=contentHeightInput;}elseif(typeofcontentHeightInput==='function'){// exists and is a functionthis.viewHeight=contentHeightInput();}elseif(typeofheightInput==='number'){// exists and not 'auto'this.viewHeight=heightInput-this.queryToolbarsHeight();}elseif(typeofheightInput==='function'){// exists and is a functionthis.viewHeight=heightInput()-this.queryToolbarsHeight();}elseif(heightInput==='parent'){// set to height of parent elementvarparentEl=this.el.parentNode;this.viewHeight=parentEl.getBoundingClientRect().height-this.queryToolbarsHeight();}else{this.viewHeight=Math.round(this.contentEl.getBoundingClientRect().width/Math.max(calendar.opt('aspectRatio'),.5));}};CalendarComponent.prototype.queryToolbarsHeight=function(){varheight=0;if(this.header){height+=computeHeightAndMargins(this.header.el);}if(this.footer){height+=computeHeightAndMargins(this.footer.el);}returnheight;};// Height "Freezing"// -----------------------------------------------------------------------------------------------------------------CalendarComponent.prototype.freezeHeight=function(){applyStyle(this.el,{height:this.el.getBoundingClientRect().height,overflow:'hidden'});};CalendarComponent.prototype.thawHeight=function(){applyStyle(this.el,{height:'',overflow:''});};returnCalendarComponent;}(Component));// Title and Date Formatting// -----------------------------------------------------------------------------------------------------------------// Computes what the title at the top of the calendar should be for this viewfunctioncomputeTitle(dateProfile,viewOptions){varrange;// for views that span a large unit of time, show the proper interval, ignoring stray days before and afterif(/^(year|month)$/.test(dateProfile.currentRangeUnit)){range=dateProfile.currentRange;}else{// for day units or smaller, use the actual day rangerange=dateProfile.activeRange;}returnthis.context.dateEnv.formatRange(range.start,range.end,createFormatter(viewOptions.titleFormat||computeTitleFormat(dateProfile),viewOptions.titleRangeSeparator),{isEndExclusive:dateProfile.isRangeAllDay});}// 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`.functioncomputeTitleFormat(dateProfile){varcurrentRangeUnit=dateProfile.currentRangeUnit;if(currentRangeUnit==='year'){return{year:'numeric'};}elseif(currentRangeUnit==='month'){return{year:'numeric',month:'long'};// like "September 2014"}else{vardays=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'};}else{// one day. longer, like "September 9 2014"return{year:'numeric',month:'long',day:'numeric'};}}}// build a context scoped to the viewfunctionbuildComponentContext(context,viewSpec,view){returncontext.extend(viewSpec.options,view);}// Plugin// -----------------------------------------------------------------------------------------------------------------functionbuildViewPropTransformers(theClasses){returntheClasses.map(function(theClass){returnnewtheClass();});}varInteraction=/** @class */(function(){functionInteraction(settings){this.component=settings.component;}Interaction.prototype.destroy=function(){};returnInteraction;}());functionparseInteractionSettings(component,input){return{component:component,el:input.el,useEventCenter:input.useEventCenter!=null?input.useEventCenter:true};}functioninteractionSettingsToStore(settings){var_a;return_a={},_a[settings.component.uid]=settings,_a;}// global statevarinteractionSettingsStore={};/* Detects when the user clicks on an event within a DateComponent */varEventClicking=/** @class */(function(_super){__extends(EventClicking,_super);functionEventClicking(settings){var_this=_super.call(this,settings)||this;_this.handleSegClick=function(ev,segEl){varcomponent=_this.component;var_a=component.context,calendar=_a.calendar,view=_a.view;varseg=getElSeg(segEl);if(seg&&// might be the <div> surrounding the more linkcomponent.isValidSegDownEl(ev.target)){// our way to simulate a link click for elements that can't be <a> tags// grab before trigger fired in case trigger trashes DOM thru rerenderingvarhasUrlContainer=elementClosest(ev.target,'.fc-has-url');varurl=hasUrlContainer?hasUrlContainer.querySelector('a[href]').href:'';calendar.publiclyTrigger('eventClick',[{el:segEl,event:newEventApi(component.context.calendar,seg.eventRange.def,seg.eventRange.instance),jsEvent:ev,view:view}]);if(url&&!ev.defaultPrevented){window.location.href=url;}}};varcomponent=settings.component;_this.destroy=listenBySelector(component.el,'click',component.fgSegSelector+','+component.bgSegSelector,_this.handleSegClick);return_this;}returnEventClicking;}(Interaction));/* Triggers events and adds/removescoreclassNameswhentheuser'spointerenters/leavesevent-elementsofacomponent.*/ var EventHovering = /**@class*/ (function (_super) { __extends(EventHovering, _super); function EventHovering(settings) { var _this = _super.call(this, settings) || this; //forsimulatinganeventMouseLeavewhentheeventelisdestroyedwhilemouseisoverit_this.handleEventElRemove=function(el){if(el===_this.currentSegEl){_this.handleSegLeave(null,_this.currentSegEl);}};_this.handleSegEnter=function(ev,segEl){if(getElSeg(segEl)){// TODO: better way to make sure not hovering over more+ link or its wrappersegEl.classList.add('fc-allow-mouse-resize');_this.currentSegEl=segEl;_this.triggerEvent('eventMouseEnter',ev,segEl);}};_this.handleSegLeave=function(ev,segEl){if(_this.currentSegEl){segEl.classList.remove('fc-allow-mouse-resize');_this.currentSegEl=null;_this.triggerEvent('eventMouseLeave',ev,segEl);}};varcomponent=settings.component;_this.removeHoverListeners=listenToHoverBySelector(component.el,component.fgSegSelector+','+component.bgSegSelector,_this.handleSegEnter,_this.handleSegLeave);// how to make sure component already has context?component.context.calendar.on('eventElRemove',_this.handleEventElRemove);return_this;}EventHovering.prototype.destroy=function(){this.removeHoverListeners();this.component.context.calendar.off('eventElRemove',this.handleEventElRemove);};EventHovering.prototype.triggerEvent=function(publicEvName,ev,segEl){varcomponent=this.component;var_a=component.context,calendar=_a.calendar,view=_a.view;varseg=getElSeg(segEl);if(!ev||component.isValidSegDownEl(ev.target)){calendar.publiclyTrigger(publicEvName,[{el:segEl,event:newEventApi(calendar,seg.eventRange.def,seg.eventRange.instance),jsEvent:ev,view:view}]);}};returnEventHovering;}(Interaction));varStandardTheme=/** @class */(function(_super){__extends(StandardTheme,_super);functionStandardTheme(){return_super!==null&&_super.apply(this,arguments)||this;}returnStandardTheme;}(Theme));StandardTheme.prototype.classes={widget:'fc-unthemed',widgetHeader:'fc-widget-header',widgetContent:'fc-widget-content',buttonGroup:'fc-button-group',button:'fc-button fc-button-primary',buttonActive:'fc-button-active',popoverHeader:'fc-widget-header',popoverContent:'fc-widget-content',// day gridheaderRow:'fc-widget-header',dayRow:'fc-widget-content',// list viewlistView:'fc-widget-content'};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.iconOverrideOption='buttonIcons';StandardTheme.prototype.iconOverrideCustomButtonOption='icon';StandardTheme.prototype.iconOverridePrefix='fc-icon-';varCalendar=/** @class */(function(){functionCalendar(el,overrides){var_this=this;this.buildComponentContext=memoize(buildComponentContext$1);this.parseRawLocales=memoize(parseRawLocales);this.buildLocale=memoize(buildLocale);this.buildDateEnv=memoize(buildDateEnv);this.buildTheme=memoize(buildTheme);this.buildEventUiSingleBase=memoize(this._buildEventUiSingleBase);this.buildSelectionConfig=memoize(this._buildSelectionConfig);this.buildEventUiBySource=memoizeOutput(buildEventUiBySource,isPropsEqual);this.buildEventUiBases=memoize(buildEventUiBases);this.interactionsStore={};this.actionQueue=[];this.isReducing=false;// isDisplaying: boolean = false // installed in DOM? accepting renders?this.needsRerender=false;// needs a render?this.isRendering=false;// currently in the executeRender function?this.renderingPauseDepth=0;this.buildDelayedRerender=memoize(buildDelayedRerender);this.afterSizingTriggers={};this.isViewUpdated=false;this.isDatesUpdated=false;this.isEventsUpdated=false;this.el=el;this.optionsManager=newOptionsManager(overrides||{});this.pluginSystem=newPluginSystem();// only do once. don't do in handleOptions. because can't remove pluginsthis.addPluginInputs(this.optionsManager.computed.plugins||[]);this.handleOptions(this.optionsManager.computed);this.publiclyTrigger('_init');// for teststhis.hydrate();this.calendarInteractions=this.pluginSystem.hooks.calendarInteractions.map(function(calendarInteractionClass){returnnewcalendarInteractionClass(_this);});}Calendar.prototype.addPluginInputs=function(pluginInputs){varpluginDefs=refinePluginDefs(pluginInputs);for(var_i=0,pluginDefs_1=pluginDefs;_i<pluginDefs_1.length;_i++){varpluginDef=pluginDefs_1[_i];this.pluginSystem.add(pluginDef);}};Object.defineProperty(Calendar.prototype,"view",{// public APIget:function(){returnthis.component?this.component.view:null;},enumerable:true,configurable:true});// Public API for rendering// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.render=function(){if(!this.component){this.component=newCalendarComponent(this.el);this.renderableEventStore=createEmptyEventStore();this.bindHandlers();this.executeRender();}else{this.requestRerender();}};Calendar.prototype.destroy=function(){if(this.component){this.unbindHandlers();this.component.destroy();// don't null-out. in case API needs accessthis.component=null;// umm ???for(var_i=0,_a=this.calendarInteractions;_i<_a.length;_i++){varinteraction=_a[_i];interaction.destroy();}this.publiclyTrigger('_destroyed');}};// Handlers// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.bindHandlers=function(){var_this=this;// event delegation for nav linksthis.removeNavLinkListener=listenBySelector(this.el,'click','a[data-goto]',function(ev,anchorEl){vargotoOptions=anchorEl.getAttribute('data-goto');gotoOptions=gotoOptions?JSON.parse(gotoOptions):{};vardateEnv=_this.dateEnv;vardateMarker=dateEnv.createMarker(gotoOptions.date);varviewType=gotoOptions.type;// property like "navLinkDayClick". might be a string or a functionvarcustomAction=_this.viewOpt('navLink'+capitaliseFirstLetter(viewType)+'Click');if(typeofcustomAction==='function'){customAction(dateEnv.toDate(dateMarker),ev);}else{if(typeofcustomAction==='string'){viewType=customAction;}_this.zoomTo(dateMarker,viewType);}});if(this.opt('handleWindowResize')){window.addEventListener('resize',this.windowResizeProxy=debounce(// prevents rapid callsthis.windowResize.bind(this),this.opt('windowResizeDelay')));}};Calendar.prototype.unbindHandlers=function(){this.removeNavLinkListener();if(this.windowResizeProxy){window.removeEventListener('resize',this.windowResizeProxy);this.windowResizeProxy=null;}};// Dispatcher// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.hydrate=function(){var_this=this;this.state=this.buildInitialState();varrawSources=this.opt('eventSources')||[];varsingleRawSource=this.opt('events');varsources=[];// parsedif(singleRawSource){rawSources.unshift(singleRawSource);}for(var_i=0,rawSources_1=rawSources;_i<rawSources_1.length;_i++){varrawSource=rawSources_1[_i];varsource=parseEventSource(rawSource,this);if(source){sources.push(source);}}this.batchRendering(function(){_this.dispatch({type:'INIT'});// pass in sources here?_this.dispatch({type:'ADD_EVENT_SOURCES',sources:sources});_this.dispatch({type:'SET_VIEW_TYPE',viewType:_this.opt('defaultView')||_this.pluginSystem.hooks.defaultView});});};Calendar.prototype.buildInitialState=function(){return{viewType:null,loadingLevel:0,eventSourceLoadingLevel:0,currentDate:this.getInitialDate(),dateProfile:null,eventSources:{},eventStore:createEmptyEventStore(),dateSelection:null,eventSelection:'',eventDrag:null,eventResize:null};};Calendar.prototype.dispatch=function(action){this.actionQueue.push(action);if(!this.isReducing){this.isReducing=true;varoldState=this.state;while(this.actionQueue.length){this.state=this.reduce(this.state,this.actionQueue.shift(),this);}varnewState=this.state;this.isReducing=false;if(!oldState.loadingLevel&&newState.loadingLevel){this.publiclyTrigger('loading',[true]);}elseif(oldState.loadingLevel&&!newState.loadingLevel){this.publiclyTrigger('loading',[false]);}varview=this.component&&this.component.view;if(oldState.eventStore!==newState.eventStore){if(oldState.eventStore){this.isEventsUpdated=true;}}if(oldState.dateProfile!==newState.dateProfile){if(oldState.dateProfile&&view){// why would view be null!?this.publiclyTrigger('datesDestroy',[{view:view,el:view.el}]);}this.isDatesUpdated=true;}if(oldState.viewType!==newState.viewType){if(oldState.viewType&&view){// why would view be null!?this.publiclyTrigger('viewSkeletonDestroy',[{view:view,el:view.el}]);}this.isViewUpdated=true;}this.requestRerender();}};Calendar.prototype.reduce=function(state,action,calendar){returnreduce(state,action,calendar);};// Render Queue// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.requestRerender=function(){this.needsRerender=true;this.delayedRerender();// will call a debounced-version of tryRerender};Calendar.prototype.tryRerender=function(){if(this.component&&// must be accepting rendersthis.needsRerender&&// indicates that a rerender was requested!this.renderingPauseDepth&&// not paused!this.isRendering// not currently in the render loop){this.executeRender();}};Calendar.prototype.batchRendering=function(func){this.renderingPauseDepth++;func();this.renderingPauseDepth--;if(this.needsRerender){this.requestRerender();}};// Rendering// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.executeRender=function(){// clear these BEFORE the render so that new values will accumulate during renderthis.needsRerender=false;this.isRendering=true;this.renderComponent();this.isRendering=false;// received a rerender request while renderingif(this.needsRerender){this.delayedRerender();}};/* don't call this directly. use executeRender instead */Calendar.prototype.renderComponent=function(){var_a=this,state=_a.state,component=_a.component;varviewType=state.viewType;varviewSpec=this.viewSpecs[viewType];if(!viewSpec){thrownewError("View type \""+viewType+"\" is not valid");}// if event sources are still loading and progressive rendering hasn't been enabled,// keep rendering the last fully loaded set of eventsvarrenderableEventStore=this.renderableEventStore=(state.eventSourceLoadingLevel&&!this.opt('progressiveEventRendering'))?this.renderableEventStore:state.eventStore;vareventUiSingleBase=this.buildEventUiSingleBase(viewSpec.options);vareventUiBySource=this.buildEventUiBySource(state.eventSources);vareventUiBases=this.eventUiBases=this.buildEventUiBases(renderableEventStore.defs,eventUiSingleBase,eventUiBySource);component.receiveProps(__assign({},state,{viewSpec:viewSpec,dateProfileGenerator:this.dateProfileGenerators[viewType],dateProfile:state.dateProfile,eventStore:renderableEventStore,eventUiBases:eventUiBases,dateSelection:state.dateSelection,eventSelection:state.eventSelection,eventDrag:state.eventDrag,eventResize:state.eventResize}),this.buildComponentContext(this.theme,this.dateEnv,this.optionsManager.computed));if(this.isViewUpdated){this.isViewUpdated=false;this.publiclyTrigger('viewSkeletonRender',[{view:component.view,el:component.view.el}]);}if(this.isDatesUpdated){this.isDatesUpdated=false;this.publiclyTrigger('datesRender',[{view:component.view,el:component.view.el}]);}if(this.isEventsUpdated){this.isEventsUpdated=false;}this.releaseAfterSizingTriggers();};// Options// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.setOption=function(name,val){var_a;this.mutateOptions((_a={},_a[name]=val,_a),[],true);};Calendar.prototype.getOption=function(name){returnthis.optionsManager.computed[name];};Calendar.prototype.opt=function(name){returnthis.optionsManager.computed[name];};Calendar.prototype.viewOpt=function(name){returnthis.viewOpts()[name];};Calendar.prototype.viewOpts=function(){returnthis.viewSpecs[this.state.viewType].options;};/* handles option changes (like a diff) */Calendar.prototype.mutateOptions=function(updates,removals,isDynamic,deepEqual){var_this=this;varchangeHandlers=this.pluginSystem.hooks.optionChangeHandlers;varnormalUpdates={};varspecialUpdates={};varoldDateEnv=this.dateEnv;// do this before handleOptionsvarisTimeZoneDirty=false;varisSizeDirty=false;varanyDifficultOptions=Boolean(removals.length);for(varname_1inupdates){if(changeHandlers[name_1]){specialUpdates[name_1]=updates[name_1];}else{normalUpdates[name_1]=updates[name_1];}}for(varname_2innormalUpdates){if(/^(height|contentHeight|aspectRatio)$/.test(name_2)){isSizeDirty=true;}elseif(/^(defaultDate|defaultView)$/.test(name_2));else{anyDifficultOptions=true;if(name_2==='timeZone'){isTimeZoneDirty=true;}}}this.optionsManager.mutate(normalUpdates,removals,isDynamic);if(anyDifficultOptions){this.handleOptions(this.optionsManager.computed);}this.batchRendering(function(){if(anyDifficultOptions){if(isTimeZoneDirty){_this.dispatch({type:'CHANGE_TIMEZONE',oldDateEnv:oldDateEnv});}/* HACK has the same effect as calling this.requestRerender() but recomputes the state's dateProfile */_this.dispatch({type:'SET_VIEW_TYPE',viewType:_this.state.viewType});}elseif(isSizeDirty){_this.updateSize();}// special updatesif(deepEqual){for(varname_3inspecialUpdates){changeHandlers[name_3](specialUpdates[name_3],_this,deepEqual);}}});};/* rebuilds things based off of a complete set of refined options */Calendar.prototype.handleOptions=function(options){var_this=this;varpluginHooks=this.pluginSystem.hooks;this.defaultAllDayEventDuration=createDuration(options.defaultAllDayEventDuration);this.defaultTimedEventDuration=createDuration(options.defaultTimedEventDuration);this.delayedRerender=this.buildDelayedRerender(options.rerenderDelay);this.theme=this.buildTheme(options);varavailable=this.parseRawLocales(options.locales);this.availableRawLocales=available.map;varlocale=this.buildLocale(options.locale||available.defaultCode,available.map);this.dateEnv=this.buildDateEnv(locale,options.timeZone,pluginHooks.namedTimeZonedImpl,options.firstDay,options.weekNumberCalculation,options.weekLabel,pluginHooks.cmdFormatter);this.selectionConfig=this.buildSelectionConfig(options);// needs dateEnv. do after :(// ineffecient to do every time?this.viewSpecs=buildViewSpecs(pluginHooks.views,this.optionsManager);// ineffecient to do every time?this.dateProfileGenerators=mapHash(this.viewSpecs,function(viewSpec){returnnewviewSpec.class.prototype.dateProfileGeneratorClass(viewSpec,_this);});};Calendar.prototype.getAvailableLocaleCodes=function(){returnObject.keys(this.availableRawLocales);};Calendar.prototype._buildSelectionConfig=function(rawOpts){returnprocessScopedUiProps('select',rawOpts,this);};Calendar.prototype._buildEventUiSingleBase=function(rawOpts){if(rawOpts.editable){// so 'editable' affected eventsrawOpts=__assign({},rawOpts,{eventEditable:true});}returnprocessScopedUiProps('event',rawOpts,this);};// Trigger// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.hasPublicHandlers=function(name){returnthis.hasHandlers(name)||this.opt(name);// handler specified in options};Calendar.prototype.publiclyTrigger=function(name,args){varoptHandler=this.opt(name);this.triggerWith(name,this,args);if(optHandler){returnoptHandler.apply(this,args);}};Calendar.prototype.publiclyTriggerAfterSizing=function(name,args){varafterSizingTriggers=this.afterSizingTriggers;(afterSizingTriggers[name]||(afterSizingTriggers[name]=[])).push(args);};Calendar.prototype.releaseAfterSizingTriggers=function(){varafterSizingTriggers=this.afterSizingTriggers;for(varname_4inafterSizingTriggers){for(var_i=0,_a=afterSizingTriggers[name_4];_i<_a.length;_i++){varargs=_a[_i];this.publiclyTrigger(name_4,args);}}this.afterSizingTriggers={};};// View// -----------------------------------------------------------------------------------------------------------------// Returns a boolean about whether the view is okay to instantiate at some pointCalendar.prototype.isValidViewType=function(viewType){returnBoolean(this.viewSpecs[viewType]);};Calendar.prototype.changeView=function(viewType,dateOrRange){vardateMarker=null;if(dateOrRange){if(dateOrRange.start&&dateOrRange.end){// a rangethis.optionsManager.mutate({visibleRange:dateOrRange},[]);// will not rerenderthis.handleOptions(this.optionsManager.computed);// ...but yuck}else{// a datedateMarker=this.dateEnv.createMarker(dateOrRange);// just like gotoDate}}this.unselect();this.dispatch({type:'SET_VIEW_TYPE',viewType:viewType,dateMarker:dateMarker});};// 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 changeCalendar.prototype.zoomTo=function(dateMarker,viewType){varspec;viewType=viewType||'day';// day is default zoomspec=this.viewSpecs[viewType]||this.getUnitViewSpec(viewType);this.unselect();if(spec){this.dispatch({type:'SET_VIEW_TYPE',viewType:spec.type,dateMarker:dateMarker});}else{this.dispatch({type:'SET_DATE',dateMarker:dateMarker});}};// Given a duration singular unit, like "week" or "day", finds a matching view spec.// Preference is given to views that have corresponding buttons.Calendar.prototype.getUnitViewSpec=function(unit){varcomponent=this.component;varviewTypes=[];vari;varspec;// put views that have buttons first. there will be duplicates, but ohif(component.header){viewTypes.push.apply(viewTypes,component.header.viewsWithButtons);}if(component.footer){viewTypes.push.apply(viewTypes,component.footer.viewsWithButtons);}for(varviewTypeinthis.viewSpecs){viewTypes.push(viewType);}for(i=0;i<viewTypes.length;i++){spec=this.viewSpecs[viewTypes[i]];if(spec){if(spec.singleUnit===unit){returnspec;}}}};// Current Date// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.getInitialDate=function(){vardefaultDateInput=this.opt('defaultDate');// compute the initial ambig-timezone dateif(defaultDateInput!=null){returnthis.dateEnv.createMarker(defaultDateInput);}else{returnthis.getNow();// getNow already returns unzoned}};Calendar.prototype.prev=function(){this.unselect();this.dispatch({type:'PREV'});};Calendar.prototype.next=function(){this.unselect();this.dispatch({type:'NEXT'});};Calendar.prototype.prevYear=function(){this.unselect();this.dispatch({type:'SET_DATE',dateMarker:this.dateEnv.addYears(this.state.currentDate,-1)});};Calendar.prototype.nextYear=function(){this.unselect();this.dispatch({type:'SET_DATE',dateMarker:this.dateEnv.addYears(this.state.currentDate,1)});};Calendar.prototype.today=function(){this.unselect();this.dispatch({type:'SET_DATE',dateMarker:this.getNow()});};Calendar.prototype.gotoDate=function(zonedDateInput){this.unselect();this.dispatch({type:'SET_DATE',dateMarker:this.dateEnv.createMarker(zonedDateInput)});};Calendar.prototype.incrementDate=function(deltaInput){vardelta=createDuration(deltaInput);if(delta){// else, warn about invalid input?this.unselect();this.dispatch({type:'SET_DATE',dateMarker:this.dateEnv.add(this.state.currentDate,delta)});}};// for external APICalendar.prototype.getDate=function(){returnthis.dateEnv.toDate(this.state.currentDate);};// Date Formatting Utils// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.formatDate=function(d,formatter){vardateEnv=this.dateEnv;returndateEnv.format(dateEnv.createMarker(d),createFormatter(formatter));};// `settings` is for formatter AND isEndExclusiveCalendar.prototype.formatRange=function(d0,d1,settings){vardateEnv=this.dateEnv;returndateEnv.formatRange(dateEnv.createMarker(d0),dateEnv.createMarker(d1),createFormatter(settings,this.opt('defaultRangeSeparator')),settings);};Calendar.prototype.formatIso=function(d,omitTime){vardateEnv=this.dateEnv;returndateEnv.formatIso(dateEnv.createMarker(d),{omitTime:omitTime});};// Sizing// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.windowResize=function(ev){if(!this.isHandlingWindowResize&&this.component&&// why?ev.target===window// not a jqui resize event){this.isHandlingWindowResize=true;this.updateSize();this.publiclyTrigger('windowResize',[this.view]);this.isHandlingWindowResize=false;}};Calendar.prototype.updateSize=function(){if(this.component){// when?this.component.updateSize(true);}};// Component Registration// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.registerInteractiveComponent=function(component,settingsInput){varsettings=parseInteractionSettings(component,settingsInput);varDEFAULT_INTERACTIONS=[EventClicking,EventHovering];varinteractionClasses=DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);varinteractions=interactionClasses.map(function(interactionClass){returnnewinteractionClass(settings);});this.interactionsStore[component.uid]=interactions;interactionSettingsStore[component.uid]=settings;};Calendar.prototype.unregisterInteractiveComponent=function(component){for(var_i=0,_a=this.interactionsStore[component.uid];_i<_a.length;_i++){varlistener=_a[_i];listener.destroy();}deletethis.interactionsStore[component.uid];deleteinteractionSettingsStore[component.uid];};// Date Selection / Event Selection / DayClick// -----------------------------------------------------------------------------------------------------------------// this public method receives start/end dates in any format, with any timezone// NOTE: args were changed from v3Calendar.prototype.select=function(dateOrObj,endDate){varselectionInput;if(endDate==null){if(dateOrObj.start!=null){selectionInput=dateOrObj;}else{selectionInput={start:dateOrObj,end:null};}}else{selectionInput={start:dateOrObj,end:endDate};}varselection=parseDateSpan(selectionInput,this.dateEnv,createDuration({days:1})// TODO: cache this?);if(selection){// throw parse error otherwise?this.dispatch({type:'SELECT_DATES',selection:selection});this.triggerDateSelect(selection);}};// public methodCalendar.prototype.unselect=function(pev){if(this.state.dateSelection){this.dispatch({type:'UNSELECT_DATES'});this.triggerDateUnselect(pev);}};Calendar.prototype.triggerDateSelect=function(selection,pev){vararg=__assign({},this.buildDateSpanApi(selection),{jsEvent:pev?pev.origEvent:null,view:this.view});this.publiclyTrigger('select',[arg]);};Calendar.prototype.triggerDateUnselect=function(pev){this.publiclyTrigger('unselect',[{jsEvent:pev?pev.origEvent:null,view:this.view}]);};// TODO: receive pev?Calendar.prototype.triggerDateClick=function(dateSpan,dayEl,view,ev){vararg=__assign({},this.buildDatePointApi(dateSpan),{dayEl:dayEl,jsEvent:ev,// Is this always a mouse event? See #4655view:view});this.publiclyTrigger('dateClick',[arg]);};Calendar.prototype.buildDatePointApi=function(dateSpan){varprops={};for(var_i=0,_a=this.pluginSystem.hooks.datePointTransforms;_i<_a.length;_i++){vartransform=_a[_i];__assign(props,transform(dateSpan,this));}__assign(props,buildDatePointApi(dateSpan,this.dateEnv));returnprops;};Calendar.prototype.buildDateSpanApi=function(dateSpan){varprops={};for(var_i=0,_a=this.pluginSystem.hooks.dateSpanTransforms;_i<_a.length;_i++){vartransform=_a[_i];__assign(props,transform(dateSpan,this));}__assign(props,buildDateSpanApi(dateSpan,this.dateEnv));returnprops;};// Date Utils// -----------------------------------------------------------------------------------------------------------------// Returns a DateMarker for the current date, as defined by the client's computer or from the `now` optionCalendar.prototype.getNow=function(){varnow=this.opt('now');if(typeofnow==='function'){now=now();}if(now==null){returnthis.dateEnv.createNowMarker();}returnthis.dateEnv.createMarker(now);};// Event-Date Utilities// -----------------------------------------------------------------------------------------------------------------// Given an event's allDay status and start date, return what its fallback end date should be.// TODO: rename to computeDefaultEventEndCalendar.prototype.getDefaultEventEnd=function(allDay,marker){varend=marker;if(allDay){end=startOfDay(end);end=this.dateEnv.add(end,this.defaultAllDayEventDuration);}else{end=this.dateEnv.add(end,this.defaultTimedEventDuration);}returnend;};// Public Events API// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.addEvent=function(eventInput,sourceInput){if(eventInputinstanceofEventApi){vardef=eventInput._def;varinstance=eventInput._instance;// not already present? don't want to add an old snapshotif(!this.state.eventStore.defs[def.defId]){this.dispatch({type:'ADD_EVENTS',eventStore:eventTupleToStore({def:def,instance:instance})// TODO: better util for two args?});}returneventInput;}varsourceId;if(sourceInputinstanceofEventSourceApi){sourceId=sourceInput.internalEventSource.sourceId;}elseif(sourceInput!=null){varsourceApi=this.getEventSourceById(sourceInput);// TODO: use an internal functionif(!sourceApi){console.warn('Could not find an event source with ID "'+sourceInput+'"');// TODO: testreturnnull;}else{sourceId=sourceApi.internalEventSource.sourceId;}}vartuple=parseEvent(eventInput,sourceId,this);if(tuple){this.dispatch({type:'ADD_EVENTS',eventStore:eventTupleToStore(tuple)});returnnewEventApi(this,tuple.def,tuple.def.recurringDef?null:tuple.instance);}returnnull;};// TODO: optimizeCalendar.prototype.getEventById=function(id){var_a=this.state.eventStore,defs=_a.defs,instances=_a.instances;id=String(id);for(vardefIdindefs){vardef=defs[defId];if(def.publicId===id){if(def.recurringDef){returnnewEventApi(this,def,null);}else{for(varinstanceIdininstances){varinstance=instances[instanceId];if(instance.defId===def.defId){returnnewEventApi(this,def,instance);}}}}}returnnull;};Calendar.prototype.getEvents=function(){var_a=this.state.eventStore,defs=_a.defs,instances=_a.instances;vareventApis=[];for(varidininstances){varinstance=instances[id];vardef=defs[instance.defId];eventApis.push(newEventApi(this,def,instance));}returneventApis;};Calendar.prototype.removeAllEvents=function(){this.dispatch({type:'REMOVE_ALL_EVENTS'});};Calendar.prototype.rerenderEvents=function(){this.dispatch({type:'RESET_EVENTS'});};// Public Event Sources API// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.getEventSources=function(){varsourceHash=this.state.eventSources;varsourceApis=[];for(varinternalIdinsourceHash){sourceApis.push(newEventSourceApi(this,sourceHash[internalId]));}returnsourceApis;};Calendar.prototype.getEventSourceById=function(id){varsourceHash=this.state.eventSources;id=String(id);for(varsourceIdinsourceHash){if(sourceHash[sourceId].publicId===id){returnnewEventSourceApi(this,sourceHash[sourceId]);}}returnnull;};Calendar.prototype.addEventSource=function(sourceInput){if(sourceInputinstanceofEventSourceApi){// not already present? don't want to add an old snapshotif(!this.state.eventSources[sourceInput.internalEventSource.sourceId]){this.dispatch({type:'ADD_EVENT_SOURCES',sources:[sourceInput.internalEventSource]});}returnsourceInput;}vareventSource=parseEventSource(sourceInput,this);if(eventSource){// TODO: error otherwise?this.dispatch({type:'ADD_EVENT_SOURCES',sources:[eventSource]});returnnewEventSourceApi(this,eventSource);}returnnull;};Calendar.prototype.removeAllEventSources=function(){this.dispatch({type:'REMOVE_ALL_EVENT_SOURCES'});};Calendar.prototype.refetchEvents=function(){this.dispatch({type:'FETCH_EVENT_SOURCES'});};// Scroll// -----------------------------------------------------------------------------------------------------------------Calendar.prototype.scrollToTime=function(timeInput){varduration=createDuration(timeInput);if(duration){this.component.view.scrollToDuration(duration);}};returnCalendar;}());EmitterMixin.mixInto(Calendar);// for memoizers// -----------------------------------------------------------------------------------------------------------------functionbuildComponentContext$1(theme,dateEnv,options){returnnewComponentContext(this,theme,dateEnv,options,null);}functionbuildDateEnv(locale,timeZone,namedTimeZoneImpl,firstDay,weekNumberCalculation,weekLabel,cmdFormatter){returnnewDateEnv({calendarSystem:'gregory',timeZone:timeZone,namedTimeZoneImpl:namedTimeZoneImpl,locale:locale,weekNumberCalculation:weekNumberCalculation,firstDay:firstDay,weekLabel:weekLabel,cmdFormatter:cmdFormatter});}functionbuildTheme(calendarOptions){varthemeClass=this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem]||StandardTheme;returnnewthemeClass(calendarOptions);}functionbuildDelayedRerender(wait){varfunc=this.tryRerender.bind(this);if(wait!=null){func=debounce(func,wait);}returnfunc;}functionbuildEventUiBySource(eventSources){returnmapHash(eventSources,function(eventSource){returneventSource.ui;});}functionbuildEventUiBases(eventDefs,eventUiSingleBase,eventUiBySource){vareventUiBases={'':eventUiSingleBase};for(vardefIdineventDefs){vardef=eventDefs[defId];if(def.sourceId&&eventUiBySource[def.sourceId]){eventUiBases[defId]=eventUiBySource[def.sourceId];}}returneventUiBases;}varView=/** @class */(function(_super){__extends(View,_super);functionView(viewSpec,parentEl){var_this=_super.call(this,createElement('div',{className:'fc-view fc-'+viewSpec.type+'-view'}))||this;_this.renderDatesMem=memoizeRendering(_this.renderDatesWrap,_this.unrenderDatesWrap);_this.renderBusinessHoursMem=memoizeRendering(_this.renderBusinessHours,_this.unrenderBusinessHours,[_this.renderDatesMem]);_this.renderDateSelectionMem=memoizeRendering(_this.renderDateSelectionWrap,_this.unrenderDateSelectionWrap,[_this.renderDatesMem]);_this.renderEventsMem=memoizeRendering(_this.renderEvents,_this.unrenderEvents,[_this.renderDatesMem]);_this.renderEventSelectionMem=memoizeRendering(_this.renderEventSelectionWrap,_this.unrenderEventSelectionWrap,[_this.renderEventsMem]);_this.renderEventDragMem=memoizeRendering(_this.renderEventDragWrap,_this.unrenderEventDragWrap,[_this.renderDatesMem]);_this.renderEventResizeMem=memoizeRendering(_this.renderEventResizeWrap,_this.unrenderEventResizeWrap,[_this.renderDatesMem]);_this.viewSpec=viewSpec;_this.type=viewSpec.type;parentEl.appendChild(_this.el);_this.initialize();return_this;}View.prototype.initialize=function(){};Object.defineProperty(View.prototype,"activeStart",{// Date Setting/Unsetting// -----------------------------------------------------------------------------------------------------------------get:function(){returnthis.context.dateEnv.toDate(this.props.dateProfile.activeRange.start);},enumerable:true,configurable:true});Object.defineProperty(View.prototype,"activeEnd",{get:function(){returnthis.context.dateEnv.toDate(this.props.dateProfile.activeRange.end);},enumerable:true,configurable:true});Object.defineProperty(View.prototype,"currentStart",{get:function(){returnthis.context.dateEnv.toDate(this.props.dateProfile.currentRange.start);},enumerable:true,configurable:true});Object.defineProperty(View.prototype,"currentEnd",{get:function(){returnthis.context.dateEnv.toDate(this.props.dateProfile.currentRange.end);},enumerable:true,configurable:true});// General Rendering// -----------------------------------------------------------------------------------------------------------------View.prototype.render=function(props,context){this.renderDatesMem(props.dateProfile);this.renderBusinessHoursMem(props.businessHours);this.renderDateSelectionMem(props.dateSelection);this.renderEventsMem(props.eventStore);this.renderEventSelectionMem(props.eventSelection);this.renderEventDragMem(props.eventDrag);this.renderEventResizeMem(props.eventResize);};View.prototype.beforeUpdate=function(){this.addScroll(this.queryScroll());};View.prototype.destroy=function(){_super.prototype.destroy.call(this);this.renderDatesMem.unrender();// should unrender everything else};// Sizing// -----------------------------------------------------------------------------------------------------------------View.prototype.updateSize=function(isResize,viewHeight,isAuto){varcalendar=this.context.calendar;if(isResize){this.addScroll(this.queryScroll());// NOTE: same code as in beforeUpdate}if(isResize||// HACKS...calendar.isViewUpdated||calendar.isDatesUpdated||calendar.isEventsUpdated){// sort of the catch-all sizing// anything that might cause dimension changesthis.updateBaseSize(isResize,viewHeight,isAuto);}// NOTE: popScroll is called by CalendarComponent};View.prototype.updateBaseSize=function(isResize,viewHeight,isAuto){};// Date Rendering// -----------------------------------------------------------------------------------------------------------------View.prototype.renderDatesWrap=function(dateProfile){this.renderDates(dateProfile);this.addScroll({duration:createDuration(this.context.options.scrollTime)});};View.prototype.unrenderDatesWrap=function(){this.stopNowIndicator();this.unrenderDates();};View.prototype.renderDates=function(dateProfile){};View.prototype.unrenderDates=function(){};// Business Hours// -----------------------------------------------------------------------------------------------------------------View.prototype.renderBusinessHours=function(businessHours){};View.prototype.unrenderBusinessHours=function(){};// Date Selection// -----------------------------------------------------------------------------------------------------------------View.prototype.renderDateSelectionWrap=function(selection){if(selection){this.renderDateSelection(selection);}};View.prototype.unrenderDateSelectionWrap=function(selection){if(selection){this.unrenderDateSelection(selection);}};View.prototype.renderDateSelection=function(selection){};View.prototype.unrenderDateSelection=function(selection){};// Event Rendering// -----------------------------------------------------------------------------------------------------------------View.prototype.renderEvents=function(eventStore){};View.prototype.unrenderEvents=function(){};// util for subclassesView.prototype.sliceEvents=function(eventStore,allDay){varprops=this.props;returnsliceEventStore(eventStore,props.eventUiBases,props.dateProfile.activeRange,allDay?this.context.nextDayThreshold:null).fg;};// Event Selection// -----------------------------------------------------------------------------------------------------------------View.prototype.renderEventSelectionWrap=function(instanceId){if(instanceId){this.renderEventSelection(instanceId);}};View.prototype.unrenderEventSelectionWrap=function(instanceId){if(instanceId){this.unrenderEventSelection(instanceId);}};View.prototype.renderEventSelection=function(instanceId){};View.prototype.unrenderEventSelection=function(instanceId){};// Event Drag// -----------------------------------------------------------------------------------------------------------------View.prototype.renderEventDragWrap=function(state){if(state){this.renderEventDrag(state);}};View.prototype.unrenderEventDragWrap=function(state){if(state){this.unrenderEventDrag(state);}};View.prototype.renderEventDrag=function(state){};View.prototype.unrenderEventDrag=function(state){};// Event Resize// -----------------------------------------------------------------------------------------------------------------View.prototype.renderEventResizeWrap=function(state){if(state){this.renderEventResize(state);}};View.prototype.unrenderEventResizeWrap=function(state){if(state){this.unrenderEventResize(state);}};View.prototype.renderEventResize=function(state){};View.prototype.unrenderEventResize=function(state){};/* Now Indicator ------------------------------------------------------------------------------------------------------------------*/// Immediately render the current time indicator and begins re-rendering it at an interval,// which is defined by this.getNowIndicatorUnit().// TODO: somehow do this for the current whole day's background too// USAGE: must be called manually from subclasses' render methods! don't need to call stopNowIndicator thoView.prototype.startNowIndicator=function(dateProfile,dateProfileGenerator){var_this=this;var_a=this.context,calendar=_a.calendar,dateEnv=_a.dateEnv,options=_a.options;varunit;varupdate;vardelay;// ms wait valueif(options.nowIndicator&&!this.initialNowDate){unit=this.getNowIndicatorUnit(dateProfile,dateProfileGenerator);if(unit){update=this.updateNowIndicator.bind(this);this.initialNowDate=calendar.getNow();this.initialNowQueriedMs=newDate().valueOf();// wait until the beginning of the next intervaldelay=dateEnv.add(dateEnv.startOf(this.initialNowDate,unit),createDuration(1,unit)).valueOf()-this.initialNowDate.valueOf();// TODO: maybe always use setTimeout, waiting until start of next unitthis.nowIndicatorTimeoutID=setTimeout(function(){_this.nowIndicatorTimeoutID=null;update();if(unit==='second'){delay=1000;// every second}else{delay=1000*60;// otherwise, every minute}_this.nowIndicatorIntervalID=setInterval(update,delay);// update every interval},delay);}// rendering will be initiated in updateSize}};// rerenders the now indicator, computing the new current time from the amount of time that has passed// since the initial getNow call.View.prototype.updateNowIndicator=function(){if(this.props.dateProfile&&// a way to determine if dates were rendered yetthis.initialNowDate// activated before?){this.unrenderNowIndicator();// won't unrender if unnecessarythis.renderNowIndicator(addMs(this.initialNowDate,newDate().valueOf()-this.initialNowQueriedMs));this.isNowIndicatorRendered=true;}};// Immediately unrenders the view's current time indicator and stops any re-rendering timers.// Won't cause side effects if indicator isn't rendered.View.prototype.stopNowIndicator=function(){if(this.nowIndicatorTimeoutID){clearTimeout(this.nowIndicatorTimeoutID);this.nowIndicatorTimeoutID=null;}if(this.nowIndicatorIntervalID){clearInterval(this.nowIndicatorIntervalID);this.nowIndicatorIntervalID=null;}if(this.isNowIndicatorRendered){this.unrenderNowIndicator();this.isNowIndicatorRendered=false;}};View.prototype.getNowIndicatorUnit=function(dateProfile,dateProfileGenerator){// subclasses should implement};// Renders a current time indicator at the given datetimeView.prototype.renderNowIndicator=function(date){// SUBCLASSES MUST PASS TO CHILDREN!};// Undoes the rendering actions from renderNowIndicatorView.prototype.unrenderNowIndicator=function(){// SUBCLASSES MUST PASS TO CHILDREN!};/* Scroller ------------------------------------------------------------------------------------------------------------------*/View.prototype.addScroll=function(scroll,isForced){if(isForced){scroll.isForced=isForced;}__assign(this.queuedScroll||(this.queuedScroll={}),scroll);};View.prototype.popScroll=function(isResize){this.applyQueuedScroll(isResize);this.queuedScroll=null;};View.prototype.applyQueuedScroll=function(isResize){if(this.queuedScroll){this.applyScroll(this.queuedScroll,isResize);}};View.prototype.queryScroll=function(){varscroll={};if(this.props.dateProfile){// dates rendered yet?__assign(scroll,this.queryDateScroll());}returnscroll;};View.prototype.applyScroll=function(scroll,isResize){varduration=scroll.duration,isForced=scroll.isForced;if(duration!=null&&!isForced){deletescroll.duration;if(this.props.dateProfile){// dates rendered yet?__assign(scroll,this.computeDateScroll(duration));}}if(this.props.dateProfile){// dates rendered yet?this.applyDateScroll(scroll);}};View.prototype.computeDateScroll=function(duration){return{};// subclasses must implement};View.prototype.queryDateScroll=function(){return{};// subclasses must implement};View.prototype.applyDateScroll=function(scroll){// subclasses must implement};// for APIView.prototype.scrollToDuration=function(duration){this.applyScroll({duration:duration},false);};returnView;}(DateComponent));EmitterMixin.mixInto(View);View.prototype.usesMinMaxTime=false;View.prototype.dateProfileGeneratorClass=DateProfileGenerator;varFgEventRenderer=/** @class */(function(){functionFgEventRenderer(){this.segs=[];this.isSizeDirty=false;}FgEventRenderer.prototype.renderSegs=function(context,segs,mirrorInfo){this.context=context;this.rangeUpdated();// called too frequently :(// render an `.el` on each seg// returns a subset of the segs. segs that were actually renderedsegs=this.renderSegEls(segs,mirrorInfo);this.segs=segs;this.attachSegs(segs,mirrorInfo);this.isSizeDirty=true;triggerRenderedSegs(this.context,this.segs,Boolean(mirrorInfo));};FgEventRenderer.prototype.unrender=function(context,_segs,mirrorInfo){triggerWillRemoveSegs(this.context,this.segs,Boolean(mirrorInfo));this.detachSegs(this.segs);this.segs=[];};// Updates values that rely on options and also relate to rangeFgEventRenderer.prototype.rangeUpdated=function(){varoptions=this.context.options;vardisplayEventTime;vardisplayEventEnd;this.eventTimeFormat=createFormatter(options.eventTimeFormat||this.computeEventTimeFormat(),options.defaultRangeSeparator);displayEventTime=options.displayEventTime;if(displayEventTime==null){displayEventTime=this.computeDisplayEventTime();// might be based off of range}displayEventEnd=options.displayEventEnd;if(displayEventEnd==null){displayEventEnd=this.computeDisplayEventEnd();// might be based off of range}this.displayEventTime=displayEventTime;this.displayEventEnd=displayEventEnd;};// Renders and assigns an `el` property for each foreground event segment.// Only returns segments that successfully rendered.FgEventRenderer.prototype.renderSegEls=function(segs,mirrorInfo){varhtml='';vari;if(segs.length){// don't build an empty html string// build a large concatenation of event segment HTMLfor(i=0;i<segs.length;i++){html+=this.renderSegHtml(segs[i],mirrorInfo);}// Grab individual elements from the combined HTML string. Use each as the default rendering.// Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.htmlToElements(html).forEach(function(el,i){varseg=segs[i];if(el){seg.el=el;}});segs=filterSegsViaEls(this.context,segs,Boolean(mirrorInfo));}returnsegs;};// Generic utility for generating the HTML classNames for an event segment's elementFgEventRenderer.prototype.getSegClasses=function(seg,isDraggable,isResizable,mirrorInfo){varclasses=['fc-event',seg.isStart?'fc-start':'fc-not-start',seg.isEnd?'fc-end':'fc-not-end'].concat(seg.eventRange.ui.classNames);if(isDraggable){classes.push('fc-draggable');}if(isResizable){classes.push('fc-resizable');}if(mirrorInfo){classes.push('fc-mirror');if(mirrorInfo.isDragging){classes.push('fc-dragging');}if(mirrorInfo.isResizing){classes.push('fc-resizing');}}returnclasses;};// Compute the text that should be displayed on an event's element.// `range` can be the Event object itself, or something range-like, with at least a `start`.// If event times are disabled, or the event has no time, will return a blank string.// If not specified, formatter will default to the eventTimeFormat setting,// and displayEnd will default to the displayEventEnd setting.FgEventRenderer.prototype.getTimeText=function(eventRange,formatter,displayEnd){vardef=eventRange.def,instance=eventRange.instance;returnthis._getTimeText(instance.range.start,def.hasEnd?instance.range.end:null,def.allDay,formatter,displayEnd,instance.forcedStartTzo,instance.forcedEndTzo);};FgEventRenderer.prototype._getTimeText=function(start,end,allDay,formatter,displayEnd,forcedStartTzo,forcedEndTzo){vardateEnv=this.context.dateEnv;if(formatter==null){formatter=this.eventTimeFormat;}if(displayEnd==null){displayEnd=this.displayEventEnd;}if(this.displayEventTime&&!allDay){if(displayEnd&&end){returndateEnv.formatRange(start,end,formatter,{forcedStartTzo:forcedStartTzo,forcedEndTzo:forcedEndTzo});}else{returndateEnv.format(start,formatter,{forcedTzo:forcedStartTzo});}}return'';};FgEventRenderer.prototype.computeEventTimeFormat=function(){return{hour:'numeric',minute:'2-digit',omitZeroMinute:true};};FgEventRenderer.prototype.computeDisplayEventTime=function(){returntrue;};FgEventRenderer.prototype.computeDisplayEventEnd=function(){returntrue;};// Utility for generating event skin-related CSS propertiesFgEventRenderer.prototype.getSkinCss=function(ui){return{'background-color':ui.backgroundColor,'border-color':ui.borderColor,color:ui.textColor};};FgEventRenderer.prototype.sortEventSegs=function(segs){varspecs=this.context.eventOrderSpecs;varobjs=segs.map(buildSegCompareObj);objs.sort(function(obj0,obj1){returncompareByFieldSpecs(obj0,obj1,specs);});returnobjs.map(function(c){returnc._seg;});};FgEventRenderer.prototype.computeSizes=function(force){if(force||this.isSizeDirty){this.computeSegSizes(this.segs);}};FgEventRenderer.prototype.assignSizes=function(force){if(force||this.isSizeDirty){this.assignSegSizes(this.segs);this.isSizeDirty=false;}};FgEventRenderer.prototype.computeSegSizes=function(segs){};FgEventRenderer.prototype.assignSegSizes=function(segs){};// Manipulation on rendered segsFgEventRenderer.prototype.hideByHash=function(hash){if(hash){for(var_i=0,_a=this.segs;_i<_a.length;_i++){varseg=_a[_i];if(hash[seg.eventRange.instance.instanceId]){seg.el.style.visibility='hidden';}}}};FgEventRenderer.prototype.showByHash=function(hash){if(hash){for(var_i=0,_a=this.segs;_i<_a.length;_i++){varseg=_a[_i];if(hash[seg.eventRange.instance.instanceId]){seg.el.style.visibility='';}}}};FgEventRenderer.prototype.selectByInstanceId=function(instanceId){if(instanceId){for(var_i=0,_a=this.segs;_i<_a.length;_i++){varseg=_a[_i];vareventInstance=seg.eventRange.instance;if(eventInstance&&eventInstance.instanceId===instanceId&&seg.el// necessary?){seg.el.classList.add('fc-selected');}}}};FgEventRenderer.prototype.unselectByInstanceId=function(instanceId){if(instanceId){for(var_i=0,_a=this.segs;_i<_a.length;_i++){varseg=_a[_i];if(seg.el){// necessary?seg.el.classList.remove('fc-selected');}}}};returnFgEventRenderer;}());// returns a object with all primitive props that can be comparedfunctionbuildSegCompareObj(seg){vareventDef=seg.eventRange.def;varrange=seg.eventRange.instance.range;varstart=range.start?range.start.valueOf():0;// TODO: better support for open-range eventsvarend=range.end?range.end.valueOf():0;// "return__assign({},eventDef.extendedProps,eventDef,{id:eventDef.publicId,start:start,end:end,duration:end-start,allDay:Number(eventDef.allDay),_seg:seg// for later retrieval});}/* TODO: when refactoring this class, make a new FillRenderer instance for each `type` */varFillRenderer=/** @class */(function(){functionFillRenderer(){this.fillSegTag='div';this.dirtySizeFlags={};this.containerElsByType={};this.segsByType={};}FillRenderer.prototype.getSegsByType=function(type){returnthis.segsByType[type]||[];};FillRenderer.prototype.renderSegs=function(type,context,segs){var_a;this.context=context;varrenderedSegs=this.renderSegEls(type,segs);// assignes `.el` to each seg. returns successfully rendered segsvarcontainerEls=this.attachSegs(type,renderedSegs);if(containerEls){(_a=(this.containerElsByType[type]||(this.containerElsByType[type]=[]))).push.apply(_a,containerEls);}this.segsByType[type]=renderedSegs;if(type==='bgEvent'){triggerRenderedSegs(context,renderedSegs,false);// isMirror=false}this.dirtySizeFlags[type]=true;};// Unrenders a specific type of fill that is currently rendered on the gridFillRenderer.prototype.unrender=function(type,context){varsegs=this.segsByType[type];if(segs){if(type==='bgEvent'){triggerWillRemoveSegs(context,segs,false);// isMirror=false}this.detachSegs(type,segs);}};// Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.// Only returns segments that successfully rendered.FillRenderer.prototype.renderSegEls=function(type,segs){var_this=this;varhtml='';vari;if(segs.length){// build a large concatenation of segment HTMLfor(i=0;i<segs.length;i++){html+=this.renderSegHtml(type,segs[i]);}// Grab individual elements from the combined HTML string. Use each as the default rendering.// Then, compute the 'el' for each segment.htmlToElements(html).forEach(function(el,i){varseg=segs[i];if(el){seg.el=el;}});if(type==='bgEvent'){segs=filterSegsViaEls(this.context,segs,false// isMirror. background events can never be mirror elements);}// correct element type? (would be bad if a non-TD were inserted into a table for example)segs=segs.filter(function(seg){returnelementMatches(seg.el,_this.fillSegTag);});}returnsegs;};// Builds the HTML needed for one fill segment. Generic enough to work with different types.FillRenderer.prototype.renderSegHtml=function(type,seg){varcss=null;varclassNames=[];if(type!=='highlight'&&type!=='businessHours'){css={'background-color':seg.eventRange.ui.backgroundColor};}if(type!=='highlight'){classNames=classNames.concat(seg.eventRange.ui.classNames);}if(type==='businessHours'){classNames.push('fc-bgevent');}else{classNames.push('fc-'+type.toLowerCase());}return'<'+this.fillSegTag+(classNames.length?' class="'+classNames.join(' ')+'"':'')+(css?' style="'+cssToStr(css)+'"':'')+'></'+this.fillSegTag+'>';};FillRenderer.prototype.detachSegs=function(type,segs){varcontainerEls=this.containerElsByType[type];if(containerEls){containerEls.forEach(removeElement);deletethis.containerElsByType[type];}};FillRenderer.prototype.computeSizes=function(force){for(vartypeinthis.segsByType){if(force||this.dirtySizeFlags[type]){this.computeSegSizes(this.segsByType[type]);}}};FillRenderer.prototype.assignSizes=function(force){for(vartypeinthis.segsByType){if(force||this.dirtySizeFlags[type]){this.assignSegSizes(this.segsByType[type]);}}this.dirtySizeFlags={};};FillRenderer.prototype.computeSegSizes=function(segs){};FillRenderer.prototype.assignSegSizes=function(segs){};returnFillRenderer;}());varNamedTimeZoneImpl=/** @class */(function(){functionNamedTimeZoneImpl(timeZoneName){this.timeZoneName=timeZoneName;}returnNamedTimeZoneImpl;}());/* 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 */varElementDragging=/** @class */(function(){functionElementDragging(el){this.emitter=newEmitterMixin();}ElementDragging.prototype.destroy=function(){};ElementDragging.prototype.setMirrorIsVisible=function(bool){// optional if subclass doesn't want to support a mirror};ElementDragging.prototype.setMirrorNeedsRevert=function(bool){// optional if subclass doesn't want to support a mirror};ElementDragging.prototype.setAutoScrollEnabled=function(bool){// optional};returnElementDragging;}());functionformatDate(dateInput,settings){if(settings===void0){settings={};}vardateEnv=buildDateEnv$1(settings);varformatter=createFormatter(settings);vardateMeta=dateEnv.createMarkerMeta(dateInput);if(!dateMeta){// TODO: warning?return'';}returndateEnv.format(dateMeta.marker,formatter,{forcedTzo:dateMeta.forcedTzo});}functionformatRange(startInput,endInput,settings// mixture of env and formatter settings){vardateEnv=buildDateEnv$1(typeofsettings==='object'&&settings?settings:{});// pass in if non-null objectvarformatter=createFormatter(settings,globalDefaults.defaultRangeSeparator);varstartMeta=dateEnv.createMarkerMeta(startInput);varendMeta=dateEnv.createMarkerMeta(endInput);if(!startMeta||!endMeta){// TODO: warning?return'';}returndateEnv.formatRange(startMeta.marker,endMeta.marker,formatter,{forcedStartTzo:startMeta.forcedTzo,forcedEndTzo:endMeta.forcedTzo,isEndExclusive:settings.isEndExclusive});}// TODO: more DRY and optimizedfunctionbuildDateEnv$1(settings){varlocale=buildLocale(settings.locale||'en',parseRawLocales([]).map);// TODO: don't hardcode 'en' everywhere// ensure required settingssettings=__assign({timeZone:globalDefaults.timeZone,calendarSystem:'gregory'},settings,{locale:locale});returnnewDateEnv(settings);}varDRAG_META_PROPS={startTime:createDuration,duration:createDuration,create:Boolean,sourceId:String};varDRAG_META_DEFAULTS={create:true};functionparseDragMeta(raw){varleftoverProps={};varrefined=refineProps(raw,DRAG_META_PROPS,DRAG_META_DEFAULTS,leftoverProps);refined.leftoverProps=leftoverProps;returnrefined;}// Computes a default column header formatting string if `colFormat` is not explicitly definedfunctioncomputeFallbackHeaderFormat(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 cellif(!datesRepDistinctDays||dayCnt>10){return{weekday:'short'};// "Sat"}elseif(dayCnt>1){return{weekday:'short',month:'numeric',day:'numeric',omitCommas:true};// "Sat 11/12"}else{return{weekday:'long'};// "Saturday"}}functionrenderDateCell(dateMarker,dateProfile,datesRepDistinctDays,colCnt,colHeadFormat,context,colspan,otherAttrs){vardateEnv=context.dateEnv,theme=context.theme,options=context.options;varisDateValid=rangeContainsMarker(dateProfile.activeRange,dateMarker);// TODO: called too frequently. cache somehow.varclassNames=['fc-day-header',theme.getClass('widgetHeader')];varinnerHtml;if(typeofoptions.columnHeaderHtml==='function'){innerHtml=options.columnHeaderHtml(dateEnv.toDate(dateMarker));}elseif(typeofoptions.columnHeaderText==='function'){innerHtml=htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));}else{innerHtml=htmlEscape(dateEnv.format(dateMarker,colHeadFormat));}// if only one row of days, the classNames on the header can represent the specific days beneathif(datesRepDistinctDays){classNames=classNames.concat(// includes the day-of-week class// noThemeHighlight=true (don't highlight the header)getDayClasses(dateMarker,dateProfile,context,true));}else{classNames.push('fc-'+DAY_IDS[dateMarker.getUTCDay()]);// only add the day-of-week class}return''+'<th class="'+classNames.join(' ')+'"'+((isDateValid&&datesRepDistinctDays)?' data-date="'+dateEnv.formatIso(dateMarker,{omitTime:true})+'"':'')+(colspan>1?' colspan="'+colspan+'"':'')+(otherAttrs?' '+otherAttrs:'')+'>'+(isDateValid?// don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)buildGotoAnchorHtml(options,dateEnv,{date:dateMarker,forceOff:!datesRepDistinctDays||colCnt===1},innerHtml):// if not valid, display text, but no linkinnerHtml)+'</th>';}varDayHeader=/** @class */(function(_super){__extends(DayHeader,_super);functionDayHeader(parentEl){var_this=_super.call(this)||this;_this.renderSkeleton=memoizeRendering(_this._renderSkeleton,_this._unrenderSkeleton);_this.parentEl=parentEl;return_this;}DayHeader.prototype.render=function(props,context){vardates=props.dates,datesRepDistinctDays=props.datesRepDistinctDays;varparts=[];this.renderSkeleton(context);if(props.renderIntroHtml){parts.push(props.renderIntroHtml());}varcolHeadFormat=createFormatter(context.options.columnHeaderFormat||computeFallbackHeaderFormat(datesRepDistinctDays,dates.length));for(var_i=0,dates_1=dates;_i<dates_1.length;_i++){vardate=dates_1[_i];parts.push(renderDateCell(date,props.dateProfile,datesRepDistinctDays,dates.length,colHeadFormat,context));}if(context.isRtl){parts.reverse();}this.thead.innerHTML='<tr>'+parts.join('')+'</tr>';};DayHeader.prototype.destroy=function(){_super.prototype.destroy.call(this);this.renderSkeleton.unrender();};DayHeader.prototype._renderSkeleton=function(context){vartheme=context.theme;varparentEl=this.parentEl;parentEl.innerHTML='';// because might be nbspparentEl.appendChild(this.el=htmlToElement('<div class="fc-row '+theme.getClass('headerRow')+'">'+'<table class="'+theme.getClass('tableGrid')+'">'+'<thead></thead>'+'</table>'+'</div>'));this.thead=this.el.querySelector('thead');};DayHeader.prototype._unrenderSkeleton=function(){removeElement(this.el);};returnDayHeader;}(Component));varDaySeries=/** @class */(function(){functionDaySeries(range,dateProfileGenerator){vardate=range.start;varend=range.end;varindices=[];vardates=[];vardayIndex=-1;while(date<end){// loop each day from start to endif(dateProfileGenerator.isHiddenDay(date)){indices.push(dayIndex+0.5);// mark that it's between indices}else{dayIndex++;indices.push(dayIndex);dates.push(date);}date=addDays(date,1);}this.dates=dates;this.indices=indices;this.cnt=dates.length;}DaySeries.prototype.sliceRange=function(range){varfirstIndex=this.getDateDayIndex(range.start);// inclusive first indexvarlastIndex=this.getDateDayIndex(addDays(range.end,-1));// inclusive last indexvarclippedFirstIndex=Math.max(0,firstIndex);varclippedLastIndex=Math.min(this.cnt-1,lastIndex);// deal with in-between indicesclippedFirstIndex=Math.ceil(clippedFirstIndex);// in-between starts round to next cellclippedLastIndex=Math.floor(clippedLastIndex);// in-between ends round to prev cellif(clippedFirstIndex<=clippedLastIndex){return{firstIndex:clippedFirstIndex,lastIndex:clippedLastIndex,isStart:firstIndex===clippedFirstIndex,isEnd:lastIndex===clippedLastIndex};}else{returnnull;}};// 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.DaySeries.prototype.getDateDayIndex=function(date){varindices=this.indices;vardayOffset=Math.floor(diffDays(this.dates[0],date));if(dayOffset<0){returnindices[0]-1;}elseif(dayOffset>=indices.length){returnindices[indices.length-1]+1;}else{returnindices[dayOffset];}};returnDaySeries;}());varDayTable=/** @class */(function(){functionDayTable(daySeries,breakOnWeeks){vardates=daySeries.dates;vardaysPerRow;varfirstDay;varrowCnt;if(breakOnWeeks){// count columns until the day-of-week repeatsfirstDay=dates[0].getUTCDay();for(daysPerRow=1;daysPerRow<dates.length;daysPerRow++){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();}DayTable.prototype.buildCells=function(){varrows=[];for(varrow=0;row<this.rowCnt;row++){varcells=[];for(varcol=0;col<this.colCnt;col++){cells.push(this.buildCell(row,col));}rows.push(cells);}returnrows;};DayTable.prototype.buildCell=function(row,col){return{date:this.daySeries.dates[row*this.colCnt+col]};};DayTable.prototype.buildHeaderDates=function(){vardates=[];for(varcol=0;col<this.colCnt;col++){dates.push(this.cells[0][col].date);}returndates;};DayTable.prototype.sliceRange=function(range){varcolCnt=this.colCnt;varseriesSeg=this.daySeries.sliceRange(range);varsegs=[];if(seriesSeg){varfirstIndex=seriesSeg.firstIndex,lastIndex=seriesSeg.lastIndex;varindex=firstIndex;while(index<=lastIndex){varrow=Math.floor(index/colCnt);varnextIndex=Math.min((row+1)*colCnt,lastIndex+1);segs.push({row:row,firstCol:index%colCnt,lastCol:(nextIndex-1)%colCnt,isStart:seriesSeg.isStart&&index===firstIndex,isEnd:seriesSeg.isEnd&&(nextIndex-1)===lastIndex});index=nextIndex;}}returnsegs;};returnDayTable;}());varSlicer=/** @class */(function(){functionSlicer(){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);}Slicer.prototype.sliceProps=function(props,dateProfile,nextDayThreshold,calendar,component){varextraArgs=[];for(var_i=5;_i<arguments.length;_i++){extraArgs[_i-5]=arguments[_i];}vareventUiBases=props.eventUiBases;vareventSegs=this.sliceEventStore.apply(this,[props.eventStore,eventUiBases,dateProfile,nextDayThreshold,component].concat(extraArgs));return{dateSelectionSegs:this.sliceDateSelection.apply(this,[props.dateSelection,eventUiBases,component].concat(extraArgs)),businessHourSegs:this.sliceBusinessHours.apply(this,[props.businessHours,dateProfile,nextDayThreshold,calendar,component].concat(extraArgs)),fgEventSegs:eventSegs.fg,bgEventSegs:eventSegs.bg,eventDrag:this.sliceEventDrag.apply(this,[props.eventDrag,eventUiBases,dateProfile,nextDayThreshold,component].concat(extraArgs)),eventResize:this.sliceEventResize.apply(this,[props.eventResize,eventUiBases,dateProfile,nextDayThreshold,component].concat(extraArgs)),eventSelection:props.eventSelection};// TODO: give interactionSegs?};Slicer.prototype.sliceNowDate=function(// does not memoizedate,component){varextraArgs=[];for(var_i=2;_i<arguments.length;_i++){extraArgs[_i-2]=arguments[_i];}returnthis._sliceDateSpan.apply(this,[{range:{start:date,end:addMs(date,1)},allDay:false},{},component].concat(extraArgs));};Slicer.prototype._sliceBusinessHours=function(businessHours,dateProfile,nextDayThreshold,calendar,component){varextraArgs=[];for(var_i=5;_i<arguments.length;_i++){extraArgs[_i-5]=arguments[_i];}if(!businessHours){return[];}returnthis._sliceEventStore.apply(this,[expandRecurring(businessHours,computeActiveRange(dateProfile,Boolean(nextDayThreshold)),calendar),{},dateProfile,nextDayThreshold,component].concat(extraArgs)).bg;};Slicer.prototype._sliceEventStore=function(eventStore,eventUiBases,dateProfile,nextDayThreshold,component){varextraArgs=[];for(var_i=5;_i<arguments.length;_i++){extraArgs[_i-5]=arguments[_i];}if(eventStore){varrangeRes=sliceEventStore(eventStore,eventUiBases,computeActiveRange(dateProfile,Boolean(nextDayThreshold)),nextDayThreshold);return{bg:this.sliceEventRanges(rangeRes.bg,component,extraArgs),fg:this.sliceEventRanges(rangeRes.fg,component,extraArgs)};}else{return{bg:[],fg:[]};}};Slicer.prototype._sliceInteraction=function(interaction,eventUiBases,dateProfile,nextDayThreshold,component){varextraArgs=[];for(var_i=5;_i<arguments.length;_i++){extraArgs[_i-5]=arguments[_i];}if(!interaction){returnnull;}varrangeRes=sliceEventStore(interaction.mutatedEvents,eventUiBases,computeActiveRange(dateProfile,Boolean(nextDayThreshold)),nextDayThreshold);return{segs:this.sliceEventRanges(rangeRes.fg,component,extraArgs),affectedInstances:interaction.affectedEvents.instances,isEvent:interaction.isEvent,sourceSeg:interaction.origSeg};};Slicer.prototype._sliceDateSpan=function(dateSpan,eventUiBases,component){varextraArgs=[];for(var_i=3;_i<arguments.length;_i++){extraArgs[_i-3]=arguments[_i];}if(!dateSpan){return[];}vareventRange=fabricateEventRange(dateSpan,eventUiBases,component.context.calendar);varsegs=this.sliceRange.apply(this,[dateSpan.range].concat(extraArgs));for(var_a=0,segs_1=segs;_a<segs_1.length;_a++){varseg=segs_1[_a];seg.component=component;seg.eventRange=eventRange;}returnsegs;};/* "complete" seg means it has component and eventRange */Slicer.prototype.sliceEventRanges=function(eventRanges,component,// TODO: killextraArgs){varsegs=[];for(var_i=0,eventRanges_1=eventRanges;_i<eventRanges_1.length;_i++){vareventRange=eventRanges_1[_i];segs.push.apply(segs,this.sliceEventRange(eventRange,component,extraArgs));}returnsegs;};/* "complete" seg means it has component and eventRange */Slicer.prototype.sliceEventRange=function(eventRange,component,// TODO: killextraArgs){varsegs=this.sliceRange.apply(this,[eventRange.range].concat(extraArgs));for(var_i=0,segs_2=segs;_i<segs_2.length;_i++){varseg=segs_2[_i];seg.component=component;seg.eventRange=eventRange;seg.isStart=eventRange.isStart&&seg.isStart;seg.isEnd=eventRange.isEnd&&seg.isEnd;}returnsegs;};returnSlicer;}());/* for incorporating minTime/maxTimeifappropriateTODO:shouldbepartofDateProfile!TimelineDateProfilealreadydoesthisbtw*/ function computeActiveRange(dateProfile, isComponentAllDay) { var range = dateProfile.activeRange; if (isComponentAllDay) { return range; } return { start: addMs(range.start, dateProfile.minTime.milliseconds), end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) //864e5=msinaday};}// exports// --------------------------------------------------------------------------------------------------varversion='4.4.0';exports.Calendar=Calendar;exports.Component=Component;exports.ComponentContext=ComponentContext;exports.DateComponent=DateComponent;exports.DateEnv=DateEnv;exports.DateProfileGenerator=DateProfileGenerator;exports.DayHeader=DayHeader;exports.DaySeries=DaySeries;exports.DayTable=DayTable;exports.ElementDragging=ElementDragging;exports.ElementScrollController=ElementScrollController;exports.EmitterMixin=EmitterMixin;exports.EventApi=EventApi;exports.FgEventRenderer=FgEventRenderer;exports.FillRenderer=FillRenderer;exports.Interaction=Interaction;exports.Mixin=Mixin;exports.NamedTimeZoneImpl=NamedTimeZoneImpl;exports.PositionCache=PositionCache;exports.ScrollComponent=ScrollComponent;exports.ScrollController=ScrollController;exports.Slicer=Slicer;exports.Splitter=Splitter;exports.Theme=Theme;exports.View=View;exports.WindowScrollController=WindowScrollController;exports.addDays=addDays;exports.addDurations=addDurations;exports.addMs=addMs;exports.addWeeks=addWeeks;exports.allowContextMenu=allowContextMenu;exports.allowSelection=allowSelection;exports.appendToElement=appendToElement;exports.applyAll=applyAll;exports.applyMutationToEventStore=applyMutationToEventStore;exports.applyStyle=applyStyle;exports.applyStyleProp=applyStyleProp;exports.asRoughMinutes=asRoughMinutes;exports.asRoughMs=asRoughMs;exports.asRoughSeconds=asRoughSeconds;exports.buildGotoAnchorHtml=buildGotoAnchorHtml;exports.buildSegCompareObj=buildSegCompareObj;exports.capitaliseFirstLetter=capitaliseFirstLetter;exports.combineEventUis=combineEventUis;exports.compareByFieldSpec=compareByFieldSpec;exports.compareByFieldSpecs=compareByFieldSpecs;exports.compareNumbers=compareNumbers;exports.compensateScroll=compensateScroll;exports.computeClippingRect=computeClippingRect;exports.computeEdges=computeEdges;exports.computeEventDraggable=computeEventDraggable;exports.computeEventEndResizable=computeEventEndResizable;exports.computeEventStartResizable=computeEventStartResizable;exports.computeFallbackHeaderFormat=computeFallbackHeaderFormat;exports.computeHeightAndMargins=computeHeightAndMargins;exports.computeInnerRect=computeInnerRect;exports.computeRect=computeRect;exports.computeVisibleDayRange=computeVisibleDayRange;exports.config=config;exports.constrainPoint=constrainPoint;exports.createDuration=createDuration;exports.createElement=createElement;exports.createEmptyEventStore=createEmptyEventStore;exports.createEventInstance=createEventInstance;exports.createFormatter=createFormatter;exports.createPlugin=createPlugin;exports.cssToStr=cssToStr;exports.debounce=debounce;exports.diffDates=diffDates;exports.diffDayAndTime=diffDayAndTime;exports.diffDays=diffDays;exports.diffPoints=diffPoints;exports.diffWeeks=diffWeeks;exports.diffWholeDays=diffWholeDays;exports.diffWholeWeeks=diffWholeWeeks;exports.disableCursor=disableCursor;exports.distributeHeight=distributeHeight;exports.elementClosest=elementClosest;exports.elementMatches=elementMatches;exports.enableCursor=enableCursor;exports.eventTupleToStore=eventTupleToStore;exports.filterEventStoreDefs=filterEventStoreDefs;exports.filterHash=filterHash;exports.findChildren=findChildren;exports.findElements=findElements;exports.flexibleCompare=flexibleCompare;exports.forceClassName=forceClassName;exports.formatDate=formatDate;exports.formatIsoTimeString=formatIsoTimeString;exports.formatRange=formatRange;exports.getAllDayHtml=getAllDayHtml;exports.getClippingParents=getClippingParents;exports.getDayClasses=getDayClasses;exports.getElSeg=getElSeg;exports.getRectCenter=getRectCenter;exports.getRelevantEvents=getRelevantEvents;exports.globalDefaults=globalDefaults;exports.greatestDurationDenominator=greatestDurationDenominator;exports.hasBgRendering=hasBgRendering;exports.htmlEscape=htmlEscape;exports.htmlToElement=htmlToElement;exports.insertAfterElement=insertAfterElement;exports.interactionSettingsStore=interactionSettingsStore;exports.interactionSettingsToStore=interactionSettingsToStore;exports.intersectRanges=intersectRanges;exports.intersectRects=intersectRects;exports.isArraysEqual=isArraysEqual;exports.isDateSpansEqual=isDateSpansEqual;exports.isInt=isInt;exports.isInteractionValid=isInteractionValid;exports.isMultiDayRange=isMultiDayRange;exports.isPropsEqual=isPropsEqual;exports.isPropsValid=isPropsValid;exports.isSingleDay=isSingleDay;exports.isValidDate=isValidDate;exports.listenBySelector=listenBySelector;exports.mapHash=mapHash;exports.matchCellWidths=matchCellWidths;exports.memoize=memoize;exports.memoizeOutput=memoizeOutput;exports.memoizeRendering=memoizeRendering;exports.mergeEventStores=mergeEventStores;exports.multiplyDuration=multiplyDuration;exports.padStart=padStart;exports.parseBusinessHours=parseBusinessHours;exports.parseDragMeta=parseDragMeta;exports.parseEventDef=parseEventDef;exports.parseFieldSpecs=parseFieldSpecs;exports.parseMarker=parse;exports.pointInsideRect=pointInsideRect;exports.prependToElement=prependToElement;exports.preventContextMenu=preventContextMenu;exports.preventDefault=preventDefault;exports.preventSelection=preventSelection;exports.processScopedUiProps=processScopedUiProps;exports.rangeContainsMarker=rangeContainsMarker;exports.rangeContainsRange=rangeContainsRange;exports.rangesEqual=rangesEqual;exports.rangesIntersect=rangesIntersect;exports.refineProps=refineProps;exports.removeElement=removeElement;exports.removeExact=removeExact;exports.renderDateCell=renderDateCell;exports.requestJson=requestJson;exports.sliceEventStore=sliceEventStore;exports.startOfDay=startOfDay;exports.subtractInnerElHeight=subtractInnerElHeight;exports.translateRect=translateRect;exports.uncompensateScroll=uncompensateScroll;exports.undistributeHeight=undistributeHeight;exports.unpromisify=unpromisify;exports.version=version;exports.whenTransitionDone=whenTransitionDone;exports.wholeDivideDurations=wholeDivideDurations;Object.defineProperty(exports,'__esModule',{value:true});}));