Skip to content

Commit

Permalink
[IMP] web, crm: show conversion rate in tooltip for kanban stages
Browse files Browse the repository at this point in the history
  • Loading branch information
dbh-odoo committed Jan 31, 2018
1 parent 5017be9 commit 0b1c17b
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 9 deletions.
2 changes: 1 addition & 1 deletion addons/crm/views/crm_lead_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@
<field name="priority" eval="1"/>
<field name="arch" type="xml">
<kanban default_group_by="stage_id" class="o_kanban_small_column o_opportunity_kanban" on_create="quick_create" quick_create_view="crm.quick_create_opportunity_form">
<field name="stage_id" options='{"group_by_tooltip": {"requirements": "Description", "legend_priority": "Use of stars"}}'/>
<field name="stage_id" options='{"conversion_rate_tooltip": True, "group_by_tooltip": {"requirements": "Description", "legend_priority": "Use of stars"}}'/>
<field name="color"/>
<field name="priority"/>
<field name="planned_revenue"/>
Expand Down
19 changes: 17 additions & 2 deletions addons/web/static/src/js/views/kanban/kanban_column.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,7 @@ var KanbanColumn = Widget.extend({
this.$header.find('.o_column_title').text(title);

this.$el.toggleClass('o_column_folded', this.folded && !config.device.isMobile);
var tooltip = this.data.count + _t(' records');
tooltip = '<p>' + tooltip + '</p>' + this.tooltipInfo;
var tooltip = this.getTooltip()
this.$header.find('.o_kanban_header_title').tooltip({html: true}).attr('data-original-title', tooltip);
if (!this.remaining) {
this.$('.o_kanban_load_more').remove();
Expand Down Expand Up @@ -208,12 +207,28 @@ var KanbanColumn = Widget.extend({
this.quickCreateWidget.cancel();
}
},
/**
* Generate the tooltip.
*/
getTooltip: function() {
var tooltip = this.data.count + _t(' records');
return '<p>' + tooltip + '</p>' + this.tooltipInfo;;
},
/**
* @returns {Boolean} true iff the column is empty
*/
isEmpty: function () {
return !this.records.length;
},
/**
* Update current tooltip with conversion rate.
* @param {integer} rate percentage of conversion rate
*/
updateConversionTooltip: function(rate) {
var tooltip = this.getTooltip();
tooltip += _.str.sprintf('<div>%s %% %s</div>', rate, _t('conversion'));
this.$header.find('.o_kanban_header_title').attr('data-original-title', tooltip);
},

//--------------------------------------------------------------------------
// Private
Expand Down
26 changes: 20 additions & 6 deletions addons/web/static/src/js/views/kanban/kanban_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,10 @@ var KanbanController = BasicController.extend({
var data = this.model.get(this.handle, {raw: true});
var grouped = data.groupedBy.length;
if (grouped) {
this.renderer.updateState(data, {noRender: true});
var columnState = this.model.getColumn(id);
return this.renderer.updateColumn(columnState.id, columnState);
return this.renderer.updateColumn(columnState.id, columnState)
.then(this.renderer.updateConversionTooltip.bind(this.renderer));
}
return this.renderer.updateRecord(this.model.get(id));
},
Expand Down Expand Up @@ -174,10 +176,14 @@ var KanbanController = BasicController.extend({
.then(function (column_db_ids) {
return self._resequenceRecords(column.db_id, event.data.ids)
.then(function () {
var state = self.model.get(self.handle);
var defs = []
self.renderer.updateState(state, {noRender: true});
_.each(column_db_ids, function (db_id) {
var data = self.model.get(db_id);
self.renderer.updateColumn(db_id, data);
var data = _.findWhere(state.data, {id: db_id});
defs.push(self.renderer.updateColumn(db_id, data));
});
$.when.apply($, defs).then(self.renderer.updateConversionTooltip.bind(self.renderer));
});
}).fail(this.reload.bind(this));
},
Expand Down Expand Up @@ -291,8 +297,10 @@ var KanbanController = BasicController.extend({
var self = this;
var column = event.target;
this.model.loadMore(column.db_id).then(function (db_id) {
var data = self.model.get(db_id);
self.renderer.updateColumn(db_id, data);
var state = self.model.get(self.handle);
var data = _.findWhere(state.data, {id: db_id});
self.renderer.updateState(state, {noRender: true});
self.renderer.updateColumn(db_id, data).then(self.renderer.updateConversionTooltip.bind(self.renderer));
self._updateEnv();
});
},
Expand All @@ -316,12 +324,15 @@ var KanbanController = BasicController.extend({
self._updateEnv();

var columnState = self.model.getColumn(db_id);
var state = self.model.get(self.handle);
self.renderer.updateState(state, {noRender: true});
return self.renderer
.updateColumn(columnState.id, columnState, {openQuickCreate: true})
.then(function () {
if (event.data.openRecord) {
self.trigger_up('open_record', {id: db_id, mode: 'edit'});
}
self.renderer.updateConversionTooltip();
});
};

Expand Down Expand Up @@ -361,6 +372,9 @@ var KanbanController = BasicController.extend({
var state = this.model.get(this.handle, {raw: true});
var model = state.fields[state.groupedBy[0]].relation;
this.model.resequence(model, event.data.ids, this.handle).then(function () {
state = self.model.get(self.handle);
self.renderer.updateState(state, {noRender: true});
self.renderer.updateConversionTooltip();
self._updateEnv();
});
},
Expand All @@ -378,7 +392,7 @@ var KanbanController = BasicController.extend({
var options = {
openQuickCreate: !!event.data.openQuickCreate,
};
self.renderer.updateColumn(db_id, data, options);
self.renderer.updateColumn(db_id, data, options).then(self.renderer.updateConversionTooltip.bind(self.renderer));
self._updateEnv();
});
},
Expand Down
24 changes: 24 additions & 0 deletions addons/web/static/src/js/views/kanban/kanban_renderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,22 @@ var KanbanRenderer = BasicRenderer.extend({
});
});
},
/**
* Computes conversion rate and update tooltip of all columns with conversion rate.
*/
updateConversionTooltip: function() {
var self = this;
var totalRecords = _.reduce(this.state.data, function(total, data){ return total + data.count; }, 0);
if (this.columnOptions.conversion_rate_tooltip && totalRecords) {
var previousColumnRecords = 0;
_.map(this.state.data, function(group) {
var column = _.findWhere(self.widgets, {db_id: group.id});
var rate = ((totalRecords-previousColumnRecords) / totalRecords * 100).toFixed(2);
column.updateConversionTooltip(rate)
previousColumnRecords += group.count;
});
}
},
/**
* Updates a given record with its new state.
*
Expand Down Expand Up @@ -261,10 +277,16 @@ var KanbanRenderer = BasicRenderer.extend({
}
});

// Add conversion rate tooltip on all columns
if (this.columnOptions.conversion_rate_tooltip) {
this.updateConversionTooltip();
}

// remove previous sorting
if(this.$el.sortable('instance') !== undefined) {
this.$el.sortable('destroy');
}

if (this.groupedByM2O) {
// Enable column sorting
this.$el.sortable({
Expand Down Expand Up @@ -381,12 +403,14 @@ var KanbanRenderer = BasicRenderer.extend({
this.groupedByM2O = groupByFieldAttrs && (groupByFieldAttrs.type === 'many2one');
var relation = this.groupedByM2O && groupByFieldAttrs.relation;
var groupByTooltip = groupByFieldInfo && groupByFieldInfo.options.group_by_tooltip;
var conversionRateTooltip = groupByFieldInfo && groupByFieldInfo.options.conversion_rate_tooltip;
this.columnOptions = _.extend(this.columnOptions, {
draggable: draggable,
group_by_tooltip: groupByTooltip,
groupedBy: groupByField,
grouped_by_m2o: this.groupedByM2O,
relation: relation,
conversion_rate_tooltip: conversionRateTooltip,
});
this.createColumnEnabled = this.groupedByM2O && this.columnOptions.group_creatable;
},
Expand Down

0 comments on commit 0b1c17b

Please sign in to comment.