Commit d80adf94 authored by Jérome Perrin's avatar Jérome Perrin

Change Output_viewGantt to be a generic GANTT widget

parent 2fdc5108
......@@ -5,191 +5,42 @@
initGadgetMixin) {
"use strict";
gantt.templates.task_class = function (start, end, obj) {
return obj.parent ? "sub_task" : "";
};
function gantt_widget(all_data, gadget) {
// XXX: use dhx_gantt zoom level feature (
// http://dhtmlx.com/docs/products/dhtmlxGantt/02_features.html )
var now = new Date(),
start_date = all_data.general.currentDate,
input_data = all_data.input,
graph_data = all_data.graph,
output_data = all_data.result.result_list[gadget.props.result],
config = all_data
.application_configuration.output[gadget.props.action]
.configuration,
gantt_data;
// temporary hack
now.setHours(0);
now.setMinutes(0);
now.setSeconds(0);
/*
GANTT widget
if ((start_date !== undefined) && (start_date !== "")) {
start_date = new Date(start_date);
} else {
start_date = new Date(now.getTime());
}
Gantt expect data in the following format:
gantt_data = {
data: [
time_unit: one of minute, hour, day, week, month or year
task_list: [
{
id: "by_operator",
text: "By Operator",
start_date: start_date,
duration: 0,
project: 1,
id: "project_1", # an unique id, different than "0" which is a reserved id
text: "First Project", # the text to display
start_date: '2015-03-02 08:54',
# The date in '%d-%m-%Y %H:%M' format, optionnal for projects
# XXX it would be better to use ISO8601 / http://www.w3.org/TR/NOTE-datetime
duration: 100, # the duration in time unit, optionnal for projects
type: 'project',
open: true
},
{
id: "by_station",
text: "By Station",
id: "project_1_task_1",
text: "A Task",
start_date: start_date,
duration: 0,
project: 1,
open: true
}
],
link: []
};
console.log("gantt gadget method");
console.log(config);
console.log(input_data);
console.log(graph_data);
console.log(output_data);
function isVisibleStation(station) {
var i;
// we should be able to define in the backend which
// station is visible
for (i = 0; i <= output_data.elementList.length-1; i += 1) {
if (output_data.elementList[i].id === station) {
return (output_data.elementList[i].family !== 'Buffer' &&
output_data.elementList[i].family !== 'Exit' &&
output_data.elementList[i].family !== 'Operator' &&
output_data.elementList[i].family !== 'Entry');
}
}
}
$.each(
output_data.elementList.sort(function (a, b) {
return a.id < b.id ? -1 : 1;
}),
function (idx, obj) {
var duration = 0;
if (obj.family === 'Operator') {
gantt_data.data.push({
id: obj.id,
text: obj.id,
project: 1,
open: false,
parent: "by_operator"
});
console.log("operator");
console.log(obj.id);
if (obj.results.schedule) {
$.each(obj.results.schedule, function (i, schedule) {
var task_start_date;
// Filter intermediate steps in part job shop
if (isVisibleStation(schedule.stationId)) {
if (schedule.exitTime) {
duration = 24 * (schedule.exitTime - schedule.entranceTime);
} else {
if (obj.results.schedule[i + 1]) {
duration = obj.results.schedule[i + 1].entranceTime -
schedule.entranceTime;
} else {
// XXX completion time not provided
duration = obj.results.completionTime -
schedule.entranceTime;
}
stop_date: stop_date,
duration: 100,
parent: "project_1", # id of the parent
open: false
}
if (duration > 0.0) {
console.log("..");
console.log("step");
console.log(i);
console.log("duration");
console.log(duration);
task_start_date = new Date(start_date.getTime());
]
// for simulation time unit as days
// task_start_date.setDate(task_start_date.getDate() +
// schedule['entranceTime']);
// for simulation time unit as days hours
task_start_date.setTime(task_start_date.getTime() +
schedule.entranceTime * 1000 * 60);
XXX both stop & start date are required for compatibility with dxhtmlscheduler
console.log("start date");
console.log(task_start_date);
console.log(schedule.entranceTime);
console.log(schedule.entranceTime * 1000 * 60);
gantt_data.data.push({
id: obj.id + '.' + schedule.stationId + '.' + i,
text: schedule.stationId,
start_date: task_start_date,
duration: duration,
parent: obj.id
});
gantt_data.data.push({
id: 'operator.' + obj.id + '.' + idx + '_' + i,
text: obj.id + "-" + schedule.stationId,
start_date: task_start_date,
duration: duration,
parent: schedule.stationId,
by_station: 1
});
}
}
});
}
} else {
if (isVisibleStation(obj.id)) {
gantt_data.data.push({
id: obj.id,
text: obj.id,
project: 1,
open: false,
parent: "by_station"
});
}
}
}
);
TODOs:
- make a really reusable gadget
- handle links (prerequisites)
// gantt_output_height = 35 * (gantt_data.data.length + 1) + 1;
gantt_data.data.sort(function (a, b) {
// sort gantt data in a chronological order
var result;
if (a.start_date === undefined && b.start_date !== undefined) {
result = 1;
} else if (a.start_date !== undefined && b.start_date === undefined) {
result = -1;
} else if (a.start_date === undefined && b.start_date === undefined) {
result = 0;
} else if (a.start_date > b.start_date) {
result = 1;
} else if (a.start_date < b.start_date) {
result = -1;
} else {
result = 0;
}
return result;
});
console.log("Returning the Gantt Data");
console.log(gantt_data);
return gantt_data;
}
*/
var gadget_klass = rJS(window);
initGadgetMixin(gadget_klass);
......@@ -207,7 +58,6 @@
gadget = this;
gadget.props.jio_key = jio_key;
gadget.props.result = options.result;
gadget.props.action = options.action;
return gadget.aq_getAttachment({
"_id": gadget.props.jio_key,
......@@ -215,30 +65,20 @@
})
.push(function (simulation_json) {
var json_data = JSON.parse(simulation_json);
gadget.props.result = gantt_widget(
json_data,
gadget
);
gadget.props.result = json_data.result.result_list[options.result][
options.action_definition.configuration.output_id];
});
})
.declareMethod("startService", function () {
$(this.props.element).find('.gant_container').dhx_gantt({
data: this.props.result,
readonly: true,
/* for days has simulation time unit
scale_unit: 'day',
step: 7
*/
// for hours has simulation time unit
scale_unit: 'day',
duration_unit: 60 * 1000,
// date_grid: "%H:%i",
date_scale: "%M/%d",
step: 1,
subscales: [{unit: "hour", step: 1, date: "%H:%i"}]
});
var gantt_tasks = {
data: this.props.result.task_list,
links: []
};
gantt.config.duration_unit = this.props.result.time_unit;
gantt.init($(this.props.element).find('.gant_container')[0]);
gantt.parse(gantt_tasks);
return new RSVP.Queue()
.push(function () {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment