3
0
Fork 0

Merge pull request #1024 from tarteo/patch-1

[11.0][ADD] Enable multiselect and fixed time axis in timeline
11.0
Pedro M. Baeza 2018-10-02 20:57:12 +02:00 committed by GitHub
commit e8592b42d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 18 deletions

View File

@ -116,6 +116,8 @@ edit the involved record directly.
Double-click on the record to edit it. Double-click in open area to create a Double-click on the record to edit it. Double-click in open area to create a
new record with the group and start date linked to the area you clicked in. new record with the group and start date linked to the area you clicked in.
By holding the Ctrl key and dragging left to right, you can create a new record
with the dragged start and end date.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
@ -125,8 +127,6 @@ new record with the group and start date linked to the area you clicked in.
Known issues / Roadmap Known issues / Roadmap
====================== ======================
* Implement support for vis.js timeline range item addition (with Ctrl key
pressed).
* Implement a more efficient way of refreshing timeline after a record update. * Implement a more efficient way of refreshing timeline after a record update.
Bug Tracker Bug Tracker

View File

@ -4,7 +4,7 @@
{ {
'name': "Web timeline", 'name': "Web timeline",
'summary': "Interactive visualization chart to show events in time", 'summary': "Interactive visualization chart to show events in time",
"version": "11.0.1.3.0", "version": "11.0.1.4.0",
'author': 'ACSONE SA/NV, ' 'author': 'ACSONE SA/NV, '
'Tecnativa, ' 'Tecnativa, '
'Monk Software, ' 'Monk Software, '

View File

@ -25,6 +25,8 @@ var CalendarController = AbstractController.extend({
this.date_stop = params.date_stop; this.date_stop = params.date_stop;
this.date_delay = params.date_delay; this.date_delay = params.date_delay;
this.context = params.actionContext; this.context = params.actionContext;
this.moveQueue = [];
this.debouncedInternalMove = _.debounce(this.internalMove, 0);
}, },
update: function(params, options) { update: function(params, options) {
@ -111,7 +113,6 @@ var CalendarController = AbstractController.extend({
}, },
_onMove: function(event) { _onMove: function(event) {
var self = this;
var item = event.data.item; var item = event.data.item;
var view = this.renderer.view; var view = this.renderer.view;
var fields = view.fields; var fields = view.fields;
@ -139,16 +140,35 @@ var CalendarController = AbstractController.extend({
if (this.renderer.last_group_bys && this.renderer.last_group_bys instanceof Array) { if (this.renderer.last_group_bys && this.renderer.last_group_bys instanceof Array) {
data[this.renderer.last_group_bys[0]] = group; data[this.renderer.last_group_bys[0]] = group;
} }
self._rpc({
model: self.model.modelName, this.moveQueue.push({
method: 'write', id: event.data.item.id,
args: [ data: data,
[event.data.item.id], event: event
data, });
],
context: self.getSession().user_context, this.debouncedInternalMove();
}).then(function() { },
event.data.callback(event.data.item);
internalMove: function() {
var self = this;
var queue = this.moveQueue.slice();
this.moveQueue = [];
var defers = [];
_.each(queue, function(item) {
defers.push(self._rpc({
model: self.model.modelName,
method: 'write',
args: [
[item.event.data.item.id],
item.data,
],
context: self.getSession().user_context,
}).then(function() {
item.event.data.callback(item.event.data.item);
}));
});
return $.when.apply($, defers).done(function() {
self.write_completed({ self.write_completed({
adjust_window: false adjust_window: false
}); });
@ -203,8 +223,11 @@ var CalendarController = AbstractController.extend({
if (this.date_delay) { if (this.date_delay) {
default_context['default_'.concat(this.date_delay)] = 1; default_context['default_'.concat(this.date_delay)] = 1;
} }
if (this.date_stop) { if (this.date_start) {
default_context['default_'.concat(this.date_stop)] = moment(item.start).add(1, 'hours').toDate(); default_context['default_'.concat(this.date_start)] = moment(item.start).add(1, 'hours').toDate();
}
if (this.date_stop && item.end) {
default_context['default_'.concat(this.date_stop)] = moment(item.end).add(1, 'hours').toDate();
} }
if (item.group > 0) { if (item.group > 0) {
default_context['default_'.concat(this.renderer.last_group_bys[0])] = item.group; default_context['default_'.concat(this.renderer.last_group_bys[0])] = item.group;
@ -218,7 +241,10 @@ var CalendarController = AbstractController.extend({
on_saved: function (record) { on_saved: function (record) {
self.create_completed([record.res_id]); self.create_completed([record.res_id]);
}, },
}).open(); }).open().on('closed', this, function() {
event.data.callback();
});
return false; return false;
}, },

View File

@ -25,6 +25,7 @@ var CalendarRenderer = AbstractRenderer.extend({
this.options = params.options; this.options = params.options;
this.permissions = params.permissions; this.permissions = params.permissions;
this.timeline = params.timeline; this.timeline = params.timeline;
this.min_height = params.min_height;
this.date_start = params.date_start; this.date_start = params.date_start;
this.date_stop = params.date_stop; this.date_stop = params.date_stop;
this.date_delay = params.date_delay; this.date_delay = params.date_delay;
@ -52,6 +53,15 @@ var CalendarRenderer = AbstractRenderer.extend({
this._super.apply(this, self); this._super.apply(this, self);
}, },
on_attach_callback: function() {
var height = this.$el.parent().height() - this.$el.find('.oe_timeline_buttons').height();
if (height > this.min_height) {
this.timeline.setOptions({
height: height
});
}
},
_render: function () { _render: function () {
this.add_events(); this.add_events();
var self = this; var self = this;
@ -161,7 +171,7 @@ var CalendarRenderer = AbstractRenderer.extend({
onAdd: self.on_add, onAdd: self.on_add,
onMove: self.on_move, onMove: self.on_move,
onUpdate: self.on_update, onUpdate: self.on_update,
onRemove: self.on_remove, onRemove: self.on_remove
}); });
this.qweb = new QWeb(session.debug, {_s: session.origin}, false); this.qweb = new QWeb(session.debug, {_s: session.origin}, false);
if (this.arch.children.length) { if (this.arch.children.length) {
@ -188,6 +198,10 @@ var CalendarRenderer = AbstractRenderer.extend({
this.canvas.appendTo(this.$centerContainer); this.canvas.appendTo(this.$centerContainer);
this.timeline.on('changed', function() { this.timeline.on('changed', function() {
self.draw_canvas(); self.draw_canvas();
self.canvas.$el.attr(
'style',
self.$el.find('.vis-content').attr('style') + self.$el.find('.vis-itemset').attr('style')
);
}); });
}, },
@ -202,6 +216,9 @@ var CalendarRenderer = AbstractRenderer.extend({
var self = this; var self = this;
var items = this.timeline.itemSet.items; var items = this.timeline.itemSet.items;
_.each(items, function(item) { _.each(items, function(item) {
if (!item.data.evt) {
return;
}
_.each(item.data.evt[self.dependency_arrow], function(id) { _.each(item.data.evt[self.dependency_arrow], function(id) {
if (id in items) { if (id in items) {
self.draw_dependency(item, items[id]); self.draw_dependency(item, items[id]);

View File

@ -98,6 +98,7 @@ odoo.define('web_timeline.TimelineView', function (require) {
this.no_period = this.date_start === this.date_stop; this.no_period = this.date_start === this.date_stop;
this.zoomKey = attrs.zoomKey || ''; this.zoomKey = attrs.zoomKey || '';
this.mode = attrs.mode || attrs.default_window || 'fit'; this.mode = attrs.mode || attrs.default_window || 'fit';
this.min_height = attrs.min_height || 300;
this.current_window = { this.current_window = {
start: new moment(), start: new moment(),
@ -110,6 +111,7 @@ odoo.define('web_timeline.TimelineView', function (require) {
groupOrder: this.group_order, groupOrder: this.group_order,
orientation: 'both', orientation: 'both',
selectable: true, selectable: true,
multiselect: true,
showCurrentTime: true, showCurrentTime: true,
zoomKey: this.zoomKey zoomKey: this.zoomKey
}; };
@ -130,6 +132,7 @@ odoo.define('web_timeline.TimelineView', function (require) {
this.rendererParams.colors = this.colors; this.rendererParams.colors = this.colors;
this.rendererParams.fieldNames = fieldNames; this.rendererParams.fieldNames = fieldNames;
this.rendererParams.view = this; this.rendererParams.view = this;
this.rendererParams.min_height = this.min_height;
this.rendererParams.dependency_arrow = this.dependency_arrow; this.rendererParams.dependency_arrow = this.dependency_arrow;
this.loadParams.modelName = this.modelName; this.loadParams.modelName = this.modelName;
this.loadParams.fieldNames = fieldNames; this.loadParams.fieldNames = fieldNames;