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
177 lines
6.4 KiB
//-*- coding: utf-8 -*-
|
|
//© 2017-2018 Therp BV <http://therp.nl>
|
|
//License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
|
|
odoo.define('mail.Activity', function(require)
|
|
{
|
|
"use strict";
|
|
var Chatter = require('mail.Chatter');
|
|
var kanban_widgets = require('web_kanban.widgets');
|
|
var Model = require('web.Model');
|
|
var form_common = require('web.form_common');
|
|
var core = require('web.core');
|
|
var time = require('web.time');
|
|
var _t = core._t;
|
|
Chatter.include({
|
|
init: function() {
|
|
this._super.apply(this, arguments);
|
|
this.schedule_activity_btn = !!this.view.fields.activity_ids;
|
|
},
|
|
start: function() {
|
|
this.$('button.o_chatter_button_schedule_activity').click(
|
|
this.proxy('_onScheduleActivity')
|
|
);
|
|
this.activity = this.view.fields.activity_ids;
|
|
if(this.activity) {
|
|
this.$('.o_chatter_topbar').after(this.activity.$el);
|
|
}
|
|
return this._super.apply(this, arguments);
|
|
},
|
|
_onScheduleActivity: function() {
|
|
return this.view.fields.activity_ids._scheduleActivity(false);
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Set the 'label_delay' entry in activity data according to the deadline date
|
|
* @param {Array} activities list of activity Object
|
|
* @return {Array} : list of modified activity Object
|
|
*/
|
|
var setDelayLabel = function(activities) {
|
|
var today = moment().startOf('day');
|
|
_.each(activities, function(activity){
|
|
var to_display = '';
|
|
var deadline = moment(activity.date_deadline + ' 00:00:00');
|
|
var diff = deadline.diff(today, 'days', true); // true means no rounding
|
|
if(diff === 0){
|
|
to_display = _t('Today');
|
|
}else{
|
|
if(diff < 0){ // overdue
|
|
if(diff === -1){
|
|
to_display = _t('Yesterday');
|
|
}else{
|
|
to_display = _.str.sprintf(_t('%d days overdue'), Math.abs(diff));
|
|
}
|
|
}else{ // due
|
|
if(diff === 1){
|
|
to_display = _t('Tomorrow');
|
|
}else{
|
|
to_display = _.str.sprintf(_t('Due in %d days'), Math.abs(diff));
|
|
}
|
|
}
|
|
}
|
|
activity.label_delay = to_display;
|
|
});
|
|
return activities;
|
|
};
|
|
|
|
var AbstractActivityField = form_common.AbstractField.extend({
|
|
_scheduleActivity: function (id, previous_activity_type_id, callback) {
|
|
var self = this,
|
|
action = {
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'mail.activity',
|
|
view_mode: 'form',
|
|
view_type: 'form',
|
|
views: [[false, 'form']],
|
|
target: 'new',
|
|
context: {
|
|
default_res_id: this.view.datarecord.id,
|
|
default_res_model: this.view.dataset.model,
|
|
default_previous_activity_type_id:
|
|
previous_activity_type_id || false,
|
|
},
|
|
res_id: id || false,
|
|
};
|
|
return this.do_action(action, {
|
|
on_close: function() {
|
|
if(callback) {
|
|
callback();
|
|
}
|
|
return self.field_manager.reload();
|
|
},
|
|
});
|
|
},
|
|
});
|
|
|
|
var Activity = AbstractActivityField.extend({
|
|
className: 'o_mail_activity',
|
|
custom_events: {
|
|
reload_mail_fields: '_onReloadMailFields',
|
|
},
|
|
events: {
|
|
'click .o_activity_edit': '_onEditActivity',
|
|
'click .o_activity_unlink': '_onUnlinkActivity',
|
|
'click .o_activity_done': '_onMarkActivityDone',
|
|
},
|
|
render_value: function() {
|
|
return $.when(
|
|
this._super.apply(this, arguments),
|
|
this._readActivities()
|
|
).then(this.proxy('_render_value'));
|
|
},
|
|
_render_value: function() {
|
|
var activities = setDelayLabel(this.activities);
|
|
if (activities.length) {
|
|
var nbActivities = _.countBy(activities, 'state');
|
|
this.$el.html(core.qweb.render('mail.activity_items', {
|
|
activities: activities,
|
|
nbPlannedActivities: nbActivities.planned,
|
|
nbTodayActivities: nbActivities.today,
|
|
nbOverdueActivities: nbActivities.overdue,
|
|
}));
|
|
} else {
|
|
this.$el.empty();
|
|
}
|
|
},
|
|
_readActivities: function() {
|
|
var self = this;
|
|
return new Model('mail.activity')
|
|
.query([])
|
|
.filter([['id', 'in', this.get('value')]])
|
|
.all()
|
|
.then(function(activities) {
|
|
self.activities = activities;
|
|
});
|
|
},
|
|
// handlers
|
|
_onEditActivity: function (event, options) {
|
|
event.preventDefault();
|
|
var self = this;
|
|
var activity_id = $(event.currentTarget).data('activity-id');
|
|
var action = _.defaults(options || {}, {
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'mail.activity',
|
|
view_mode: 'form',
|
|
view_type: 'form',
|
|
views: [[false, 'form']],
|
|
target: 'new',
|
|
context: {
|
|
default_res_id: this.view.datarecord.id,
|
|
default_res_model: this.view.dataset.model,
|
|
},
|
|
res_id: activity_id,
|
|
});
|
|
return this.do_action(action, {
|
|
on_close: function () {
|
|
return self.field_manager.reload();
|
|
},
|
|
});
|
|
},
|
|
_onUnlinkActivity: function (event, options) {
|
|
event.preventDefault();
|
|
var activity_id = $(event.currentTarget).data('activity-id');
|
|
options = _.defaults(options || {}, {
|
|
model: 'mail.activity',
|
|
args: [[activity_id]],
|
|
});
|
|
return new Model('mail.activity')
|
|
.call('unlink', [activity_id])
|
|
.then(this.render_value.bind(this));
|
|
},
|
|
});
|
|
core.form_widget_registry.add('mail_activity', Activity);
|
|
|
|
return Activity;
|
|
|
|
});
|