angular-bootstrap-calendar-tpls.js 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069
  1. /**
  2. * angular-bootstrap-calendar - A pure AngularJS bootstrap themed responsive calendar that can display events and has views for year, month, week and day
  3. * @version v0.18.0
  4. * @link https://github.com/mattlewis92/angular-bootstrap-calendar
  5. * @license MIT
  6. */
  7. (function webpackUniversalModuleDefinition(root, factory) {
  8. if(typeof exports === 'object' && typeof module === 'object')
  9. module.exports = factory(require("angular"), (function webpackLoadOptionalExternalModule() { try { return require("interact.js"); } catch(e) {} }()), require("moment"));
  10. else if(typeof define === 'function' && define.amd)
  11. define(["angular", "interact", "moment"], factory);
  12. else if(typeof exports === 'object')
  13. exports["angularBootstrapCalendarModuleName"] = factory(require("angular"), (function webpackLoadOptionalExternalModule() { try { return require("interact.js"); } catch(e) {} }()), require("moment"));
  14. else
  15. root["angularBootstrapCalendarModuleName"] = factory(root["angular"], root["interact"], root["moment"]);
  16. })(this, function(__WEBPACK_EXTERNAL_MODULE_12__, __WEBPACK_EXTERNAL_MODULE_47__, __WEBPACK_EXTERNAL_MODULE_49__) {
  17. return /******/ (function(modules) { // webpackBootstrap
  18. /******/ // The module cache
  19. /******/ var installedModules = {};
  20. /******/ // The require function
  21. /******/ function __webpack_require__(moduleId) {
  22. /******/ // Check if module is in cache
  23. /******/ if(installedModules[moduleId])
  24. /******/ return installedModules[moduleId].exports;
  25. /******/ // Create a new module (and put it into the cache)
  26. /******/ var module = installedModules[moduleId] = {
  27. /******/ exports: {},
  28. /******/ id: moduleId,
  29. /******/ loaded: false
  30. /******/ };
  31. /******/ // Execute the module function
  32. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  33. /******/ // Flag the module as loaded
  34. /******/ module.loaded = true;
  35. /******/ // Return the exports of the module
  36. /******/ return module.exports;
  37. /******/ }
  38. /******/ // expose the modules object (__webpack_modules__)
  39. /******/ __webpack_require__.m = modules;
  40. /******/ // expose the module cache
  41. /******/ __webpack_require__.c = installedModules;
  42. /******/ // __webpack_public_path__
  43. /******/ __webpack_require__.p = "";
  44. /******/ // Load entry module and return exports
  45. /******/ return __webpack_require__(0);
  46. /******/ })
  47. /************************************************************************/
  48. /******/ ([
  49. /* 0 */
  50. /***/ function(module, exports, __webpack_require__) {
  51. 'use strict';
  52. __webpack_require__(8);
  53. var angular = __webpack_require__(12);
  54. function requireAll(r) {
  55. r.keys().forEach(r);
  56. }
  57. var templates = {};
  58. if (true) {
  59. var templatesContext = __webpack_require__(13);
  60. templatesContext.keys().forEach(function(templateName) {
  61. var templateNameWithoutPrefix = templateName.replace('./', '');
  62. var cacheTemplateName = 'mwl/' + templateNameWithoutPrefix;
  63. var configTemplateName = templateNameWithoutPrefix.replace('.html', '');
  64. templates[configTemplateName] = {
  65. cacheTemplateName: cacheTemplateName,
  66. template: templatesContext(templateName)
  67. };
  68. });
  69. }
  70. module.exports = angular
  71. .module('mwl.calendar', [])
  72. .config(["calendarConfig", function(calendarConfig) {
  73. angular.forEach(templates, function(template, templateName) {
  74. if (!calendarConfig.templates[templateName]) {
  75. calendarConfig.templates[templateName] = template.cacheTemplateName;
  76. }
  77. });
  78. }])
  79. .run(["$templateCache", function($templateCache) {
  80. angular.forEach(templates, function(template) {
  81. if (!$templateCache.get(template.cacheTemplateName)) {
  82. $templateCache.put(template.cacheTemplateName, template.template);
  83. }
  84. });
  85. }]).name;
  86. requireAll(__webpack_require__(23));
  87. requireAll(__webpack_require__(37));
  88. requireAll(__webpack_require__(42));
  89. /***/ },
  90. /* 1 */,
  91. /* 2 */,
  92. /* 3 */,
  93. /* 4 */,
  94. /* 5 */,
  95. /* 6 */,
  96. /* 7 */,
  97. /* 8 */
  98. /***/ function(module, exports) {
  99. // removed by extract-text-webpack-plugin
  100. /***/ },
  101. /* 9 */,
  102. /* 10 */,
  103. /* 11 */,
  104. /* 12 */
  105. /***/ function(module, exports) {
  106. module.exports = __WEBPACK_EXTERNAL_MODULE_12__;
  107. /***/ },
  108. /* 13 */
  109. /***/ function(module, exports, __webpack_require__) {
  110. var map = {
  111. "./calendar.html": 14,
  112. "./calendarDayView.html": 15,
  113. "./calendarHourList.html": 16,
  114. "./calendarMonthCell.html": 17,
  115. "./calendarMonthCellEvents.html": 18,
  116. "./calendarMonthView.html": 19,
  117. "./calendarSlideBox.html": 20,
  118. "./calendarWeekView.html": 21,
  119. "./calendarYearView.html": 22
  120. };
  121. function webpackContext(req) {
  122. return __webpack_require__(webpackContextResolve(req));
  123. };
  124. function webpackContextResolve(req) {
  125. return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }());
  126. };
  127. webpackContext.keys = function webpackContextKeys() {
  128. return Object.keys(map);
  129. };
  130. webpackContext.resolve = webpackContextResolve;
  131. module.exports = webpackContext;
  132. webpackContext.id = 13;
  133. /***/ },
  134. /* 14 */
  135. /***/ function(module, exports) {
  136. module.exports = "<div class=\"cal-context\" ng-switch=\"vm.view\">\n\n <div class=\"alert alert-danger\" ng-switch-default>The value passed to the view attribute of the calendar is not set</div>\n\n <div class=\"alert alert-danger\" ng-hide=\"vm.viewDate\">The value passed to view-date attribute of the calendar is not set</div>\n\n <mwl-calendar-year\n events=\"vm.events\"\n view-date=\"vm.viewDate\"\n on-event-click=\"vm.onEventClick\"\n on-event-times-changed=\"vm.onEventTimesChanged\"\n on-edit-event-click=\"vm.onEditEventClick\"\n on-delete-event-click=\"vm.onDeleteEventClick\"\n on-timespan-click=\"vm.onTimespanClick\"\n edit-event-html=\"vm.editEventHtml\"\n delete-event-html=\"vm.deleteEventHtml\"\n cell-is-open=\"vm.cellIsOpen\"\n cell-modifier=\"vm.cellModifier\"\n ng-switch-when=\"year\"\n ></mwl-calendar-year>\n\n <mwl-calendar-month\n events=\"vm.events\"\n view-date=\"vm.viewDate\"\n on-event-click=\"vm.onEventClick\"\n on-event-times-changed=\"vm.onEventTimesChanged\"\n on-edit-event-click=\"vm.onEditEventClick\"\n on-delete-event-click=\"vm.onDeleteEventClick\"\n on-timespan-click=\"vm.onTimespanClick\"\n edit-event-html=\"vm.editEventHtml\"\n delete-event-html=\"vm.deleteEventHtml\"\n cell-is-open=\"vm.cellIsOpen\"\n cell-modifier=\"vm.cellModifier\"\n ng-switch-when=\"month\"\n ></mwl-calendar-month>\n\n <mwl-calendar-week\n events=\"vm.events\"\n view-date=\"vm.viewDate\"\n on-event-click=\"vm.onEventClick\"\n on-event-times-changed=\"vm.onEventTimesChanged\"\n day-view-start=\"vm.dayViewStart\"\n day-view-end=\"vm.dayViewEnd\"\n day-view-split=\"vm.dayViewSplit\"\n on-timespan-click=\"vm.onTimespanClick\"\n ng-switch-when=\"week\"\n ></mwl-calendar-week>\n\n <mwl-calendar-day\n events=\"vm.events\"\n view-date=\"vm.viewDate\"\n on-event-click=\"vm.onEventClick\"\n on-event-times-changed=\"vm.onEventTimesChanged\"\n on-timespan-click=\"vm.onTimespanClick\"\n day-view-start=\"vm.dayViewStart\"\n day-view-end=\"vm.dayViewEnd\"\n day-view-split=\"vm.dayViewSplit\"\n ng-switch-when=\"day\"\n ></mwl-calendar-day>\n</div>\n";
  137. /***/ },
  138. /* 15 */
  139. /***/ function(module, exports) {
  140. module.exports = "<div class=\"cal-day-box\">\n <div class=\"row-fluid clearfix cal-row-head\">\n <div class=\"span1 col-xs-1 cal-cell\" ng-bind=\"vm.calendarConfig.i18nStrings.timeLabel\"></div>\n <div class=\"span11 col-xs-11 cal-cell\" ng-bind=\"vm.calendarConfig.i18nStrings.eventsLabel\"></div>\n </div>\n\n <div class=\"cal-day-panel clearfix\" ng-style=\"{height: vm.dayViewHeight + 'px'}\">\n\n <mwl-calendar-hour-list\n day-view-start=\"vm.dayViewStart\"\n day-view-end=\"vm.dayViewEnd\"\n day-view-split=\"vm.dayViewSplit\"\n on-timespan-click=\"vm.onTimespanClick\"\n view-date=\"vm.viewDate\">\n </mwl-calendar-hour-list>\n\n <div\n class=\"pull-left day-event day-highlight\"\n ng-repeat=\"event in vm.view track by event.$id\"\n ng-class=\"'dh-event-' + event.type + ' ' + event.cssClass\"\n ng-style=\"{top: event.top + 'px', left: event.left + 60 + 'px', height: event.height + 'px'}\"\n mwl-draggable=\"event.draggable === true\"\n axis=\"'xy'\"\n snap-grid=\"{y: 30, x: 50}\"\n on-drag=\"vm.eventDragged(event, y)\"\n on-drag-end=\"vm.eventDragComplete(event, y)\"\n mwl-resizable=\"event.resizable === true && event.endsAt\"\n resize-edges=\"{top: true, bottom: true}\"\n on-resize=\"vm.eventResized(event, edge, y)\"\n on-resize-end=\"vm.eventResizeComplete(event, edge, y)\">\n\n <span class=\"cal-hours\">\n <span ng-show=\"event.top == 0\"><span ng-bind=\"(event.tempStartsAt || event.startsAt) | calendarDate:'day':true\"></span>, </span>\n <span ng-bind=\"(event.tempStartsAt || event.startsAt) | calendarDate:'time':true\"></span>\n </span>\n <a href=\"javascript:;\" class=\"event-item\" ng-click=\"vm.onEventClick({calendarEvent: event})\">\n <span ng-bind-html=\"vm.$sce.trustAsHtml(event.title) | calendarTruncateEventTitle:20:event.height\"></span>\n </a>\n\n </div>\n\n </div>\n\n</div>\n";
  141. /***/ },
  142. /* 16 */
  143. /***/ function(module, exports) {
  144. module.exports = "<div class=\"cal-day-panel-hour\">\n\n <div class=\"cal-day-hour\" ng-repeat=\"hour in vm.hours track by $index\">\n\n <div\n class=\"row-fluid cal-day-hour-part\"\n ng-click=\"vm.onTimespanClick({calendarDate: hour.date.toDate()})\">\n <div class=\"span1 col-xs-1\"><strong ng-bind=\"hour.label\"></strong></div>\n <div class=\"span11 col-xs-11\"></div>\n </div>\n\n <div\n class=\"row-fluid cal-day-hour-part\"\n ng-click=\"vm.onTimespanClick({calendarDate: hour.date.clone().add(vm.dayViewSplit, 'minutes').toDate()})\">\n <div class=\"span1 col-xs-1\"></div>\n <div class=\"span11 col-xs-11\"></div>\n </div>\n\n <div\n class=\"row-fluid cal-day-hour-part\"\n ng-show=\"vm.dayViewSplit < 30\"\n ng-click=\"vm.onTimespanClick({calendarDate: hour.date.clone().add(vm.dayViewSplit * 2, 'minutes').toDate()})\">\n <div class=\"span1 col-xs-1\"></div>\n <div class=\"span11 col-xs-11\"></div>\n </div>\n\n <div\n class=\"row-fluid cal-day-hour-part\"\n ng-show=\"vm.dayViewSplit < 30\"\n ng-click=\"vm.onTimespanClick({calendarDate: hour.date.clone().add(vm.dayViewSplit * 3, 'minutes').toDate()})\">\n <div class=\"span1 col-xs-1\"></div>\n <div class=\"span11 col-xs-11\"></div>\n </div>\n\n <div\n class=\"row-fluid cal-day-hour-part\"\n ng-show=\"vm.dayViewSplit < 15\"\n ng-click=\"vm.onTimespanClick({calendarDate: hour.date.clone().add(vm.dayViewSplit * 4, 'minutes').toDate()})\">\n <div class=\"span1 col-xs-1\"></div>\n <div class=\"span11 col-xs-11\"></div>\n </div>\n\n <div\n class=\"row-fluid cal-day-hour-part\"\n ng-show=\"vm.dayViewSplit < 15\"\n ng-click=\"vm.onTimespanClick({calendarDate: hour.date.clone().add(vm.dayViewSplit * 5, 'minutes').toDate()})\">\n <div class=\"span1 col-xs-1\"></div>\n <div class=\"span11 col-xs-11\"></div>\n </div>\n\n </div>\n\n</div>\n";
  145. /***/ },
  146. /* 17 */
  147. /***/ function(module, exports) {
  148. module.exports = "<div\n mwl-droppable\n on-drop=\"vm.handleEventDrop(dropData.event, day.date, dropData.draggedFromDate)\"\n class=\"cal-month-day {{ day.cssClass }}\"\n ng-class=\"{\n 'cal-day-outmonth': !day.inMonth,\n 'cal-day-inmonth': day.inMonth,\n 'cal-day-weekend': day.isWeekend,\n 'cal-day-past': day.isPast,\n 'cal-day-today': day.isToday,\n 'cal-day-future': day.isFuture\n }\">\n\n <small\n class=\"cal-events-num badge badge-important pull-left\"\n ng-show=\"day.badgeTotal > 0\"\n ng-bind=\"day.badgeTotal\">\n </small>\n\n <span\n class=\"pull-right\"\n data-cal-date\n ng-click=\"vm.calendarCtrl.dateClicked(day.date)\"\n ng-bind=\"day.label\">\n </span>\n\n <div class=\"cal-day-tick\" ng-show=\"dayIndex === vm.openDayIndex && vm.view[vm.openDayIndex].events.length > 0\">\n <i class=\"glyphicon glyphicon-chevron-up\"></i>\n <i class=\"fa fa-chevron-up\"></i>\n </div>\n\n <ng-include src=\"vm.calendarConfig.templates.calendarMonthCellEvents\"></ng-include>\n\n <div id=\"cal-week-box\" ng-if=\"$first && rowHovered\">\n {{ vm.calendarConfig.i18nStrings.weekNumber.replace('{week}', day.date.week()) }}\n </div>\n\n</div>\n";
  149. /***/ },
  150. /* 18 */
  151. /***/ function(module, exports) {
  152. module.exports = "<div class=\"events-list\" ng-show=\"day.events.length > 0\">\n <a\n ng-repeat=\"event in day.events | orderBy:'startsAt' track by event.$id\"\n href=\"javascript:;\"\n ng-click=\"vm.onEventClick({calendarEvent: event})\"\n class=\"pull-left event\"\n ng-class=\"'event-' + event.type + ' ' + event.cssClass\"\n ng-mouseenter=\"vm.highlightEvent(event, true)\"\n ng-mouseleave=\"vm.highlightEvent(event, false)\"\n tooltip-append-to-body=\"true\"\n uib-tooltip-html=\"((event.startsAt | calendarDate:'time':true) + (vm.calendarConfig.displayEventEndTimes && event.endsAt ? ' - ' + (event.endsAt | calendarDate:'time':true) : '') + ' - ' + event.title) | calendarTrustAsHtml\"\n mwl-draggable=\"event.draggable === true\"\n drop-data=\"{event: event, draggedFromDate: day.date.toDate()}\">\n </a>\n</div>\n";
  153. /***/ },
  154. /* 19 */
  155. /***/ function(module, exports) {
  156. module.exports = "<div class=\"cal-row-fluid cal-row-head\">\n\n <div class=\"cal-cell1\" ng-repeat=\"day in vm.weekDays track by $index\" ng-bind=\"day\"></div>\n\n</div>\n<div class=\"cal-month-box\">\n\n <div\n ng-repeat=\"rowOffset in vm.monthOffsets track by rowOffset\"\n ng-mouseenter=\"rowHovered = true\"\n ng-mouseleave=\"rowHovered = false\">\n <div class=\"cal-row-fluid cal-before-eventlist\">\n <div\n ng-repeat=\"day in vm.view | calendarLimitTo:7:rowOffset track by $index\"\n ng-init=\"dayIndex = vm.view.indexOf(day)\"\n class=\"cal-cell1 cal-cell {{ day.highlightClass }}\"\n ng-click=\"vm.dayClicked(day, false, $event)\"\n ng-class=\"{pointer: day.events.length > 0}\">\n <ng-include src=\"vm.calendarConfig.templates.calendarMonthCell\"></ng-include>\n </div>\n </div>\n\n <mwl-calendar-slide-box\n is-open=\"vm.openRowIndex === $index && vm.view[vm.openDayIndex].events.length > 0\"\n events=\"vm.view[vm.openDayIndex].events\"\n on-event-click=\"vm.onEventClick\"\n edit-event-html=\"vm.editEventHtml\"\n on-edit-event-click=\"vm.onEditEventClick\"\n delete-event-html=\"vm.deleteEventHtml\"\n on-delete-event-click=\"vm.onDeleteEventClick\">\n </mwl-calendar-slide-box>\n\n </div>\n\n</div>\n";
  157. /***/ },
  158. /* 20 */
  159. /***/ function(module, exports) {
  160. module.exports = "<div class=\"cal-slide-box\" uib-collapse=\"vm.isCollapsed\" mwl-collapse-fallback=\"vm.isCollapsed\">\n <div class=\"cal-slide-content cal-event-list\">\n <ul class=\"unstyled list-unstyled\">\n\n <li\n ng-repeat=\"event in vm.events | orderBy:'startsAt' track by event.$id\"\n ng-class=\"event.cssClass\"\n mwl-draggable=\"event.draggable === true\"\n drop-data=\"{event: event}\">\n <span class=\"pull-left event\" ng-class=\"'event-' + event.type\"></span>\n &nbsp;\n <a\n href=\"javascript:;\"\n class=\"event-item\"\n ng-click=\"vm.onEventClick({calendarEvent: event})\">\n <span ng-bind-html=\"vm.$sce.trustAsHtml(event.title)\"></span>\n (<span ng-bind=\"event.startsAt | calendarDate:(isMonthView ? 'time' : 'datetime'):true\"></span><span ng-if=\"vm.calendarConfig.displayEventEndTimes && event.endsAt\"> - <span ng-bind=\"event.endsAt | calendarDate:(isMonthView ? 'time' : 'datetime'):true\"></span></span>)\n </a>\n\n <a\n href=\"javascript:;\"\n class=\"event-item-edit\"\n ng-if=\"vm.editEventHtml && event.editable !== false\"\n ng-bind-html=\"vm.$sce.trustAsHtml(vm.editEventHtml)\"\n ng-click=\"vm.onEditEventClick({calendarEvent: event})\">\n </a>\n\n <a\n href=\"javascript:;\"\n class=\"event-item-delete\"\n ng-if=\"vm.deleteEventHtml && event.deletable !== false\"\n ng-bind-html=\"vm.$sce.trustAsHtml(vm.deleteEventHtml)\"\n ng-click=\"vm.onDeleteEventClick({calendarEvent: event})\">\n </a>\n </li>\n\n </ul>\n </div>\n</div>\n";
  161. /***/ },
  162. /* 21 */
  163. /***/ function(module, exports) {
  164. module.exports = "<div class=\"cal-week-box\" ng-class=\"{'cal-day-box': vm.showTimes}\">\n <div class=\"cal-row-fluid cal-row-head\">\n\n <div\n class=\"cal-cell1\"\n ng-repeat=\"day in vm.view.days track by $index\"\n ng-class=\"{\n 'cal-day-weekend': day.isWeekend,\n 'cal-day-past': day.isPast,\n 'cal-day-today': day.isToday,\n 'cal-day-future': day.isFuture}\"\n mwl-element-dimensions=\"vm.dayColumnDimensions\">\n\n <span ng-bind=\"day.weekDayLabel\"></span>\n <br>\n <small>\n <span\n data-cal-date\n ng-click=\"vm.calendarCtrl.dateClicked(day.date)\"\n class=\"pointer\"\n ng-bind=\"day.dayLabel\">\n </span>\n </small>\n\n </div>\n\n </div>\n\n <div class=\"cal-day-panel clearfix\" ng-style=\"{height: vm.showTimes ? (vm.dayViewHeight + 'px') : 'auto'}\">\n\n <mwl-calendar-hour-list\n day-view-start=\"vm.dayViewStart\"\n day-view-end=\"vm.dayViewEnd\"\n day-view-split=\"vm.dayViewSplit\"\n view-date=\"vm.viewDate\"\n on-timespan-click=\"vm.onTimespanClick\"\n ng-if=\"vm.showTimes\">\n </mwl-calendar-hour-list>\n\n <div class=\"row\">\n <div class=\"col-xs-12\">\n <div\n class=\"cal-row-fluid \"\n ng-repeat=\"event in vm.view.events track by event.$id\">\n <div\n ng-class=\"'cal-cell' + (vm.showTimes ? 1 : event.daySpan) + (vm.showTimes ? '' : ' cal-offset' + event.dayOffset) + ' day-highlight dh-event-' + event.type + ' ' + event.cssClass\"\n ng-style=\"{\n top: vm.showTimes ? ((event.top + 2) + 'px') : 'auto',\n position: vm.showTimes ? 'absolute' : 'inherit',\n width: vm.showTimes ? (vm.dayColumnDimensions.width + 'px') : '',\n left: vm.showTimes ? (vm.dayColumnDimensions.width * event.dayOffset) + 15 + 'px' : ''\n }\"\n data-event-class\n mwl-draggable=\"event.draggable === true\"\n axis=\"vm.showTimes ? 'xy' : 'x'\"\n snap-grid=\"vm.showTimes ? {x: vm.dayColumnDimensions.width, y: 30} : {x: vm.dayColumnDimensions.width}\"\n on-drag=\"vm.tempTimeChanged(event, y)\"\n on-drag-end=\"vm.weekDragged(event, x, y)\"\n mwl-resizable=\"event.resizable === true && event.endsAt && !vm.showTimes\"\n resize-edges=\"{left: true, right: true}\"\n on-resize-end=\"vm.weekResized(event, edge, x)\">\n <strong ng-bind=\"(event.tempStartsAt || event.startsAt) | calendarDate:'time':true\" ng-show=\"vm.showTimes\"></strong>\n <a\n href=\"javascript:;\"\n ng-click=\"vm.onEventClick({calendarEvent: event})\"\n class=\"event-item\"\n ng-bind-html=\"vm.$sce.trustAsHtml(event.title)\"\n uib-tooltip-html=\"event.title | calendarTrustAsHtml\"\n tooltip-placement=\"left\"\n tooltip-append-to-body=\"true\">\n </a>\n </div>\n </div>\n </div>\n\n </div>\n\n </div>\n</div>\n";
  165. /***/ },
  166. /* 22 */
  167. /***/ function(module, exports) {
  168. module.exports = "<div class=\"cal-year-box\">\n <div ng-repeat=\"rowOffset in [0, 4, 8] track by rowOffset\">\n <div class=\"row cal-before-eventlist\">\n <div\n class=\"span3 col-md-3 col-xs-6 cal-cell {{ day.cssClass }}\"\n ng-repeat=\"month in vm.view | calendarLimitTo:4:rowOffset track by $index\"\n ng-init=\"monthIndex = vm.view.indexOf(month)\"\n ng-click=\"vm.monthClicked(month, false, $event)\"\n ng-class=\"{pointer: month.events.length > 0, 'cal-day-today': month.isToday}\"\n mwl-droppable\n on-drop=\"vm.handleEventDrop(dropData.event, month.date)\">\n\n <span\n class=\"pull-right\"\n data-cal-date\n ng-click=\"vm.calendarCtrl.dateClicked(month.date)\"\n ng-bind=\"month.label\">\n </span>\n\n <small\n class=\"cal-events-num badge badge-important pull-left\"\n ng-show=\"month.badgeTotal > 0\"\n ng-bind=\"month.badgeTotal\">\n </small>\n\n <div\n class=\"cal-day-tick\"\n ng-show=\"monthIndex === vm.openMonthIndex && vm.view[vm.openMonthIndex].events.length > 0\">\n <i class=\"glyphicon glyphicon-chevron-up\"></i>\n <i class=\"fa fa-chevron-up\"></i>\n </div>\n\n </div>\n </div>\n\n <mwl-calendar-slide-box\n is-open=\"vm.openRowIndex === $index && vm.view[vm.openMonthIndex].events.length > 0\"\n events=\"vm.view[vm.openMonthIndex].events\"\n on-event-click=\"vm.onEventClick\"\n edit-event-html=\"vm.editEventHtml\"\n on-edit-event-click=\"vm.onEditEventClick\"\n delete-event-html=\"vm.deleteEventHtml\"\n on-delete-event-click=\"vm.onDeleteEventClick\">\n </mwl-calendar-slide-box>\n\n </div>\n\n</div>\n";
  169. /***/ },
  170. /* 23 */
  171. /***/ function(module, exports, __webpack_require__) {
  172. var map = {
  173. "./mwlCalendar.js": 24,
  174. "./mwlCalendarDay.js": 25,
  175. "./mwlCalendarHourList.js": 26,
  176. "./mwlCalendarMonth.js": 27,
  177. "./mwlCalendarSlideBox.js": 28,
  178. "./mwlCalendarWeek.js": 29,
  179. "./mwlCalendarYear.js": 30,
  180. "./mwlCollapseFallback.js": 31,
  181. "./mwlDateModifier.js": 32,
  182. "./mwlDraggable.js": 33,
  183. "./mwlDroppable.js": 34,
  184. "./mwlElementDimensions.js": 35,
  185. "./mwlResizable.js": 36
  186. };
  187. function webpackContext(req) {
  188. return __webpack_require__(webpackContextResolve(req));
  189. };
  190. function webpackContextResolve(req) {
  191. return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }());
  192. };
  193. webpackContext.keys = function webpackContextKeys() {
  194. return Object.keys(map);
  195. };
  196. webpackContext.resolve = webpackContextResolve;
  197. module.exports = webpackContext;
  198. webpackContext.id = 23;
  199. /***/ },
  200. /* 24 */
  201. /***/ function(module, exports, __webpack_require__) {
  202. 'use strict';
  203. var angular = __webpack_require__(12);
  204. angular
  205. .module('mwl.calendar')
  206. .controller('MwlCalendarCtrl', ["$scope", "$log", "$timeout", "$attrs", "$locale", "moment", "calendarTitle", function($scope, $log, $timeout, $attrs, $locale, moment, calendarTitle) {
  207. var vm = this;
  208. vm.events = vm.events || [];
  209. vm.changeView = function(view, newDay) {
  210. vm.view = view;
  211. vm.viewDate = newDay;
  212. };
  213. vm.dateClicked = function(date) {
  214. var rawDate = moment(date).toDate();
  215. var nextView = {
  216. year: 'month',
  217. month: 'day',
  218. week: 'day'
  219. };
  220. if (vm.onViewChangeClick({calendarDate: rawDate, calendarNextView: nextView[vm.view]}) !== false) {
  221. vm.changeView(nextView[vm.view], rawDate);
  222. }
  223. };
  224. var previousDate = moment(vm.viewDate);
  225. var previousView = vm.view;
  226. function eventIsValid(event) {
  227. if (!event.startsAt) {
  228. $log.warn('Bootstrap calendar: ', 'Event is missing the startsAt field', event);
  229. }
  230. if (!angular.isDate(event.startsAt)) {
  231. $log.warn('Bootstrap calendar: ', 'Event startsAt should be a javascript date object', event);
  232. }
  233. if (angular.isDefined(event.endsAt)) {
  234. if (!angular.isDate(event.endsAt)) {
  235. $log.warn('Bootstrap calendar: ', 'Event endsAt should be a javascript date object', event);
  236. }
  237. if (moment(event.startsAt).isAfter(moment(event.endsAt))) {
  238. $log.warn('Bootstrap calendar: ', 'Event cannot start after it finishes', event);
  239. }
  240. }
  241. return true;
  242. }
  243. function refreshCalendar() {
  244. if (calendarTitle[vm.view] && angular.isDefined($attrs.viewTitle)) {
  245. vm.viewTitle = calendarTitle[vm.view](vm.viewDate);
  246. }
  247. vm.events = vm.events.filter(eventIsValid).map(function(event, index) {
  248. Object.defineProperty(event, '$id', {enumerable: false, configurable: true, value: index});
  249. return event;
  250. });
  251. //if on-timespan-click="calendarDay = calendarDate" is set then don't update the view as nothing needs to change
  252. var currentDate = moment(vm.viewDate);
  253. var shouldUpdate = true;
  254. if (
  255. previousDate.clone().startOf(vm.view).isSame(currentDate.clone().startOf(vm.view)) &&
  256. !previousDate.isSame(currentDate) &&
  257. vm.view === previousView
  258. ) {
  259. shouldUpdate = false;
  260. }
  261. previousDate = currentDate;
  262. previousView = vm.view;
  263. if (shouldUpdate) {
  264. // a $timeout is required as $broadcast is synchronous so if a new events array is set the calendar won't update
  265. $timeout(function() {
  266. $scope.$broadcast('calendar.refreshView');
  267. });
  268. }
  269. }
  270. var eventsWatched = false;
  271. //Refresh the calendar when any of these variables change.
  272. $scope.$watchGroup([
  273. 'vm.viewDate',
  274. 'vm.view',
  275. 'vm.cellIsOpen',
  276. function() {
  277. return moment.locale() + $locale.id; //Auto update the calendar when the locale changes
  278. }
  279. ], function() {
  280. if (!eventsWatched) {
  281. eventsWatched = true;
  282. //need to deep watch events hence why it isn't included in the watch group
  283. $scope.$watch('vm.events', refreshCalendar, true); //this will call refreshCalendar when the watcher starts (i.e. now)
  284. } else {
  285. refreshCalendar();
  286. }
  287. });
  288. }])
  289. .directive('mwlCalendar', ["calendarConfig", function(calendarConfig) {
  290. return {
  291. templateUrl: calendarConfig.templates.calendar,
  292. restrict: 'E',
  293. scope: {
  294. events: '=',
  295. view: '=',
  296. viewTitle: '=?',
  297. viewDate: '=',
  298. editEventHtml: '=',
  299. deleteEventHtml: '=',
  300. cellIsOpen: '=',
  301. onEventClick: '&',
  302. onEventTimesChanged: '&',
  303. onEditEventClick: '&',
  304. onDeleteEventClick: '&',
  305. onTimespanClick: '&',
  306. onViewChangeClick: '&',
  307. cellModifier: '&',
  308. dayViewStart: '@',
  309. dayViewEnd: '@',
  310. dayViewSplit: '@'
  311. },
  312. controller: 'MwlCalendarCtrl as vm',
  313. bindToController: true
  314. };
  315. }]);
  316. /***/ },
  317. /* 25 */
  318. /***/ function(module, exports, __webpack_require__) {
  319. 'use strict';
  320. var angular = __webpack_require__(12);
  321. angular
  322. .module('mwl.calendar')
  323. .controller('MwlCalendarDayCtrl', ["$scope", "$sce", "moment", "calendarHelper", "calendarConfig", function($scope, $sce, moment, calendarHelper, calendarConfig) {
  324. var vm = this;
  325. vm.calendarConfig = calendarConfig;
  326. vm.$sce = $sce;
  327. $scope.$on('calendar.refreshView', function() {
  328. vm.dayViewSplit = vm.dayViewSplit || 30;
  329. vm.dayViewHeight = calendarHelper.getDayViewHeight(
  330. vm.dayViewStart,
  331. vm.dayViewEnd,
  332. vm.dayViewSplit
  333. );
  334. vm.view = calendarHelper.getDayView(
  335. vm.events,
  336. vm.viewDate,
  337. vm.dayViewStart,
  338. vm.dayViewEnd,
  339. vm.dayViewSplit
  340. );
  341. });
  342. vm.eventDragComplete = function(event, minuteChunksMoved) {
  343. var minutesDiff = minuteChunksMoved * vm.dayViewSplit;
  344. var newStart = moment(event.startsAt).add(minutesDiff, 'minutes');
  345. var newEnd = moment(event.endsAt).add(minutesDiff, 'minutes');
  346. delete event.tempStartsAt;
  347. vm.onEventTimesChanged({
  348. calendarEvent: event,
  349. calendarNewEventStart: newStart.toDate(),
  350. calendarNewEventEnd: event.endsAt ? newEnd.toDate() : null
  351. });
  352. };
  353. vm.eventDragged = function(event, minuteChunksMoved) {
  354. var minutesDiff = minuteChunksMoved * vm.dayViewSplit;
  355. event.tempStartsAt = moment(event.startsAt).add(minutesDiff, 'minutes').toDate();
  356. };
  357. vm.eventResizeComplete = function(event, edge, minuteChunksMoved) {
  358. var minutesDiff = minuteChunksMoved * vm.dayViewSplit;
  359. var start = moment(event.startsAt);
  360. var end = moment(event.endsAt);
  361. if (edge === 'start') {
  362. start.add(minutesDiff, 'minutes');
  363. } else {
  364. end.add(minutesDiff, 'minutes');
  365. }
  366. delete event.tempStartsAt;
  367. vm.onEventTimesChanged({
  368. calendarEvent: event,
  369. calendarNewEventStart: start.toDate(),
  370. calendarNewEventEnd: end.toDate()
  371. });
  372. };
  373. vm.eventResized = function(event, edge, minuteChunksMoved) {
  374. var minutesDiff = minuteChunksMoved * vm.dayViewSplit;
  375. if (edge === 'start') {
  376. event.tempStartsAt = moment(event.startsAt).add(minutesDiff, 'minutes').toDate();
  377. }
  378. };
  379. }])
  380. .directive('mwlCalendarDay', ["calendarConfig", function(calendarConfig) {
  381. return {
  382. templateUrl: calendarConfig.templates.calendarDayView,
  383. restrict: 'E',
  384. require: '^mwlCalendar',
  385. scope: {
  386. events: '=',
  387. viewDate: '=',
  388. onEventClick: '=',
  389. onEventTimesChanged: '=',
  390. onTimespanClick: '=',
  391. dayViewStart: '=',
  392. dayViewEnd: '=',
  393. dayViewSplit: '='
  394. },
  395. controller: 'MwlCalendarDayCtrl as vm',
  396. bindToController: true
  397. };
  398. }]);
  399. /***/ },
  400. /* 26 */
  401. /***/ function(module, exports, __webpack_require__) {
  402. 'use strict';
  403. var angular = __webpack_require__(12);
  404. angular
  405. .module('mwl.calendar')
  406. .controller('MwlCalendarHourListCtrl', ["$scope", "moment", "calendarConfig", "calendarHelper", function($scope, moment, calendarConfig, calendarHelper) {
  407. var vm = this;
  408. var dayViewStart, dayViewEnd;
  409. function updateDays() {
  410. dayViewStart = moment(vm.dayViewStart || '00:00', 'HH:mm');
  411. dayViewEnd = moment(vm.dayViewEnd || '23:00', 'HH:mm');
  412. vm.dayViewSplit = parseInt(vm.dayViewSplit);
  413. vm.hours = [];
  414. var dayCounter = moment(vm.viewDate)
  415. .clone()
  416. .hours(dayViewStart.hours())
  417. .minutes(dayViewStart.minutes())
  418. .seconds(dayViewStart.seconds());
  419. for (var i = 0; i <= dayViewEnd.diff(dayViewStart, 'hours'); i++) {
  420. vm.hours.push({
  421. label: calendarHelper.formatDate(dayCounter, calendarConfig.dateFormats.hour),
  422. date: dayCounter.clone()
  423. });
  424. dayCounter.add(1, 'hour');
  425. }
  426. }
  427. var originalLocale = moment.locale();
  428. $scope.$on('calendar.refreshView', function() {
  429. if (originalLocale !== moment.locale()) {
  430. originalLocale = moment.locale();
  431. updateDays();
  432. }
  433. });
  434. $scope.$watchGroup([
  435. 'vm.dayViewStart',
  436. 'vm.dayViewEnd',
  437. 'vm.dayViewSplit',
  438. 'vm.viewDate'
  439. ], function() {
  440. updateDays();
  441. });
  442. }])
  443. .directive('mwlCalendarHourList', ["calendarConfig", function(calendarConfig) {
  444. return {
  445. restrict: 'E',
  446. templateUrl: calendarConfig.templates.calendarHourList,
  447. controller: 'MwlCalendarHourListCtrl as vm',
  448. scope: {
  449. viewDate: '=',
  450. dayViewStart: '=',
  451. dayViewEnd: '=',
  452. dayViewSplit: '=',
  453. onTimespanClick: '='
  454. },
  455. bindToController: true
  456. };
  457. }]);
  458. /***/ },
  459. /* 27 */
  460. /***/ function(module, exports, __webpack_require__) {
  461. 'use strict';
  462. var angular = __webpack_require__(12);
  463. angular
  464. .module('mwl.calendar')
  465. .controller('MwlCalendarMonthCtrl', ["$scope", "moment", "calendarHelper", "calendarConfig", function($scope, moment, calendarHelper, calendarConfig) {
  466. var vm = this;
  467. vm.calendarConfig = calendarConfig;
  468. vm.openRowIndex = null;
  469. $scope.$on('calendar.refreshView', function() {
  470. vm.weekDays = calendarHelper.getWeekDayNames();
  471. vm.view = calendarHelper.getMonthView(vm.events, vm.viewDate, vm.cellModifier);
  472. var rows = Math.floor(vm.view.length / 7);
  473. vm.monthOffsets = [];
  474. for (var i = 0; i < rows; i++) {
  475. vm.monthOffsets.push(i * 7);
  476. }
  477. //Auto open the calendar to the current day if set
  478. if (vm.cellIsOpen && vm.openRowIndex === null) {
  479. vm.openDayIndex = null;
  480. vm.view.forEach(function(day) {
  481. if (day.inMonth && moment(vm.viewDate).startOf('day').isSame(day.date)) {
  482. vm.dayClicked(day, true);
  483. }
  484. });
  485. }
  486. });
  487. vm.dayClicked = function(day, dayClickedFirstRun, $event) {
  488. if (!dayClickedFirstRun) {
  489. vm.onTimespanClick({
  490. calendarDate: day.date.toDate(),
  491. $event: $event
  492. });
  493. if ($event && $event.defaultPrevented) {
  494. return;
  495. }
  496. }
  497. vm.openRowIndex = null;
  498. var dayIndex = vm.view.indexOf(day);
  499. if (dayIndex === vm.openDayIndex) { //the day has been clicked and is already open
  500. vm.openDayIndex = null; //close the open day
  501. vm.cellIsOpen = false;
  502. } else {
  503. vm.openDayIndex = dayIndex;
  504. vm.openRowIndex = Math.floor(dayIndex / 7);
  505. vm.cellIsOpen = true;
  506. }
  507. };
  508. vm.highlightEvent = function(event, shouldAddClass) {
  509. vm.view.forEach(function(day) {
  510. delete day.highlightClass;
  511. if (shouldAddClass) {
  512. var dayContainsEvent = day.events.indexOf(event) > -1;
  513. if (dayContainsEvent) {
  514. day.highlightClass = 'day-highlight dh-event-' + event.type;
  515. }
  516. }
  517. });
  518. };
  519. vm.handleEventDrop = function(event, newDayDate, draggedFromDate) {
  520. var newStart = moment(event.startsAt)
  521. .date(moment(newDayDate).date())
  522. .month(moment(newDayDate).month());
  523. var newEnd = calendarHelper.adjustEndDateFromStartDiff(event.startsAt, newStart, event.endsAt);
  524. vm.onEventTimesChanged({
  525. calendarEvent: event,
  526. calendarDate: newDayDate,
  527. calendarNewEventStart: newStart.toDate(),
  528. calendarNewEventEnd: newEnd ? newEnd.toDate() : null,
  529. calendarDraggedFromDate: draggedFromDate
  530. });
  531. };
  532. }])
  533. .directive('mwlCalendarMonth', ["calendarConfig", function(calendarConfig) {
  534. return {
  535. templateUrl: calendarConfig.templates.calendarMonthView,
  536. restrict: 'E',
  537. require: '^mwlCalendar',
  538. scope: {
  539. events: '=',
  540. viewDate: '=',
  541. onEventClick: '=',
  542. onEditEventClick: '=',
  543. onDeleteEventClick: '=',
  544. onEventTimesChanged: '=',
  545. editEventHtml: '=',
  546. deleteEventHtml: '=',
  547. cellIsOpen: '=',
  548. onTimespanClick: '=',
  549. cellModifier: '='
  550. },
  551. controller: 'MwlCalendarMonthCtrl as vm',
  552. link: function(scope, element, attrs, calendarCtrl) {
  553. scope.vm.calendarCtrl = calendarCtrl;
  554. },
  555. bindToController: true
  556. };
  557. }]);
  558. /***/ },
  559. /* 28 */
  560. /***/ function(module, exports, __webpack_require__) {
  561. 'use strict';
  562. var angular = __webpack_require__(12);
  563. angular
  564. .module('mwl.calendar')
  565. .controller('MwlCalendarSlideBoxCtrl', ["$sce", "$scope", "$timeout", "calendarConfig", function($sce, $scope, $timeout, calendarConfig) {
  566. var vm = this;
  567. vm.$sce = $sce;
  568. vm.calendarConfig = calendarConfig;
  569. vm.isCollapsed = true;
  570. $scope.$watch('vm.isOpen', function(isOpen) {
  571. //events must be populated first to set the element height before animation will work
  572. $timeout(function() {
  573. vm.isCollapsed = !isOpen;
  574. });
  575. });
  576. }])
  577. .directive('mwlCalendarSlideBox', ["calendarConfig", function(calendarConfig) {
  578. return {
  579. restrict: 'E',
  580. templateUrl: calendarConfig.templates.calendarSlideBox,
  581. replace: true,
  582. controller: 'MwlCalendarSlideBoxCtrl as vm',
  583. require: ['^?mwlCalendarMonth', '^?mwlCalendarYear'],
  584. link: function(scope, elm, attrs, ctrls) {
  585. scope.isMonthView = !!ctrls[0];
  586. scope.isYearView = !!ctrls[1];
  587. },
  588. scope: {
  589. isOpen: '=',
  590. events: '=',
  591. onEventClick: '=',
  592. editEventHtml: '=',
  593. onEditEventClick: '=',
  594. deleteEventHtml: '=',
  595. onDeleteEventClick: '='
  596. },
  597. bindToController: true
  598. };
  599. }]);
  600. /***/ },
  601. /* 29 */
  602. /***/ function(module, exports, __webpack_require__) {
  603. 'use strict';
  604. var angular = __webpack_require__(12);
  605. angular
  606. .module('mwl.calendar')
  607. .controller('MwlCalendarWeekCtrl', ["$scope", "$sce", "moment", "calendarHelper", "calendarConfig", function($scope, $sce, moment, calendarHelper, calendarConfig) {
  608. var vm = this;
  609. vm.showTimes = calendarConfig.showTimesOnWeekView;
  610. vm.$sce = $sce;
  611. $scope.$on('calendar.refreshView', function() {
  612. vm.dayViewSplit = vm.dayViewSplit || 30;
  613. vm.dayViewHeight = calendarHelper.getDayViewHeight(
  614. vm.dayViewStart,
  615. vm.dayViewEnd,
  616. vm.dayViewSplit
  617. );
  618. if (vm.showTimes) {
  619. vm.view = calendarHelper.getWeekViewWithTimes(
  620. vm.events,
  621. vm.viewDate,
  622. vm.dayViewStart,
  623. vm.dayViewEnd,
  624. vm.dayViewSplit
  625. );
  626. } else {
  627. vm.view = calendarHelper.getWeekView(vm.events, vm.viewDate);
  628. }
  629. });
  630. vm.weekDragged = function(event, daysDiff, minuteChunksMoved) {
  631. var newStart = moment(event.startsAt).add(daysDiff, 'days');
  632. var newEnd = moment(event.endsAt).add(daysDiff, 'days');
  633. if (minuteChunksMoved) {
  634. var minutesDiff = minuteChunksMoved * vm.dayViewSplit;
  635. newStart = newStart.add(minutesDiff, 'minutes');
  636. newEnd = newEnd.add(minutesDiff, 'minutes');
  637. }
  638. delete event.tempStartsAt;
  639. vm.onEventTimesChanged({
  640. calendarEvent: event,
  641. calendarNewEventStart: newStart.toDate(),
  642. calendarNewEventEnd: event.endsAt ? newEnd.toDate() : null
  643. });
  644. };
  645. vm.weekResized = function(event, edge, daysDiff) {
  646. var start = moment(event.startsAt);
  647. var end = moment(event.endsAt);
  648. if (edge === 'start') {
  649. start.add(daysDiff, 'days');
  650. } else {
  651. end.add(daysDiff, 'days');
  652. }
  653. vm.onEventTimesChanged({
  654. calendarEvent: event,
  655. calendarNewEventStart: start.toDate(),
  656. calendarNewEventEnd: end.toDate()
  657. });
  658. };
  659. vm.tempTimeChanged = function(event, minuteChunksMoved) {
  660. var minutesDiff = minuteChunksMoved * vm.dayViewSplit;
  661. event.tempStartsAt = moment(event.startsAt).add(minutesDiff, 'minutes').toDate();
  662. };
  663. }])
  664. .directive('mwlCalendarWeek', ["calendarConfig", function(calendarConfig) {
  665. return {
  666. templateUrl: calendarConfig.templates.calendarWeekView,
  667. restrict: 'E',
  668. require: '^mwlCalendar',
  669. scope: {
  670. events: '=',
  671. viewDate: '=',
  672. onEventClick: '=',
  673. onEventTimesChanged: '=',
  674. dayViewStart: '=',
  675. dayViewEnd: '=',
  676. dayViewSplit: '=',
  677. onTimespanClick: '='
  678. },
  679. controller: 'MwlCalendarWeekCtrl as vm',
  680. link: function(scope, element, attrs, calendarCtrl) {
  681. scope.vm.calendarCtrl = calendarCtrl;
  682. },
  683. bindToController: true
  684. };
  685. }]);
  686. /***/ },
  687. /* 30 */
  688. /***/ function(module, exports, __webpack_require__) {
  689. 'use strict';
  690. var angular = __webpack_require__(12);
  691. angular
  692. .module('mwl.calendar')
  693. .controller('MwlCalendarYearCtrl', ["$scope", "moment", "calendarHelper", function($scope, moment, calendarHelper) {
  694. var vm = this;
  695. vm.openMonthIndex = null;
  696. $scope.$on('calendar.refreshView', function() {
  697. vm.view = calendarHelper.getYearView(vm.events, vm.viewDate, vm.cellModifier);
  698. //Auto open the calendar to the current day if set
  699. if (vm.cellIsOpen && vm.openMonthIndex === null) {
  700. vm.openMonthIndex = null;
  701. vm.view.forEach(function(month) {
  702. if (moment(vm.viewDate).startOf('month').isSame(month.date)) {
  703. vm.monthClicked(month, true);
  704. }
  705. });
  706. }
  707. });
  708. vm.monthClicked = function(month, monthClickedFirstRun, $event) {
  709. if (!monthClickedFirstRun) {
  710. vm.onTimespanClick({
  711. calendarDate: month.date.toDate(),
  712. $event: $event
  713. });
  714. if ($event && $event.defaultPrevented) {
  715. return;
  716. }
  717. }
  718. vm.openRowIndex = null;
  719. var monthIndex = vm.view.indexOf(month);
  720. if (monthIndex === vm.openMonthIndex) { //the month has been clicked and is already open
  721. vm.openMonthIndex = null; //close the open month
  722. vm.cellIsOpen = false;
  723. } else {
  724. vm.openMonthIndex = monthIndex;
  725. vm.openRowIndex = Math.floor(monthIndex / 4);
  726. vm.cellIsOpen = true;
  727. }
  728. };
  729. vm.handleEventDrop = function(event, newMonthDate) {
  730. var newStart = moment(event.startsAt).month(moment(newMonthDate).month());
  731. var newEnd = calendarHelper.adjustEndDateFromStartDiff(event.startsAt, newStart, event.endsAt);
  732. vm.onEventTimesChanged({
  733. calendarEvent: event,
  734. calendarDate: newMonthDate,
  735. calendarNewEventStart: newStart.toDate(),
  736. calendarNewEventEnd: newEnd ? newEnd.toDate() : null
  737. });
  738. };
  739. }])
  740. .directive('mwlCalendarYear', ["calendarConfig", function(calendarConfig) {
  741. return {
  742. templateUrl: calendarConfig.templates.calendarYearView,
  743. restrict: 'E',
  744. require: '^mwlCalendar',
  745. scope: {
  746. events: '=',
  747. viewDate: '=',
  748. onEventClick: '=',
  749. onEventTimesChanged: '=',
  750. onEditEventClick: '=',
  751. onDeleteEventClick: '=',
  752. editEventHtml: '=',
  753. deleteEventHtml: '=',
  754. cellIsOpen: '=',
  755. onTimespanClick: '=',
  756. cellModifier: '='
  757. },
  758. controller: 'MwlCalendarYearCtrl as vm',
  759. link: function(scope, element, attrs, calendarCtrl) {
  760. scope.vm.calendarCtrl = calendarCtrl;
  761. },
  762. bindToController: true
  763. };
  764. }]);
  765. /***/ },
  766. /* 31 */
  767. /***/ function(module, exports, __webpack_require__) {
  768. 'use strict';
  769. var angular = __webpack_require__(12);
  770. angular
  771. .module('mwl.calendar')
  772. .controller('MwlCollapseFallbackCtrl', ["$scope", "$attrs", "$element", function($scope, $attrs, $element) {
  773. $scope.$watch($attrs.mwlCollapseFallback, function(shouldCollapse) {
  774. if (shouldCollapse) {
  775. $element.addClass('ng-hide');
  776. } else {
  777. $element.removeClass('ng-hide');
  778. }
  779. });
  780. }])
  781. .directive('mwlCollapseFallback', ["$injector", function($injector) {
  782. if ($injector.has('uibCollapseDirective')) {
  783. return {};
  784. }
  785. return {
  786. restrict: 'A',
  787. controller: 'MwlCollapseFallbackCtrl'
  788. };
  789. }]);
  790. /***/ },
  791. /* 32 */
  792. /***/ function(module, exports, __webpack_require__) {
  793. 'use strict';
  794. var angular = __webpack_require__(12);
  795. angular
  796. .module('mwl.calendar')
  797. .controller('MwlDateModifierCtrl', ["$element", "$attrs", "$scope", "moment", function($element, $attrs, $scope, moment) {
  798. var vm = this;
  799. function onClick() {
  800. if (angular.isDefined($attrs.setToToday)) {
  801. vm.date = new Date();
  802. } else if (angular.isDefined($attrs.increment)) {
  803. vm.date = moment(vm.date).add(1, vm.increment).toDate();
  804. } else if (angular.isDefined($attrs.decrement)) {
  805. vm.date = moment(vm.date).subtract(1, vm.decrement).toDate();
  806. }
  807. $scope.$apply();
  808. }
  809. $element.bind('click', onClick);
  810. $scope.$on('$destroy', function() {
  811. $element.unbind('click', onClick);
  812. });
  813. }])
  814. .directive('mwlDateModifier', function() {
  815. return {
  816. restrict: 'A',
  817. controller: 'MwlDateModifierCtrl as vm',
  818. scope: {
  819. date: '=',
  820. increment: '=',
  821. decrement: '='
  822. },
  823. bindToController: true
  824. };
  825. });
  826. /***/ },
  827. /* 33 */
  828. /***/ function(module, exports, __webpack_require__) {
  829. 'use strict';
  830. var angular = __webpack_require__(12);
  831. angular
  832. .module('mwl.calendar')
  833. .controller('MwlDraggableCtrl', ["$element", "$scope", "$window", "$parse", "$attrs", "$timeout", "interact", function($element, $scope, $window, $parse, $attrs, $timeout, interact) {
  834. if (!interact) {
  835. return;
  836. }
  837. var snap, snapGridDimensions;
  838. if ($attrs.snapGrid) {
  839. snapGridDimensions = $parse($attrs.snapGrid)($scope);
  840. snap = {
  841. targets: [
  842. interact.createSnapGrid(snapGridDimensions)
  843. ]
  844. };
  845. }
  846. function translateElement(elm, transformValue) {
  847. return elm
  848. .css('-ms-transform', transformValue)
  849. .css('-webkit-transform', transformValue)
  850. .css('transform', transformValue);
  851. }
  852. function canDrag() {
  853. return $parse($attrs.mwlDraggable)($scope);
  854. }
  855. function getUnitsMoved(x, y, gridDimensions) {
  856. var result = {x: x, y: y};
  857. if (gridDimensions && gridDimensions.x) {
  858. result.x /= gridDimensions.x;
  859. }
  860. if (gridDimensions && gridDimensions.y) {
  861. result.y /= gridDimensions.y;
  862. }
  863. return result;
  864. }
  865. interact($element[0]).draggable({
  866. snap: snap,
  867. onstart: function(event) {
  868. if (canDrag()) {
  869. angular.element(event.target).addClass('dragging-active');
  870. event.target.dropData = $parse($attrs.dropData)($scope);
  871. event.target.style.pointerEvents = 'none';
  872. if ($attrs.onDragStart) {
  873. $parse($attrs.onDragStart)($scope);
  874. $scope.$apply();
  875. }
  876. }
  877. },
  878. onmove: function(event) {
  879. if (canDrag()) {
  880. var elm = angular.element(event.target);
  881. var x = (parseFloat(elm.attr('data-x')) || 0) + (event.dx || 0);
  882. var y = (parseFloat(elm.attr('data-y')) || 0) + (event.dy || 0);
  883. switch ($parse($attrs.axis)($scope)) {
  884. case 'x':
  885. y = 0;
  886. break;
  887. case 'y':
  888. x = 0;
  889. break;
  890. default:
  891. }
  892. if ($window.getComputedStyle(elm[0]).position === 'static') {
  893. elm.css('position', 'relative');
  894. }
  895. translateElement(elm, 'translate(' + x + 'px, ' + y + 'px)')
  896. .css('z-index', 1000)
  897. .attr('data-x', x)
  898. .attr('data-y', y);
  899. if ($attrs.onDrag) {
  900. $parse($attrs.onDrag)($scope, getUnitsMoved(x, y, snapGridDimensions));
  901. $scope.$apply();
  902. }
  903. }
  904. },
  905. onend: function(event) {
  906. if (canDrag()) {
  907. var elm = angular.element(event.target);
  908. var x = elm.attr('data-x');
  909. var y = elm.attr('data-y');
  910. event.target.style.pointerEvents = 'auto';
  911. if ($attrs.onDragEnd) {
  912. $parse($attrs.onDragEnd)($scope, getUnitsMoved(x, y, snapGridDimensions));
  913. $scope.$apply();
  914. }
  915. $timeout(function() {
  916. translateElement(elm, '')
  917. .css('z-index', 'auto')
  918. .removeAttr('data-x')
  919. .removeAttr('data-y')
  920. .removeClass('dragging-active');
  921. });
  922. }
  923. }
  924. });
  925. $scope.$on('$destroy', function() {
  926. interact($element[0]).unset();
  927. });
  928. }])
  929. .directive('mwlDraggable', function() {
  930. return {
  931. restrict: 'A',
  932. controller: 'MwlDraggableCtrl'
  933. };
  934. });
  935. /***/ },
  936. /* 34 */
  937. /***/ function(module, exports, __webpack_require__) {
  938. 'use strict';
  939. var angular = __webpack_require__(12);
  940. angular
  941. .module('mwl.calendar')
  942. .controller('MwlDroppableCtrl', ["$element", "$scope", "$parse", "$attrs", "interact", function($element, $scope, $parse, $attrs, interact) {
  943. if (!interact) {
  944. return;
  945. }
  946. interact($element[0]).dropzone({
  947. ondragenter: function(event) {
  948. angular.element(event.target).addClass('drop-active');
  949. },
  950. ondragleave: function(event) {
  951. angular.element(event.target).removeClass('drop-active');
  952. },
  953. ondropdeactivate: function(event) {
  954. angular.element(event.target).removeClass('drop-active');
  955. },
  956. ondrop: function(event) {
  957. if (event.relatedTarget.dropData) {
  958. $parse($attrs.onDrop)($scope, {dropData: event.relatedTarget.dropData});
  959. $scope.$apply();
  960. }
  961. }
  962. });
  963. $scope.$on('$destroy', function() {
  964. interact($element[0]).unset();
  965. });
  966. }])
  967. .directive('mwlDroppable', function() {
  968. return {
  969. restrict: 'A',
  970. controller: 'MwlDroppableCtrl'
  971. };
  972. });
  973. /***/ },
  974. /* 35 */
  975. /***/ function(module, exports, __webpack_require__) {
  976. 'use strict';
  977. var angular = __webpack_require__(12);
  978. angular
  979. .module('mwl.calendar')
  980. .controller('MwlElementDimensionsCtrl', ["$element", "$scope", "$parse", "$attrs", function($element, $scope, $parse, $attrs) {
  981. $parse($attrs.mwlElementDimensions).assign($scope, {
  982. width: $element[0].offsetWidth,
  983. height: $element[0].offsetHeight
  984. });
  985. }])
  986. .directive('mwlElementDimensions', function() {
  987. return {
  988. restrict: 'A',
  989. controller: 'MwlElementDimensionsCtrl'
  990. };
  991. });
  992. /***/ },
  993. /* 36 */
  994. /***/ function(module, exports, __webpack_require__) {
  995. 'use strict';
  996. var angular = __webpack_require__(12);
  997. angular
  998. .module('mwl.calendar')
  999. .controller('MwlResizableCtrl', ["$element", "$scope", "$parse", "$attrs", "$timeout", "interact", function($element, $scope, $parse, $attrs, $timeout, interact) {
  1000. if (!interact) {
  1001. return;
  1002. }
  1003. var snap, snapGridDimensions;
  1004. if ($attrs.snapGrid) {
  1005. snapGridDimensions = $parse($attrs.snapGrid)($scope);
  1006. snap = {
  1007. targets: [
  1008. interact.createSnapGrid(snapGridDimensions)
  1009. ]
  1010. };
  1011. }
  1012. var originalDimensions = {};
  1013. var originalDimensionsStyle = {};
  1014. var resizeEdge;
  1015. function canResize() {
  1016. return $parse($attrs.mwlResizable)($scope);
  1017. }
  1018. function getUnitsResized(edge, elm, gridDimensions) {
  1019. var unitsResized = {};
  1020. unitsResized.edge = edge;
  1021. if (edge === 'start') {
  1022. unitsResized.x = elm.data('x');
  1023. unitsResized.y = elm.data('y');
  1024. } else if (edge === 'end') {
  1025. unitsResized.x = parseFloat(elm.css('width').replace('px', '')) - originalDimensions.width;
  1026. unitsResized.y = parseFloat(elm.css('height').replace('px', '')) - originalDimensions.height;
  1027. }
  1028. if (gridDimensions && gridDimensions.x) {
  1029. unitsResized.x = Math.round(unitsResized.x / gridDimensions.x);
  1030. }
  1031. if (gridDimensions && gridDimensions.y) {
  1032. unitsResized.y = Math.round(unitsResized.y / gridDimensions.y);
  1033. }
  1034. return unitsResized;
  1035. }
  1036. interact($element[0]).resizable({
  1037. edges: $parse($attrs.resizeEdges)($scope),
  1038. snap: snap,
  1039. onstart: function(event) {
  1040. if (canResize()) {
  1041. resizeEdge = 'end';
  1042. var elm = angular.element(event.target);
  1043. originalDimensions.height = elm[0].offsetHeight;
  1044. originalDimensions.width = elm[0].offsetWidth;
  1045. originalDimensionsStyle.height = elm.css('height');
  1046. originalDimensionsStyle.width = elm.css('width');
  1047. }
  1048. },
  1049. onmove: function(event) {
  1050. if (canResize()) {
  1051. var elm = angular.element(event.target);
  1052. var x = parseFloat(elm.data('x') || 0);
  1053. var y = parseFloat(elm.data('y') || 0);
  1054. elm.css({
  1055. width: event.rect.width + 'px',
  1056. height: event.rect.height + 'px'
  1057. });
  1058. // translate when resizing from top or left edges
  1059. x += event.deltaRect.left;
  1060. y += event.deltaRect.top;
  1061. elm.css('transform', 'translate(' + x + 'px,' + y + 'px)');
  1062. elm.data('x', x);
  1063. elm.data('y', y);
  1064. if (event.deltaRect.left !== 0 || event.deltaRect.top !== 0) {
  1065. resizeEdge = 'start';
  1066. }
  1067. if ($attrs.onResize) {
  1068. $parse($attrs.onResize)($scope, getUnitsResized(resizeEdge, elm, snapGridDimensions));
  1069. $scope.$apply();
  1070. }
  1071. }
  1072. },
  1073. onend: function(event) {
  1074. if (canResize()) {
  1075. var elm = angular.element(event.target);
  1076. var unitsResized = getUnitsResized(resizeEdge, elm, snapGridDimensions);
  1077. $timeout(function() {
  1078. elm
  1079. .data('x', null)
  1080. .data('y', null)
  1081. .css({
  1082. transform: '',
  1083. width: originalDimensionsStyle.width,
  1084. height: originalDimensionsStyle.height
  1085. });
  1086. });
  1087. if ($attrs.onResizeEnd) {
  1088. $parse($attrs.onResizeEnd)($scope, unitsResized);
  1089. $scope.$apply();
  1090. }
  1091. }
  1092. }
  1093. });
  1094. $scope.$on('$destroy', function() {
  1095. interact($element[0]).unset();
  1096. });
  1097. }])
  1098. .directive('mwlResizable', function() {
  1099. return {
  1100. restrict: 'A',
  1101. controller: 'MwlResizableCtrl'
  1102. };
  1103. });
  1104. /***/ },
  1105. /* 37 */
  1106. /***/ function(module, exports, __webpack_require__) {
  1107. var map = {
  1108. "./calendarDate.js": 38,
  1109. "./calendarLimitTo.js": 39,
  1110. "./calendarTruncateEventTitle.js": 40,
  1111. "./calendarTrustAsHtml.js": 41
  1112. };
  1113. function webpackContext(req) {
  1114. return __webpack_require__(webpackContextResolve(req));
  1115. };
  1116. function webpackContextResolve(req) {
  1117. return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }());
  1118. };
  1119. webpackContext.keys = function webpackContextKeys() {
  1120. return Object.keys(map);
  1121. };
  1122. webpackContext.resolve = webpackContextResolve;
  1123. module.exports = webpackContext;
  1124. webpackContext.id = 37;
  1125. /***/ },
  1126. /* 38 */
  1127. /***/ function(module, exports, __webpack_require__) {
  1128. 'use strict';
  1129. var angular = __webpack_require__(12);
  1130. angular
  1131. .module('mwl.calendar')
  1132. .filter('calendarDate', ["calendarHelper", "calendarConfig", function(calendarHelper, calendarConfig) {
  1133. function calendarDate(date, format, getFromConfig) {
  1134. if (getFromConfig === true) {
  1135. format = calendarConfig.dateFormats[format];
  1136. }
  1137. return calendarHelper.formatDate(date, format);
  1138. }
  1139. // This is stateful because the locale can change as well
  1140. // as calendarConfig.dateFormats which would change the value outside of this filter
  1141. calendarDate.$stateful = true;
  1142. return calendarDate;
  1143. }]);
  1144. /***/ },
  1145. /* 39 */
  1146. /***/ function(module, exports, __webpack_require__) {
  1147. 'use strict';
  1148. var angular = __webpack_require__(12);
  1149. angular
  1150. .module('mwl.calendar')
  1151. .filter('calendarLimitTo', ["limitToFilter", function(limitToFilter) {
  1152. if (angular.version.minor >= 4) { //1.4+ supports the begin attribute
  1153. return limitToFilter;
  1154. }
  1155. //Copied from the angular source. Only 1.4 has the begin functionality.
  1156. return function(input, limit, begin) {
  1157. if (Math.abs(Number(limit)) === Infinity) {
  1158. limit = Number(limit);
  1159. } else {
  1160. limit = parseInt(limit);
  1161. }
  1162. if (isNaN(limit)) {
  1163. return input;
  1164. }
  1165. if (angular.isNumber(input)) {
  1166. input = input.toString();
  1167. }
  1168. if (!angular.isArray(input) && !angular.isString(input)) {
  1169. return input;
  1170. }
  1171. begin = (!begin || isNaN(begin)) ? 0 : parseInt(begin);
  1172. begin = (begin < 0 && begin >= -input.length) ? input.length + begin : begin;
  1173. if (limit >= 0) {
  1174. return input.slice(begin, begin + limit);
  1175. } else if (begin === 0) {
  1176. return input.slice(limit, input.length);
  1177. } else {
  1178. return input.slice(Math.max(0, begin + limit), begin);
  1179. }
  1180. };
  1181. }]);
  1182. /***/ },
  1183. /* 40 */
  1184. /***/ function(module, exports, __webpack_require__) {
  1185. 'use strict';
  1186. var angular = __webpack_require__(12);
  1187. angular
  1188. .module('mwl.calendar')
  1189. .filter('calendarTruncateEventTitle', function() {
  1190. return function(string, length, boxHeight) {
  1191. if (!string) {
  1192. return '';
  1193. }
  1194. //Only truncate if if actually needs truncating
  1195. if (string.length >= length && string.length / 20 > boxHeight / 30) {
  1196. return string.substr(0, length) + '...';
  1197. } else {
  1198. return string;
  1199. }
  1200. };
  1201. });
  1202. /***/ },
  1203. /* 41 */
  1204. /***/ function(module, exports, __webpack_require__) {
  1205. 'use strict';
  1206. var angular = __webpack_require__(12);
  1207. angular
  1208. .module('mwl.calendar')
  1209. .filter('calendarTrustAsHtml', ["$sce", function($sce) {
  1210. return function(text) {
  1211. return $sce.trustAsHtml(text);
  1212. };
  1213. }]);
  1214. /***/ },
  1215. /* 42 */
  1216. /***/ function(module, exports, __webpack_require__) {
  1217. var map = {
  1218. "./calendarConfig.js": 43,
  1219. "./calendarHelper.js": 44,
  1220. "./calendarTitle.js": 45,
  1221. "./interact.js": 46,
  1222. "./moment.js": 48
  1223. };
  1224. function webpackContext(req) {
  1225. return __webpack_require__(webpackContextResolve(req));
  1226. };
  1227. function webpackContextResolve(req) {
  1228. return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }());
  1229. };
  1230. webpackContext.keys = function webpackContextKeys() {
  1231. return Object.keys(map);
  1232. };
  1233. webpackContext.resolve = webpackContextResolve;
  1234. module.exports = webpackContext;
  1235. webpackContext.id = 42;
  1236. /***/ },
  1237. /* 43 */
  1238. /***/ function(module, exports, __webpack_require__) {
  1239. 'use strict';
  1240. var angular = __webpack_require__(12);
  1241. angular
  1242. .module('mwl.calendar')
  1243. .constant('calendarConfig', {
  1244. allDateFormats: {
  1245. angular: {
  1246. date: {
  1247. hour: 'ha',
  1248. day: 'd MMM',
  1249. month: 'MMMM',
  1250. weekDay: 'EEEE',
  1251. time: 'HH:mm',
  1252. datetime: 'MMM d, h:mm a'
  1253. },
  1254. title: {
  1255. day: 'EEEE d MMMM, yyyy',
  1256. week: 'Week {week} of {year}',
  1257. month: 'MMMM yyyy',
  1258. year: 'yyyy'
  1259. }
  1260. },
  1261. moment: {
  1262. date: {
  1263. hour: 'ha',
  1264. day: 'D MMM',
  1265. month: 'MMMM',
  1266. weekDay: 'dddd',
  1267. time: 'HH:mm',
  1268. datetime: 'MMM D, h:mm a'
  1269. },
  1270. title: {
  1271. day: 'dddd D MMMM, YYYY',
  1272. week: 'Week {week} of {year}',
  1273. month: 'MMMM YYYY',
  1274. year: 'YYYY'
  1275. }
  1276. }
  1277. },
  1278. get dateFormats() {
  1279. return this.allDateFormats[this.dateFormatter].date;
  1280. },
  1281. get titleFormats() {
  1282. return this.allDateFormats[this.dateFormatter].title;
  1283. },
  1284. dateFormatter: 'angular',
  1285. displayEventEndTimes: false,
  1286. showTimesOnWeekView: false,
  1287. displayAllMonthEvents: false,
  1288. i18nStrings: {
  1289. eventsLabel: 'Events',
  1290. timeLabel: 'Time',
  1291. weekNumber: 'Week {week}'
  1292. },
  1293. templates: {}
  1294. });
  1295. /***/ },
  1296. /* 44 */
  1297. /***/ function(module, exports, __webpack_require__) {
  1298. 'use strict';
  1299. var angular = __webpack_require__(12);
  1300. angular
  1301. .module('mwl.calendar')
  1302. .factory('calendarHelper', ["dateFilter", "moment", "calendarConfig", function(dateFilter, moment, calendarConfig) {
  1303. function formatDate(date, format) {
  1304. if (calendarConfig.dateFormatter === 'angular') {
  1305. return dateFilter(moment(date).toDate(), format);
  1306. } else if (calendarConfig.dateFormatter === 'moment') {
  1307. return moment(date).format(format);
  1308. }
  1309. }
  1310. function adjustEndDateFromStartDiff(oldStart, newStart, oldEnd) {
  1311. if (!oldEnd) {
  1312. return oldEnd;
  1313. }
  1314. var diffInSeconds = moment(newStart).diff(moment(oldStart));
  1315. return moment(oldEnd).add(diffInSeconds);
  1316. }
  1317. function eventIsInPeriod(event, periodStart, periodEnd) {
  1318. var eventStart = moment(event.startsAt);
  1319. var eventEnd = moment(event.endsAt || event.startsAt);
  1320. periodStart = moment(periodStart);
  1321. periodEnd = moment(periodEnd);
  1322. if (angular.isDefined(event.recursOn)) {
  1323. switch (event.recursOn) {
  1324. case 'year':
  1325. eventStart.set({
  1326. year: periodStart.year()
  1327. });
  1328. break;
  1329. case 'month':
  1330. eventStart.set({
  1331. year: periodStart.year(),
  1332. month: periodStart.month()
  1333. });
  1334. break;
  1335. default:
  1336. throw new Error('Invalid value (' + event.recursOn + ') given for recurs on. Can only be year or month.');
  1337. }
  1338. eventEnd = adjustEndDateFromStartDiff(event.startsAt, eventStart, eventEnd);
  1339. }
  1340. return (eventStart.isAfter(periodStart) && eventStart.isBefore(periodEnd)) ||
  1341. (eventEnd.isAfter(periodStart) && eventEnd.isBefore(periodEnd)) ||
  1342. (eventStart.isBefore(periodStart) && eventEnd.isAfter(periodEnd)) ||
  1343. eventStart.isSame(periodStart) ||
  1344. eventEnd.isSame(periodEnd);
  1345. }
  1346. function filterEventsInPeriod(events, startPeriod, endPeriod) {
  1347. return events.filter(function(event) {
  1348. return eventIsInPeriod(event, startPeriod, endPeriod);
  1349. });
  1350. }
  1351. function getEventsInPeriod(calendarDate, period, allEvents) {
  1352. var startPeriod = moment(calendarDate).startOf(period);
  1353. var endPeriod = moment(calendarDate).endOf(period);
  1354. return filterEventsInPeriod(allEvents, startPeriod, endPeriod);
  1355. }
  1356. function getBadgeTotal(events) {
  1357. return events.filter(function(event) {
  1358. return event.incrementsBadgeTotal !== false;
  1359. }).length;
  1360. }
  1361. function getWeekDayNames() {
  1362. var weekdays = [];
  1363. var count = 0;
  1364. while (count < 7) {
  1365. weekdays.push(formatDate(moment().weekday(count++), calendarConfig.dateFormats.weekDay));
  1366. }
  1367. return weekdays;
  1368. }
  1369. function getYearView(events, viewDate, cellModifier) {
  1370. var view = [];
  1371. var eventsInPeriod = getEventsInPeriod(viewDate, 'year', events);
  1372. var month = moment(viewDate).startOf('year');
  1373. var count = 0;
  1374. while (count < 12) {
  1375. var startPeriod = month.clone();
  1376. var endPeriod = startPeriod.clone().endOf('month');
  1377. var periodEvents = filterEventsInPeriod(eventsInPeriod, startPeriod, endPeriod);
  1378. var cell = {
  1379. label: formatDate(startPeriod, calendarConfig.dateFormats.month),
  1380. isToday: startPeriod.isSame(moment().startOf('month')),
  1381. events: periodEvents,
  1382. date: startPeriod,
  1383. badgeTotal: getBadgeTotal(periodEvents)
  1384. };
  1385. cellModifier({calendarCell: cell});
  1386. view.push(cell);
  1387. month.add(1, 'month');
  1388. count++;
  1389. }
  1390. return view;
  1391. }
  1392. function getMonthView(events, viewDate, cellModifier) {
  1393. var startOfMonth = moment(viewDate).startOf('month');
  1394. var day = startOfMonth.clone().startOf('week');
  1395. var endOfMonthView = moment(viewDate).endOf('month').endOf('week');
  1396. var eventsInPeriod;
  1397. if (calendarConfig.displayAllMonthEvents) {
  1398. eventsInPeriod = filterEventsInPeriod(events, day, endOfMonthView);
  1399. } else {
  1400. eventsInPeriod = filterEventsInPeriod(events, startOfMonth, startOfMonth.clone().endOf('month'));
  1401. }
  1402. var view = [];
  1403. var today = moment().startOf('day');
  1404. while (day.isBefore(endOfMonthView)) {
  1405. var inMonth = day.month() === moment(viewDate).month();
  1406. var monthEvents = [];
  1407. if (inMonth || calendarConfig.displayAllMonthEvents) {
  1408. monthEvents = filterEventsInPeriod(eventsInPeriod, day, day.clone().endOf('day'));
  1409. }
  1410. var cell = {
  1411. label: day.date(),
  1412. date: day.clone(),
  1413. inMonth: inMonth,
  1414. isPast: today.isAfter(day),
  1415. isToday: today.isSame(day),
  1416. isFuture: today.isBefore(day),
  1417. isWeekend: [0, 6].indexOf(day.day()) > -1,
  1418. events: monthEvents,
  1419. badgeTotal: getBadgeTotal(monthEvents)
  1420. };
  1421. cellModifier({calendarCell: cell});
  1422. view.push(cell);
  1423. day.add(1, 'day');
  1424. }
  1425. return view;
  1426. }
  1427. function getWeekView(events, viewDate) {
  1428. var startOfWeek = moment(viewDate).startOf('week');
  1429. var endOfWeek = moment(viewDate).endOf('week');
  1430. var dayCounter = startOfWeek.clone();
  1431. var days = [];
  1432. var today = moment().startOf('day');
  1433. while (days.length < 7) {
  1434. days.push({
  1435. weekDayLabel: formatDate(dayCounter, calendarConfig.dateFormats.weekDay),
  1436. date: dayCounter.clone(),
  1437. dayLabel: formatDate(dayCounter, calendarConfig.dateFormats.day),
  1438. isPast: dayCounter.isBefore(today),
  1439. isToday: dayCounter.isSame(today),
  1440. isFuture: dayCounter.isAfter(today),
  1441. isWeekend: [0, 6].indexOf(dayCounter.day()) > -1
  1442. });
  1443. dayCounter.add(1, 'day');
  1444. }
  1445. var eventsSorted = filterEventsInPeriod(events, startOfWeek, endOfWeek).map(function(event) {
  1446. var eventStart = moment(event.startsAt).startOf('day');
  1447. var eventEnd = moment(event.endsAt || event.startsAt).startOf('day');
  1448. var weekViewStart = moment(startOfWeek).startOf('day');
  1449. var weekViewEnd = moment(endOfWeek).startOf('day');
  1450. var offset, span;
  1451. if (eventStart.isBefore(weekViewStart) || eventStart.isSame(weekViewStart)) {
  1452. offset = 0;
  1453. } else {
  1454. offset = eventStart.diff(weekViewStart, 'days');
  1455. }
  1456. if (eventEnd.isAfter(weekViewEnd)) {
  1457. eventEnd = weekViewEnd;
  1458. }
  1459. if (eventStart.isBefore(weekViewStart)) {
  1460. eventStart = weekViewStart;
  1461. }
  1462. span = moment(eventEnd).diff(eventStart, 'days') + 1;
  1463. event.daySpan = span;
  1464. event.dayOffset = offset;
  1465. return event;
  1466. });
  1467. return {days: days, events: eventsSorted};
  1468. }
  1469. function getDayView(events, viewDate, dayViewStart, dayViewEnd, dayViewSplit) {
  1470. var dayStartHour = moment(dayViewStart || '00:00', 'HH:mm').hours();
  1471. var dayEndHour = moment(dayViewEnd || '23:00', 'HH:mm').hours();
  1472. var hourHeight = (60 / dayViewSplit) * 30;
  1473. var calendarStart = moment(viewDate).startOf('day').add(dayStartHour, 'hours');
  1474. var calendarEnd = moment(viewDate).startOf('day').add(dayEndHour, 'hours');
  1475. var calendarHeight = (dayEndHour - dayStartHour + 1) * hourHeight;
  1476. var hourHeightMultiplier = hourHeight / 60;
  1477. var buckets = [];
  1478. var eventsInPeriod = filterEventsInPeriod(
  1479. events,
  1480. moment(viewDate).startOf('day').toDate(),
  1481. moment(viewDate).endOf('day').toDate()
  1482. );
  1483. return eventsInPeriod.map(function(event) {
  1484. if (moment(event.startsAt).isBefore(calendarStart)) {
  1485. event.top = 0;
  1486. } else {
  1487. event.top = (moment(event.startsAt).startOf('minute').diff(calendarStart.startOf('minute'), 'minutes') * hourHeightMultiplier) - 2;
  1488. }
  1489. if (moment(event.endsAt || event.startsAt).isAfter(calendarEnd)) {
  1490. event.height = calendarHeight - event.top;
  1491. } else {
  1492. var diffStart = event.startsAt;
  1493. if (moment(event.startsAt).isBefore(calendarStart)) {
  1494. diffStart = calendarStart.toDate();
  1495. }
  1496. if (!event.endsAt) {
  1497. event.height = 30;
  1498. } else {
  1499. event.height = moment(event.endsAt || event.startsAt).diff(diffStart, 'minutes') * hourHeightMultiplier;
  1500. }
  1501. }
  1502. if (event.top - event.height > calendarHeight) {
  1503. event.height = 0;
  1504. }
  1505. event.left = 0;
  1506. return event;
  1507. }).filter(function(event) {
  1508. return event.height > 0;
  1509. }).map(function(event) {
  1510. var cannotFitInABucket = true;
  1511. buckets.forEach(function(bucket, bucketIndex) {
  1512. var canFitInThisBucket = true;
  1513. bucket.forEach(function(bucketItem) {
  1514. if (eventIsInPeriod(event, bucketItem.startsAt, bucketItem.endsAt || bucketItem.startsAt) ||
  1515. eventIsInPeriod(bucketItem, event.startsAt, event.endsAt || event.startsAt)) {
  1516. canFitInThisBucket = false;
  1517. }
  1518. });
  1519. if (canFitInThisBucket && cannotFitInABucket) {
  1520. cannotFitInABucket = false;
  1521. event.left = bucketIndex * 150;
  1522. buckets[bucketIndex].push(event);
  1523. }
  1524. });
  1525. if (cannotFitInABucket) {
  1526. event.left = buckets.length * 150;
  1527. buckets.push([event]);
  1528. }
  1529. return event;
  1530. });
  1531. }
  1532. function getWeekViewWithTimes(events, viewDate, dayViewStart, dayViewEnd, dayViewSplit) {
  1533. var weekView = getWeekView(events, viewDate);
  1534. var newEvents = [];
  1535. weekView.days.forEach(function(day) {
  1536. var dayEvents = weekView.events.filter(function(event) {
  1537. return moment(event.startsAt).startOf('day').isSame(moment(day.date).startOf('day'));
  1538. });
  1539. var newDayEvents = getDayView(
  1540. dayEvents,
  1541. day.date,
  1542. dayViewStart,
  1543. dayViewEnd,
  1544. dayViewSplit
  1545. );
  1546. newEvents = newEvents.concat(newDayEvents);
  1547. });
  1548. weekView.events = newEvents;
  1549. return weekView;
  1550. }
  1551. function getDayViewHeight(dayViewStart, dayViewEnd, dayViewSplit) {
  1552. var dayViewStartM = moment(dayViewStart || '00:00', 'HH:mm');
  1553. var dayViewEndM = moment(dayViewEnd || '23:00', 'HH:mm');
  1554. var hourHeight = (60 / dayViewSplit) * 30;
  1555. return ((dayViewEndM.diff(dayViewStartM, 'hours') + 1) * hourHeight) + 2;
  1556. }
  1557. return {
  1558. getWeekDayNames: getWeekDayNames,
  1559. getYearView: getYearView,
  1560. getMonthView: getMonthView,
  1561. getWeekView: getWeekView,
  1562. getDayView: getDayView,
  1563. getWeekViewWithTimes: getWeekViewWithTimes,
  1564. getDayViewHeight: getDayViewHeight,
  1565. adjustEndDateFromStartDiff: adjustEndDateFromStartDiff,
  1566. formatDate: formatDate,
  1567. eventIsInPeriod: eventIsInPeriod //expose for testing only
  1568. };
  1569. }]);
  1570. /***/ },
  1571. /* 45 */
  1572. /***/ function(module, exports, __webpack_require__) {
  1573. 'use strict';
  1574. var angular = __webpack_require__(12);
  1575. angular
  1576. .module('mwl.calendar')
  1577. .factory('calendarTitle', ["moment", "calendarConfig", "calendarHelper", function(moment, calendarConfig, calendarHelper) {
  1578. function day(viewDate) {
  1579. return calendarHelper.formatDate(viewDate, calendarConfig.titleFormats.day);
  1580. }
  1581. function week(viewDate) {
  1582. var weekTitleLabel = calendarConfig.titleFormats.week;
  1583. return weekTitleLabel.replace('{week}', moment(viewDate).week()).replace('{year}', moment(viewDate).format('YYYY'));
  1584. }
  1585. function month(viewDate) {
  1586. return calendarHelper.formatDate(viewDate, calendarConfig.titleFormats.month);
  1587. }
  1588. function year(viewDate) {
  1589. return calendarHelper.formatDate(viewDate, calendarConfig.titleFormats.year);
  1590. }
  1591. return {
  1592. day: day,
  1593. week: week,
  1594. month: month,
  1595. year: year
  1596. };
  1597. }]);
  1598. /***/ },
  1599. /* 46 */
  1600. /***/ function(module, exports, __webpack_require__) {
  1601. 'use strict';
  1602. var angular = __webpack_require__(12);
  1603. var interact;
  1604. try {
  1605. interact = __webpack_require__(47);
  1606. } catch (e) {
  1607. /* istanbul ignore next */
  1608. interact = null;
  1609. }
  1610. angular
  1611. .module('mwl.calendar')
  1612. .constant('interact', interact);
  1613. /***/ },
  1614. /* 47 */
  1615. /***/ function(module, exports) {
  1616. if(typeof __WEBPACK_EXTERNAL_MODULE_47__ === 'undefined') {var e = new Error("Cannot find module \"undefined\""); e.code = 'MODULE_NOT_FOUND'; throw e;}
  1617. module.exports = __WEBPACK_EXTERNAL_MODULE_47__;
  1618. /***/ },
  1619. /* 48 */
  1620. /***/ function(module, exports, __webpack_require__) {
  1621. 'use strict';
  1622. var angular = __webpack_require__(12);
  1623. var moment = __webpack_require__(49);
  1624. angular
  1625. .module('mwl.calendar')
  1626. .constant('moment', moment);
  1627. /***/ },
  1628. /* 49 */
  1629. /***/ function(module, exports) {
  1630. module.exports = __WEBPACK_EXTERNAL_MODULE_49__;
  1631. /***/ }
  1632. /******/ ])
  1633. });
  1634. ;