app.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. 'use strict';
  2. /* eslint-disable */
  3. /* eslint-env jquery */
  4. /* global moment, tui, chance */
  5. /* global findCalendar, CalendarList, ScheduleList, generateSchedule */
  6. (function(window, Calendar) {
  7. var cal, resizeThrottled;
  8. var useCreationPopup = true;
  9. var useDetailPopup = true;
  10. var datePicker, selectedCalendar;
  11. cal = new Calendar('#calendar', {
  12. defaultView: 'month',
  13. useCreationPopup: useCreationPopup,
  14. useDetailPopup: useDetailPopup,
  15. calendars: CalendarList,
  16. template: {
  17. milestone: function(model) {
  18. return '<span class="calendar-font-icon ic-milestone-b"></span> <span style="background-color: ' + model.bgColor + '">' + model.title + '</span>';
  19. },
  20. allday: function(schedule) {
  21. return getTimeTemplate(schedule, true);
  22. },
  23. time: function(schedule) {
  24. return getTimeTemplate(schedule, false);
  25. }
  26. }
  27. });
  28. // event handlers
  29. cal.on({
  30. 'clickMore': function(e) {
  31. console.log('clickMore', e);
  32. },
  33. 'clickSchedule': function(e) {
  34. console.log('clickSchedule', e);
  35. },
  36. 'clickDayname': function(date) {
  37. console.log('clickDayname', date);
  38. },
  39. 'beforeCreateSchedule': function(e) {
  40. console.log('beforeCreateSchedule', e);
  41. saveNewSchedule(e);
  42. },
  43. 'beforeUpdateSchedule': function(e) {
  44. var schedule = e.schedule;
  45. var changes = e.changes;
  46. console.log('beforeUpdateSchedule', e);
  47. if (changes && !changes.isAllDay && schedule.category === 'allday') {
  48. changes.category = 'time';
  49. }
  50. cal.updateSchedule(schedule.id, schedule.calendarId, changes);
  51. refreshScheduleVisibility();
  52. },
  53. 'beforeDeleteSchedule': function(e) {
  54. console.log('beforeDeleteSchedule', e);
  55. cal.deleteSchedule(e.schedule.id, e.schedule.calendarId);
  56. },
  57. 'afterRenderSchedule': function(e) {
  58. var schedule = e.schedule;
  59. // var element = cal.getElement(schedule.id, schedule.calendarId);
  60. // console.log('afterRenderSchedule', element);
  61. },
  62. 'clickTimezonesCollapseBtn': function(timezonesCollapsed) {
  63. console.log('timezonesCollapsed', timezonesCollapsed);
  64. if (timezonesCollapsed) {
  65. cal.setTheme({
  66. 'week.daygridLeft.width': '77px',
  67. 'week.timegridLeft.width': '77px'
  68. });
  69. } else {
  70. cal.setTheme({
  71. 'week.daygridLeft.width': '60px',
  72. 'week.timegridLeft.width': '60px'
  73. });
  74. }
  75. return true;
  76. }
  77. });
  78. /**
  79. * Get time template for time and all-day
  80. * @param {Schedule} schedule - schedule
  81. * @param {boolean} isAllDay - isAllDay or hasMultiDates
  82. * @returns {string}
  83. */
  84. function getTimeTemplate(schedule, isAllDay) {
  85. var html = [];
  86. var start = moment(schedule.start.toUTCString());
  87. if (!isAllDay) {
  88. html.push('<strong>' + start.format('HH:mm') + '</strong> ');
  89. }
  90. if (schedule.isPrivate) {
  91. html.push('<span class="calendar-font-icon ic-lock-b"></span>');
  92. html.push(' Private');
  93. } else {
  94. if (schedule.isReadOnly) {
  95. html.push('<span class="calendar-font-icon ic-readonly-b"></span>');
  96. } else if (schedule.recurrenceRule) {
  97. html.push('<span class="calendar-font-icon ic-repeat-b"></span>');
  98. } else if (schedule.attendees.length) {
  99. html.push('<span class="calendar-font-icon ic-user-b"></span>');
  100. } else if (schedule.location) {
  101. html.push('<span class="calendar-font-icon ic-location-b"></span>');
  102. }
  103. html.push(' ' + schedule.title);
  104. }
  105. return html.join('');
  106. }
  107. /**
  108. * A listener for click the menu
  109. * @param {Event} e - click event
  110. */
  111. function onClickMenu(e) {
  112. var target = $(e.target).closest('a[role="menuitem"]')[0];
  113. var action = getDataAction(target);
  114. var options = cal.getOptions();
  115. var viewName = '';
  116. console.log(target);
  117. console.log(action);
  118. switch (action) {
  119. case 'toggle-daily':
  120. viewName = 'day';
  121. break;
  122. case 'toggle-weekly':
  123. viewName = 'week';
  124. break;
  125. case 'toggle-monthly':
  126. options.month.visibleWeeksCount = 0;
  127. viewName = 'month';
  128. break;
  129. case 'toggle-weeks2':
  130. options.month.visibleWeeksCount = 2;
  131. viewName = 'month';
  132. break;
  133. case 'toggle-weeks3':
  134. options.month.visibleWeeksCount = 3;
  135. viewName = 'month';
  136. break;
  137. case 'toggle-narrow-weekend':
  138. options.month.narrowWeekend = !options.month.narrowWeekend;
  139. options.week.narrowWeekend = !options.week.narrowWeekend;
  140. viewName = cal.getViewName();
  141. target.querySelector('input').checked = options.month.narrowWeekend;
  142. break;
  143. case 'toggle-start-day-1':
  144. options.month.startDayOfWeek = options.month.startDayOfWeek ? 0 : 1;
  145. options.week.startDayOfWeek = options.week.startDayOfWeek ? 0 : 1;
  146. viewName = cal.getViewName();
  147. target.querySelector('input').checked = options.month.startDayOfWeek;
  148. break;
  149. case 'toggle-workweek':
  150. options.month.workweek = !options.month.workweek;
  151. options.week.workweek = !options.week.workweek;
  152. viewName = cal.getViewName();
  153. target.querySelector('input').checked = !options.month.workweek;
  154. break;
  155. default:
  156. break;
  157. }
  158. cal.setOptions(options, true);
  159. cal.changeView(viewName, true);
  160. setDropdownCalendarType();
  161. setRenderRangeText();
  162. setSchedules();
  163. }
  164. function onClickNavi(e) {
  165. var action = getDataAction(e.target);
  166. switch (action) {
  167. case 'move-prev':
  168. cal.prev();
  169. break;
  170. case 'move-next':
  171. cal.next();
  172. break;
  173. case 'move-today':
  174. cal.today();
  175. break;
  176. default:
  177. return;
  178. }
  179. setRenderRangeText();
  180. setSchedules();
  181. }
  182. function onNewSchedule() {
  183. var title = $('#new-schedule-title').val();
  184. var location = $('#new-schedule-location').val();
  185. var isAllDay = document.getElementById('new-schedule-allday').checked;
  186. var start = datePicker.getStartDate();
  187. var end = datePicker.getEndDate();
  188. var calendar = selectedCalendar ? selectedCalendar : CalendarList[0];
  189. if (!title) {
  190. return;
  191. }
  192. cal.createSchedules([{
  193. id: String(chance.guid()),
  194. calendarId: calendar.id,
  195. title: title,
  196. isAllDay: isAllDay,
  197. start: start,
  198. end: end,
  199. category: isAllDay ? 'allday' : 'time',
  200. dueDateClass: '',
  201. color: calendar.color,
  202. bgColor: calendar.bgColor,
  203. dragBgColor: calendar.bgColor,
  204. borderColor: calendar.borderColor,
  205. raw: {
  206. location: location
  207. },
  208. state: 'Busy'
  209. }]);
  210. $('#modal-new-schedule').modal('hide');
  211. }
  212. function onChangeNewScheduleCalendar(e) {
  213. var target = $(e.target).closest('a[role="menuitem"]')[0];
  214. var calendarId = getDataAction(target);
  215. changeNewScheduleCalendar(calendarId);
  216. }
  217. function changeNewScheduleCalendar(calendarId) {
  218. var calendarNameElement = document.getElementById('calendarName');
  219. var calendar = findCalendar(calendarId);
  220. var html = [];
  221. html.push('<span class="calendar-bar" style="background-color: ' + calendar.bgColor + '; border-color:' + calendar.borderColor + ';"></span>');
  222. html.push('<span class="calendar-name">' + calendar.name + '</span>');
  223. calendarNameElement.innerHTML = html.join('');
  224. selectedCalendar = calendar;
  225. }
  226. function createNewSchedule(event) {
  227. var start = event.start ? new Date(event.start.getTime()) : new Date();
  228. var end = event.end ? new Date(event.end.getTime()) : moment().add(1, 'hours').toDate();
  229. if (useCreationPopup) {
  230. cal.openCreationPopup({
  231. start: start,
  232. end: end
  233. });
  234. }
  235. }
  236. function saveNewSchedule(scheduleData) {
  237. var calendar = scheduleData.calendar || findCalendar(scheduleData.calendarId);
  238. var schedule = {
  239. id: String(chance.guid()),
  240. title: scheduleData.title,
  241. isAllDay: scheduleData.isAllDay,
  242. start: scheduleData.start,
  243. end: scheduleData.end,
  244. category: scheduleData.isAllDay ? 'allday' : 'time',
  245. dueDateClass: '',
  246. color: calendar.color,
  247. bgColor: calendar.bgColor,
  248. dragBgColor: calendar.bgColor,
  249. borderColor: calendar.borderColor,
  250. location: scheduleData.location,
  251. raw: {
  252. class: scheduleData.raw['class']
  253. },
  254. state: scheduleData.state
  255. };
  256. if (calendar) {
  257. schedule.calendarId = calendar.id;
  258. schedule.color = calendar.color;
  259. schedule.bgColor = calendar.bgColor;
  260. schedule.borderColor = calendar.borderColor;
  261. }
  262. cal.createSchedules([schedule]);
  263. refreshScheduleVisibility();
  264. }
  265. function onChangeCalendars(e) {
  266. var calendarId = e.target.value;
  267. var checked = e.target.checked;
  268. var viewAll = document.querySelector('.lnb-calendars-item input');
  269. var calendarElements = Array.prototype.slice.call(document.querySelectorAll('#calendarList input'));
  270. var allCheckedCalendars = true;
  271. if (calendarId === 'all') {
  272. allCheckedCalendars = checked;
  273. calendarElements.forEach(function(input) {
  274. var span = input.parentNode;
  275. input.checked = checked;
  276. span.style.backgroundColor = checked ? span.style.borderColor : 'transparent';
  277. });
  278. CalendarList.forEach(function(calendar) {
  279. calendar.checked = checked;
  280. });
  281. } else {
  282. findCalendar(calendarId).checked = checked;
  283. allCheckedCalendars = calendarElements.every(function(input) {
  284. return input.checked;
  285. });
  286. if (allCheckedCalendars) {
  287. viewAll.checked = true;
  288. } else {
  289. viewAll.checked = false;
  290. }
  291. }
  292. refreshScheduleVisibility();
  293. }
  294. function refreshScheduleVisibility() {
  295. var calendarElements = Array.prototype.slice.call(document.querySelectorAll('#calendarList input'));
  296. CalendarList.forEach(function(calendar) {
  297. cal.toggleSchedules(calendar.id, !calendar.checked, false);
  298. });
  299. cal.render(true);
  300. calendarElements.forEach(function(input) {
  301. var span = input.nextElementSibling;
  302. span.style.backgroundColor = input.checked ? span.style.borderColor : 'transparent';
  303. });
  304. }
  305. function setDropdownCalendarType() {
  306. var calendarTypeName = document.getElementById('calendarTypeName');
  307. var calendarTypeIcon = document.getElementById('calendarTypeIcon');
  308. var options = cal.getOptions();
  309. var type = cal.getViewName();
  310. var iconClassName;
  311. if (type === 'day') {
  312. type = 'Daily';
  313. iconClassName = 'calendar-icon ic_view_day';
  314. } else if (type === 'week') {
  315. type = 'Weekly';
  316. iconClassName = 'calendar-icon ic_view_week';
  317. } else if (options.month.visibleWeeksCount === 2) {
  318. type = '2 weeks';
  319. iconClassName = 'calendar-icon ic_view_week';
  320. } else if (options.month.visibleWeeksCount === 3) {
  321. type = '3 weeks';
  322. iconClassName = 'calendar-icon ic_view_week';
  323. } else {
  324. type = 'Monthly';
  325. iconClassName = 'calendar-icon ic_view_month';
  326. }
  327. calendarTypeName.innerHTML = type;
  328. calendarTypeIcon.className = iconClassName;
  329. }
  330. function currentCalendarDate(format) {
  331. var currentDate = moment([cal.getDate().getFullYear(), cal.getDate().getMonth(), cal.getDate().getDate()]);
  332. return currentDate.format(format);
  333. }
  334. function setRenderRangeText() {
  335. var renderRange = document.getElementById('renderRange');
  336. var options = cal.getOptions();
  337. var viewName = cal.getViewName();
  338. var html = [];
  339. if (viewName === 'day') {
  340. html.push(currentCalendarDate('YYYY.MM.DD'));
  341. } else if (viewName === 'month' &&
  342. (!options.month.visibleWeeksCount || options.month.visibleWeeksCount > 4)) {
  343. html.push(currentCalendarDate('YYYY.MM'));
  344. } else {
  345. html.push(moment(cal.getDateRangeStart().getTime()).format('YYYY.MM.DD'));
  346. html.push(' ~ ');
  347. html.push(moment(cal.getDateRangeEnd().getTime()).format(' MM.DD'));
  348. }
  349. renderRange.innerHTML = html.join('');
  350. }
  351. function setSchedules() {
  352. cal.clear();
  353. generateSchedule(cal.getViewName(), cal.getDateRangeStart(), cal.getDateRangeEnd());
  354. cal.createSchedules(ScheduleList);
  355. refreshScheduleVisibility();
  356. }
  357. function setEventListener() {
  358. $('#menu-navi').on('click', onClickNavi);
  359. $('.dropdown-menu a[role="menuitem"]').on('click', onClickMenu);
  360. $('#lnb-calendars').on('change', onChangeCalendars);
  361. $('#btn-save-schedule').on('click', onNewSchedule);
  362. $('#btn-new-schedule').on('click', createNewSchedule);
  363. $('#dropdownMenu-calendars-list').on('click', onChangeNewScheduleCalendar);
  364. window.addEventListener('resize', resizeThrottled);
  365. }
  366. function getDataAction(target) {
  367. return target.dataset ? target.dataset.action : target.getAttribute('data-action');
  368. }
  369. resizeThrottled = tui.util.throttle(function() {
  370. cal.render();
  371. }, 50);
  372. window.cal = cal;
  373. setDropdownCalendarType();
  374. setRenderRangeText();
  375. setSchedules();
  376. setEventListener();
  377. })(window, tui.Calendar);
  378. // set calendars
  379. (function() {
  380. var calendarList = document.getElementById('calendarList');
  381. var html = [];
  382. CalendarList.forEach(function(calendar) {
  383. html.push('<div class="lnb-calendars-item"><label>' +
  384. '<input type="checkbox" class="tui-full-calendar-checkbox-round" value="' + calendar.id + '" checked>' +
  385. '<span style="border-color: ' + calendar.borderColor + '; background-color: ' + calendar.borderColor + ';"></span>' +
  386. '<span>' + calendar.name + '</span>' +
  387. '</label></div>'
  388. );
  389. });
  390. calendarList.innerHTML = html.join('\n');
  391. })();