0
0
mirror of https://github.com/salesagility/SuiteCRM.git synced 2024-11-22 07:52:36 +00:00
salesagility_SuiteCRM/modules/AM_ProjectTemplates/js/main_lib.js
Ashley Nicolson 29a3b668a3 Merge branch feature/projectsmodule. Resolve many Project Module issues and Gantt Chart issues.
Commits included are:
commit 3ea2c1f49d26ef6918a69f4c2069824e0ff487f1
commit 4949b32cf655bbc597bcc19820c81ebbd7559b57
commit 92545172da
commit a48e6f4572
commit ab6e8322d37b4b8a5c3bb78312445358c97406b2
commit 5911d92e9483309220d7f1b5350edd51fcd6bad5
commit 14bcaa3d77
commit 3a414f6186
commit 2db4441ab4
commit ec2fc67231
commit f502666b64
commit 9d45b94425
commit 7d926ac4ac
commit 7d1b17828a
commit fe004be24e
commit c02617039f
commit c8a8fe7cff
commit 5a5a11e467
commit 4502f66472
commit f4681c81f9
commit 9c571f0276
commit 929bc56df3
commit ee37e5734e5f3c35b5f432aed83c24205fd40de7
commit bf7012889149154579d0b0b879423919e329583f
commit 4fe4ae32fc5d67e05f6af326ccab533e32a0d35a
commit 818b342a9f
commit e58b6cf690
commit b180713c0a
commit 723f5cc09c1b5087e3b83b22ca8f35fc94a82f90
commit 890a6daf50a4c80d3a0080617c1f2cf8c834a5b0
commit 5ce07bfff6c6af032af3cc678e5c4c0bd607010f
commit 9f18f07f8e
commit 39bfaf92ea
commit 7abe50ec4f
commit d8b1498a35
commit 8b0b56fa63
commit 58e82c9ec4
commit 6f8b135376
commit fe201f8aa4
commit 542e9f4ea5
commit f09e2a1805
commit 872e2b73f8
commit f8979a1610
commit e8a34d9ad5
commit 632080e861
commit f42acc9efa
commit be4d11f94e
commit 61f65a7f70
commit 903af549ce
Author: Haris Raheem <haris_raheem@hotmail.com>
2017-05-16 15:36:18 +01:00

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 + '&note=' + 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 + '&note=' + 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;
}