From 132c0ad9bf18e34809653a0cb8ca871858f6035e Mon Sep 17 00:00:00 2001 From: Hiral Bhavsar Date: Fri, 16 Nov 2018 13:09:14 +0000 Subject: [PATCH] [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 --- .../js/views/activity/activity_controller.js | 26 ++++++++++ .../src/js/views/activity/activity_model.js | 2 + .../js/views/activity/activity_renderer.js | 51 +++++++++++-------- .../mail/static/src/scss/activity_view.scss | 7 ++- addons/mail/static/src/xml/activity_view.xml | 20 +++++--- 5 files changed, 79 insertions(+), 27 deletions(-) diff --git a/addons/mail/static/src/js/views/activity/activity_controller.js b/addons/mail/static/src/js/views/activity/activity_controller.js index 1fb5f928c50..ede639a80fd 100644 --- a/addons/mail/static/src/js/views/activity/activity_controller.js +++ b/addons/mail/static/src/js/views/activity/activity_controller.js @@ -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 diff --git a/addons/mail/static/src/js/views/activity/activity_model.js b/addons/mail/static/src/js/views/activity/activity_model.js index f464cf6a92f..3a511c0ae57 100644 --- a/addons/mail/static/src/js/views/activity/activity_model.js +++ b/addons/mail/static/src/js/views/activity/activity_model.js @@ -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; } diff --git a/addons/mail/static/src/js/views/activity/activity_renderer.js b/addons/mail/static/src/js/views/activity/activity_renderer.js index 435a00d44c2..04c7d00530f 100644 --- a/addons/mail/static/src/js/views/activity/activity_renderer.js +++ b/addons/mail/static/src/js/views/activity/activity_renderer.js @@ -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 = $('') - .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 $('').append($rows); }, + /** + * @private + * @returns {jQueryElement} a element + */ + _renderFooter: function () { + return QWeb.render('mail.ActivityViewFooter'); + }, /** * @private * @returns {jQueryElement} a jquery element @@ -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 diff --git a/addons/mail/static/src/scss/activity_view.scss b/addons/mail/static/src/scss/activity_view.scss index 12f3c8af5a9..a6cdc0f7c10 100644 --- a/addons/mail/static/src/scss/activity_view.scss +++ b/addons/mail/static/src/scss/activity_view.scss @@ -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; diff --git a/addons/mail/static/src/xml/activity_view.xml b/addons/mail/static/src/xml/activity_view.xml index 0bbb2d5c3d5..2abada1486a 100644 --- a/addons/mail/static/src/xml/activity_view.xml +++ b/addons/mail/static/src/xml/activity_view.xml @@ -22,17 +22,25 @@ -
-
+ + + + + + + + - +
+ Schedule activity +
+