Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

204 rindas
5.2 KiB

  1. // Copyright 2013 Web Notes Technologies Pvt Ltd
  2. // License: MIT. See license.txt
  3. wn.provide("wn.views.calendar");
  4. wn.views.CalendarFactory = wn.views.Factory.extend({
  5. make: function(route) {
  6. var me = this;
  7. wn.model.with_doctype(route[1], function() {
  8. var options = {
  9. doctype: route[1],
  10. page: me.make_page()
  11. };
  12. $.extend(options, wn.views.calendar[route[1]] || {});
  13. new wn.views.Calendar(options);
  14. });
  15. }
  16. });
  17. wn.views.Calendar = Class.extend({
  18. init: function(options) {
  19. $.extend(this, options);
  20. wn.require('lib/js/lib/fullcalendar/fullcalendar.css');
  21. wn.require('lib/js/lib/fullcalendar/fullcalendar.js');
  22. this.make_page();
  23. this.setup_options();
  24. this.make();
  25. },
  26. make_page: function() {
  27. var module = locals.DocType[this.doctype].module;
  28. this.page.appframe.set_title(wn._("Calendar") + " - " + wn._(this.doctype));
  29. this.page.appframe.add_module_icon(module==="Core" ? "Calendar" : module)
  30. this.page.appframe.set_views_for(this.doctype, "calendar");
  31. },
  32. make: function() {
  33. var me = this;
  34. this.$wrapper = $(this.page).find(".layout-main");
  35. this.$cal = $("<div>").appendTo(this.$wrapper);
  36. wn.utils.set_footnote(this, this.$wrapper, wn._("Select or drag across time slots to create a new event."));
  37. //
  38. // $('<div class="help"></div>')
  39. // .html(wn._("Select dates to create a new ") + wn._(me.doctype))
  40. // .appendTo(this.$wrapper);
  41. this.$cal.fullCalendar(this.cal_options);
  42. },
  43. field_map: {
  44. "id": "name",
  45. "start": "start",
  46. "end": "end",
  47. "allDay": "all_day",
  48. },
  49. styles: {
  50. "standard": {
  51. "color": "#999"
  52. },
  53. "important": {
  54. "color": "#b94a48"
  55. },
  56. "warning": {
  57. "color": "#f89406"
  58. },
  59. "success": {
  60. "color": "#468847"
  61. },
  62. "info": {
  63. "color": "#3a87ad"
  64. },
  65. "inverse": {
  66. "color": "#333333"
  67. }
  68. },
  69. setup_options: function() {
  70. var me = this;
  71. this.cal_options = {
  72. header: {
  73. left: 'prev,next today',
  74. center: 'title',
  75. right: 'month,agendaWeek,agendaDay'
  76. },
  77. editable: true,
  78. selectable: true,
  79. selectHelper: true,
  80. events: function(start, end, callback) {
  81. wn.call({
  82. method: me.get_events_method || "webnotes.widgets.calendar.get_events",
  83. type: "GET",
  84. args: me.get_args(start, end),
  85. callback: function(r) {
  86. var events = r.message;
  87. me.prepare_events(events);
  88. callback(events);
  89. }
  90. })
  91. },
  92. eventClick: function(event, jsEvent, view) {
  93. // edit event description or delete
  94. var doctype = event.doctype || me.doctype;
  95. if(wn.model.can_read(doctype)) {
  96. wn.set_route("Form", doctype, event.name);
  97. }
  98. },
  99. eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
  100. me.update_event(event, revertFunc);
  101. },
  102. eventResize: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
  103. me.update_event(event, revertFunc);
  104. },
  105. select: function(startDate, endDate, allDay, jsEvent, view) {
  106. if(jsEvent.day_clicked && view.name=="month")
  107. return;
  108. var event = wn.model.get_new_doc(me.doctype);
  109. event[me.field_map.start] = wn.datetime.get_datetime_as_string(startDate);
  110. if(me.field_map.end)
  111. event[me.field_map.end] = wn.datetime.get_datetime_as_string(endDate);
  112. if(me.field_map.allDay)
  113. event[me.field_map.allDay] = allDay ? 1 : 0;
  114. wn.set_route("Form", me.doctype, event.name);
  115. },
  116. dayClick: function(date, allDay, jsEvent, view) {
  117. jsEvent.day_clicked = true;
  118. return false;
  119. }
  120. };
  121. if(this.options) {
  122. $.extend(this.cal_options, this.options);
  123. }
  124. },
  125. get_args: function(start, end) {
  126. return {
  127. doctype: this.doctype,
  128. start: wn.datetime.get_datetime_as_string(start),
  129. end: wn.datetime.get_datetime_as_string(end)
  130. }
  131. },
  132. prepare_events: function(events) {
  133. var me = this;
  134. $.each(events, function(i, d) {
  135. d.id = d.name;
  136. d.editable = wn.model.can_write(d.doctype || me.doctype);
  137. // do not allow submitted/cancelled events to be moved / extended
  138. if(d.docstatus && d.docstatus > 0) {
  139. d.editable = false;
  140. }
  141. $.each(me.field_map, function(target, source) {
  142. d[target] = d[source];
  143. });
  144. if(!me.field_map.allDay)
  145. d.allDay = 1;
  146. if(d.status) {
  147. if(me.style_map) {
  148. $.extend(d, me.styles[me.style_map[d.status]] || {});
  149. } else {
  150. $.extend(d, me.styles[wn.utils.guess_style(d.status, "standard")]);
  151. }
  152. } else {
  153. $.extend(d, me.styles["standard"]);
  154. }
  155. })
  156. },
  157. update_event: function(event, revertFunc) {
  158. var me = this;
  159. wn.model.remove_from_locals(me.doctype, event.name);
  160. wn.call({
  161. method: me.update_event_method || "webnotes.widgets.calendar.update_event",
  162. args: me.get_update_args(event),
  163. callback: function(r) {
  164. if(r.exc) {
  165. show_alert("Unable to update event.")
  166. revertFunc();
  167. }
  168. }
  169. });
  170. },
  171. get_update_args: function(event) {
  172. var args = {
  173. name: event[this.field_map.id]
  174. };
  175. args[this.field_map.start]
  176. = wn.datetime.get_datetime_as_string(event.start);
  177. if(this.field_map.end)
  178. args[this.field_map.end] = wn.datetime.get_datetime_as_string(event.end);
  179. if(this.field_map.allDay)
  180. args[this.field_map.allDay] = event.allDay ? 1 : 0;
  181. args.doctype = event.doctype || this.doctype;
  182. return { args: args, field_map: this.field_map };
  183. }
  184. })