mirror of
https://github.com/salesagility/SuiteCRM.git
synced 2024-11-22 07:52:36 +00:00
29a3b668a3
Commits included are: commit 3ea2c1f49d26ef6918a69f4c2069824e0ff487f1 commit 4949b32cf655bbc597bcc19820c81ebbd7559b57 commit92545172da
commita48e6f4572
commit ab6e8322d37b4b8a5c3bb78312445358c97406b2 commit 5911d92e9483309220d7f1b5350edd51fcd6bad5 commit14bcaa3d77
commit3a414f6186
commit2db4441ab4
commitec2fc67231
commitf502666b64
commit9d45b94425
commit7d926ac4ac
commit7d1b17828a
commitfe004be24e
commitc02617039f
commitc8a8fe7cff
commit5a5a11e467
commit4502f66472
commitf4681c81f9
commit9c571f0276
commit929bc56df3
commit ee37e5734e5f3c35b5f432aed83c24205fd40de7 commit bf7012889149154579d0b0b879423919e329583f commit 4fe4ae32fc5d67e05f6af326ccab533e32a0d35a commit818b342a9f
commite58b6cf690
commitb180713c0a
commit 723f5cc09c1b5087e3b83b22ca8f35fc94a82f90 commit 890a6daf50a4c80d3a0080617c1f2cf8c834a5b0 commit 5ce07bfff6c6af032af3cc678e5c4c0bd607010f commit9f18f07f8e
commit39bfaf92ea
commit7abe50ec4f
commitd8b1498a35
commit8b0b56fa63
commit58e82c9ec4
commit6f8b135376
commitfe201f8aa4
commit542e9f4ea5
commitf09e2a1805
commit872e2b73f8
commitf8979a1610
commite8a34d9ad5
commit632080e861
commitf42acc9efa
commitbe4d11f94e
commit61f65a7f70
commit903af549ce
Author: Haris Raheem <haris_raheem@hotmail.com>
815 lines
26 KiB
JavaScript
815 lines
26 KiB
JavaScript
/**
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
* along with this program; if not, see http://www.gnu.org/licenses
|
|
* or write to the Free Software Foundation,Inc., 51 Franklin Street,
|
|
* Fifth Floor, Boston, MA 02110-1301 USA
|
|
* @Package Gantt chart
|
|
* @copyright Andrew Mclaughlan 2014
|
|
* @author Andrew Mclaughlan <andrew@mclaughlan.info>
|
|
*/
|
|
|
|
|
|
/**
|
|
* General javascript for view.ganttchart.php
|
|
*/
|
|
|
|
// unblock when ajax activity stops
|
|
$(document).ajaxStop(function(){
|
|
setTimeout($.unblockUI, 1000);
|
|
});
|
|
//Get the default sugar page loading message
|
|
try{
|
|
var loading = SUGAR.language.languages.app_strings['LBL_LOADING_PAGE'];
|
|
}catch(err){
|
|
var loading = "";
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
|
|
var project_id = $('#project_template_id').val();
|
|
|
|
//generate the chart on page load
|
|
gen_chart(0);
|
|
|
|
//Default to tasks
|
|
var milestone_flag ='Task';
|
|
|
|
//If its a milestone not a full task then disable the duration and duration unit fields
|
|
//by making them read only.
|
|
|
|
$('[name="Milestone"]').change(function(){
|
|
|
|
if ($(this).val() == 'Milestone'){
|
|
$('#Duration').val('0').attr('readonly', true);
|
|
$('#Duration_unit').attr('readonly', true);
|
|
|
|
milestone_flag = 'Milestone';
|
|
}
|
|
else {
|
|
$('#Duration').val('').attr('readonly', false);
|
|
$('#Duration_unit').attr('readonly', false);
|
|
|
|
milestone_flag = 'Task';
|
|
}
|
|
|
|
});
|
|
|
|
//Ajax call to the action_get_end_date() function in controller.php
|
|
//Returns the end date of predecessor with the lag added
|
|
$("#Predecessor").on('change', function() {
|
|
|
|
if($('#task_id').val().length == 0){
|
|
var Id = $(this).find(":selected").attr('rel');
|
|
var Lag = $('#Lag').val();
|
|
var dataString = '&task_id=' + Id + '&lag=' + Lag;
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "index.php?module=AM_ProjectTemplates&action=get_end_date",
|
|
data: dataString,
|
|
success: function(data) {
|
|
$("#Start").val(data);
|
|
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
//Ajax call to the action_get_end_date() function in controller.php
|
|
//Returns the end date of predecessor with the lag added
|
|
$("#Lag").on('change', function() {
|
|
var Id = $("#Predecessor").find(":selected").attr('rel');
|
|
var Lag = $(this).val();
|
|
var dataString = '&task_id=' + Id + '&lag=' + Lag;
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "index.php?module=AM_ProjectTemplates&action=get_end_date",
|
|
data: dataString,
|
|
success: function(data) {
|
|
$("#Start").val(data);
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
//some basic validation on add task popup
|
|
$("#popup_form").validate({
|
|
|
|
rules: {
|
|
task_name: "required",
|
|
Start: {
|
|
required: true
|
|
},
|
|
Duration: {
|
|
required: true,
|
|
number: true
|
|
},
|
|
Complete: {
|
|
required: true,
|
|
number: true,
|
|
max: 100
|
|
}
|
|
},
|
|
messages: {
|
|
task_name: "The task name is required",
|
|
Start: "Start date is required",
|
|
Duration: {
|
|
required: "The duration is required",
|
|
number: "Enter a number"
|
|
},
|
|
Complete: {
|
|
required: "Percentage complete is required",
|
|
number:"Enter a number",
|
|
max: "Maximum value is 100"
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
$('#add_button').button({
|
|
text: true,
|
|
icons: {
|
|
primary: 'ui-icon-plusthick'
|
|
}
|
|
}).click(function( event ) {
|
|
event.preventDefault();
|
|
var form = $("#popup_form");
|
|
|
|
//make sure duration is not readonly on create new task
|
|
$('#Duration').val('0').attr('readonly', false);
|
|
$('#Duration_unit').attr('readonly', false);
|
|
|
|
$( "#template_dialog" ).dialog({
|
|
autoOpen: true,
|
|
show: {
|
|
effect: "none",
|
|
duration: 0
|
|
},
|
|
hide: {
|
|
effect: "none",
|
|
duration: 0
|
|
},
|
|
width: 700,
|
|
modal: false,
|
|
buttons: {
|
|
"Add": function() {
|
|
var Project_id = $('#project_template_id').val();
|
|
var override_business_hours = $('#override_business_hours').val();
|
|
//var Parent_task = $('#parent_task').val();
|
|
var Task_name = $('#task_name').val();
|
|
var milestone = milestone_flag;
|
|
var Task_pre = $('#Predecessor').val();
|
|
var rel_type = $('#relation_type').val();
|
|
var Task_Start = $('#Start').val();
|
|
var Task_Duration = $('#Duration').val();
|
|
var Task_Duration_unit = $('#Duration_unit').val();
|
|
var Task_Resource = $('#Resources').val();
|
|
var Task_Percent = $('#Complete').val();
|
|
var Task_Notes = $('#Notes').val();
|
|
var rowCount = $('#Task_table tr').length -1;
|
|
var dateStart = "Start_date_"+rowCount ;
|
|
|
|
if($("#popup_form").valid()){
|
|
|
|
var dataString = '&project_id=' + Project_id + '&override_business_hours=' + override_business_hours + '&milestone=' + milestone + '&task_name=' +Task_name + '&predecessor=' + Task_pre + '&rel_type=' + rel_type + '&start=' + Task_Start + '&duration=' + Task_Duration + '&unit=' + Task_Duration_unit + '&resource=' + Task_Resource + '&percent=' + Task_Percent + '¬e=' + Task_Notes;
|
|
//block();
|
|
|
|
var this_dialog = $(this);
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "index.php?module=AM_ProjectTemplates&action=update_GanttChart",
|
|
data: dataString,
|
|
success: function() {
|
|
//close and clear form
|
|
$("#popup_form").trigger("reset");
|
|
this_dialog.dialog( "close" );
|
|
}
|
|
});
|
|
}
|
|
},
|
|
Cancel: function() {
|
|
//close and clear form
|
|
$("#popup_form").validate().resetForm();
|
|
$("#popup_form").trigger("reset");
|
|
$(this).dialog( "close" );
|
|
}
|
|
},
|
|
close: function () {
|
|
$(this).parent().promise().done(function () {
|
|
gen_chart(1);
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
/*For date fields sugar overwrites the onchange function that was set on onchange event.In this case you have to assign
|
|
the function to the event after it is loaded on screen. (I could not get jquery to pick up the date field values after
|
|
they were changed by the sugar date picker.
|
|
*/
|
|
|
|
|
|
function gen_chart(blockui){
|
|
//Get the chart properties
|
|
var pid = $('#project_template_id').val();
|
|
|
|
//Put the properties into a string
|
|
var dataString = '&pid=' + pid;
|
|
|
|
var msg = '<div><br />' +
|
|
'<h1><img align="absmiddle" src="themes/default/images/img_loading.gif"> ' + loading + '</h1>' + '</div>';
|
|
//call blockui
|
|
if(blockui == '1'){
|
|
block();
|
|
}
|
|
|
|
//Pass the properties to the controller function via ajax
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "index.php?module=AM_ProjectTemplates&action=generate_chart",
|
|
data: dataString,
|
|
success: function(data) { // On success generate the tasks for the chart
|
|
$('#project_wrapper').html(data);
|
|
},
|
|
complete: function(){
|
|
animate_percentages();
|
|
add_arrows();
|
|
remove_button();
|
|
rows_sortable();
|
|
get_predecessors();
|
|
}
|
|
|
|
});
|
|
}
|
|
//Used to animate the percentage bars on gantt chart tasks
|
|
function animate_percentages(){
|
|
|
|
$('#gantt .task_percent').each(function() {
|
|
|
|
var width = $(this).attr('rel')+'%';
|
|
|
|
$(this).animate(
|
|
{ width: width },
|
|
{
|
|
duration:1000,
|
|
step: function(now, fx) {
|
|
var data= Math.round(now);
|
|
$(this).html(data + '%');
|
|
}
|
|
//easing: "linear"
|
|
}
|
|
);
|
|
});
|
|
}
|
|
|
|
function remove_button(){
|
|
|
|
$('.remove_button').button({
|
|
text: false,
|
|
icons: {
|
|
primary: 'ui-icon-circle-close'
|
|
}
|
|
}).click(function( event ) {
|
|
event.preventDefault();
|
|
var Id = $(this).val();
|
|
|
|
|
|
$( "#delete_dialog" ).dialog({
|
|
autoOpen: true,
|
|
show: {
|
|
effect: "none",
|
|
duration: 0
|
|
},
|
|
hide: {
|
|
effect: "none",
|
|
duration: 0
|
|
},
|
|
width: 700,
|
|
modal: true,
|
|
buttons: {
|
|
"Delete": function() {
|
|
var dataString = '&task_id=' + Id;
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "index.php?module=AM_ProjectTemplates&action=delete_task",
|
|
data: dataString,
|
|
success: function() {
|
|
//close and clear form
|
|
$( "#delete_dialog" ).dialog( "close" );
|
|
}
|
|
});
|
|
|
|
},
|
|
Cancel: function() {
|
|
//close and clear form
|
|
$( this ).dialog( "close" );
|
|
$("#popup_form").validate().resetForm();
|
|
}
|
|
},
|
|
close: function () {
|
|
$(this).parent().promise().done(function () {
|
|
gen_chart(1);
|
|
});
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
function rows_sortable(){
|
|
if ($('#is_editable').length > 0) {
|
|
//Helper function used to prevent table rows with from collapsing when using sortable
|
|
var fixHelperModified = function (e, tr) {
|
|
var $originals = tr.children();
|
|
var $helper = tr.clone();
|
|
$helper.children().each(function (index) {
|
|
$(this).width($originals.eq(index).width())
|
|
});
|
|
return $helper;
|
|
};
|
|
|
|
//Make project task table rows sortable
|
|
$('#Task_table tbody').sortable({
|
|
items: "tr:not(.disable_sort)",//disable sortable on header row
|
|
helper: fixHelperModified, //call helper function
|
|
update: function (event, ui) {
|
|
var order = {};//create object
|
|
$('#Task_table tr.row_sortable').each(function () {//loop through rows
|
|
//get new row indexes
|
|
var rowIndex = $(this).closest('tr').prevAll().length;
|
|
var id = $(this).children('td:first-child').find(".order_number").attr("rel");
|
|
//var order_number = $(this).children('td:first-child').find(".order_number").val();
|
|
var order_number = rowIndex;
|
|
//fill object array with keys(task->id) and values (task->order_number)
|
|
order[id] = order_number;
|
|
});
|
|
|
|
//convert array to json
|
|
var jsonArray = JSON.stringify(order);
|
|
//prepare POST data
|
|
var dataString = {'orderArray': jsonArray};
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "index.php?module=AM_ProjectTemplates&action=update_order",
|
|
data: dataString,
|
|
success: function () {
|
|
gen_chart(1);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
//Gets tasks via ajax call from controller functions get_predecessors
|
|
//Used in the add task pop-up form.
|
|
function get_predecessors(){
|
|
var project_id = $('#project_template_id').val();
|
|
var dataString = '&project_id=' + project_id;
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "index.php?module=AM_ProjectTemplates&action=get_predecessors",
|
|
data: dataString,
|
|
success: function(data) {
|
|
$("#Predecessor").html(data);
|
|
}
|
|
});
|
|
}
|
|
|
|
//Used to create ajax loading effect using the blockUI jquery plugin
|
|
function block(){
|
|
var msg = '<div><br />' +
|
|
'<h1><img align="absmiddle" src="themes/default/images/img_loading.gif"> ' + loading + '</h1>' + '</div>';
|
|
|
|
$.blockUI({//ajax loading screen
|
|
message:msg,
|
|
css: {
|
|
height: '70px',
|
|
width: '240px',
|
|
// top: ($(window).height() - 50) /2 + 'px',
|
|
left: ($(window).width() - 240) /2 + 'px'//centre box
|
|
}
|
|
});
|
|
}
|
|
//Adds relationship link arrows between tasks
|
|
function add_arrows(){
|
|
|
|
$(".link").each(function(i) {
|
|
var task = $(this);
|
|
var pre = $(this).attr('pre');
|
|
|
|
if(i && task.attr('pre') != '0'){
|
|
try{
|
|
drawlink($('#'+ pre), task, task.attr('link'));
|
|
}catch(err){}
|
|
}
|
|
});
|
|
}
|
|
|
|
//Edit project tasks
|
|
function edit_task(task){
|
|
|
|
var data = task.attr('data').split(",");
|
|
var milestone_flag ='Task';
|
|
|
|
$('#task_id').val(data[0]);
|
|
$('#task_name').val(task.text());
|
|
$('#Start').val(data[3]);
|
|
if(data[7] == '1'){
|
|
$('#Subtask').prop('checked', false);
|
|
$('#Milestone').prop('checked', true);
|
|
$('#Duration').val('0').attr('readonly', true);
|
|
$('#Duration_unit').attr('readonly', true);
|
|
}
|
|
else{
|
|
$('#Subtask').prop('checked', true);
|
|
$('#Milestone').prop('checked', false);
|
|
$('#Duration').val('0').attr('readonly', false);
|
|
$('#Duration_unit').attr('readonly', false);
|
|
}
|
|
$('#Predecessor').val(data[1]);
|
|
$('#relation_type').val(data[2]);
|
|
$('#Duration').val(data[4]);
|
|
$('#Duration_unit').val(data[5]);
|
|
$('#Resources').val(data[6]);
|
|
$('#Complete').val(data[8]);
|
|
$('#Notes').val(data[9]);
|
|
$('#Actual_duration').val(data[10]);
|
|
|
|
$( "#template_dialog" ).dialog({
|
|
autoOpen: true,
|
|
show: {
|
|
effect: "none",
|
|
duration: 0
|
|
},
|
|
hide: {
|
|
effect: "none",
|
|
duration: 0
|
|
},
|
|
width: 700,
|
|
modal: true,
|
|
buttons: {
|
|
"Update": function() {
|
|
var Project_id = $('#project_template_id').val();
|
|
var override_business_hours = $('#override_business_hours').val();
|
|
var Task_id = $('#task_id').val();
|
|
//var Parent_task = $('#parent_task').val();
|
|
var Task_name = $('#task_name').val();
|
|
|
|
if($('[name="Milestone"]:checked').val() == 'Milestone'){
|
|
milestone_flag = 'Milestone';
|
|
}
|
|
|
|
var milestone = milestone_flag;
|
|
var Task_pre = $('#Predecessor').val();
|
|
var rel_type = $('#relation_type').val();
|
|
var Task_Start = $('#Start').val();
|
|
var Task_Duration = $('#Duration').val();
|
|
var Task_Duration_unit = $('#Duration_unit').val();
|
|
var Task_Resource = $('#Resources').val();
|
|
var Task_Percent = $('#Complete').val();
|
|
var Task_Notes = $('#Notes').val();
|
|
var Actual_duration = 0;
|
|
|
|
get_predecessors();
|
|
|
|
if($("#popup_form").valid()){
|
|
|
|
var dataString = '&project_id=' + Project_id + '&override_business_hours=' + override_business_hours + '&task_id=' + Task_id + '&milestone=' + milestone + '&task_name=' +Task_name + '&predecessor=' + Task_pre + '&rel_type=' + rel_type + '&start=' + Task_Start + '&duration=' + Task_Duration + '&unit=' + Task_Duration_unit + '&resource=' + Task_Resource + '&percent=' + Task_Percent + '¬e=' + Task_Notes + '&actual_duration=' + Actual_duration;
|
|
//block();
|
|
|
|
var this_dialog = $(this);
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "index.php?module=AM_ProjectTemplates&action=update_GanttChart",
|
|
data: dataString,
|
|
success: function() {
|
|
//close and clear form
|
|
$("#popup_form").trigger("reset");
|
|
this_dialog.dialog( "close" );
|
|
}
|
|
});
|
|
}
|
|
},
|
|
Cancel: function() {
|
|
//close and clear form
|
|
$("#popup_form").validate().resetForm();
|
|
$("#popup_form").trigger("reset");
|
|
$(this).dialog( "close" );
|
|
}
|
|
},
|
|
close: function () {
|
|
$(this).parent().promise().done(function () {
|
|
get_predecessors();
|
|
gen_chart(1);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
/*********************************** Draw Link Elements **************************************/
|
|
|
|
/*
|
|
Copyright (c) 2012-2014 Open Lab
|
|
Written by Roberto Bicchierai and Silvia Chelazzi http://roberto.open-lab.com
|
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
a copy of this software and associated documentation files (the
|
|
"Software"), to deal in the Software without restriction, including
|
|
without limitation the rights to use, copy, modify, merge, publish,
|
|
distribute, sublicense, and/or sell copies of the Software, and to
|
|
permit persons to whom the Software is furnished to do so, subject to
|
|
the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
|
|
|
|
var peduncolusSize = 8;
|
|
var lineSize = 0;
|
|
|
|
|
|
function drawlink (from, to, type) {
|
|
|
|
var rectFrom = buildRect(from);
|
|
var rectTo = buildRect(to);
|
|
|
|
// Dispatch to the correct renderer
|
|
if (type == 'SS') {
|
|
$("#gantt").append(
|
|
drawStartToStart(rectFrom, rectTo, peduncolusSize)
|
|
);
|
|
} else if (type == 'FS') {
|
|
$("#gantt").append(
|
|
drawStartToEnd(rectFrom, rectTo, peduncolusSize)
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* A representation of a Horizontal line
|
|
*/
|
|
HLine = function(width, top, left) {
|
|
var hl = $("<div>").addClass("taskDepLine");
|
|
|
|
hl.css({
|
|
height: lineSize,
|
|
left: left,
|
|
width: width,
|
|
top: top - lineSize / 2 -2 //added - 1
|
|
});
|
|
return hl;
|
|
};
|
|
|
|
/**
|
|
* A representation of a Vertical line
|
|
*/
|
|
VLine = function(height, top, left) {
|
|
var vl = $("<div>").addClass("taskDepLine");
|
|
|
|
vl.css({
|
|
height: height -2,//added -2
|
|
left:left - lineSize / 2,
|
|
width: lineSize,
|
|
top: top
|
|
});
|
|
return vl;
|
|
};
|
|
|
|
/**
|
|
* Given an item, extract its rendered position
|
|
* width and height into a structure.
|
|
*/
|
|
function buildRect(item) {
|
|
var rect = item.position();
|
|
rect.width = item.width();
|
|
rect.height = item.height();
|
|
|
|
return rect;
|
|
}
|
|
|
|
/**
|
|
* The default rendering method, which paints a start to end dependency.
|
|
*
|
|
* @see buildRect
|
|
*/
|
|
function drawStartToEnd(rectFrom, rectTo, peduncolusSize) {
|
|
var left, top;
|
|
var gheight = $('.main_table').innerHeight();
|
|
var gleft = -5;
|
|
|
|
var ndo = $("<div style='position: relative;'> </div>").css({
|
|
"bottom":gheight,
|
|
"left":-5
|
|
});
|
|
|
|
var currentX = rectFrom.left + rectFrom.width;
|
|
var currentY = rectFrom.height / 2 + rectFrom.top;
|
|
|
|
var useThreeLine = (currentX + 2 * peduncolusSize) < rectTo.left;
|
|
|
|
if (!useThreeLine) {
|
|
// L1
|
|
if (peduncolusSize > 0) {
|
|
var l1 = new HLine(peduncolusSize, currentY, currentX);
|
|
currentX = currentX + peduncolusSize;
|
|
ndo.append(l1);
|
|
}
|
|
|
|
// L2
|
|
var l2_4size = ((rectTo.top + rectTo.height / 2) - (rectFrom.top + rectFrom.height / 2)) / 2;
|
|
var l2;
|
|
if (l2_4size < 0) {
|
|
l2 = new VLine(-l2_4size, currentY + l2_4size, currentX);
|
|
} else {
|
|
l2 = new VLine(l2_4size, currentY, currentX);
|
|
}
|
|
currentY = currentY + l2_4size;
|
|
|
|
ndo.append(l2);
|
|
|
|
// L3
|
|
var l3size = rectFrom.left + rectFrom.width + peduncolusSize - (rectTo.left - peduncolusSize);
|
|
currentX = currentX - l3size;
|
|
var l3 = new HLine(l3size, currentY, currentX);
|
|
ndo.append(l3);
|
|
|
|
// L4
|
|
var l4;
|
|
if (l2_4size < 0) {
|
|
l4 = new VLine(-l2_4size, currentY + l2_4size, currentX);
|
|
} else {
|
|
l4 = new VLine(l2_4size, currentY, currentX);
|
|
}
|
|
ndo.append(l4);
|
|
|
|
currentY = currentY + l2_4size;
|
|
|
|
// L5
|
|
if (peduncolusSize > 0) {
|
|
var l5 = new HLine(peduncolusSize, currentY, currentX);
|
|
currentX = currentX + peduncolusSize;
|
|
ndo.append(l5);
|
|
|
|
}
|
|
} else {
|
|
//L1
|
|
var l1_3Size = (rectTo.left - currentX) / 2;
|
|
var l1 = new HLine(l1_3Size, currentY, currentX);
|
|
currentX = currentX + l1_3Size;
|
|
ndo.append(l1);
|
|
|
|
//L2
|
|
var l2Size = ((rectTo.top + rectTo.height / 2) - (rectFrom.top + rectFrom.height / 2));
|
|
var l2;
|
|
if (l2Size < 0) {
|
|
l2 = new VLine(-l2Size, currentY + l2Size, currentX);
|
|
} else {
|
|
l2 = new VLine(l2Size, currentY, currentX);
|
|
}
|
|
ndo.append(l2);
|
|
|
|
currentY = currentY + l2Size;
|
|
|
|
//L3
|
|
var l3 = new HLine(l1_3Size, currentY, currentX);
|
|
currentX = currentX + l1_3Size;
|
|
ndo.append(l3);
|
|
}
|
|
|
|
//arrow
|
|
var arr = $("<img src='modules/AM_ProjectTemplates/images/linkArrow.png'>").css({
|
|
position: 'absolute',
|
|
top: rectTo.top + rectTo.height / 2 - 6,//added -6
|
|
left: rectTo.left - 4
|
|
});
|
|
|
|
ndo.append(arr);
|
|
|
|
return ndo;
|
|
}
|
|
|
|
/**
|
|
* A rendering method which paints a start to start dependency.
|
|
*
|
|
* @see buildRect
|
|
*/
|
|
function drawStartToStart(rectFrom, rectTo, peduncolusSize) {
|
|
var left, top;
|
|
var gheight = $('.main_table').innerHeight();
|
|
var ndo = $("<div style='position: relative;'> </div>").css({
|
|
"bottom":gheight,
|
|
"left":-5
|
|
});
|
|
|
|
var currentX = rectFrom.left;
|
|
var currentY = rectFrom.height / 2 + rectFrom.top;
|
|
|
|
var useThreeLine = (currentX + 2 * peduncolusSize) < rectTo.left;
|
|
|
|
if (!useThreeLine) {
|
|
// L1
|
|
if (peduncolusSize > 0) {
|
|
var l1 = new HLine(peduncolusSize, currentY, currentX - peduncolusSize);
|
|
currentX = currentX - peduncolusSize;
|
|
ndo.append(l1);
|
|
}
|
|
|
|
// L2
|
|
var l2_4size = ((rectTo.top + rectTo.height / 2) - (rectFrom.top + rectFrom.height / 2)) / 2;
|
|
var l2;
|
|
if (l2_4size < 0) {
|
|
l2 = new VLine(-l2_4size, currentY + l2_4size, currentX);
|
|
} else {
|
|
l2 = new VLine(l2_4size, currentY, currentX);
|
|
}
|
|
currentY = currentY + l2_4size;
|
|
|
|
ndo.append(l2);
|
|
|
|
// L3
|
|
var l3size = (rectFrom.left - peduncolusSize) - (rectTo.left - peduncolusSize);
|
|
currentX = currentX - l3size;
|
|
var l3 = new HLine(l3size, currentY, currentX);
|
|
ndo.append(l3);
|
|
|
|
// L4
|
|
var l4;
|
|
if (l2_4size < 0) {
|
|
l4 = new VLine(-l2_4size, currentY + l2_4size, currentX);
|
|
} else {
|
|
l4 = new VLine(l2_4size, currentY, currentX);
|
|
}
|
|
ndo.append(l4);
|
|
|
|
currentY = currentY + l2_4size;
|
|
|
|
// L5
|
|
if (peduncolusSize > 0) {
|
|
var l5 = new HLine(peduncolusSize, currentY, currentX);
|
|
currentX = currentX + peduncolusSize;
|
|
ndo.append(l5);
|
|
}
|
|
} else {
|
|
//L1
|
|
|
|
var l1 = new HLine(peduncolusSize, currentY, currentX - peduncolusSize);
|
|
currentX = currentX - peduncolusSize;
|
|
ndo.append(l1);
|
|
|
|
//L2
|
|
var l2Size = ((rectTo.top + rectTo.height / 2) - (rectFrom.top + rectFrom.height / 2));
|
|
var l2;
|
|
if (l2Size < 0) {
|
|
l2 = new VLine(-l2Size, currentY + l2Size, currentX);
|
|
} else {
|
|
l2 = new VLine(l2Size, currentY, currentX);
|
|
}
|
|
ndo.append(l2);
|
|
|
|
currentY = currentY + l2Size;
|
|
|
|
//L3
|
|
var l3 = new HLine((rectTo.left - rectFrom.left ), currentY, currentX);
|
|
currentX = currentX + peduncolusSize + (rectTo.left - rectFrom.left);
|
|
ndo.append(l3);
|
|
}
|
|
|
|
//arrow
|
|
var arr = $("<img src='modules/AM_ProjectTemplates/images/linkArrow.png'>").css({
|
|
position: 'absolute',
|
|
top: rectTo.top + rectTo.height / 2 - 6,//changed to -6
|
|
left: rectTo.left - 5
|
|
});
|
|
|
|
ndo.append(arr);
|
|
|
|
return ndo;
|
|
}
|
|
|