No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

221 líneas
5.6 KiB

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