UNPKG

@demark-pro/react-booking-calendar

Version:

A responsive customizable React Booking calendar with overbooking protection

7 lines (6 loc) 16.4 kB
/*! @demark-pro/react-booking-calendar v4.0.3 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),d=function(){return d=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},d.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 u(e,t,n){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))}var f=function(e){return new Date(e)};function v(e,t,n){return f(e).toLocaleDateString(null==n?void 0:n.locale,t)}function m(e,t){var n=f(e);return t?(n.setDate(n.getDate()+t),n):n}function h(e){var t=f(e);return t.setHours(0,0,0,0),t}function p(e){var t=f(e);return t.setHours(23,59,59,999),t}function g(e,t){return+h(e)==+h(t)}function y(e,t){var n=f(e),a=f(t);return n.getFullYear()===a.getFullYear()&&n.getMonth()===a.getMonth()}function D(e){var t=f(e).getDay();return 0===t||6===t}function C(e,t){return+f(e)<+f(t)}function S(e,t){var n=f(e),a=f(t);return n.getTime()>a.getTime()}function E(e,t){return+f(e)==+f(t)}function b(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 w(e){var t=f(e);return t.setDate(1),t.setHours(0,0,0,0),t}function k(e){var t=f(e),n=t.getMonth();return t.setFullYear(t.getFullYear(),n+1,0),t.setHours(23,59,59,999),t}var M=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&&g(t,e)||C(t,e))&&(o&&g(n,e)||S(n,e)):(l&&E(t,e)||C(t,e))&&(i&&E(n,e)||S(n,e))};function N(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e.filter(Boolean).join(" ")}function P(e){return Object.entries(e).reduce((function(e,t){var n,a=t[0];return t[1]?d(d({},e),((n={})[a]=!0,n)):e}),{})}var O=function(e){return e.map((function(e){return e?new Date(e):null})).concat(Array.from({length:2-e.length},(function(){return null})))},T=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]},A=i.default((function(e){for(var t=e.dateOfMonth,n=e.options,a=[],r=w(t),o=k(t),l=b(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 d=s;a.push({date:d,monthStartDate:r}),s=m(d,1)}return a})),R=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=A({dateOfMonth:a,options:n}),l=Array.from({length:7}).map((function(){return{date:a,monthStartDate:a,isMonthRow:!0}}));o=u(u(u([],o),l),r)};for(var i in Array.from({length:r}))l(i);return o})),x=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,d=t.monthStartDate,c=new Date,u={};return u.isDisabled="function"==typeof i?i(s,u):i,u.isSameYear=s.getFullYear()===c.getFullYear(),u.isSameMonth=y(s,d),u.isStartMonth=g(s,w(s)),u.isEndMonth=g(s,k(s)),u.isToday=g(s,c),u.isPast=s.getTime()-c.getTime()<0,u.isSelectedStart=!!a[0]&&g(s,a[0]),u.isSelectedEnd=!!a[1]&&g(s,a[1]),u.isSelected=!!(a[0]&&a[1]&&M(s,a[0],a[1],"{}")),u.isReserved=!!o.find((function(e){return M(p(s),e.startDate,e.endDate,"{}")&&M(h(s),e.startDate,e.endDate,"{}")})),u.isAvailable=!!o.find((function(e){return!M(p(s),e.startDate,e.endDate,"[]")||!M(h(s),e.startDate,e.endDate,"[]")})),u.isReservedStart=!!o.find((function(e){return g(e.startDate,s)})),u.isReservedEnd=!!o.find((function(e){return g(e.endDate,s)})),u};function _(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 F(e){return"number"==typeof e}var Y=function(e){return e.isSelected||e.isSelectedStart||e.isSelectedEnd},W=function(e){return e.isReserved||e.isReservedStart||e.isReservedEnd},H={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"},z={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,u=c(r,["isScrollable","className"]),f=t("CalendarContainer",s);return l.default.createElement("div",d({className:f},P({"data-scrollable":!!o}),u),n)},MonthContainer:function(e){var t=e.children,n=e.innerProps,a=e.getClassNames;return l.default.createElement("div",d({className:a("MonthContainer")},n),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,u,m,h,p=c(i,["isScrollable"]),g=new Date(t,n),D=v(g,{month:"long"},a),C=P({"data-some-month":y(g,new Date),"data-some-year":(s=g,u=new Date,m=f(s),h=f(u),m.getFullYear()===h.getFullYear())});return l.default.createElement("div",d({className:o("MonthContent")},C,p),l.default.createElement("span",null,D),l.default.createElement("span",null,t))},MonthArrowBack:function(e){var t=e.innerProps,n=e.getClassNames;return l.default.createElement("button",d({type:"button",className:n("MonthArrowBack"),"aria-label":"Previous Month"},t),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;return l.default.createElement("button",d({type:"button","aria-label":"Next Month",className:n("MonthArrowNext")},t),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;return l.default.createElement("div",{className:t("WeekContainer")},n)},WeekContent:function(e){var t=e.day,n=e.options,a=e.innerProps,r=e.getClassNames,o=m(b(new Date,n),t);return l.default.createElement("div",d({className:r("WeekContent")},P({"data-weekend":D(o)}),a),v(o,{weekday:"short"},n))},DaysContainer:function(e){var t=e.getClassNames,n=e.children;return l.default.createElement("div",{role:"listbox",className:t("DaysContainer")},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:{},u=s.onClick,f=c(s,["onClick"]),m=P({"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",d({"aria-label":v(t,{},i),role:"option",tabIndex:-1,className:o("DayContainer"),onClick:function(){return u&&u(t,n)}},m,f),r)},DayContent:function(e){var t=e.children,n=e.innerProps,a=e.state,r=e.options,o=e.getClassNames;return l.default.createElement("div",d({className:o("DayContent")},_(a,r),n),t)},DaySelection:function(e){var t=e.innerProps,n=e.state,a=e.options,r=e.getClassNames;return Y(n)?l.default.createElement("div",d({className:r("DaySelection")},_(n,a),t)):null},DayReservation:function(e){var t=e.innerProps,n=e.state,a=e.getClassNames;return W(n)?l.default.createElement("div",d({className:a("DayReservation")},t)):null},DayToday:function(e){var t=e.innerProps,n=e.state,a=e.getClassNames;return n.isToday?l.default.createElement("div",d({className:a("DayToday")},t)):null}},B=function(e){return void 0===e&&(e={}),d(d({},z),e)},j=[null,null],q=!0,I=[],L=!1,K=!1,G=(new Date).getMonth(),J=(new Date).getFullYear(),Q=function(e,t){var n={startDate:e,endDate:e},a=t.find((function(t){return g(t.endDate,e)})),r=t.find((function(t){return g(t.startDate,e)}));return a&&(n.startDate=new Date(a.endDate)),r&&(n.endDate=new Date(r.startDate)),console.log(n),n};function U(e,t,n){var a=n.selected,r=n.reserved,o=n.range,l=V(e,t,n);if(l)return l;var i=a[0],s=a[1],d=o?!i:n.isStart,c=Q(e,r);return{overbookType:null,interval:[(d?g(e,new Date)?new Date:c.startDate:i)||null,(d?s:c.endDate)||null]}}var V=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,d=[Q(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:d};if(s){if(i&&C(i,e))return{overbookType:"AFTER_END",interval:o?d:null}}else if(l&&C(e,l))return{overbookType:"BEFORE_START",interval:o?d:null};var c=l&&r.find((function(t){return function(e,t,n,a,r){return void 0===r&&(r="()"),M(e,n,a,r)||M(t,n,a,r)}(t.startDate,t.endDate,l,h(e))}));return c?{overbookType:"BOOKED_BETWEEN",interval:o||s?d:null}:null};var X=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]},Z=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,u=r.onOverbook,f=s.selected,m=s.reserved,h=s.disabled,p=i.MonthContainer,g=i.MonthContent,y=i.DayContainer,D=i.DayContent,C=i.DayToday,S=i.DaySelection,E=i.DayReservation,b=o[7*n+t];if(!b)return null;var w=b.date,k=x({day:b,selected:f,reserved:m,disabled:h});if(b.isMonthRow)return 3!==t?null:l.default.createElement(p,d({},s,{innerProps:{style:a}}),l.default.createElement(g,d({month:b.date.getMonth(),year:b.date.getFullYear()},s,{innerProps:{isScrollable:!0}})));var M={date:b.date,state:k};return l.default.createElement(y,d({innerProps:{style:a,onClick:function(){var e=T(w,k,s);if(null===e){var t=U(w,k,s),n=t.interval,a=t.overbookType;!a||n?n&&c&&c(n):u&&u(w,a)}else c&&c(e)}}},M,s),k.isSameMonth&&l.default.createElement(l.default.Fragment,null,l.default.createElement(D,d({},M,s),v(b.date,{day:"numeric"})),l.default.createElement(C,d({},M,{state:k},s)),l.default.createElement(S,d({},M,{state:k},s)),l.default.createElement(E,d({},M,{state:k},s))))}),a.areEqual),$=function(e){var n=e.width,r=e.height,o=e.colHeight,i=e.items,s=e.initialScroll,u=e.components,f=e.commonProps,v=e.isStart,m=e.range,h=e.onOverbook,p=e.onScroll,g=e.onChange,y=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,d({height:r,width:n,columnCount:7,columnWidth:n/7,rowCount:i.length/7,rowHeight:o,overscanRowCount:4,initialScrollTop:ee(o,i,s),itemData:{days:i,commonProps:f,components:u,isStart:v,range:m,onOverbook:h,onChange:g},onScroll:p},y),Z)},ee=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++,g(o.date,n)){1===o.date.getDate()&&a--;break}}return a*e}};e.Calendar=function(e){var n=e.selected,a=void 0===n?j:n,r=e.isStart,o=void 0===r?q:r;e.initialDate;var i=e.reserved,s=void 0===i?I:i,u=e.range,f=void 0===u?L:u,v=e.protection,m=void 0===v||v,h=e.disabled,p=void 0===h?K:h,g=e.month,y=e.year,D=e.components,C=void 0===D?{}:D,S=e.classNames,E=void 0===S?{}:S,b=e.options,w=void 0===b?{}:b,k=e.onOverbook,M=e.onChange,P=e.onMonthChange,R=e.onYearChange,_=c(e,["selected","isStart","initialDate","reserved","range","protection","disabled","month","year","components","classNames","options","onOverbook","onChange","onMonthChange","onYearChange"]),Y=t.useState(G),W=Y[0],z=Y[1],Q=t.useState(J),V=Q[0],Z=Q[1],$=F(g)?g:W,ee=F(y)?y:V,te=F(g)||F(y),ne=O(a),ae={selected:[ne[0],ne[1]],reserved:s,disabled:p,protection:m,range:f,isStart:o,options:w,getClassNames:function(e,t){return N("calendar__".concat(H[e]),E[e],t)}},re=function(e){var t=X(e,ee),n=t[0],a=t[1];P&&(P(n,null!=a?a:ee),a&&R&&R(a),te)||(z(n),a&&Z(a))},oe=function(e,t){var n=T(e,t,ae);if(null===n){var a=U(e,t,ae),r=a.interval,o=a.overbookType;!o||r?r&&M&&M(r):k&&k(e,o)}else M&&M(n)},le=B(C),ie=le.CalendarContainer,se=le.MonthContainer,de=le.MonthArrowBack,ce=le.MonthArrowNext,ue=le.MonthContent,fe=le.WeekContainer,ve=le.WeekContent,me=le.DaysContainer,he=le.DayContainer,pe=le.DayContent,ge=le.DaySelection,ye=le.DayReservation,De=le.DayToday,Ce=new Date(ee,$),Se=A({dateOfMonth:Ce,options:w});return l.default.createElement(ie,d({},ae,{innerProps:d({},_)}),l.default.createElement(se,d({},ae),l.default.createElement(de,d({},ae,{innerProps:{onClick:function(){return re($-1)}}})),l.default.createElement(ue,d({month:$,year:ee},ae)),l.default.createElement(ce,d({},ae,{innerProps:{onClick:function(){return re($+1)}}}))),l.default.createElement(fe,d({},ae),Array.from({length:7}).map((function(e,t){return l.default.createElement(ve,d({key:"calendar_week_container_".concat(t),day:t},ae,{innerProps:{}}))}))),l.default.createElement(me,d({},ae),Se.map((function(e,t){var n={date:e.date,state:x({day:e,selected:a,reserved:s,disabled:p})};return l.default.createElement(he,d({key:"calendar_day_container_".concat(t),innerProps:{onClick:oe}},n,ae),l.default.createElement(pe,d({},n,ae),e.date.getDate()),l.default.createElement(De,d({},n,ae)),l.default.createElement(ge,d({},n,ae)),l.default.createElement(ye,d({},n,ae)))}))))},e.ScrollableCalendar=function(e){var t=e.startMonth,n=void 0===t?new Date:t,a=e.selected,r=void 0===a?j:a,o=e.reserved,i=void 0===o?I:o,u=e.components,f=void 0===u?{}:u,v=e.classNames,m=void 0===v?{}:v,h=e.isStart,p=void 0===h?q:h,g=e.range,y=void 0===g?L:g,D=e.disabled,C=void 0===D?K:D,S=e.protection,E=void 0!==S&&S,b=e.initialScroll,w=e.monthsCount,k=void 0===w?6:w,M=e.colHeight,P=void 0===M?55:M,T=e.options,A=void 0===T?{}:T,x=e.onOverbook,_=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=O(r),z={selected:[W[0],W[1]],reserved:i,disabled:C,protection:E,range:y,isStart:p,options:A,getClassNames:function(e,t){return N("calendar__".concat(H[e]),m[e],t)}},G=B(f),J=G.CalendarContainer,Q=G.WeekContainer,U=G.WeekContent,V=G.DaysContainer,X=R({dateOfMonth:n,monthsCount:k,options:A});return l.default.createElement(J,d({},z,{innerProps:d(d({},Y),{isScrollable:!0})}),l.default.createElement(Q,d({innerProps:{}},z),Array.from({length:7}).map((function(e,t){return l.default.createElement(U,d({key:"scrollable_calendar_week_container_".concat(t),day:t},z,{innerProps:{}}))}))),l.default.createElement(V,d({},z),l.default.createElement(s.default,null,(function(e){var t=e.height,n=e.width;return l.default.createElement($,{height:t,width:n,items:X,colHeight:P,initialScroll:b,components:G,commonProps:z,isStart:p,range:y,onScroll:F,onOverbook:x,onChange:_})}))))},e.getProtectedInterval=U,e.getProtectedTime=Q}));