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.

177 lines
6.4 KiB

  1. //-*- coding: utf-8 -*-
  2. //© 2017-2018 Therp BV <http://therp.nl>
  3. //License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. odoo.define('mail.Activity', function(require)
  5. {
  6. "use strict";
  7. var Chatter = require('mail.Chatter');
  8. var kanban_widgets = require('web_kanban.widgets');
  9. var Model = require('web.Model');
  10. var form_common = require('web.form_common');
  11. var core = require('web.core');
  12. var time = require('web.time');
  13. var _t = core._t;
  14. Chatter.include({
  15. init: function() {
  16. this._super.apply(this, arguments);
  17. this.schedule_activity_btn = !!this.view.fields.activity_ids;
  18. },
  19. start: function() {
  20. this.$('button.o_chatter_button_schedule_activity').click(
  21. this.proxy('_onScheduleActivity')
  22. );
  23. this.activity = this.view.fields.activity_ids;
  24. if(this.activity) {
  25. this.$('.o_chatter_topbar').after(this.activity.$el);
  26. }
  27. return this._super.apply(this, arguments);
  28. },
  29. _onScheduleActivity: function() {
  30. return this.view.fields.activity_ids._scheduleActivity(false);
  31. },
  32. });
  33. /**
  34. * Set the 'label_delay' entry in activity data according to the deadline date
  35. * @param {Array} activities list of activity Object
  36. * @return {Array} : list of modified activity Object
  37. */
  38. var setDelayLabel = function(activities) {
  39. var today = moment().startOf('day');
  40. _.each(activities, function(activity){
  41. var to_display = '';
  42. var deadline = moment(activity.date_deadline + ' 00:00:00');
  43. var diff = deadline.diff(today, 'days', true); // true means no rounding
  44. if(diff === 0){
  45. to_display = _t('Today');
  46. }else{
  47. if(diff < 0){ // overdue
  48. if(diff === -1){
  49. to_display = _t('Yesterday');
  50. }else{
  51. to_display = _.str.sprintf(_t('%d days overdue'), Math.abs(diff));
  52. }
  53. }else{ // due
  54. if(diff === 1){
  55. to_display = _t('Tomorrow');
  56. }else{
  57. to_display = _.str.sprintf(_t('Due in %d days'), Math.abs(diff));
  58. }
  59. }
  60. }
  61. activity.label_delay = to_display;
  62. });
  63. return activities;
  64. };
  65. var AbstractActivityField = form_common.AbstractField.extend({
  66. _scheduleActivity: function (id, previous_activity_type_id, callback) {
  67. var self = this,
  68. action = {
  69. type: 'ir.actions.act_window',
  70. res_model: 'mail.activity',
  71. view_mode: 'form',
  72. view_type: 'form',
  73. views: [[false, 'form']],
  74. target: 'new',
  75. context: {
  76. default_res_id: this.view.datarecord.id,
  77. default_res_model: this.view.dataset.model,
  78. default_previous_activity_type_id:
  79. previous_activity_type_id || false,
  80. },
  81. res_id: id || false,
  82. };
  83. return this.do_action(action, {
  84. on_close: function() {
  85. if(callback) {
  86. callback();
  87. }
  88. return self.field_manager.reload();
  89. },
  90. });
  91. },
  92. });
  93. var Activity = AbstractActivityField.extend({
  94. className: 'o_mail_activity',
  95. custom_events: {
  96. reload_mail_fields: '_onReloadMailFields',
  97. },
  98. events: {
  99. 'click .o_activity_edit': '_onEditActivity',
  100. 'click .o_activity_unlink': '_onUnlinkActivity',
  101. 'click .o_activity_done': '_onMarkActivityDone',
  102. },
  103. render_value: function() {
  104. return $.when(
  105. this._super.apply(this, arguments),
  106. this._readActivities()
  107. ).then(this.proxy('_render_value'));
  108. },
  109. _render_value: function() {
  110. var activities = setDelayLabel(this.activities);
  111. if (activities.length) {
  112. var nbActivities = _.countBy(activities, 'state');
  113. this.$el.html(core.qweb.render('mail.activity_items', {
  114. activities: activities,
  115. nbPlannedActivities: nbActivities.planned,
  116. nbTodayActivities: nbActivities.today,
  117. nbOverdueActivities: nbActivities.overdue,
  118. }));
  119. } else {
  120. this.$el.empty();
  121. }
  122. },
  123. _readActivities: function() {
  124. var self = this;
  125. return new Model('mail.activity')
  126. .query([])
  127. .filter([['id', 'in', this.get('value')]])
  128. .all()
  129. .then(function(activities) {
  130. self.activities = activities;
  131. });
  132. },
  133. // handlers
  134. _onEditActivity: function (event, options) {
  135. event.preventDefault();
  136. var self = this;
  137. var activity_id = $(event.currentTarget).data('activity-id');
  138. var action = _.defaults(options || {}, {
  139. type: 'ir.actions.act_window',
  140. res_model: 'mail.activity',
  141. view_mode: 'form',
  142. view_type: 'form',
  143. views: [[false, 'form']],
  144. target: 'new',
  145. context: {
  146. default_res_id: this.view.datarecord.id,
  147. default_res_model: this.view.dataset.model,
  148. },
  149. res_id: activity_id,
  150. });
  151. return this.do_action(action, {
  152. on_close: function () {
  153. return self.field_manager.reload();
  154. },
  155. });
  156. },
  157. _onUnlinkActivity: function (event, options) {
  158. event.preventDefault();
  159. var activity_id = $(event.currentTarget).data('activity-id');
  160. options = _.defaults(options || {}, {
  161. model: 'mail.activity',
  162. args: [[activity_id]],
  163. });
  164. return new Model('mail.activity')
  165. .call('unlink', [activity_id])
  166. .then(this.render_value.bind(this));
  167. },
  168. });
  169. core.form_widget_registry.add('mail_activity', Activity);
  170. return Activity;
  171. });