Chris@1295: var draw_gantt = null; Chris@1295: var draw_top; Chris@1295: var draw_right; Chris@1295: var draw_left; Chris@1295: Chris@1295: var rels_stroke_width = 2; Chris@1295: Chris@1295: function setDrawArea() { Chris@1295: draw_top = $("#gantt_draw_area").position().top; Chris@1295: draw_right = $("#gantt_draw_area").width(); Chris@1295: draw_left = $("#gantt_area").scrollLeft(); Chris@1295: } Chris@1295: Chris@1295: function getRelationsArray() { Chris@1295: var arr = new Array(); Chris@1295: $.each($('div.task_todo[data-rels]'), function(index_div, element) { Chris@1295: var element_id = $(element).attr("id"); Chris@1295: if (element_id != null) { Chris@1295: var issue_id = element_id.replace("task-todo-issue-", ""); Chris@1295: var data_rels = $(element).data("rels"); Chris@1295: for (rel_type_key in data_rels) { Chris@1295: $.each(data_rels[rel_type_key], function(index_issue, element_issue) { Chris@1295: arr.push({issue_from: issue_id, issue_to: element_issue, Chris@1295: rel_type: rel_type_key}); Chris@1295: }); Chris@1295: } Chris@1295: } Chris@1295: }); Chris@1295: return arr; Chris@1295: } Chris@1295: Chris@1295: function drawRelations() { Chris@1295: var arr = getRelationsArray(); Chris@1295: $.each(arr, function(index_issue, element_issue) { Chris@1295: var issue_from = $("#task-todo-issue-" + element_issue["issue_from"]); Chris@1295: var issue_to = $("#task-todo-issue-" + element_issue["issue_to"]); Chris@1295: if (issue_from.size() == 0 || issue_to.size() == 0) { Chris@1295: return; Chris@1295: } Chris@1295: var issue_height = issue_from.height(); Chris@1295: var issue_from_top = issue_from.position().top + (issue_height / 2) - draw_top; Chris@1295: var issue_from_right = issue_from.position().left + issue_from.width(); Chris@1295: var issue_to_top = issue_to.position().top + (issue_height / 2) - draw_top; Chris@1295: var issue_to_left = issue_to.position().left; Chris@1295: var color = issue_relation_type[element_issue["rel_type"]]["color"]; Chris@1295: var landscape_margin = issue_relation_type[element_issue["rel_type"]]["landscape_margin"]; Chris@1295: var issue_from_right_rel = issue_from_right + landscape_margin; Chris@1295: var issue_to_left_rel = issue_to_left - landscape_margin; Chris@1295: draw_gantt.path(["M", issue_from_right + draw_left, issue_from_top, Chris@1295: "L", issue_from_right_rel + draw_left, issue_from_top]) Chris@1295: .attr({stroke: color, Chris@1295: "stroke-width": rels_stroke_width Chris@1295: }); Chris@1295: if (issue_from_right_rel < issue_to_left_rel) { Chris@1295: draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_from_top, Chris@1295: "L", issue_from_right_rel + draw_left, issue_to_top]) Chris@1295: .attr({stroke: color, Chris@1295: "stroke-width": rels_stroke_width Chris@1295: }); Chris@1295: draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_to_top, Chris@1295: "L", issue_to_left + draw_left, issue_to_top]) Chris@1295: .attr({stroke: color, Chris@1295: "stroke-width": rels_stroke_width Chris@1295: }); Chris@1295: } else { Chris@1295: var issue_middle_top = issue_to_top + Chris@1295: (issue_height * Chris@1295: ((issue_from_top > issue_to_top) ? 1 : -1)); Chris@1295: draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_from_top, Chris@1295: "L", issue_from_right_rel + draw_left, issue_middle_top]) Chris@1295: .attr({stroke: color, Chris@1295: "stroke-width": rels_stroke_width Chris@1295: }); Chris@1295: draw_gantt.path(["M", issue_from_right_rel + draw_left, issue_middle_top, Chris@1295: "L", issue_to_left_rel + draw_left, issue_middle_top]) Chris@1295: .attr({stroke: color, Chris@1295: "stroke-width": rels_stroke_width Chris@1295: }); Chris@1295: draw_gantt.path(["M", issue_to_left_rel + draw_left, issue_middle_top, Chris@1295: "L", issue_to_left_rel + draw_left, issue_to_top]) Chris@1295: .attr({stroke: color, Chris@1295: "stroke-width": rels_stroke_width Chris@1295: }); Chris@1295: draw_gantt.path(["M", issue_to_left_rel + draw_left, issue_to_top, Chris@1295: "L", issue_to_left + draw_left, issue_to_top]) Chris@1295: .attr({stroke: color, Chris@1295: "stroke-width": rels_stroke_width Chris@1295: }); Chris@1295: } Chris@1295: draw_gantt.path(["M", issue_to_left + draw_left, issue_to_top, Chris@1295: "l", -4 * rels_stroke_width, -2 * rels_stroke_width, Chris@1295: "l", 0, 4 * rels_stroke_width, "z"]) Chris@1295: .attr({stroke: "none", Chris@1295: fill: color, Chris@1295: "stroke-linecap": "butt", Chris@1295: "stroke-linejoin": "miter" Chris@1295: }); Chris@1295: }); Chris@1295: } Chris@1295: Chris@1295: function getProgressLinesArray() { Chris@1295: var arr = new Array(); Chris@1295: var today_left = $('#today_line').position().left; Chris@1295: arr.push({left: today_left, top: 0}); Chris@1295: $.each($('div.issue-subject, div.version-name'), function(index, element) { Chris@1295: var t = $(element).position().top - draw_top ; Chris@1295: var h = ($(element).height() / 9); Chris@1295: var element_top_upper = t - h; Chris@1295: var element_top_center = t + (h * 3); Chris@1295: var element_top_lower = t + (h * 8); Chris@1295: var issue_closed = $(element).children('span').hasClass('issue-closed'); Chris@1295: var version_closed = $(element).children('span').hasClass('version-closed'); Chris@1295: if (issue_closed || version_closed) { Chris@1295: arr.push({left: today_left, top: element_top_center}); Chris@1295: } else { Chris@1295: var issue_done = $("#task-done-" + $(element).attr("id")); Chris@1295: var is_behind_start = $(element).children('span').hasClass('behind-start-date'); Chris@1295: var is_over_end = $(element).children('span').hasClass('over-end-date'); Chris@1295: if (is_over_end) { Chris@1295: arr.push({left: draw_right, top: element_top_upper, is_right_edge: true}); Chris@1295: arr.push({left: draw_right, top: element_top_lower, is_right_edge: true, none_stroke: true}); Chris@1295: } else if (issue_done.size() > 0) { Chris@1295: var done_left = issue_done.first().position().left + Chris@1295: issue_done.first().width(); Chris@1295: arr.push({left: done_left, top: element_top_center}); Chris@1295: } else if (is_behind_start) { Chris@1295: arr.push({left: 0 , top: element_top_upper, is_left_edge: true}); Chris@1295: arr.push({left: 0 , top: element_top_lower, is_left_edge: true, none_stroke: true}); Chris@1295: } else { Chris@1295: var todo_left = today_left; Chris@1295: var issue_todo = $("#task-todo-" + $(element).attr("id")); Chris@1295: if (issue_todo.size() > 0){ Chris@1295: todo_left = issue_todo.first().position().left; Chris@1295: } Chris@1295: arr.push({left: Math.min(today_left, todo_left), top: element_top_center}); Chris@1295: } Chris@1295: } Chris@1295: }); Chris@1295: return arr; Chris@1295: } Chris@1295: Chris@1295: function drawGanttProgressLines() { Chris@1295: var arr = getProgressLinesArray(); Chris@1295: var color = $("#today_line") Chris@1295: .css("border-left-color"); Chris@1295: var i; Chris@1295: for(i = 1 ; i < arr.length ; i++) { Chris@1295: if (!("none_stroke" in arr[i]) && Chris@1295: (!("is_right_edge" in arr[i - 1] && "is_right_edge" in arr[i]) && Chris@1295: !("is_left_edge" in arr[i - 1] && "is_left_edge" in arr[i])) Chris@1295: ) { Chris@1295: var x1 = (arr[i - 1].left == 0) ? 0 : arr[i - 1].left + draw_left; Chris@1295: var x2 = (arr[i].left == 0) ? 0 : arr[i].left + draw_left; Chris@1295: draw_gantt.path(["M", x1, arr[i - 1].top, Chris@1295: "L", x2, arr[i].top]) Chris@1295: .attr({stroke: color, "stroke-width": 2}); Chris@1295: } Chris@1295: } Chris@1295: } Chris@1295: Chris@1295: function drawGanttHandler() { Chris@1295: var folder = document.getElementById('gantt_draw_area'); Chris@1295: if(draw_gantt != null) Chris@1295: draw_gantt.clear(); Chris@1295: else Chris@1295: draw_gantt = Raphael(folder); Chris@1295: setDrawArea(); Chris@1295: if ($("#draw_progress_line").attr('checked')) Chris@1295: drawGanttProgressLines(); Chris@1295: if ($("#draw_rels").attr('checked')) Chris@1295: drawRelations(); Chris@1295: }