diff options
Diffstat (limited to 'library/fullcalendar/dist/index.global.js')
-rw-r--r-- | library/fullcalendar/dist/index.global.js | 1697 |
1 files changed, 1116 insertions, 581 deletions
diff --git a/library/fullcalendar/dist/index.global.js b/library/fullcalendar/dist/index.global.js index d2a252f78..0f67113d8 100644 --- a/library/fullcalendar/dist/index.global.js +++ b/library/fullcalendar/dist/index.global.js @@ -1,16 +1,97 @@ /*! -FullCalendar Standard Bundle v6.0.3 +FullCalendar Standard Bundle v6.1.8 Docs & License: https://fullcalendar.io/docs/initialize-globals -(c) 2022 Adam Shaw +(c) 2023 Adam Shaw */ var FullCalendar = (function (exports) { 'use strict'; - var n,l$1,u$1,i$1,t,o,r$1,f$1={},e$1=[],c$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function a$1(n){var l=n.parentNode;l&&l.removeChild(n);}function h(l,u,i){var t,o,r,f={};for(r in u)"key"==r?t=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v$1(l,f,t,o,null)}function v$1(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u$1:r};return null==r&&null!=l$1.vnode&&l$1.vnode(f),f}function y(){return {current:null}}function p(n){return n.children}function d(n,l){this.props=n,this.context=l;}function _(n,l){if(null==l)return n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return "function"==typeof n.type?_(n):null}function k$1(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k$1(n)}}function b$1(n){(!n.__d&&(n.__d=!0)&&t.push(n)&&!g$2.__r++||o!==l$1.debounceRendering)&&((o=l$1.debounceRendering)||setTimeout)(g$2);}function g$2(){for(var n;g$2.__r=t.length;)n=t.sort(function(n,l){return n.__v.__b-l.__v.__b}),t=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=s({},t)).__v=t.__v+1,j$2(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?_(t):o,t.__h),z$1(u,t),t.__e!=o&&k$1(t)));});}function w$2(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e$1,C=x.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||"boolean"==typeof k?null:"string"==typeof k||"number"==typeof k||"bigint"==typeof k?v$1(null,k,null,null,k):Array.isArray(k)?v$1(p,{children:k},null,null,null):k.__b>0?v$1(k.type,k.props,k.key,k.ref?k.ref:null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y<C;y++){if((d=x[y])&&k.key==d.key&&k.type===d.type){x[y]=void 0;break}d=null;}j$2(n,k,d=d||f$1,t,o,r,c,s,a),b=k.__e,(y=k.ref)&&d.ref!=y&&(w||(w=[]),d.ref&&w.push(d.ref,null,k),w.push(y,k.__c||b,k)),null!=b?(null==g&&(g=b),"function"==typeof k.type&&k.__k===d.__k?k.__d=s=m$1(k,s,n):s=A(n,k,d,x,b,s),"function"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_(d));}for(u.__e=g,h=C;h--;)null!=x[h]&&N(x[h],x[h]);if(w)for(h=0;h<w.length;h++)M(w[h],w[++h],w[++h]);}function m$1(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i.__=n,l="function"==typeof i.type?m$1(i,l,u):A(u,i,i,t,i.__e,l));return l}function x$1(n,l){return l=l||[],null==n||"boolean"==typeof n||(Array.isArray(n)?n.some(function(n){x$1(n,l);}):l.push(n)),l}function A(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else {for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=1)if(f==t)break n;n.insertBefore(t,o),r=o;}return void 0!==r?r:t.nextSibling}function C$1(n,l,u,i,t){var o;for(o in u)"children"===o||"key"===o||o in l||H$1(n,o,null,u[o],i);for(o in l)t&&"function"!=typeof l[o]||"children"===o||"key"===o||"value"===o||"checked"===o||u[o]===l[o]||H$1(n,o,l[o],u[o],i);}function $$1(n,l,u){"-"===l[0]?n.setProperty(l,u):n[l]=null==u?"":"number"!=typeof u||c$1.test(l)?u:u+"px";}function H$1(n,l,u,i,t){var o;n:if("style"===l)if("string"==typeof u)n.style.cssText=u;else {if("string"==typeof i&&(n.style.cssText=i=""),i)for(l in i)u&&l in u||$$1(n.style,l,"");if(u)for(l in u)i&&u[l]===i[l]||$$1(n.style,l,u[l]);}else if("o"===l[0]&&"n"===l[1])o=l!==(l=l.replace(/Capture$/,"")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T$1:I$1,o):n.removeEventListener(l,o?T$1:I$1,o);else if("dangerouslySetInnerHTML"!==l){if(t)l=l.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("href"!==l&&"list"!==l&&"form"!==l&&"tabIndex"!==l&&"download"!==l&&l in n)try{n[l]=null==u?"":u;break n}catch(n){}"function"==typeof u||(null==u||!1===u&&-1==l.indexOf("-")?n.removeAttribute(l):n.setAttribute(l,u));}}function I$1(n){this.l[n.type+!1](l$1.event?l$1.event(n):n);}function T$1(n){this.l[n.type+!0](l$1.event?l$1.event(n):n);}function j$2(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H,I,T=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=l$1.__b)&&a(u);try{n:if("function"==typeof T){if(g=u.props,m=(a=T.contextType)&&t[a.__c],x=a?m?m.props.value:a.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:("prototype"in T&&T.prototype.render?u.__c=h=new T(g,x):(u.__c=h=new d(g,x),h.constructor=T,h.render=O),m&&m.sub(h),h.props=g,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[],h._sb=[]),null==h.__s&&(h.__s=h.state),null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=s({},h.__s)),s(h.__s,T.getDerivedStateFromProps(g,h.__s))),y=h.props,_=h.state,v)null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else {if(null==T.getDerivedStateFromProps&&g!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(g,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(g,h.__s,x)||u.__v===i.__v){for(h.props=g,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u);}),A=0;A<h._sb.length;A++)h.__h.push(h._sb[A]);h._sb=[],h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(g,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,k);});}if(h.context=x,h.props=g,h.__v=u,h.__P=n,C=l$1.__r,$=0,"prototype"in T&&T.prototype.render){for(h.state=h.__s,h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[];}else do{h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),h.state=h.__s;}while(h.__d&&++$<25);h.state=h.__s,null!=h.getChildContext&&(t=s(s({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,_)),I=null!=a&&a.type===p&&null==a.key?a.props.children:a,w$2(n,Array.isArray(I)?I:[I],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1;}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L$1(i.__e,u,i,t,o,r,f,c);(a=l$1.diffed)&&a(u);}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l$1.__e(n,u,i);}}function z$1(n,u){l$1.__c&&l$1.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u);});}catch(n){l$1.__e(n,u.__v);}});}function L$1(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;if("svg"===d&&(o=!0),null!=r)for(;k<r.length;k++)if((s=r[k])&&"setAttribute"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,r[k]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS("http://www.w3.org/2000/svg",d):document.createElement(d,p.is&&p),r=null,c=!1;}if(null===d)y===p||c&&l.data===p||(l.data=p);else {if(r=r&&n.call(l.childNodes),h=(y=i.props||f$1).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},k=0;k<l.attributes.length;k++)y[l.attributes[k].name]=l.attributes[k].value;(v||h)&&(v&&(h&&v.__html==h.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||""));}if(C$1(l,p,y,o,c),v)u.__k=[];else if(k=u.props.children,w$2(l,Array.isArray(k)?k:[k],u,i,t,o&&"foreignObject"!==d,r,e,r?r[0]:i.__k&&_(i,0),c),null!=r)for(k=r.length;k--;)null!=r[k]&&a$1(r[k]);c||("value"in p&&void 0!==(k=p.value)&&(k!==l.value||"progress"===d&&!k||"option"===d&&k!==y.value)&&H$1(l,"value",k,y.value,!1),"checked"in p&&void 0!==(k=p.checked)&&k!==l.checked&&H$1(l,"checked",k,y.checked,!1));}return l}function M(n,u,i){try{"function"==typeof n?n(u):n.current=u;}catch(n){l$1.__e(n,i);}}function N(n,u,i){var t,o;if(l$1.unmount&&l$1.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount();}catch(n){l$1.__e(n,u);}t.base=t.__P=null,n.__c=void 0;}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,i||"function"!=typeof n.type);i||null==n.__e||a$1(n.__e),n.__=n.__e=n.__d=void 0;}function O(n,l,u){return this.constructor(n,u)}function P$1(u,i,t){var o,r,e;l$1.__&&l$1.__(u,i),r=(o="function"==typeof t)?null:t&&t.__k||i.__k,e=[],j$2(i,u=(!o&&t||i).__k=h(p,null,[u]),r||f$1,f$1,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n.call(i.childNodes):null,e,!o&&t?t:r?r.__e:i.firstChild,o),z$1(e,u);}function B$1(n,l){var u={__c:l="__cC"+r$1++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(b$1);},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n);};}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=e$1.slice,l$1={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l;}throw n}},u$1=0,i$1=function(n){return null!=n&&void 0===n.constructor},d.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s({},this.state),"function"==typeof n&&(n=n(s({},u),this.props)),n&&s(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),b$1(this));},d.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b$1(this));},d.prototype.render=p,t=[],g$2.__r=0,r$1=0; + var n,l$1,u$1,i$1,t,r$1,o,f$1,e$1,c$1={},s=[],a$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function h(n,l){for(var u in l)n[u]=l[u];return n}function v$1(n){var l=n.parentNode;l&&l.removeChild(n);}function y(l,u,i){var t,r,o,f={};for(o in u)"key"==o?t=u[o]:"ref"==o?r=u[o]:f[o]=u[o];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),"function"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===f[o]&&(f[o]=l.defaultProps[o]);return p(l,f,t,r,null)}function p(n,i,t,r,o){var f={type:n,props:i,key:t,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++u$1:o};return null==o&&null!=l$1.vnode&&l$1.vnode(f),f}function d(){return {current:null}}function _(n){return n.children}function k$1(n,l,u,i,t){var r;for(r in u)"children"===r||"key"===r||r in l||g$2(n,r,null,u[r],i);for(r in l)t&&"function"!=typeof l[r]||"children"===r||"key"===r||"value"===r||"checked"===r||u[r]===l[r]||g$2(n,r,l[r],u[r],i);}function b$1(n,l,u){"-"===l[0]?n.setProperty(l,null==u?"":u):n[l]=null==u?"":"number"!=typeof u||a$1.test(l)?u:u+"px";}function g$2(n,l,u,i,t){var r;n:if("style"===l)if("string"==typeof u)n.style.cssText=u;else {if("string"==typeof i&&(n.style.cssText=i=""),i)for(l in i)u&&l in u||b$1(n.style,l,"");if(u)for(l in u)i&&u[l]===i[l]||b$1(n.style,l,u[l]);}else if("o"===l[0]&&"n"===l[1])r=l!==(l=l.replace(/Capture$/,"")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+r]=u,u?i||n.addEventListener(l,r?w$2:m$1,r):n.removeEventListener(l,r?w$2:m$1,r);else if("dangerouslySetInnerHTML"!==l){if(t)l=l.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==l&&"height"!==l&&"href"!==l&&"list"!==l&&"form"!==l&&"tabIndex"!==l&&"download"!==l&&l in n)try{n[l]=null==u?"":u;break n}catch(n){}"function"==typeof u||(null==u||!1===u&&-1==l.indexOf("-")?n.removeAttribute(l):n.setAttribute(l,u));}}function m$1(n){t=!0;try{return this.l[n.type+!1](l$1.event?l$1.event(n):n)}finally{t=!1;}}function w$2(n){t=!0;try{return this.l[n.type+!0](l$1.event?l$1.event(n):n)}finally{t=!1;}}function x$1(n,l){this.props=n,this.context=l;}function A(n,l){if(null==l)return n.__?A(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return "function"==typeof n.type?A(n):null}function P$1(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return P$1(n)}}function C$1(n){t?setTimeout(n):f$1(n);}function T$1(n){(!n.__d&&(n.__d=!0)&&r$1.push(n)&&!$$1.__r++||o!==l$1.debounceRendering)&&((o=l$1.debounceRendering)||C$1)($$1);}function $$1(){var n,l,u,i,t,o,f,e;for(r$1.sort(function(n,l){return n.__v.__b-l.__v.__b});n=r$1.shift();)n.__d&&(l=r$1.length,i=void 0,t=void 0,f=(o=(u=n).__v).__e,(e=u.__P)&&(i=[],(t=h({},o)).__v=o.__v+1,M(e,o,t,u.__n,void 0!==e.ownerSVGElement,null!=o.__h?[f]:null,i,null==f?A(o):f,o.__h),N(i,o),o.__e!=f&&P$1(o)),r$1.length>l&&r$1.sort(function(n,l){return n.__v.__b-l.__v.__b}));$$1.__r=0;}function H$1(n,l,u,i,t,r,o,f,e,a){var h,v,y,d,k,b,g,m=i&&i.__k||s,w=m.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(d=u.__k[h]=null==(d=l[h])||"boolean"==typeof d?null:"string"==typeof d||"number"==typeof d||"bigint"==typeof d?p(null,d,null,null,d):Array.isArray(d)?p(_,{children:d},null,null,null):d.__b>0?p(d.type,d.props,d.key,d.ref?d.ref:null,d.__v):d)){if(d.__=u,d.__b=u.__b+1,null===(y=m[h])||y&&d.key==y.key&&d.type===y.type)m[h]=void 0;else for(v=0;v<w;v++){if((y=m[v])&&d.key==y.key&&d.type===y.type){m[v]=void 0;break}y=null;}M(n,d,y=y||c$1,t,r,o,f,e,a),k=d.__e,(v=d.ref)&&y.ref!=v&&(g||(g=[]),y.ref&&g.push(y.ref,null,d),g.push(v,d.__c||k,d)),null!=k?(null==b&&(b=k),"function"==typeof d.type&&d.__k===y.__k?d.__d=e=I$1(d,e,n):e=z$1(n,d,y,m,k,e),"function"==typeof u.type&&(u.__d=e)):e&&y.__e==e&&e.parentNode!=n&&(e=A(y));}for(u.__e=b,h=w;h--;)null!=m[h]&&("function"==typeof u.type&&null!=m[h].__e&&m[h].__e==u.__d&&(u.__d=L$1(i).nextSibling),q(m[h],m[h]));if(g)for(h=0;h<g.length;h++)S(g[h],g[++h],g[++h]);}function I$1(n,l,u){for(var i,t=n.__k,r=0;t&&r<t.length;r++)(i=t[r])&&(i.__=n,l="function"==typeof i.type?I$1(i,l,u):z$1(u,i,i,t,i.__e,l));return l}function j$2(n,l){return l=l||[],null==n||"boolean"==typeof n||(Array.isArray(n)?n.some(function(n){j$2(n,l);}):l.push(n)),l}function z$1(n,l,u,i,t,r){var o,f,e;if(void 0!==l.__d)o=l.__d,l.__d=void 0;else if(null==u||t!=r||null==t.parentNode)n:if(null==r||r.parentNode!==n)n.appendChild(t),o=null;else {for(f=r,e=0;(f=f.nextSibling)&&e<i.length;e+=1)if(f==t)break n;n.insertBefore(t,r),o=r;}return void 0!==o?o:t.nextSibling}function L$1(n){var l,u,i;if(null==n.type||"string"==typeof n.type)return n.__e;if(n.__k)for(l=n.__k.length-1;l>=0;l--)if((u=n.__k[l])&&(i=L$1(u)))return i;return null}function M(n,u,i,t,r,o,f,e,c){var s,a,v,y,p,d,k,b,g,m,w,A,P,C,T,$=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,o=[e]),(s=l$1.__b)&&s(u);try{n:if("function"==typeof $){if(b=u.props,g=(s=$.contextType)&&t[s.__c],m=s?g?g.props.value:s.__:t,i.__c?k=(a=u.__c=i.__c).__=a.__E:("prototype"in $&&$.prototype.render?u.__c=a=new $(b,m):(u.__c=a=new x$1(b,m),a.constructor=$,a.render=B$1),g&&g.sub(a),a.props=b,a.state||(a.state={}),a.context=m,a.__n=t,v=a.__d=!0,a.__h=[],a._sb=[]),null==a.__s&&(a.__s=a.state),null!=$.getDerivedStateFromProps&&(a.__s==a.state&&(a.__s=h({},a.__s)),h(a.__s,$.getDerivedStateFromProps(b,a.__s))),y=a.props,p=a.state,a.__v=u,v)null==$.getDerivedStateFromProps&&null!=a.componentWillMount&&a.componentWillMount(),null!=a.componentDidMount&&a.__h.push(a.componentDidMount);else {if(null==$.getDerivedStateFromProps&&b!==y&&null!=a.componentWillReceiveProps&&a.componentWillReceiveProps(b,m),!a.__e&&null!=a.shouldComponentUpdate&&!1===a.shouldComponentUpdate(b,a.__s,m)||u.__v===i.__v){for(u.__v!==i.__v&&(a.props=b,a.state=a.__s,a.__d=!1),u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u);}),w=0;w<a._sb.length;w++)a.__h.push(a._sb[w]);a._sb=[],a.__h.length&&f.push(a);break n}null!=a.componentWillUpdate&&a.componentWillUpdate(b,a.__s,m),null!=a.componentDidUpdate&&a.__h.push(function(){a.componentDidUpdate(y,p,d);});}if(a.context=m,a.props=b,a.__P=n,A=l$1.__r,P=0,"prototype"in $&&$.prototype.render){for(a.state=a.__s,a.__d=!1,A&&A(u),s=a.render(a.props,a.state,a.context),C=0;C<a._sb.length;C++)a.__h.push(a._sb[C]);a._sb=[];}else do{a.__d=!1,A&&A(u),s=a.render(a.props,a.state,a.context),a.state=a.__s;}while(a.__d&&++P<25);a.state=a.__s,null!=a.getChildContext&&(t=h(h({},t),a.getChildContext())),v||null==a.getSnapshotBeforeUpdate||(d=a.getSnapshotBeforeUpdate(y,p)),T=null!=s&&s.type===_&&null==s.key?s.props.children:s,H$1(n,Array.isArray(T)?T:[T],u,i,t,r,o,f,e,c),a.base=u.__e,u.__h=null,a.__h.length&&f.push(a),k&&(a.__E=a.__=null),a.__e=!1;}else null==o&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=O(i.__e,u,i,t,r,o,f,c);(s=l$1.diffed)&&s(u);}catch(n){u.__v=null,(c||null!=o)&&(u.__e=e,u.__h=!!c,o[o.indexOf(e)]=null),l$1.__e(n,u,i);}}function N(n,u){l$1.__c&&l$1.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u);});}catch(n){l$1.__e(n,u.__v);}});}function O(l,u,i,t,r,o,f,e){var s,a,h,y=i.props,p=u.props,d=u.type,_=0;if("svg"===d&&(r=!0),null!=o)for(;_<o.length;_++)if((s=o[_])&&"setAttribute"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,o[_]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=r?document.createElementNS("http://www.w3.org/2000/svg",d):document.createElement(d,p.is&&p),o=null,e=!1;}if(null===d)y===p||e&&l.data===p||(l.data=p);else {if(o=o&&n.call(l.childNodes),a=(y=i.props||c$1).dangerouslySetInnerHTML,h=p.dangerouslySetInnerHTML,!e){if(null!=o)for(y={},_=0;_<l.attributes.length;_++)y[l.attributes[_].name]=l.attributes[_].value;(h||a)&&(h&&(a&&h.__html==a.__html||h.__html===l.innerHTML)||(l.innerHTML=h&&h.__html||""));}if(k$1(l,p,y,r,e),h)u.__k=[];else if(_=u.props.children,H$1(l,Array.isArray(_)?_:[_],u,i,t,r&&"foreignObject"!==d,o,f,o?o[0]:i.__k&&A(i,0),e),null!=o)for(_=o.length;_--;)null!=o[_]&&v$1(o[_]);e||("value"in p&&void 0!==(_=p.value)&&(_!==l.value||"progress"===d&&!_||"option"===d&&_!==y.value)&&g$2(l,"value",_,y.value,!1),"checked"in p&&void 0!==(_=p.checked)&&_!==l.checked&&g$2(l,"checked",_,y.checked,!1));}return l}function S(n,u,i){try{"function"==typeof n?n(u):n.current=u;}catch(n){l$1.__e(n,i);}}function q(n,u,i){var t,r;if(l$1.unmount&&l$1.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||S(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount();}catch(n){l$1.__e(n,u);}t.base=t.__P=null,n.__c=void 0;}if(t=n.__k)for(r=0;r<t.length;r++)t[r]&&q(t[r],u,i||"function"!=typeof n.type);i||null==n.__e||v$1(n.__e),n.__=n.__e=n.__d=void 0;}function B$1(n,l,u){return this.constructor(n,u)}function D$1(u,i,t){var r,o,f;l$1.__&&l$1.__(u,i),o=(r="function"==typeof t)?null:t&&t.__k||i.__k,f=[],M(i,u=(!r&&t||i).__k=y(_,null,[u]),o||c$1,c$1,void 0!==i.ownerSVGElement,!r&&t?[t]:o?null:i.firstChild?n.call(i.childNodes):null,f,!r&&t?t:o?o.__e:i.firstChild,r),N(f,u);}function E(n,l){D$1(n,l,E);}function F$1(l,u,i){var t,r,o,f=h({},l.props);for(o in u)"key"==o?t=u[o]:"ref"==o?r=u[o]:f[o]=u[o];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),p(l.type,f,t||l.key,r||l.ref,null)}function G$1(n,l){var u={__c:l="__cC"+e$1++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(function(n){n.__e=!0,T$1(n);});},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n);};}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=s.slice,l$1={__e:function(n,l,u,i){for(var t,r,o;l=l.__;)if((t=l.__c)&&!t.__)try{if((r=t.constructor)&&null!=r.getDerivedStateFromError&&(t.setState(r.getDerivedStateFromError(n)),o=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),o=t.__d),o)return t.__E=t}catch(l){n=l;}throw n}},u$1=0,i$1=function(n){return null!=n&&void 0===n.constructor},t=!1,x$1.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=h({},this.state),"function"==typeof n&&(n=n(h({},u),this.props)),n&&h(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),T$1(this));},x$1.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),T$1(this));},x$1.prototype.render=_,r$1=[],f$1="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,$$1.__r=0,e$1=0; var r,u,i,f=[],c=[],e=l$1.__b,a=l$1.__r,v=l$1.diffed,l=l$1.__c,m=l$1.unmount;function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k),t.__H.__h.forEach(w$1),t.__H.__h=[];}catch(r){t.__H.__h=[],l$1.__e(r,t.__v);}}l$1.__b=function(n){r=null,e&&e(n);},l$1.__r=function(n){a&&a(n);var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0;})):(i.__h.forEach(k),i.__h.forEach(w$1),i.__h=[])),u=r;},l$1.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f.push(o)&&i===l$1.requestAnimationFrame||((i=l$1.requestAnimationFrame)||j$1)(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c;})),u=r=null;},l$1.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k),t.__h=t.__h.filter(function(n){return !n.__||w$1(n)});}catch(u){r.some(function(n){n.__h&&(n.__h=[]);}),r=[],l$1.__e(u,t.__v);}}),l&&l(t,r);},l$1.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k(n);}catch(n){r=n;}}),u.__H=void 0,r&&l$1.__e(r,u.__v));};var g$1="function"==typeof requestAnimationFrame;function j$1(n){var t,r=function(){clearTimeout(u),g$1&&cancelAnimationFrame(t),setTimeout(n);},u=setTimeout(r,100);g$1&&(t=requestAnimationFrame(r));}function k(n){var t=r,u=n.__c;"function"==typeof u&&(n.__c=void 0,u()),r=t;}function w$1(n){var t=r;n.__c=n.__(),r=t;} - function g(n,t){for(var e in t)n[e]=t[e];return n}function C(n,t){for(var e in n)if("__source"!==e&&!(e in t))return !0;for(var r in t)if("__source"!==r&&n[r]!==t[r])return !0;return !1}function w(n){this.props=n;}(w.prototype=new d).isPureReactComponent=!0,w.prototype.shouldComponentUpdate=function(n,t){return C(this.props,n)||C(this.state,t)};var x=l$1.__b;l$1.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),x&&x(n);};var T=l$1.__e;l$1.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);T(n,t,e,r);};var I=l$1.unmount;function L(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){"function"==typeof n.__c&&n.__c();}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return L(n,t,e)})),n}function U(n,t,e){return n&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return U(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.insertBefore(n.__e,n.__d),n.__c.__e=!0,n.__c.__P=e)),n}function D(){this.__u=0,this.t=null,this.__b=null;}function F(n){var t=n.__.__c;return t&&t.__a&&t.__a(n)}function V(){this.u=null,this.o=null;}l$1.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&!0===n.__h&&(n.type=null),I&&I(n);},(D.prototype=new d).__c=function(n,t){var e=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(e);var u=F(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(l):l());};e.__R=i;var l=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=U(n,n.__c.__P,n.__c.__O);}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate();}},c=!0===t.__h;r.__u++||c||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i);},D.prototype.componentWillUnmount=function(){this.t=[];},D.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),o=this.__v.__k[0].__c;this.__v.__k[0]=L(this.__b,r,o.__O=o.__P);}this.__b=null;}var i=e.__a&&h(p,null,n.fallback);return i&&(i.__h=null),[h(p,null,e.__a?null:n.children),i]};var W=function(n,t,e){if(++e[1]===e[0]&&n.o.delete(t),n.props.revealOrder&&("t"!==n.props.revealOrder[0]||!n.o.size))for(e=n.u;e;){for(;e.length>3;)e.pop()();if(e[1]<e[0])break;n.u=e=e[2];}};function P(n){return this.getChildContext=function(){return n.context},n.children}function $(n){var e=this,r=n.i;e.componentWillUnmount=function(){P$1(null,e.l),e.l=null,e.i=null;},e.i&&e.i!==r&&e.componentWillUnmount(),n.__v?(e.l||(e.i=r,e.l={nodeType:1,parentNode:r,childNodes:[],appendChild:function(n){this.childNodes.push(n),e.i.appendChild(n);},insertBefore:function(n,t){this.childNodes.push(n),e.i.appendChild(n);},removeChild:function(n){this.childNodes.splice(this.childNodes.indexOf(n)>>>1,1),e.i.removeChild(n);}}),P$1(h(P,{context:e.context},n.__v),e.l)):e.l&&e.componentWillUnmount();}function j(n,e){var r=h($,{__v:n,i:e});return r.containerInfo=e,r}(V.prototype=new d).__a=function(n){var t=this,e=F(t.__v),r=t.o.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),W(t,n,r)):u();};e?e(o):o();}},V.prototype.render=function(n){this.u=null,this.o=new Map;var t=x$1(n.children);n.revealOrder&&"b"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return n.children},V.prototype.componentDidUpdate=V.prototype.componentDidMount=function(){var n=this;this.o.forEach(function(t,e){W(n,e,t);});};var z="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,B=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,H="undefined"!=typeof document,Z=function(n){return ("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(n)};d.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(d.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n});}});});var G=l$1.event;function J(){}function K(){return this.cancelBubble}function Q(){return this.defaultPrevented}l$1.event=function(n){return G&&(n=G(n)),n.persist=J,n.isPropagationStopped=K,n.isDefaultPrevented=Q,n.nativeEvent=n};var nn={configurable:!0,get:function(){return this.class}},tn=l$1.vnode;l$1.vnode=function(n){var t=n.type,e=n.props,u=e;if("string"==typeof t){var o=-1===t.indexOf("-");for(var i in u={},e){var l=e[i];H&&"children"===i&&"noscript"===t||"value"===i&&"defaultValue"in e&&null==l||("defaultValue"===i&&"value"in e&&null==e.value?i="value":"download"===i&&!0===l?l="":/ondoubleclick/i.test(i)?i="ondblclick":/^onchange(textarea|input)/i.test(i+t)&&!Z(e.type)?i="oninput":/^onfocus$/i.test(i)?i="onfocusin":/^onblur$/i.test(i)?i="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i)?i=i.toLowerCase():o&&B.test(i)?i=i.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===l&&(l=void 0),/^oninput$/i.test(i)&&(i=i.toLowerCase(),u[i]&&(i="oninputCapture")),u[i]=l);}"select"==t&&u.multiple&&Array.isArray(u.value)&&(u.value=x$1(e.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value);})),"select"==t&&null!=u.defaultValue&&(u.value=x$1(e.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value;})),n.props=u,e.class!=e.className&&(nn.enumerable="className"in e,null!=e.className&&(u.class=e.className),Object.defineProperty(u,"className",nn));}n.$$typeof=z,tn&&tn(n);};var en=l$1.__r;l$1.__r=function(n){en&&en(n),n.__c;}; + function g(n,t){for(var e in t)n[e]=t[e];return n}function C(n,t){for(var e in n)if("__source"!==e&&!(e in t))return !0;for(var r in t)if("__source"!==r&&n[r]!==t[r])return !0;return !1}function w(n){this.props=n;}(w.prototype=new x$1).isPureReactComponent=!0,w.prototype.shouldComponentUpdate=function(n,t){return C(this.props,n)||C(this.state,t)};var x=l$1.__b;l$1.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),x&&x(n);};var T=l$1.__e;l$1.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);T(n,t,e,r);};var I=l$1.unmount;function L(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){"function"==typeof n.__c&&n.__c();}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return L(n,t,e)})),n}function U(n,t,e){return n&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return U(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.insertBefore(n.__e,n.__d),n.__c.__e=!0,n.__c.__P=e)),n}function D(){this.__u=0,this.t=null,this.__b=null;}function F(n){var t=n.__.__c;return t&&t.__a&&t.__a(n)}function V(){this.u=null,this.o=null;}l$1.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&!0===n.__h&&(n.type=null),I&&I(n);},(D.prototype=new x$1).__c=function(n,t){var e=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(e);var u=F(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(l):l());};e.__R=i;var l=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=U(n,n.__c.__P,n.__c.__O);}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate();}},c=!0===t.__h;r.__u++||c||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i);},D.prototype.componentWillUnmount=function(){this.t=[];},D.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),o=this.__v.__k[0].__c;this.__v.__k[0]=L(this.__b,r,o.__O=o.__P);}this.__b=null;}var i=e.__a&&y(_,null,n.fallback);return i&&(i.__h=null),[y(_,null,e.__a?null:n.children),i]};var W=function(n,t,e){if(++e[1]===e[0]&&n.o.delete(t),n.props.revealOrder&&("t"!==n.props.revealOrder[0]||!n.o.size))for(e=n.u;e;){for(;e.length>3;)e.pop()();if(e[1]<e[0])break;n.u=e=e[2];}};function P(n){return this.getChildContext=function(){return n.context},n.children}function $(n){var e=this,r=n.i;e.componentWillUnmount=function(){D$1(null,e.l),e.l=null,e.i=null;},e.i&&e.i!==r&&e.componentWillUnmount(),n.__v?(e.l||(e.i=r,e.l={nodeType:1,parentNode:r,childNodes:[],appendChild:function(n){this.childNodes.push(n),e.i.appendChild(n);},insertBefore:function(n,t){this.childNodes.push(n),e.i.appendChild(n);},removeChild:function(n){this.childNodes.splice(this.childNodes.indexOf(n)>>>1,1),e.i.removeChild(n);}}),D$1(y(P,{context:e.context},n.__v),e.l)):e.l&&e.componentWillUnmount();}function j(n,e){var r=y($,{__v:n,i:e});return r.containerInfo=e,r}(V.prototype=new x$1).__a=function(n){var t=this,e=F(t.__v),r=t.o.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),W(t,n,r)):u();};e?e(o):o();}},V.prototype.render=function(n){this.u=null,this.o=new Map;var t=j$2(n.children);n.revealOrder&&"b"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return n.children},V.prototype.componentDidUpdate=V.prototype.componentDidMount=function(){var n=this;this.o.forEach(function(t,e){W(n,e,t);});};var z="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,B=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,H="undefined"!=typeof document,Z=function(n){return ("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(n)};x$1.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(x$1.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n});}});});var G=l$1.event;function J(){}function K(){return this.cancelBubble}function Q(){return this.defaultPrevented}l$1.event=function(n){return G&&(n=G(n)),n.persist=J,n.isPropagationStopped=K,n.isDefaultPrevented=Q,n.nativeEvent=n};var nn={configurable:!0,get:function(){return this.class}},tn=l$1.vnode;l$1.vnode=function(n){var t=n.type,e=n.props,u=e;if("string"==typeof t){var o=-1===t.indexOf("-");for(var i in u={},e){var l=e[i];H&&"children"===i&&"noscript"===t||"value"===i&&"defaultValue"in e&&null==l||("defaultValue"===i&&"value"in e&&null==e.value?i="value":"download"===i&&!0===l?l="":/ondoubleclick/i.test(i)?i="ondblclick":/^onchange(textarea|input)/i.test(i+t)&&!Z(e.type)?i="oninput":/^onfocus$/i.test(i)?i="onfocusin":/^onblur$/i.test(i)?i="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i)?i=i.toLowerCase():o&&B.test(i)?i=i.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===l&&(l=void 0),/^oninput$/i.test(i)&&(i=i.toLowerCase(),u[i]&&(i="oninputCapture")),u[i]=l);}"select"==t&&u.multiple&&Array.isArray(u.value)&&(u.value=j$2(e.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value);})),"select"==t&&null!=u.defaultValue&&(u.value=j$2(e.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value;})),n.props=u,e.class!=e.className&&(nn.enumerable="className"in e,null!=e.className&&(u.class=e.className),Object.defineProperty(u,"className",nn));}n.$$typeof=z,tn&&tn(n);};var en=l$1.__r;l$1.__r=function(n){en&&en(n),n.__c;}; + + const styleTexts = []; + const styleEls = new Map(); + function injectStyles(styleText) { + styleTexts.push(styleText); + styleEls.forEach((styleEl) => { + appendStylesTo(styleEl, styleText); + }); + } + function ensureElHasStyles(el) { + if (el.isConnected) { + registerStylesRoot(el.getRootNode()); + } + } + function registerStylesRoot(rootNode) { + let styleEl = styleEls.get(rootNode); + if (!styleEl || !styleEl.isConnected) { + styleEl = rootNode.querySelector('style[data-fullcalendar]'); + if (!styleEl) { + styleEl = document.createElement('style'); + styleEl.setAttribute('data-fullcalendar', ''); + const nonce = getNonceValue(); + if (nonce) { + styleEl.nonce = nonce; + } + const parentEl = rootNode === document ? document.head : rootNode; + const insertBefore = rootNode === document + ? parentEl.querySelector('script,link[rel=stylesheet],link[as=style],style') + : parentEl.firstChild; + parentEl.insertBefore(styleEl, insertBefore); + } + styleEls.set(rootNode, styleEl); + hydrateStylesRoot(styleEl); + } + } + function hydrateStylesRoot(styleEl) { + for (const styleText of styleTexts) { + appendStylesTo(styleEl, styleText); + } + } + function appendStylesTo(styleEl, styleText) { + const { sheet } = styleEl; + const ruleCnt = sheet.cssRules.length; + styleText.split('}').forEach((styleStr, i) => { + styleStr = styleStr.trim(); + if (styleStr) { + sheet.insertRule(styleStr + '}', ruleCnt + i); + } + }); + } + // nonce + // ------------------------------------------------------------------------------------------------- + let queriedNonceValue; + function getNonceValue() { + if (queriedNonceValue === undefined) { + queriedNonceValue = queryNonceValue(); + } + return queriedNonceValue; + } + /* + TODO: discourage meta tag and instead put nonce attribute on placeholder <style> tag + */ + function queryNonceValue() { + const metaWithNonce = document.querySelector('meta[name="csp-nonce"]'); + if (metaWithNonce && metaWithNonce.hasAttribute('content')) { + return metaWithNonce.getAttribute('content'); + } + const elWithNonce = document.querySelector('script[nonce]'); + if (elWithNonce) { + return elWithNonce.nonce || ''; + } + return ''; + } + // main + // ------------------------------------------------------------------------------------------------- + if (typeof document !== 'undefined') { + registerStylesRoot(document); + } + + var css_248z$4 = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}"; + injectStyles(css_248z$4); function removeElement(el) { if (el.parentNode) { @@ -98,11 +179,6 @@ var FullCalendar = (function (exports) { var _a, _b; return (_b = (_a = ev.composedPath) === null || _a === void 0 ? void 0 : _a.call(ev)[0]) !== null && _b !== void 0 ? _b : ev.target; } - // Shadow DOM consuderations - // ---------------------------------------------------------------------------------------------------------------- - function getElRoot(el) { - return el.getRootNode ? el.getRootNode() : document; - } // Unique ID for DOM attribute let guid$1 = 0; function getUniqueDomId() { @@ -203,11 +279,11 @@ var FullCalendar = (function (exports) { /* Selection ----------------------------------------------------------------------------------------------------------------------*/ function preventSelection(el) { - el.classList.add('fc-unselectable'); + el.style.userSelect = 'none'; el.addEventListener('selectstart', preventDefault); } function allowSelection(el) { - el.classList.remove('fc-unselectable'); + el.style.userSelect = ''; el.removeEventListener('selectstart', preventDefault); } /* Context Menu @@ -483,22 +559,24 @@ var FullCalendar = (function (exports) { let dest = {}; if (complexPropsMap) { for (let name in complexPropsMap) { - let complexObjs = []; - // collect the trailing object values, stopping when a non-object is discovered - for (let i = propObjs.length - 1; i >= 0; i -= 1) { - let val = propObjs[i][name]; - if (typeof val === 'object' && val) { // non-null object - complexObjs.unshift(val); + if (complexPropsMap[name] === isMaybeObjectsEqual) { // implies that it's object-mergeable + let complexObjs = []; + // collect the trailing object values, stopping when a non-object is discovered + for (let i = propObjs.length - 1; i >= 0; i -= 1) { + let val = propObjs[i][name]; + if (typeof val === 'object' && val) { // non-null object + complexObjs.unshift(val); + } + else if (val !== undefined) { + dest[name] = val; // if there were no objects, this value will be used + break; + } } - else if (val !== undefined) { - dest[name] = val; // if there were no objects, this value will be used - break; + // if the trailing values were objects, use the merged value + if (complexObjs.length) { + dest[name] = mergeProps(complexObjs); } } - // if the trailing values were objects, use the merged value - if (complexObjs.length) { - dest[name] = mergeProps(complexObjs); - } } } // copy values into the destination, going from last to first @@ -636,6 +714,38 @@ var FullCalendar = (function (exports) { return res; } + // TODO: new util arrayify? + function removeExact(array, exactVal) { + let removeCnt = 0; + let i = 0; + while (i < array.length) { + if (array[i] === exactVal) { + array.splice(i, 1); + removeCnt += 1; + } + else { + i += 1; + } + } + return removeCnt; + } + function isArraysEqual(a0, a1, equalityFunc) { + if (a0 === a1) { + return true; + } + let len = a0.length; + let i; + if (len !== a1.length) { // not array? or not same length? + return false; + } + for (i = 0; i < len; i += 1) { + if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) { + return false; + } + } + return true; + } + const DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; // Adding function addWeeks(m, n) { @@ -826,6 +936,9 @@ var FullCalendar = (function (exports) { function formatDayString(marker) { return marker.toISOString().replace(/T.*$/, ''); } + function formatIsoMonthStr(marker) { + return marker.toISOString().match(/^\d{4}-\d{2}/)[0]; + } // TODO: use Date::toISOString and use everything after the T? function formatIsoTimeString(marker) { return padStart(marker.getUTCHours(), 2) + ':' + @@ -843,38 +956,6 @@ var FullCalendar = (function (exports) { return `GMT${sign}${hours}${mins ? `:${padStart(mins, 2)}` : ''}`; } - // TODO: new util arrayify? - function removeExact(array, exactVal) { - let removeCnt = 0; - let i = 0; - while (i < array.length) { - if (array[i] === exactVal) { - array.splice(i, 1); - removeCnt += 1; - } - else { - i += 1; - } - } - return removeCnt; - } - function isArraysEqual(a0, a1, equalityFunc) { - if (a0 === a1) { - return true; - } - let len = a0.length; - let i; - if (len !== a1.length) { // not array? or not same length? - return false; - } - for (i = 0; i < len; i += 1) { - if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) { - return false; - } - } - return true; - } - function memoize(workerFunc, resEquality, teardownFunc) { let currentArgs; let currentRes; @@ -1468,7 +1549,6 @@ var FullCalendar = (function (exports) { dateAlignment: String, dateIncrement: createDuration, hiddenDays: identity, - monthMode: Boolean, fixedWeekCount: Boolean, validRange: identity, visibleRange: identity, @@ -1486,6 +1566,7 @@ var FullCalendar = (function (exports) { moreLinkContent: identity, moreLinkDidMount: identity, moreLinkWillUnmount: identity, + monthStartFormat: createFormatter, // for connectors // (can't be part of plugin system b/c must be provided at runtime) handleCustomRendering: identity, @@ -1545,6 +1626,7 @@ var FullCalendar = (function (exports) { eventMinHeight: 15, eventMinWidth: 30, eventShortHeight: 30, + monthStartFormat: { month: 'long', day: 'numeric' }, }; // calendar listeners // ------------------ @@ -1588,6 +1670,10 @@ var FullCalendar = (function (exports) { buttonHints: isMaybeObjectsEqual, buttonIcons: isMaybeObjectsEqual, dateIncrement: isMaybeObjectsEqual, + plugins: isMaybeArraysEqual, + events: isMaybeArraysEqual, + eventSources: isMaybeArraysEqual, + ['resources']: isMaybeArraysEqual, }; function isMaybeObjectsEqual(a, b) { if (typeof a === 'object' && typeof b === 'object' && a && b) { // both non-null objects @@ -1595,6 +1681,12 @@ var FullCalendar = (function (exports) { } return a === b; } + function isMaybeArraysEqual(a, b) { + if (Array.isArray(a) && Array.isArray(b)) { + return isArraysEqual(a, b); + } + return a === b; + } // view-specific options // --------------------- const VIEW_OPTION_REFINERS = { @@ -1710,11 +1802,11 @@ var FullCalendar = (function (exports) { return markers; } - function parseEvents(rawEvents, eventSource, context, allowOpenRange) { + function parseEvents(rawEvents, eventSource, context, allowOpenRange, defIdMap, instanceIdMap) { let eventStore = createEmptyEventStore(); let eventRefiners = buildEventRefiners(context); for (let rawEvent of rawEvents) { - let tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners); + let tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners, defIdMap, instanceIdMap); if (tuple) { eventTupleToStore(tuple, eventStore); } @@ -1886,12 +1978,12 @@ var FullCalendar = (function (exports) { allDay: Boolean, }; const EVENT_REFINERS = Object.assign(Object.assign(Object.assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity }); - function parseEvent(raw, eventSource, context, allowOpenRange, refiners = buildEventRefiners(context)) { + function parseEvent(raw, eventSource, context, allowOpenRange, refiners = buildEventRefiners(context), defIdMap, instanceIdMap) { let { refined, extra } = refineEventDef(raw, context, refiners); let defaultAllDay = computeIsDefaultAllDay(eventSource, context); let recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes); if (recurringRes) { - let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context); + let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context, defIdMap); def.recurringDef = { typeId: recurringRes.typeId, typeData: recurringRes.typeData, @@ -1901,8 +1993,11 @@ var FullCalendar = (function (exports) { } let singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange); if (singleRes) { - let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context); + let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context, defIdMap); let instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); + if (instanceIdMap && def.publicId && instanceIdMap[def.publicId]) { + instance.instanceId = instanceIdMap[def.publicId]; + } return { def, instance }; } return null; @@ -1917,14 +2012,14 @@ var FullCalendar = (function (exports) { Will NOT populate extendedProps with the leftover properties. Will NOT populate date-related props. */ - function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) { + function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context, defIdMap) { let def = { title: refined.title || '', groupId: refined.groupId || '', publicId: refined.id || '', url: refined.url || '', recurringDef: null, - defId: guid(), + defId: ((defIdMap && refined.id) ? defIdMap[refined.id] : '') || guid(), sourceId, allDay, hasEnd, @@ -2943,19 +3038,19 @@ var FullCalendar = (function (exports) { callbackQ.push(callback); } l$1.debounceRendering = execCallbackSync; - P$1(h(FakeComponent, {}), document.createElement('div')); + D$1(y(FakeComponent, {}), document.createElement('div')); while (callbackQ.length) { callbackQ.shift()(); } l$1.debounceRendering = oldDebounceRendering; } - class FakeComponent extends d { - render() { return h('div', {}); } + class FakeComponent extends x$1 { + render() { return y('div', {}); } componentDidMount() { this.setState({}); } } // TODO: use preact/compat instead? function createContext(defaultValue) { - let ContextType = B$1(defaultValue); + let ContextType = G$1(defaultValue); let origProvider = ContextType.Provider; ContextType.Provider = function () { let isNew = !this.getChildContext; @@ -3050,7 +3145,7 @@ var FullCalendar = (function (exports) { } /* eslint max-classes-per-file: off */ - class PureComponent extends d { + class PureComponent extends x$1 { shouldComponentUpdate(nextProps, nextState) { if (this.debug) { // eslint-disable-next-line no-console @@ -3206,7 +3301,12 @@ var FullCalendar = (function (exports) { // 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); + // HACK: constrain to render-range so `currentDate` is more useful to view rendering + if (!rangeContainsMarker(renderRange, currentDate)) { + currentDate = renderRange.start; + } return { + currentDate, // 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, @@ -3892,7 +3992,9 @@ var FullCalendar = (function (exports) { let def = this._def; let { ui } = def; let { startStr, endStr } = this; - let res = {}; + let res = { + allDay: def.allDay, + }; if (def.title) { res.title = def.title; } @@ -4454,6 +4556,9 @@ var FullCalendar = (function (exports) { getMonth(marker) { return this.calendarSystem.getMarkerMonth(marker); } + getDay(marker) { + return this.calendarSystem.getMarkerDay(marker); + } // Adding / Subtracting add(marker, dur) { let a = this.calendarSystem.markerToArray(marker); @@ -5067,8 +5172,8 @@ var FullCalendar = (function (exports) { constructor() { super(...arguments); this.id = guid(); - this.currentDomNodes = []; this.queuedDomNodes = []; + this.currentDomNodes = []; this.handleEl = (el) => { if (this.props.elRef) { setRef(this.props.elRef, el); @@ -5078,35 +5183,46 @@ var FullCalendar = (function (exports) { render() { const { props, context } = this; const { options } = context; - const { generator, renderProps } = props; + const { customGenerator, defaultGenerator, renderProps } = props; const attrs = buildElAttrs(props); + let useDefault = false; let innerContent; let queuedDomNodes = []; - if (hasCustomRenderingHandler(props.generatorName, options)) { - if (options.customRenderingReplacesEl) { - delete attrs.elRef; // because handleEl will be used + let currentGeneratorMeta; + if (customGenerator != null) { + const customGeneratorRes = typeof customGenerator === 'function' ? + customGenerator(renderProps, y) : + customGenerator; + if (customGeneratorRes === true) { + useDefault = true; } - } - else { - const customContent = typeof generator === 'function' ? - generator(renderProps, h) : - generator; - if (typeof customContent === 'string' || - i$1(customContent) || - Array.isArray(customContent)) { - innerContent = customContent; - } - else if (typeof customContent === 'object') { - if ('html' in customContent) { - attrs.dangerouslySetInnerHTML = { __html: customContent.html }; + else { + const isObject = customGeneratorRes && typeof customGeneratorRes === 'object'; // non-null + if (isObject && ('html' in customGeneratorRes)) { + attrs.dangerouslySetInnerHTML = { __html: customGeneratorRes.html }; } - else if ('domNodes' in customContent) { - queuedDomNodes = Array.prototype.slice.call(customContent.domNodes); + else if (isObject && ('domNodes' in customGeneratorRes)) { + queuedDomNodes = Array.prototype.slice.call(customGeneratorRes.domNodes); + } + else if (!isObject && typeof customGeneratorRes !== 'function') { + // primitive value (like string or number) + innerContent = customGeneratorRes; + } + else { + // an exotic object for handleCustomRendering + currentGeneratorMeta = customGeneratorRes; } } } + else { + useDefault = !hasCustomRenderingHandler(props.generatorName, options); + } + if (useDefault && defaultGenerator) { + innerContent = defaultGenerator(renderProps); + } this.queuedDomNodes = queuedDomNodes; - return h(props.elTag, attrs, innerContent); + this.currentGeneratorMeta = currentGeneratorMeta; + return y(props.elTag, attrs, innerContent); } componentDidMount() { this.applyQueueudDomNodes(); @@ -5120,12 +5236,14 @@ var FullCalendar = (function (exports) { this.triggerCustomRendering(false); // TODO: different API for removal? } triggerCustomRendering(isActive) { + var _a; const { props, context } = this; const { handleCustomRendering, customRenderingMetaMap } = context.options; if (handleCustomRendering) { - const customRenderingMeta = customRenderingMetaMap === null || customRenderingMetaMap === void 0 ? void 0 : customRenderingMetaMap[props.generatorName]; - if (customRenderingMeta) { - handleCustomRendering(Object.assign({ id: this.id, isActive, containerEl: this.base, reportNewContainerEl: this.handleEl, generatorMeta: customRenderingMeta }, props)); + const generatorMeta = (_a = this.currentGeneratorMeta) !== null && _a !== void 0 ? _a : customRenderingMetaMap === null || customRenderingMetaMap === void 0 ? void 0 : customRenderingMetaMap[props.generatorName]; + if (generatorMeta) { + handleCustomRendering(Object.assign(Object.assign({ id: this.id, isActive, containerEl: this.base, reportNewContainerEl: this.handleEl, // for customRenderingReplacesEl + generatorMeta }, props), { elClasses: (props.elClasses || []).filter(isTruthy) })); } } } @@ -5148,6 +5266,9 @@ var FullCalendar = (function (exports) { renderProps: isPropsEqual, }); // Util + /* + Does UI-framework provide custom way of rendering? + */ function hasCustomRenderingHandler(generatorName, options) { var _a; return Boolean(options.handleCustomRendering && @@ -5168,13 +5289,22 @@ var FullCalendar = (function (exports) { } return attrs; } + function isTruthy(val) { + return Boolean(val); + } const RenderId = createContext(0); - class ContentContainer extends d { + class ContentContainer extends x$1 { constructor() { super(...arguments); this.InnerContent = InnerContentInjector.bind(undefined, this); + this.handleRootEl = (el) => { + this.rootEl = el; + if (this.props.elRef) { + setRef(this.props.elRef, el); + } + }; } render() { const { props } = this; @@ -5183,29 +5313,29 @@ var FullCalendar = (function (exports) { const elAttrs = buildElAttrs(props, generatedClassNames); const children = props.children(this.InnerContent, props.renderProps, elAttrs); if (props.elTag) { - return h(props.elTag, elAttrs, children); + return y(props.elTag, elAttrs, children); } else { return children; } } else { - return h((ContentInjector), Object.assign(Object.assign({}, props), { elTag: props.elTag || 'div', elClasses: (props.elClasses || []).concat(generatedClassNames), renderId: this.context })); + return y((ContentInjector), Object.assign(Object.assign({}, props), { elRef: this.handleRootEl, elTag: props.elTag || 'div', elClasses: (props.elClasses || []).concat(generatedClassNames), renderId: this.context })); } } componentDidMount() { var _a, _b; - (_b = (_a = this.props).didMount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.base })); + (_b = (_a = this.props).didMount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.rootEl || this.base })); } componentWillUnmount() { var _a, _b; - (_b = (_a = this.props).willUnmount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.base })); + (_b = (_a = this.props).willUnmount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.rootEl || this.base })); } } ContentContainer.contextType = RenderId; function InnerContentInjector(containerComponent, props) { const parentProps = containerComponent.props; - return h((ContentInjector), Object.assign({ renderProps: parentProps.renderProps, generatorName: parentProps.generatorName, generator: parentProps.generator, renderId: containerComponent.context }, props)); + return y((ContentInjector), Object.assign({ renderProps: parentProps.renderProps, generatorName: parentProps.generatorName, customGenerator: parentProps.customGenerator, defaultGenerator: parentProps.defaultGenerator, renderId: containerComponent.context }, props)); } // Utils function generateClassNames(classNameGenerator, renderProps) { @@ -5229,7 +5359,7 @@ var FullCalendar = (function (exports) { ? buildNavLinkAttrs(this.context, date) : {}; let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta); - return (h(ContentContainer, { elTag: "th", elClasses: classNames, elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan, 'data-date': !dayMeta.isDisabled ? formatDayString(date) : undefined }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContainer) => (h("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && (h(InnerContainer, { elTag: "a", elAttrs: navLinkAttrs, elClasses: [ + return (y(ContentContainer, { elTag: "th", elClasses: classNames, elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan, 'data-date': !dayMeta.isDisabled ? formatDayString(date) : undefined }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContainer) => (y("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && (y(InnerContainer, { elTag: "a", elAttrs: navLinkAttrs, elClasses: [ 'fc-col-header-cell-cushion', props.isSticky && 'fc-sticky', ] })))))); @@ -5253,12 +5383,12 @@ var FullCalendar = (function (exports) { let text = dateEnv.format(date, props.dayHeaderFormat); let renderProps = Object.assign(Object.assign(Object.assign(Object.assign({ // TODO: make this public? date }, dateMeta), { view: viewApi }), props.extraRenderProps), { text }); - return (h(ContentContainer, { elTag: "th", elClasses: [ + return (y(ContentContainer, { elTag: "th", elClasses: [ CLASS_NAME, ...getDayClassNames(dateMeta, theme), ...(props.extraClassNames || []), - ], elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => (h("div", { className: "fc-scrollgrid-sync-inner" }, - h(InnerContent, { elTag: "a", elClasses: [ + ], elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => (y("div", { className: "fc-scrollgrid-sync-inner" }, + y(InnerContent, { elTag: "a", elClasses: [ 'fc-col-header-cell-cushion', props.isSticky && 'fc-sticky', ], elAttrs: { @@ -5267,7 +5397,7 @@ var FullCalendar = (function (exports) { } } - class NowTimer extends d { + class NowTimer extends x$1 { constructor(props, context) { super(props, context); this.initialNowDate = getNow(context.options.now, context.dateEnv); @@ -5335,9 +5465,9 @@ var FullCalendar = (function (exports) { let { context } = this; let { dates, dateProfile, datesRepDistinctDays, renderIntro } = this.props; let dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length); - return (h(NowTimer, { unit: "day" }, (nowDate, todayRange) => (h("tr", { role: "row" }, + return (y(NowTimer, { unit: "day" }, (nowDate, todayRange) => (y("tr", { role: "row" }, renderIntro && renderIntro('day'), - dates.map((date) => (datesRepDistinctDays ? (h(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat })) : (h(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat })))))))); + dates.map((date) => (datesRepDistinctDays ? (y(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat })) : (y(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat })))))))); } } function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) { @@ -5490,7 +5620,7 @@ var FullCalendar = (function (exports) { let { eventUiBases } = props; let eventSegs = this.sliceEventStore(props.eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs); return { - dateSelectionSegs: this.sliceDateSelection(props.dateSelection, eventUiBases, context, ...extraArgs), + dateSelectionSegs: this.sliceDateSelection(props.dateSelection, dateProfile, nextDayThreshold, eventUiBases, context, ...extraArgs), businessHourSegs: this.sliceBusinessHours(props.businessHours, dateProfile, nextDayThreshold, context, ...extraArgs), fgEventSegs: eventSegs.fg, bgEventSegs: eventSegs.bg, @@ -5500,9 +5630,9 @@ var FullCalendar = (function (exports) { }; // TODO: give interactionSegs? } sliceNowDate(// does not memoize - date, context, ...extraArgs) { + date, dateProfile, nextDayThreshold, context, ...extraArgs) { return this._sliceDateSpan({ range: { start: date, end: addMs(date, 1) }, allDay: false }, // add 1 ms, protect against null range - {}, context, ...extraArgs); + dateProfile, nextDayThreshold, {}, context, ...extraArgs); } _sliceBusinessHours(businessHours, dateProfile, nextDayThreshold, context, ...extraArgs) { if (!businessHours) { @@ -5531,16 +5661,22 @@ var FullCalendar = (function (exports) { isEvent: interaction.isEvent, }; } - _sliceDateSpan(dateSpan, eventUiBases, context, ...extraArgs) { + _sliceDateSpan(dateSpan, dateProfile, nextDayThreshold, eventUiBases, context, ...extraArgs) { if (!dateSpan) { return []; } - let eventRange = fabricateEventRange(dateSpan, eventUiBases, context); - let segs = this.sliceRange(dateSpan.range, ...extraArgs); - for (let seg of segs) { - seg.eventRange = eventRange; + let activeRange = computeActiveRange(dateProfile, Boolean(nextDayThreshold)); + let activeDateSpanRange = intersectRanges(dateSpan.range, activeRange); + if (activeDateSpanRange) { + dateSpan = Object.assign(Object.assign({}, dateSpan), { range: activeDateSpanRange }); + let eventRange = fabricateEventRange(dateSpan, eventUiBases, context); + let segs = this.sliceRange(dateSpan.range, ...extraArgs); + for (let seg of segs) { + seg.eventRange = eventRange; + } + return segs; } - return segs; + return []; } /* "complete" seg means it has component and eventRange @@ -5593,6 +5729,8 @@ var FullCalendar = (function (exports) { switch (action.type) { case 'RECEIVE_EVENTS': // raw return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context); + case 'RESET_RAW_EVENTS': + return resetRawEvents(eventStore, eventSources[action.sourceId], action.rawEvents, dateProfile.activeRange, context); case 'ADD_EVENTS': // already parsed, but not expanded return addEvent(eventStore, action.eventStore, // new ones dateProfile ? dateProfile.activeRange : null, context); @@ -5633,6 +5771,11 @@ var FullCalendar = (function (exports) { } return eventStore; } + function resetRawEvents(existingEventStore, eventSource, rawEvents, activeRange, context) { + const { defIdMap, instanceIdMap } = buildPublicIdMaps(existingEventStore); + let newEventStore = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context, false, defIdMap, instanceIdMap); + return expandRecurring(newEventStore, activeRange, context); + } function transformRawEvents(rawEvents, eventSource, context) { let calEachTransform = context.options.eventDataTransform; let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; @@ -5673,7 +5816,7 @@ var FullCalendar = (function (exports) { let { defs } = eventStore; let instances = mapHash(eventStore.instances, (instance) => { let def = defs[instance.defId]; - if (def.allDay || def.recurringDef) { + if (def.allDay) { return instance; // isn't dependent on timezone } return Object.assign(Object.assign({}, instance), { range: { @@ -5693,6 +5836,27 @@ var FullCalendar = (function (exports) { instances: filterHash(eventStore.instances, (instance) => !removals[instance.instanceId]), }; } + function buildPublicIdMaps(eventStore) { + const { defs, instances } = eventStore; + const defIdMap = {}; + const instanceIdMap = {}; + for (let defId in defs) { + const def = defs[defId]; + const { publicId } = def; + if (publicId) { + defIdMap[publicId] = defId; + } + } + for (let instanceId in instances) { + const instance = instances[instanceId]; + const def = defs[instance.defId]; + const { publicId } = def; + if (publicId) { + instanceIdMap[publicId] = instanceId; + } + } + return { defIdMap, instanceIdMap }; + } // high-level segmenting-aware tester functions // ------------------------------------------------------------------------------------------------------------------------ @@ -6008,7 +6172,7 @@ var FullCalendar = (function (exports) { className.push('fc-scroller-liquid'); } } - return (h("div", { ref: this.handleEl, className: className.join(' '), style: { + return (y("div", { ref: this.handleEl, className: className.join(' '), style: { overflowX: props.overflowX, overflowY: props.overflowY, left: (isAbsolute && -(props.overcomeLeft || 0)) || '', @@ -6149,7 +6313,7 @@ var FullCalendar = (function (exports) { let { expandRows } = arg; let content = typeof chunkConfig.content === 'function' ? chunkConfig.content(arg) : - h('table', { + y('table', { role: 'presentation', className: [ chunkConfig.tableClassName, @@ -6160,7 +6324,7 @@ var FullCalendar = (function (exports) { width: arg.clientWidth, height: expandRows ? arg.clientHeight : '', // css `height` on a <table> serves as a min-height }, - }, arg.tableColGroupNode, h(isHeader ? 'thead' : 'tbody', { + }, arg.tableColGroupNode, y(isHeader ? 'thead' : 'tbody', { role: 'presentation', }, typeof chunkConfig.rowContent === 'function' ? chunkConfig.rowContent(arg) @@ -6180,13 +6344,13 @@ var FullCalendar = (function (exports) { for (let colProps of cols) { let span = colProps.span || 1; for (let i = 0; i < span; i += 1) { - colNodes.push(h("col", { style: { + colNodes.push(y("col", { style: { width: colProps.width === 'shrink' ? sanitizeShrinkWidth(shrinkWidth) : (colProps.width || ''), minWidth: colProps.minWidth || '', } })); } } - return h('colgroup', {}, ...colNodes); + return y('colgroup', {}, ...colNodes); } function sanitizeShrinkWidth(shrinkWidth) { /* why 4? if we do 0, it will kill any border, which are needed for computeSmallestCellWidth @@ -6226,7 +6390,7 @@ var FullCalendar = (function (exports) { return classNames; } function renderScrollShim(arg) { - return (h("div", { className: "fc-scrollgrid-sticky-shim", style: { + return (y("div", { className: "fc-scrollgrid-sticky-shim", style: { width: arg.clientWidth, minWidth: arg.tableMinWidth, } })); @@ -6299,17 +6463,17 @@ var FullCalendar = (function (exports) { // if so, use a simpler dom structure, jam everything into a lone tbody. let isBuggy = !getCanVGrowWithinCell(); const roleAttrs = { role: 'rowgroup' }; - return h('table', { + return y('table', { role: 'grid', className: classNames.join(' '), style: { height: props.height }, - }, Boolean(!isBuggy && headSectionNodes.length) && h('thead', roleAttrs, ...headSectionNodes), Boolean(!isBuggy && bodySectionNodes.length) && h('tbody', roleAttrs, ...bodySectionNodes), Boolean(!isBuggy && footSectionNodes.length) && h('tfoot', roleAttrs, ...footSectionNodes), isBuggy && h('tbody', roleAttrs, ...headSectionNodes, ...bodySectionNodes, ...footSectionNodes)); + }, Boolean(!isBuggy && headSectionNodes.length) && y('thead', roleAttrs, ...headSectionNodes), Boolean(!isBuggy && bodySectionNodes.length) && y('tbody', roleAttrs, ...bodySectionNodes), Boolean(!isBuggy && footSectionNodes.length) && y('tfoot', roleAttrs, ...footSectionNodes), isBuggy && y('tbody', roleAttrs, ...headSectionNodes, ...bodySectionNodes, ...footSectionNodes)); } renderSection(sectionConfig, microColGroupNode, isHeader) { if ('outerContent' in sectionConfig) { - return (h(p, { key: sectionConfig.key }, sectionConfig.outerContent)); + return (y(_, { key: sectionConfig.key }, sectionConfig.outerContent)); } - return (h("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader))); + return (y("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader))); } renderChunkTd(sectionConfig, microColGroupNode, chunkConfig, isHeader) { if ('outerContent' in chunkConfig) { @@ -6336,11 +6500,11 @@ var FullCalendar = (function (exports) { rowSyncHeights: [], reportRowHeightChange: () => { }, }, isHeader); - return h(isHeader ? 'th' : 'td', { + return y(isHeader ? 'th' : 'td', { ref: chunkConfig.elRef, role: 'presentation', - }, h("div", { className: `fc-scroller-harness${isLiquid ? ' fc-scroller-harness-liquid' : ''}` }, - h(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */, maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute // because its within a harness + }, y("div", { className: `fc-scroller-harness${isLiquid ? ' fc-scroller-harness-liquid' : ''}` }, + y(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */, maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute // because its within a harness : true }, content))); } _handleScrollerEl(scrollerEl, key) { @@ -6441,11 +6605,11 @@ var FullCalendar = (function (exports) { isDragging: Boolean(props.isDragging), isResizing: Boolean(props.isResizing), }; - return (h(ContentContainer, Object.assign({}, props /* contains children */, { elRef: this.handleEl, elClasses: [ + return (y(ContentContainer, Object.assign({}, props /* contains children */, { elRef: this.handleEl, elClasses: [ ...getEventClassNames(renderProps), ...seg.eventRange.ui.classNames, ...(props.elClasses || []), - ], renderProps: renderProps, generatorName: "eventContent", generator: options.eventContent || props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount }))); + ], renderProps: renderProps, generatorName: "eventContent", customGenerator: options.eventContent, defaultGenerator: props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount }))); } componentDidUpdate(prevProps) { if (this.el && this.props.seg !== prevProps.seg) { @@ -6463,30 +6627,30 @@ var FullCalendar = (function (exports) { let { ui } = seg.eventRange; let timeFormat = options.eventTimeFormat || props.defaultTimeFormat; let timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd); - return (h(EventContainer, Object.assign({}, props /* includes elRef */, { elTag: "a", elStyle: { + return (y(EventContainer, Object.assign({}, props /* includes elRef */, { elTag: "a", elStyle: { borderColor: ui.borderColor, backgroundColor: ui.backgroundColor, - }, elAttrs: getSegAnchorAttrs(seg, context), defaultGenerator: renderInnerContent$1$1, timeText: timeText }), (InnerContent, eventContentArg) => (h(p, null, - h(InnerContent, { elTag: "div", elClasses: ['fc-event-main'], elStyle: { color: eventContentArg.textColor } }), - Boolean(eventContentArg.isStartResizable) && (h("div", { className: "fc-event-resizer fc-event-resizer-start" })), - Boolean(eventContentArg.isEndResizable) && (h("div", { className: "fc-event-resizer fc-event-resizer-end" })))))); + }, elAttrs: getSegAnchorAttrs(seg, context), defaultGenerator: renderInnerContent$1$1, timeText: timeText }), (InnerContent, eventContentArg) => (y(_, null, + y(InnerContent, { elTag: "div", elClasses: ['fc-event-main'], elStyle: { color: eventContentArg.textColor } }), + Boolean(eventContentArg.isStartResizable) && (y("div", { className: "fc-event-resizer fc-event-resizer-start" })), + Boolean(eventContentArg.isEndResizable) && (y("div", { className: "fc-event-resizer fc-event-resizer-end" })))))); } } function renderInnerContent$1$1(innerProps) { - return (h("div", { className: "fc-event-main-frame" }, - innerProps.timeText && (h("div", { className: "fc-event-time" }, innerProps.timeText)), - h("div", { className: "fc-event-title-container" }, - h("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || h(p, null, "\u00A0"))))); + return (y("div", { className: "fc-event-main-frame" }, + innerProps.timeText && (y("div", { className: "fc-event-time" }, innerProps.timeText)), + y("div", { className: "fc-event-title-container" }, + y("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || y(_, null, "\u00A0"))))); } - const NowIndicatorContainer = (props) => (h(ViewContextType.Consumer, null, (context) => { + const NowIndicatorContainer = (props) => (y(ViewContextType.Consumer, null, (context) => { let { options } = context; let renderProps = { isAxis: props.isAxis, date: context.dateEnv.toDate(props.date), view: context.viewApi, }; - return (h(ContentContainer, Object.assign({}, props /* includes children */, { elTag: props.elTag || 'div', renderProps: renderProps, generatorName: "nowIndicatorContent", generator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }))); + return (y(ContentContainer, Object.assign({}, props /* includes children */, { elTag: props.elTag || 'div', renderProps: renderProps, generatorName: "nowIndicatorContent", customGenerator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }))); })); const DAY_NUM_FORMAT = createFormatter({ day: 'numeric' }); @@ -6502,15 +6666,17 @@ var FullCalendar = (function (exports) { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, + isMonthStart: props.isMonthStart || false, showDayNumber: props.showDayNumber, extraRenderProps: props.extraRenderProps, viewApi: context.viewApi, dateEnv: context.dateEnv, + monthStartFormat: options.monthStartFormat, }); - return (h(ContentContainer, Object.assign({}, props /* includes children */, { elClasses: [ + return (y(ContentContainer, Object.assign({}, props /* includes children */, { elClasses: [ ...getDayClassNames(renderProps, context.theme), ...(props.elClasses || []), - ], elAttrs: Object.assign(Object.assign({}, props.elAttrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), renderProps: renderProps, generatorName: "dayCellContent", generator: options.dayCellContent || props.defaultGenerator, classNameGenerator: + ], elAttrs: Object.assign(Object.assign({}, props.elAttrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), renderProps: renderProps, generatorName: "dayCellContent", customGenerator: options.dayCellContent, defaultGenerator: props.defaultGenerator, classNameGenerator: // don't use custom classNames if disabled renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount }))); } @@ -6519,35 +6685,37 @@ var FullCalendar = (function (exports) { return Boolean(options.dayCellContent || hasCustomRenderingHandler('dayCellContent', options)); } function refineRenderProps(raw) { - let { date, dateEnv } = raw; - let dayMeta = getDateMeta(date, raw.todayRange, null, raw.dateProfile); - return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ? dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraRenderProps); + let { date, dateEnv, dateProfile, isMonthStart } = raw; + let dayMeta = getDateMeta(date, raw.todayRange, null, dateProfile); + let dayNumberText = raw.showDayNumber ? (dateEnv.format(date, isMonthStart ? raw.monthStartFormat : DAY_NUM_FORMAT)) : ''; + return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { isMonthStart, + dayNumberText }), raw.extraRenderProps); } class BgEvent extends BaseComponent { render() { let { props } = this; let { seg } = props; - return (h(EventContainer, { elTag: "div", elClasses: ['fc-bg-event'], elStyle: { backgroundColor: seg.eventRange.ui.backgroundColor }, defaultGenerator: renderInnerContent$3, seg: seg, timeText: "", isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, disableDragging: true, disableResizing: true })); + return (y(EventContainer, { elTag: "div", elClasses: ['fc-bg-event'], elStyle: { backgroundColor: seg.eventRange.ui.backgroundColor }, defaultGenerator: renderInnerContent$3, seg: seg, timeText: "", isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, disableDragging: true, disableResizing: true })); } } function renderInnerContent$3(props) { let { title } = props.event; - return title && (h("div", { className: "fc-event-title" }, props.event.title)); + return title && (y("div", { className: "fc-event-title" }, props.event.title)); } function renderFill(fillType) { - return (h("div", { className: `fc-${fillType}` })); + return (y("div", { className: `fc-${fillType}` })); } - const WeekNumberContainer = (props) => (h(ViewContextType.Consumer, null, (context) => { + const WeekNumberContainer = (props) => (y(ViewContextType.Consumer, null, (context) => { let { dateEnv, options } = context; let { date } = props; let format = options.weekNumberFormat || props.defaultFormat; let num = dateEnv.computeWeekNumber(date); // TODO: somehow use for formatting as well? let text = dateEnv.format(date, format); let renderProps = { num, text, date }; - return (h(ContentContainer // why isn't WeekNumberContentArg being auto-detected? - , Object.assign({}, props /* includes children */, { renderProps: renderProps, generatorName: "weekNumberContent", generator: options.weekNumberContent || renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }))); + return (y(ContentContainer // why isn't WeekNumberContentArg being auto-detected? + , Object.assign({}, props /* includes children */, { renderProps: renderProps, generatorName: "weekNumberContent", customGenerator: options.weekNumberContent, defaultGenerator: renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }))); })); function renderInner(innerProps) { return innerProps.text; @@ -6593,11 +6761,11 @@ var FullCalendar = (function (exports) { 'fc-popover', theme.getClass('popover'), ].concat(props.extraClassNames || []); - return j(h("div", Object.assign({}, props.extraAttrs, { id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId, ref: this.handleRootEl }), - h("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') }, - h("span", { className: "fc-popover-title", id: state.titleId }, props.title), - h("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })), - h("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl); + return j(y("div", Object.assign({}, props.extraAttrs, { id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId, ref: this.handleRootEl }), + y("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') }, + y("span", { className: "fc-popover-title", id: state.titleId }, props.title), + y("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })), + y("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl); } componentDidMount() { document.addEventListener('mousedown', this.handleDocumentMouseDown); @@ -6654,8 +6822,8 @@ var FullCalendar = (function (exports) { let { props } = this; let { startDate, todayRange, dateProfile } = props; let title = dateEnv.format(startDate, options.dayPopoverFormat); - return (h(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateProfile: dateProfile, todayRange: todayRange }, (InnerContent, renderProps, elAttrs) => (h(Popover, { elRef: elAttrs.ref, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(elAttrs.className || []), extraAttrs: elAttrs /* TODO: make these time-based when not whole-day? */, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, - hasCustomDayCellContent(options) && (h(InnerContent, { elTag: "div", elClasses: ['fc-more-popover-misc'] })), + return (y(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateProfile: dateProfile, todayRange: todayRange }, (InnerContent, renderProps, elAttrs) => (y(Popover, { elRef: elAttrs.ref, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(elAttrs.className || []), extraAttrs: elAttrs /* TODO: make these time-based when not whole-day? */, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, + hasCustomDayCellContent(options) && (y(InnerContent, { elTag: "div", elClasses: ['fc-more-popover-misc'] })), props.children)))); } queryHit(positionLeft, positionTop, elWidth, elHeight) { @@ -6664,7 +6832,7 @@ var FullCalendar = (function (exports) { positionTop >= 0 && positionTop < elHeight) { return { dateProfile: props.dateProfile, - dateSpan: Object.assign({ allDay: true, range: { + dateSpan: Object.assign({ allDay: !props.forceTimed, range: { start: props.startDate, end: props.endDate, } }, props.extraDateSpan), @@ -6732,7 +6900,7 @@ var FullCalendar = (function (exports) { } render() { let { props, state } = this; - return (h(ViewContextType.Consumer, null, (context) => { + return (y(ViewContextType.Consumer, null, (context) => { let { viewApi, options, calendarApi } = context; let { moreLinkText } = options; let { moreCnt } = props; @@ -6747,14 +6915,14 @@ var FullCalendar = (function (exports) { text, view: viewApi, }; - return (h(p, null, - Boolean(props.moreCnt) && (h(ContentContainer, { elTag: props.elTag || 'a', elRef: this.handleLinkEl, elClasses: [ + return (y(_, null, + Boolean(props.moreCnt) && (y(ContentContainer, { elTag: props.elTag || 'a', elRef: this.handleLinkEl, elClasses: [ ...(props.elClasses || []), 'fc-more-link', - ], elStyle: props.elStyle, elAttrs: Object.assign(Object.assign(Object.assign({}, props.elAttrs), createAriaClickAttrs(this.handleClick)), { title: hint, 'aria-expanded': state.isPopoverOpen, 'aria-controls': state.isPopoverOpen ? state.popoverId : '' }), renderProps: renderProps, generatorName: "moreLinkContent", generator: options.moreLinkContent || props.defaultGenerator || renderMoreLinkInner$1, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children)), - state.isPopoverOpen && (h(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: this.parentEl, alignmentEl: props.alignmentElRef ? + ], elStyle: props.elStyle, elAttrs: Object.assign(Object.assign(Object.assign({}, props.elAttrs), createAriaClickAttrs(this.handleClick)), { title: hint, 'aria-expanded': state.isPopoverOpen, 'aria-controls': state.isPopoverOpen ? state.popoverId : '' }), renderProps: renderProps, generatorName: "moreLinkContent", customGenerator: options.moreLinkContent, defaultGenerator: props.defaultGenerator || renderMoreLinkInner$1, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children)), + state.isPopoverOpen && (y(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: this.parentEl, alignmentEl: props.alignmentElRef ? props.alignmentElRef.current : - this.linkEl, alignGridTop: props.alignGridTop, onClose: this.handlePopoverClose }, props.popoverContent())))); + this.linkEl, alignGridTop: props.alignGridTop, forceTimed: props.forceTimed, onClose: this.handlePopoverClose }, props.popoverContent())))); })); } componentDidMount() { @@ -6798,15 +6966,15 @@ var FullCalendar = (function (exports) { return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1; } - class ViewContainer$1 extends BaseComponent { + class ViewContainer extends BaseComponent { render() { let { props, context } = this; let { options } = context; let renderProps = { view: context.viewApi }; - return (h(ContentContainer, Object.assign({}, props, { elTag: props.elTag || 'div', elClasses: [ + return (y(ContentContainer, Object.assign({}, props, { elTag: props.elTag || 'div', elClasses: [ ...buildViewClassNames(props.viewSpec), ...(props.elClasses || []), - ], renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, generator: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children)); + ], renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children)); } } function buildViewClassNames(viewSpec) { @@ -6816,22 +6984,6 @@ var FullCalendar = (function (exports) { ]; } - function injectStyles(css) { - if (!css || typeof document === 'undefined') { - return; - } - const head = document.head || document.getElementsByTagName('head')[0]; - const style = document.createElement('style'); - style.type = 'text/css'; - head.appendChild(style); - if (style.styleSheet) { - style.styleSheet.cssText = css; - } - else { - style.appendChild(document.createTextNode(css)); - } - } - const EVENT_SOURCE_REFINERS = { id: String, defaultAllDay: Boolean, @@ -7313,7 +7465,7 @@ var FullCalendar = (function (exports) { } } - var internal_esm = { + var internal = { __proto__: null, BASE_OPTION_DEFAULTS: BASE_OPTION_DEFAULTS, BaseComponent: BaseComponent, @@ -7353,7 +7505,7 @@ var FullCalendar = (function (exports) { TableDateCell: TableDateCell, TableDowCell: TableDowCell, Theme: Theme, - ViewContainer: ViewContainer$1, + ViewContainer: ViewContainer, ViewContextType: ViewContextType, WeekNumberContainer: WeekNumberContainer, WindowScrollController: WindowScrollController, @@ -7413,6 +7565,7 @@ var FullCalendar = (function (exports) { findElements: findElements, flexibleCompare: flexibleCompare, formatDayString: formatDayString, + formatIsoMonthStr: formatIsoMonthStr, formatIsoTimeString: formatIsoTimeString, getAllowYScrolling: getAllowYScrolling, getCanVGrowWithinCell: getCanVGrowWithinCell, @@ -7420,7 +7573,6 @@ var FullCalendar = (function (exports) { getDateMeta: getDateMeta, getDayClassNames: getDayClassNames, getDefaultEventEnd: getDefaultEventEnd, - getElRoot: getElRoot, getElSeg: getElSeg, getEntrySpanEnd: getEntrySpanEnd, getEventTargetViaRoot: getEventTargetViaRoot, @@ -7503,8 +7655,23 @@ var FullCalendar = (function (exports) { wholeDivideDurations: wholeDivideDurations }; - var css_248z$3 = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{border-style:none;padding:0}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}"; - injectStyles(css_248z$3); + var preact = { + __proto__: null, + createPortal: j, + createContext: createContext, + flushSync: flushSync, + Component: x$1, + Fragment: _, + cloneElement: F$1, + createElement: y, + createRef: d, + h: y, + hydrate: E, + get isValidElement () { return i$1; }, + get options () { return l$1; }, + render: D$1, + toChildArray: j$2 + }; const globalLocales = []; @@ -7845,8 +8012,13 @@ var FullCalendar = (function (exports) { input; let { component } = rawOptions; if (rawOptions.content) { - component = createViewHookComponent(rawOptions); // TODO: remove content/classNames/didMount/etc from options? + component = createViewHookComponent(rawOptions); + } + else if (component && !(component.prototype instanceof BaseComponent)) { + // WHY?: people were using `component` property for `content` + // TODO: converge on one setting name + component = createViewHookComponent(Object.assign(Object.assign({}, rawOptions), { content: component })); } return { superType: rawOptions.type, @@ -7855,7 +8027,7 @@ var FullCalendar = (function (exports) { }; } function createViewHookComponent(options) { - return (viewProps) => (h(ViewContextType.Consumer, null, (context) => (h(ContentContainer, { elTag: "div", elClasses: buildViewClassNames(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: undefined, generator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount })))); + return (viewProps) => (y(ViewContextType.Consumer, null, (context) => (y(ContentContainer, { elTag: "div", elClasses: buildViewClassNames(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: undefined, customGenerator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount })))); } function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) { @@ -8531,6 +8703,17 @@ var FullCalendar = (function (exports) { */ function handleEventSources(inputs, context) { let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources); + if (unfoundSources.length === 1 && + inputs.length === 1 && + Array.isArray(unfoundSources[0]._raw) && + Array.isArray(inputs[0])) { + context.dispatch({ + type: 'RESET_RAW_EVENTS', + sourceId: unfoundSources[0].sourceId, + rawEvents: inputs[0], + }); + return; + } let newInputs = []; for (let input of inputs) { let inputFound = false; @@ -8668,7 +8851,6 @@ var FullCalendar = (function (exports) { // also, whatever is happening in constructor, have it happen in action queue too class CalendarDataManager { constructor(props) { - this.computeOptionsData = memoize(this._computeOptionsData); this.computeCurrentViewData = memoize(this._computeCurrentViewData); this.organizeRawLocales = memoize(organizeRawLocales); this.buildLocale = memoize(buildLocale); @@ -8691,6 +8873,8 @@ var FullCalendar = (function (exports) { this.currentViewOptionsInput = {}; this.currentViewOptionsRefined = {}; this.currentCalendarOptionsRefiners = {}; + this.optionsForRefining = []; + this.optionsForHandling = []; this.getCurrentData = () => this.data; this.dispatch = (action) => { this.actionRunner.request(action); // protects against recursive calls to _handleAction @@ -8753,13 +8937,20 @@ var FullCalendar = (function (exports) { this.updateData(); this.actionRunner.resume(); } - resetOptions(optionOverrides, append) { + resetOptions(optionOverrides, changedOptionNames) { let { props } = this; - props.optionOverrides = append - ? Object.assign(Object.assign({}, props.optionOverrides), optionOverrides) : optionOverrides; - this.actionRunner.request({ - type: 'NOTHING', - }); + if (changedOptionNames === undefined) { + props.optionOverrides = optionOverrides; + } + else { + props.optionOverrides = Object.assign(Object.assign({}, (props.optionOverrides || {})), optionOverrides); + this.optionsForRefining.push(...changedOptionNames); + } + if (changedOptionNames === undefined || changedOptionNames.length) { + this.actionRunner.request({ + type: 'NOTHING', + }); + } } _handleAction(action) { let { props, state, emitter } = this; @@ -8849,26 +9040,34 @@ var FullCalendar = (function (exports) { // hack state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data); state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv); + state.renderableEventStore = data.renderableEventStore = rezoneEventStoreDates(data.renderableEventStore, oldData.dateEnv, data.dateEnv); } for (let optionName in changeHandlers) { - if (oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) { + if (this.optionsForHandling.indexOf(optionName) !== -1 || + oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) { changeHandlers[optionName](newCalendarOptions[optionName], data); } } } + this.optionsForHandling = []; if (props.onData) { props.onData(data); } } - _computeOptionsData(optionOverrides, dynamicOptionOverrides, calendarApi) { + computeOptionsData(optionOverrides, dynamicOptionOverrides, calendarApi) { // TODO: blacklist options that are handled by optionChangeHandlers + if (!this.optionsForRefining.length && + optionOverrides === this.stableOptionOverrides && + dynamicOptionOverrides === this.stableDynamicOptionOverrides) { + return this.stableCalendarOptionsData; + } let { refinedOptions, pluginHooks, localeDefaults, availableLocaleData, extra, } = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides); warnUnknownOptions(extra); let dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator); - let viewSpecs = this.buildViewSpecs(pluginHooks.views, optionOverrides, dynamicOptionOverrides, localeDefaults); + let viewSpecs = this.buildViewSpecs(pluginHooks.views, this.stableOptionOverrides, this.stableDynamicOptionOverrides, localeDefaults); let theme = this.buildTheme(refinedOptions, pluginHooks); - let toolbarConfig = this.parseToolbars(refinedOptions, optionOverrides, theme, viewSpecs, calendarApi); - return { + let toolbarConfig = this.parseToolbars(refinedOptions, this.stableOptionOverrides, theme, viewSpecs, calendarApi); + return this.stableCalendarOptionsData = { calendarOptions: refinedOptions, pluginHooks, dateEnv, @@ -8903,26 +9102,27 @@ var FullCalendar = (function (exports) { let currentRefined = this.currentCalendarOptionsRefined; let anyChanges = false; for (let optionName in raw) { - if (optionName !== 'plugins') { // because plugins is special-cased - if (raw[optionName] === currentRaw[optionName] || - (COMPLEX_OPTION_COMPARATORS[optionName] && - (optionName in currentRaw) && - COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]))) { - refined[optionName] = currentRefined[optionName]; - } - else if (refiners[optionName]) { - refined[optionName] = refiners[optionName](raw[optionName]); - anyChanges = true; - } - else { - extra[optionName] = currentRaw[optionName]; - } + if (this.optionsForRefining.indexOf(optionName) === -1 && (raw[optionName] === currentRaw[optionName] || (COMPLEX_OPTION_COMPARATORS[optionName] && + (optionName in currentRaw) && + COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName])))) { + refined[optionName] = currentRefined[optionName]; + } + else if (refiners[optionName]) { + refined[optionName] = refiners[optionName](raw[optionName]); + anyChanges = true; + } + else { + extra[optionName] = currentRaw[optionName]; } } if (anyChanges) { this.currentCalendarOptionsInput = raw; this.currentCalendarOptionsRefined = refined; + this.stableOptionOverrides = optionOverrides; + this.stableDynamicOptionOverrides = dynamicOptionOverrides; } + this.optionsForHandling.push(...this.optionsForRefining); + this.optionsForRefining = []; return { rawOptions: this.currentCalendarOptionsInput, refinedOptions: this.currentCalendarOptionsRefined, @@ -8957,7 +9157,6 @@ var FullCalendar = (function (exports) { nowInput: refinedOptions.now, validRangeInput: refinedOptions.validRange, visibleRangeInput: refinedOptions.visibleRange, - monthMode: refinedOptions.monthMode, fixedWeekCount: refinedOptions.fixedWeekCount, }); let viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv); @@ -9095,7 +9294,7 @@ var FullCalendar = (function (exports) { class ToolbarSection extends BaseComponent { render() { let children = this.props.widgetGroups.map((widgetGroup) => this.renderWidgetGroup(widgetGroup)); - return h('div', { className: 'fc-toolbar-chunk' }, ...children); + return y('div', { className: 'fc-toolbar-chunk' }, ...children); } renderWidgetGroup(widgetGroup) { let { props } = this; @@ -9106,7 +9305,7 @@ var FullCalendar = (function (exports) { let { buttonName, buttonClick, buttonText, buttonIcon, buttonHint } = widget; if (buttonName === 'title') { isOnlyButtons = false; - children.push(h("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); + children.push(y("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); } else { let isPressed = buttonName === props.activeButton; @@ -9117,12 +9316,12 @@ var FullCalendar = (function (exports) { if (isPressed) { buttonClasses.push(theme.getClass('buttonActive')); } - children.push(h("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? h("span", { className: buttonIcon }) : ''))); + children.push(y("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? y("span", { className: buttonIcon }) : ''))); } } if (children.length > 1) { let groupClassName = (isOnlyButtons && theme.getClass('buttonGroup')) || ''; - return h('div', { className: groupClassName }, ...children); + return y('div', { className: groupClassName }, ...children); } return children[0]; } @@ -9155,19 +9354,18 @@ var FullCalendar = (function (exports) { 'fc-toolbar', forceLtr ? 'fc-toolbar-ltr' : '', ]; - return (h("div", { className: classNames.join(' ') }, + return (y("div", { className: classNames.join(' ') }, this.renderSection('start', startContent || []), this.renderSection('center', centerContent || []), this.renderSection('end', endContent || []))); } renderSection(key, widgetGroups) { let { props } = this; - return (h(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId })); + return (y(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId })); } } - // TODO: do function component? - class ViewContainer extends BaseComponent { + class ViewHarness extends BaseComponent { constructor() { super(...arguments); this.state = { @@ -9208,7 +9406,7 @@ var FullCalendar = (function (exports) { else { height = props.height || ''; } - return (h("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height, paddingBottom } }, props.children)); + return (y("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height, paddingBottom } }, props.children)); } componentDidMount() { this.context.addResizeHandler(this.handleResize); @@ -9309,8 +9507,8 @@ var FullCalendar = (function (exports) { this.buildViewContext = memoize(buildViewContext); this.buildViewPropTransformers = memoize(buildViewPropTransformers); this.buildToolbarProps = memoize(buildToolbarProps); - this.headerRef = y(); - this.footerRef = y(); + this.headerRef = d(); + this.footerRef = d(); this.interactionsStore = {}; // eslint-disable-next-line this.state = { @@ -9381,12 +9579,12 @@ var FullCalendar = (function (exports) { let viewLabelId = (toolbarConfig.header && toolbarConfig.header.hasTitle) ? this.state.viewLabelId : ''; - return (h(ViewContextType.Provider, { value: viewContext }, - toolbarConfig.header && (h(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))), - h(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, + return (y(ViewContextType.Provider, { value: viewContext }, + toolbarConfig.header && (y(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))), + y(ViewHarness, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, this.renderView(props), this.buildAppendContent()), - toolbarConfig.footer && (h(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))))); + toolbarConfig.footer && (y(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))))); } componentDidMount() { let { props } = this; @@ -9418,7 +9616,7 @@ var FullCalendar = (function (exports) { buildAppendContent() { let { props } = this; let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props)); - return h(p, {}, ...children); + return y(_, {}, ...children); } renderView(props) { let { pluginHooks } = props; @@ -9440,7 +9638,7 @@ var FullCalendar = (function (exports) { Object.assign(viewProps, transformer.transform(viewProps, props)); } let ViewComponent = viewSpec.component; - return (h(ViewComponent, Object.assign({}, viewProps))); + return (y(ViewComponent, Object.assign({}, viewProps))); } } function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) { @@ -9487,21 +9685,22 @@ var FullCalendar = (function (exports) { this.isRendered = true; let { currentData } = this; flushSync(() => { - P$1(h(CalendarRoot, { options: currentData.calendarOptions, theme: currentData.theme, emitter: currentData.emitter }, (classNames, height, isHeightAuto, forPrint) => { + D$1(y(CalendarRoot, { options: currentData.calendarOptions, theme: currentData.theme, emitter: currentData.emitter }, (classNames, height, isHeightAuto, forPrint) => { this.setClassNames(classNames); this.setHeight(height); - return (h(RenderId.Provider, { value: this.customContentRenderId }, - h(CalendarContent, Object.assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData)))); + return (y(RenderId.Provider, { value: this.customContentRenderId }, + y(CalendarContent, Object.assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData)))); }), this.el); }); } else if (this.isRendered) { this.isRendered = false; - P$1(null, this.el); + D$1(null, this.el); this.setClassNames([]); this.setHeight(''); } }; + ensureElHasStyles(el); this.el = el; this.renderRunner = new DelayedRunner(this.handleRenderRequest); new CalendarDataManager({ @@ -9546,8 +9745,8 @@ var FullCalendar = (function (exports) { resumeRendering() { this.renderRunner.resume('pauseRendering', true); } - resetOptions(optionOverrides, append) { - this.currentDataManager.resetOptions(optionOverrides, append); + resetOptions(optionOverrides, changedOptionNames) { + this.currentDataManager.resetOptions(optionOverrides, changedOptionNames); } setClassNames(classNames) { if (!isArraysEqual(classNames, this.currentClassNames)) { @@ -9607,7 +9806,7 @@ var FullCalendar = (function (exports) { return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg; } - const version = '6.0.3'; + const version = '6.1.8'; config.touchMouseIgnoreWait = 500; let ignoreMouseDepth = 0; @@ -9983,7 +10182,7 @@ var FullCalendar = (function (exports) { mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true // we don't want long taps or any mouse interaction causing selection/menus. // would use preventSelection(), but that prevents selectstart, causing problems. - mirrorEl.classList.add('fc-unselectable'); + mirrorEl.style.userSelect = 'none'; mirrorEl.classList.add('fc-event-dragging'); applyStyle(mirrorEl, { position: 'fixed', @@ -10273,7 +10472,7 @@ var FullCalendar = (function (exports) { els.push(query); } else { - els.push(...Array.prototype.slice.call(getElRoot(scrollStartEl).querySelectorAll(query))); + els.push(...Array.prototype.slice.call(scrollStartEl.getRootNode().querySelectorAll(query))); } } return els; @@ -10933,7 +11132,7 @@ var FullCalendar = (function (exports) { this.dragging.setMirrorNeedsRevert(!mutation); // render the mirror if no already-rendered mirror // TODO: wish we could somehow wait for dispatch to guarantee render - this.dragging.setMirrorIsVisible(!hit || !getElRoot(this.subjectEl).querySelector('.fc-event-mirror')); + this.dragging.setMirrorIsVisible(!hit || !this.subjectEl.getRootNode().querySelector('.fc-event-mirror')); // assign states based on new hit this.receivingContext = receivingContext; this.validMutation = mutation; @@ -11368,7 +11567,7 @@ var FullCalendar = (function (exports) { } } - const OPTION_REFINERS$2 = { + const OPTION_REFINERS$3 = { fixedMirrorParent: identity, }; const LISTENER_REFINERS = { @@ -11695,95 +11894,17 @@ var FullCalendar = (function (exports) { } } - var index$3 = createPlugin({ + var index$4 = createPlugin({ name: '@fullcalendar/interaction', componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing], calendarInteractions: [UnselectAuto], elementDraggingImpl: FeaturefulElementDragging, - optionRefiners: OPTION_REFINERS$2, + optionRefiners: OPTION_REFINERS$3, listenerRefiners: LISTENER_REFINERS, }); - /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. - ----------------------------------------------------------------------------------------------------------------------*/ - // It is a manager for a Table subcomponent, which does most of the heavy lifting. - // It is responsible for managing width/height. - class TableView extends DateComponent { - constructor() { - super(...arguments); - this.headerElRef = y(); - } - renderSimpleLayout(headerRowContent, bodyContent) { - let { props, context } = this; - let sections = []; - let stickyHeaderDates = getStickyHeaderDates(context.options); - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunk: { - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }, - }); - } - sections.push({ - type: 'body', - key: 'body', - liquid: true, - chunk: { content: bodyContent }, - }); - return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec }, - h(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections }))); - } - renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) { - let ScrollGrid = this.context.pluginHooks.scrollGridImpl; - if (!ScrollGrid) { - throw new Error('No ScrollGrid implementation'); - } - let { props, context } = this; - let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options); - let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options); - let sections = []; - if (headerRowContent) { - sections.push({ - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunks: [{ - key: 'main', - elRef: this.headerElRef, - tableClassName: 'fc-col-header', - rowContent: headerRowContent, - }], - }); - } - sections.push({ - type: 'body', - key: 'body', - liquid: true, - chunks: [{ - key: 'main', - content: bodyContent, - }], - }); - if (stickyFooterScrollbar) { - sections.push({ - type: 'footer', - key: 'footer', - isSticky: true, - chunks: [{ - key: 'main', - content: renderScrollShim, - }], - }); - } - return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec }, - h(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections }))); - } - } + var css_248z$3 = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-month-start{font-size:1.1em;font-weight:700}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:0 2px}.fc .fc-daygrid-day-bottom:after,.fc .fc-daygrid-day-bottom:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-more-link{border-radius:3px;cursor:pointer;line-height:1;margin-top:1px;max-width:100%;overflow:hidden;padding:2px;position:relative;white-space:nowrap;z-index:4}.fc .fc-daygrid-more-link:hover{background-color:rgba(0,0,0,.1)}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-more-link{float:left}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-more-link{float:right}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}"; + injectStyles(css_248z$3); function splitSegsByRow(segs, rowCnt) { let byRow = []; @@ -11846,7 +11967,7 @@ var FullCalendar = (function (exports) { class TableBlockEvent extends BaseComponent { render() { let { props } = this; - return (h(StandardEvent, Object.assign({}, props, { elClasses: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay }))); + return (y(StandardEvent, Object.assign({}, props, { elClasses: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay }))); } } @@ -11857,14 +11978,14 @@ var FullCalendar = (function (exports) { let { seg } = props; let timeFormat = options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT; let timeText = buildSegTimeText(seg, timeFormat, context, true, props.defaultDisplayEventEnd); - return (h(EventContainer, Object.assign({}, props, { elTag: "a", elClasses: ['fc-daygrid-event', 'fc-daygrid-dot-event'], elAttrs: getSegAnchorAttrs(props.seg, context), defaultGenerator: renderInnerContent$2, timeText: timeText, isResizing: false, isDateSelecting: false }))); + return (y(EventContainer, Object.assign({}, props, { elTag: "a", elClasses: ['fc-daygrid-event', 'fc-daygrid-dot-event'], elAttrs: getSegAnchorAttrs(props.seg, context), defaultGenerator: renderInnerContent$2, timeText: timeText, isResizing: false, isDateSelecting: false }))); } } function renderInnerContent$2(renderProps) { - return (h(p, null, - h("div", { className: "fc-daygrid-event-dot", style: { borderColor: renderProps.borderColor || renderProps.backgroundColor } }), - renderProps.timeText && (h("div", { className: "fc-event-time" }, renderProps.timeText)), - h("div", { className: "fc-event-title" }, renderProps.event.title || h(p, null, "\u00A0")))); + return (y(_, null, + y("div", { className: "fc-daygrid-event-dot", style: { borderColor: renderProps.borderColor || renderProps.backgroundColor } }), + renderProps.timeText && (y("div", { className: "fc-event-time" }, renderProps.timeText)), + y("div", { className: "fc-event-title" }, renderProps.event.title || y(_, null, "\u00A0")))); } class TableCellMoreLink extends BaseComponent { @@ -11875,15 +11996,15 @@ var FullCalendar = (function (exports) { render() { let { props } = this; let { allSegs, invisibleSegs } = this.compileSegs(props.singlePlacements); - return (h(MoreLinkContainer, { elClasses: ['fc-daygrid-more-link'], dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs: allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: () => { + return (y(MoreLinkContainer, { elClasses: ['fc-daygrid-more-link'], dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs: allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: () => { let isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) || (props.eventResize ? props.eventResize.affectedInstances : null) || {}; - return (h(p, null, allSegs.map((seg) => { + return (y(_, null, allSegs.map((seg) => { let instanceId = seg.eventRange.instance.instanceId; - return (h("div", { className: "fc-daygrid-event-harness", key: instanceId, style: { + return (y("div", { className: "fc-daygrid-event-harness", key: instanceId, style: { visibility: isForcedInvisible[instanceId] ? 'hidden' : '', - } }, hasListItemDisplay(seg) ? (h(TableListItemEvent, Object.assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))) : (h(TableBlockEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))))); + } }, hasListItemDisplay(seg) ? (y(TableListItemEvent, Object.assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))) : (y(TableBlockEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))))); }))); } })); } @@ -11904,7 +12025,7 @@ var FullCalendar = (function (exports) { class TableCell extends DateComponent { constructor() { super(...arguments); - this.rootElRef = y(); + this.rootElRef = d(); this.state = { dayNumberId: getUniqueDomId(), }; @@ -11915,25 +12036,49 @@ var FullCalendar = (function (exports) { } render() { let { context, props, state, rootElRef } = this; - let { options } = context; + let { options, dateEnv } = context; let { date, dateProfile } = props; - return (h(DayCellContainer, { elTag: "td", elRef: this.handleRootEl, elClasses: [ + // TODO: memoize this? + const isMonthStart = props.showDayNumber && + shouldDisplayMonthStart(date, dateProfile.currentRange, dateEnv); + return (y(DayCellContainer, { elTag: "td", elRef: this.handleRootEl, elClasses: [ 'fc-daygrid-day', ...(props.extraClassNames || []), - ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.extraDataAttrs), (props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {})), { role: 'gridcell' }), defaultGenerator: renderTopInner, date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraRenderProps: props.extraRenderProps }, (InnerContent, renderProps) => (h("div", { className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref: props.innerElRef }, - props.showWeekNumber && (h(WeekNumberContainer, { elTag: "a", elClasses: ['fc-daygrid-week-number'], elAttrs: buildNavLinkAttrs(context, date, 'week'), date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT$1 })), - Boolean(!renderProps.isDisabled && - (props.showDayNumber || hasCustomDayCellContent(options) || props.forceDayTop)) && (h("div", { className: "fc-daygrid-day-top" }, - h(InnerContent, { elTag: "a", elClasses: ['fc-daygrid-day-number'], elAttrs: Object.assign(Object.assign({}, buildNavLinkAttrs(context, date)), { id: state.dayNumberId }) }))), - h("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, + ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.extraDataAttrs), (props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {})), { role: 'gridcell' }), defaultGenerator: renderTopInner, date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, isMonthStart: isMonthStart, extraRenderProps: props.extraRenderProps }, (InnerContent, renderProps) => (y("div", { ref: props.innerElRef, className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", style: { minHeight: props.minHeight } }, + props.showWeekNumber && (y(WeekNumberContainer, { elTag: "a", elClasses: ['fc-daygrid-week-number'], elAttrs: buildNavLinkAttrs(context, date, 'week'), date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT$1 })), + !renderProps.isDisabled && + (props.showDayNumber || hasCustomDayCellContent(options) || props.forceDayTop) ? (y("div", { className: "fc-daygrid-day-top" }, + y(InnerContent, { elTag: "a", elClasses: [ + 'fc-daygrid-day-number', + isMonthStart && 'fc-daygrid-month-start', + ], elAttrs: Object.assign(Object.assign({}, buildNavLinkAttrs(context, date)), { id: state.dayNumberId }) }))) : props.showDayNumber ? ( + // for creating correct amount of space (see issue #7162) + y("div", { className: "fc-daygrid-day-top", style: { visibility: 'hidden' } }, + y("a", { className: "fc-daygrid-day-number" }, "\u00A0"))) : undefined, + y("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, props.fgContent, - h("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, - h(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))), - h("div", { className: "fc-daygrid-day-bg" }, props.bgContent))))); + y("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, + y(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))), + y("div", { className: "fc-daygrid-day-bg" }, props.bgContent))))); } } function renderTopInner(props) { - return props.dayNumberText || h(p, null, "\u00A0"); + return props.dayNumberText || y(_, null, "\u00A0"); + } + function shouldDisplayMonthStart(date, currentRange, dateEnv) { + const { start: currentStart, end: currentEnd } = currentRange; + const currentEndIncl = addMs(currentEnd, -1); + const currentFirstYear = dateEnv.getYear(currentStart); + const currentFirstMonth = dateEnv.getMonth(currentStart); + const currentLastYear = dateEnv.getYear(currentEndIncl); + const currentLastMonth = dateEnv.getMonth(currentEndIncl); + // spans more than one month? + return !(currentFirstYear === currentLastYear && currentFirstMonth === currentLastMonth) && + Boolean( + // first date in current view? + date.valueOf() === currentStart.valueOf() || + // a month-start that's within the current range? + (dateEnv.getDay(date) === 1 && date.valueOf() < currentEnd.valueOf())); } function computeFgSegPlacement(segs, // assumed already sorted @@ -12168,7 +12313,7 @@ var FullCalendar = (function (exports) { this.frameElRefs = new RefMap(); // the fc-daygrid-day-frame this.fgElRefs = new RefMap(); // the fc-daygrid-day-events this.segHarnessRefs = new RefMap(); // indexed by "instanceId:firstCol" - this.rootElRef = y(); + this.rootElRef = d(); this.state = { framePositions: null, maxContentHeight: null, @@ -12193,19 +12338,19 @@ var FullCalendar = (function (exports) { (props.eventDrag && props.eventDrag.affectedInstances) || (props.eventResize && props.eventResize.affectedInstances) || {}; - return (h("tr", { ref: this.rootElRef, role: "row" }, + return (y("tr", { ref: this.rootElRef, role: "row" }, props.renderIntro && props.renderIntro(), props.cells.map((cell, col) => { let normalFgNodes = this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible); let mirrorFgNodes = this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); - return (h(TableCell, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), innerElRef: this.frameElRefs.createRef(cell.key) /* FF <td> problem, but okay to use for left/right. TODO: rename prop */, dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers /* even displaying weeknum for row, not necessarily day */, todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: this.fgElRefs.createRef(cell.key), fgContent: ( // Fragment scopes the keys - h(p, null, - h(p, null, normalFgNodes), - h(p, null, mirrorFgNodes))), bgContent: ( // Fragment scopes the keys - h(p, null, + return (y(TableCell, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), innerElRef: this.frameElRefs.createRef(cell.key) /* FF <td> problem, but okay to use for left/right. TODO: rename prop */, dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers /* even displaying weeknum for row, not necessarily day */, todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: this.fgElRefs.createRef(cell.key), fgContent: ( // Fragment scopes the keys + y(_, null, + y(_, null, normalFgNodes), + y(_, null, mirrorFgNodes))), bgContent: ( // Fragment scopes the keys + y(_, null, this.renderFillSegs(highlightSegsByCol[col], 'highlight'), this.renderFillSegs(businessHoursByCol[col], 'non-business'), - this.renderFillSegs(bgEventSegsByCol[col], 'bg-event'))) })); + this.renderFillSegs(bgEventSegsByCol[col], 'bg-event'))), minHeight: props.cellMinHeight })); }))); } componentDidMount() { @@ -12266,13 +12411,13 @@ var FullCalendar = (function (exports) { known bug: events that are force to be list-item but span multiple days still take up space in later columns todo: in print view, for multi-day events, don't display title within non-start/end segs */ - nodes.push(h("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: { + nodes.push(y("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: { visibility: isVisible ? '' : 'hidden', marginTop: isAbsolute ? '' : placement.marginTop, top: isAbsolute ? placement.absoluteTop : '', left, right, - } }, hasListItemDisplay(seg) ? (h(TableListItemEvent, Object.assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))) : (h(TableBlockEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))))); + } }, hasListItemDisplay(seg) ? (y(TableListItemEvent, Object.assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))) : (y(TableBlockEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))))); } } return nodes; @@ -12291,12 +12436,12 @@ var FullCalendar = (function (exports) { left: 0, right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol], }; - nodes.push(h("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === 'bg-event' ? - h(BgEvent, Object.assign({ seg: seg }, getSegMeta(seg, todayRange))) : + nodes.push(y("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === 'bg-event' ? + y(BgEvent, Object.assign({ seg: seg }, getSegMeta(seg, todayRange))) : renderFill(fillType))); } } - return h(p, {}, ...nodes); + return y(_, {}, ...nodes); } updateSizing(isExternalSizingChange) { let { props, state, frameElRefs } = this; @@ -12377,7 +12522,7 @@ var FullCalendar = (function (exports) { return topsByInstanceId; } - class Table extends DateComponent { + class TableRows extends DateComponent { constructor() { super(...arguments); this.splitBusinessHourSegs = memoize(splitSegsByRow); @@ -12387,22 +12532,9 @@ var FullCalendar = (function (exports) { this.splitEventDrag = memoize(splitInteractionByRow); this.splitEventResize = memoize(splitInteractionByRow); this.rowRefs = new RefMap(); - this.handleRootEl = (rootEl) => { - this.rootEl = rootEl; - if (rootEl) { - this.context.registerInteractiveComponent(this, { - el: rootEl, - isHitComboAllowed: this.props.isHitComboAllowed, - }); - } - else { - this.context.unregisterInteractiveComponent(this); - } - }; } render() { - let { props } = this; - let { dateProfile, dayMaxEventRows, dayMaxEvents, expandRows } = props; + let { props, context } = this; let rowCnt = props.cells.length; let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt); let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt); @@ -12410,36 +12542,33 @@ var FullCalendar = (function (exports) { let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt); let eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt); let eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt); - let limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; - // if rows can't expand to fill fixed height, can't do balanced-height event limit - // TODO: best place to normalize these options? - if (limitViaBalanced && !expandRows) { - limitViaBalanced = false; - dayMaxEventRows = null; - dayMaxEvents = null; + // for DayGrid view with many rows, force a min-height on cells so doesn't appear squished + // choose 7 because a month view will have max 6 rows + let cellMinHeight = (rowCnt >= 7 && props.clientWidth) ? + props.clientWidth / context.options.aspectRatio / 6 : + null; + return (y(NowTimer, { unit: "day" }, (nowDate, todayRange) => (y(_, null, props.cells.map((cells, row) => (y(TableRow, { ref: this.rowRefs.createRef(row), key: cells.length + ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */ + : row // in case there are no cells (like when resource view is loading) + , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: props.dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, cellMinHeight: cellMinHeight, forPrint: props.forPrint }))))))); + } + componentDidMount() { + // HACK: need a daygrid wrapper parent to do positioning + // NOTE: a daygrid resource view w/o resources can have zero cells + const firstCellEl = this.rowRefs.currentMap[0].getCellEls()[0]; + this.rootEl = firstCellEl ? firstCellEl.closest('.fc-daygrid-body') : null; + if (this.rootEl) { + this.context.registerInteractiveComponent(this, { + el: this.rootEl, + isHitComboAllowed: this.props.isHitComboAllowed, + }); + } + } + componentWillUnmount() { + if (this.rootEl) { + this.context.unregisterInteractiveComponent(this); + this.rootEl = null; } - let classNames = [ - 'fc-daygrid-body', - limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced', - expandRows ? '' : 'fc-daygrid-body-natural', // will height of one row depend on the others? - ]; - return (h("div", { className: classNames.join(' '), ref: this.handleRootEl, style: { - // these props are important to give this wrapper correct dimensions for interactions - // TODO: if we set it here, can we avoid giving to inner tables? - width: props.clientWidth, - minWidth: props.tableMinWidth, - } }, - h(NowTimer, { unit: "day" }, (nowDate, todayRange) => (h(p, null, - h("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: { - width: props.clientWidth, - minWidth: props.tableMinWidth, - height: expandRows ? props.clientHeight : '', - } }, - props.colGroupNode, - h("tbody", { role: "presentation" }, props.cells.map((cells, row) => (h(TableRow, { ref: this.rowRefs.createRef(row), key: cells.length - ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */ - : row // in case there are no cells (like when resource view is loading) - , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint })))))))))); } // Hit System // ---------------------------------------------------------------------------------------------------- @@ -12484,6 +12613,87 @@ var FullCalendar = (function (exports) { return seg.eventRange.def.allDay; } + class Table extends DateComponent { + constructor() { + super(...arguments); + this.elRef = d(); + this.needsScrollReset = false; + } + render() { + let { props } = this; + let { dayMaxEventRows, dayMaxEvents, expandRows } = props; + let limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; + // if rows can't expand to fill fixed height, can't do balanced-height event limit + // TODO: best place to normalize these options? + if (limitViaBalanced && !expandRows) { + limitViaBalanced = false; + dayMaxEventRows = null; + dayMaxEvents = null; + } + let classNames = [ + 'fc-daygrid-body', + limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced', + expandRows ? '' : 'fc-daygrid-body-natural', // will height of one row depend on the others? + ]; + return (y("div", { ref: this.elRef, className: classNames.join(' '), style: { + // these props are important to give this wrapper correct dimensions for interactions + // TODO: if we set it here, can we avoid giving to inner tables? + width: props.clientWidth, + minWidth: props.tableMinWidth, + } }, + y("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: { + width: props.clientWidth, + minWidth: props.tableMinWidth, + height: expandRows ? props.clientHeight : '', + } }, + props.colGroupNode, + y("tbody", { role: "presentation" }, + y(TableRows, { dateProfile: props.dateProfile, cells: props.cells, renderRowIntro: props.renderRowIntro, showWeekNumbers: props.showWeekNumbers, clientWidth: props.clientWidth, clientHeight: props.clientHeight, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, forPrint: props.forPrint, isHitComboAllowed: props.isHitComboAllowed }))))); + } + componentDidMount() { + this.requestScrollReset(); + } + componentDidUpdate(prevProps) { + if (prevProps.dateProfile !== this.props.dateProfile) { + this.requestScrollReset(); + } + else { + this.flushScrollReset(); + } + } + requestScrollReset() { + this.needsScrollReset = true; + this.flushScrollReset(); + } + flushScrollReset() { + if (this.needsScrollReset && + this.props.clientWidth // sizes computed? + ) { + const subjectEl = getScrollSubjectEl(this.elRef.current, this.props.dateProfile); + if (subjectEl) { + const originEl = subjectEl.closest('.fc-daygrid-body'); + const scrollEl = originEl.closest('.fc-scroller'); + const scrollTop = subjectEl.getBoundingClientRect().top - + originEl.getBoundingClientRect().top; + scrollEl.scrollTop = scrollTop ? (scrollTop + 1) : 0; // overcome border + } + this.needsScrollReset = false; + } + } + } + function getScrollSubjectEl(containerEl, dateProfile) { + let el; + if (dateProfile.currentRangeUnit.match(/year|month/)) { + el = containerEl.querySelector(`[data-date="${formatIsoMonthStr(dateProfile.currentDate)}-01"]`); + // even if view is month-based, first-of-month might be hidden... + } + if (!el) { + el = containerEl.querySelector(`[data-date="${formatDayString(dateProfile.currentDate)}"]`); + // could still be hidden if an interior-view hidden day + } + return el; + } + class DayTableSlicer extends Slicer { constructor() { super(...arguments); @@ -12498,11 +12708,130 @@ var FullCalendar = (function (exports) { constructor() { super(...arguments); this.slicer = new DayTableSlicer(); - this.tableRef = y(); + this.tableRef = d(); } render() { let { props, context } = this; - return (h(Table, Object.assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint }))); + return (y(Table, Object.assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint }))); + } + } + + class TableDateProfileGenerator extends DateProfileGenerator { + // Computes the date range that will be rendered + buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) { + let renderRange = super.buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay); + let { props } = this; + return buildDayTableRenderRange({ + currentRange: renderRange, + snapToWeek: /^(year|month)$/.test(currentRangeUnit), + fixedWeekCount: props.fixedWeekCount, + dateEnv: props.dateEnv, + }); + } + } + function buildDayTableRenderRange(props) { + let { dateEnv, currentRange } = props; + let { start, end } = currentRange; + let endOfWeek; + // year and month views should be aligned with weeks. this is already done for week + if (props.snapToWeek) { + start = dateEnv.startOfWeek(start); + // make end-of-week if not already + endOfWeek = dateEnv.startOfWeek(end); + if (endOfWeek.valueOf() !== end.valueOf()) { + end = addWeeks(endOfWeek, 1); + } + } + // ensure 6 weeks + if (props.fixedWeekCount) { + // TODO: instead of these date-math gymnastics (for multimonth view), + // compute dateprofiles of all months, then use start of first and end of last. + let lastMonthRenderStart = dateEnv.startOfWeek(dateEnv.startOfMonth(addDays(currentRange.end, -1))); + let rowCnt = Math.ceil(// could be partial weeks due to hiddenDays + diffWeeks(lastMonthRenderStart, end)); + end = addWeeks(end, 6 - rowCnt); + } + return { start, end }; + } + + /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. + ----------------------------------------------------------------------------------------------------------------------*/ + // It is a manager for a Table subcomponent, which does most of the heavy lifting. + // It is responsible for managing width/height. + class TableView extends DateComponent { + constructor() { + super(...arguments); + this.headerElRef = d(); + } + renderSimpleLayout(headerRowContent, bodyContent) { + let { props, context } = this; + let sections = []; + let stickyHeaderDates = getStickyHeaderDates(context.options); + if (headerRowContent) { + sections.push({ + type: 'header', + key: 'header', + isSticky: stickyHeaderDates, + chunk: { + elRef: this.headerElRef, + tableClassName: 'fc-col-header', + rowContent: headerRowContent, + }, + }); + } + sections.push({ + type: 'body', + key: 'body', + liquid: true, + chunk: { content: bodyContent }, + }); + return (y(ViewContainer, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec }, + y(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections }))); + } + renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) { + let ScrollGrid = this.context.pluginHooks.scrollGridImpl; + if (!ScrollGrid) { + throw new Error('No ScrollGrid implementation'); + } + let { props, context } = this; + let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options); + let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options); + let sections = []; + if (headerRowContent) { + sections.push({ + type: 'header', + key: 'header', + isSticky: stickyHeaderDates, + chunks: [{ + key: 'main', + elRef: this.headerElRef, + tableClassName: 'fc-col-header', + rowContent: headerRowContent, + }], + }); + } + sections.push({ + type: 'body', + key: 'body', + liquid: true, + chunks: [{ + key: 'main', + content: bodyContent, + }], + }); + if (stickyFooterScrollbar) { + sections.push({ + type: 'footer', + key: 'footer', + isSticky: true, + chunks: [{ + key: 'main', + content: renderScrollShim, + }], + }); + } + return (y(ViewContainer, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec }, + y(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, forPrint: props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections }))); } } @@ -12510,15 +12839,16 @@ var FullCalendar = (function (exports) { constructor() { super(...arguments); this.buildDayTableModel = memoize(buildDayTableModel); - this.headerRef = y(); - this.tableRef = y(); + this.headerRef = d(); + this.tableRef = d(); + // can't override any lifecycle methods from parent } render() { let { options, dateProfileGenerator } = this.context; let { props } = this; let dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator); - let headerContent = options.dayHeaders && (h(DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 })); - let bodyContent = (contentArg) => (h(DayTable, { ref: this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint })); + let headerContent = options.dayHeaders && (y(DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 })); + let bodyContent = (contentArg) => (y(DayTable, { ref: this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint })); return options.dayMinWidth ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth) : this.renderSimpleLayout(headerContent, bodyContent); @@ -12529,38 +12859,7 @@ var FullCalendar = (function (exports) { return new DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); } - class TableDateProfileGenerator extends DateProfileGenerator { - // Computes the date range that will be rendered. - buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) { - let { dateEnv } = this.props; - let renderRange = super.buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay); - let start = renderRange.start; - let end = renderRange.end; - let endOfWeek; - // year and month views should be aligned with weeks. this is already done for week - if (/^(year|month)$/.test(currentRangeUnit)) { - start = dateEnv.startOfWeek(start); - // make end-of-week if not already - endOfWeek = dateEnv.startOfWeek(end); - if (endOfWeek.valueOf() !== end.valueOf()) { - end = addWeeks(endOfWeek, 1); - } - } - // ensure 6 weeks - if (this.props.monthMode && - this.props.fixedWeekCount) { - let rowCnt = Math.ceil(// could be partial weeks due to hiddenDays - diffWeeks(start, end)); - end = addWeeks(end, 6 - rowCnt); - } - return { start, end }; - } - } - - var css_248z$2 = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}"; - injectStyles(css_248z$2); - - var index$2 = createPlugin({ + var index$3 = createPlugin({ name: '@fullcalendar/daygrid', initialView: 'dayGridMonth', views: { @@ -12579,12 +12878,18 @@ var FullCalendar = (function (exports) { dayGridMonth: { type: 'dayGrid', duration: { months: 1 }, - monthMode: true, fixedWeekCount: true, }, + dayGridYear: { + type: 'dayGrid', + duration: { years: 1 }, + }, }, }); + var css_248z$2 = ".fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:\"\\00a0\"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:\"\\00a0-\\00a0\"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}"; + injectStyles(css_248z$2); + class AllDaySplitter extends Splitter { getKeyInfo() { return { @@ -12621,9 +12926,9 @@ var FullCalendar = (function (exports) { 'fc-timegrid-slot-label', props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor', ]; - return (h(ViewContextType.Consumer, null, (context) => { + return (y(ViewContextType.Consumer, null, (context) => { if (!props.isLabeled) { - return (h("td", { className: classNames.join(' '), "data-time": props.isoTimeStr })); + return (y("td", { className: classNames.join(' '), "data-time": props.isoTimeStr })); } let { dateEnv, options, viewApi } = context; let labelFormat = // TODO: fully pre-parse @@ -12637,10 +12942,10 @@ var FullCalendar = (function (exports) { view: viewApi, text: dateEnv.format(props.date, labelFormat), }; - return (h(ContentContainer, { elTag: "td", elClasses: classNames, elAttrs: { + return (y(ContentContainer, { elTag: "td", elClasses: classNames, elAttrs: { 'data-time': props.isoTimeStr, - }, renderProps: renderProps, generatorName: "slotLabelContent", generator: options.slotLabelContent || renderInnerContent$1, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (h("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, - h(InnerContent, { elTag: "div", elClasses: [ + }, renderProps: renderProps, generatorName: "slotLabelContent", customGenerator: options.slotLabelContent, defaultGenerator: renderInnerContent$1, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (y("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, + y(InnerContent, { elTag: "div", elClasses: [ 'fc-timegrid-slot-label-cushion', 'fc-scrollgrid-shrink-cushion', ] }))))); @@ -12652,8 +12957,8 @@ var FullCalendar = (function (exports) { class TimeBodyAxis extends BaseComponent { render() { - return this.props.slatMetas.map((slatMeta) => (h("tr", { key: slatMeta.key }, - h(TimeColsAxisCell, Object.assign({}, slatMeta))))); + return this.props.slatMetas.map((slatMeta) => (y("tr", { key: slatMeta.key }, + y(TimeColsAxisCell, Object.assign({}, slatMeta))))); } } @@ -12663,9 +12968,9 @@ var FullCalendar = (function (exports) { constructor() { super(...arguments); this.allDaySplitter = new AllDaySplitter(); // for use by subclasses - this.headerElRef = y(); - this.rootElRef = y(); - this.scrollerElRef = y(); + this.headerElRef = d(); + this.rootElRef = d(); + this.scrollerElRef = d(); this.state = { slatCoords: null, }; @@ -12687,24 +12992,24 @@ var FullCalendar = (function (exports) { ? buildNavLinkAttrs(this.context, range.start, 'week') : {}; if (options.weekNumbers && rowKey === 'day') { - return (h(WeekNumberContainer, { elTag: "th", elClasses: [ + return (y(WeekNumberContainer, { elTag: "th", elClasses: [ 'fc-timegrid-axis', 'fc-scrollgrid-shrink', ], elAttrs: { 'aria-hidden': true, - }, date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, (InnerContent) => (h("div", { className: [ + }, date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, (InnerContent) => (y("div", { className: [ 'fc-timegrid-axis-frame', 'fc-scrollgrid-shrink-frame', 'fc-timegrid-axis-frame-liquid', ].join(' '), style: { height: frameHeight } }, - h(InnerContent, { elTag: "a", elClasses: [ + y(InnerContent, { elTag: "a", elClasses: [ 'fc-timegrid-axis-cushion', 'fc-scrollgrid-shrink-cushion', 'fc-scrollgrid-sync-inner', ], elAttrs: navLinkAttrs }))))); } - return (h("th", { "aria-hidden": true, className: "fc-timegrid-axis" }, - h("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } }))); + return (y("th", { "aria-hidden": true, className: "fc-timegrid-axis" }, + y("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } }))); }; /* Table Component Render Methods ------------------------------------------------------------------------------------------------------------------*/ @@ -12718,17 +13023,17 @@ var FullCalendar = (function (exports) { }; return ( // TODO: make reusable hook. used in list view too - h(ContentContainer, { elTag: "td", elClasses: [ + y(ContentContainer, { elTag: "td", elClasses: [ 'fc-timegrid-axis', 'fc-scrollgrid-shrink', ], elAttrs: { 'aria-hidden': true, - }, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner$1, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, (InnerContent) => (h("div", { className: [ + }, renderProps: renderProps, generatorName: "allDayContent", customGenerator: options.allDayContent, defaultGenerator: renderAllDayInner$1, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, (InnerContent) => (y("div", { className: [ 'fc-timegrid-axis-frame', 'fc-scrollgrid-shrink-frame', rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : '', ].join(' '), style: { height: rowHeight } }, - h(InnerContent, { elTag: "span", elClasses: [ + y(InnerContent, { elTag: "span", elClasses: [ 'fc-timegrid-axis-cushion', 'fc-scrollgrid-shrink-cushion', 'fc-scrollgrid-sync-inner', @@ -12766,8 +13071,8 @@ var FullCalendar = (function (exports) { type: 'body', key: 'all-day-divider', outerContent: ( // TODO: rename to cellContent so don't need to define <tr>? - h("tr", { role: "presentation", className: "fc-scrollgrid-section" }, - h("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), + y("tr", { role: "presentation", className: "fc-scrollgrid-section" }, + y("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), }); } sections.push({ @@ -12780,8 +13085,8 @@ var FullCalendar = (function (exports) { content: timeContent, }, }); - return (h(ViewContainer$1, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec }, - h(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: 'shrink' }], sections: sections }))); + return (y(ViewContainer, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec }, + y(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: 'shrink' }], sections: sections }))); } renderHScrollLayout(headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) { let ScrollGrid = this.context.pluginHooks.scrollGridImpl; @@ -12801,7 +13106,7 @@ var FullCalendar = (function (exports) { chunks: [ { key: 'axis', - rowContent: (arg) => (h("tr", { role: "presentation" }, this.renderHeadAxis('day', arg.rowSyncHeights[0]))), + rowContent: (arg) => (y("tr", { role: "presentation" }, this.renderHeadAxis('day', arg.rowSyncHeights[0]))), }, { key: 'cols', @@ -12820,7 +13125,7 @@ var FullCalendar = (function (exports) { chunks: [ { key: 'axis', - rowContent: (contentArg) => (h("tr", { role: "presentation" }, this.renderTableRowAxis(contentArg.rowSyncHeights[0]))), + rowContent: (contentArg) => (y("tr", { role: "presentation" }, this.renderTableRowAxis(contentArg.rowSyncHeights[0]))), }, { key: 'cols', @@ -12832,8 +13137,8 @@ var FullCalendar = (function (exports) { key: 'all-day-divider', type: 'body', outerContent: ( // TODO: rename to cellContent so don't need to define <tr>? - h("tr", { role: "presentation", className: "fc-scrollgrid-section" }, - h("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), + y("tr", { role: "presentation", className: "fc-scrollgrid-section" }, + y("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), }); } let isNowIndicator = context.options.nowIndicator; @@ -12847,18 +13152,18 @@ var FullCalendar = (function (exports) { key: 'axis', content: (arg) => ( // TODO: make this now-indicator arrow more DRY with TimeColsContent - h("div", { className: "fc-timegrid-axis-chunk" }, - h("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } }, + y("div", { className: "fc-timegrid-axis-chunk" }, + y("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } }, arg.tableColGroupNode, - h("tbody", null, - h(TimeBodyAxis, { slatMetas: slatMetas }))), - h("div", { className: "fc-timegrid-now-indicator-container" }, - h(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, (nowDate) => { + y("tbody", null, + y(TimeBodyAxis, { slatMetas: slatMetas }))), + y("div", { className: "fc-timegrid-now-indicator-container" }, + y(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, (nowDate) => { let nowIndicatorTop = isNowIndicator && slatCoords && slatCoords.safeComputeTop(nowDate); // might return void if (typeof nowIndicatorTop === 'number') { - return (h(NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: nowDate })); + return (y(NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: nowDate })); } return null; })))), @@ -12887,8 +13192,8 @@ var FullCalendar = (function (exports) { ], }); } - return (h(ViewContainer$1, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec }, - h(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [ + return (y(ViewContainer, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec }, + y(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, forPrint: props.forPrint, collapsibleWidth: false, colGroups: [ { width: 'shrink', cols: [{ width: 'shrink' }] }, { cols: [{ span: colCnt, minWidth: dayMinWidth }] }, ], sections: sections }))); @@ -12966,21 +13271,21 @@ var FullCalendar = (function (exports) { let { props, context } = this; let { options } = context; let { slatElRefs } = props; - return (h("tbody", null, props.slatMetas.map((slatMeta, i) => { + return (y("tbody", null, props.slatMetas.map((slatMeta, i) => { let renderProps = { time: slatMeta.time, date: context.dateEnv.toDate(slatMeta.date), view: context.viewApi, }; - return (h("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) }, - props.axis && (h(TimeColsAxisCell, Object.assign({}, slatMeta))), - h(ContentContainer, { elTag: "td", elClasses: [ + return (y("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) }, + props.axis && (y(TimeColsAxisCell, Object.assign({}, slatMeta))), + y(ContentContainer, { elTag: "td", elClasses: [ 'fc-timegrid-slot', 'fc-timegrid-slot-lane', !slatMeta.isLabeled && 'fc-timegrid-slot-minor', ], elAttrs: { 'data-time': slatMeta.isoTimeStr, - }, renderProps: renderProps, generatorName: "slotLaneContent", generator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }))); + }, renderProps: renderProps, generatorName: "slotLaneContent", customGenerator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }))); }))); } } @@ -12991,19 +13296,19 @@ var FullCalendar = (function (exports) { class TimeColsSlats extends BaseComponent { constructor() { super(...arguments); - this.rootElRef = y(); + this.rootElRef = d(); this.slatElRefs = new RefMap(); } render() { let { props, context } = this; - return (h("div", { ref: this.rootElRef, className: "fc-timegrid-slots" }, - h("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { + return (y("div", { ref: this.rootElRef, className: "fc-timegrid-slots" }, + y("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { minWidth: props.tableMinWidth, width: props.clientWidth, height: props.minHeight, } }, props.tableColGroupNode /* relies on there only being a single <col> for the axis */, - h(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas })))); + y(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas })))); } componentDidMount() { this.updateSizing(); @@ -13070,10 +13375,10 @@ var FullCalendar = (function (exports) { class TimeColMoreLink extends BaseComponent { render() { let { props } = this; - return (h(MoreLinkContainer, { elClasses: ['fc-timegrid-more-link'], elStyle: { + return (y(MoreLinkContainer, { elClasses: ['fc-timegrid-more-link'], elStyle: { top: props.top, bottom: props.bottom, - }, allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: () => renderPlainFgSegs(props.hiddenSegs, props), defaultGenerator: renderMoreLinkInner }, (InnerContent) => (h(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-more-link-inner', 'fc-sticky'] })))); + }, allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: () => renderPlainFgSegs(props.hiddenSegs, props), defaultGenerator: renderMoreLinkInner, forceTimed: true }, (InnerContent) => (y(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-more-link-inner', 'fc-sticky'] })))); } } function renderMoreLinkInner(props) { @@ -13272,7 +13577,7 @@ var FullCalendar = (function (exports) { }); class TimeColEvent extends BaseComponent { render() { - return (h(StandardEvent, Object.assign({}, this.props, { elClasses: [ + return (y(StandardEvent, Object.assign({}, this.props, { elClasses: [ 'fc-timegrid-event', 'fc-v-event', this.props.isShort && 'fc-timegrid-event-short', @@ -13300,34 +13605,34 @@ var FullCalendar = (function (exports) { (props.eventResize && props.eventResize.affectedInstances) || {}; let sortedFgSegs = this.sortEventSegs(props.fgEventSegs, options.eventOrder); - return (h(DayCellContainer, { elTag: "td", elRef: props.elRef, elClasses: [ + return (y(DayCellContainer, { elTag: "td", elRef: props.elRef, elClasses: [ 'fc-timegrid-col', ...(props.extraClassNames || []), - ], elAttrs: Object.assign({ role: 'gridcell' }, props.extraDataAttrs), date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraRenderProps: props.extraRenderProps }, (InnerContent) => (h("div", { className: "fc-timegrid-col-frame" }, - h("div", { className: "fc-timegrid-col-bg" }, + ], elAttrs: Object.assign({ role: 'gridcell' }, props.extraDataAttrs), date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraRenderProps: props.extraRenderProps }, (InnerContent) => (y("div", { className: "fc-timegrid-col-frame" }, + y("div", { className: "fc-timegrid-col-bg" }, this.renderFillSegs(props.businessHourSegs, 'non-business'), this.renderFillSegs(props.bgEventSegs, 'bg-event'), this.renderFillSegs(props.dateSelectionSegs, 'highlight')), - h("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)), - h("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror))), - h("div", { className: "fc-timegrid-now-indicator-container" }, this.renderNowIndicator(props.nowIndicatorSegs)), - hasCustomDayCellContent(options) && (h(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-col-misc'] })))))); + y("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)), + y("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror), 'mirror')), + y("div", { className: "fc-timegrid-now-indicator-container" }, this.renderNowIndicator(props.nowIndicatorSegs)), + hasCustomDayCellContent(options) && (y(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-col-misc'] })))))); } - renderFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting) { + renderFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey) { let { props } = this; if (props.forPrint) { return renderPlainFgSegs(sortedFgSegs, props); } - return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting); + return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey); } renderPositionedFgSegs(segs, // if not mirror, needs to be sorted - segIsInvisible, isDragging, isResizing, isDateSelecting) { + segIsInvisible, isDragging, isResizing, isDateSelecting, forcedKey) { let { eventMaxStack, eventShortHeight, eventOrderStrict, eventMinHeight } = this.context.options; let { date, slatCoords, eventSelection, todayRange, nowDate } = this.props; let isMirror = isDragging || isResizing || isDateSelecting; let segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight); let { segPlacements, hiddenGroups } = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack); - return (h(p, null, + return (y(_, null, this.renderHiddenGroups(hiddenGroups, segs), segPlacements.map((segPlacement) => { let { seg, rect } = segPlacement; @@ -13337,18 +13642,18 @@ var FullCalendar = (function (exports) { let hStyle = (!isMirror && rect) ? this.computeSegHStyle(rect) : { left: 0, right: 0 }; let isInset = Boolean(rect) && rect.stackForward > 0; let isShort = Boolean(rect) && (rect.span.end - rect.span.start) < eventShortHeight; // look at other places for this problem - return (h("div", { className: 'fc-timegrid-event-harness' + - (isInset ? ' fc-timegrid-event-harness-inset' : ''), key: instanceId, style: Object.assign(Object.assign({ visibility: isVisible ? '' : 'hidden' }, vStyle), hStyle) }, - h(TimeColEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, isShort: isShort }, getSegMeta(seg, todayRange, nowDate))))); + return (y("div", { className: 'fc-timegrid-event-harness' + + (isInset ? ' fc-timegrid-event-harness-inset' : ''), key: forcedKey || instanceId, style: Object.assign(Object.assign({ visibility: isVisible ? '' : 'hidden' }, vStyle), hStyle) }, + y(TimeColEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, isShort: isShort }, getSegMeta(seg, todayRange, nowDate))))); }))); } // will already have eventMinHeight applied because segInputs already had it renderHiddenGroups(hiddenGroups, segs) { let { extraDateSpan, dateProfile, todayRange, nowDate, eventSelection, eventDrag, eventResize } = this.props; - return (h(p, null, hiddenGroups.map((hiddenGroup) => { + return (y(_, null, hiddenGroups.map((hiddenGroup) => { let positionCss = computeSegVStyle(hiddenGroup.span); let hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs); - return (h(TimeColMoreLink, { key: buildIsoString(computeEarliestSegStart(hiddenSegs)), hiddenSegs: hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan: extraDateSpan, dateProfile: dateProfile, todayRange: todayRange, nowDate: nowDate, eventSelection: eventSelection, eventDrag: eventDrag, eventResize: eventResize })); + return (y(TimeColMoreLink, { key: buildIsoString(computeEarliestSegStart(hiddenSegs)), hiddenSegs: hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan: extraDateSpan, dateProfile: dateProfile, todayRange: todayRange, nowDate: nowDate, eventSelection: eventSelection, eventDrag: eventDrag, eventResize: eventResize })); }))); } renderFillSegs(segs, fillType) { @@ -13356,18 +13661,18 @@ var FullCalendar = (function (exports) { let segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight); // don't assume all populated let children = segVCoords.map((vcoords, i) => { let seg = segs[i]; - return (h("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === 'bg-event' ? - h(BgEvent, Object.assign({ seg: seg }, getSegMeta(seg, props.todayRange, props.nowDate))) : + return (y("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === 'bg-event' ? + y(BgEvent, Object.assign({ seg: seg }, getSegMeta(seg, props.todayRange, props.nowDate))) : renderFill(fillType))); }); - return h(p, null, children); + return y(_, null, children); } renderNowIndicator(segs) { let { slatCoords, date } = this.props; if (!slatCoords) { return null; } - return segs.map((seg, i) => (h(NowIndicatorContainer + return segs.map((seg, i) => (y(NowIndicatorContainer // key doesn't matter. will only ever be one , { // key doesn't matter. will only ever be one @@ -13410,10 +13715,10 @@ var FullCalendar = (function (exports) { let hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) || (eventResize ? eventResize.affectedInstances : null) || {}; - return (h(p, null, sortedFgSegs.map((seg) => { + return (y(_, null, sortedFgSegs.map((seg) => { let instanceId = seg.eventRange.instance.instanceId; - return (h("div", { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? 'hidden' : '' } }, - h(TimeColEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, getSegMeta(seg, todayRange, nowDate))))); + return (y("div", { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? 'hidden' : '' } }, + y(TimeColEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, getSegMeta(seg, todayRange, nowDate))))); }))); } function computeSegVStyle(segVCoords) { @@ -13439,7 +13744,7 @@ var FullCalendar = (function (exports) { this.splitDateSelectionSegs = memoize(splitSegsByCol); this.splitEventDrag = memoize(splitInteractionByCol); this.splitEventResize = memoize(splitInteractionByCol); - this.rootElRef = y(); + this.rootElRef = d(); this.cellElRefs = new RefMap(); } render() { @@ -13455,18 +13760,18 @@ var FullCalendar = (function (exports) { let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt); let eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt); let eventResizeByRow = this.splitEventResize(props.eventResize, colCnt); - return (h("div", { className: "fc-timegrid-cols", ref: this.rootElRef }, - h("table", { role: "presentation", style: { + return (y("div", { className: "fc-timegrid-cols", ref: this.rootElRef }, + y("table", { role: "presentation", style: { minWidth: props.tableMinWidth, width: props.clientWidth, } }, props.tableColGroupNode, - h("tbody", { role: "presentation" }, - h("tr", { role: "row" }, - props.axis && (h("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, - h("div", { className: "fc-timegrid-col-frame" }, - h("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && (h(NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: props.nowDate })))))), - props.cells.map((cell, i) => (h(TimeCol, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint })))))))); + y("tbody", { role: "presentation" }, + y("tr", { role: "row" }, + props.axis && (y("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, + y("div", { className: "fc-timegrid-col-frame" }, + y("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && (y(NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: props.nowDate })))))), + props.cells.map((cell, i) => (y(TimeCol, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint })))))))); } componentDidMount() { this.updateCoords(); @@ -13536,14 +13841,14 @@ var FullCalendar = (function (exports) { } render() { let { props, state } = this; - return (h("div", { className: "fc-timegrid-body", ref: this.handleRootEl, style: { + return (y("div", { className: "fc-timegrid-body", ref: this.handleRootEl, style: { // these props are important to give this wrapper correct dimensions for interactions // TODO: if we set it here, can we avoid giving to inner tables? width: props.clientWidth, minWidth: props.tableMinWidth, } }, - h(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */, onCoords: this.handleSlatCoords }), - h(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint }))); + y(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */, onCoords: this.handleSlatCoords }), + y(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint }))); } componentDidMount() { this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); @@ -13624,16 +13929,16 @@ var FullCalendar = (function (exports) { super(...arguments); this.buildDayRanges = memoize(buildDayRanges); this.slicer = new DayTimeColsSlicer(); - this.timeColsRef = y(); + this.timeColsRef = d(); } render() { let { props, context } = this; let { dateProfile, dayTableModel } = props; - let isNowIndicator = context.options.nowIndicator; + let { nowIndicator, nextDayThreshold } = context.options; let dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv); // give it the first row of cells // TODO: would move this further down hierarchy, but sliceNowDate needs it - return (h(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' }, (nowDate, todayRange) => (h(TimeCols, Object.assign({ ref: this.timeColsRef }, this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: isNowIndicator && this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords }))))); + return (y(NowTimer, { unit: nowIndicator ? 'minute' : 'day' }, (nowDate, todayRange) => (y(TimeCols, Object.assign({ ref: this.timeColsRef }, this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: nowIndicator && this.slicer.sliceNowDate(nowDate, dateProfile, nextDayThreshold, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords }))))); } } function buildDayRanges(dayTableModel, dateProfile, dateEnv) { @@ -13709,9 +14014,9 @@ var FullCalendar = (function (exports) { let { dayMinWidth } = options; let hasAttachedAxis = !dayMinWidth; let hasDetachedAxis = dayMinWidth; - let headerContent = options.dayHeaders && (h(DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null })); - let allDayContent = (options.allDaySlot !== false) && ((contentArg) => (h(DayTable, Object.assign({}, splitProps.allDay, { dateProfile: dateProfile, dayTableModel: dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, this.getAllDayMaxEventProps())))); - let timeGridContent = (contentArg) => (h(DayTimeCols, Object.assign({}, splitProps.timed, { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: this.handleScrollTopRequest }))); + let headerContent = options.dayHeaders && (y(DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null })); + let allDayContent = (options.allDaySlot !== false) && ((contentArg) => (y(DayTable, Object.assign({}, splitProps.allDay, { dateProfile: dateProfile, dayTableModel: dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, this.getAllDayMaxEventProps())))); + let timeGridContent = (contentArg) => (y(DayTimeCols, Object.assign({}, splitProps.timed, { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: this.handleScrollTopRequest }))); return hasDetachedAxis ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); @@ -13722,17 +14027,14 @@ var FullCalendar = (function (exports) { return new DayTableModel(daySeries, false); } - const OPTION_REFINERS$1 = { + const OPTION_REFINERS$2 = { allDaySlot: Boolean, }; - var css_248z$1 = ".fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:\"\\00a0\"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:\"\\00a0-\\00a0\"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}"; - injectStyles(css_248z$1); - - var index$1 = createPlugin({ + var index$2 = createPlugin({ name: '@fullcalendar/timegrid', initialView: 'timeGridWeek', - optionRefiners: OPTION_REFINERS$1, + optionRefiners: OPTION_REFINERS$2, views: { timeGrid: { component: DayTimeColsView, @@ -13752,6 +14054,9 @@ var FullCalendar = (function (exports) { }, }); + var css_248z$1 = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}"; + injectStyles(css_248z$1); + class ListViewHeaderRow extends BaseComponent { constructor() { super(...arguments); @@ -13772,23 +14077,23 @@ var FullCalendar = (function (exports) { text, sideText, navLinkAttrs: buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta); // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too) - return (h(ContentContainer, { elTag: "tr", elClasses: [ + return (y(ContentContainer, { elTag: "tr", elClasses: [ 'fc-list-day', ...getDayClassNames(dayMeta, theme), ], elAttrs: { 'data-date': formatDayString(dayDate), - }, renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => ( // TODO: force-hide top border based on :first-child - h("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, - h(InnerContent, { elTag: "div", elClasses: [ + }, renderProps: renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => ( // TODO: force-hide top border based on :first-child + y("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, + y(InnerContent, { elTag: "div", elClasses: [ 'fc-list-day-cushion', theme.getClass('tableCellShaded'), ] }))))); } } function renderInnerContent(props) { - return (h(p, null, - props.text && (h("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)), - props.sideText && ( /* not keyboard tabbable */h("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText)))); + return (y(_, null, + props.text && (y("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)), + props.sideText && ( /* not keyboard tabbable */y("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText)))); } const DEFAULT_TIME_FORMAT = createFormatter({ @@ -13802,21 +14107,21 @@ var FullCalendar = (function (exports) { let { options } = context; let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props; let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT; - return (h(EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [ + return (y(EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [ 'fc-list-event', seg.eventRange.def.url && 'fc-event-forced-url', - ], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (h(p, null, + ], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (y(_, null, buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId), - h("td", { "aria-hidden": true, className: "fc-list-event-graphic" }, - h("span", { className: "fc-list-event-dot", style: { + y("td", { "aria-hidden": true, className: "fc-list-event-graphic" }, + y("span", { className: "fc-list-event-dot", style: { borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor, } })), - h(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } }))))); + y(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } }))))); } } function renderEventInnerContent(seg, context) { let interactiveAttrs = getSegAnchorAttrs(seg, context); - return (h("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title)); + return (y("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title)); } function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) { let { options } = context; @@ -13847,11 +14152,11 @@ var FullCalendar = (function (exports) { text: context.options.allDayText, view: context.viewApi, }; - return (h(ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: { + return (y(ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: { headers: `${timeHeaderId} ${dateHeaderId}`, - }, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount })); + }, renderProps: renderProps, generatorName: "allDayContent", customGenerator: options.allDayContent, defaultGenerator: renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount })); } - return (h("td", { className: "fc-list-event-time" }, timeText)); + return (y("td", { className: "fc-list-event-time" }, timeText)); } return null; } @@ -13887,14 +14192,14 @@ var FullCalendar = (function (exports) { let { props, context } = this; let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile); let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges); - return (h(ViewContainer$1, { elRef: this.setRootEl, elClasses: [ + return (y(ViewContainer, { elRef: this.setRootEl, elClasses: [ 'fc-list', context.theme.getClass('table'), context.options.stickyHeaderDates !== false ? 'fc-list-sticky' : '', ], viewSpec: context.viewSpec }, - h(Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ? + y(Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ? this.renderSegList(eventSegs, dayDates) : this.renderEmptyMessage()))); } @@ -13904,13 +14209,13 @@ var FullCalendar = (function (exports) { text: options.noEventsText, view: viewApi, }; - return (h(ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", generator: options.noEventsContent || renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (h(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] })))); + return (y(ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", customGenerator: options.noEventsContent, defaultGenerator: renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (y(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] })))); } renderSegList(allSegs, dayDates) { let { theme, options } = this.context; let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state; let segsByDay = groupSegsByDay(allSegs); // sparse array - return (h(NowTimer, { unit: "day" }, (nowDate, todayRange) => { + return (y(NowTimer, { unit: "day" }, (nowDate, todayRange) => { let innerNodes = []; for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) { let daySegs = segsByDay[dayIndex]; @@ -13918,20 +14223,20 @@ var FullCalendar = (function (exports) { let dayStr = formatDayString(dayDates[dayIndex]); let dateHeaderId = dateHeaderIdRoot + '-' + dayStr; // append a day header - innerNodes.push(h(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange })); + innerNodes.push(y(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange })); daySegs = sortEventSegs(daySegs, options.eventOrder); for (let seg of daySegs) { - innerNodes.push(h(ListViewEventRow, Object.assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, getSegMeta(seg, todayRange, nowDate)))); + innerNodes.push(y(ListViewEventRow, Object.assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, getSegMeta(seg, todayRange, nowDate)))); } } } - return (h("table", { className: 'fc-list-table ' + theme.getClass('table') }, - h("thead", null, - h("tr", null, - h("th", { scope: "col", id: timeHeaderId }, options.timeHint), - h("th", { scope: "col", "aria-hidden": true }), - h("th", { scope: "col", id: eventHeaderId }, options.eventHint))), - h("tbody", null, innerNodes))); + return (y("table", { className: 'fc-list-table ' + theme.getClass('table') }, + y("thead", null, + y("tr", null, + y("th", { scope: "col", id: timeHeaderId }, options.timeHint), + y("th", { scope: "col", "aria-hidden": true }), + y("th", { scope: "col", id: eventHeaderId }, options.eventHint))), + y("tbody", null, innerNodes))); })); } _eventStoreToSegs(eventStore, eventUiBases, dayRanges) { @@ -14012,7 +14317,7 @@ var FullCalendar = (function (exports) { return segsByDay; } - const OPTION_REFINERS = { + const OPTION_REFINERS$1 = { listDayFormat: createFalsableFormatter, listDaySideFormat: createFalsableFormatter, noEventsClassNames: identity, @@ -14025,12 +14330,9 @@ var FullCalendar = (function (exports) { return input === false ? null : createFormatter(input); } - var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}"; - injectStyles(css_248z); - - var index = createPlugin({ + var index$1 = createPlugin({ name: '@fullcalendar/list', - optionRefiners: OPTION_REFINERS, + optionRefiners: OPTION_REFINERS$1, views: { list: { component: ListView, @@ -14061,12 +14363,245 @@ var FullCalendar = (function (exports) { }, }); - globalPlugins.push(index$3, index$2, index$1, index); + class SingleMonth extends DateComponent { + constructor() { + super(...arguments); + this.buildDayTableModel = memoize(buildDayTableModel); + this.slicer = new DayTableSlicer(); + this.state = { + labelId: getUniqueDomId(), + }; + } + render() { + const { props, state, context } = this; + const { dateProfile, forPrint } = props; + const { options } = context; + const dayTableModel = this.buildDayTableModel(dateProfile, context.dateProfileGenerator); + const slicedProps = this.slicer.sliceProps(props, dateProfile, options.nextDayThreshold, context, dayTableModel); + // ensure single-month has aspect ratio + const tableHeight = props.tableWidth != null ? props.tableWidth / options.aspectRatio : null; + const rowCnt = dayTableModel.cells.length; + const rowHeight = tableHeight != null ? tableHeight / rowCnt : null; + return (y("div", { ref: props.elRef, "data-date": props.isoDateStr, className: "fc-multimonth-month", style: { width: props.width }, role: "grid", "aria-labelledby": state.labelId }, + y("div", { className: "fc-multimonth-header", style: { marginBottom: rowHeight }, role: "presentation" }, + y("div", { className: "fc-multimonth-title", id: state.labelId }, context.dateEnv.format(props.dateProfile.currentRange.start, props.titleFormat)), + y("table", { className: [ + 'fc-multimonth-header-table', + context.theme.getClass('table'), + ].join(' '), role: "presentation" }, + y("thead", { role: "rowgroup" }, + y(DayHeader, { dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: false })))), + y("div", { className: [ + 'fc-multimonth-daygrid', + 'fc-daygrid', + 'fc-daygrid-body', + !forPrint && 'fc-daygrid-body-balanced', + forPrint && 'fc-daygrid-body-unbalanced', + forPrint && 'fc-daygrid-body-natural', + ].join(' '), style: { marginTop: -rowHeight } }, + y("table", { className: [ + 'fc-multimonth-daygrid-table', + context.theme.getClass('table'), + ].join(' '), style: { height: forPrint ? '' : tableHeight }, role: "presentation" }, + y("tbody", { role: "rowgroup" }, + y(TableRows, Object.assign({}, slicedProps, { dateProfile: dateProfile, cells: dayTableModel.cells, eventSelection: props.eventSelection, dayMaxEvents: !forPrint, dayMaxEventRows: !forPrint, showWeekNumbers: options.weekNumbers, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: forPrint }))))))); + } + } + + class MultiMonthView extends DateComponent { + constructor() { + super(...arguments); + this.splitDateProfileByMonth = memoize(splitDateProfileByMonth); + this.buildMonthFormat = memoize(buildMonthFormat); + this.scrollElRef = d(); + this.firstMonthElRef = d(); + this.needsScrollReset = false; + this.handleSizing = (isForced) => { + if (isForced) { + this.updateSize(); + } + }; + } + render() { + const { context, props, state } = this; + const { options } = context; + const { clientWidth, clientHeight } = state; + const monthHPadding = state.monthHPadding || 0; + const colCount = Math.min(clientWidth != null ? + Math.floor(clientWidth / (options.multiMonthMinWidth + monthHPadding)) : + 1, options.multiMonthMaxColumns) || 1; + const monthWidthPct = (100 / colCount) + '%'; + const monthTableWidth = clientWidth == null ? null : + (clientWidth / colCount) - monthHPadding; + const isLegitSingleCol = clientWidth != null && colCount === 1; + const monthDateProfiles = this.splitDateProfileByMonth(context.dateProfileGenerator, props.dateProfile, context.dateEnv, isLegitSingleCol ? false : options.fixedWeekCount, options.showNonCurrentDates); + const monthTitleFormat = this.buildMonthFormat(options.multiMonthTitleFormat, monthDateProfiles); + const rootClassNames = [ + 'fc-multimonth', + isLegitSingleCol ? + 'fc-multimonth-singlecol' : + 'fc-multimonth-multicol', + (monthTableWidth != null && monthTableWidth < 400) ? + 'fc-multimonth-compact' : + '', + ]; + return (y(ViewContainer, { elRef: this.scrollElRef, elClasses: rootClassNames, viewSpec: context.viewSpec }, monthDateProfiles.map((monthDateProfile, i) => { + const monthStr = formatIsoMonthStr(monthDateProfile.currentRange.start); + return (y(SingleMonth, Object.assign({}, props, { key: monthStr, isoDateStr: monthStr, elRef: i === 0 ? this.firstMonthElRef : undefined, titleFormat: monthTitleFormat, dateProfile: monthDateProfile, width: monthWidthPct, tableWidth: monthTableWidth, clientWidth: clientWidth, clientHeight: clientHeight }))); + }))); + } + componentDidMount() { + this.updateSize(); + this.context.addResizeHandler(this.handleSizing); + this.requestScrollReset(); + } + componentDidUpdate(prevProps) { + if (!isPropsEqual(prevProps, this.props)) { // an external change? + this.handleSizing(false); + } + if (prevProps.dateProfile !== this.props.dateProfile) { + this.requestScrollReset(); + } + else { + this.flushScrollReset(); + } + } + componentWillUnmount() { + this.context.removeResizeHandler(this.handleSizing); + } + updateSize() { + const scrollEl = this.scrollElRef.current; + const firstMonthEl = this.firstMonthElRef.current; + if (scrollEl) { + this.setState({ + clientWidth: scrollEl.clientWidth, + clientHeight: scrollEl.clientHeight, + }); + } + if (firstMonthEl && scrollEl) { + if (this.state.monthHPadding == null) { // always remember initial non-zero value + this.setState({ + monthHPadding: scrollEl.clientWidth - // go within padding + firstMonthEl.firstChild.offsetWidth, + }); + } + } + } + requestScrollReset() { + this.needsScrollReset = true; + this.flushScrollReset(); + } + flushScrollReset() { + if (this.needsScrollReset && + this.state.monthHPadding != null // indicates sizing already happened + ) { + const { currentDate } = this.props.dateProfile; + const scrollEl = this.scrollElRef.current; + const monthEl = scrollEl.querySelector(`[data-date="${formatIsoMonthStr(currentDate)}"]`); + scrollEl.scrollTop = monthEl.getBoundingClientRect().top - + this.firstMonthElRef.current.getBoundingClientRect().top; + this.needsScrollReset = false; + } + } + // workaround for when queued setState render (w/ clientWidth) gets cancelled because + // subsequent update and shouldComponentUpdate says not to render :( + shouldComponentUpdate() { + return true; + } + } + // date profile + // ------------------------------------------------------------------------------------------------- + const oneMonthDuration = createDuration(1, 'month'); + function splitDateProfileByMonth(dateProfileGenerator, dateProfile, dateEnv, fixedWeekCount, showNonCurrentDates) { + const { start, end } = dateProfile.currentRange; + let monthStart = start; + const monthDateProfiles = []; + while (monthStart.valueOf() < end.valueOf()) { + const monthEnd = dateEnv.add(monthStart, oneMonthDuration); + const currentRange = { + // yuck + start: dateProfileGenerator.skipHiddenDays(monthStart), + end: dateProfileGenerator.skipHiddenDays(monthEnd, -1, true), + }; + let renderRange = buildDayTableRenderRange({ + currentRange, + snapToWeek: true, + fixedWeekCount, + dateEnv, + }); + renderRange = { + // yuck + start: dateProfileGenerator.skipHiddenDays(renderRange.start), + end: dateProfileGenerator.skipHiddenDays(renderRange.end, -1, true), + }; + const activeRange = dateProfile.activeRange ? + intersectRanges(dateProfile.activeRange, showNonCurrentDates ? renderRange : currentRange) : + null; + monthDateProfiles.push({ + currentDate: dateProfile.currentDate, + isValid: dateProfile.isValid, + validRange: dateProfile.validRange, + renderRange, + activeRange, + currentRange, + currentRangeUnit: 'month', + isRangeAllDay: true, + dateIncrement: dateProfile.dateIncrement, + slotMinTime: dateProfile.slotMaxTime, + slotMaxTime: dateProfile.slotMinTime, + }); + monthStart = monthEnd; + } + return monthDateProfiles; + } + // date formatting + // ------------------------------------------------------------------------------------------------- + const YEAR_MONTH_FORMATTER = createFormatter({ year: 'numeric', month: 'long' }); + const YEAR_FORMATTER = createFormatter({ month: 'long' }); + function buildMonthFormat(formatOverride, monthDateProfiles) { + return formatOverride || + ((monthDateProfiles[0].currentRange.start.getUTCFullYear() !== + monthDateProfiles[monthDateProfiles.length - 1].currentRange.start.getUTCFullYear()) + ? YEAR_MONTH_FORMATTER + : YEAR_FORMATTER); + } + + const OPTION_REFINERS = { + multiMonthTitleFormat: createFormatter, + multiMonthMaxColumns: Number, + multiMonthMinWidth: Number, + }; + + var css_248z = ".fc .fc-multimonth{border:1px solid var(--fc-border-color);display:flex;flex-wrap:wrap;overflow-x:hidden;overflow-y:auto}.fc .fc-multimonth-title{font-size:1.2em;font-weight:700;padding:1em 0;text-align:center}.fc .fc-multimonth-daygrid{background:var(--fc-page-bg-color)}.fc .fc-multimonth-daygrid-table,.fc .fc-multimonth-header-table{table-layout:fixed;width:100%}.fc .fc-multimonth-daygrid-table{border-top-style:hidden!important}.fc .fc-multimonth-singlecol .fc-multimonth{position:relative}.fc .fc-multimonth-singlecol .fc-multimonth-header{background:var(--fc-page-bg-color);position:relative;top:0;z-index:2}.fc .fc-multimonth-singlecol .fc-multimonth-daygrid{position:relative;z-index:1}.fc .fc-multimonth-singlecol .fc-multimonth-daygrid-table,.fc .fc-multimonth-singlecol .fc-multimonth-header-table{border-left-style:hidden;border-right-style:hidden}.fc .fc-multimonth-singlecol .fc-multimonth-month:last-child .fc-multimonth-daygrid-table{border-bottom-style:hidden}.fc .fc-multimonth-multicol{line-height:1}.fc .fc-multimonth-multicol .fc-multimonth-month{padding:0 1.2em 1.2em}.fc .fc-multimonth-multicol .fc-daygrid-more-link{border:1px solid var(--fc-event-border-color);display:block;float:none;padding:1px}.fc .fc-multimonth-compact{line-height:1}.fc .fc-multimonth-compact .fc-multimonth-daygrid-table,.fc .fc-multimonth-compact .fc-multimonth-header-table{font-size:.9em}.fc-media-screen .fc-multimonth-singlecol .fc-multimonth-header{position:sticky}.fc-media-print .fc-multimonth{overflow:visible}"; + injectStyles(css_248z); + + var index = createPlugin({ + name: '@fullcalendar/multimonth', + initialView: 'multiMonthYear', + optionRefiners: OPTION_REFINERS, + views: { + multiMonth: { + component: MultiMonthView, + dateProfileGeneratorClass: TableDateProfileGenerator, + multiMonthMinWidth: 350, + multiMonthMaxColumns: 3, + }, + multiMonthYear: { + type: 'multiMonth', + duration: { years: 1 }, + fixedWeekCount: true, + showNonCurrentDates: false, + }, + }, + }); + + globalPlugins.push(index$4, index$3, index$2, index$1, index); exports.Calendar = Calendar; exports.Draggable = ExternalDraggable; - exports.Internal = internal_esm; + exports.Internal = internal; exports.JsonRequestError = JsonRequestError; + exports.Preact = preact; exports.ThirdPartyDraggable = ThirdPartyDraggable; exports.createPlugin = createPlugin; exports.formatDate = formatDate; |