To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / public / javascripts / gantt.js @ 1298:4f746d8966dd

History | View | Annotate | Download (7.32 KB)

1 1295:622f24f53b42 Chris
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
}