[IMP] mail: allow to create record from activity view

In the activity view footer, it's now possible to create a new record
(and an associated activity). When clicking on the link, a 'SelectCreate'
dialog is opened and the activity is created when selecting a record.

Task 1894990
This commit is contained in:
Hiral Bhavsar
2019-05-03 10:19:40 +00:00
committed by Martin Geubelle
parent fac99a901c
commit 132c0ad9bf
5 changed files with 79 additions and 27 deletions
@@ -2,11 +2,18 @@ odoo.define('mail.ActivityController', function (require) {
"use strict";
var BasicController = require('web.BasicController');
var core = require('web.core');
var field_registry = require('web.field_registry');
var ViewDialogs = require('web.view_dialogs');
var KanbanActivity = field_registry.get('kanban_activity');
var _t = core._t;
var ActivityController = BasicController.extend({
custom_events: _.extend({}, BasicController.prototype.custom_events, {
empty_cell_clicked: '_onEmptyCell',
send_mail_template: '_onSendMailTemplate',
schedule_activity: '_onScheduleActivity',
}),
//--------------------------------------------------------------------------
@@ -26,6 +33,25 @@ var ActivityController = BasicController.extend({
// Handlers
//--------------------------------------------------------------------------
/**
* @private
*/
_onScheduleActivity: function () {
var self = this;
var state = this.model.get(this.handle);
new ViewDialogs.SelectCreateDialog(this, {
res_model: state.model,
domain: this.model.originalDomain,
title: _.str.sprintf(_t("Search: %s"), this.renderer.arch.attrs.string),
disable_multiple_selection: true,
on_selected: function (record) {
var fakeRecord = self.renderer.getKanbanActivityData({}, record[0]);
var widget = new KanbanActivity(self, 'activity_ids', fakeRecord, {});
widget.scheduleActivity();
},
}).open();
},
/**
* @private
* @param {OdooEvent} ev
@@ -31,6 +31,7 @@ var ActivityModel = BasicModel.extend({
* @param {Array[]} params.domain
*/
load: function (params) {
this.originalDomain = _.extend([], params.domain);
params.domain.push(['activity_ids', '!=', false]);
this.domain = params.domain;
this.modelName = params.modelName;
@@ -46,6 +47,7 @@ var ActivityModel = BasicModel.extend({
*/
reload: function (handle, params) {
if (params && 'domain' in params) {
this.originalDomain = _.extend([], params.domain);
params.domain.push(['activity_ids', '!=', false]);
this.domain = params.domain;
}
@@ -18,6 +18,7 @@ var ActivityRenderer = AbstractRenderer.extend({
events: {
'click .o_send_mail_template': '_onSenMailTemplateClicked',
'click .o_activity_empty_cell': '_onEmptyCell',
'click .o_record_selector': '_onRecordSelector',
},
/**
@@ -32,16 +33,15 @@ var ActivityRenderer = AbstractRenderer.extend({
},
//--------------------------------------------------------------------------
// Private
// Public
//--------------------------------------------------------------------------
/**
* @private
* @param {Object} activityGroup
* @param {integer} resID
* @returns {Object}
*/
_getKanbanActivityData: function (activityGroup, resID) {
getKanbanActivityData: function (activityGroup, resID) {
return {
data: {
activity_ids: {
@@ -70,6 +70,11 @@ var ActivityRenderer = AbstractRenderer.extend({
//todo intercept event or changes on record to update view
};
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* @override
* @private
@@ -82,22 +87,13 @@ var ActivityRenderer = AbstractRenderer.extend({
* @private
*/
_render: function () {
this.$el
.removeClass('table-responsive')
.empty();
if (this.state.activity_types.length === 0) {
this.$el.append(QWeb.render('ActivityView.nodata'));
} else {
var $table = $('<table>')
.addClass('table-bordered')
.append(this._renderHeader())
.append(this._renderBody());
this.$el
.addClass('table-responsive')
.append($table);
}
return this._super();
this.$el.addClass('table-responsive');
this.$el.html(QWeb.render('mail.ActivityView', { isEmpty: !this.state.activity_types.length }));
this.$('table')
.append(this._renderHeader())
.append(this._renderBody())
.append(this._renderFooter());
return this._super.apply(this, arguments);
},
/**
* @private
@@ -107,6 +103,13 @@ var ActivityRenderer = AbstractRenderer.extend({
var $rows = _.map(this.state.activity_res_ids, this._renderRow.bind(this));
return $('<tbody>').append($rows);
},
/**
* @private
* @returns {jQueryElement} a <tfoot> element
*/
_renderFooter: function () {
return QWeb.render('mail.ActivityViewFooter');
},
/**
* @private
* @returns {jQueryElement} a jquery element <thead>
@@ -154,7 +157,7 @@ var ActivityRenderer = AbstractRenderer.extend({
activityTypeId: activity_type_id,
}));
if (activity_group.state) {
var record = self._getKanbanActivityData(activity_group, resId);
var record = self.getKanbanActivityData(activity_group, resId);
var widget = new KanbanActivity(self, "activity_ids", record, {});
widget.appendTo($td).then(function() {
// replace clock by closest deadline
@@ -198,6 +201,14 @@ var ActivityRenderer = AbstractRenderer.extend({
var data = $(ev.currentTarget).data();
this.trigger_up('empty_cell_clicked', data);
},
/**
* @private
* @param {MouseEvent} ev
*/
_onRecordSelector: function (ev) {
ev.stopPropagation();
this.trigger_up('schedule_activity');
},
/**
* @private
* @override
@@ -2,10 +2,12 @@
height: 100%;
> table {
background-color: white;
tbody > tr > td, tfoot > tr > td {
cursor: pointer;
}
}
.o_activity_summary_cell {
background-color: #FFF;
cursor: pointer;
&.planned {
background-color: theme-color('success');
}
@@ -87,6 +89,9 @@
display: block;
}
}
.o_record_selector {
color: $o-enterprise-primary-color;
}
.o_activity_type_cell {
padding:10px;
min-width:100px;
+14 -6
View File
@@ -22,17 +22,25 @@
</td>
</t>
<div t-name="ActivityView.nodata">
<div class="o_view_nocontent" role="alert">
<t t-name="mail.ActivityViewFooter">
<tfoot>
<tr class="o_data_row">
<td class="o_record_selector p-3">
<span class="fa fa-plus pr-2"/><span>Schedule activity</span>
</td>
</tr>
</tfoot>
</t>
<t t-name="mail.ActivityView">
<div t-if="isEmpty" class="o_view_nocontent" role="alert">
<div class="o_nocontent_help">
<p class="o_view_nocontent_empty_folder">
No data to display
</p><p>
No activity scheduled.
Activities can be scheduled from the form view chatter.
</p>
</div>
</div>
</div>
<table t-else="" class="table-bordered mb-5"/>
</t>
</templates>