diff --git a/controllers/total/templates/calendar.pug b/controllers/total/templates/calendar.pug new file mode 100644 index 0000000..18ab27a --- /dev/null +++ b/controllers/total/templates/calendar.pug @@ -0,0 +1,17 @@ +extends ./total.pug + +append css + link(rel='stylesheet', href=getStatic('fullcalendar/fullcalendar.css')) + +block mistake + p. + If you think there is a mistake in this calendar, feel free to send me a mail exaplaining what + are the problems so I can fix it. Thanks! + +block extrajs + script. + window.CALENDAR_URL = "#{calendarUrl}"; + script(src="/static/fullcalendar/fullcalendar.min.js") + script(src="/static/fullcalendar/locales-all.js") + script(src="/static/js/calendar.js") diff --git a/controllers/total/urls.js b/controllers/total/urls.js index 2d8b783..f014601 100644 --- a/controllers/total/urls.js +++ b/controllers/total/urls.js @@ -7,4 +7,6 @@ module.exports = [ url('/total-table-by-course', 'totalTableByCourse', 'totalTableByCourse'), url('/histogram', 'histogram', 'histogram'), url('/histogram-data', 'histogramData', 'histogramData'), + url('/calendar', 'calendar', 'calendar'), + url('/calendar-data', 'calendarData', 'calendarData'), ] diff --git a/controllers/total/views.js b/controllers/total/views.js index 70177d9..f026985 100644 --- a/controllers/total/views.js +++ b/controllers/total/views.js @@ -3,6 +3,16 @@ const cal = require('calendar'); const redirectIfNotLogged = require('auth/views').redirectIfNotLogged; const getUrl = require('create-url').getUrl; +function stdTimezoneOffset(date) { + var jan = new Date(date.getFullYear(), 0, 1); + var jul = new Date(date.getFullYear(), 6, 1); + return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); +} + +function isDstObserved(date) { + return date.getTimezoneOffset() < stdTimezoneOffset(date); +} + function compareStrings(a, b) { if (a < b) return -1; @@ -193,3 +203,48 @@ module.exports.histogramData = function(req, res, render, next) { }); } + +module.exports.calendar = redirectIfNotLogged('/calendar', function(req, res, render) { + res.locals.calendarUrl = getUrl('calendarData'); + render('calendar.pug'); +}); + +module.exports.calendarData = function(req, res, render) { + + if (req.session.user === undefined) { + res.status(404); + + res.setHeader('Content-Type', 'text/html'); + + res.render(config.BASE_DIR + '/templates/404.pug', res.locals, function(err, result) { + if (err) + console.log(err); + res.send(result); + }); + return; + } + + cal.getCalendar(req.session.user, new Date(2000, 1, 1), new Date(3000, 1, 1), (calendar) => { + let events = []; + + for (let event of calendar.events) { + if (isDstObserved(event.startTime)) { + event.startTime.setTime(event.startTime.getTime() + (60 * 60 * 1000)); + } + + if (isDstObserved(event.finishTime)) { + event.finishTime.setTime(event.finishTime.getTime() + (60 * 60 * 1000)); + } + + events.push({ + title: event.name, + start: event.startTime, + end: event.finishTime, + }); + } + + res.send(JSON.stringify(events)); + }); + + +} diff --git a/static/fullcalendar-4.0.0-alpha.2.zip b/static/fullcalendar-4.0.0-alpha.2.zip new file mode 100644 index 0000000..d74b01f Binary files /dev/null and b/static/fullcalendar-4.0.0-alpha.2.zip differ diff --git a/static/fullcalendar/fullcalendar.css b/static/fullcalendar/fullcalendar.css new file mode 100644 index 0000000..cbdd981 --- /dev/null +++ b/static/fullcalendar/fullcalendar.css @@ -0,0 +1,1436 @@ +/*! + * FullCalendar v4.0.0-alpha.2 + * Docs & License: https://fullcalendar.io/ + * (c) 2018 Adam Shaw + */ +.fc { + direction: ltr; + text-align: left; } + +.fc-rtl { + text-align: right; } + +body .fc { + /* extra precedence to overcome jqui */ + font-size: 1em; } + +/* Colors +--------------------------------------------------------------------------------------------------*/ +.fc-highlight { + /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; } + +.fc-bgevent { + /* default look for background events */ + background: #8fdf82; + opacity: .3; } + +.fc-nonbusiness { + /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #d7d7d7; } + +/* Buttons (styled ");var D=function(){var e=a.getClass("stateActive"),t=a.getClass("stateDisabled");return!(e&&S.classList.contains(e)||t&&S.classList.contains(t))};S.addEventListener("click",function(e){var t=a.getClass("stateDisabled"),n=a.getClass("stateHover");t&&S.classList.contains(t)||(g(e),!D()&&n&&S.classList.remove(n))}),S.addEventListener("mousedown",function(e){var t=a.getClass("stateDown");D()&&t&&S.classList.add(t)}),S.addEventListener("mouseup",function(e){var t=a.getClass("stateDown");t&&S.classList.remove(t)}),S.addEventListener("mouseenter",function(e){var t=a.getClass("stateHover");D()&&t&&S.classList.add(t)}),S.addEventListener("mouseleave",function(e){var t=a.getClass("stateHover"),n=a.getClass("stateDown");t&&S.classList.remove(t),n&&S.classList.remove(n)}),p.push(S)}}),h&&p.length>0){var g=a.getClass("cornerLeft"),v=a.getClass("cornerRight");g&&p[0].classList.add(g),v&&p[p.length-1].classList.add(v)}if(p.length>1){s=document.createElement("div");var y=a.getClass("buttonGroup");h&&y&&s.classList.add(y),o.appendToElement(s,p),u.appendChild(s)}else o.appendToElement(u,p)}),u},t.prototype.updateTitle=function(e){o.findElements(this.el,"h2").forEach(function(t){t.innerText=e})},t.prototype.activateButton=function(e){var t=this;o.findElements(this.el,".fc-"+e+"-button").forEach(function(e){e.classList.add(t.calendar.theme.getClass("stateActive"))})},t.prototype.deactivateButton=function(e){var t=this;o.findElements(this.el,".fc-"+e+"-button").forEach(function(e){e.classList.remove(t.calendar.theme.getClass("stateActive"))})},t.prototype.disableButton=function(e){var t=this;o.findElements(this.el,".fc-"+e+"-button").forEach(function(e){e.disabled=!0,e.classList.add(t.calendar.theme.getClass("stateDisabled"))})},t.prototype.enableButton=function(e){var t=this;o.findElements(this.el,".fc-"+e+"-button").forEach(function(e){e.disabled=!1,e.classList.remove(t.calendar.theme.getClass("stateDisabled"))})},t.prototype.getViewsWithButtons=function(){return this.viewsWithButtons},t}(a.default);t.default=s},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),i=n(2),o=n(32),a=n(41),s=function(){function e(e){this.overrides=r.assignTo({},e),this.dynamicOverrides={},this.compute()}return e.prototype.add=function(e,t){this.dynamicOverrides[e]=t,this.compute()},e.prototype.compute=function(){var e,t,n,r;e=i.firstDefined(this.dynamicOverrides.locale,this.overrides.locale,o.globalDefaults.locale),t=a.getLocale(e).options,n=i.firstDefined(this.dynamicOverrides.dir,this.overrides.dir,t.dir),r="rtl"===n?o.rtlDefaults:{},this.dirDefaults=r,this.localeDefaults=t,this.computed=o.mergeOptions([o.globalDefaults,r,t,this.overrides,this.dynamicOverrides])},e}();t.default=s},function(e,t,n){function r(e,t){a[e]=t}function i(e){return new a[e]}Object.defineProperty(t,"__esModule",{value:!0});var o=n(6),a={};t.registerCalendarSystem=r,t.createCalendarSystem=i,r("gregory",function(){function e(){}return e.prototype.getMarkerYear=function(e){return e.getUTCFullYear()},e.prototype.getMarkerMonth=function(e){return e.getUTCMonth()},e.prototype.getMarkerDay=function(e){return e.getUTCDate()},e.prototype.arrayToMarker=function(e){return o.arrayToUtcDate(e)},e.prototype.markerToArray=function(e){return o.dateToUtcArray(e)},e}())},function(e,t,n){function r(e,t,n){n.publiclyTrigger(t.type,t);var r=i(e.dateProfile,t),f=d.default(e.eventSources,t,r,n);return{dateProfile:r,eventSources:f,eventStore:c.default(e.eventStore,t,f,r,n),eventUis:e.eventUis,businessHours:e.businessHours,dateSelection:o(e.dateSelection,t,n),eventSelection:a(e.eventSelection,t),eventDrag:s(e.eventDrag,t,f,n),eventResize:l(e.eventResize,t,f,n),eventSourceLoadingLevel:u(f),loadingLevel:u(f)}}function i(e,t){switch(t.type){case"SET_DATE_PROFILE":return e&&f.isDateProfilesEqual(e,t.dateProfile)?e:t.dateProfile;default:return e}}function o(e,t,n){switch(t.type){case"SELECT_DATES":return t.selection;case"UNSELECT_DATES":return null;default:return e}}function a(e,t){switch(t.type){case"SELECT_EVENT":return t.eventInstanceId;case"UNSELECT_EVENT":return"";default:return e}}function s(e,t,n,r){switch(t.type){case"SET_EVENT_DRAG":var i=t.state,o=p.computeEventDefUis(i.mutatedEvents.defs,n,r.view?r.view.options:{});return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg,eventUis:o};case"UNSET_EVENT_DRAG":return null;default:return e}}function l(e,t,n,r){switch(t.type){case"SET_EVENT_RESIZE":var i=t.state,o=p.computeEventDefUis(i.mutatedEvents.defs,n,r.view?r.view.options:{});return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg,eventUis:o};case"UNSET_EVENT_RESIZE":return null;default:return e}}function u(e){var t=0;for(var n in e)e[n].isFetching&&t++;return t}Object.defineProperty(t,"__esModule",{value:!0});var d=n(180),c=n(181),f=n(57),p=n(28);t.default=r},function(e,t,n){function r(e,t,n,r){switch(t.type){case"ADD_EVENT_SOURCES":return i(e,t.sources,n?n.activeRange:null,r);case"REMOVE_EVENT_SOURCE":return o(e,t.sourceId);case"SET_DATE_PROFILE":return a(e,t.dateProfile.activeRange,r);case"FETCH_EVENT_SOURCES":case"CHANGE_TIMEZONE":return l(e,t.sourceIds?p.arrayToHash(t.sourceIds):c(e),n?n.activeRange:null,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return d(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}}function i(e,t,n,r){for(var i={},o=0,s=t;oe.fetchRange.end):!e.latestFetchId}function l(e,t,n,r){var i={};for(var o in e){var a=e[o];t[o]?i[o]=u(a,n,r):i[o]=a}return i}function u(e,t,n){var r=f.getEventSourceDef(e.sourceDefId),i=String(g++);return r.fetch({eventSource:e,calendar:n,range:t},function(r){var o,a,s=r.rawEvents,l=n.opt("eventSourceSuccess");e.success&&(a=e.success(s,r.response)),l&&(o=l(s,r.response)),s=a||o||s,n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:i,fetchRange:t,rawEvents:s})},function(r){var o=n.opt("eventSourceFailure");h.warn(r.message,r),e.failure&&e.failure(r),o&&o(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:i,fetchRange:t,error:r})}),p.assignTo({},e,{isFetching:!0,latestFetchId:i})}function d(e,t,n,r){var i,o=e[t];return o&&n===o.latestFetchId?p.assignTo({},e,(i={},i[t]=p.assignTo({},o,{isFetching:!1,fetchRange:r}),i)):e}function c(e){return p.filterHash(e,function(e){return f.doesSourceNeedRange(e)})}Object.defineProperty(t,"__esModule",{value:!0});var f=n(22),p=n(4),h=n(2);t.default=r;var g=0},function(e,t,n){function r(e,t,n,r,d){switch(t.type){case"RECEIVE_EVENTS":return i(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,d);case"ADD_EVENTS":return o(e,t.eventStore,r?r.activeRange:null,d);case"MERGE_EVENTS":return f.mergeEventStores(e,t.eventStore);case"SET_DATE_PROFILE":return r?f.expandRecurring(e,r.activeRange,d):e;case"CHANGE_TIMEZONE":return a(e,t.oldDateEnv,d.dateEnv);case"MUTATE_EVENTS":return s(e,t.instanceId,t.mutation,d);case"REMOVE_EVENT_INSTANCES":return u(e,t.instances);case"REMOVE_EVENT_DEF":return f.filterEventStoreDefs(e,function(e){return e.defId!==t.defId});case"REMOVE_EVENT_SOURCE":return l(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return f.filterEventStoreDefs(e,function(e){return!e.sourceId});case"REMOVE_ALL_EVENTS":return f.createEmptyEventStore();default:return e}}function i(e,t,n,r,i,o){if(t&&n===t.latestFetchId){var a=f.parseEvents(f.transformRawEvents(i,t,o),t.sourceId,o);return r&&(a=f.expandRecurring(a,r,o)),f.mergeEventStores(l(e,t.sourceId),a)}return e}function o(e,t,n,r){return n&&(t=f.expandRecurring(t,n,r)),f.mergeEventStores(e,t)}function a(e,t,n){var r=e.defs,i=d.mapHash(e.instances,function(e){var i=r[e.defId];return i.allDay||i.recurringDef?e:d.assignTo({},e,{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})});return{defs:r,instances:i}}function s(e,t,n,r){var i=f.getRelevantEvents(e,t);return i=c.applyMutationToEventStore(i,n,r),f.mergeEventStores(e,i)}function l(e,t){return f.filterEventStoreDefs(e,function(e){return e.sourceId!==t})}function u(e,t){return{defs:e.defs,instances:d.filterHash(e.instances,function(e){return!t[e.instanceId]})}}Object.defineProperty(t,"__esModule",{value:!0});var d=n(4),c=n(55),f=n(14);t.default=r},function(e,t,n){function r(e,t){return a.parseEvents(i(e),"",t)}function i(e){var t;return t=!0===e?[{}]:Array.isArray(e)?e.filter(function(e){return e.daysOfWeek}):"object"==typeof e&&e?[e]:[],t=t.map(function(e){return o.assignTo({},s,e)})}Object.defineProperty(t,"__esModule",{value:!0});var o=n(4),a=n(14),s={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],rendering:"inverse-background",classNames:"fc-nonbusiness",groupId:"_businessHours"};t.parseBusinessHours=r},function(e,t,n){function r(e,t){var n=u.parseViewConfigs(e),r=u.parseViewConfigs(t.overrides.views),a=o.compileViewDefs(n,r);return s.mapHash(a,function(e){return i(e,r,t)})}function i(e,t,n){var r=e.overrides.duration||e.defaults.duration||n.dynamicOverrides.duration||n.overrides.duration,i=null,o="",u="",d={};if(r&&(i=a.createDuration(r))){var c=a.greatestDurationDenominator(i,!a.getWeeksFromInput(r));o=c.unit,1===c.value&&(u=o,d=t[o]?t[o].options:{})}var f=function(t){var n=t.buttonText||{};return null!=n[e.type]?n[e.type]:null!=n[u]?n[u]:void 0};return{type:e.type,class:e.class,duration:i,durationUnit:o,singleUnit:u,options:s.assignTo({},l.globalDefaults,e.defaults,n.dirDefaults,n.localeDefaults,n.overrides,d,e.overrides,n.dynamicOverrides),buttonTextOverride:f(n.dynamicOverrides)||f(n.overrides)||e.overrides.buttonText,buttonTextDefault:f(n.localeDefaults)||f(n.dirDefaults)||e.defaults.buttonText||f(l.globalDefaults)||e.type}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(184),a=n(10),s=n(4),l=n(32),u=n(185);t.buildViewSpecs=r},function(e,t,n){function r(e,t){var n,r={};for(n in e)i(n,r,e,t);for(n in t)i(n,r,e,t);return r}function i(e,t,n,r){if(t[e])return t[e];var i=o(e,t,n,r);return i&&(t[e]=i),i}function o(e,t,n,r){var o=n[e],l=r[e],u=function(e){return o&&null!==o[e]?o[e]:l&&null!==l[e]?l[e]:null},d=u("class"),c=u("superType");!c&&d&&(c=a(d,r)||a(d,n));var f=c?i(c,t,n,r):null;return!d&&f&&(d=f.class),d?{type:e,class:d,defaults:s.assignTo({},f?f.defaults:{},o?o.options:{}),overrides:s.assignTo({},f?f.overrides:{},l?l.options:{})}:null}function a(e,t){var n=Object.getPrototypeOf(e.prototype);for(var r in t){var i=t[r];if(i.class&&i.class.prototype===n)return r}return""}Object.defineProperty(t,"__esModule",{value:!0});var s=n(4);t.compileViewDefs=r},function(e,t,n){function r(e){return a.mapHash(e,i)}function i(e){"function"==typeof e&&(e={class:e});var t={},n=o.refineProps(e,s,{},t);return{superType:n.type,class:n.class,options:t}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(2),a=n(4);t.parseViewConfigs=r;var s={type:String,class:null}},function(e,t,n){function r(e){var t,n,r,i=[];for(t=0;tt.top&&e.top
'+(t?'
'+d.htmlEscape(t)+"
":"")+(o.title?'
'+d.htmlEscape(o.title)+"
":"")+'
'+(c?'
':"")+""},t.prototype.computeFgSegHorizontals=function(e){var t,n,a;if(e=this.sortEventSegs(e),t=r(e),i(t),n=t[0]){for(a=0;a
');t&&t.row===o?a=t.el:(a=e.querySelector(".fc-content-skeleton tbody"))||(a=e.querySelector(".fc-content-skeleton table")),s=a.getBoundingClientRect().top-e.getBoundingClientRect().top,l.style.top=s+"px",l.querySelector("table").appendChild(n[o].tbodyEl),e.appendChild(l),r.push(l)}),r},t}(o.default);t.default=a},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),i=n(3),o=n(59),a=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.fillSegTag="td",t}return r.__extends(t,e),t.prototype.attachSegEls=function(e,t){var n,r,i,o=[];for(n=0;n
'),o=r.getElementsByTagName("tr")[0],s>0&&o.appendChild(i.createElement("td",{colSpan:s})),t.el.colSpan=l-s,o.appendChild(t.el),l'+a.htmlEscape(n)+'
',this.segContainerEl=this.el.querySelector(".fc-event-container")},t.prototype.prepareHits=function(){var e=u.computeRect(this.el);this.width=e.right-e.left,this.height=e.bottom-e.top,this.offsetTracker=new l.default(this.el)},t.prototype.releaseHits=function(){this.offsetTracker.destroy()},t.prototype.queryHit=function(e,t){var n=this.offsetTracker.computeLeft(),r=this.offsetTracker.computeTop(),i={left:n,right:n+this.width,top:r,bottom:r+this.height};return d.pointInsideRect({left:e,top:t},i)?{component:this,dateSpan:{allDay:!0,range:{start:this.date,end:c.addDays(this.date,1)}},dayEl:this.el,rect:i,layer:1}:null},t}(i.default);t.default=f;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r.__extends(t,e),t.prototype.renderFgSegs=function(e){for(var t=0,n=e;t'+(this.displayEventTime?''+(t||"")+"":"")+'"+i.htmlEscape(l.title||"")+""},t.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:"short"}},t}(o.default);t.default=s},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(30),i=n(152),o=n(32),a=function(){function e(e,t){void 0===t&&(t={});var n=this;this.handlePointerDown=function(e){var t=n.dragging,r=n.settings,i=r.minDistance,a=r.longPressDelay;t.minDistance=null!=i?i:e.isTouch?0:o.globalDefaults.eventDragMinDistance,t.delay=e.isTouch?null!=a?a:o.globalDefaults.longPressDelay:0},this.handleDragStart=function(e){e.isTouch&&n.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&n.dragging.mirror.getMirrorEl().classList.add("fc-selected")},this.settings=t;var a=this.dragging=new r.default(e);a.touchScrollAllowed=!1,null!=t.itemSelector&&(a.pointer.selector=t.itemSelector),null!=t.appendTo&&(a.mirror.parentNode=t.appendTo),a.emitter.on("pointerdown",this.handlePointerDown),a.emitter.on("dragstart",this.handleDragStart),new i.default(a,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}();t.default=a},function(e,t,n){function r(e){var t={},n=o.refineProps(e,a,s,t);return n.leftoverProps=t,n}Object.defineProperty(t,"__esModule",{value:!0});var i=n(10),o=n(2),a={time:i.createDuration,duration:i.createDuration,create:Boolean,sourceId:String},s={create:!0};t.parseDragMeta=r},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(152),i=n(198),o=function(){function e(e,t){var n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};var o=this.dragging=new i.default(n);"string"==typeof t.itemSelector?o.pointer.selector=t.itemSelector:n===document&&(o.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(o.mirrorSelector=t.mirrorSelector),new r.default(o,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}();t.default=o},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),i=n(40),o=n(54),a=function(e){function t(t){var n=e.call(this)||this;n.shouldIgnoreMove=!1,n.mirrorSelector="",n.currentMirrorEl=null,n.handlePointerDown=function(e){n.emitter.trigger("pointerdown",e),n.shouldIgnoreMove||n.emitter.trigger("dragstart",e)},n.handlePointerMove=function(e){n.shouldIgnoreMove||n.emitter.trigger("dragmove",e)},n.handlePointerUp=function(e){n.emitter.trigger("pointerup",e),n.shouldIgnoreMove||n.emitter.trigger("dragend",e)};var r=n.pointer=new i.default(t);return r.emitter.on("pointerdown",n.handlePointerDown),r.emitter.on("pointermove",n.handlePointerMove),r.emitter.on("pointerup",n.handlePointerUp),n}return r.__extends(t,e),t.prototype.destroy=function(){this.pointer.destroy()},t.prototype.setIgnoreMove=function(e){this.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{var t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}},t}(o.default);t.default=a},function(e,t,n){function r(e,t){void 0===t&&(t={});var n=o(t),r=l.createFormatter(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""}function i(e,t,n){var r=o("object"==typeof n&&n?n:{}),i=l.createFormatter(n,d.globalDefaults.defaultRangeSeparator),a=r.createMarkerMeta(e),s=r.createMarkerMeta(t);return a&&s?r.formatRange(a.marker,s.marker,i,{forcedStartTzo:a.forcedTzo,forcedEndTzo:s.forcedTzo,isEndExclusive:n.isEndExclusive}):""}function o(e){var t=e.locale||d.globalDefaults.locale;return e=s.assignTo({timeZone:d.globalDefaults.timeZone,timeZoneImpl:d.globalDefaults.timeZoneImpl,calendarSystem:"gregory"},e,{locale:u.getLocale(t)}),new a.DateEnv(e)}Object.defineProperty(t,"__esModule",{value:!0});var a=n(56),s=n(4),l=n(8),u=n(41),d=n(32);t.formatDate=r,t.formatRange=i},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(48),i=n(137),o=n(138),a=n(201),s=n(202);r.defineThemeSystem("standard",i.default),r.defineThemeSystem("jquery-ui",o.default),r.defineThemeSystem("bootstrap3",a.default),r.defineThemeSystem("bootstrap4",s.default)},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),i=n(27),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r.__extends(t,e),t}(i.default);t.default=o,o.prototype.classes={widget:"fc-bootstrap3",tableGrid:"table-bordered",tableList:"table",tableListHeading:"active",buttonGroup:"btn-group",button:"btn btn-default",stateActive:"active",stateDisabled:"disabled",today:"alert alert-info",popover:"panel panel-default",popoverHeader:"panel-heading",popoverContent:"panel-body",headerRow:"panel-default",dayRow:"panel-default",listView:"panel panel-default"},o.prototype.baseIconClass="glyphicon",o.prototype.iconClasses={close:"glyphicon-remove",prev:"glyphicon-chevron-left",next:"glyphicon-chevron-right",prevYear:"glyphicon-backward",nextYear:"glyphicon-forward"},o.prototype.iconOverrideOption="bootstrapGlyphicons",o.prototype.iconOverrideCustomButtonOption="bootstrapGlyphicon",o.prototype.iconOverridePrefix="glyphicon-"},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),i=n(27),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r.__extends(t,e),t}(i.default);t.default=o,o.prototype.classes={widget:"fc-bootstrap4",tableGrid:"table-bordered",tableList:"table",tableListHeading:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",stateActive:"active",stateDisabled:"disabled",today:"alert alert-info",popover:"card card-primary",popoverHeader:"card-header",popoverContent:"card-body",headerRow:"table-bordered",dayRow:"table-bordered",listView:"card card-primary"},o.prototype.baseIconClass="fa",o.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},o.prototype.iconOverrideOption="bootstrapFontAwesome",o.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",o.prototype.iconOverridePrefix="fa-"},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(43),i=n(63),o=n(150);r.defineView("basic",i.default),r.defineView("basicDay",{type:"basic",duration:{days:1}}),r.defineView("basicWeek",{type:"basic",duration:{weeks:1}}),r.defineView("month",{class:o.default,duration:{months:1},fixedWeekCount:!0})},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(43),i=n(146);r.defineView("agenda",{class:i.default,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0}),r.defineView("agendaDay",{type:"agenda",duration:{days:1}}),r.defineView("agendaWeek",{type:"agenda",duration:{weeks:1}})},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(43),i=n(151);r.defineView("list",{class:i.default,listDayFormat:{month:"long",day:"numeric",year:"numeric"}}),r.defineView("listDay",{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}}),r.defineView("listWeek",{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDayAltFormat:{month:"long",day:"numeric",year:"numeric"}}),r.defineView("listMonth",{type:"list", +duration:{month:1},listDayAltFormat:{weekday:"long"}}),r.defineView("listYear",{type:"list",duration:{year:1},listDayAltFormat:{weekday:"long"}})},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(22).registerEventSourceDef({ignoreRange:!0,parseMeta:function(e){return Array.isArray(e)?e:Array.isArray(e.events)?e.events:null},fetch:function(e,t){t({rawEvents:e.eventSource.meta})}})},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(208);n(22).registerEventSourceDef({parseMeta:function(e){return"function"==typeof e?e:"function"==typeof e.events?e.events:null},fetch:function(e,t,n){var i=e.calendar.dateEnv,o=e.eventSource.meta;r.unpromisify(o.bind(null,{start:i.toDate(e.range.start),end:i.toDate(e.range.end),startStr:i.formatIso(e.range.start),endStr:i.formatIso(e.range.end),timeZone:i.timeZone}),function(e){t({rawEvents:e})},n)}})},function(e,t){function n(e,t,n){var r=!1,i=function(){r||(r=!0,t.apply(this,arguments))},o=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(i,o);a&&"function"==typeof a.then&&a.then(i,o)}Object.defineProperty(t,"__esModule",{value:!0}),t.unpromisify=n},function(e,t,n){function r(e,t,n){var r,i,a,s,l=n.dateEnv,u={};return r=e.startParam,null==r&&(r=n.opt("startParam")),i=e.endParam,null==i&&(i=n.opt("endParam")),a=e.timeZoneParam,null==a&&(a=n.opt("timeZoneParam")),s="function"==typeof e.extraData?e.extraData():e.extraData||{},o.assignTo(u,s),u[r]=l.formatIso(t.start),u[i]=l.formatIso(t.end),"local"!==l.timeZone&&(u[a]=l.timeZone),u}Object.defineProperty(t,"__esModule",{value:!0});var i=n(64),o=n(4);n(22).registerEventSourceDef({parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraData:e.data,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}},fetch:function(e,t,n){var o,a=e.eventSource.meta,s=r(a,e.range,e.calendar);o="GET"===a.method?i.get(a.url).query(s):i(a.method,a.url).send(s),o.end(function(e,r){var i;e?n(e):(r.body?i=r.body:r.text&&(i=JSON.parse(r.text)),i?t({rawEvents:i,response:r}):n({message:"Invalid JSON response",response:r}))})}})},function(e,t,n){function r(e,t,n,r,o){r=u.intersectRanges(r,n);for(var s=e?a.arrayToHash(e):null,l=i.startOfDay(r.start),d=r.end,c=[];lpenuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"})},105:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("is",{week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekLabel:"Vika",allDayHtml:"Allan
daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"})},106:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("it",{week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Tutto il
giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"})},107:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ja",{buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekLabel:"週",allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"},noEventsMessage:"イベントが表示されないように"})},108:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ka",{week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekLabel:"კვ",allDayText:"მთელი დღე",eventLimitText:function(e){return"+ კიდევ "+e},noEventsMessage:"ღონისძიებები არ არის"})},109:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("kk",{week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekLabel:"Не",allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"Көрсету үшін оқиғалар жоқ"})},110:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ko",{buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekLabel:"주",allDayText:"종일",eventLimitText:"개",noEventsMessage:"일정이 없습니다"})},111:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("lb",{week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekLabel:"W",allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"})},112:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("lt",{week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekLabel:"SAV",allDayText:"Visą dieną",eventLimitText:"daugiau",noEventsMessage:"Nėra įvykių rodyti"})},113:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("lv",{week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekLabel:"Ned.",allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e},noEventsMessage:"Nav notikumu"})},114:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("mk",{buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekLabel:"Сед",allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Нема настани за прикажување"})},115:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ms",{week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})},116:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("nb",{week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekLabel:"Uke",allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"})},117:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("nl",{week:{dow:1,doy:4},buttonText:{prev:"Voorgaand",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})},118:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("nn",{week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekLabel:"Veke",allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"})},119:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("pl",{week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekLabel:"Tydz",allDayText:"Cały dzień",eventLimitText:"więcej",noEventsMessage:"Brak wydarzeń do wyświetlenia"})},120:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("pt-br",{buttonText:{prevText:"Anterior",nextText:"Próximo",currentText:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},weekLabel:"Sm",allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"})},121:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("pt",{week:{dow:1,doy:4},buttonText:{prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekLabel:"Sem",allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"})},122:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ro",{week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekLabel:"Săpt",allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afișat"})},123:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ru",{week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekLabel:"Нед",allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Нет событий для отображения"})},124:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("sk",{week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekLabel:"Ty",allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"})},125:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("sl",{week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekLabel:"Teden",allDayText:"Ves dan",eventLimitText:"več",noEventsMessage:"Ni dogodkov za prikaz"})},126:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("sq",{week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekLabel:"Ja",allDayHtml:"Gjithë
ditën",eventLimitText:function(e){return"+më tepër "+e},noEventsMessage:"Nuk ka evente për të shfaqur"})},127:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("sr-cyrl",{week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekLabel:"Сед",allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Нема догађаја за приказ"})},128:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("sr",{week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekLabel:"Sed",allDayText:"Cеo dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nеma događaja za prikaz"})},129:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("sv",{week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekLabel:"v.",allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"})},130:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("th",{buttonText:{prev:"ย้อน",next:"ถัดไป",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีกิจกรรมที่จะแสดง"})},131:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("tr",{week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekLabel:"Hf",allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Herhangi bir etkinlik görüntülemek için"})},132:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("uk",{week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekLabel:"Тиж",allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Немає подій для відображення"})},133:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("vi",{week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekLabel:"Tu",allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sự kiện để hiển thị"})},134:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("zh-cn",{week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekLabel:"周",allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"},noEventsMessage:"没有事件显示"})},135:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("zh-tw",{buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekLabel:"周",allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"})},394:function(e,t,n){n(72),n(73),n(74),n(75),n(76),n(77),n(78),n(79),n(80),n(81),n(82),n(83),n(84),n(85),n(86),n(87),n(88),n(89),n(90),n(91),n(92),n(93),n(94),n(95),n(96),n(97),n(98),n(99),n(100),n(101),n(102),n(103),n(104),n(105),n(106),n(107),n(108),n(109),n(110),n(111),n(112),n(113),n(114),n(115),n(116),n(117),n(118),n(119),n(120),n(121),n(122),n(123),n(124),n(125),n(126),n(127),n(128),n(129),n(130),n(131),n(132),n(133),n(134),e.exports=n(135)},72:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("af",{week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenisse nie"})},73:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ar-dz",{week:{dow:0,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},74:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ar-kw",{week:{dow:0,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},75:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ar-ly",{week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},76:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ar-ma",{week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},77:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ar-sa",{week:{dow:0,doy:6},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},78:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ar-tn",{week:{dow:1,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},79:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ar",{week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},80:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("bg",{week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"Няма събития за показване"})},81:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("bs",{week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekLabel:"Sed",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikazivanje"})},82:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("ca",{week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekLabel:"Set",allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"})},83:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("cs",{week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekLabel:"Týd",allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"})},84:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("da",{week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"Idag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekLabel:"Uge",allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"})},85:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("de",{week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekLabel:"KW",allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})},86:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("el",{week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekLabel:"Εβδ",allDayText:"Ολοήμερο",eventLimitText:"περισσότερα",noEventsMessage:"Δεν υπάρχουν γεγονότα για να εμφανιστεί"})},87:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("en-au",{week:{dow:1,doy:4}})},88:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("en-gb",{week:{dow:1,doy:4}})},89:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("en-nz",{week:{dow:1,doy:4}})},90:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("es",{week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo
el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})},91:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("es",{week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo
el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})},92:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("et",{week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekLabel:"näd",allDayText:"Kogu päev",eventLimitText:function(e){return"+ veel "+e},noEventsMessage:"Kuvamiseks puuduvad sündmused"})},93:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("eu",{week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekLabel:"As",allDayHtml:"Egun
osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"})},94:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("fa",{week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"قبلی",nex:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekLabel:"هف",allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"})},95:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("fi",{week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekLabel:"Vk",allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"})},96:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("fr",{buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})},97:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("fr-ch",{week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sm",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})},98:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("fr",{week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})},99:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(0).defineLocale("gl",{week:{dow:1,doy:4},buttonText:{prevText:"Ant",nextText:"Seg",currentText:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekLabel:"Sm",allDayHtml:"Todo
o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"})}})}); \ No newline at end of file diff --git a/static/js/calendar.js b/static/js/calendar.js new file mode 100644 index 0000000..2dde24d --- /dev/null +++ b/static/js/calendar.js @@ -0,0 +1,49 @@ +var loadingDiv = document.getElementById('loading'); +var errorDiv = document.getElementById('error'); +var resultDiv = document.getElementById('result'); +const timeout = 10000; +var emptyCoursesShown = false; +var calendar; + +function getTable() { + // Send XHR to totalTable + loadingDiv.style.display = ""; + errorDiv.style.display = "none"; + + let xhr = new XMLHttpRequest(); + xhr.timeout = timeout; + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + if (xhr.status === 200) { + let events = JSON.parse(xhr.responseText); + setData(events); + } else { + setError(); + } + } + }; + xhr.open('GET', CALENDAR_URL, true); + xhr.send(); +} + +function setData(events) { + console.log(events); + loadingDiv.style.display = "none"; + errorDiv.style.display = "none"; + calendar = new FullCalendar.Calendar(resultDiv, { + events: events, + defaultView: 'agendaWeek', + minTime: "07:00:00", + maxTime: "19:00:00", + timeZone: 'UTC', + }); + calendar.render(); +} + +function setError() { + loadingDiv.style.display = "none"; + errorDiv.style.display = ""; +} + +document.getElementById('tryAgain').addEventListener('click', getTable); +getTable(); diff --git a/templates/base.pug b/templates/base.pug index 9079736..d4b30d2 100644 --- a/templates/base.pug +++ b/templates/base.pug @@ -31,6 +31,8 @@ html a.nav-link(href=getUrl("total")) Total li.nav-item a.nav-link(href=getUrl("totalByCourse")) Total by course + li.nav-item + a.nav-link(href=getUrl("calendar")) Calendar li.nav-item a.nav-link(href=getUrl("histogram")) Histogram ul.navbar-nav.ml-auto diff --git a/utils/calendar.js b/utils/calendar.js index d0552ce..9d1cc70 100644 --- a/utils/calendar.js +++ b/utils/calendar.js @@ -7,16 +7,15 @@ var locale = require('os-locale').sync(); var cal = {}; function fromIcal(string) { - + console.log(string); return new Date( parseInt(string.substr(0 , 4), 10), - parseInt(string.substr(4 , 2), 10), + parseInt(string.substr(4 , 2), 10) - 1, parseInt(string.substr(6 , 2), 10), parseInt(string.substr(9, 2), 10), parseInt(string.substr(11, 2), 10), parseInt(string.substr(13, 2), 10) ); - } cal.Type = {