From 109ddd9d0ca7760806aef959f55ce649f2036df0 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 3 Nov 2011 16:21:41 +0530 Subject: [PATCH 01/19] [IMP] Gantt View.Still need to improve for group by. bzr revid: vda@tinyerp.com-20111103105141-dahiz09fvu0l45bu --- .../lib/dhtmlxGantt/sources/dhtmlxcommon.js | 31 +++ .../lib/dhtmlxGantt/sources/dhtmlxgantt.js | 19 +- addons/web_gantt/static/src/js/gantt.js | 202 ++++++++++++++---- addons/web_gantt/static/src/xml/web_gantt.xml | 2 +- 4 files changed, 197 insertions(+), 57 deletions(-) diff --git a/addons/web_gantt/static/lib/dhtmlxGantt/sources/dhtmlxcommon.js b/addons/web_gantt/static/lib/dhtmlxGantt/sources/dhtmlxcommon.js index bc7de14346d..7f68a0a702c 100644 --- a/addons/web_gantt/static/lib/dhtmlxGantt/sources/dhtmlxcommon.js +++ b/addons/web_gantt/static/lib/dhtmlxGantt/sources/dhtmlxcommon.js @@ -2,6 +2,37 @@ Copyright DHTMLX LTD. http://www.dhtmlx.com To use this component please contact sales@dhtmlx.com to obtain license */ + +dhtmlx=function(obj){ + for (var a in obj) dhtmlx[a]=obj[a]; + return dhtmlx; //simple singleton +}; +dhtmlx.extend_api=function(name,map,ext){ + var t = window[name]; + if (!t) return; //component not defined + window[name]=function(obj){ + if (obj && typeof obj == "object" && !obj.tagName){ + var that = t.apply(this,(map._init?map._init(obj):arguments)); + //global settings + for (var a in dhtmlx) + if (map[a]) this[map[a]](dhtmlx[a]); + //local settings + for (var a in obj){ + if (map[a]) this[map[a]](obj[a]); + else if (a.indexOf("on")==0){ + this.attachEvent(a,obj[a]); + } + } + } else + var that = t.apply(this,arguments); + if (map._patch) map._patch(this); + return that||this; + }; + window[name].prototype=t.prototype; + if (ext) + dhtmlXHeir(window[name].prototype,ext); +}; + dhtmlxAjax={ get:function(url,callback){ var t=new dtmlXMLLoaderObject(true); diff --git a/addons/web_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js b/addons/web_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js index 0d838fdd510..52b9b562e96 100644 --- a/addons/web_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js +++ b/addons/web_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js @@ -173,9 +173,8 @@ GanttProjectInfo.prototype.getTaskByIdInTree = function(parentTask, id) * @type: public * @topic: 0 */ -function GanttTaskInfo(id, name, est, duration, percentCompleted, predecessorTaskId, color) +function GanttTaskInfo(id, name, est, duration, percentCompleted, predecessorTaskId) { - this.color = color || "white"; this.Id = id; this.Name = name; this.EST = est; @@ -349,7 +348,7 @@ GanttProject.prototype.create = function() * @type: public * @topic: 0 */ -function GanttChart(day_length) +function GanttChart() { this.Error = new GanttError(); this.dhtmlXMLSenderObject = new dhtmlXMLSenderObject(this); @@ -357,7 +356,7 @@ function GanttChart(day_length) //settings this.heightTaskItem = 12; this.dayInPixels = 24; - this.hoursInDay = day_length; + this.hoursInDay = 8; this._showTreePanel = true; this._showTooltip = true; this.isShowDescTask = false; @@ -1162,7 +1161,7 @@ GanttProject.prototype.deleteChildTask = function(task) * @type: public * @topic: 1 */ -GanttProject.prototype.insertTask = function(id, name, EST, Duration, PercentCompleted, predecessorTaskId, color, parentTaskId) +GanttProject.prototype.insertTask = function(id, name, EST, Duration, PercentCompleted, predecessorTaskId, parentTaskId) { var task = null; var _task = null; @@ -1205,7 +1204,7 @@ GanttProject.prototype.insertTask = function(id, name, EST, Duration, PercentCom return false; } - task = new GanttTaskInfo(id, name, EST, Duration, PercentCompleted, predecessorTaskId, color); + task = new GanttTaskInfo(id, name, EST, Duration, PercentCompleted, predecessorTaskId); if (!this.Chart.checkPosParentTask(parentTask, task)) { this.Chart.Error.throwError("DATA_INSERT_ERROR", 19, [parentTaskId,id]); @@ -4870,13 +4869,11 @@ GanttTask.prototype.createTaskItem = function() cellTblTask.height = this.Chart.heightTaskItem + "px"; cellTblTask.width = this.TaskInfo.PercentCompleted + "%"; cellTblTask.style.lineHeight = "1px"; - cellTblTask.style.backgroundColor = self.TaskInfo.color; - var imgPr = document.createElement("img"); imgPr.style.width = (this.TaskInfo.PercentCompleted * this.TaskInfo.Duration * this.Chart.hourInPixelsWork) / 100 + "px"; imgPr.style.height = this.Chart.heightTaskItem + "px"; cellTblTask.appendChild(imgPr); - //imgPr.src = this.Chart.imgs + "progress_filled.png"; + imgPr.src = this.Chart.imgs + "progress_filled.png"; } if (this.TaskInfo.PercentCompleted != 100) @@ -4946,9 +4943,9 @@ GanttTask.prototype.createTaskItem = function() } var taskClick = function() { - self.Chart.callEvent("onTaskDblClick", [self]); + self.Chart.callEvent("onTaskClick", [self]); }; - this.addEvent(divMove, 'dblclick', taskClick, false); + this.addEvent(divMove, 'click', taskClick, false); if (this.Chart.isEditable) { diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index bdd57b7bf0a..3ba19a67c98 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -2,7 +2,9 @@ * OpenERP web_gantt *---------------------------------------------------------*/ openerp.web_gantt = function (openerp) { +var _t = openerp.web._t; var QWeb = openerp.web.qweb; + QWeb.add_template('/web_gantt/static/src/xml/web_gantt.xml'); openerp.web.views.add('gantt', 'openerp.web_gantt.GanttView'); openerp.web_gantt.GanttView = openerp.web.View.extend({ @@ -13,68 +15,167 @@ init: function(parent, dataset, view_id) { this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; - this.fields_views = {}; - this.widgets = {}; - this.widgets_counter = 0; - this.fields = this.dataset.fields ? this.dataset.fields: {}; - this.ids = this.dataset.ids; - this.name = ""; - this.date_start = ""; - this.date_delay = ""; - this.date_stop = ""; - this.color_field = ""; - this.colors = []; - this.color_values = []; - this.calendar_fields = {}; - this.info_fields = []; - this.domain = this.dataset._domain ? this.dataset._domain: []; + this.domain = this.dataset.domain || []; + this.groupby = []; this.context = this.dataset.context || {}; + this.has_been_loaded = $.Deferred(); +// this.ganttChartControl = new GanttChart(); + this.COLOR_PALETTE = ['#ccccff', '#cc99ff', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400', + '#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f', + '#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00', + '#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900']; }, start: function() { this._super(); - this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "gantt"}, this.on_loaded); + return this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "gantt"}, this.on_loaded); }, on_loaded: function(data) { - - var self = this; - this.fields_view = data; - - this.name = this.fields_view.arch.attrs.string; - this.view_id = this.fields_view.view_id; - - this.date_start = this.fields_view.arch.attrs.date_start; - this.date_delay = this.fields_view.arch.attrs.date_delay; - this.date_stop = this.fields_view.arch.attrs.date_stop; - - this.color_field = this.fields_view.arch.attrs.color; + this.fields_view = data, + this.name = this.fields_view.arch.attrs.string, + this.view_id = this.fields_view.view_id, + this.fields = this.fields_view.fields; + + this.date_start = this.fields_view.arch.attrs.date_start, + this.date_delay = this.fields_view.arch.attrs.date_delay, + this.date_stop = this.fields_view.arch.attrs.date_stop, this.day_length = this.fields_view.arch.attrs.day_length || 8; + + this.color_field = this.fields_view.arch.attrs.color, this.colors = this.fields_view.arch.attrs.colors; - 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"; - this.grp = []; - - self.create_gantt(); - self.get_events(); - - this.$element.html(QWeb.render("GanttView", {"view": this, "fields_view": this.fields_view})); - + + var level = this.fields_view.arch.children[0]; + this.parent = level.attrs.link, + this.text = level.children.length ? level.children[0].attrs.name : level.attrs.name; + + this.$element.html(QWeb.render("GanttView", {'height': $('.oe-application-container').height(), 'width': $('.oe-application-container').width()})); + this.has_been_loaded.resolve(); + }, + + on_project_loaded: function(projects) { + + if(!projects.length) return; + var self = this, + unstarted_project = _.detect(projects, function(res) { + return !res[self.date_start]; + }); + + if(unstarted_project) return self.do_warn(_t("Start date is not defined "), unstarted_project.id); + + $.when(this.project_starting_date(projects), this.project_duration(projects), this.calculate_difference()) + .done(function() { + var Project = new GanttProjectInfo(0, self.name, self.project_start_date), + Task = new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, ""); + $.when(self.add_tasks(projects, Task)) + .done(function() { + self.init_gantt_view(Project, Task); + }) + }); + }, + + project_duration: function(projects) { + + var self = this; + this.project_duration = []; + + _.each(projects, function(project, index) { + if (this.date_stop && project[this.date_stop]) { + //ToDO + console.log('TODO for date_stop'); + self.project_duration.push(0); + } else if(self.date_delay && project[self.date_delay]) { + self.project_duration.push(project[self.date_delay]); + } else { + self.project_duration.push(0); + } + }); + + this.max_project_duration = _.max(this.project_duration); + + return $.Deferred().resolve().promise(); + }, + + calculate_difference: function() { + + + var extend_end_date_day = Math.floor(this.max_project_duration / this.day_length), + extend_end_date_hours = this.max_project_duration % this.day_length; + + this.project_end_date = this.project_end_date.add({days: extend_end_date_day, hours: extend_end_date_hours}) + + var DAY = 1000 * 60 * 60 * 24, + difference = Math.abs(this.project_start_date.getTime() - this.project_end_date.getTime()), + day = Math.ceil(difference / DAY), + hour = (difference % DAY)/(1000 * 60 * 60), + DiffHour = (day * this.day_length) + hour; + + this.total_duration = parseFloat(DiffHour.toFixed(2)); + return $.Deferred().resolve().promise(); + }, + + add_tasks: function(tasks, parentTask) { + var self = this; + + _.each(tasks, function(task, index) { + parentTask.addChildTask(new GanttTaskInfo(task.id, task.name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")); + }); + + return $.Deferred().resolve().promise(); + }, + + project_starting_date : function(projects) { + var self = this; + var min_date = _.min(projects, function(prj) { + return new Date(prj[self.date_start]); + }); + + var max_date = _.max(projects, function(prj) { + return self.format_date(prj[self.date_start]) + }); + this.project_end_date = this.format_date(max_date[self.date_start]); + if (min_date) this.project_start_date = this.format_date(min_date[self.date_start]); + else + this.project_start_date = Date.today(); + + return $.Deferred().resolve().promise(); }, - create_gantt: function() { + init_gantt_view: function(Project, Task) { + Project.addTask(Task); + ganttChartControl = new GanttChart(); - ganttChartControl = new GanttChart(this.day_length); + // Setup paths and behavior ganttChartControl.setImagePath("/web_gantt/static/lib/dhtmlxGantt/codebase/imgs/"); ganttChartControl.setEditable(true); ganttChartControl.showTreePanel(true); ganttChartControl.showContextMenu(false); ganttChartControl.showDescTask(true,'d,s-f'); ganttChartControl.showDescProject(true,'n,d'); - + // Load data structure + ganttChartControl.addProject(Project); + ganttChartControl.create('GanttView'); + // Create Gantt control + + }, + + add_project_info: function(smalldate, project, index) { + + }, + + format_date : function(date) { + var datetime_regex = /^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)(?:\.\d+)?$/, + date_regex = /^\d\d\d\d-\d\d-\d\d$/, + time_regex = /^(\d\d:\d\d:\d\d)(?:\.\d+)?$/, + def = $.Deferred(); + if(date_regex.exec(date)) { + this.date_format = "yyyy-MM-dd"; + } else if(time_regex.exec(date)) { + this.date_format = "HH:mm:ss"; + } else { + this.date_format = "yyyy-MM-dd HH:mm:ss"; + } + return openerp.web.auto_str_to_date(date); }, get_events: function() { @@ -502,8 +603,19 @@ init: function(parent, dataset, view_id) { do_search: function (domains, contexts, groupbys) { var self = this; - this.grp = groupbys; - self.reload_gantt(); + this.group_by = groupbys; + $.when(this.has_been_loaded).then(function() { + self.dataset + .read_slice(_.keys(self.fields), { + domain: domains, + context: contexts, + group_by: groupbys + }) + .done(function(projects) { + self.on_project_loaded(projects); + }); + }) + } }); diff --git a/addons/web_gantt/static/src/xml/web_gantt.xml b/addons/web_gantt/static/src/xml/web_gantt.xml index d064d6e9ef2..48a1a1025dd 100644 --- a/addons/web_gantt/static/src/xml/web_gantt.xml +++ b/addons/web_gantt/static/src/xml/web_gantt.xml @@ -1,5 +1,5 @@ From 8224421647c6b40876c3b341c76c9b2c4587ea47 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 3 Nov 2011 17:32:52 +0530 Subject: [PATCH 02/19] [FIX] added events. bzr revid: vda@tinyerp.com-20111103120252-ius83ekv8dz54wgl --- addons/web_gantt/static/src/js/gantt.js | 440 +++--------------------- 1 file changed, 56 insertions(+), 384 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 3ba19a67c98..931579502f1 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -49,6 +49,10 @@ init: function(parent, dataset, view_id) { this.parent = level.attrs.link, this.text = level.children.length ? level.children[0].attrs.name : level.attrs.name; + if (!this.date_start) { + return self.do_warn(_t("date_start is not defined ")) + } + this.$element.html(QWeb.render("GanttView", {'height': $('.oe-application-container').height(), 'width': $('.oe-application-container').width()})); this.has_been_loaded.resolve(); }, @@ -57,20 +61,18 @@ init: function(parent, dataset, view_id) { if(!projects.length) return; var self = this, - unstarted_project = _.detect(projects, function(res) { - return !res[self.date_start]; + started_projects = _.filter(projects, function(res) { + return res[self.date_start]; }); - if(unstarted_project) return self.do_warn(_t("Start date is not defined "), unstarted_project.id); - - $.when(this.project_starting_date(projects), this.project_duration(projects), this.calculate_difference()) + $.when(this.project_starting_date(started_projects), this.project_duration(started_projects), this.calculate_difference()) .done(function() { var Project = new GanttProjectInfo(0, self.name, self.project_start_date), Task = new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, ""); - $.when(self.add_tasks(projects, Task)) + $.when(self.add_tasks(started_projects, Task)) .done(function() { self.init_gantt_view(Project, Task); - }) + }); }); }, @@ -142,8 +144,10 @@ init: function(parent, dataset, view_id) { }, init_gantt_view: function(Project, Task) { + Project.addTask(Task); - ganttChartControl = new GanttChart(); + var self = this, + ganttChartControl = new GanttChart(); // Setup paths and behavior ganttChartControl.setImagePath("/web_gantt/static/lib/dhtmlxGantt/codebase/imgs/"); @@ -157,9 +161,18 @@ init: function(parent, dataset, view_id) { ganttChartControl.create('GanttView'); // Create Gantt control - }, - - add_project_info: function(smalldate, project, index) { + + // Setup Events + ganttChartControl.attachEvent("onTaskStartDrag", function(task) { + var task_date = task.getEST(); + if(task_date.getHours()) { + task_date.set({hour: task_date.getHours(), minute : task_date.getMinutes(), second:0}); + } + }); + ganttChartControl.attachEvent("onTaskEndResize", function(task) {return self.ResizeTask(task);}); + ganttChartControl.attachEvent("onTaskEndDrag", function(task) {return self.ResizeTask(task);}); + + ganttChartControl.attachEvent("onTaskDblClick", function(task) { return self.editTask(task);}); }, @@ -177,320 +190,38 @@ init: function(parent, dataset, view_id) { } return openerp.web.auto_str_to_date(date); }, - - get_events: function() { - - var self = this; - this.dataset.read_slice([],{}, function(result) { - self.load_event(result); - }); - - }, - - load_event: function(events) { - - var self = this; - var result = events; - var smalldate = ""; - - COLOR_PALETTE = ['#ccccff', '#cc99ff', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400', - '#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f', - '#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00', - '#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900']; - - if (result.length != 0){ - var show_event = []; - for (var i in result){ - var res = result[i]; - if (res[this.date_start] != false){ - - var start_date = this.convert_str_date(res[this.date_start]); - res[this.date_start] = start_date; - show_event.push(res); - if (smalldate == ""){ - smalldate = start_date; - } - else{ - if (start_date < smalldate){ - smalldate = start_date; - } - } - } - } - if (smalldate == ""){ - smalldate = Date.today(); - } - project = new GanttProjectInfo("_1", "", smalldate); - ganttChartControl.addProject(project); - } - - //create child - var k = 0; - var color_box = {}; - var parents = {}; - var all_events = {}; - var child_event = {}; - var temp_id = ""; - var final_events = []; - for (var i in show_event) { - - var res = show_event[i]; - - var id = res['id']; - var text = res[this.text]; - var start_date = res[this.date_start]; - - var color = res[this.color_field][0] || res[this.color_field]; - if (color_box[color] == undefined){ - color_box[color] = COLOR_PALETTE[k]; - k += 1; - } - - if (this.date_stop != undefined){ - if (res[this.date_stop] != false){ - var stop_date = this.convert_str_date(res[this.date_stop]); - var duration= self.hours_between(start_date, stop_date); - } - else{ - var duration = 0; - } - } - else{ - var duration = res[this.date_delay]; - } - if (!duration) - duration = 0; - - 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]; - } - else{ - grp_key = res[self.grp[j]['group_by']]; - } - - if (!grp_key){ - grp_key = "Undefined"; - } - - if (j == 0){ - if (parents[grp_key] == undefined){ - var mod_id = i+ "_" +j; - parents[grp_key] = mod_id; - child_event[mod_id] = {}; - all_events[mod_id] = {'parent': "", 'evt':[mod_id , grp_key, start_date, start_date, 100, "", "white"]}; - } - else{ - mod_id = parents[grp_key]; - } - temp_id = mod_id; - }else{ - if (child_event[mod_id][grp_key] == undefined){ - var ch_mod_id = i+ "_" +j; - child_event[mod_id][grp_key] = ch_mod_id; - child_event[ch_mod_id] = {}; - temp_id = ch_mod_id; - all_events[ch_mod_id] = {'parent': mod_id, 'evt':[ch_mod_id , grp_key, start_date, start_date, 100, "","white"]}; - mod_id = ch_mod_id; - } - else{ - mod_id = child_event[mod_id][grp_key]; - temp_id = mod_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 (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'] != "") { - var parent_id =all_events[evt_id]['parent']; - if (all_events[parent_id]['evt'][2] > evt_date){ - all_events[parent_id]['evt'][2] = evt_date; - } - evt_id = parent_id; - } - } - var evt_id = []; - var evt_date = ""; - var evt_duration = ""; - var evt_end_date = ""; - var project_tree_field = []; - 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]; - - var evt_str_date = this.convert_date_str(evt_date); - evt_end_date = this.end_date(evt_str_date, evt_duration); - - while (all_events[evt_id]['parent'] != "") { - var parent_id =all_events[evt_id]['parent']; - if (all_events[parent_id]['evt'][3] < evt_end_date){ - all_events[parent_id]['evt'][3] = evt_end_date; - } - evt_id = parent_id; - } - } - - for (var j in self.grp) { - self.render_events(all_events, j); - } - - 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); - } - - 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); - } else{ - jQuery('#GanttDiv').height(min_hgt).width(search_wdt); - } - - ganttChartControl.create("GanttDiv"); - ganttChartControl.attachEvent("onTaskStartDrag", function(task) {self.on_drag_start(task);}); - ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_resize_drag_end(task, "resize");}); - ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_resize_drag_end(task, "drag");}); + + ResizeTask: function(task) { - ganttChartControl.attachEvent("onTaskDblClick", function(task) {self.open_popup(task);}); + var event_id = task.getId(); - var taskdiv = jQuery("div.taskPanel").parent(); - taskdiv.addClass('ganttTaskPanel'); - taskdiv.prev().addClass('ganttDayPanel'); - var $gantt_panel = jQuery(".ganttTaskPanel , .ganttDayPanel"); - - var ganttrow = jQuery('.taskPanel').closest('tr'); - var gtd = ganttrow.children(':first-child'); - gtd.children().addClass('task-name'); - - jQuery(".toggle-sidebar").click(function(e) { - self.set_width(); - }); - - jQuery(window).bind('resize',function() { - window.clearTimeout(ganttChartControl._resize_timer); - ganttChartControl._resize_timer = window.setTimeout(function(){ - self.reload_gantt(); - }, 200); - }); - - jQuery("div #_1, div #_1 + div").hide(); - }, - - set_width: function() { - - $gantt_panel.width(1); - jQuery(".ganttTaskPanel").parent().width(1); - - 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){ - jQuery(".ganttTaskPanel").parent().width(search_wdt - name_min_wdt); - jQuery(".ganttTaskPanel").width(search_wdt - name_min_wdt); - jQuery(".ganttDayPanel").width(search_wdt - name_min_wdt - 14); - jQuery('.task-name').width(name_min_wdt); - jQuery('.task-name').children().width(name_min_wdt); - }else{ - jQuery(".ganttTaskPanel").parent().width(day_wdt); - jQuery(".ganttTaskPanel").width(day_wdt); - jQuery(".taskPanel").width(day_wdt - 16); - jQuery(".ganttDayPanel").width(day_wdt -16); - jQuery('.task-name').width(search_wdt - day_wdt); - jQuery('.task-name').children().width(search_wdt - day_wdt); + + if(!event_id) + return this.do_warn(_t("Project can not be resized")); + + var data = {}; + data[this.date_start] = task.getEST().toString(this.date_format); + + if(this.date_stop) { + var diff = task.getDuration() % this.day_length, + finished_date = task.getFinishDate().add({hours: diff}); + data[this.date_stop] = finished_date.toString(this.date_format); + } else { + data[this.date_delay] = task.getDuration(); } - + this.dataset + .write(event_id, data, {}) + .done(function() { + self.reloadView(); + }); }, - - end_date: function(dat, duration) { - - var self = this; - - var dat = this.convert_str_date(dat); - - var day = Math.floor(duration/self.day_length); - var hrs = duration % self.day_length; - - dat.add(day).days(); - dat.add(hrs).hour(); - - return dat; - }, - - 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); - - 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) { + + editTask: function(task) { var self = this; var event_id = task.getId(); - if(event_id.toString().search("_") != -1) - return; + if(!event_id) + return false; + if(event_id) event_id = parseInt(event_id, 10); var action_manager = new openerp.web.ActionManager(this); @@ -506,7 +237,7 @@ init: function(parent, dataset, view_id) { var form_view = action_manager.inner_viewmanager.views.form.controller; form_view.do_save(function() { - self.get_events(); + self.reloadView(); }); $(this).dialog('destroy'); } @@ -528,35 +259,9 @@ init: function(parent, dataset, view_id) { } }); }, - - on_drag_start : function(task){ - var st_date = task.getEST(); - if(st_date.getHours()){ - self.hh = st_date.getHours(); - self.mm = st_date.getMinutes(); - } - }, - - on_resize_drag_end : function(task, evt){ - - var event_id = task.getId(); - var data = {}; - - if(event_id.toString().search("_") != -1) - return; - if (evt == "drag"){ - full_date = task.getEST().set({hour: self.hh, minute : self.mm, second:0}); - data[this.date_start] = this.convert_date_str(full_date); - } - if (this.date_stop != undefined){ - tm = (task.getDuration() % this.day_length); - stp = task.getFinishDate().add(tm).hour(); - data[this.date_stop] = this.convert_date_str(stp); - }else{ - data[this.date_delay] = task.getDuration(); - } - this.dataset.write(event_id, data, {}, function(result) {}); - + + reloadView: function() { + self.on_project_loaded(self.database_projects); }, do_show: function () { @@ -567,51 +272,18 @@ init: function(parent, dataset, view_id) { this.$element.hide(); }, - convert_str_date: function (str){ - if (str.length == 19){ - this.format = "yyyy-MM-dd HH:mm:ss"; - return openerp.web.str_to_datetime(str); - } else if (str.length == 10){ - this.format = "yyyy-MM-dd"; - return openerp.web.str_to_date(str); - } else if (str.length == 8){ - this.format = "HH:mm:ss"; - return openerp.web.str_to_time(str); - } - throw "Unrecognized date/time format"; - }, - - convert_date_str: function(full_date) { - if (this.format == "yyyy-MM-dd HH:mm:ss"){ - return openerp.web.datetime_to_str(full_date); - } else if (this.format == "yyyy-MM-dd"){ - return openerp.web.date_to_str(full_date); - } else if (this.format == "HH:mm:ss"){ - return openerp.web.time_to_str(full_date); - } - throw "Unrecognized date/time format"; - }, - - reload_gantt: function() { - var self = this; - this.dataset.read_slice([],{}, function(response) { - ganttChartControl.clearAll(); - jQuery("#GanttDiv").children().remove(); - self.load_event(response); - }); - }, - do_search: function (domains, contexts, groupbys) { var self = this; this.group_by = groupbys; $.when(this.has_been_loaded).then(function() { self.dataset - .read_slice(_.keys(self.fields), { + .read_slice([], { domain: domains, context: contexts, group_by: groupbys }) .done(function(projects) { + self.database_projects = projects; self.on_project_loaded(projects); }); }) From 11826b8e57bb854cb50bb4b4952f71dff3778b26 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 3 Nov 2011 17:56:35 +0530 Subject: [PATCH 03/19] [FIX] Clear GanttView. bzr revid: vda@tinyerp.com-20111103122635-k5fbv5dau3gizygb --- addons/web_gantt/static/src/js/gantt.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 931579502f1..ff2c072111f 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -65,8 +65,12 @@ init: function(parent, dataset, view_id) { return res[self.date_start]; }); - $.when(this.project_starting_date(started_projects), this.project_duration(started_projects), this.calculate_difference()) + $.when(this.project_starting_date(started_projects), this.get_project_duration(started_projects), this.calculate_difference()) .done(function() { + if(self.ganttChartControl) { + self.ganttChartControl.clearAll(); + self.$element.find('#GanttView').empty(); + } var Project = new GanttProjectInfo(0, self.name, self.project_start_date), Task = new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, ""); $.when(self.add_tasks(started_projects, Task)) @@ -76,13 +80,13 @@ init: function(parent, dataset, view_id) { }); }, - project_duration: function(projects) { + get_project_duration: function(projects) { var self = this; this.project_duration = []; _.each(projects, function(project, index) { - if (this.date_stop && project[this.date_stop]) { + if (self.date_stop && project[self.date_stop]) { //ToDO console.log('TODO for date_stop'); self.project_duration.push(0); @@ -94,13 +98,10 @@ init: function(parent, dataset, view_id) { }); this.max_project_duration = _.max(this.project_duration); - return $.Deferred().resolve().promise(); }, calculate_difference: function() { - - var extend_end_date_day = Math.floor(this.max_project_duration / this.day_length), extend_end_date_hours = this.max_project_duration % this.day_length; @@ -139,15 +140,15 @@ init: function(parent, dataset, view_id) { if (min_date) this.project_start_date = this.format_date(min_date[self.date_start]); else this.project_start_date = Date.today(); - return $.Deferred().resolve().promise(); }, init_gantt_view: function(Project, Task) { Project.addTask(Task); - var self = this, - ganttChartControl = new GanttChart(); + var self = this; + + var ganttChartControl = this.ganttChartControl = new GanttChart(); // Setup paths and behavior ganttChartControl.setImagePath("/web_gantt/static/lib/dhtmlxGantt/codebase/imgs/"); @@ -275,6 +276,7 @@ init: function(parent, dataset, view_id) { do_search: function (domains, contexts, groupbys) { var self = this; this.group_by = groupbys; + $.when(this.has_been_loaded).then(function() { self.dataset .read_slice([], { From 0fc1f948c49e9508996b4ec53285cef900ef1b96 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 3 Nov 2011 18:45:51 +0530 Subject: [PATCH 04/19] [FIX] Add parent field if name not defined. bzr revid: vda@tinyerp.com-20111103131551-3j8ofmslyfmxjhj2 --- addons/web_gantt/static/src/js/gantt.js | 30 ++++++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index ff2c072111f..3ca05b7d24c 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -16,10 +16,8 @@ init: function(parent, dataset, view_id) { this.model = dataset.model; this.view_id = view_id; this.domain = this.dataset.domain || []; - this.groupby = []; this.context = this.dataset.context || {}; this.has_been_loaded = $.Deferred(); -// this.ganttChartControl = new GanttChart(); this.COLOR_PALETTE = ['#ccccff', '#cc99ff', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400', '#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f', '#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00', @@ -65,19 +63,34 @@ init: function(parent, dataset, view_id) { return res[self.date_start]; }); + if(!self.name) { + var name = started_projects[0][self.parent]; + self.name = name instanceof Array? name[name.length - 1] : name; + } + $.when(this.project_starting_date(started_projects), this.get_project_duration(started_projects), this.calculate_difference()) - .done(function() { + .then(function() { if(self.ganttChartControl) { self.ganttChartControl.clearAll(); self.$element.find('#GanttView').empty(); } + }).then(this.group_projects(started_projects)) + .done(function() { + var Project = new GanttProjectInfo(0, self.name, self.project_start_date), Task = new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, ""); $.when(self.add_tasks(started_projects, Task)) .done(function() { self.init_gantt_view(Project, Task); }); - }); + }) + }, + + group_projects: function(projects) { + var def = $.Deferred(), + self = this; + if (!this.group_by.length) return def.resolve().promise(); + return def.resolve().promise(); }, get_project_duration: function(projects) { @@ -121,7 +134,13 @@ init: function(parent, dataset, view_id) { var self = this; _.each(tasks, function(task, index) { - parentTask.addChildTask(new GanttTaskInfo(task.id, task.name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")); + var name = task[self.text]; + if(task[self.text] instanceof Array) { + name = task[self.text][1]; + } + parentTask.addChildTask( + new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "") + ); }); return $.Deferred().resolve().promise(); @@ -276,7 +295,6 @@ init: function(parent, dataset, view_id) { do_search: function (domains, contexts, groupbys) { var self = this; this.group_by = groupbys; - $.when(this.has_been_loaded).then(function() { self.dataset .read_slice([], { From 119a277cd9b6863678a988c2e0e302443d03629a Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Fri, 4 Nov 2011 18:32:08 +0530 Subject: [PATCH 05/19] [FIX] Generate Groups. bzr revid: vda@tinyerp.com-20111104130208-i7xujd6mv2jm48fe --- addons/web_gantt/static/src/js/gantt.js | 105 +++++++++++++++--------- 1 file changed, 66 insertions(+), 39 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 3ca05b7d24c..12cd687b978 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -18,10 +18,6 @@ init: function(parent, dataset, view_id) { this.domain = this.dataset.domain || []; this.context = this.dataset.context || {}; this.has_been_loaded = $.Deferred(); - this.COLOR_PALETTE = ['#ccccff', '#cc99ff', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400', - '#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f', - '#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00', - '#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900']; }, start: function() { @@ -63,39 +59,70 @@ init: function(parent, dataset, view_id) { return res[self.date_start]; }); + this.database_projects = started_projects; + if(!self.name) { var name = started_projects[0][self.parent]; self.name = name instanceof Array? name[name.length - 1] : name; } - $.when(this.project_starting_date(started_projects), this.get_project_duration(started_projects), this.calculate_difference()) + $.when(this.project_starting_date(), this.get_project_duration(), this.calculate_difference()) .then(function() { if(self.ganttChartControl) { self.ganttChartControl.clearAll(); self.$element.find('#GanttView').empty(); } - }).then(this.group_projects(started_projects)) - .done(function() { - - var Project = new GanttProjectInfo(0, self.name, self.project_start_date), - Task = new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, ""); - $.when(self.add_tasks(started_projects, Task)) - .done(function() { - self.init_gantt_view(Project, Task); - }); }) + .then(this.group_projects()) + .then(this.generate_projects()) + .then(this.add_tasks()) + .done(this.init_gantt_view()); }, - group_projects: function(projects) { - var def = $.Deferred(), + generate_projects : function() { + var projects = this.database_projects, self = this; + + this.GanttProjects = [], + this.GanttTasks = []; + if(this.GroupProject) { + _.each(this.GroupProject, function(grp, index) { + self.GanttProjects.push(new GanttProjectInfo(index, grp, self.project_start_date)); + self.GanttTasks.push(new GanttTaskInfo(index, grp, self.project_start_date, self.total_duration, 100, "")); + }); + } else { + this.GanttProjects.push(new GanttProjectInfo(0, self.name, self.project_start_date)); + this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); + } + + return $.Deferred().resolve().promise(); + }, + + group_projects: function() { + var def = $.Deferred(), + self = this, + projects = this.database_projects; + if (!this.group_by.length) return def.resolve().promise(); + + var groups = _.pluck(projects, this.group_by[0]); + this.GroupProject = []; + _.each(groups, function(grp) { + if(grp instanceof Array) { + grp = grp[grp.length - 1]; + } + if(!_.include(self.GroupProject,grp)) + self.GroupProject.push(grp); + }); + return def.resolve().promise(); }, - get_project_duration: function(projects) { + get_project_duration: function() { - var self = this; + var self = this, + projects = this.database_projects; + this.project_duration = []; _.each(projects, function(project, index) { @@ -130,15 +157,16 @@ init: function(parent, dataset, view_id) { return $.Deferred().resolve().promise(); }, - add_tasks: function(tasks, parentTask) { - var self = this; + add_tasks: function() { + var self = this, + tasks = this.database_projects; _.each(tasks, function(task, index) { var name = task[self.text]; if(task[self.text] instanceof Array) { name = task[self.text][1]; } - parentTask.addChildTask( + self.GanttTasks[0].addChildTask( new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "") ); }); @@ -146,15 +174,16 @@ init: function(parent, dataset, view_id) { return $.Deferred().resolve().promise(); }, - project_starting_date : function(projects) { - var self = this; - var min_date = _.min(projects, function(prj) { - return new Date(prj[self.date_start]); - }); - - var max_date = _.max(projects, function(prj) { - return self.format_date(prj[self.date_start]) - }); + project_starting_date : function() { + var self = this, + projects = this.database_projects, + min_date = _.min(projects, function(prj) { + return new Date(prj[self.date_start]); + }), + max_date = _.max(projects, function(prj) { + return self.format_date(prj[self.date_start]); + }); + this.project_end_date = this.format_date(max_date[self.date_start]); if (min_date) this.project_start_date = this.format_date(min_date[self.date_start]); else @@ -162,9 +191,10 @@ init: function(parent, dataset, view_id) { return $.Deferred().resolve().promise(); }, - init_gantt_view: function(Project, Task) { + init_gantt_view: function() { - Project.addTask(Task); + + this.GanttProjects[0].addTask(this.GanttTasks[0]); var self = this; var ganttChartControl = this.ganttChartControl = new GanttChart(); @@ -176,11 +206,11 @@ init: function(parent, dataset, view_id) { ganttChartControl.showContextMenu(false); ganttChartControl.showDescTask(true,'d,s-f'); ganttChartControl.showDescProject(true,'n,d'); - // Load data structure - ganttChartControl.addProject(Project); - ganttChartControl.create('GanttView'); - // Create Gantt control + // Load data structure + ganttChartControl.addProject(this.GanttProjects[0]); + // Create Gantt control + ganttChartControl.create('GanttView'); // Setup Events ganttChartControl.attachEvent("onTaskStartDrag", function(task) { @@ -191,9 +221,7 @@ init: function(parent, dataset, view_id) { }); ganttChartControl.attachEvent("onTaskEndResize", function(task) {return self.ResizeTask(task);}); ganttChartControl.attachEvent("onTaskEndDrag", function(task) {return self.ResizeTask(task);}); - ganttChartControl.attachEvent("onTaskDblClick", function(task) { return self.editTask(task);}); - }, format_date : function(date) { @@ -303,7 +331,6 @@ init: function(parent, dataset, view_id) { group_by: groupbys }) .done(function(projects) { - self.database_projects = projects; self.on_project_loaded(projects); }); }) From e3f04a459f9e929c2090f4f2e2019ab34f5625d3 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Sat, 5 Nov 2011 10:12:51 +0530 Subject: [PATCH 06/19] [FIX] First level group_by. bzr revid: vda@tinyerp.com-20111105044251-2raq858ij8m21ha3 --- addons/web_gantt/static/src/js/gantt.js | 70 +++++++++++++++---------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 12cd687b978..46628babc2f 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -83,18 +83,19 @@ init: function(parent, dataset, view_id) { var projects = this.database_projects, self = this; - this.GanttProjects = [], this.GanttTasks = []; - if(this.GroupProject) { + if(this.group_by.length) { _.each(this.GroupProject, function(grp, index) { - self.GanttProjects.push(new GanttProjectInfo(index, grp, self.project_start_date)); - self.GanttTasks.push(new GanttTaskInfo(index, grp, self.project_start_date, self.total_duration, 100, "")); + self.GanttTasks.push([]); + _.each(grp, function(g, g_index) { + self.GanttTasks[index].push(new GanttTaskInfo(index + '_'+ g_index, g, self.project_start_date, self.total_duration, 100, "")); + }); +// self.GanttTasks.push(new GanttTaskInfo(index, grp, self.project_start_date, self.total_duration, 100, "")); }); } else { - this.GanttProjects.push(new GanttProjectInfo(0, self.name, self.project_start_date)); this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); } - + this.GanttProjects = new GanttProjectInfo(0, self.name, self.project_start_date); return $.Deferred().resolve().promise(); }, @@ -105,16 +106,16 @@ init: function(parent, dataset, view_id) { if (!this.group_by.length) return def.resolve().promise(); - var groups = _.pluck(projects, this.group_by[0]); this.GroupProject = []; - _.each(groups, function(grp) { - if(grp instanceof Array) { - grp = grp[grp.length - 1]; - } - if(!_.include(self.GroupProject,grp)) - self.GroupProject.push(grp); - }); + _.each(this.group_by, function(group) { + self.GroupProject.push( + _.uniq( + _.map(_.pluck(projects, group), function(prj) { + return prj instanceof Array ? prj[1] : prj; + }) + )); + }); return def.resolve().promise(); }, @@ -160,17 +161,17 @@ init: function(parent, dataset, view_id) { add_tasks: function() { var self = this, tasks = this.database_projects; - - _.each(tasks, function(task, index) { - var name = task[self.text]; - if(task[self.text] instanceof Array) { - name = task[self.text][1]; - } - self.GanttTasks[0].addChildTask( - new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "") - ); - }); - + if (this.group_by.length) { + } + else { + _.each(tasks, function(task, index){ + var name = task[self.text]; + if (task[self.text] instanceof Array) { + name = task[self.text][1]; + } + self.GanttTasks[0].addChildTask(new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")); + }); + } return $.Deferred().resolve().promise(); }, @@ -192,11 +193,21 @@ init: function(parent, dataset, view_id) { }, init_gantt_view: function() { - - - this.GanttProjects[0].addTask(this.GanttTasks[0]); var self = this; + if (this.group_by.length) { + _.each(this.GanttTasks, function(tasks) { + _.each(tasks, function(task, index) { + self.GanttProjects.addTask(task); + }) + }); + } + else { + _.each(this.GanttTasks, function(tsk, index){ + self.GanttProjects.addTask(tsk); + }); + } + var ganttChartControl = this.ganttChartControl = new GanttChart(); // Setup paths and behavior @@ -208,7 +219,8 @@ init: function(parent, dataset, view_id) { ganttChartControl.showDescProject(true,'n,d'); // Load data structure - ganttChartControl.addProject(this.GanttProjects[0]); + ganttChartControl.addProject(this.GanttProjects); + // Create Gantt control ganttChartControl.create('GanttView'); From 60bbf83479b5058eeabbf893435ee47d11ca66db Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Tue, 8 Nov 2011 12:44:15 +0530 Subject: [PATCH 07/19] [FIX] Add subtask for groupby. bzr revid: vda@tinyerp.com-20111108071415-ehui6wvm31xi6qqg --- addons/web_gantt/static/src/js/gantt.js | 116 +++++++++++++----------- 1 file changed, 64 insertions(+), 52 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 46628babc2f..abfb7e8c4fa 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -61,7 +61,7 @@ init: function(parent, dataset, view_id) { this.database_projects = started_projects; - if(!self.name) { + if(!self.name && started_projects.length) { var name = started_projects[0][self.parent]; self.name = name instanceof Array? name[name.length - 1] : name; } @@ -79,26 +79,6 @@ init: function(parent, dataset, view_id) { .done(this.init_gantt_view()); }, - generate_projects : function() { - var projects = this.database_projects, - self = this; - - this.GanttTasks = []; - if(this.group_by.length) { - _.each(this.GroupProject, function(grp, index) { - self.GanttTasks.push([]); - _.each(grp, function(g, g_index) { - self.GanttTasks[index].push(new GanttTaskInfo(index + '_'+ g_index, g, self.project_start_date, self.total_duration, 100, "")); - }); -// self.GanttTasks.push(new GanttTaskInfo(index, grp, self.project_start_date, self.total_duration, 100, "")); - }); - } else { - this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); - } - this.GanttProjects = new GanttProjectInfo(0, self.name, self.project_start_date); - return $.Deferred().resolve().promise(); - }, - group_projects: function() { var def = $.Deferred(), self = this, @@ -106,19 +86,68 @@ init: function(parent, dataset, view_id) { if (!this.group_by.length) return def.resolve().promise(); - this.GroupProject = []; - - _.each(this.group_by, function(group) { - self.GroupProject.push( - _.uniq( - _.map(_.pluck(projects, group), function(prj) { - return prj instanceof Array ? prj[1] : prj; - }) - )); - }); + this.GroupProject = _.map(this.group_by, function(grp) { + return _.groupBy(projects, function(prj) { + return prj[grp]; + }) + }); return def.resolve().promise(); }, + generate_projects : function() { + var projects = this.database_projects, + self = this; + + this.GanttTasks = []; + if(this.group_by.length) { + _.each(this.GroupProject, function(GrpProject, index) { + self.GanttTasks.push([]); + var counter = 0; + _.each(GrpProject, function(grp, grpindex) { + var name = grpindex.split(','); + self.GanttTasks[index] + .push(new GanttTaskInfo(index + '_' + counter , name[name.length - 1], self.project_start_date, self.total_duration, 100, "")); + counter += 1; + }); + }) + } else { + this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); + } + this.GanttProjects = new GanttProjectInfo(0, self.name, self.project_start_date); + return $.Deferred().resolve().promise(); + }, + + add_tasks: function() { + var self = this, + tasks = this.database_projects; + if (this.group_by.length) { + _.each(this.GroupProject, function(grpproject, index) { + var counter = 0; + _.each(grpproject, function(prj, gindex) { + _.each(prj, function(task, tindex) { + var name = task[self.text]; + if (task[self.text] instanceof Array) { + name = task[self.text][1]; + } + self.GanttTasks[index][counter] + .addChildTask(new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")) + }); + counter += 1; + }) + }); + } + else { + _.each(tasks, function(task, index){ + var name = task[self.text]; + if (task[self.text] instanceof Array) { + name = task[self.text][1]; + } + self.GanttTasks[0].addChildTask(new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")); + }); + } + return $.Deferred().resolve().promise(); + }, + get_project_duration: function() { var self = this, @@ -158,23 +187,6 @@ init: function(parent, dataset, view_id) { return $.Deferred().resolve().promise(); }, - add_tasks: function() { - var self = this, - tasks = this.database_projects; - if (this.group_by.length) { - } - else { - _.each(tasks, function(task, index){ - var name = task[self.text]; - if (task[self.text] instanceof Array) { - name = task[self.text][1]; - } - self.GanttTasks[0].addChildTask(new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")); - }); - } - return $.Deferred().resolve().promise(); - }, - project_starting_date : function() { var self = this, projects = this.database_projects, @@ -196,11 +208,11 @@ init: function(parent, dataset, view_id) { var self = this; if (this.group_by.length) { - _.each(this.GanttTasks, function(tasks) { - _.each(tasks, function(task, index) { + _.each(self.GanttTasks, function(tasks, index) { + _.each(tasks, function(task, tindex) { self.GanttProjects.addTask(task); - }) - }); + }); + }) } else { _.each(this.GanttTasks, function(tsk, index){ From f1f7637d69e0691202779fa592cbcf20c0cd5f19 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Tue, 8 Nov 2011 13:05:28 +0530 Subject: [PATCH 08/19] [FIX] duration calculation for date_stop. bzr revid: vda@tinyerp.com-20111108073528-r4lrw0zxtsv1604a --- addons/web_gantt/static/src/js/gantt.js | 28 ++++++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index abfb7e8c4fa..8ee3fbfaca5 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -60,7 +60,9 @@ init: function(parent, dataset, view_id) { }); this.database_projects = started_projects; - + if(!started_projects.length) + return self.do_warn(_t("date_start is not defined")); + if(!self.name && started_projects.length) { var name = started_projects[0][self.parent]; self.name = name instanceof Array? name[name.length - 1] : name; @@ -157,9 +159,7 @@ init: function(parent, dataset, view_id) { _.each(projects, function(project, index) { if (self.date_stop && project[self.date_stop]) { - //ToDO - console.log('TODO for date_stop'); - self.project_duration.push(0); + self.project_duration.push(self.duration_difference(project[self.date_start], project[self.date_stop])); } else if(self.date_delay && project[self.date_delay]) { self.project_duration.push(project[self.date_delay]); } else { @@ -171,6 +171,20 @@ init: function(parent, dataset, view_id) { return $.Deferred().resolve().promise(); }, + duration_difference: function(start_date, end_date) { + + var DAY = 1000 * 60 * 60 * 24, + date1_ms = openerp.web.auto_str_to_date(start_date).getTime(), + date2_ms = openerp.web.auto_str_to_date(end_date).getTime(), + difference_ms = Math.abs(date1_ms - date2_ms); + + var d = Math.floor(difference_ms / DAY), + h = (difference_ms % DAY)/(1000 * 60 * 60), + num = (d * this.day_length) + h; + return parseFloat(num.toFixed(2)); + + }, + calculate_difference: function() { var extend_end_date_day = Math.floor(this.max_project_duration / this.day_length), extend_end_date_hours = this.max_project_duration % this.day_length; @@ -196,7 +210,6 @@ init: function(parent, dataset, view_id) { max_date = _.max(projects, function(prj) { return self.format_date(prj[self.date_start]); }); - this.project_end_date = this.format_date(max_date[self.date_start]); if (min_date) this.project_start_date = this.format_date(min_date[self.date_start]); else @@ -212,7 +225,7 @@ init: function(parent, dataset, view_id) { _.each(tasks, function(task, tindex) { self.GanttProjects.addTask(task); }); - }) + }); } else { _.each(this.GanttTasks, function(tsk, index){ @@ -351,8 +364,7 @@ init: function(parent, dataset, view_id) { self.dataset .read_slice([], { domain: domains, - context: contexts, - group_by: groupbys + context: contexts }) .done(function(projects) { self.on_project_loaded(projects); From 282f6756ad1da705d20bc81bd1c0f031aa47db97 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Tue, 8 Nov 2011 14:30:08 +0530 Subject: [PATCH 09/19] [FIX] Events attached only to child tasks. bzr revid: vda@tinyerp.com-20111108090008-f65kvdlplgzryarb --- addons/web_gantt/static/src/js/gantt.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 8ee3fbfaca5..bb19ecbbae6 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -251,14 +251,21 @@ init: function(parent, dataset, view_id) { // Setup Events ganttChartControl.attachEvent("onTaskStartDrag", function(task) { - var task_date = task.getEST(); - if(task_date.getHours()) { - task_date.set({hour: task_date.getHours(), minute : task_date.getMinutes(), second:0}); + if (task.parentTask) { + var task_date = task.getEST(); + if (task_date.getHours()) { + task_date.set({ + hour: task_date.getHours(), + minute: task_date.getMinutes(), + second: 0 + }); + } } }); + ganttChartControl.attachEvent("onTaskEndResize", function(task) {return self.ResizeTask(task);}); ganttChartControl.attachEvent("onTaskEndDrag", function(task) {return self.ResizeTask(task);}); - ganttChartControl.attachEvent("onTaskDblClick", function(task) { return self.editTask(task);}); + ganttChartControl.attachEvent("onTaskClick", function(task) { return self.editTask(task);}); }, format_date : function(date) { @@ -278,10 +285,10 @@ init: function(parent, dataset, view_id) { ResizeTask: function(task) { - var event_id = task.getId(); + var self = this, + event_id = task.getId(); - - if(!event_id) + if(!event_id || !task.parentTask) return this.do_warn(_t("Project can not be resized")); var data = {}; @@ -302,11 +309,11 @@ init: function(parent, dataset, view_id) { }, editTask: function(task) { + var self = this; var event_id = task.getId(); - if(!event_id) + if(!event_id || !task.parentTask) return false; - if(event_id) event_id = parseInt(event_id, 10); var action_manager = new openerp.web.ActionManager(this); From 4a7cc97197a77a441c0a94d50f8439af2b9841c6 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 10 Nov 2011 15:53:05 +0530 Subject: [PATCH 10/19] [FIX] follow multi level Group. bzr revid: vda@tinyerp.com-20111110102305-3h661p2va5unyo15 --- addons/web_gantt/static/src/js/gantt.js | 38 ++++++++----------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 2165bd7ce88..effaf17dfe3 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -88,6 +88,7 @@ init: function(parent, dataset, view_id) { this.GroupProject = _.map(this.group_by, function(grp) { return _.groupBy(projects, function(prj) { + if(!prj[grp]) prj[grp] = 'Undefined'; return prj[grp]; }) }); @@ -100,16 +101,12 @@ init: function(parent, dataset, view_id) { this.GanttTasks = []; if(this.group_by.length) { - _.each(this.GroupProject, function(GrpProject, index) { - self.GanttTasks.push([]); - var counter = 0; - _.each(GrpProject, function(grp, grpindex) { - var name = grpindex.split(','); - self.GanttTasks[index] - .push(new GanttTaskInfo(index + '_' + counter , name[name.length - 1], self.project_start_date, self.total_duration, 100, "")); - counter += 1; - }); - }) + _.each(this.GroupProject, function(grp, index) { + var name = _.keys(grp)[0]; + name = name.split(','); +// index > 0 ? "" + (index - 1) + self.GanttTasks.push(new GanttTaskInfo(index, name[name.length - 1], self.project_start_date, self.total_duration, 100, index > 0 ? (index - 1) : "")); + }); } else { this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); } @@ -121,19 +118,10 @@ init: function(parent, dataset, view_id) { var self = this, tasks = this.database_projects; if (this.group_by.length) { - _.each(this.GroupProject, function(grpproject, index) { - var counter = 0; - _.each(grpproject, function(prj, gindex) { - _.each(prj, function(task, tindex) { - var name = task[self.text]; - if (task[self.text] instanceof Array) { - name = task[self.text][1]; - } - self.GanttTasks[index][counter] - .addChildTask(new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")) - }); - counter += 1; - }) + _.each(_.values(_.last(this.GroupProject))[0], function(task, index) { + var name = task[self.text]; + _.last(self.GanttTasks) + .addChildTask(new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")) }); } else { @@ -220,9 +208,7 @@ init: function(parent, dataset, view_id) { if (this.group_by.length) { _.each(self.GanttTasks, function(tasks, index) { - _.each(tasks, function(task, tindex) { - self.GanttProjects.addTask(task); - }); + self.GanttProjects.addTask(tasks); }); } else { From b0ece86d7cf44cdccfd563ce9d547bd72c79dbba Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Wed, 16 Nov 2011 19:08:44 +0530 Subject: [PATCH 11/19] [FIX] Create node. bzr revid: vda@tinyerp.com-20111116133844-qp4fp3pkruqpgobr --- addons/web_gantt/static/src/js/gantt.js | 59 ++++++++----------- addons/web_gantt/static/src/xml/web_gantt.xml | 1 + 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index effaf17dfe3..ec212c7007d 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -65,7 +65,9 @@ init: function(parent, dataset, view_id) { var name = started_projects[0][self.parent]; self.name = name instanceof Array? name[name.length - 1] : name; } - + this.$element.find('#add_task').click(function(){ + self.editTask(); + }); $.when(this.project_starting_date(), this.get_project_duration(), this.calculate_difference()) .then(function() { if(self.ganttChartControl) { @@ -83,30 +85,23 @@ init: function(parent, dataset, view_id) { var def = $.Deferred(), self = this, projects = this.database_projects; - - if (!this.group_by.length) return def.resolve().promise(); - this.GroupProject = _.map(this.group_by, function(grp) { - return _.groupBy(projects, function(prj) { - if(!prj[grp]) prj[grp] = 'Undefined'; - return prj[grp]; - }) + if (!this.group_by.length) return def.resolve().promise(); + this.data_groups = _.groupBy(projects, function(project, index) { + return _.map(self.group_by, function(group, index) { + if(!project[group]) project[group] = 'Undefined'; + else if(project[group] instanceof Array) project[group] = project[group][1]; + return project[group]; }); + }); return def.resolve().promise(); }, - generate_projects : function() { var projects = this.database_projects, self = this; this.GanttTasks = []; if(this.group_by.length) { - _.each(this.GroupProject, function(grp, index) { - var name = _.keys(grp)[0]; - name = name.split(','); -// index > 0 ? "" + (index - 1) - self.GanttTasks.push(new GanttTaskInfo(index, name[name.length - 1], self.project_start_date, self.total_duration, 100, index > 0 ? (index - 1) : "")); - }); } else { this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); } @@ -118,11 +113,7 @@ init: function(parent, dataset, view_id) { var self = this, tasks = this.database_projects; if (this.group_by.length) { - _.each(_.values(_.last(this.GroupProject))[0], function(task, index) { - var name = task[self.text]; - _.last(self.GanttTasks) - .addChildTask(new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")) - }); + } else { _.each(tasks, function(task, index){ @@ -207,9 +198,7 @@ init: function(parent, dataset, view_id) { var self = this; if (this.group_by.length) { - _.each(self.GanttTasks, function(tasks, index) { - self.GanttProjects.addTask(tasks); - }); + } else { _.each(this.GanttTasks, function(tsk, index){ @@ -293,13 +282,16 @@ init: function(parent, dataset, view_id) { }, editTask: function(task) { - - var self = this; - var event_id = task.getId(); - if(!event_id || !task.parentTask) - return false; + var self = this, + event_id; + if (!task) + event_id = null; + else { + event_id = task.getId(); + if(!event_id || !task.parentTask) + return false; + } if(event_id) event_id = parseInt(event_id, 10); - var action_manager = new openerp.web.ActionManager(this); var dialog = new openerp.web.Dialog(this, { @@ -337,7 +329,7 @@ init: function(parent, dataset, view_id) { }, reloadView: function() { - self.on_project_loaded(self.database_projects); + this.on_project_loaded(this.database_projects); }, do_show: function () { @@ -352,16 +344,13 @@ init: function(parent, dataset, view_id) { var self = this; this.group_by = groupbys; $.when(this.has_been_loaded).then(function() { - self.dataset - .read_slice([], { + self.dataset.read_slice([], { domain: domains, context: contexts - }) - .done(function(projects) { + }).done(function(projects){ self.on_project_loaded(projects); }); }) - } }); diff --git a/addons/web_gantt/static/src/xml/web_gantt.xml b/addons/web_gantt/static/src/xml/web_gantt.xml index 48a1a1025dd..35cab76b452 100644 --- a/addons/web_gantt/static/src/xml/web_gantt.xml +++ b/addons/web_gantt/static/src/xml/web_gantt.xml @@ -1,5 +1,6 @@ From c95adf2c8a8530ad433d0de27781b22af093cfa3 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Mon, 21 Nov 2011 14:45:12 +0530 Subject: [PATCH 12/19] [FIX] Reload and update record on Resize. bzr revid: vda@tinyerp.com-20111121091512-8o5wxtid0cky2on8 --- addons/web_gantt/static/src/js/gantt.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index ec212c7007d..77170d103ff 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -87,13 +87,17 @@ init: function(parent, dataset, view_id) { projects = this.database_projects; if (!this.group_by.length) return def.resolve().promise(); - this.data_groups = _.groupBy(projects, function(project, index) { - return _.map(self.group_by, function(group, index) { + this.data_groups = _.groupBy(projects, function(project) { + return _.map(self.group_by, function(group) { if(!project[group]) project[group] = 'Undefined'; else if(project[group] instanceof Array) project[group] = project[group][1]; return project[group]; }); }); + + this.group_keys = _.map(this.group_by, function(group, index) { + return _.map(projects, function(project){return project[group]}); + }); return def.resolve().promise(); }, generate_projects : function() { @@ -102,6 +106,7 @@ init: function(parent, dataset, view_id) { this.GanttTasks = []; if(this.group_by.length) { + } else { this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); } @@ -198,10 +203,9 @@ init: function(parent, dataset, view_id) { var self = this; if (this.group_by.length) { - } else { - _.each(this.GanttTasks, function(tsk, index){ + _.each(this.GanttTasks, function(tsk, index) { self.GanttProjects.addTask(tsk); }); } @@ -238,7 +242,6 @@ init: function(parent, dataset, view_id) { ganttChartControl.attachEvent("onTaskEndResize", function(task) {return self.ResizeTask(task);}); ganttChartControl.attachEvent("onTaskEndDrag", function(task) {return self.ResizeTask(task);}); - ganttChartControl.attachEvent("onTaskClick", function(task) { return self.editTask(task);}); }, format_date : function(date) { @@ -257,7 +260,6 @@ init: function(parent, dataset, view_id) { }, ResizeTask: function(task) { - var self = this, event_id = task.getId(); @@ -277,6 +279,8 @@ init: function(parent, dataset, view_id) { this.dataset .write(event_id, data, {}) .done(function() { + var get_project = _.find(self.database_projects, function(project){ return project.id == event_id}); + _.extend(get_project,data); self.reloadView(); }); }, @@ -350,7 +354,7 @@ init: function(parent, dataset, view_id) { }).done(function(projects){ self.on_project_loaded(projects); }); - }) + }); } }); From ef3c7d9c3b51e4ae30de02c74517df3e7307a93d Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Mon, 21 Nov 2011 16:49:31 +0530 Subject: [PATCH 13/19] [FIX] Done for level 1 group. todo for multi level. bzr revid: vda@tinyerp.com-20111121111931-f149p9vau10vsx60 --- addons/web_gantt/static/src/js/gantt.js | 42 ++++++++++++++++++++----- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 77170d103ff..63845361b7b 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -106,7 +106,13 @@ init: function(parent, dataset, view_id) { this.GanttTasks = []; if(this.group_by.length) { - + if(this.group_by.length > 1) { + + } else { + _.each(_.uniq(this.group_keys[0]), function(group, index) { + self.GanttTasks.push(new GanttTaskInfo(index, group, self.project_start_date, self.total_duration, 100,"")); + }); + } } else { this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); } @@ -118,7 +124,21 @@ init: function(parent, dataset, view_id) { var self = this, tasks = this.database_projects; if (this.group_by.length) { - + if (this.group_by.length > 1) { + } else { + _.each(_.values(this.data_groups), function(child_tasks, index) { + _.each(child_tasks, function(chld) { + var name = chld[self.text]; + if (chld[self.text] instanceof Array) { + name = chld[self.text][1]; + } + var duration = _.keys(self.group_project_duration).indexOf(""+chld.id); + duration = _.values(self.group_project_duration)[duration]; + self.GanttTasks[index].addChildTask(new GanttTaskInfo(chld.id, name, self.format_date(chld[self.date_start]), duration, 100, "")) + }); + + }); + } } else { _.each(tasks, function(task, index){ @@ -138,15 +158,19 @@ init: function(parent, dataset, view_id) { projects = this.database_projects; this.project_duration = []; - + this.group_project_duration = {}; _.each(projects, function(project, index) { + var duration = 0, + id = project.id; if (self.date_stop && project[self.date_stop]) { - self.project_duration.push(self.duration_difference(project[self.date_start], project[self.date_stop])); + duration = self.duration_difference(project[self.date_start], project[self.date_stop]); +// self.project_duration.push(self.duration_difference(project[self.date_start], project[self.date_stop])); } else if(self.date_delay && project[self.date_delay]) { - self.project_duration.push(project[self.date_delay]); - } else { - self.project_duration.push(0); + duration = project[self.date_delay]; +// self.project_duration.push(project[self.date_delay]); } + self.project_duration.push(duration); + self.group_project_duration[id] = duration; }); this.max_project_duration = _.max(this.project_duration); @@ -203,6 +227,9 @@ init: function(parent, dataset, view_id) { var self = this; if (this.group_by.length) { + _.each(this.GanttTasks, function(tsk, index) { + self.GanttProjects.addTask(tsk); + }); } else { _.each(this.GanttTasks, function(tsk, index) { @@ -239,7 +266,6 @@ init: function(parent, dataset, view_id) { } } }); - ganttChartControl.attachEvent("onTaskEndResize", function(task) {return self.ResizeTask(task);}); ganttChartControl.attachEvent("onTaskEndDrag", function(task) {return self.ResizeTask(task);}); }, From 15b357cb79a7243a74515bd7596c385e9b8e0c6a Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Wed, 23 Nov 2011 15:56:14 +0530 Subject: [PATCH 14/19] [FIX] Used Old method for multiple group_by. bzr revid: vda@tinyerp.com-20111123102614-r4uvsuhrj0t7q9fm --- addons/web_gantt/static/src/js/gantt.js | 624 ++++++++++++++---------- 1 file changed, 372 insertions(+), 252 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 63845361b7b..07b754890b1 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -7,7 +7,7 @@ var QWeb = openerp.web.qweb; openerp.web.views.add('gantt', 'openerp.web_gantt.GanttView'); openerp.web_gantt.GanttView = openerp.web.View.extend({ -init: function(parent, dataset, view_id) { + init: function(parent, dataset, view_id) { this._super(parent); this.view_manager = parent || new openerp.web.NullViewManager(); this.dataset = dataset; @@ -24,6 +24,7 @@ init: function(parent, dataset, view_id) { }, on_loaded: function(data) { + this.fields_view = data, this.name = this.fields_view.arch.attrs.string, this.view_id = this.fields_view.view_id, @@ -48,226 +49,29 @@ init: function(parent, dataset, view_id) { this.$element.html(QWeb.render("GanttView", {'height': $('.oe-application-container').height(), 'width': $('.oe-application-container').width()})); this.has_been_loaded.resolve(); }, - - on_project_loaded: function(projects) { - - if(!projects.length) return; - var self = this, - started_projects = _.filter(projects, function(res) { - return res[self.date_start]; - }); - - this.database_projects = started_projects; - if(!started_projects.length) - return self.do_warn(_t("date_start is not defined")); - - if(!self.name && started_projects.length) { - var name = started_projects[0][self.parent]; - self.name = name instanceof Array? name[name.length - 1] : name; - } - this.$element.find('#add_task').click(function(){ - self.editTask(); - }); - $.when(this.project_starting_date(), this.get_project_duration(), this.calculate_difference()) - .then(function() { - if(self.ganttChartControl) { - self.ganttChartControl.clearAll(); - self.$element.find('#GanttView').empty(); - } - }) - .then(this.group_projects()) - .then(this.generate_projects()) - .then(this.add_tasks()) - .done(this.init_gantt_view()); - }, - - group_projects: function() { - var def = $.Deferred(), - self = this, - projects = this.database_projects; - - if (!this.group_by.length) return def.resolve().promise(); - this.data_groups = _.groupBy(projects, function(project) { - return _.map(self.group_by, function(group) { - if(!project[group]) project[group] = 'Undefined'; - else if(project[group] instanceof Array) project[group] = project[group][1]; - return project[group]; - }); - }); - - this.group_keys = _.map(this.group_by, function(group, index) { - return _.map(projects, function(project){return project[group]}); - }); - return def.resolve().promise(); - }, - generate_projects : function() { - var projects = this.database_projects, - self = this; - - this.GanttTasks = []; - if(this.group_by.length) { - if(this.group_by.length > 1) { - - } else { - _.each(_.uniq(this.group_keys[0]), function(group, index) { - self.GanttTasks.push(new GanttTaskInfo(index, group, self.project_start_date, self.total_duration, 100,"")); - }); - } - } else { - this.GanttTasks.push(new GanttTaskInfo(0, self.name, self.project_start_date, self.total_duration, 100, "")); - } - this.GanttProjects = new GanttProjectInfo(0, self.name, self.project_start_date); - return $.Deferred().resolve().promise(); - }, - - add_tasks: function() { - var self = this, - tasks = this.database_projects; - if (this.group_by.length) { - if (this.group_by.length > 1) { - } else { - _.each(_.values(this.data_groups), function(child_tasks, index) { - _.each(child_tasks, function(chld) { - var name = chld[self.text]; - if (chld[self.text] instanceof Array) { - name = chld[self.text][1]; - } - var duration = _.keys(self.group_project_duration).indexOf(""+chld.id); - duration = _.values(self.group_project_duration)[duration]; - self.GanttTasks[index].addChildTask(new GanttTaskInfo(chld.id, name, self.format_date(chld[self.date_start]), duration, 100, "")) - }); - - }); - } - } - else { - _.each(tasks, function(task, index){ - var name = task[self.text]; - if (task[self.text] instanceof Array) { - name = task[self.text][1]; - } - self.GanttTasks[0].addChildTask(new GanttTaskInfo(task.id, name, self.format_date(task[self.date_start]), self.project_duration[index], 100, "")); - }); - } - return $.Deferred().resolve().promise(); - }, - - get_project_duration: function() { - - var self = this, - projects = this.database_projects; - - this.project_duration = []; - this.group_project_duration = {}; - _.each(projects, function(project, index) { - var duration = 0, - id = project.id; - if (self.date_stop && project[self.date_stop]) { - duration = self.duration_difference(project[self.date_start], project[self.date_stop]); -// self.project_duration.push(self.duration_difference(project[self.date_start], project[self.date_stop])); - } else if(self.date_delay && project[self.date_delay]) { - duration = project[self.date_delay]; -// self.project_duration.push(project[self.date_delay]); - } - self.project_duration.push(duration); - self.group_project_duration[id] = duration; - }); - - this.max_project_duration = _.max(this.project_duration); - return $.Deferred().resolve().promise(); - }, - - duration_difference: function(start_date, end_date) { - - var DAY = 1000 * 60 * 60 * 24, - date1_ms = openerp.web.auto_str_to_date(start_date).getTime(), - date2_ms = openerp.web.auto_str_to_date(end_date).getTime(), - difference_ms = Math.abs(date1_ms - date2_ms); - - var d = Math.floor(difference_ms / DAY), - h = (difference_ms % DAY)/(1000 * 60 * 60), - num = (d * this.day_length) + h; - return parseFloat(num.toFixed(2)); - - }, - - calculate_difference: function() { - var extend_end_date_day = Math.floor(this.max_project_duration / this.day_length), - extend_end_date_hours = this.max_project_duration % this.day_length; - - this.project_end_date = this.project_end_date.add({days: extend_end_date_day, hours: extend_end_date_hours}) - - var DAY = 1000 * 60 * 60 * 24, - difference = Math.abs(this.project_start_date.getTime() - this.project_end_date.getTime()), - day = Math.ceil(difference / DAY), - hour = (difference % DAY)/(1000 * 60 * 60), - DiffHour = (day * this.day_length) + hour; - - this.total_duration = parseFloat(DiffHour.toFixed(2)); - return $.Deferred().resolve().promise(); - }, - - project_starting_date : function() { - var self = this, - projects = this.database_projects, - min_date = _.min(projects, function(prj) { - return new Date(prj[self.date_start]); - }), - max_date = _.max(projects, function(prj) { - return self.format_date(prj[self.date_start]); - }); - this.project_end_date = this.format_date(max_date[self.date_start]); - if (min_date) this.project_start_date = this.format_date(min_date[self.date_start]); - else - this.project_start_date = Date.today(); - return $.Deferred().resolve().promise(); - }, init_gantt_view: function() { - var self = this; - - if (this.group_by.length) { - _.each(this.GanttTasks, function(tsk, index) { - self.GanttProjects.addTask(tsk); - }); - } - else { - _.each(this.GanttTasks, function(tsk, index) { - self.GanttProjects.addTask(tsk); - }); - } - - var ganttChartControl = this.ganttChartControl = new GanttChart(); - // Setup paths and behavior + ganttChartControl = this.ganttChartControl = new GanttChart(this.day_length); ganttChartControl.setImagePath("/web_gantt/static/lib/dhtmlxGantt/codebase/imgs/"); ganttChartControl.setEditable(true); ganttChartControl.showTreePanel(true); ganttChartControl.showContextMenu(false); ganttChartControl.showDescTask(true,'d,s-f'); ganttChartControl.showDescProject(true,'n,d'); - - // Load data structure - ganttChartControl.addProject(this.GanttProjects); - - // Create Gantt control - ganttChartControl.create('GanttView'); - - // Setup Events - ganttChartControl.attachEvent("onTaskStartDrag", function(task) { - if (task.parentTask) { - var task_date = task.getEST(); - if (task_date.getHours()) { - task_date.set({ - hour: task_date.getHours(), - minute: task_date.getMinutes(), - second: 0 - }); - } - } - }); - ganttChartControl.attachEvent("onTaskEndResize", function(task) {return self.ResizeTask(task);}); - ganttChartControl.attachEvent("onTaskEndDrag", function(task) {return self.ResizeTask(task);}); + + }, + + project_starting_date : function() { + var self = this, + projects = this.database_projects, + min_date = _.min(projects, function(prj) { + return self.format_date(prj[self.date_start]); + }); + if (min_date) this.project_start_date = this.format_date(min_date[self.date_start]); + else + this.project_start_date = Date.today(); + return $.Deferred().resolve().promise(); }, format_date : function(date) { @@ -282,16 +86,242 @@ init: function(parent, dataset, view_id) { } else { this.date_format = "yyyy-MM-dd HH:mm:ss"; } - return openerp.web.auto_str_to_date(date); + if(typeof date === 'string') + return openerp.web.auto_str_to_date(date); + return date; + }, + + on_project_loaded: function(events) { + + if(!events.length) return; + var self = this, + started_projects = _.filter(events, function(res) { + return res[self.date_start]; + }); + + this.database_projects = started_projects; + + if(!started_projects.length) + return self.do_warn(_t("date_start is not defined")); + + if(!self.name && started_projects.length) { + var name = started_projects[0][self.parent]; + self.name = name instanceof Array? name[name.length - 1] : name; + } + this.$element.find('#add_task').click(function(){ + self.editTask(); + }); + + $.when(this.project_starting_date()) + .then(function() { + if(self.ganttChartControl) { + self.ganttChartControl.clearAll(); + self.$element.find('#GanttView').empty(); + } + }) + .done(this.init_gantt_view()); + + var self = this; + var show_event = started_projects; + _.each(show_event, function(evt) {evt[self.date_start] = self.format_date(evt[self.date_start])}); + this.project = new GanttProjectInfo("_1", self.name, this.project_start_date); + self.ganttChartControl.addProject(this.project); + //create child + var k = 0; + var color_box = {}; + var parents = {}; + var all_events = {}; + var child_event = {}; + var temp_id = ""; + var final_events = []; + for (var i in show_event) { + + var res = show_event[i]; + + var id = res['id']; + var text = res[this.text]; + var start_date = res[this.date_start]; + + if (this.date_stop != undefined){ + if (res[this.date_stop] != false){ + var stop_date = this.convert_str_date(res[this.date_stop]); + var duration= self.hours_between(start_date, stop_date); + } + else{ + var duration = 0; + } + } + else{ + var duration = res[this.date_delay]; + } + if (!duration) + duration = 0; + + if (this.group_by.length){ + for (var j in self.group_by){ + var grp_key = res[self.group_by[j]]; + if (typeof(grp_key) == "object"){ + grp_key = res[self.group_by[j]][1]; + } + else{ + grp_key = res[self.group_by[j]]; + } + + if (!grp_key){ + grp_key = "Undefined"; + } + + if (j == 0){ + if (parents[grp_key] == undefined){ + var mod_id = i+ "_" +j; + parents[grp_key] = mod_id; + child_event[mod_id] = {}; + all_events[mod_id] = {'parent': "", 'evt':[mod_id , grp_key, start_date, start_date, 100, ""]}; + } + else{ + mod_id = parents[grp_key]; + } + temp_id = mod_id; + }else{ + if (child_event[mod_id][grp_key] == undefined){ + var ch_mod_id = i+ "_" +j; + child_event[mod_id][grp_key] = ch_mod_id; + child_event[ch_mod_id] = {}; + temp_id = ch_mod_id; + all_events[ch_mod_id] = {'parent': mod_id, 'evt':[ch_mod_id , grp_key, start_date, start_date, 100, ""]}; + mod_id = ch_mod_id; + } + else{ + mod_id = child_event[mod_id][grp_key]; + temp_id = mod_id; + } + } + } + all_events[id] = {'parent': temp_id, 'evt':[id , text, start_date, duration, 100, ""]}; + 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, ""]}; + } + all_events[id] = {'parent': mod_id, 'evt':[id , text, start_date, duration, 100, ""]}; + final_events.push(id); + } + } + + 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'] != "") { + var parent_id =all_events[evt_id]['parent']; + if (all_events[parent_id]['evt'][2] > evt_date){ + all_events[parent_id]['evt'][2] = evt_date; + } + evt_id = parent_id; + } + } + var evt_id = []; + var evt_date = ""; + var evt_duration = ""; + var evt_end_date = ""; + var project_tree_field = []; + 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]; + + var evt_str_date = this.convert_date_str(evt_date); + evt_end_date = this.end_date(evt_str_date, evt_duration); + + while (all_events[evt_id]['parent'] != "") { + var parent_id =all_events[evt_id]['parent']; + if (all_events[parent_id]['evt'][3] < evt_end_date){ + all_events[parent_id]['evt'][3] = evt_end_date; + } + evt_id = parent_id; + } + } + + for (var j in self.group_by) { + self.render_events(all_events, j); + } + + if (!self.group_by.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], ""); + prt = self.project.getTaskById(res['parent']); + prt.addChildTask(task); + } + + var oth_hgt = 264; + var min_hgt = 150; + var name_min_wdt = 150; + var gantt_hgt = $(window).height() - oth_hgt; + var search_wdt = $("#oe_app_search").width(); + + if (gantt_hgt > min_hgt) { + $('#GanttView').height(gantt_hgt).width(search_wdt); + } else{ + $('#GanttView').height(min_hgt).width(search_wdt); + } + + self.ganttChartControl.create("GanttView"); + + // Setup Events + self.ganttChartControl.attachEvent("onTaskStartDrag", function(task) { + if (task.parentTask) { + var task_date = task.getEST(); + if (task_date.getHours()) { + task_date.set({ + hour: task_date.getHours(), + minute: task_date.getMinutes(), + second: 0 + }); + } + } + }); + self.ganttChartControl.attachEvent("onTaskEndResize", function(task) {return self.ResizeTask(task);}); + self.ganttChartControl.attachEvent("onTaskEndDrag", function(task) {return self.ResizeTask(task);}); + + var taskdiv = $("div.taskPanel").parent(); + taskdiv.addClass('ganttTaskPanel'); + taskdiv.prev().addClass('ganttDayPanel'); + var $gantt_panel = $(".ganttTaskPanel , .ganttDayPanel"); + + var ganttrow = $('.taskPanel').closest('tr'); + var gtd = ganttrow.children(':first-child'); + gtd.children().addClass('task-name'); + + $(".toggle-sidebar").click(function(e) { + self.set_width(); + }); + + $(window).bind('resize',function() { + window.clearTimeout(self.ganttChartControl._resize_timer); + self.ganttChartControl._resize_timer = window.setTimeout(function(){ + self.reloadView(); + }, 200); + }); + $("div #_1, div #_1 + div").hide(); + _.each(final_events, function(id) { + self.$element.find('.taskNameItem[id="'+id+'"]').click(function() { + self.editTask(self.ganttChartControl.getProjectById("_1").getTaskById(id)); + }) + }); }, ResizeTask: function(task) { var self = this, event_id = task.getId(); + if(task.childTask.length) + return $.when(this.do_warn(_t("Project can not be resized"))).then(this.reloadView()); - if(!event_id || !task.parentTask) - return this.do_warn(_t("Project can not be resized")); - var data = {}; data[this.date_start] = task.getEST().toString(this.date_format); @@ -315,51 +345,101 @@ init: function(parent, dataset, view_id) { var self = this, event_id; if (!task) - event_id = null; + event_id = 0; else { event_id = task.getId(); if(!event_id || !task.parentTask) return false; } if(event_id) event_id = parseInt(event_id, 10); - var action_manager = new openerp.web.ActionManager(this); - var dialog = new openerp.web.Dialog(this, { - width: 800, - height: 600, - buttons : { - Cancel : function() { - $(this).dialog('destroy'); - }, - Save : function() { - var form_view = action_manager.inner_viewmanager.views.form.controller; - - form_view.do_save(function() { - self.reloadView(); - }); - $(this).dialog('destroy'); - } - } - }).start().open(); - action_manager.appendTo(dialog.$element); - action_manager.do_action({ - res_model : this.dataset.model, - res_id: event_id, - views : [[false, 'form']], - type : 'ir.actions.act_window', - auto_search : false, - flags : { - search_view: false, - sidebar : false, - views_switcher : false, - action_buttons : false, - pager: false - } + var pop = new openerp.web.form.FormOpenPopup(this); + + pop.show_element(this.model, event_id, this.context || this.dataset.context, {}); + + pop.on_write_completed.add_last(function() { + self.reloadView(); }); }, - - reloadView: function() { - this.on_project_loaded(this.database_projects); + + set_width: function() { + $gantt_panel.width(1); + jQuery(".ganttTaskPanel").parent().width(1); + + var search_wdt = jQuery("#oe_app_search").width(); + var day_wdt = jQuery(".ganttDayPanel").children().children().width(); + jQuery('#GanttView').css('width','100%'); + + if (search_wdt - day_wdt <= name_min_wdt){ + jQuery(".ganttTaskPanel").parent().width(search_wdt - name_min_wdt); + jQuery(".ganttTaskPanel").width(search_wdt - name_min_wdt); + jQuery(".ganttDayPanel").width(search_wdt - name_min_wdt - 14); + jQuery('.task-name').width(name_min_wdt); + jQuery('.task-name').children().width(name_min_wdt); + }else{ + jQuery(".ganttTaskPanel").parent().width(day_wdt); + jQuery(".ganttTaskPanel").width(day_wdt); + jQuery(".taskPanel").width(day_wdt - 16); + jQuery(".ganttDayPanel").width(day_wdt -16); + jQuery('.task-name').width(search_wdt - day_wdt); + jQuery('.task-name').children().width(search_wdt - day_wdt); + } + + }, + + end_date: function(dat, duration) { + + var self = this; + + var dat = this.convert_str_date(dat); + + var day = Math.floor(duration/self.day_length); + var hrs = duration % self.day_length; + + dat.add(day).days(); + dat.add(hrs).hour(); + + return dat; + }, + + 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); + + 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], ""); + self.project.addTask(task); + } else { + task = new GanttTaskInfo(res['evt'][0], res['evt'][1], res['evt'][2], res['evt'][3], res['evt'][4], ""); + prt = self.project.getTaskById(res['parent']); + prt.addChildTask(task); + } + } + } + } }, do_show: function () { @@ -370,9 +450,49 @@ init: function(parent, dataset, view_id) { this.$element.hide(); }, + convert_str_date: function (str) { + if (typeof str == 'string') { + if (str.length == 19) { + this.date_format = "yyyy-MM-dd HH:mm:ss"; + return openerp.web.str_to_datetime(str); + } + else + if (str.length == 10) { + this.date_format = "yyyy-MM-dd"; + return openerp.web.str_to_date(str); + } + else + if (str.length == 8) { + this.date_format = "HH:mm:ss"; + return openerp.web.str_to_time(str); + } + throw "Unrecognized date/time format"; + } else { + return str; + } + }, + + convert_date_str: function(full_date) { + if (this.date_format == "yyyy-MM-dd HH:mm:ss"){ + return openerp.web.datetime_to_str(full_date); + } else if (this.date_format == "yyyy-MM-dd"){ + return openerp.web.date_to_str(full_date); + } else if (this.date_format == "HH:mm:ss"){ + return openerp.web.time_to_str(full_date); + } + throw "Unrecognized date/time format"; + }, + + reloadView: function() { + return this.on_project_loaded(this.database_projects); + }, + do_search: function (domains, contexts, groupbys) { var self = this; this.group_by = groupbys; + if(this.fields_view.arch.attrs.default_group_by) { + this.group_by = _.uniq(this.group_by.concat(this.fields_view.arch.attrs.default_group_by.split(','))); + } $.when(this.has_been_loaded).then(function() { self.dataset.read_slice([], { domain: domains, From 79e2bcc6c9e5bf58dc026da0edebc84faff4a28f Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 24 Nov 2011 16:47:56 +0530 Subject: [PATCH 15/19] [FIX] Get Task from tree panel using Project info. bzr revid: vda@tinyerp.com-20111124111756-upaxyocg9b1v178u --- addons/web_gantt/static/src/js/gantt.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 07b754890b1..84b36a2f4dd 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -309,9 +309,11 @@ openerp.web_gantt.GanttView = openerp.web.View.extend({ }, 200); }); $("div #_1, div #_1 + div").hide(); + _.each(final_events, function(id) { - self.$element.find('.taskNameItem[id="'+id+'"]').click(function() { - self.editTask(self.ganttChartControl.getProjectById("_1").getTaskById(id)); + var Task = self.ganttChartControl.getProjectById("_1").getTaskById(id); + Task.cTaskNameItem[0].click(function() { + self.editTask(Task); }) }); }, From 321bc449c4bf486f0eca89449df9800c565c66f7 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 24 Nov 2011 16:51:38 +0530 Subject: [PATCH 16/19] [FIX] Oops! event binding on dom.jqueryfy dom. bzr revid: vda@tinyerp.com-20111124112138-w900u1bflff5e4zv --- addons/web_gantt/static/src/js/gantt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 84b36a2f4dd..29f6fc70b9d 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -312,7 +312,7 @@ openerp.web_gantt.GanttView = openerp.web.View.extend({ _.each(final_events, function(id) { var Task = self.ganttChartControl.getProjectById("_1").getTaskById(id); - Task.cTaskNameItem[0].click(function() { + $(Task.cTaskNameItem[0]).click(function() { self.editTask(Task); }) }); From e80e028dfe5df256a9ab79d4c2540ba6020ab650 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 24 Nov 2011 17:34:08 +0530 Subject: [PATCH 17/19] [FIX] display name if no fields defined. bzr revid: vda@tinyerp.com-20111124120408-fj2khgq8d4417ui7 --- addons/web_gantt/static/src/js/gantt.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 29f6fc70b9d..558224b4578 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -38,9 +38,12 @@ openerp.web_gantt.GanttView = openerp.web.View.extend({ this.color_field = this.fields_view.arch.attrs.color, this.colors = this.fields_view.arch.attrs.colors; - var level = this.fields_view.arch.children[0]; - this.parent = level.attrs.link, - this.text = level.children.length ? level.children[0].attrs.name : level.attrs.name; + if (this.fields_view.arch.children.length) { + var level = this.fields_view.arch.children[0]; + this.parent = level.attrs.link, this.text = level.children.length ? level.children[0].attrs.name : level.attrs.name; + } else { + this.text = 'name'; + } if (!this.date_start) { return self.do_warn(_t("date_start is not defined ")) @@ -308,7 +311,10 @@ openerp.web_gantt.GanttView = openerp.web.View.extend({ self.reloadView(); }, 200); }); - $("div #_1, div #_1 + div").hide(); + + $(self.ganttChartControl.getProjectById("_1").projectItem[0]).hide(); + $(self.ganttChartControl.getProjectById("_1").projectNameItem).hide(); + $(self.ganttChartControl.getProjectById("_1").descrProject).hide(); _.each(final_events, function(id) { var Task = self.ganttChartControl.getProjectById("_1").getTaskById(id); From 365c5d57fd7e1bf3f387e7c8ed815ba294360ec2 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 24 Nov 2011 18:19:44 +0530 Subject: [PATCH 18/19] [FIX] reset groupbys. bzr revid: vda@tinyerp.com-20111124124944-mywfq45lx5uypptm --- addons/web_gantt/static/src/js/gantt.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 558224b4578..70a34968775 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -497,10 +497,15 @@ openerp.web_gantt.GanttView = openerp.web.View.extend({ do_search: function (domains, contexts, groupbys) { var self = this; - this.group_by = groupbys; - if(this.fields_view.arch.attrs.default_group_by) { - this.group_by = _.uniq(this.group_by.concat(this.fields_view.arch.attrs.default_group_by.split(','))); + this.group_by = []; + if (this.fields_view.arch.attrs.default_group_by) { + this.group_by = this.fields_view.arch.attrs.default_group_by.split(','); } + + if (groupbys.length) { + this.group_by = groupbys; + } + $.when(this.has_been_loaded).then(function() { self.dataset.read_slice([], { domain: domains, From d1ea780e9d79418a594c1a16fd410e0bf26955f3 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Fri, 25 Nov 2011 13:28:42 +0530 Subject: [PATCH 19/19] [FIX] can Add new task.reload. bzr revid: vda@tinyerp.com-20111125075842-pbhwo4tno13hz8go --- addons/web_gantt/static/src/js/gantt.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 70a34968775..77a2d7a22cb 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -312,12 +312,13 @@ openerp.web_gantt.GanttView = openerp.web.View.extend({ }, 200); }); - $(self.ganttChartControl.getProjectById("_1").projectItem[0]).hide(); - $(self.ganttChartControl.getProjectById("_1").projectNameItem).hide(); - $(self.ganttChartControl.getProjectById("_1").descrProject).hide(); + var Project = self.ganttChartControl.getProjectById("_1"); + $(Project.projectItem[0]).hide(); + $(Project.projectNameItem).hide(); + $(Project.descrProject).hide(); _.each(final_events, function(id) { - var Task = self.ganttChartControl.getProjectById("_1").getTaskById(id); + var Task = Project.getTaskById(id); $(Task.cTaskNameItem[0]).click(function() { self.editTask(Task); }) @@ -365,7 +366,13 @@ openerp.web_gantt.GanttView = openerp.web.View.extend({ pop.show_element(this.model, event_id, this.context || this.dataset.context, {}); - pop.on_write_completed.add_last(function() { + pop.on_write.add(function(id, data) { + var get_project = _.find(self.database_projects, function(project){ return project.id == id}); + if (get_project) { + _.extend(get_project, data); + } else { + _.extend(self.database_projects, _.extend(data, {'id': id})); + } self.reloadView(); }); },