diff --git a/addons/base_gantt/static/src/js/gantt.js b/addons/base_gantt/static/src/js/gantt.js index 4a38747bf8a..307dc94c6b8 100644 --- a/addons/base_gantt/static/src/js/gantt.js +++ b/addons/base_gantt/static/src/js/gantt.js @@ -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('