You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

257 lines
8.5 KiB

  1. odoo.define('web_timeline.TimelineController', function (require) {
  2. "use strict";
  3. var AbstractController = require('web.AbstractController');
  4. var dialogs = require('web.view_dialogs');
  5. var core = require('web.core');
  6. var time = require('web.time');
  7. var Dialog = require('web.Dialog');
  8. var _t = core._t;
  9. var CalendarController = AbstractController.extend({
  10. custom_events: _.extend({}, AbstractController.prototype.custom_events, {
  11. onGroupClick: '_onGroupClick',
  12. onUpdate: '_onUpdate',
  13. onRemove: '_onRemove',
  14. onMove: '_onMove',
  15. onAdd: '_onAdd',
  16. }),
  17. init: function (parent, model, renderer, params) {
  18. this._super.apply(this, arguments);
  19. this.open_popup_action = params.open_popup_action;
  20. this.date_start = params.date_start;
  21. this.date_stop = params.date_stop;
  22. this.date_delay = params.date_delay;
  23. this.context = params.actionContext;
  24. },
  25. update: function(params, options) {
  26. this._super.apply(this, arguments);
  27. if (_.isEmpty(params)){
  28. return;
  29. }
  30. var defaults = _.defaults({}, options, {
  31. adjust_window: true
  32. });
  33. var self = this;
  34. var domains = params.domain;
  35. var contexts = params.context;
  36. var group_bys = params.groupBy;
  37. this.last_domains = domains;
  38. this.last_contexts = contexts;
  39. // select the group by
  40. var n_group_bys = [];
  41. if (this.renderer.arch.attrs.default_group_by) {
  42. n_group_bys = this.renderer.arch.attrs.default_group_by.split(',');
  43. }
  44. if (group_bys.length) {
  45. n_group_bys = group_bys;
  46. }
  47. this.renderer.last_group_bys = n_group_bys;
  48. this.renderer.last_domains = domains;
  49. var fields = this.renderer.fieldNames;
  50. fields = _.uniq(fields.concat(n_group_bys));
  51. self._rpc({
  52. model: self.model.modelName,
  53. method: 'search_read',
  54. kwargs: {
  55. fields: fields,
  56. domain: domains,
  57. },
  58. context: self.getSession().user_context,
  59. }).then(function(data) {
  60. return self.renderer.on_data_loaded(data, n_group_bys, defaults.adjust_window);
  61. });
  62. },
  63. _onGroupClick: function (event) {
  64. var groupField = this.renderer.last_group_bys[0];
  65. return this.do_action({
  66. type: 'ir.actions.act_window',
  67. res_model: this.renderer.view.fields[groupField].relation,
  68. res_id: event.data.item.group,
  69. target: 'new',
  70. views: [[false, 'form']]
  71. });
  72. },
  73. _onUpdate: function(event) {
  74. var self = this;
  75. this.renderer = event.data.renderer;
  76. var rights = event.data.rights;
  77. var item = event.data.item;
  78. var id = item.evt.id;
  79. var title = item.evt.__name;
  80. if (this.open_popup_action) {
  81. new dialogs.FormViewDialog(this, {
  82. res_model: this.model.modelName,
  83. res_id: parseInt(id, 10).toString() === id ? parseInt(id, 10) : id,
  84. context: this.getSession().user_context,
  85. title: title,
  86. view_id: Number(this.open_popup_action),
  87. on_saved: function () {
  88. self.write_completed();
  89. },
  90. }).open();
  91. } else {
  92. var mode = 'readonly';
  93. if (rights.write) {
  94. mode = 'edit';
  95. }
  96. this.trigger_up('switch_view', {
  97. view_type: 'form',
  98. res_id: parseInt(id, 10).toString() === id ? parseInt(id, 10) : id,
  99. mode: mode,
  100. model: this.model.modelName,
  101. });
  102. }
  103. },
  104. _onMove: function(event) {
  105. var self = this;
  106. var item = event.data.item;
  107. var view = this.renderer.view;
  108. var fields = view.fields;
  109. var event_start = item.start;
  110. var event_end = item.end;
  111. var group = false;
  112. if (item.group !== -1) {
  113. group = item.group;
  114. }
  115. var data = {};
  116. // In case of a move event, the date_delay stay the same, only date_start and stop must be updated
  117. data[this.date_start] = time.auto_date_to_str(event_start, fields[this.date_start].type);
  118. if (this.date_stop) {
  119. // In case of instantaneous event, item.end is not defined
  120. if (event_end) {
  121. data[this.date_stop] = time.auto_date_to_str(event_end, fields[this.date_stop].type);
  122. } else {
  123. data[this.date_stop] = data[this.date_start];
  124. }
  125. }
  126. if (this.date_delay && event_end) {
  127. var diff_seconds = Math.round((event_end.getTime() - event_start.getTime()) / 1000);
  128. data[this.date_delay] = diff_seconds / 3600;
  129. }
  130. if (this.renderer.last_group_bys && this.renderer.last_group_bys instanceof Array) {
  131. data[this.renderer.last_group_bys[0]] = group;
  132. }
  133. self._rpc({
  134. model: self.model.modelName,
  135. method: 'write',
  136. args: [
  137. [event.data.item.id],
  138. data,
  139. ],
  140. context: self.getSession().user_context,
  141. }).then(function() {
  142. event.data.callback(event.data.item);
  143. self.write_completed({
  144. adjust_window: false
  145. });
  146. });
  147. },
  148. _onRemove: function(e) {
  149. var self = this;
  150. function do_it(event) {
  151. return self._rpc({
  152. model: self.model.modelName,
  153. method: 'unlink',
  154. args: [
  155. [event.data.item.id],
  156. ],
  157. context: self.getSession().user_context,
  158. }).then(function() {
  159. var unlink_index = false;
  160. for (var i=0; i<self.model.data.data.length; i++) {
  161. if (self.model.data.data[i].id === event.data.item.id) {
  162. unlink_index = i;
  163. }
  164. }
  165. if (!isNaN(unlink_index)) {
  166. self.model.data.data.splice(unlink_index, 1);
  167. }
  168. event.data.callback(event.data.item);
  169. });
  170. }
  171. var message = _t("Are you sure you want to delete this record?");
  172. var def = $.Deferred();
  173. Dialog.confirm(this, message, {
  174. title: _t("Warning"),
  175. confirm_callback: function() {
  176. do_it(e)
  177. .done(def.resolve.bind(def, true))
  178. .fail(def.reject.bind(def));
  179. },
  180. });
  181. return def.promise();
  182. },
  183. _onAdd: function(event) {
  184. var self = this;
  185. var item = event.data.item;
  186. // Initialize default values for creation
  187. var default_context = {};
  188. default_context['default_'.concat(this.date_start)] = item.start;
  189. if (this.date_delay) {
  190. default_context['default_'.concat(this.date_delay)] = 1;
  191. }
  192. if (this.date_stop) {
  193. default_context['default_'.concat(this.date_stop)] = moment(item.start).add(1, 'hours').toDate();
  194. }
  195. if (item.group > 0) {
  196. default_context['default_'.concat(this.renderer.last_group_bys[0])] = item.group;
  197. }
  198. // Show popup
  199. new dialogs.FormViewDialog(this, {
  200. res_model: this.model.modelName,
  201. res_id: null,
  202. context: _.extend(default_context, this.context),
  203. view_id: Number(this.open_popup_action),
  204. on_saved: function (record) {
  205. self.create_completed([record.res_id]);
  206. },
  207. }).open();
  208. return false;
  209. },
  210. create_completed: function (id) {
  211. var self = this;
  212. return this._rpc({
  213. model: this.model.modelName,
  214. method: 'read',
  215. args: [
  216. id,
  217. this.model.fieldNames,
  218. ],
  219. context: this.context,
  220. })
  221. .then(function (records) {
  222. var new_event = self.renderer.event_data_transform(records[0]);
  223. var items = self.renderer.timeline.itemsData;
  224. items.add(new_event);
  225. self.renderer.timeline.setItems(items);
  226. self.reload();
  227. });
  228. },
  229. write_completed: function (options) {
  230. var params = {
  231. domain: this.renderer.last_domains,
  232. context: this.context,
  233. groupBy: this.renderer.last_group_bys,
  234. };
  235. this.update(params, options);
  236. },
  237. });
  238. return CalendarController;
  239. });