angular-bootstrap-calendar.js 54 KB

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