fullcalendar.helper.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. $(function () {
  2. 'use strict';
  3. window.utils = window.utils || {};
  4. $.extend(window.utils, {
  5. fullCalendar: {
  6. fromExceptionEvent: function (startDate) {
  7. return {
  8. title: '예외',
  9. start: startDate,
  10. backgroundColor: 'rgb(220,10,10)',
  11. isException: true
  12. };
  13. },
  14. generateScheduleEvents: function (currentDate, startDate, scheduleId, scheduleName, cycleType, cycleSize, cycleUnit, holidayType, holidays, exceptionDays) {
  15. startDate = startDate instanceof Date ? moment(startDate) : startDate;
  16. if (cycleType === $Code.CycleType.Anytime) {
  17. return [
  18. {
  19. scheduleId: scheduleId,
  20. title: scheduleName,
  21. start: $G.date(startDate)
  22. }
  23. ];
  24. }
  25. currentDate = currentDate instanceof Date ? moment(currentDate) : currentDate;
  26. var events = [];
  27. var cycle;
  28. var unit = $Code.CycleUnit;
  29. var htype = $Code.HolidayWorkType;
  30. var term = 1;
  31. switch (cycleUnit) {
  32. case unit.Daily: cycle = 'days'; break;
  33. case unit.Weekly: cycle = 'weeks'; break;
  34. case unit.Monthly: cycle = 'months'; break;
  35. case unit.Quaterly: cycle = 'months'; term = 3; break;
  36. case unit.HalfYearly: cycle = 'months'; term = 6; break;
  37. case unit.Yearly: cycle = 'years'; break;
  38. }
  39. if (currentDate.year() < startDate.year()) return events;
  40. if (currentDate.year() === startDate.year() && currentDate.month() < startDate.month()) return events;
  41. var date = startDate.clone();
  42. if (currentDate.month() !== startDate.month()) {
  43. date.startOf('days');
  44. while (date.year() < currentDate.year() || date.month() < currentDate.month()) {
  45. date.add(cycleSize * term, cycle);
  46. }
  47. }
  48. var m = date.month();
  49. var formattedDate;
  50. var willPush = false;
  51. if (holidayType === htype.NextDayWork) {
  52. var isPendingWork = false;
  53. var nextDay = date.clone();
  54. var formattedNextDate = $G.date(nextDay);
  55. for (; date.month() === m ; date.add(1, 'days')) {
  56. formattedDate = $G.date(date);
  57. if (formattedNextDate === formattedDate) {
  58. nextDay.add(cycleSize * term, cycle);
  59. formattedNextDate = $G.date(nextDay);
  60. if (holidays.indexOf(formattedDate) >= 0) {
  61. isPendingWork = true;
  62. continue;
  63. }
  64. if (exceptionDays.indexOf(formattedDate) >= 0) {
  65. isPendingWork = false;
  66. events.push(this.fromExceptionEvent(formattedDate));
  67. continue;
  68. }
  69. events.push({
  70. title: scheduleName,
  71. start: formattedDate
  72. });
  73. isPendingWork = false;
  74. }
  75. else if (isPendingWork) {
  76. if (holidays.indexOf(formattedDate) >= 0) {
  77. continue;
  78. }
  79. if (exceptionDays.indexOf(formattedDate) >= 0) {
  80. isPendingWork = false;
  81. events.push(this.fromExceptionEvent(formattedDate));
  82. continue;
  83. }
  84. events.push({
  85. scheduleId: scheduleId,
  86. title: scheduleName,
  87. start: formattedDate
  88. });
  89. isPendingWork = false;
  90. }
  91. }
  92. }
  93. else {
  94. for (; date.month() === m ; date.add(cycleSize * term, cycle)) {
  95. formattedDate = $G.date(date);
  96. if (holidays.indexOf(formattedDate) >= 0) {
  97. willPush = true;
  98. switch (holidayType) {
  99. case htype.Work: break; // Nothing to do
  100. case htype.NotWork:
  101. {
  102. willPush = false;
  103. break;
  104. } // Nothing to do
  105. }
  106. if (willPush === false) continue;
  107. }
  108. events.push({
  109. scheduleId: scheduleId,
  110. title: scheduleName,
  111. start: formattedDate
  112. });
  113. }
  114. }
  115. return events;
  116. },
  117. create: function (id, options) {
  118. var events = options.events || [];
  119. var self = $('#' + id);
  120. options = $.extend({}, options, {
  121. header: {
  122. right: 'prev,next today',
  123. left: 'title'
  124. },
  125. lang: 'ko',
  126. buttonIcons: false,
  127. //weekNumbers: true,
  128. selectable: true,
  129. selectHelper: true,
  130. events: events
  131. });
  132. if (options.selectable === undefined) {
  133. options.selectable = true;
  134. }
  135. self.fullCalendar(options);
  136. return {
  137. self: self,
  138. events: events,
  139. updateEvents: function (newEvents) {
  140. self.fullCalendar('removeEventSource', events);
  141. if (newEvents !== undefined) {
  142. events = newEvents;
  143. }
  144. self.fullCalendar('addEventSource', events);
  145. },
  146. setReadOnly: function (isReadOnly) {
  147. // console.log( self.fullCalendar( 'option', 'selectable' ) );
  148. var view = self.fullCalendar('getView');
  149. view.calendar.options['selectable'] = isReadOnly ? false : true;
  150. // if( isReadOnly ) {
  151. //// console.log( 'after setting false ' + self.fullCalendar( 'option', 'selectable' ) );
  152. // }
  153. // else {
  154. // self.fullCalendar( { 'selectable': true } );
  155. // }
  156. },
  157. isExistEvent: function (day, handle, title) {
  158. var isExist = false;
  159. if (arguments.length === 3) {
  160. $.each(events, function (i, event) {
  161. if ($G.date(event.start) === $G.date(day) && event.title == title) {
  162. if (typeof handle === 'function') handle(i, event);
  163. isExist = true;
  164. return false;
  165. }
  166. });
  167. }
  168. else {
  169. $.each(events, function (i, event) {
  170. if ($G.date(event.start) === $G.date(day)) {
  171. if (typeof handle === 'function') handle(i, event);
  172. isExist = true;
  173. return false;
  174. }
  175. });
  176. }
  177. return isExist;
  178. },
  179. pushEventIfNotExist: function (title, day, isRefresh) {
  180. if (this.isExistEvent(day, null, title) == false) {
  181. this.pushEvent(title, day, isRefresh);
  182. }
  183. },
  184. pushEventInArray: function (destArray, title, day) {
  185. var o = {
  186. title: title,
  187. start: day,
  188. allDay: true,
  189. };
  190. destArray.push(o);
  191. return o;
  192. },
  193. pushEvent: function (title, day, isRefresh) {
  194. this.pushEventInArray(events, title, day);
  195. if (isRefresh !== undefined && isRefresh) this.updateEvents();
  196. },
  197. pushExceptionEvent: function (day, isRefresh) {
  198. var o = this.pushEventInArray(events, '예외', day);
  199. o.isException = true;
  200. o.backgroundColor = 'rgb(210,10,10)';
  201. if (isRefresh !== undefined && isRefresh) this.updateEvents();
  202. },
  203. clearEvents: function (isRefresh) {
  204. events.splice(0, events.length);
  205. if (isRefresh !== undefined && isRefresh) this.updateEvents();
  206. },
  207. removeEvent: function (day, title, isRefresh) {
  208. var wasDeleted = false;
  209. if (title === undefined) {
  210. this.isExistEvent(day, function (i) {
  211. events.splice(i, 1);
  212. wasDeleted = true;
  213. });
  214. }
  215. else {
  216. this.isExistEvent(day, function (i) {
  217. events.splice(i, 1);
  218. wasDeleted = true;
  219. }, title);
  220. }
  221. if (arguments.length == 3 && isRefresh && wasDeleted) {
  222. console.log('updateEvents in remove');
  223. this.updateEvents();
  224. }
  225. return wasDeleted;
  226. },
  227. getDate: function () {
  228. return self.fullCalendar('getDate');
  229. },
  230. getEvents: function (date, callback) {
  231. $.each(events, function (i, event) {
  232. if (event.start === date) {
  233. callback(event);
  234. }
  235. });
  236. }
  237. };
  238. }
  239. }
  240. });
  241. });