Free cookie consent management tool by TermsFeed Policy Generator

source: branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/wwwroot/js/d3-gantt-jobstatus.js @ 13733

Last change on this file since 13733 was 13733, checked in by jlodewyc, 8 years ago

#2582 Last fixes Job Manager

File size: 8.9 KB
Line 
1/**
2 * @Orignal author Dimitry Kudrayvtsev
3 * @version 2.1
4
5  * Rewritten for Hive Web Job Manager
6 */
7
8d3.gantt = function () {
9    var FIT_TIME_DOMAIN_MODE = "fit";
10    var FIXED_TIME_DOMAIN_MODE = "fixed";
11
12    var margin = {
13        top: 20,
14        right: 40,
15        bottom: 20,
16        left: 70
17    };
18    var drawytitles = true;
19    var selector = 'body';
20    var timeDomainStart = d3.time.day.offset(new Date(), -3);
21    var zoomStart;
22    var zoomEnd;
23    var timeDomainEnd = d3.time.hour.offset(new Date(), +3);
24    var timeDomainMode = FIT_TIME_DOMAIN_MODE;// fixed or fit
25    var taskTypes = [];
26    var taskStatus = [];
27    var height = document.body.clientHeight - margin.top - margin.bottom - 5;
28    var width = document.body.clientWidth - margin.right - margin.left - 5;
29
30    var tickFormat = "%H:%M";
31
32    var keyFunction = function (d) {
33        return d.startDate + d.taskName + d.endDate;
34    };
35
36    var rectTransform = function (d) {
37        return "translate(" + x(d.startDate - 3600000) + "," + y(d.taskName) + ")";
38    };
39
40    var x = d3.time.scale().domain([timeDomainStart, timeDomainEnd]).range([0, width]).clamp(true);
41
42    var y = d3.scale.ordinal().domain(taskTypes).rangeRoundBands([0, height - margin.top - margin.bottom], .1);
43
44    var xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(d3.time.format(tickFormat)).tickSubdivide(true)
45      .tickSize(8).tickPadding(8);
46
47    var yAxis = d3.svg.axis().scale(y).orient("left").tickSize(0);
48
49    var initTimeDomain = function (tasks) {
50        if (timeDomainMode === FIT_TIME_DOMAIN_MODE) {
51            if (tasks === undefined || tasks.length < 1) {
52                timeDomainStart = d3.time.day.offset(new Date(), -3);
53                timeDomainEnd = d3.time.hour.offset(new Date(), +3);
54                return;
55            }
56            tasks.sort(function (a, b) {
57                return a.endDate - b.endDate;
58            });
59            timeDomainEnd = tasks[tasks.length - 1].endDate;
60            tasks.sort(function (a, b) {
61                return a.startDate - b.startDate;
62            });
63            timeDomainStart = tasks[0].startDate;
64        }
65    };
66
67    var initAxis = function () {
68        x = d3.time.scale().domain([timeDomainStart - 3600000, timeDomainEnd - 3600000]).range([0, width]).clamp(true);
69        y = d3.scale.ordinal().domain(taskTypes).rangeRoundBands([0, height - margin.top - margin.bottom], .1);
70        if (new Date(timeDomainStart).toDateString() != new Date(timeDomainEnd).toDateString()) {
71            xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(null).tickSubdivide(true)
72            .tickSize(8).tickPadding(8);
73        }
74        else
75            xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(d3.time.format(tickFormat)).tickSubdivide(true)
76            .tickSize(8).tickPadding(8);
77
78
79        yAxis = d3.svg.axis().scale(y).orient("left").tickSize(0);
80    };
81
82    function gantt(tasks) {
83
84        initTimeDomain(tasks);
85        initAxis();
86
87        var tip = d3.tip()
88            .attr('class', 'd3-tip')
89            .html(function (d) {
90                var start = new Date(d.startDate);
91                var end = new Date(d.endDate);
92                var stat = d.status;
93                if (d.last) {
94                    return stat + " <br/> " + start.toUTCString() + " to now";
95                }
96                return stat + " <br/> " + start.toUTCString() + " to " + end.toUTCString();
97            });
98
99
100        var svgitself = d3.select(selector)
101       .append("svg")
102       .attr("class", "chart")
103       .attr("width", "100%")
104       .attr("height", height + margin.top + margin.bottom)
105        var svg = svgitself.append("g")
106           .attr("class", "gantt-chart")
107       .attr("width", "100%")
108       .attr("height", height + margin.top + margin.bottom)
109       .attr("transform", "translate(" + margin.left + ", " + margin.top + ")")
110        .call(tip);
111
112
113
114
115        svg.selectAll(".chart")
116       .data(tasks, keyFunction).enter()
117       .append("rect")
118       .attr("rx", 5)
119           .attr("ry", 5)
120       .attr("class", function (d) {
121           if (taskStatus[d.status] == null) { return "bar"; }
122           return taskStatus[d.status];
123       })
124       .attr("y", 0)
125       .attr("transform", rectTransform)
126       .attr("height", function (d) { return y.rangeBand(); })
127       .attr("width", function (d) {
128           return (x(d.endDate - 3600000) - x(d.startDate - 3600000));
129       })
130       .on('mouseover', tip.show)
131        .on('mouseout', tip.hide);
132
133
134
135
136
137
138        svg.append("g")
139        .attr("class", "x axis")
140        .attr("transform", "translate(0, " + (height - margin.top - margin.bottom) + ")")
141        .transition()
142        .call(xAxis);
143
144        if (drawytitles)
145            svg.append("g")
146                .attr("class", "y axis")
147                //.attr("transform", "translate(" + ((width / 2)) + "," + (-(height / 2) + margin.top) + " )")
148                .transition()
149                .call(yAxis);
150
151        svgitself.on("mousedown", function () {
152           
153            var p = d3.mouse(this);
154            var w = width;
155            w =  (p[0])/w;
156            gantt.zoom(tasks, w, this);
157        })
158        .on("contextmenu", function (d, i) {
159            zoomStart = null;
160            d3.event.preventDefault();
161            gantt.redraw(tasks, this);
162    });
163
164    return gantt;
165
166};
167    gantt.zoom = function (tasks, xcor, el) {
168     
169    initTimeDomain(tasks);
170    if (zoomStart == null) {
171        zoomStart = timeDomainStart;
172        zoomEnd = timeDomainEnd;
173    }
174    var diff = zoomEnd - zoomStart;
175    var cent = (diff * xcor) + zoomStart;
176    var piece = diff / 1.5;
177       
178    var tempstart = cent - (piece / 2);
179    piece = piece /2;
180    if (tempstart < zoomStart) {
181        piece += zoomStart - tempstart;
182    } else
183        zoomStart = tempstart;
184
185    var tempend = cent + piece;
186    if (tempend > zoomEnd)
187        zoomStart -= tempend - zoomEnd;
188    else
189        zoomEnd = tempend;
190
191    timeDomainStart = zoomStart;
192    timeDomainEnd = zoomEnd;
193    gantt.redrawInner(tasks, el);
194}
195
196gantt.redraw = function(tasks, el){
197    initTimeDomain(tasks);
198    gantt.redrawInner(tasks, el);
199}
200
201gantt.redrawInner= function (tasks, el) {
202       
203    initAxis();
204
205    var svg = d3.select(el);
206
207    var ganttChartGroup = svg.select(".gantt-chart");
208    var rect = ganttChartGroup.selectAll("rect").data(tasks, keyFunction);
209
210    rect.enter()
211     .insert("rect", ":first-child")
212     .attr("rx", 5)
213     .attr("ry", 5)
214 .attr("class", function (d) {
215     if (taskStatus[d.status] == null) { return "bar"; }
216     return taskStatus[d.status];
217 })
218 .transition()
219 .attr("y", 0)
220 .attr("transform", rectTransform)
221 .attr("height", function (d) { return y.rangeBand(); })
222 .attr("width", function (d) {
223     return (x(d.endDate - 3600000) - x(d.startDate - 3600000));
224 });
225
226    rect.transition()
227      .attr("transform", rectTransform)
228 .attr("height", function (d) { return y.rangeBand(); })
229 .attr("width", function (d) {
230     return (x(d.endDate - 3600000) - x(d.startDate - 3600000));
231 });
232
233    rect.exit().remove();
234
235    svg.select(".x").transition().call(xAxis);
236    svg.select(".y").transition().call(yAxis);
237
238    return gantt;
239};
240
241gantt.margin = function (value) {
242    if (!arguments.length)
243        return margin;
244    margin = value;
245    return gantt;
246};
247gantt.drawytitles = function (value) {
248    if (!arguments.length)
249        return drawytitles;
250    drawytitles = value;
251    return gantt;
252}
253gantt.timeDomain = function (value) {
254    if (!arguments.length)
255        return [timeDomainStart, timeDomainEnd];
256    timeDomainStart = +value[0], timeDomainEnd = +value[1];
257    return gantt;
258};
259
260/**
261 * @param {string}
262 *                vale The value can be "fit" - the domain fits the data or
263 *                "fixed" - fixed domain.
264 */
265gantt.timeDomainMode = function (value) {
266    if (!arguments.length)
267        return timeDomainMode;
268    timeDomainMode = value;
269    return gantt;
270
271};
272
273gantt.taskTypes = function (value) {
274    if (!arguments.length)
275        return taskTypes;
276    taskTypes = value;
277    return gantt;
278};
279
280gantt.taskStatus = function (value) {
281    if (!arguments.length)
282        return taskStatus;
283    taskStatus = value;
284    return gantt;
285};
286
287gantt.width = function (value) {
288    if (!arguments.length)
289        return width;
290    width = +value;
291    return gantt;
292};
293
294gantt.height = function (value) {
295    if (!arguments.length)
296        return height;
297    height = +value;
298    return gantt;
299};
300
301gantt.tickFormat = function (value) {
302    if (!arguments.length)
303        return tickFormat;
304    tickFormat = value;
305    return gantt;
306};
307
308gantt.selector = function (value) {
309    if (!arguments.length)
310        return selector;
311    selector = value;
312    return gantt;
313};
314
315return gantt;
316};
Note: See TracBrowser for help on using the repository browser.