[merge] improvements to gantt view

bzr revid: nicolas.vanhoren@openerp.com-20110812121337-fl41j7zr1x9nt0hl
This commit is contained in:
niv-openerp 2011-08-12 14:13:37 +02:00
commit 221243efa7
1 changed files with 115 additions and 77 deletions

View File

@ -1,16 +1,14 @@
/*---------------------------------------------------------
* OpenERP base_gantt
*---------------------------------------------------------*/
openerp.base_gantt = function (openerp) {
QWeb.add_template('/base_gantt/static/src/xml/base_gantt.xml');
openerp.base.views.add('gantt', 'openerp.base_gantt.GanttView');
openerp.base_gantt.GanttView = openerp.base.Widget.extend({
openerp.base_gantt.GanttView = openerp.base.View.extend({
init: function(view_manager, session, element_id, dataset, view_id) {
this._super(session, element_id);
this.view_manager = view_manager;
init: function(parent, element_id, dataset, view_id) {
this._super(parent, element_id);
this.view_manager = parent || new openerp.base.NullViewManager();
this.dataset = dataset;
this.model = dataset.model;
this.view_id = view_id;
@ -29,7 +27,7 @@ init: function(view_manager, session, element_id, dataset, view_id) {
this.calendar_fields = {};
this.info_fields = [];
this.domain = this.dataset._domain ? this.dataset._domain: [];
this.context = {};
this.context = this.dataset.context || {};
},
start: function() {
@ -52,8 +50,8 @@ init: function(view_manager, session, element_id, dataset, view_id) {
this.color_field = this.fields_view.arch.attrs.color;
this.day_length = this.fields_view.arch.attrs.day_length || 8;
this.colors = this.fields_view.arch.attrs.colors;
this.text = this.fields_view.arch.children[0].children[0].attrs.name;
var arch_children = this.fields_view.arch.children[0];
this.text = arch_children.children[0] ? arch_children.children[0].attrs.name : arch_children.attrs.name;
this.parent = this.fields_view.arch.children[0].attrs.link;
this.format = "yyyy-MM-dd";
@ -100,7 +98,7 @@ init: function(view_manager, session, element_id, dataset, view_id) {
if (result.length != 0){
var show_event = [];
for (i in result){
for (var i in result){
var res = result[i];
if (res[this.date_start] != false){
@ -132,7 +130,7 @@ init: function(view_manager, session, element_id, dataset, view_id) {
var child_event = {};
var temp_id = "";
var final_events = [];
for (i in show_event) {
for (var i in show_event) {
var res = show_event[i];
@ -161,11 +159,8 @@ init: function(view_manager, session, element_id, dataset, view_id) {
if (duration == false)
duration = 0
if (self.grp.length == 0){
self.grp.push({'group_by' : this.parent})
}
if (self.grp != undefined){
for (j in self.grp){
if (self.grp.length){
for (var j in self.grp){
var grp_key = res[self.grp[j]['group_by']];
if (typeof(grp_key) == "object"){
grp_key = res[self.grp[j]['group_by']][1];
@ -175,7 +170,7 @@ init: function(view_manager, session, element_id, dataset, view_id) {
}
if (grp_key == false){
grp_key = "False";
grp_key = "Undefined";
}
if (j == 0){
@ -207,9 +202,17 @@ init: function(view_manager, session, element_id, dataset, view_id) {
all_events[id] = {'parent': temp_id, 'evt':[id , text, start_date, duration, 100, "", color_box[color]]};
final_events.push(id);
}
else {
if (i == 0) {
var mod_id = "_" + i;
all_events[mod_id] = {'parent': "", 'evt': [mod_id, this.name, start_date, start_date, 100, "", "white"]};
}
all_events[id] = {'parent': mod_id, 'evt':[id , text, start_date, duration, 100, "", color_box[color]]};
final_events.push(id);
}
}
for (i in final_events){
for (var i in final_events){
var evt_id = final_events[i];
var evt_date = all_events[evt_id]['evt'][2];
while (all_events[evt_id]['parent'] != "") {
@ -225,7 +228,7 @@ init: function(view_manager, session, element_id, dataset, view_id) {
var evt_duration = "";
var evt_end_date = "";
for (i in final_events){
for (var i in final_events){
evt_id = final_events[i];
evt_date = all_events[evt_id]['evt'][2];
evt_duration = all_events[evt_id]['evt'][3];
@ -242,42 +245,27 @@ init: function(view_manager, session, element_id, dataset, view_id) {
}
}
for (j in self.grp){
for (i in all_events){
res = all_events[i];
if ((typeof(res['evt'][3])) == "object"){
res['evt'][3] = self.hours_between(res['evt'][2],res['evt'][3]);
}
k = res['evt'][0].toString().indexOf('_');
if (k != -1){
if (res['evt'][0].substring(k) == "_"+j){
if (j == 0){
task = new GanttTaskInfo(res['evt'][0], res['evt'][1], res['evt'][2], res['evt'][3], res['evt'][4], "",res['evt'][6]);
project.addTask(task);
} else {
task = new GanttTaskInfo(res['evt'][0], res['evt'][1], res['evt'][2], res['evt'][3], res['evt'][4], "",res['evt'][6]);
prt = project.getTaskById(res['parent']);
prt.addChildTask(task);
}
}
}
}
for (var j in self.grp) {
self.render_events(all_events, j);
}
for (i in final_events){
if (!self.grp.length) {
self.render_events(all_events, 0);
}
for (var i in final_events){
evt_id = final_events[i];
res = all_events[evt_id];
task=new GanttTaskInfo(res['evt'][0], res['evt'][1], res['evt'][2], res['evt'][3], res['evt'][4], "",res['evt'][6]);
prt = project.getTaskById(res['parent']);
prt.addChildTask(task);
}
oth_hgt = 264;
min_hgt = 150;
name_min_wdt = 150;
gantt_hgt = jQuery(window).height() - oth_hgt;
search_wdt = jQuery("#oe_app_search").width();
var oth_hgt = 264;
var min_hgt = 150;
var name_min_wdt = 150;
var gantt_hgt = jQuery(window).height() - oth_hgt;
var search_wdt = jQuery("#oe_app_search").width();
if (gantt_hgt > min_hgt){
jQuery('#GanttDiv').height(gantt_hgt).width(search_wdt);
@ -291,13 +279,13 @@ init: function(view_manager, session, element_id, dataset, view_id) {
ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_resize_drag_end(task, "drag");});
ganttChartControl.attachEvent("onTaskDblClick", function(task) {self.open_popup(task);});
taskdiv = jQuery("div.taskPanel").parent();
var taskdiv = jQuery("div.taskPanel").parent();
taskdiv.addClass('ganttTaskPanel');
taskdiv.prev().addClass('ganttDayPanel');
$gantt_panel = jQuery(".ganttTaskPanel , .ganttDayPanel");
var $gantt_panel = jQuery(".ganttTaskPanel , .ganttDayPanel");
ganttrow = jQuery('.taskPanel').closest('tr');
gtd = ganttrow.children(':first-child');
var ganttrow = jQuery('.taskPanel').closest('tr');
var gtd = ganttrow.children(':first-child');
gtd.children().addClass('task-name');
jQuery(".toggle-sidebar").click(function(e) {
@ -319,9 +307,8 @@ init: function(view_manager, session, element_id, dataset, view_id) {
$gantt_panel.width(1);
jQuery(".ganttTaskPanel").parent().width(1);
search_wdt = jQuery("#oe_app_search").width();
day_wdt = jQuery(".ganttDayPanel").children().children().width();
name_wdt = jQuery('.task-name').width();
var search_wdt = jQuery("#oe_app_search").width();
var day_wdt = jQuery(".ganttDayPanel").children().children().width();
jQuery('#GanttDiv').css('width','100%');
if (search_wdt - day_wdt <= name_min_wdt){
@ -345,7 +332,7 @@ init: function(view_manager, session, element_id, dataset, view_id) {
var self = this;
dat = this.convert_str_date(dat);
var dat = this.convert_str_date(dat);
var day = Math.floor(duration/self.day_length);
var hrs = duration % self.day_length;
@ -356,47 +343,98 @@ init: function(view_manager, session, element_id, dataset, view_id) {
return dat;
},
hours_between: function(date1, date2) {
hours_between: function(date1, date2, parent_task) {
var ONE_DAY = 1000 * 60 * 60 * 24;
var date1_ms = date1.getTime();
var date2_ms = date2.getTime();
var difference_ms = Math.abs(date1_ms - date2_ms);
d = Math.floor(difference_ms / ONE_DAY);
h = (difference_ms % ONE_DAY)/(1000 * 60 * 60);
num = (d * this.day_length) + h;
var d = parent_task? Math.ceil(difference_ms / ONE_DAY) : Math.floor(difference_ms / ONE_DAY);
var h = (difference_ms % ONE_DAY)/(1000 * 60 * 60);
var num = (d * this.day_length) + h;
return parseFloat(num.toFixed(2));
},
render_events : function(all_events, j) {
var self = this;
for (var i in all_events){
var res = all_events[i];
if ((typeof(res['evt'][3])) == "object"){
res['evt'][3] = self.hours_between(res['evt'][2],res['evt'][3], true);
}
k = res['evt'][0].toString().indexOf('_');
if (k != -1) {
if (res['evt'][0].substring(k) == "_"+j){
if (j == 0){
task = new GanttTaskInfo(res['evt'][0], res['evt'][1], res['evt'][2], res['evt'][3], res['evt'][4], "",res['evt'][6]);
project.addTask(task);
} else {
task = new GanttTaskInfo(res['evt'][0], res['evt'][1], res['evt'][2], res['evt'][3], res['evt'][4], "",res['evt'][6]);
prt = project.getTaskById(res['parent']);
prt.addChildTask(task);
}
}
}
}
},
open_popup : function(task) {
var event_id = task.getId();
if(event_id.toString().search("_") != -1)
return;
if (event_id) {
event_id = parseInt(event_id, 10);
var dataset_event_index = jQuery.inArray(event_id, this.ids);
} else {
var dataset_event_index = null;
if(event_id) event_id = parseInt(event_id, 10);
var action = {
"res_model": this.dataset.model,
"res_id": event_id,
"views":[[false,"form"]],
"type":"ir.actions.act_window",
"view_type":"form",
"view_mode":"form"
}
this.dataset.index = dataset_event_index;
action.flags = {
search_view: false,
sidebar : false,
views_switcher : false,
pager: false
}
var element_id = _.uniqueId("act_window_dialog");
var dialog = jQuery('<div>',
{'id': element_id
}).dialog({
title: 'Gantt Chart',
modal: true,
minWidth: 800,
position: 'top'
});
var event_form = new openerp.base.FormView(this.view_manager, this.session, element_id, this.dataset, false);
event_form.start();
var dialog = jQuery('<div>', {
'id': element_id
}).dialog({
modal: true,
width: 'auto',
height: 'auto',
buttons: {
Cancel: function() {
$(this).dialog("destroy");
},
Save: function() {
var view_manager = action_manager.viewmanager;
var _dialog = this;
view_manager.views[view_manager.active_view].controller.do_save(function(r) {
$(_dialog).dialog("destroy");
self.reload_gantt();
})
}
}
});
var action_manager = new openerp.base.ActionManager(this, element_id);
action_manager.start();
action_manager.do_action(action);
//Default_get
if(!event_id) action_manager.viewmanager.dataset.index = null;
},
on_drag_start : function(task){
st_date = task.getEST();
var st_date = task.getEST();
if(st_date.getHours()){
self.hh = st_date.getHours();
self.mm = st_date.getMinutes();