[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:
committed by
Martin Geubelle
parent
fac99a901c
commit
132c0ad9bf
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user