[FIX] Used Old method for multiple group_by.
bzr revid: vda@tinyerp.com-20111123102614-r4uvsuhrj0t7q9fm
This commit is contained in:
parent
ef3c7d9c3b
commit
15b357cb79
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue