Mercurial > hg > soundsoftware-site
comparison public/javascripts/gantt.js @ 1298:4f746d8966dd redmine_2.3_integration
Merge from redmine-2.3 branch to create new branch redmine-2.3-integration
author | Chris Cannam |
---|---|
date | Fri, 14 Jun 2013 09:28:30 +0100 |
parents | 622f24f53b42 |
children |
comparison
equal
deleted
inserted
replaced
1297:0a574315af3e | 1298:4f746d8966dd |
---|---|
1 var draw_gantt = null; | |
2 var draw_top; | |
3 var draw_right; | |
4 var draw_left; | |
5 | |
6 var rels_stroke_width = 2; | |
7 | |
8 function setDrawArea() { | |
9 draw_top = $("#gantt_draw_area").position().top; | |
10 draw_right = $("#gantt_draw_area").width(); | |
11 draw_left = $("#gantt_area").scrollLeft(); | |
12 } | |
13 | |
14 function getRelationsArray() { | |
15 var arr = new Array(); | |
16 $.each($('div.task_todo[data-rels]'), function(index_div, element) { | |
17 var element_id = $(element).attr("id"); | |
18 if (element_id != null) { | |
19 var issue_id = element_id.replace("task-todo-issue-", ""); | |
20 var data_rels = $(element).data("rels"); | |
21 for (rel_type_key in data_rels) { | |
22 $.each(data_rels[rel_type_key], function(index_issue, element_issue) { | |
23 arr.push({issue_from: issue_id, issue_to: element_issue, | |
24 rel_type: rel_type_key}); | |
25 }); | |
26 } | |
27 } | |
28 }); | |
29 return arr; | |
30 } | |
31 | |
32 function drawRelations() { | |
33 var arr = getRelationsArray(); | |
34 $.each(arr, function(index_issue, element_issue) { | |
35 var issue_from = $("#task-todo-issue-" + element_issue["issue_from"]); | |
36 var issue_to = $("#task-todo-issue-" + element_issue["issue_to"]); | |
37 if (issue_from.size() == 0 || issue_to.size() == 0) { | |
38 return; | |
39 } | |
40 var issue_height = issue_from.height(); | |
41 var issue_from_top = issue_from.position().top + (issue_height / 2) - draw_top; | |
42 var issue_from_right = issue_from.position().left + issue_from.width(); | |
43 var issue_to_top = issue_to.position().top + (issue_height / 2) - draw_top; | |
44 var issue_to_left = issue_to.position().left; | |
45 var color = issue_relation_type[element_issue["rel_type"]]["color"]; | |
46 var landscape_margin = issue_relation_type[element_issue["rel_type"]]["landscape_margin"]; | |
47 var issue_from_right_rel = issue_from_right + landscape_margin; | |
48 var issue_to_left_rel = issue_to_left - landscape_margin; | |
49 draw_gantt.path(["M", issue_from_right + draw_left, issue_from_top, | |
50 "L", issue_from_right_rel + draw_left, issue_from_top]) | |
51 .attr({stroke: color, | |
52 "stroke-width": rels_stroke_width | |
53 }); | |
54 if (issue_from_right_rel < issue_to_left_rel) { | |
55 draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_from_top, | |
56 "L", issue_from_right_rel + draw_left, issue_to_top]) | |
57 .attr({stroke: color, | |
58 "stroke-width": rels_stroke_width | |
59 }); | |
60 draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_to_top, | |
61 "L", issue_to_left + draw_left, issue_to_top]) | |
62 .attr({stroke: color, | |
63 "stroke-width": rels_stroke_width | |
64 }); | |
65 } else { | |
66 var issue_middle_top = issue_to_top + | |
67 (issue_height * | |
68 ((issue_from_top > issue_to_top) ? 1 : -1)); | |
69 draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_from_top, | |
70 "L", issue_from_right_rel + draw_left, issue_middle_top]) | |
71 .attr({stroke: color, | |
72 "stroke-width": rels_stroke_width | |
73 }); | |
74 draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_middle_top, | |
75 "L", issue_to_left_rel + draw_left, issue_middle_top]) | |
76 .attr({stroke: color, | |
77 "stroke-width": rels_stroke_width | |
78 }); | |
79 draw_gantt.path(["M", issue_to_left_rel + draw_left, issue_middle_top, | |
80 "L", issue_to_left_rel + draw_left, issue_to_top]) | |
81 .attr({stroke: color, | |
82 "stroke-width": rels_stroke_width | |
83 }); | |
84 draw_gantt.path(["M", issue_to_left_rel + draw_left, issue_to_top, | |
85 "L", issue_to_left + draw_left, issue_to_top]) | |
86 .attr({stroke: color, | |
87 "stroke-width": rels_stroke_width | |
88 }); | |
89 } | |
90 draw_gantt.path(["M", issue_to_left + draw_left, issue_to_top, | |
91 "l", -4 * rels_stroke_width, -2 * rels_stroke_width, | |
92 "l", 0, 4 * rels_stroke_width, "z"]) | |
93 .attr({stroke: "none", | |
94 fill: color, | |
95 "stroke-linecap": "butt", | |
96 "stroke-linejoin": "miter" | |
97 }); | |
98 }); | |
99 } | |
100 | |
101 function getProgressLinesArray() { | |
102 var arr = new Array(); | |
103 var today_left = $('#today_line').position().left; | |
104 arr.push({left: today_left, top: 0}); | |
105 $.each($('div.issue-subject, div.version-name'), function(index, element) { | |
106 var t = $(element).position().top - draw_top ; | |
107 var h = ($(element).height() / 9); | |
108 var element_top_upper = t - h; | |
109 var element_top_center = t + (h * 3); | |
110 var element_top_lower = t + (h * 8); | |
111 var issue_closed = $(element).children('span').hasClass('issue-closed'); | |
112 var version_closed = $(element).children('span').hasClass('version-closed'); | |
113 if (issue_closed || version_closed) { | |
114 arr.push({left: today_left, top: element_top_center}); | |
115 } else { | |
116 var issue_done = $("#task-done-" + $(element).attr("id")); | |
117 var is_behind_start = $(element).children('span').hasClass('behind-start-date'); | |
118 var is_over_end = $(element).children('span').hasClass('over-end-date'); | |
119 if (is_over_end) { | |
120 arr.push({left: draw_right, top: element_top_upper, is_right_edge: true}); | |
121 arr.push({left: draw_right, top: element_top_lower, is_right_edge: true, none_stroke: true}); | |
122 } else if (issue_done.size() > 0) { | |
123 var done_left = issue_done.first().position().left + | |
124 issue_done.first().width(); | |
125 arr.push({left: done_left, top: element_top_center}); | |
126 } else if (is_behind_start) { | |
127 arr.push({left: 0 , top: element_top_upper, is_left_edge: true}); | |
128 arr.push({left: 0 , top: element_top_lower, is_left_edge: true, none_stroke: true}); | |
129 } else { | |
130 var todo_left = today_left; | |
131 var issue_todo = $("#task-todo-" + $(element).attr("id")); | |
132 if (issue_todo.size() > 0){ | |
133 todo_left = issue_todo.first().position().left; | |
134 } | |
135 arr.push({left: Math.min(today_left, todo_left), top: element_top_center}); | |
136 } | |
137 } | |
138 }); | |
139 return arr; | |
140 } | |
141 | |
142 function drawGanttProgressLines() { | |
143 var arr = getProgressLinesArray(); | |
144 var color = $("#today_line") | |
145 .css("border-left-color"); | |
146 var i; | |
147 for(i = 1 ; i < arr.length ; i++) { | |
148 if (!("none_stroke" in arr[i]) && | |
149 (!("is_right_edge" in arr[i - 1] && "is_right_edge" in arr[i]) && | |
150 !("is_left_edge" in arr[i - 1] && "is_left_edge" in arr[i])) | |
151 ) { | |
152 var x1 = (arr[i - 1].left == 0) ? 0 : arr[i - 1].left + draw_left; | |
153 var x2 = (arr[i].left == 0) ? 0 : arr[i].left + draw_left; | |
154 draw_gantt.path(["M", x1, arr[i - 1].top, | |
155 "L", x2, arr[i].top]) | |
156 .attr({stroke: color, "stroke-width": 2}); | |
157 } | |
158 } | |
159 } | |
160 | |
161 function drawGanttHandler() { | |
162 var folder = document.getElementById('gantt_draw_area'); | |
163 if(draw_gantt != null) | |
164 draw_gantt.clear(); | |
165 else | |
166 draw_gantt = Raphael(folder); | |
167 setDrawArea(); | |
168 if ($("#draw_progress_line").attr('checked')) | |
169 drawGanttProgressLines(); | |
170 if ($("#draw_rels").attr('checked')) | |
171 drawRelations(); | |
172 } |