UNPKG

@demark-pro/react-booking-calendar

Version:

A responsive customizable React Booking calendar with overbooking protection

7 lines (6 loc) 18 kB
/*! @demark-pro/react-booking-calendar v4.0.5 undefined Released under the MIT License. */ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("memoize-one"),require("react-window"),require("react-virtualized-auto-sizer")):"function"==typeof define&&define.amd?define(["exports","react","memoize-one","react-window","react-virtualized-auto-sizer"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Calendar={},e.React,e.memoize,e.reactWindow,e.AutoSizer)}(this,(function(e,t,n,a,r){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=o(t),i=o(n),s=o(r),u=function(){return u=Object.assign||function(e){for(var t,n=1,a=arguments.length;n<a;n++)for(var r in t=arguments[n])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e},u.apply(this,arguments)};function c(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n}function d(e,t,n){if(n||2===arguments.length)for(var a,r=0,o=t.length;r<o;r++)!a&&r in t||(a||(a=Array.prototype.slice.call(t,0,r)),a[r]=t[r]);return e.concat(a||Array.prototype.slice.call(t))}"function"==typeof SuppressedError&&SuppressedError;var f=function(e){return new Date(e)},v=function(e){return u(u({},e),{calendar:"gregory"})};function m(e,t,n){return f(e).toLocaleDateString(null==n?void 0:n.locale,v(t))}function h(e,t){var n=null==t?void 0:t.locale;return new Intl.NumberFormat(n,{useGrouping:!1}).format(e)}function p(e,t){return h(f(e).getDate(),t)}function y(e,t){return m(e,{month:"long",year:"numeric"},t)}function g(e,t){var n=f(e);return t?(n.setDate(n.getDate()+t),n):n}function D(e){var t=f(e);return t.setHours(0,0,0,0),t}function C(e,t){return+D(e)==+D(t)}function S(e,t){var n=f(e),a=f(t);return n.getFullYear()===a.getFullYear()&&n.getMonth()===a.getMonth()}function b(e){var t=f(e).getDay();return 0===t||6===t}function E(e,t){return+f(e)<+f(t)}function w(e,t){var n=f(e),a=f(t);return n.getTime()>a.getTime()}function N(e,t){return+f(e)==+f(t)}function k(e,t){var n,a=null!==(n=null==t?void 0:t.weekStartsOn)&&void 0!==n?n:0,r=f(e),o=r.getDay(),l=(o<a?7:0)+o-a;return r.setDate(r.getDate()-l),r.setHours(0,0,0,0),r}function M(e){var t=f(e);return t.setDate(1),t.setHours(0,0,0,0),t}function P(e){var t=f(e),n=t.getMonth();return t.setFullYear(t.getFullYear(),n+1,0),t.setHours(23,59,59,999),t}var O=function(e,t,n,a){void 0===a&&(a="()");var r="{"===a[0],o="}"===a[1],l="["===a[0],i="]"===a[1];return r||o?(r&&C(t,e)||E(t,e))&&(o&&C(n,e)||w(n,e)):(l&&N(t,e)||E(t,e))&&(i&&N(n,e)||w(n,e))};function T(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e.filter((function(e){return"string"==typeof e&&e.length>0})).join(" ")}function A(e){return Object.entries(e).reduce((function(e,t){var n,a=t[0];return t[1]?u(u({},e),((n={})[a]=!0,n)):e}),{})}var R=function(e){return e.map((function(e){return e?new Date(e):null})).concat(Array.from({length:2-e.length},(function(){return null})))},x=function(e,t,n){var a=n.protection,r=n.range,o=n.isStart,l=n.selected;if(t.isDisabled||a)return null;var i=l[0],s=l[1];return r?i?[i,e]:[e]:o?[e,s]:[i,e]},F=i.default((function(e){for(var t=e.dateOfMonth,n=e.options,a=[],r=M(t),o=P(t),l=k(r,n),i=function(e,t){var n,a=null!==(n=null==t?void 0:t.weekStartsOn)&&void 0!==n?n:0,r=f(e),o=r.getDay(),l=6+(o<a?-7:0)-(o-a);return r.setDate(r.getDate()+l),r.setHours(23,59,59,999),r}(o,n),s=l;s<=i;){var u=s;a.push({date:u,monthStartDate:r}),s=g(u,1)}return a})),_=i.default((function(e){var t=e.dateOfMonth,n=e.options,a=e.monthsCount,r=void 0===a?6:a,o=[],l=function(e){var a=function(e,t){var n=f(e);if(!t)return n;var a=n.getDate(),r=n;return r.setMonth(n.getMonth()+t+1,0),a>=r.getDate()?r:(n.setFullYear(r.getFullYear(),r.getMonth(),a),n)}(t,+e),r=F({dateOfMonth:a,options:n}),l=Array.from({length:7}).map((function(){return{date:a,monthStartDate:a,isMonthRow:!0}}));o=d(d(d([],o,!0),l,!0),r,!0)};for(var i in Array.from({length:r}))l(i);return o})),Y=function(e){var t=e.day,n=e.selected,a=void 0===n?[]:n,r=e.reserved,o=void 0===r?[]:r,l=e.disabled,i=void 0!==l&&l,s=t.date,u=t.monthStartDate,c=new Date,d=D(s),v=function(e){var t=f(e);return t.setHours(23,59,59,999),t}(s),m=D(c),h={};return h.isSameYear=s.getFullYear()===c.getFullYear(),h.isSameMonth=S(s,u),h.isStartMonth=C(s,M(s)),h.isEndMonth=C(s,P(s)),h.isToday=C(s,c),h.isPast=d.getTime()<m.getTime(),h.isSelectedStart=!!a[0]&&C(s,a[0]),h.isSelectedEnd=!!a[1]&&C(s,a[1]),h.isSelected=!!(a[0]&&a[1]&&O(s,a[0],a[1],"{}")),h.isReserved=o.some((function(e){return O(v,e.startDate,e.endDate,"{}")&&O(d,e.startDate,e.endDate,"{}")})),h.isAvailable=!h.isReserved,h.isReservedStart=o.some((function(e){return C(e.startDate,s)})),h.isReservedEnd=o.some((function(e){return C(e.endDate,s)})),h.isDisabled="function"==typeof i?i(s,h):i,h};function W(e,t){if(!t||!t.useAttributes)return{};var n={};return(e.isSelected||e.isSelectedStart||e.isSelectedEnd)&&(n["data-selected"]=!0),e.isSelectedStart&&(n["data-selected-start"]=!0),e.isSelectedEnd&&(n["data-selected-end"]=!0),e.isReserved&&(n["data-reserved"]=!0),e.isReservedStart&&(n["data-reserved-start"]=!0),e.isReservedEnd&&(n["data-reserved-end"]=!0),e.isPast&&(n["data-past"]=!0),e.isToday&&(n["data-today"]=!0),n}function H(e){return"number"==typeof e}var z=function(e){return e.isSelected||e.isSelectedStart||e.isSelectedEnd},j=function(e){return e.isReserved||e.isReservedStart||e.isReservedEnd},B={CalendarContainer:"calendar-container",MonthContainer:"month-container",MonthContent:"month-content",MonthArrowBack:"month-arrow-back",MonthArrowNext:"month-arrow-next",WeekContainer:"week-container",WeekContent:"week-content",DaysContainer:"days-container",DayContainer:"day-container",DayContent:"day-content",DaySelection:"day-selection",DayReservation:"day-reservation",DayToday:"day-today"},I={CalendarContainer:function(e){var t=e.getClassNames,n=e.children,a=e.innerProps,r=null!=a?a:{},o=r.isScrollable,i=r.className,s=void 0===i?"":i,d=c(r,["isScrollable","className"]),f=t("CalendarContainer",s);return l.default.createElement("div",u({className:f},A({"data-scrollable":!!o}),d),n)},MonthContainer:function(e){var t=e.children,n=e.innerProps,a=e.getClassNames,r=null!=n?n:{},o=r.className,i=void 0===o?"":o,s=c(r,["className"]);return l.default.createElement("div",u({className:a("MonthContainer",i)},s),t)},MonthContent:function(e){var t=e.year,n=e.month,a=e.options,r=e.innerProps,o=e.getClassNames,i=null!=r?r:{};i.isScrollable;var s,d,v,p,y=i.className,g=void 0===y?"":y,D=c(i,["isScrollable","className"]),C=new Date(t,n),b=m(C,{month:"long"},a),E=h(t,a),w=A({"data-some-month":S(C,new Date),"data-some-year":(s=C,d=new Date,v=f(s),p=f(d),v.getFullYear()===p.getFullYear())});return l.default.createElement("div",u({className:o("MonthContent",g)},w,D),l.default.createElement("span",null,b),l.default.createElement("span",null,E))},MonthArrowBack:function(e){var t=e.innerProps,n=e.getClassNames,a=e.month,r=e.year,o=e.options,i=null!=t?t:{},s=i.className,d=void 0===s?"":s,f=i["aria-label"],v=c(i,["className","aria-label"]),m=null!=f?f:"number"==typeof a&&"number"==typeof r?y(new Date(r,a-1),o):"Previous month";return l.default.createElement("button",u({type:"button",className:n("MonthArrowBack",d),"aria-label":m},v),l.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},l.default.createElement("path",{d:"M14 17a1 1 0 0 1-.707-.293l-4-4a1 1 0 0 1 0-1.414l4-4a1 1 0 1 1 1.414 1.414L11.414 12l3.293 3.293A1 1 0 0 1 14 17z"})))},MonthArrowNext:function(e){var t=e.innerProps,n=e.getClassNames,a=e.month,r=e.year,o=e.options,i=null!=t?t:{},s=i.className,d=void 0===s?"":s,f=i["aria-label"],v=c(i,["className","aria-label"]),m=null!=f?f:"number"==typeof a&&"number"==typeof r?y(new Date(r,a+1),o):"Next month";return l.default.createElement("button",u({type:"button","aria-label":m,className:n("MonthArrowNext",d)},v),l.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},l.default.createElement("path",{d:"M14 17a1 1 0 0 1-.707-.293l-4-4a1 1 0 0 1 0-1.414l4-4a1 1 0 1 1 1.414 1.414L11.414 12l3.293 3.293A1 1 0 0 1 14 17z"})))},WeekContainer:function(e){var t=e.getClassNames,n=e.children,a=e.innerProps,r=null!=a?a:{},o=r.className,i=void 0===o?"":o,s=c(r,["className"]);return l.default.createElement("div",u({className:t("WeekContainer",i)},s),n)},WeekContent:function(e){var t=e.day,n=e.options,a=e.innerProps,r=e.getClassNames,o=null!=a?a:{},i=o.className,s=void 0===i?"":i,d=c(o,["className"]),f=g(k(new Date,n),t);return l.default.createElement("div",u({className:r("WeekContent",s)},A({"data-weekend":b(f)}),d),m(f,{weekday:"short"},n))},DaysContainer:function(e){var t=e.getClassNames,n=e.children,a=e.innerProps,r=null!=a?a:{},o=r.className,i=void 0===o?"":o,s=c(r,["className"]);return l.default.createElement("div",u({role:"listbox",className:t("DaysContainer",i)},s),n)},DayContainer:function(e){var t=e.date,n=e.state,a=e.innerProps,r=e.children,o=e.getClassNames,i=e.options,s=null!=a?a:{},d=s.onClick,f=s.className,v=void 0===f?"":f,h=c(s,["onClick","className"]),p=A({"data-selected":!!n.isSelected||!!n.isSelectedStart||!!n.isSelectedEnd,"data-reserved":!!n.isReserved,"data-past":!!n.isPast,"data-start-month":!!n.isStartMonth,"data-end-month":!!n.isEndMonth});return l.default.createElement("div",u({"aria-label":m(t,{},i),role:"option",tabIndex:-1,className:o("DayContainer",v),onClick:function(){return d&&d(t,n)}},p,h),r)},DayContent:function(e){var t=e.children,n=e.innerProps,a=e.state,r=e.options,o=e.getClassNames,i=null!=n?n:{},s=i.className,d=void 0===s?"":s,f=c(i,["className"]);return l.default.createElement("div",u({className:o("DayContent",d)},W(a,r),f),t)},DaySelection:function(e){var t=e.innerProps,n=e.state,a=e.options,r=e.getClassNames,o=null!=t?t:{},i=o.className,s=void 0===i?"":i,d=c(o,["className"]);return z(n)?l.default.createElement("div",u({className:r("DaySelection",s)},W(n,a),d)):null},DayReservation:function(e){var t=e.innerProps,n=e.state,a=e.getClassNames,r=null!=t?t:{},o=r.className,i=void 0===o?"":o,s=c(r,["className"]);return j(n)?l.default.createElement("div",u({className:a("DayReservation",i)},s)):null},DayToday:function(e){var t=e.innerProps,n=e.state,a=e.getClassNames,r=null!=t?t:{},o=r.className,i=void 0===o?"":o,s=c(r,["className"]);return n.isToday?l.default.createElement("div",u({className:a("DayToday",i)},s)):null}},q=function(e){return void 0===e&&(e={}),u(u({},I),e)},L=[null,null],G=!0,K=new Date,J=[],Q=!1,U=!1;(new Date).getMonth(),(new Date).getFullYear();var V=function(e,t){var n={startDate:e,endDate:e},a=t.find((function(t){return C(t.endDate,e)})),r=t.find((function(t){return C(t.startDate,e)}));return a&&(n.startDate=new Date(a.endDate)),r&&(n.endDate=new Date(r.startDate)),n};function X(e,t,n){var a=n.selected,r=n.reserved,o=n.range,l=Z(e,t,n);if(l)return l;var i=a[0],s=a[1],u=o?!i:n.isStart,c=V(e,r);return{overbookType:null,interval:[(u?C(e,new Date)?new Date:c.startDate:i)||null,(u?s:c.endDate)||null]}}var Z=function(e,t,n){var a=n.selected,r=n.reserved,o=n.range,l=a[0],i=a[1],s=o?!l:n.isStart,u=[V(e,r).startDate];if(t.isPast)return{overbookType:"PAST",interval:null};if(!t.isAvailable)return{overbookType:"BOOKED",interval:null};if(o&&(!l&&!i||l&&i))return{overbookType:null,interval:u};if(s){if(i&&E(i,e))return{overbookType:"AFTER_END",interval:o?u:null}}else if(l&&E(e,l))return{overbookType:"BEFORE_START",interval:o?u:null};var c=l&&r.find((function(t){return function(e,t,n,a,r){return void 0===r&&(r="()"),O(e,n,a,r)||O(t,n,a,r)}(t.startDate,t.endDate,l,D(e))}));return c?{overbookType:"BOOKED_BETWEEN",interval:o||s?u:null}:null};var $=function(e,t){var n=e,a=null;return e>11&&(n=0,a=t+1),e<0&&(n=11,a=t-1),[n,a]},ee=t.memo((function(e){var t=e.columnIndex,n=e.rowIndex,a=e.style,r=e.data,o=r.days,i=r.components,s=r.commonProps,c=r.onChange,d=r.onOverbook,f=s.selected,v=s.reserved,m=s.disabled,h=s.options,y=i.MonthContainer,g=i.MonthContent,D=i.DayContainer,C=i.DayContent,S=i.DayToday,b=i.DaySelection,E=i.DayReservation,w=o[7*n+t];if(!w)return null;var N=w.date,k=Y({day:w,selected:f,reserved:v,disabled:m});if(w.isMonthRow)return 3!==t?null:l.default.createElement(y,u({},s,{innerProps:{style:a}}),l.default.createElement(g,u({month:w.date.getMonth(),year:w.date.getFullYear()},s,{innerProps:{isScrollable:!0}})));var M={date:w.date,state:k};return l.default.createElement(D,u({innerProps:{style:a,onClick:function(){var e=x(N,k,s);if(null===e){var t=X(N,k,s),n=t.interval,a=t.overbookType;!a||n?n&&c&&c(n):d&&d(N,a)}else c&&c(e)}}},M,s),k.isSameMonth&&l.default.createElement(l.default.Fragment,null,l.default.createElement(C,u({},M,s),p(w.date,h)),l.default.createElement(S,u({},M,{state:k},s)),l.default.createElement(b,u({},M,{state:k},s)),l.default.createElement(E,u({},M,{state:k},s))))}),a.areEqual),te=function(e){var n=e.width,r=e.height,o=e.colHeight,i=e.items,s=e.initialScroll,d=e.components,f=e.commonProps,v=e.isStart,m=e.range,h=e.onOverbook,p=e.onScroll,y=e.onChange,g=c(e,["width","height","colHeight","items","initialScroll","components","commonProps","isStart","range","onOverbook","onScroll","onChange"]);return t.useEffect((function(){}),[i,s]),l.default.createElement(a.FixedSizeGrid,u({height:r,width:n,columnCount:7,columnWidth:n/7,rowCount:i.length/7,rowHeight:o,overscanRowCount:4,initialScrollTop:ne(o,i,s),itemData:{days:i,commonProps:f,components:d,isStart:v,range:m,onOverbook:h,onChange:y},onScroll:p},g),ee)},ne=function(e,t,n){if(t&&0!==t.length&&n){var a=0;for(var r in t){var o=t[r];if(0!=+r&&+r%7==0&&a++,C(o.date,n)){1===o.date.getDate()&&a--;break}}return a*e}};e.Calendar=function(e){var n=e.selected,a=void 0===n?L:n,r=e.isStart,o=void 0===r?G:r,i=e.initialDate,s=void 0===i?K:i,d=e.reserved,f=void 0===d?J:d,v=e.range,m=void 0===v?Q:v,h=e.protection,y=void 0===h||h,g=e.disabled,D=void 0===g?U:g,C=e.month,S=e.year,b=e.components,E=void 0===b?{}:b,w=e.classNames,N=void 0===w?{}:w,k=e.options,M=void 0===k?{}:k,P=e.onOverbook,O=e.onChange,A=e.onMonthChange,_=e.onYearChange,W=c(e,["selected","isStart","initialDate","reserved","range","protection","disabled","month","year","components","classNames","options","onOverbook","onChange","onMonthChange","onYearChange"]),z=s?new Date(s):K,j=H(C)?C:z.getMonth(),I=H(S)?S:z.getFullYear(),V=t.useState(j),Z=V[0],ee=V[1],te=t.useState(I),ne=te[0],ae=te[1],re=H(C),oe=H(S),le=re&&oe;t.useEffect((function(){re&&ee(C)}),[re,C]),t.useEffect((function(){oe&&ae(S)}),[oe,S]);var ie=le?C:Z,se=le?S:ne,ue=R(a),ce={selected:[ue[0],ue[1]],reserved:f,disabled:D,protection:y,range:m,isStart:o,options:M,getClassNames:function(e,t){return T("calendar__".concat(B[e]),N[e],t)}},de=function(e){var t=$(e,se),n=t[0],a=t[1];A&&A(n,null!=a?a:se),null!==a&&_&&_(a),le||(ee(n),null!==a&&ae(a))},fe=function(e,t){var n=x(e,t,ce);if(null===n){var a=X(e,t,ce),r=a.interval,o=a.overbookType;!o||r?r&&O&&O(r):P&&P(e,o)}else O&&O(n)},ve=q(E),me=ve.CalendarContainer,he=ve.MonthContainer,pe=ve.MonthArrowBack,ye=ve.MonthArrowNext,ge=ve.MonthContent,De=ve.WeekContainer,Ce=ve.WeekContent,Se=ve.DaysContainer,be=ve.DayContainer,Ee=ve.DayContent,we=ve.DaySelection,Ne=ve.DayReservation,ke=ve.DayToday,Me=new Date(se,ie),Pe=F({dateOfMonth:Me,options:M});return l.default.createElement(me,u({},ce,{innerProps:u({},W)}),l.default.createElement(he,u({},ce),l.default.createElement(pe,u({},ce,{month:ie,year:se,innerProps:{onClick:function(){return de(ie-1)}}})),l.default.createElement(ge,u({month:ie,year:se},ce)),l.default.createElement(ye,u({},ce,{month:ie,year:se,innerProps:{onClick:function(){return de(ie+1)}}}))),l.default.createElement(De,u({},ce),Array.from({length:7}).map((function(e,t){return l.default.createElement(Ce,u({key:"calendar_week_container_".concat(t),day:t},ce,{innerProps:{}}))}))),l.default.createElement(Se,u({},ce),Pe.map((function(e,t){var n={date:e.date,state:Y({day:e,selected:a,reserved:f,disabled:D})};return l.default.createElement(be,u({key:"calendar_day_container_".concat(t),innerProps:{onClick:fe}},n,ce),l.default.createElement(Ee,u({},n,ce),p(e.date,M)),l.default.createElement(ke,u({},n,ce)),l.default.createElement(we,u({},n,ce)),l.default.createElement(Ne,u({},n,ce)))}))))},e.ScrollableCalendar=function(e){var t=e.startMonth,n=void 0===t?new Date:t,a=e.selected,r=void 0===a?L:a,o=e.reserved,i=void 0===o?J:o,d=e.components,f=void 0===d?{}:d,v=e.classNames,m=void 0===v?{}:v,h=e.isStart,p=void 0===h?G:h,y=e.range,g=void 0===y?Q:y,D=e.disabled,C=void 0===D?U:D,S=e.protection,b=void 0!==S&&S,E=e.initialScroll,w=e.monthsCount,N=void 0===w?6:w,k=e.colHeight,M=void 0===k?55:k,P=e.options,O=void 0===P?{}:P,A=e.onOverbook,x=e.onChange,F=e.onScroll,Y=c(e,["startMonth","selected","reserved","components","classNames","isStart","range","disabled","protection","initialScroll","monthsCount","colHeight","options","onOverbook","onChange","onScroll"]),W=R(r),H={selected:[W[0],W[1]],reserved:i,disabled:C,protection:b,range:g,isStart:p,options:O,getClassNames:function(e,t){return T("calendar__".concat(B[e]),m[e],t)}},z=q(f),j=z.CalendarContainer,I=z.WeekContainer,K=z.WeekContent,V=z.DaysContainer,X=_({dateOfMonth:n,monthsCount:N,options:O});return l.default.createElement(j,u({},H,{innerProps:u(u({},Y),{isScrollable:!0})}),l.default.createElement(I,u({innerProps:{}},H),Array.from({length:7}).map((function(e,t){return l.default.createElement(K,u({key:"scrollable_calendar_week_container_".concat(t),day:t},H,{innerProps:{}}))}))),l.default.createElement(V,u({},H),l.default.createElement(s.default,null,(function(e){var t=e.height,n=e.width;return l.default.createElement(te,{height:t,width:n,items:X,colHeight:M,initialScroll:E,components:z,commonProps:H,isStart:p,range:g,onScroll:F,onOverbook:A,onChange:x})}))))},e.getProtectedInterval=X,e.getProtectedTime=V}));