├── .gitignore ├── README.md ├── babel.config.js ├── build ├── demo.html ├── spring-calendar.common.js ├── spring-calendar.common.js.map ├── spring-calendar.umd.js ├── spring-calendar.umd.js.map ├── spring-calendar.umd.min.js └── spring-calendar.umd.min.js.map ├── dist ├── favicon.ico ├── index.html └── js │ ├── app.abc98d8c.js │ ├── app.abc98d8c.js.map │ ├── chunk-vendors.668181e8.js │ └── chunk-vendors.668181e8.js.map ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── components │ ├── Day.vue │ ├── Days.vue │ ├── Fragment.js │ ├── Month.vue │ ├── SpringCalendar.vue │ ├── Week.vue │ ├── Year.vue │ ├── buttons │ │ ├── NextButton.vue │ │ ├── PrevButton.vue │ │ └── index.js │ ├── colors.js │ ├── style.scss │ ├── useCalendar.js │ └── useContext.js └── main.js └── vue.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | dist 4 | build 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Vue Spring Calendar 2 | It's a Vue based component which provides the functionality of a full-calendar that shows daily events. 3 | 4 | ## Installation 5 | 6 | 7 | `npm install vue-spring-calendar --save` 8 | 9 | >For React.js developer please check this [`repository`](https://github.com/boussadjra/spring-calendar) 10 | ## Usage 11 | 12 | **`App.vue :`** 13 | ```js 14 | 19 | 20 | 49 | 50 | 51 | ``` 52 | 53 | **`main.js`** 54 | ``` 55 | import Vue from 'vue' 56 | import App from './App.vue' 57 | 58 | //import the new composition api in order to make it work in Vue@2.x 59 | import VueComp from '@vue/composition-api' 60 | Vue.config.productionTip = false 61 | //use the vue-composition-api plugin 62 | Vue.use(VueComp) 63 | 64 | new Vue({ 65 | render: h => h(App), 66 | }).$mount('#app') 67 | ``` 68 | ## Demo 69 | 70 | [Vue Spring Calendar demo](https://boussadjra.github.io/vue-spring-calendar/) 71 | 72 | [React Spring Calendar demo](https://boussadjra.github.io/spring-calendar/) -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 3 | presets: [ 4 | '@vue/cli-plugin-babel/preset' 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /build/demo.html: -------------------------------------------------------------------------------- 1 | 2 | spring-calendar demo 3 | 4 | 5 | 6 | 7 |
8 | 9 |
10 | 11 | 18 | -------------------------------------------------------------------------------- /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boussadjra/vue-spring-calendar/3f24d6e1b98fe739db0371ab3c076092740d2790/dist/favicon.ico -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | vue-spring-calendar
-------------------------------------------------------------------------------- /dist/js/app.abc98d8c.js: -------------------------------------------------------------------------------- 1 | (function(e){function t(t){for(var r,o,i=t[0],c=t[1],l=t[2],p=0,f=[];p0?[a("div",{staticClass:"sc-day-events"},[e._l(e.sliceEvents(t.events),(function(t,r){return a("span",{key:"de"+r,staticClass:"sc-event"},[e._v(e._s(t.title))])})),t.events.length>3?a("span",{staticClass:"sc-event-more-indicator"},[e._v("+"+e._s(t.events.length-3))]):e._e(),a("transition",{attrs:{name:"slide-fade"}},[e.indexDayToShowEvents==r&&t.events.length>0?[a("div",{staticClass:"sc-more-events-wrp",style:{left:t.weekday>3?"-150%":"50%"}},[a("div",{staticClass:"sc-more-events"},[a("div",{staticClass:"sc-events-detail"},[a("div",{staticClass:"sc-events-detail-day"},[e._v(e._s(t.localeFormat))]),e._l(t.events,(function(t,r){return a("div",{key:"d"+r,staticClass:"sc-event-detail"},[a("div",{staticClass:"sc-event-detail-time"},[a("div",[e._v(e._s(t.startTime))]),a("div",[e._v(e._s(t.endTime))])]),a("div",{staticClass:"sc-event-detail-title"},[e._v(e._s(t.title))])])}))],2)])])]:e._e()],2)],2)]:e._e()],2)}))],2)},C=[],z=(a("fb6a"),a("2909")),E={bind:function(e,t,a){},inserted:function(e){e.replaceWith.apply(e,Object(z["a"])(e.childNodes))}};r["a"].directive("fragment",E);a("a4d3"),a("e01a"),a("d3b7");var O=a("750b"),M=Symbol();function S(e){Object(O["d"])(M,e)}function Y(){var e=Object(O["b"])(M);return e}var T={props:["month"],setup:function(e){var t=Y(),a=t.selectDay,r=Object(O["f"])(-1);function n(e){r.value=e}function s(e){return e.slice(0,3)}function o(t,s,o){e.month.extended?n(o===r?-1:o):a(s)}return{selectDay:a,sliceEvents:s,chooseDay:o,indexDayToShowEvents:r}},directives:{Fragment:E}},F=T,B=(a("84f5"),Object(f["a"])(F,_,C,!1,null,null,null)),A=B.exports,P={name:"Month",props:["extended","month"],setup:function(e){var t=Y(),a=t.selectMonth;return{selectMonth:a}},components:{Days:A},mounted:function(){console.log("--------------------"),console.log(this.days),console.log("--------------------")}},H=P,L=Object(f["a"])(H,j,D,!1,null,null,null),$=L.exports,N={name:"year",props:["months"],components:{Month:$},directives:{Fragment:E}},I=N,W=Object(f["a"])(I,v,k,!1,null,null,null),V=W.exports,q=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"sc-full-day"},[e._l(e.day.hours,(function(t,r){return[a("div",{key:"fdh"+r,staticClass:"sc-full-day-hour"},[e._v(e._s(t.label))]),a("div",{staticClass:"sc-full-day-time-line-item"},[a("div",{staticClass:"sc-full-day-time-line-circle"})])]})),a("div",{staticClass:"sc-full-day-events"},e._l(e.day.events,(function(t,r){return a("div",{key:"fd"+r,staticClass:"sc-full-day-event",style:{gridRow:new Date(t.startDate).getHours()+1+"/span "+(new Date(t.endDate).getHours()-new Date(t.startDate).getHours()+1),background:t.color},attrs:{index:r}},[a("div",{staticClass:"sc-full-day-event-time"},[a("div",[e._v(e._s(t.startTime))]),a("div",[e._v(e._s(t.endTime))])]),a("div",{staticClass:"sc-full-day-event-title"},[e._v(e._s(t.title))])])})),0)],2)},G=[],J={name:"Day",props:["day"]},U=J,X=(a("05f3"),Object(f["a"])(U,q,G,!1,null,null,null)),R=X.exports,K=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"sc-week-wrapper"},[a("div",{staticClass:"sc-weekdays"},e._l(e.week.weekdays,(function(t,r){return a("div",{key:"fwd"+r,staticClass:"sc-weekday"},[a("div",{staticClass:"sc-weekday-label",attrs:{"data-full":t.label,"data-short":t.labelShort}}),a("div",{staticClass:"sc-weekday-date"},[e._v(e._s(t.date))])])})),0),a("div",{staticClass:"sc-week-hours-wrap"},[a("div",{staticClass:"sc-week-hours"},[e._l(e.week.hours,(function(t,r){return[a("div",{key:"wh"+r,staticClass:"sc-week-hour"},[e._v(e._s(t.label))])]}))],2)]),a("div",{staticClass:"sc-week-events-wrap"},e._l(e.mappedEvents,(function(t,r){return a("div",{key:"we"+r,staticClass:"sc-week-events",staticStyle:{"border-left":"thin solid #fff"}},e._l(t,(function(t,n){return a("div",{key:"evdd"+n+r,staticClass:"sc-week-event",class:{"sc-week-event-focused":t.title==e.focusedEvent.title},style:Object.assign({},t.style),on:{click:function(a){return e.focusOnEvent(t)}}},[t.title==e.focusedEvent.title?a("div",{staticClass:"sc-week-event-time"},[a("div",[e._v(e._s(t.startTime))]),a("div",[e._v(e._s(t.endTime))])]):e._e(),a("div",{staticClass:"sc-week-event-title"},[e._v(e._s(t.title))])])})),0)})),0)])},Q=[],Z=(a("4de4"),a("0481"),a("4069"),{name:"week",inheritAttrs:!1,props:["week"],data:function(){return{focusedEvent:{}}},computed:{events:function(){var e=this.week.weekdays.map((function(e){return e.events})).flat().sort((function(e,t){return new Date(e.startDate).getHours()-new Date(t.startDate).getHours()})).map((function(e,t){var a=new Date(e.startDate).getHours(),r=new Date(e.endDate).getHours(),n=(new Date(e.startDate).getMinutes(),new Date(e.endDate).getMinutes());return[],e.style={"grid-row":a+1+"/span "+(r-a+1),"grid-column":e.weekday+1,background:e.color,height:32*(r-a)+32*n/60+"px"},e}));return e},mappedEvents:function(){for(var e=[],t=0;t<24;t++)for(var a=0;a<7;a++)e.push(this.getEventsByHour(t,a));return e}},methods:{getEventsByHour:function(e,t){var a=this.events.filter((function(a){var r=new Date(a.startDate).getHours();return r===e&&t===a.weekday}));return a.map((function(e,t){return e.style.left=t/a.length*90+"%",e.style.top="0px",e}))},focusOnEvent:function(e){this.focusedEvent=e}}}),ee=Z,te=(a("c86b"),Object(f["a"])(ee,K,Q,!1,null,null,null)),ae=te.exports,re=(a("99af"),a("25f0"),a("5530")),ne=a("c1df"),se=a.n(ne),oe=function(e,t,a){var r=Object(O["e"])({selectedDate:{type:"year",value:(new Date).getFullYear(),default:!0},weekdays:[],weekdaysShort:[]}),n=function(e){r.selectedDate=e};Object(O["c"])((function(){se.a.updateLocale(t),r.weekdays=se.a.weekdays(),r.weekdaysShort=se.a.weekdaysShort(),window.moment=se.a,f("year")}));var s=function(e){return se.a.months().map((function(t,a){var r=a+1;return i(e,r,t)}))},o=function(e){var t=e.month()+1,a=se.a.months()[e.month()],r=e.year();return i(r,t,a)},i=function(e,t,a){var n="".concat(e,"-").concat(t),s=se()(n),o={label:a,fullLabel:n,index:t,weekday:s.weekday(),weekdaysShort:r.weekdaysShort,weekdays:r.weekdays};return o.days=Object(z["a"])(Array(s.daysInMonth())).map((function(a,r){return l({index:r+1,label:"".concat(e,"-").concat(t,"-").concat(r+1)})})),o},c=function(e){window._date=e;var t={weekdays:r.weekdays.map((function(t,a){var n=e.subtract(e.weekday()-a,"day").date(),s=e.month()+1,o=e.year(),i={index:n,label:"".concat(o,"-").concat(s,"-").concat(n)};return{label:t,labelShort:r.weekdaysShort[a],date:n,month:s,year:o,statOfWeek:e.subtract(e.weekday(),"day"),events:d(i)}})),hours:p()};return t},l=function(e){var t=se()(e.label);return e.localeFormat=t.format("LL"),e.hours=p(),e.events=d(e),e.isToday=se()().isSame(e.label,"day"),e.weekday=t.weekday(),e},d=function(e){var t=a.filter((function(t){return se()(t.startDate).isSame(e.label,"day")}));return t.map((function(t){return t.startTime=se()(t.startDate).format("hh:mm A"),t.endTime=se()(t.endDate).format("hh:mm A"),t.weekday=se()(e.label).weekday(),t}))},p=function(){return Object(z["a"])(Array(24)).map((function(e,t){return{index:t,label:"".concat(t<10?"0"+t:t,":00")}}))},f=function(e,t){var a=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],l=a?se()():se()(t);switch(l=!i||a||se()().isSame(se()(t),e)?l:se()(),e){case"day":n(Object(re["a"])({},r.selectedDate,{type:"day",value:l.format("LL"),hours:p(),events:d({label:l})}));break;case"week":n(Object(re["a"])({},r.selectedDate,{type:"week",value:function(e){var t=e.subtract(e.weekday(),"day");return t.format("LL")}(l),week:c(l)}));break;case"month":n(Object(re["a"])({},r.selectedDate,{type:"month",value:l.format("MMMM YYYY"),month:o(l)}));break;case"year":n(Object(re["a"])({},r.selectedDate,{type:"year",value:l.year().toString(),months:s(l.year())}));break;default:break}},u=function(){var e=se()(r.selectedDate.value).add(1,r.selectedDate.type+"s");f(r.selectedDate.type,e,!1)},b=function(){var e=se()(r.selectedDate.value).subtract(1,r.selectedDate.type+"s");f(r.selectedDate.type,e,!1)};return{gotoNext:u,gotoPrev:b,calendar:r,changeView:f}},ie=oe,ce=["#004D40","#00695C","#2e003e","#3d2352","#05386B","#379683","#022140","#265077","#0c0023","#190061","#38003c","#e90052","#330136","#5E1742","#191226","#F2355B","#702C8E","#ED1651","#2A4C59","#A62D43","#103754","#D53D13","#332851","#CA3074","#2D4057","#4097AA","#214D72","#2C7695","#071E22","#EE2E31","#434858","#FC6453","#651e3e","#851e3e","#0072ff","#00c6ff","#34495e","#41b883","#2b2d5c","#3465d8","#323E40","#D97D0D","#1D1D2C","#E40C2B","#1D1D2C","#C3002F","#306073","#F2385A","#0f256e","#01a168","#05004E","#fd5f00","#3e1063","#401372","#2F2440","#BA0F30"],le=ce,de={name:"spring-calendar",props:{year:{type:String,default:String((new Date).getFullYear())},locale:{type:String,default:"en"},color:{type:String,default:"#5118ac"},events:{type:Array,default:function(){return[]}},defaultType:{type:String,default:"year"}},setup:function(e){var t=e.year,a=e.color,r=e.events,n=e.locale,s=e.defaultType,o=Object(O["f"])("year"),i=Object(O["f"])(!1),c=r.map((function(e){return e.color=le[Math.round(56*Math.random())-1],e})),l=ie(t,n,c),d=l.calendar,p=l.changeView,f=l.gotoNext,u=l.gotoPrev;function b(e){o.value=e}function x(e){p(e,d.selectedDate.value,!1,!0)}function m(e){i.value=!0,p("month",e.fullLabel,!1)}function w(e){p("day",e.label,!1)}return Object(O["g"])("props.color",(function(){a?document.documentElement.style.setProperty("--primary",a):document.documentElement.style.setProperty("--primary","#5118ac")})),Object(O["g"])((function(){return d.selectedDate}),(function(){b(d.selectedDate.type)})),Object(O["c"])((function(){x(s)})),S({selectMonth:m,selectDay:w}),{mainContent:o,calendar:d,changeView:p,gotoNext:f,gotoPrev:u,changeContent:x,extendedMonth:i}},components:{NextButton:b,PrevButton:y,Year:V,Day:R,Month:$,Week:ae}},pe=de,fe=(a("185e"),Object(f["a"])(pe,o,i,!1,null,null,null)),ue=fe.exports,be={name:"App",data:function(){return{config:{title:"name",startDate:"start",endDate:"end"},events:[{title:"Event 1",startDate:"2020-12-24 08:00",endDate:"2020-12-24 12:00"},{title:"Event 2",startDate:"2020-12-24 09:00",endDate:"2020-12-24 12:00"},{title:"Event 3",startDate:"2020-12-24 12:00",endDate:"2020-12-24 16:00"},{title:"Event 4",startDate:"2020-12-24 09:00",endDate:"2020-12-24 10:00"},{title:"Event 5",startDate:"2020-12-28 09:00",endDate:"2020-12-28 14:00"},{title:"Event 6",startDate:"2020-12-28 08:00",endDate:"2020-12-28 10:00"},{title:"Event 7",startDate:"2020-12-28 06:00",endDate:"2020-12-28 10:00"},{title:"Event 8",startDate:"2020-12-24 18:00",endDate:"2020-12-24 22:00"},{title:"Event 9",startDate:"2020-12-24 18:00",endDate:"2020-12-24 20:00"},{title:"Event 10",startDate:"2020-12-23 09:00",endDate:"2020-12-23 20:50"},{title:"Event 11",startDate:"2020-12-27 09:00",endDate:"2020-12-27 20:30"},{title:"Event 12",startDate:"2020-12-24 09:00",endDate:"2020-12-24 12:30"}]}},components:{SpringCalendar:ue}},xe=be,me=Object(f["a"])(xe,n,s,!1,null,null,null),we=me.exports;r["a"].config.productionTip=!1,r["a"].use(O["a"]),new r["a"]({render:function(e){return e(we)}}).$mount("#app")},"84f5":function(e,t,a){"use strict";var r=a("8e3d"),n=a.n(r);n.a},"8e3d":function(e,t,a){var r=a("02cd");"string"===typeof r&&(r=[[e.i,r,""]]),r.locals&&(e.exports=r.locals);var n=a("499e").default;n("0334d796",r,!0,{sourceMap:!1,shadowMode:!1})},"98f5":function(e,t,a){var r=a("bf49");"string"===typeof r&&(r=[[e.i,r,""]]),r.locals&&(e.exports=r.locals);var n=a("499e").default;n("43f90f1c",r,!0,{sourceMap:!1,shadowMode:!1})},bf49:function(e,t,a){var r=a("24fb");t=r(!1),t.push([e.i,':root{--primary:#5118ac}*,body{-webkit-box-sizing:border-box;box-sizing:border-box}body{color:#666;font-family:Arial,Helvetica,sans-serif;height:100vh;width:97vw;margin:0;overflow-x:hidden}::-webkit-scrollbar{width:10px;border-radius:5px}::-webkit-scrollbar-track{background:inherit;border-radius:5px}::-webkit-scrollbar-thumb{background:var(--primary);border-radius:5px}.sc-wrapper{height:100%;width:100%;background:#dbdbdf;display:grid;grid-template-columns:1fr;grid-template-rows:64px 1fr;grid-auto-flow:dense;grid-template-areas:"header header" "content content";grid-row-gap:4px;padding:20px}@media (max-width:680px){.sc-wrapper{grid-template-rows:128px 1fr}}.sc-year-wrapper{grid-area:header;width:100%;line-height:64px;text-align:center;background:#f3f3f3;border-radius:4px;-webkit-box-shadow:1px 1px 5px #aaa;box-shadow:1px 1px 5px #aaa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:680px){.sc-year-wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.sc-year-wrapper .sc-year{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:200px;-webkit-box-shadow:0 1px 2px #aaa;box-shadow:0 1px 2px #aaa;height:48px;border-radius:4px}.sc-year-wrapper .sc-month-year{width:300px}.sc-year-wrapper .sc-toggle{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-shadow:0 1px 2px #aaa;box-shadow:0 1px 2px #aaa}.sc-year-wrapper .sc-toggle .spring-button{cursor:pointer;font-size:11pt;padding:0 30px;height:48px;width:100px;line-height:48px;text-align:center;text-decoration:none}@media (max-width:640px){.sc-year-wrapper .sc-toggle .spring-button{width:80px}}.sc-year-wrapper .sc-toggle .spring-button:first-child{border-radius:4px 0 0 4px}.sc-year-wrapper .sc-toggle .spring-button:last-child{border-radius:0 4px 4px 0}.sc-year-wrapper .sc-toggle .spring-button-active{background:var(--primary);color:#fff}.spring-main-content{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.spring-main-content .sc-year-months{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));grid-gap:20px}.sc-month-wrapper{height:200px;display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:32px 32px repeat(6,1fr);background:#f3f3f3;border-radius:4px;-webkit-box-shadow:1px 1px 5px #aaa;box-shadow:1px 1px 5px #aaa}.sc-month-wrapper .sc-month{cursor:pointer;grid-column-start:1;grid-column-end:8;font-size:10pt;text-align:center;color:#fff;background:var(--primary);padding:4px;text-transform:uppercase;border-radius:4px 4px 0 0}.sc-month-wrapper .sc-weekday{font-size:9pt;text-align:center;color:#222;padding:4px;text-transform:uppercase}.sc-month-wrapper .sc-day{font-size:9pt;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important;position:relative}.sc-month-wrapper .sc-day-in-month{color:#6d6c6c;font-weight:bolder}.sc-month-wrapper .sc-today{-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:4px solid #000e9c}.sc-month-wrapper .sc-today,.spring-centered-content{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.spring-centered-content{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sc-month-wrapper-extended{position:relative;height:100%;grid-template-rows:64px 48px repeat(6,128px);grid-column-start:1;grid-column-end:5;grid-row-start:2;grid-row-end:5}.sc-month-wrapper-extended .sc-month{height:100%;font-size:12pt}.sc-month-wrapper-extended .sc-weekday{font-size:11pt;text-align:center;color:#222;padding:4px}.sc-month-wrapper-extended .sc-day{font-size:9pt;text-align:center;border-top:1px solid #d3d2d2;border-right:1px solid #dfdede;border-bottom:1px solid #dfdede;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;padding-top:4px;position:relative}.sc-month-wrapper-extended .sc-day .sc-day-events{display:grid;grid-template-rows:1fr 1fr 1fr;row-gap:4px;overflow:hidden;width:100%}.sc-month-wrapper-extended .sc-day .sc-day-events .sc-more-events-wrp{position:absolute;z-index:200;left:50%;top:50%}.sc-month-wrapper-extended .sc-day .sc-day-events .sc-more-events-wrp .sc-more-events{overflow-y:auto;position:absolute;padding:24px 12px 12px 12px;width:360px;-webkit-box-shadow:1px 4px 19px #aaa;box-shadow:1px 4px 19px #aaa;z-index:2000;background:#f3f3f3;max-height:266px;border:1px solid var(--primary);border-radius:4px}.sc-month-wrapper-extended .sc-day .sc-day-events .sc-more-events-wrp .sc-more-events .sc-events-detail{display:grid;grid-gap:4px}.sc-month-wrapper-extended .sc-day .sc-day-events .sc-more-events-wrp .sc-more-events .sc-events-detail .sc-events-detail-day{padding:10px;font-size:12pt;background:rgba(210,210,208,.8);position:-webkit-sticky;position:sticky;top:-24px}.sc-month-wrapper-extended .sc-day .sc-day-events .sc-more-events-wrp .sc-more-events .sc-events-detail .sc-event-detail{display:grid;grid-template-columns:84px auto;border-radius:6px;-webkit-box-shadow:1px 1px 2px #aaa;box-shadow:1px 1px 2px #aaa}.sc-month-wrapper-extended .sc-day .sc-day-events .sc-more-events-wrp .sc-more-events .sc-events-detail .sc-event-detail .sc-event-detail-time{padding:8px;border-left:4px var(--primary) solid;color:var(--primary);border-radius:6px}.sc-month-wrapper-extended .sc-day .sc-day-events .sc-more-events-wrp .sc-more-events .sc-events-detail .sc-event-detail .sc-event-detail-title{padding:8px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sc-month-wrapper-extended .sc-day .sc-event{list-style:none;color:#fff;background:var(--primary);padding:4px;border-radius:4px;height:24px;width:100%}.sc-month-wrapper-extended .sc-day .sc-event:empty{height:22px}.sc-month-wrapper-extended .sc-day .sc-event-more{width:auto}.sc-month-wrapper-extended .sc-day .sc-event-more-indicator{color:red}.sc-month-wrapper-extended .sc-today{-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:4px solid #000e9c;position:relative;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.sc-day-in-month,.sc-month-wrapper-extended .sc-today{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sc-day-in-month{color:#6d6c6c;font-weight:bolder;padding:4px;font-size:9pt}@-webkit-keyframes slideInFromBottom{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInFromBottom{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}.sc-full-day{background-color:transparent;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(24%,transparent),color-stop(25%,#efefef),color-stop(26%,#efefef),color-stop(27%,transparent),color-stop(74%,transparent),color-stop(75%,#efefef),color-stop(76%,#efefef),color-stop(77%,transparent),to(transparent)),-webkit-gradient(linear,left top,right top,color-stop(24%,transparent),color-stop(25%,#efefef),color-stop(26%,#efefef),color-stop(27%,transparent),color-stop(74%,transparent),color-stop(75%,#efefef),color-stop(76%,#efefef),color-stop(77%,transparent),to(transparent));background-image:linear-gradient(0deg,transparent 24%,#efefef 25%,#efefef 26%,transparent 27%,transparent 74%,#efefef 75%,#efefef 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,#efefef 25%,#efefef 26%,transparent 27%,transparent 74%,#efefef 75%,#efefef 76%,transparent 77%,transparent);height:100%;background-size:64px 64px;display:grid;grid-template-rows:repeat(24,32px);grid-template-columns:50px 40px auto}.sc-full-day-hour,.sc-full-day-time-line-item{grid-column-start:1;grid-column-end:2;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:32px;position:relative}.sc-full-day-time-line-item{grid-column-start:2;grid-column-end:3}.sc-full-day-time-line-item:last-child .sc-full-day-time-line-circle:empty:before{height:0}.sc-full-day-time-line-circle:empty{background-color:var(--primary);width:16px;height:16px;border-radius:50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.sc-full-day-time-line-circle:empty:before{display:block;content:"";-webkit-box-sizing:border-box;box-sizing:border-box;height:32px;width:2px;background:var(--primary);z-index:2}.sc-full-day-events{grid-area:1/3/25/4;display:grid;width:100%;height:100%;grid-template-rows:repeat(24,32px);grid-column-gap:2px}.sc-full-day-event{padding:10px;position:relative;background:var(--primary);color:#fff;border-radius:0 4px 4px 0;margin-top:10px;border-left:3px solid #ff304f;min-height:40px;height:calc(100% - 22px);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;white-space:nowrap;width:100%;-webkit-box-shadow:1px 1px 2px #aaa;box-shadow:1px 1px 2px #aaa;-webkit-animation:slideInFromBottom 1s ease-out 0s 1;animation:slideInFromBottom 1s ease-out 0s 1}.sc-full-day-event-time{color:#fff;font-size:9pt}.sc-full-day-event-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sc-day-events-count{background:#e14444;color:#fff;width:16px;height:16px;text-align:center;line-height:16px;border-radius:50%;position:absolute;top:-4px;right:0;z-index:5;-webkit-box-shadow:1px 1px 10px #9c9a9a;box-shadow:1px 1px 10px #9c9a9a}.sc-hours-wrapper{background-color:transparent;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(24%,transparent),color-stop(25%,#efefef),color-stop(26%,#efefef),color-stop(27%,transparent),color-stop(74%,transparent),color-stop(75%,#efefef),color-stop(76%,#efefef),color-stop(77%,transparent),to(transparent)),-webkit-gradient(linear,left top,right top,color-stop(24%,transparent),color-stop(25%,#efefef),color-stop(26%,#efefef),color-stop(27%,transparent),color-stop(74%,transparent),color-stop(75%,#efefef),color-stop(76%,#efefef),color-stop(77%,transparent),to(transparent));background-image:linear-gradient(0deg,transparent 24%,#efefef 25%,#efefef 26%,transparent 27%,transparent 74%,#efefef 75%,#efefef 76%,transparent 77%,transparent),linear-gradient(90deg,transparent 24%,#efefef 25%,#efefef 26%,transparent 27%,transparent 74%,#efefef 75%,#efefef 76%,transparent 77%,transparent);height:100%;background-size:50px 50px;grid-column-start:1;grid-column-end:5;display:grid;grid-template-columns:65px 20px repeat(30,1fr);grid-template-rows:repeat(24,50px);width:100%;padding:8px 12px;border-radius:4px;-webkit-box-shadow:1px 1px 5px #aaa;box-shadow:1px 1px 5px #aaa}.sc-hours-wrapper .sc-hour{grid-column-start:1;grid-column-end:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative}.sc-hours-wrapper .sc-hour:before{display:block;content:"";-webkit-box-sizing:border-box;box-sizing:border-box;height:50px;width:2px;background:var(--primary);position:absolute;left:63px;z-index:2}.sc-hours-wrapper .sc-hour:first-child:before{top:25px;height:25px}.sc-hours-wrapper .sc-hour:last-child:before{bottom:25px;height:25px}.sc-hours-wrapper .sc-hour:after{display:block;content:"";-webkit-box-sizing:border-box;box-sizing:border-box;height:16px;width:16px;background:var(--primary);border-radius:50%;position:absolute;left:56px;border:2px solid var(--primary);z-index:2}.sc-hours-wrapper .sc-event{grid-column-start:3;white-space:nowrap;height:100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:10px;position:relative;background:var(--primary);color:#fff;border-radius:0 10px 10px 0;margin-top:22px;-webkit-box-shadow:0 2px 4px #aaa;box-shadow:0 2px 4px #aaa;border-left:6px solid #ff304f}.spring-btn{outline:none;background:var(--primary);border:none;text-align:center;height:32px;width:32px;cursor:pointer}.spring-btn-rounded{border-radius:50%}sup{position:unset}',""]),e.exports=t},c86b:function(e,t,a){"use strict";var r=a("00b3"),n=a.n(r);n.a}}); 2 | //# sourceMappingURL=app.abc98d8c.js.map -------------------------------------------------------------------------------- /dist/js/app.abc98d8c.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/Week.vue?4eb2","webpack:///./src/components/Days.vue?b61a","webpack:///./src/components/Day.vue?e15a","webpack:///./src/components/Day.vue?2d8e","webpack:///./src/components/Day.vue?c581","webpack:///./src/components/style.scss?7a52","webpack:///./src/components/Week.vue?f6fe","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/App.vue?c517","webpack:///./src/components/SpringCalendar.vue?9db9","webpack:///./src/components/buttons/NextButton.vue?4072","webpack:///src/components/buttons/NextButton.vue","webpack:///./src/components/buttons/NextButton.vue?27c7","webpack:///./src/components/buttons/NextButton.vue","webpack:///./src/components/buttons/PrevButton.vue?d77c","webpack:///src/components/buttons/PrevButton.vue","webpack:///./src/components/buttons/PrevButton.vue?2e69","webpack:///./src/components/buttons/PrevButton.vue","webpack:///./src/components/Year.vue?c2ae","webpack:///./src/components/Month.vue?7e7a","webpack:///./src/components/Days.vue?5362","webpack:///./src/components/Fragment.js","webpack:///./src/components/useContext.js","webpack:///src/components/Days.vue","webpack:///./src/components/Days.vue?cf6d","webpack:///./src/components/Days.vue","webpack:///src/components/Month.vue","webpack:///./src/components/Month.vue?80d1","webpack:///./src/components/Month.vue","webpack:///src/components/Year.vue","webpack:///./src/components/Year.vue?1e64","webpack:///./src/components/Year.vue","webpack:///./src/components/Day.vue?b6f7","webpack:///src/components/Day.vue","webpack:///./src/components/Day.vue?d612","webpack:///./src/components/Day.vue","webpack:///./src/components/Week.vue?429d","webpack:///src/components/Week.vue","webpack:///./src/components/Week.vue?d016","webpack:///./src/components/Week.vue","webpack:///./src/components/useCalendar.js","webpack:///./src/components/colors.js","webpack:///src/components/SpringCalendar.vue","webpack:///./src/components/SpringCalendar.vue?c6ea","webpack:///./src/components/SpringCalendar.vue","webpack:///src/App.vue","webpack:///./src/App.vue?a7d1","webpack:///./src/App.vue","webpack:///./src/main.js","webpack:///./src/components/Days.vue?07ac","webpack:///./src/components/Days.vue?794d","webpack:///./src/components/style.scss?4873","webpack:///./src/components/style.scss","webpack:///./src/components/Week.vue?5826"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","content","locals","add","default","___CSS_LOADER_API_IMPORT___","map","webpackContext","req","id","webpackContextResolve","e","Error","code","keys","resolve","_vm","this","_h","$createElement","_c","_self","attrs","events","config","staticRenderFns","staticClass","class","calendar","selectedDate","type","nativeOn","$event","gotoPrev","_v","_s","gotoNext","on","changeContent","extendedMonth","mainContent","tag","months","month","week","component","staticStyle","_l","index","extended","selectMonth","label","weekday","assign","style","_e","day","isToday","chooseDay","sliceEvents","title","indexDayToShowEvents","left","localeFormat","startTime","endTime","Fragment","el","binding","vnode","inserted","replaceWith","childNodes","Vue","directive","context","provideContext","methods","provide","useContext","ctx","inject","props","components","Month","directives","hour","event","gridRow","Date","startDate","getHours","endDate","background","color","labelShort","date","item","focusedEvent","focusOnEvent","inheritAttrs","computed","_events","_mappedEvents","getEventsByHour","h","startHour","top","useCalendar","thisYear","locale","reactive","getFullYear","weekdays","weekdaysShort","setSelectedDate","onMounted","moment","updateLocale","changeView","generateMonths","_year","getMonth","generateMonth","_date","year","fullLabel","days","Array","daysInMonth","_","dayIndex","getDay","generateWeek","_week","dw","subtract","_month","_day","statOfWeek","getEvents","hours","format","isSame","evts","filter","x","k","isDefault","toggle","toString","next","prev","colors","productionTip","use","VueComp","render","App","$mount"],"mappings":"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c,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,gBAAiB,OACjB,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,UAAW,OACX,aAAc,OACd,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,UAAW,OACX,aAAc,OACd,OAAQ,OACR,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","file":"js/app.abc98d8c.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/vue-spring-calendar/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","// style-loader: Adds some css to the DOM by adding a \r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Days.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Days.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Days.vue?vue&type=template&id=e3783750&\"\nimport script from \"./Days.vue?vue&type=script&lang=js&\"\nexport * from \"./Days.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Days.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Month.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Month.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Month.vue?vue&type=template&id=34167218&\"\nimport script from \"./Month.vue?vue&type=script&lang=js&\"\nexport * from \"./Month.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Year.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Year.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Year.vue?vue&type=template&id=fb631dfc&\"\nimport script from \"./Year.vue?vue&type=script&lang=js&\"\nexport * from \"./Year.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"sc-full-day\"},[_vm._l((_vm.day.hours),function(hour,index){return [_c('div',{key:'fdh'+index,staticClass:\"sc-full-day-hour\"},[_vm._v(_vm._s(hour.label))]),_c('div',{staticClass:\"sc-full-day-time-line-item\"},[_c('div',{staticClass:\"sc-full-day-time-line-circle\"})])]}),_c('div',{staticClass:\"sc-full-day-events\"},_vm._l((_vm.day.events),function(event,index){return _c('div',{key:'fd'+index,staticClass:\"sc-full-day-event\",style:({gridRow:new Date(event.startDate).getHours() + 1 +'/span ' +(new Date(event.endDate).getHours() - new Date(event.startDate).getHours() + 1),background:event.color}),attrs:{\"index\":index}},[_c('div',{staticClass:\"sc-full-day-event-time\"},[_c('div',[_vm._v(_vm._s(event.startTime))]),_c('div',[_vm._v(_vm._s(event.endTime))])]),_c('div',{staticClass:\"sc-full-day-event-title\"},[_vm._v(_vm._s(event.title))])])}),0)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Day.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Day.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Day.vue?vue&type=template&id=51dbbeb4&\"\nimport script from \"./Day.vue?vue&type=script&lang=js&\"\nexport * from \"./Day.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Day.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"sc-week-wrapper\"},[_c('div',{staticClass:\"sc-weekdays\"},_vm._l((_vm.week.weekdays),function(weekday,j){return _c('div',{key:'fwd'+j,staticClass:\"sc-weekday\"},[_c('div',{staticClass:\"sc-weekday-label\",attrs:{\"data-full\":weekday.label,\"data-short\":weekday.labelShort}}),_c('div',{staticClass:\"sc-weekday-date\"},[_vm._v(_vm._s(weekday.date))])])}),0),_c('div',{staticClass:\"sc-week-hours-wrap\"},[_c('div',{staticClass:\"sc-week-hours\"},[_vm._l((_vm.week.hours),function(hour,index){return [_c('div',{key:'wh'+index,staticClass:\"sc-week-hour\"},[_vm._v(_vm._s(hour.label))])]})],2)]),_c('div',{staticClass:\"sc-week-events-wrap\"},_vm._l((_vm.mappedEvents),function(event,index){return _c('div',{key:'we'+index,staticClass:\"sc-week-events\",staticStyle:{\"border-left\":\"thin solid #fff\"}},_vm._l((event),function(item,i){return _c('div',{key:'evdd'+i+index,staticClass:\"sc-week-event\",class:{'sc-week-event-focused':item.title==_vm.focusedEvent.title},style:(Object.assign({}, item.style)),on:{\"click\":function($event){return _vm.focusOnEvent(item)}}},[(item.title==_vm.focusedEvent.title)?_c('div',{staticClass:\"sc-week-event-time\"},[_c('div',[_vm._v(_vm._s(item.startTime))]),_c('div',[_vm._v(_vm._s(item.endTime))])]):_vm._e(),_c('div',{staticClass:\"sc-week-event-title\"},[_vm._v(_vm._s(item.title))])])}),0)}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Week.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Week.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Week.vue?vue&type=template&id=350bcf4e&\"\nimport script from \"./Week.vue?vue&type=script&lang=js&\"\nexport * from \"./Week.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Week.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import { reactive, watch, onMounted } from '@vue/composition-api';\r\nimport moment from 'moment/moment';\r\n\r\nconst useCalendar = (thisYear, locale, events) => {\r\n\t/**\r\n\t * * Main calendar\r\n\t */\r\n\tconst calendar = reactive({\r\n\t\tselectedDate: { type: 'year', value: new Date().getFullYear(), default: true },\r\n\r\n\t\tweekdays: [],\r\n\t\tweekdaysShort: [],\r\n\t});\r\n\r\n\t/**\r\n\t * * calendar setters\r\n\t */\r\n\tconst setSelectedDate = value => {\r\n\t\tcalendar.selectedDate = value;\r\n\t};\r\n\r\n\tonMounted(() => {\r\n\t\tmoment.updateLocale(locale);\r\n\t\tcalendar.weekdays = moment.weekdays();\r\n\t\tcalendar.weekdaysShort = moment.weekdaysShort();\r\n\t\t/*\tif(startOfWeek){\r\n\t\t\tcalendar.weekdays=[...calendar.weekdays.splice(startOfWeek),...calendar.weekdays]\r\n\t\t\tcalendar.weekdaysShort=[...calendar.weekdaysShort.splice(startOfWeek),...calendar.weekdaysShort]\r\n\t\t\r\n\t\t}*/\r\n\t\twindow.moment = moment;\r\n\r\n\t\tchangeView('year');\r\n\t});\r\n\r\n\t/****\r\n\t *\r\n\t * * functions\r\n\t */\r\n\r\n\t/**\r\n\t *\r\n\t * @param {*} _year is the year string name like '2020'\r\n\t */\r\n\tconst generateMonths = _year => {\r\n\t\treturn moment.months().map((label, i) => {\r\n\t\t\tlet index = i + 1;\r\n\r\n\t\t\treturn getMonth(_year, index, label);\r\n\t\t});\r\n\t};\r\n\t/** */\r\n\r\n\tconst generateMonth = _date => {\r\n\t\tlet index = _date.month() + 1;\r\n\t\tlet label = moment.months()[_date.month()];\r\n\t\tlet _year = _date.year();\r\n\r\n\t\treturn getMonth(_year, index, label);\r\n\t};\r\n\t/******* */\r\n\tconst getMonth = (_year, index, label) => {\r\n\t\tlet fullLabel = `${_year}-${index}`;\r\n\t\tlet date = moment(fullLabel);\r\n\r\n\t\tlet month = {\r\n\t\t\tlabel,\r\n\t\t\tfullLabel,\r\n\t\t\tindex,\r\n\t\t\tweekday: date.weekday(),\r\n\t\t\tweekdaysShort: calendar.weekdaysShort,\r\n\t\t\tweekdays: calendar.weekdays,\r\n\t\t};\r\n\r\n\t\tmonth.days = [...Array(date.daysInMonth())].map((_, dayIndex) => {\r\n\t\t\treturn getDay({\r\n\t\t\t\tindex: dayIndex + 1,\r\n\t\t\t\tlabel: `${_year}-${index}-${dayIndex + 1}`,\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\treturn month;\r\n\t};\r\n\tconst generateWeek = _date => {\r\n\t\twindow._date = _date;\r\n\r\n\t\tlet _week = {\r\n\t\t\tweekdays: calendar.weekdays.map((dw, i) => {\r\n\t\t\t\tlet date = _date.subtract(_date.weekday() - i, 'day').date();\r\n\t\t\t\tlet _month = _date.month() + 1;\r\n\t\t\t\tlet _year = _date.year();\r\n\t\t\t\tlet _day = {\r\n\t\t\t\t\tindex: date,\r\n\t\t\t\t\tlabel: `${_year}-${_month}-${date}`,\r\n\t\t\t\t};\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\treturn {\r\n\t\t\t\t\tlabel: dw,\r\n\t\t\t\t\tlabelShort: calendar.weekdaysShort[i],\r\n\t\t\t\t\tdate,\r\n\t\t\t\t\tmonth: _month,\r\n\t\t\t\t\tyear: _year,\r\n\t\t\t\t\tstatOfWeek: _date.subtract(_date.weekday(), 'day'),\r\n\t\t\t\t\tevents:getEvents(_day)\r\n\t\t\t\t};\r\n\t\t\t}),\r\n\t\t\thours: getHours(),\r\n\t\t};\r\n\r\n\t\treturn _week;\r\n\t};\r\n\t/** */\r\n\tconst getDay = day => {\r\n\t\tlet _date=moment(day.label);\r\n\t\tday.localeFormat = _date.format('LL');\r\n\t\tday.hours = getHours();\r\n\t\tday.events = getEvents(day);\r\n\t\tday.isToday = moment().isSame(day.label, 'day');\r\n\t\tday.weekday=_date.weekday()\r\n\t\treturn day;\r\n\t};\r\n\t/**\r\n\t *\r\n\t */\r\n\tconst getEvents = day => {\r\n\t\tlet evts = events.filter(event => {\r\n\t\t\treturn moment(event.startDate).isSame(day.label, 'day');\r\n\t\t});\r\n\r\n\t\treturn evts.map(event => {\r\n\t\t\tevent.startTime = moment(event.startDate).format('hh:mm A');\r\n\t\t\tevent.endTime = moment(event.endDate).format('hh:mm A');\r\n\t\t\tevent.weekday=moment(day.label).weekday()\r\n\t\t\treturn event;\r\n\t\t});\r\n\t};\r\n\t/**\r\n\t *\r\n\t */\r\n\tconst getHours = () =>\r\n\t\t[...Array(24)].map((x, k) => {\r\n\t\t\treturn {\r\n\t\t\t\tindex: k,\r\n\t\t\t\tlabel: `${k < 10 ? '0' + k : k}:00`,\r\n\t\t\t};\r\n\t\t});\r\n\t/**\r\n\t *\r\n\t * @param {string} type unit (year, month ...)\r\n\t * @param {date} value the date value\r\n\t * @param {boolean} isDefault the default value is the current date\r\n\t * @param {boolean} toggle the view is changed via a toggle button\r\n\t */\r\n\tconst changeView = (type, value, isDefault = true, toggle = false) => {\r\n\t\t/**\r\n\t\t * the following date value by default equals to the current\r\n\t\t * year for example 2020-01-01\r\n\t\t *\r\n\t\t */\r\n\t\tlet date = isDefault ? moment() : moment(value);\r\n\t\t/**\r\n\t\t * the following condition checking is used when we toggle month or day\r\n\t\t * button which should show the current month/day since the default\r\n\t\t * value refers to the year start\r\n\t\t */\r\n\r\n\t\tdate = toggle && !isDefault && !moment().isSame(moment(value), type) ? moment() : date;\r\n\r\n\t\tswitch (type) {\r\n\t\t\tcase 'day':\r\n\t\t\t\tsetSelectedDate({\r\n\t\t\t\t\t...calendar.selectedDate,\r\n\t\t\t\t\ttype: 'day',\r\n\t\t\t\t\tvalue: date.format('LL'),\r\n\t\t\t\t\thours: getHours(),\r\n\t\t\t\t\tevents: getEvents({ label: date }),\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'week':\r\n\t\t\t\tsetSelectedDate({\r\n\t\t\t\t\t...calendar.selectedDate,\r\n\t\t\t\t\ttype: 'week',\r\n\t\t\t\t\tvalue: (date => {\r\n\t\t\t\t\t\tlet _date = date.subtract(date.weekday(), 'day');\r\n\t\t\t\t\t\treturn _date.format('LL');\r\n\t\t\t\t\t})(date), //we refer the week value to its start date\r\n\t\t\t\t\tweek: generateWeek(date),\r\n\t\t\t\t});\r\n\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'month':\r\n\t\t\t\tsetSelectedDate({\r\n\t\t\t\t\t...calendar.selectedDate,\r\n\t\t\t\t\ttype: 'month',\r\n\t\t\t\t\tvalue: date.format('MMMM YYYY'),\r\n\t\t\t\t\tmonth: generateMonth(date),\r\n\t\t\t\t});\r\n\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'year':\r\n\t\t\t\tsetSelectedDate({\r\n\t\t\t\t\t...calendar.selectedDate,\r\n\t\t\t\t\ttype: 'year',\r\n\t\t\t\t\tvalue: date.year().toString(),\r\n\t\t\t\t\tmonths: generateMonths(date.year()),\r\n\t\t\t\t});\r\n\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t};\r\n\tconst gotoNext = () => {\r\n\t\tlet next = moment(calendar.selectedDate.value).add(1, calendar.selectedDate.type + 's');\r\n\r\n\t\tchangeView(calendar.selectedDate.type, next, false);\r\n\t};\r\n\r\n\tconst gotoPrev = () => {\r\n\t\tlet prev = moment(calendar.selectedDate.value).subtract(1, calendar.selectedDate.type + 's');\r\n\t\tchangeView(calendar.selectedDate.type, prev, false);\r\n\t};\r\n\t/****\r\n\t *\r\n\t * return hoook methods\r\n\t */\r\n\treturn { gotoNext, gotoPrev, calendar, changeView };\r\n};\r\n\r\nexport default useCalendar;\r\n","const colors = [\r\n \"#004D40\",\r\n \"#00695C\",\r\n \"#2e003e\",\r\n \"#3d2352\",\r\n \"#05386B\",\r\n \"#379683\",\r\n \"#022140\",\r\n \"#265077\",\r\n \"#0c0023\",\r\n \"#190061\",\r\n \"#38003c\",\r\n \"#e90052\",\r\n \"#330136\",\r\n \"#5E1742\",\r\n \"#191226\",\r\n \"#F2355B\",\r\n \"#702C8E\",\r\n \"#ED1651\",\r\n \"#2A4C59\",\r\n \"#A62D43\",\r\n \"#103754\",\r\n \"#D53D13\",\r\n \"#332851\",\r\n \"#CA3074\",\r\n \"#2D4057\",\r\n \"#4097AA\",\r\n \"#214D72\",\r\n \"#2C7695\",\r\n \"#071E22\",\r\n \"#EE2E31\",\r\n \"#434858\",\r\n \"#FC6453\",\r\n \"#651e3e\",\r\n \"#851e3e\",\r\n \"#0072ff\",\r\n \"#00c6ff\",\r\n \"#34495e\",\r\n \"#41b883\",\r\n \"#2b2d5c\",\r\n \"#3465d8\",\r\n \"#323E40\",\r\n \"#D97D0D\",\r\n \"#1D1D2C\",\r\n \"#E40C2B\",\r\n \"#1D1D2C\",\r\n \"#C3002F\",\r\n \"#306073\",\r\n \"#F2385A\",\r\n \"#0f256e\",\r\n \"#01a168\",\r\n \"#05004E\",\r\n \"#fd5f00\",\r\n \"#3e1063\",\r\n \"#401372\",\r\n \"#2F2440\",\r\n \"#BA0F30\",\r\n ];\r\n\r\n export default colors","\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpringCalendar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpringCalendar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SpringCalendar.vue?vue&type=template&id=3f97cd3a&\"\nimport script from \"./SpringCalendar.vue?vue&type=script&lang=js&\"\nexport * from \"./SpringCalendar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./style.scss?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=ac766c4e&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\r\nimport App from './App.vue'\r\nimport VueComp from '@vue/composition-api'\r\nVue.config.productionTip = false\r\n\r\nVue.use(VueComp)\r\n\r\nnew Vue({\r\n render: h => h(App),\r\n}).$mount('#app')\r\n","import mod from \"-!../../node_modules/vue-style-loader/index.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-3!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-4!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Days.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/vue-style-loader/index.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-3!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-4!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Days.vue?vue&type=style&index=0&lang=scss&\"","// style-loader: Adds some css to the DOM by adding a 88 | -------------------------------------------------------------------------------- /src/components/Day.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 34 | 35 | 50 | -------------------------------------------------------------------------------- /src/components/Days.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 87 | 88 | 122 | -------------------------------------------------------------------------------- /src/components/Fragment.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | 3 | 4 | export const Fragment = { 5 | bind(el, binding, vnode) { 6 | }, 7 | 8 | inserted(el){ 9 | el.replaceWith(...el.childNodes) 10 | }, 11 | 12 | } 13 | 14 | 15 | Vue.directive('fragment', Fragment) -------------------------------------------------------------------------------- /src/components/Month.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 40 | 41 | 43 | -------------------------------------------------------------------------------- /src/components/SpringCalendar.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 192 | 193 | 195 | -------------------------------------------------------------------------------- /src/components/Week.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 118 | 119 | 273 | -------------------------------------------------------------------------------- /src/components/Year.vue: -------------------------------------------------------------------------------- 1 | 8 | 22 | 23 | 25 | -------------------------------------------------------------------------------- /src/components/buttons/NextButton.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/components/buttons/PrevButton.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/components/buttons/index.js: -------------------------------------------------------------------------------- 1 | import NextButton from './NextButton.vue'; 2 | import PrevButton from './PrevButton.vue'; 3 | 4 | export {NextButton, PrevButton}; -------------------------------------------------------------------------------- /src/components/colors.js: -------------------------------------------------------------------------------- 1 | const colors = [ 2 | "#004D40", 3 | "#00695C", 4 | "#2e003e", 5 | "#3d2352", 6 | "#05386B", 7 | "#379683", 8 | "#022140", 9 | "#265077", 10 | "#0c0023", 11 | "#190061", 12 | "#38003c", 13 | "#e90052", 14 | "#330136", 15 | "#5E1742", 16 | "#191226", 17 | "#F2355B", 18 | "#702C8E", 19 | "#ED1651", 20 | "#2A4C59", 21 | "#A62D43", 22 | "#103754", 23 | "#D53D13", 24 | "#332851", 25 | "#CA3074", 26 | "#2D4057", 27 | "#4097AA", 28 | "#214D72", 29 | "#2C7695", 30 | "#071E22", 31 | "#EE2E31", 32 | "#434858", 33 | "#FC6453", 34 | "#651e3e", 35 | "#851e3e", 36 | "#0072ff", 37 | "#00c6ff", 38 | "#34495e", 39 | "#41b883", 40 | "#2b2d5c", 41 | "#3465d8", 42 | "#323E40", 43 | "#D97D0D", 44 | "#1D1D2C", 45 | "#E40C2B", 46 | "#1D1D2C", 47 | "#C3002F", 48 | "#306073", 49 | "#F2385A", 50 | "#0f256e", 51 | "#01a168", 52 | "#05004E", 53 | "#fd5f00", 54 | "#3e1063", 55 | "#401372", 56 | "#2F2440", 57 | "#BA0F30", 58 | ]; 59 | 60 | export default colors -------------------------------------------------------------------------------- /src/components/style.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | // primary: #3041d6; 3 | // --primary: #3a0751; 4 | --primary: #5118ac; 5 | } 6 | 7 | @mixin forSmallScreens($media) { 8 | @media (max-width: $media+px) { 9 | @content; 10 | } 11 | } 12 | 13 | * { 14 | box-sizing: border-box; 15 | } 16 | 17 | body { 18 | color: #666; 19 | font-family: Arial, Helvetica, sans-serif; 20 | height: 100vh; 21 | width: 97vw; 22 | box-sizing: border-box; 23 | margin: 0; 24 | overflow-x: hidden; 25 | } 26 | 27 | ::-webkit-scrollbar { 28 | width: 10px; 29 | border-radius: 5px 30 | } 31 | 32 | ::-webkit-scrollbar-track { 33 | background: inherit; 34 | border-radius: 5px; 35 | } 36 | 37 | ::-webkit-scrollbar-thumb { 38 | background: var(--primary); 39 | border-radius: 5px; 40 | } 41 | 42 | .sc-wrapper { 43 | height: 100%; 44 | width: 100%; 45 | background: rgb(219, 219, 223); 46 | display: grid; 47 | grid-template-columns: 1fr; 48 | grid-template-rows: 64px 1fr; 49 | @include forSmallScreens(680) { 50 | grid-template-rows: 128px 1fr; 51 | } 52 | grid-auto-flow: dense; 53 | grid-template-areas: 'header header' 'content content'; 54 | grid-row-gap: 4px; 55 | // grid-column-gap: 8px; 56 | padding: 20px; 57 | } 58 | 59 | .sc-year-wrapper { 60 | grid-area: header; 61 | width: 100%; 62 | line-height: 64px; 63 | text-align: center; 64 | background: #f3f3f3; 65 | border-radius: 4px; 66 | box-shadow: 1px 1px 5px #aaa; 67 | display: flex; 68 | align-items: center; 69 | justify-content: space-around; 70 | @include forSmallScreens(680) { 71 | flex-direction: column; 72 | } 73 | .sc-year { 74 | display: flex; 75 | justify-content: space-around; 76 | align-items: center; 77 | width: 200px; 78 | box-shadow: 0 1px 2px #aaa; 79 | height: 48px; 80 | border-radius: 4px; 81 | } 82 | .sc-month-year { 83 | width: 300px; 84 | } 85 | .sc-toggle { 86 | display: flex; 87 | /* justify-self: flex-end; */ 88 | // width: 300px; 89 | box-shadow: 0 1px 2px #aaa; 90 | .spring-button { 91 | cursor: pointer; 92 | font-size: 11pt; 93 | padding: 0 30px; 94 | height: 48px; 95 | width: 100px; 96 | @include forSmallScreens(640) { 97 | width: 80px; 98 | } 99 | // letter-spacing: 2px; 100 | line-height: 48px; 101 | text-align: center; 102 | text-decoration: none; 103 | &:first-child { 104 | border-radius: 4px 0 0 4px; 105 | } 106 | &:last-child { 107 | border-radius: 0 4px 4px 0; 108 | } 109 | } 110 | .spring-button-active { 111 | background: var(--primary); 112 | color: #fff; 113 | } 114 | } 115 | } 116 | 117 | .spring-main-content { 118 | justify-content: center; 119 | align-items: center; 120 | .sc-year-months { 121 | /* grid-area: content; 122 | display: flex; 123 | flex-wrap: wrap; 124 | justify-content: space-between; 125 | align-items: center;*/ 126 | display: grid; 127 | grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); 128 | grid-gap: 20px; 129 | } 130 | } 131 | 132 | .sc-month-wrapper { 133 | height: 200px; 134 | display: grid; 135 | grid-template-columns: repeat(7, 1fr); 136 | grid-template-rows: 32px 32px repeat(6, 1fr); 137 | background: #f3f3f3; 138 | border-radius: 4px; 139 | box-shadow: 1px 1px 5px #aaa; 140 | .sc-month { 141 | cursor: pointer; 142 | grid-column-start: 1; 143 | grid-column-end: 8; 144 | font-size: 10pt; 145 | text-align: center; 146 | color: white; 147 | background: var(--primary); 148 | padding: 4px; 149 | text-transform: uppercase; 150 | border-radius: 4px 4px 0 0; 151 | } 152 | .sc-weekday { 153 | font-size: 9pt; 154 | text-align: center; 155 | color: #222; 156 | padding: 4px; 157 | text-transform: uppercase; 158 | } 159 | .sc-day { 160 | font-size: 9pt; 161 | cursor: pointer; 162 | display: flex; 163 | flex-direction: column; 164 | align-items: center!important; 165 | position: relative; 166 | // &:hover { 167 | // color: inherit; 168 | // filter: brightness(120%); 169 | // } 170 | } 171 | .sc-day-in-month { 172 | color: #6d6c6c; 173 | font-weight: bolder; 174 | } 175 | .sc-today { 176 | box-sizing: border-box; 177 | border-bottom: 4px solid #000e9c; 178 | /* color: #46eeb3; */ 179 | /* height: 24px; */ 180 | display: flex; 181 | /* width: 24px; */ 182 | /* border-radius: 50%; */ 183 | position: relative; 184 | justify-content: center; 185 | // align-items: center; 186 | } 187 | } 188 | 189 | .spring-centered-content { 190 | display: flex; 191 | align-items: center; 192 | justify-content: center; 193 | position: relative; 194 | } 195 | 196 | .sc-month-wrapper-extended { 197 | position: relative; 198 | height: 100%; 199 | grid-template-rows: 64px 48px repeat(6, 128px); 200 | grid-column-start: 1; 201 | grid-column-end: 5; 202 | grid-row-start: 2; 203 | grid-row-end: 5; 204 | .sc-month { 205 | height: 100%; 206 | font-size: 12pt; 207 | } 208 | .sc-weekday { 209 | font-size: 11pt; 210 | text-align: center; 211 | color: #222; 212 | padding: 4px; 213 | } 214 | .sc-day { 215 | font-size: 9pt; 216 | text-align: center; 217 | border-top: 1px solid #d3d2d2; 218 | border-right: 1px solid #dfdede; 219 | border-bottom: 1px solid #dfdede; 220 | align-items: flex-start; 221 | padding-top: 4px; 222 | position: relative; 223 | .sc-day-events { 224 | display: grid; 225 | grid-template-rows: 1fr 1fr 1fr; 226 | row-gap: 4px; 227 | // height: 92px; 228 | overflow: hidden; 229 | width: 100%; 230 | .sc-more-events-wrp { 231 | position: absolute; 232 | z-index: 200; 233 | left: 50%; 234 | top: 50%; 235 | .sc-more-events { 236 | overflow-y: auto; 237 | position: absolute; 238 | padding: 24px 12px 12px 12px; 239 | width: 360px; 240 | box-shadow: 1px 4px 19px #aaa; 241 | z-index: 2000; 242 | background: #f3f3f3; 243 | //clip-path: polygon(24% 0, 28% 6%, 100% 6%, 100% 66%, 100% 100%, 56% 100%, 0 100%, 0 55%, 0 6%, 19% 6%); 244 | max-height: 266px; 245 | border: 1px solid var(--primary); 246 | border-radius: 4px; 247 | .sc-events-detail { 248 | display: grid; 249 | grid-gap: 4px; 250 | .sc-events-detail-day { 251 | padding: 10px; 252 | font-size: 12pt; 253 | background: #d2d2d0cc; 254 | position: sticky; 255 | top: -24px; 256 | } 257 | .sc-event-detail { 258 | display: grid; 259 | grid-template-columns: 84px auto; 260 | border-radius: 6px; 261 | box-shadow: 1px 1px 2px #aaa; 262 | .sc-event-detail-time { 263 | padding: 8px; 264 | border-left: 4px var(--primary) solid; 265 | color: var(--primary); 266 | border-radius: 6px; 267 | } 268 | .sc-event-detail-title { 269 | padding: 8px; 270 | display: flex; 271 | align-items: center; 272 | } 273 | } 274 | } 275 | } 276 | } 277 | } 278 | .sc-event { 279 | list-style: none; 280 | color: white; 281 | background: var(--primary); 282 | padding: 4px; 283 | border-radius: 4px; 284 | height: 24px; 285 | width: 100%; 286 | &:empty { 287 | height: 22px; 288 | } 289 | &-more { 290 | width: auto; 291 | &-indicator { 292 | color: red; 293 | } 294 | } 295 | } 296 | } 297 | .sc-today { 298 | box-sizing: border-box; 299 | border-bottom: 4px solid #000e9c; 300 | /* color: #46eeb3; */ 301 | /* height: 24px; */ 302 | display: flex; 303 | /* width: 24px; */ 304 | /* border-radius: 50%; */ 305 | position: relative; 306 | justify-content: center; 307 | align-items: center; 308 | } 309 | } 310 | 311 | .sc-day-in-month { 312 | color: #6d6c6c; 313 | font-weight: bolder; 314 | padding: 4px; 315 | display: flex; 316 | align-items:center; 317 | font-size: 9pt; 318 | } 319 | 320 | 321 | /** 322 | * 323 | * * *********** 324 | * * *********** 325 | * * *********** 326 | * * full day 327 | * * *********** 328 | * * *********** 329 | */ 330 | 331 | @keyframes slideInFromBottom { 332 | 0% { 333 | transform: translateY(100%); 334 | } 335 | 100% { 336 | transform: translateY(0); 337 | } 338 | } 339 | 340 | .sc-full-day { 341 | background-color: transparent; 342 | background-image: linear-gradient(0deg, transparent 24%, #efefef 25%, #efefef 26%, transparent 27%, transparent 74%, #efefef 75%, #efefef 76%, transparent 77%, transparent), linear-gradient(90deg, transparent 24%, #efefef 25%, #efefef 26%, transparent 27%, transparent 74%, #efefef 75%, #efefef 76%, transparent 77%, transparent); 343 | height: 100%; 344 | background-size: 64px 64px; 345 | display: grid; 346 | grid-template-rows: repeat(24, 32px); 347 | grid-template-columns: 50px 40px auto; 348 | &-hour, 349 | &-time-line-item { 350 | grid-column-start: 1; 351 | grid-column-end: 2; 352 | display: flex; 353 | justify-content: center; 354 | align-items: center; 355 | height: 32px; 356 | position: relative; 357 | } 358 | &-time-line-item { 359 | grid-column-start: 2; 360 | grid-column-end: 3; 361 | &:last-child { 362 | .sc-full-day-time-line-circle:empty::before { 363 | height: 0; 364 | } 365 | } 366 | } 367 | &-time-line-circle:empty { 368 | background-color: var(--primary); 369 | width: 16px; 370 | height: 16px; 371 | border-radius: 50%; 372 | display: flex; 373 | justify-content: center; 374 | &::before { 375 | display: block; 376 | content: ''; 377 | box-sizing: border-box; 378 | height: 32px; 379 | width: 2px; 380 | background: var(--primary); 381 | z-index: 2; 382 | } 383 | } 384 | /** full day events **/ 385 | &-events { 386 | grid-area: 1/3/25/4; 387 | display: grid; 388 | width: 100%; 389 | height: 100%; 390 | grid-template-rows: repeat(24, 32px); 391 | grid-column-gap: 2px; 392 | } 393 | &-event { 394 | padding: 10px; 395 | position: relative; 396 | background: var(--primary); 397 | color: white; 398 | border-radius: 0 4px 4px 0; 399 | margin-top: 10px; 400 | border-left: 3px solid #ff304f; 401 | min-height: 40px; 402 | height: calc(100% - 22px); 403 | display: flex; 404 | justify-content: space-between; 405 | align-items: flex-start; 406 | white-space: nowrap; 407 | width: 100%; 408 | box-shadow: 1px 1px 2px #aaa; 409 | animation: 1s ease-out 0s 1 slideInFromBottom; 410 | &-time { 411 | color: white; 412 | font-size: 9pt; 413 | } 414 | &-title { 415 | display: flex; 416 | align-items: center; 417 | } 418 | } 419 | /*******************/ 420 | } 421 | 422 | .sc-day-events-count { 423 | background: #e14444; 424 | color: #ffffff; 425 | width: 16px; 426 | height: 16px; 427 | text-align: center; 428 | line-height: 16px; 429 | border-radius: 50%; 430 | position: absolute; 431 | top: -4px; 432 | right: 0px; 433 | z-index: 5; 434 | box-shadow: 1px 1px 10px rgb(156, 154, 154); 435 | } 436 | 437 | .sc-hours-wrapper { 438 | background-color: transparent; 439 | background-image: linear-gradient(0deg, transparent 24%, #efefef 25%, #efefef 26%, transparent 27%, transparent 74%, #efefef 75%, #efefef 76%, transparent 77%, transparent), linear-gradient(90deg, transparent 24%, #efefef 25%, #efefef 26%, transparent 27%, transparent 74%, #efefef 75%, #efefef 76%, transparent 77%, transparent); 440 | height: 100%; 441 | background-size: 50px 50px; 442 | /*********************/ 443 | grid-column-start: 1; 444 | grid-column-end: 5; 445 | /*************/ 446 | display: grid; 447 | grid-template-columns: 65px 20px repeat(30, 1fr); 448 | grid-template-rows: repeat(24, 50px); 449 | width: 100%; 450 | padding: 8px 12px; 451 | // background: #f3f3f3; 452 | border-radius: 4px; 453 | box-shadow: 1px 1px 5px #aaa; 454 | .sc-hour { 455 | grid-column-start: 1; 456 | grid-column-end: 1; 457 | display: flex; 458 | justify-content: flex-start; 459 | align-items: center; 460 | position: relative; 461 | // border-right: 2px solid var(--primary); 462 | &::before { 463 | display: block; 464 | content: ''; 465 | box-sizing: border-box; 466 | height: 50px; 467 | width: 2px; 468 | background: var(--primary); 469 | position: absolute; 470 | left: 63px; 471 | z-index: 2; 472 | } 473 | &:first-child::before { 474 | top: 25px; 475 | height: 25px; 476 | } 477 | &:last-child::before { 478 | bottom: 25px; 479 | height: 25px; 480 | } 481 | &::after { 482 | display: block; 483 | content: ''; 484 | box-sizing: border-box; 485 | height: 16px; 486 | width: 16px; 487 | background: var(--primary); 488 | border-radius: 50%; 489 | position: absolute; 490 | left: 56px; 491 | border: 2px solid var(--primary); 492 | z-index: 2; 493 | } 494 | } 495 | .sc-event { 496 | grid-column-start: 3; 497 | white-space: nowrap; 498 | height: 100px; 499 | display: flex; 500 | justify-content: center; 501 | // align-items: center; 502 | padding: 10px; 503 | position: relative; 504 | background: var(--primary); 505 | color: white; 506 | border-radius: 0 10px 10px 0; 507 | margin-top: 22px; 508 | box-shadow: 0 2px 4px #aaa; 509 | border-left: 6px solid #ff304f; 510 | /* &::before { 511 | content: "\A"; 512 | border-style: solid; 513 | border-width: 0px 10px 10px 0; 514 | border-color: transparent var(--primary) transparent transparent; 515 | position: absolute; 516 | left: -10px; 517 | top: 0; 518 | }*/ 519 | } 520 | } 521 | 522 | .spring-btn { 523 | outline: none; 524 | background: var(--primary); 525 | border: none; 526 | text-align: center; 527 | height: 32px; 528 | width: 32px; 529 | cursor: pointer; 530 | // box-shadow: 1px 1px 6px rgb(121, 120, 120); 531 | &-rounded { 532 | border-radius: 50%; 533 | } 534 | } 535 | 536 | sup { 537 | position: unset; 538 | } -------------------------------------------------------------------------------- /src/components/useCalendar.js: -------------------------------------------------------------------------------- 1 | import { reactive, watch, onMounted } from '@vue/composition-api'; 2 | import moment from 'moment/moment'; 3 | 4 | const useCalendar = (thisYear, locale, events) => { 5 | /** 6 | * * Main calendar 7 | */ 8 | const calendar = reactive({ 9 | selectedDate: { type: 'year', value: new Date().getFullYear(), default: true }, 10 | 11 | weekdays: [], 12 | weekdaysShort: [], 13 | }); 14 | 15 | /** 16 | * * calendar setters 17 | */ 18 | const setSelectedDate = value => { 19 | calendar.selectedDate = value; 20 | }; 21 | 22 | onMounted(() => { 23 | moment.updateLocale(locale); 24 | calendar.weekdays = moment.weekdays(); 25 | calendar.weekdaysShort = moment.weekdaysShort(); 26 | /* if(startOfWeek){ 27 | calendar.weekdays=[...calendar.weekdays.splice(startOfWeek),...calendar.weekdays] 28 | calendar.weekdaysShort=[...calendar.weekdaysShort.splice(startOfWeek),...calendar.weekdaysShort] 29 | 30 | }*/ 31 | window.moment = moment; 32 | 33 | changeView('year'); 34 | }); 35 | 36 | /**** 37 | * 38 | * * functions 39 | */ 40 | 41 | /** 42 | * 43 | * @param {*} _year is the year string name like '2020' 44 | */ 45 | const generateMonths = _year => { 46 | return moment.months().map((label, i) => { 47 | let index = i + 1; 48 | 49 | return getMonth(_year, index, label); 50 | }); 51 | }; 52 | /** */ 53 | 54 | const generateMonth = _date => { 55 | let index = _date.month() + 1; 56 | let label = moment.months()[_date.month()]; 57 | let _year = _date.year(); 58 | 59 | return getMonth(_year, index, label); 60 | }; 61 | /******* */ 62 | const getMonth = (_year, index, label) => { 63 | let fullLabel = `${_year}-${index}`; 64 | let date = moment(fullLabel); 65 | 66 | let month = { 67 | label, 68 | fullLabel, 69 | index, 70 | weekday: date.weekday(), 71 | weekdaysShort: calendar.weekdaysShort, 72 | weekdays: calendar.weekdays, 73 | }; 74 | 75 | month.days = [...Array(date.daysInMonth())].map((_, dayIndex) => { 76 | return getDay({ 77 | index: dayIndex + 1, 78 | label: `${_year}-${index}-${dayIndex + 1}`, 79 | }); 80 | }); 81 | 82 | return month; 83 | }; 84 | const generateWeek = _date => { 85 | window._date = _date; 86 | 87 | let _week = { 88 | weekdays: calendar.weekdays.map((dw, i) => { 89 | let date = _date.subtract(_date.weekday() - i, 'day').date(); 90 | let _month = _date.month() + 1; 91 | let _year = _date.year(); 92 | let _day = { 93 | index: date, 94 | label: `${_year}-${_month}-${date}`, 95 | }; 96 | 97 | 98 | return { 99 | label: dw, 100 | labelShort: calendar.weekdaysShort[i], 101 | date, 102 | month: _month, 103 | year: _year, 104 | statOfWeek: _date.subtract(_date.weekday(), 'day'), 105 | events:getEvents(_day) 106 | }; 107 | }), 108 | hours: getHours(), 109 | }; 110 | 111 | return _week; 112 | }; 113 | /** */ 114 | const getDay = day => { 115 | let _date=moment(day.label); 116 | day.localeFormat = _date.format('LL'); 117 | day.hours = getHours(); 118 | day.events = getEvents(day); 119 | day.isToday = moment().isSame(day.label, 'day'); 120 | day.weekday=_date.weekday() 121 | return day; 122 | }; 123 | /** 124 | * 125 | */ 126 | const getEvents = day => { 127 | let evts = events.filter(event => { 128 | return moment(event.startDate).isSame(day.label, 'day'); 129 | }); 130 | 131 | return evts.map(event => { 132 | event.startTime = moment(event.startDate).format('hh:mm A'); 133 | event.endTime = moment(event.endDate).format('hh:mm A'); 134 | event.weekday=moment(day.label).weekday() 135 | return event; 136 | }); 137 | }; 138 | /** 139 | * 140 | */ 141 | const getHours = () => 142 | [...Array(24)].map((x, k) => { 143 | return { 144 | index: k, 145 | label: `${k < 10 ? '0' + k : k}:00`, 146 | }; 147 | }); 148 | /** 149 | * 150 | * @param {string} type unit (year, month ...) 151 | * @param {date} value the date value 152 | * @param {boolean} isDefault the default value is the current date 153 | * @param {boolean} toggle the view is changed via a toggle button 154 | */ 155 | const changeView = (type, value, isDefault = true, toggle = false) => { 156 | /** 157 | * the following date value by default equals to the current 158 | * year for example 2020-01-01 159 | * 160 | */ 161 | let date = isDefault ? moment() : moment(value); 162 | /** 163 | * the following condition checking is used when we toggle month or day 164 | * button which should show the current month/day since the default 165 | * value refers to the year start 166 | */ 167 | 168 | date = toggle && !isDefault && !moment().isSame(moment(value), type) ? moment() : date; 169 | 170 | switch (type) { 171 | case 'day': 172 | setSelectedDate({ 173 | ...calendar.selectedDate, 174 | type: 'day', 175 | value: date.format('LL'), 176 | hours: getHours(), 177 | events: getEvents({ label: date }), 178 | }); 179 | break; 180 | case 'week': 181 | setSelectedDate({ 182 | ...calendar.selectedDate, 183 | type: 'week', 184 | value: (date => { 185 | let _date = date.subtract(date.weekday(), 'day'); 186 | return _date.format('LL'); 187 | })(date), //we refer the week value to its start date 188 | week: generateWeek(date), 189 | }); 190 | 191 | break; 192 | case 'month': 193 | setSelectedDate({ 194 | ...calendar.selectedDate, 195 | type: 'month', 196 | value: date.format('MMMM YYYY'), 197 | month: generateMonth(date), 198 | }); 199 | 200 | break; 201 | case 'year': 202 | setSelectedDate({ 203 | ...calendar.selectedDate, 204 | type: 'year', 205 | value: date.year().toString(), 206 | months: generateMonths(date.year()), 207 | }); 208 | 209 | break; 210 | default: 211 | break; 212 | } 213 | }; 214 | const gotoNext = () => { 215 | let next = moment(calendar.selectedDate.value).add(1, calendar.selectedDate.type + 's'); 216 | 217 | changeView(calendar.selectedDate.type, next, false); 218 | }; 219 | 220 | const gotoPrev = () => { 221 | let prev = moment(calendar.selectedDate.value).subtract(1, calendar.selectedDate.type + 's'); 222 | changeView(calendar.selectedDate.type, prev, false); 223 | }; 224 | /**** 225 | * 226 | * return hoook methods 227 | */ 228 | return { gotoNext, gotoPrev, calendar, changeView }; 229 | }; 230 | 231 | export default useCalendar; 232 | -------------------------------------------------------------------------------- /src/components/useContext.js: -------------------------------------------------------------------------------- 1 | import { provide, inject } from '@vue/composition-api'; 2 | 3 | const context = Symbol(); 4 | export function provideContext(methods) { 5 | provide(context, methods); 6 | } 7 | export function useContext() { 8 | const ctx = inject(context); 9 | return ctx; 10 | } 11 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import VueComp from '@vue/composition-api' 4 | Vue.config.productionTip = false 5 | 6 | Vue.use(VueComp) 7 | 8 | new Vue({ 9 | render: h => h(App), 10 | }).$mount('#app') 11 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | publicPath: process.env.NODE_ENV === 'production' ? '/vue-spring-calendar/' : '/', 3 | chainWebpack: config => { 4 | //process.env.NODE_ENV === 'production' ? config.externals(['@vue/composition-api']):{}; 5 | }, 6 | css: { 7 | extract: false, 8 | }, 9 | }; 10 | --------------------------------------------------------------------------------