[ Index ] |
PHP Cross Reference of vtigercrm-6.1.0 |
[Summary view] [Print] [Text view]
1 /*+*********************************************************************************** 2 * The contents of this file are subject to the vtiger CRM Public License Version 1.0 3 * ("License"); You may not use this file except in compliance with the License 4 * The Original Code is: vtiger CRM Open Source 5 * The Initial Developer of the Original Code is vtiger. 6 * Portions created by vtiger are Copyright (C) vtiger. 7 * All Rights Reserved. 8 *************************************************************************************/ 9 10 jQuery.Class("Vtiger_Detail_Js",{ 11 12 detailInstance : false, 13 14 getInstance: function(){ 15 if( Vtiger_Detail_Js.detailInstance == false ){ 16 var module = app.getModuleName(); 17 var view = app.getViewName(); 18 var moduleClassName = module+"_"+view+"_Js"; 19 var fallbackClassName = Vtiger_Detail_Js; 20 if(typeof window[moduleClassName] != 'undefined'){ 21 var instance = new window[moduleClassName](); 22 }else{ 23 var instance = new fallbackClassName(); 24 } 25 Vtiger_Detail_Js.detailInstance = instance; 26 } 27 return Vtiger_Detail_Js.detailInstance; 28 }, 29 30 31 32 /* 33 * function to trigger send Email 34 * @params: send email url , module name. 35 */ 36 triggerSendEmail : function(detailActionUrl, module){ 37 Vtiger_Helper_Js.checkServerConfig(module).then(function(data){ 38 if(data == true){ 39 var currentInstance = Vtiger_Detail_Js.getInstance(); 40 var parentRecord = new Array(); 41 var params = {}; 42 parentRecord.push(currentInstance.getRecordId()); 43 params['module'] = app.getModuleName(); 44 params['view'] = "MassActionAjax"; 45 params['selected_ids'] = parentRecord; 46 params['mode'] = "showComposeEmailForm"; 47 params['step'] = "step1"; 48 params['relatedLoad'] = true; 49 Vtiger_Index_Js.showComposeEmailPopup(params); 50 } else { 51 alert(app.vtranslate('JS_EMAIL_SERVER_CONFIGURATION')); 52 } 53 }); 54 }, 55 56 /* 57 * function to trigger Detail view actions 58 * @params: Action url , callback function. 59 */ 60 triggerDetailViewAction : function(detailActionUrl, callBackFunction){ 61 var detailInstance = Vtiger_Detail_Js.getInstance(); 62 var selectedIds = new Array(); 63 selectedIds.push(detailInstance.getRecordId()); 64 var postData = { 65 "selected_ids": JSON.stringify(selectedIds) 66 }; 67 var actionParams = { 68 "type":"POST", 69 "url":detailActionUrl, 70 "dataType":"html", 71 "data" : postData 72 }; 73 74 AppConnector.request(actionParams).then( 75 function(data) { 76 if(data) { 77 app.showModalWindow(data,{'text-align' : 'left'}); 78 if(typeof callBackFunction == 'function'){ 79 callBackFunction(data); 80 } 81 } 82 }, 83 function(error,err){ 84 85 } 86 ); 87 }, 88 89 /* 90 * function to trigger send Sms 91 * @params: send sms url , module name. 92 */ 93 triggerSendSms : function(detailActionUrl, module) { 94 Vtiger_Helper_Js.checkServerConfig(module).then(function(data){ 95 if(data == true){ 96 Vtiger_Detail_Js.triggerDetailViewAction(detailActionUrl); 97 } else { 98 alert(app.vtranslate('JS_SMS_SERVER_CONFIGURATION')); 99 } 100 }); 101 }, 102 103 triggerTransferOwnership : function(massActionUrl){ 104 var thisInstance = this; 105 thisInstance.getRelatedModulesContainer = false; 106 var actionParams = { 107 "type":"POST", 108 "url":massActionUrl, 109 "dataType":"html", 110 "data" : {} 111 }; 112 AppConnector.request(actionParams).then( 113 function(data) { 114 if(data) { 115 var callback = function(data) { 116 var params = app.validationEngineOptions; 117 params.onValidationComplete = function(form, valid){ 118 if(valid){ 119 thisInstance.transferOwnershipSave(form) 120 } 121 return false; 122 } 123 jQuery('#changeOwner').validationEngine(app.validationEngineOptions); 124 } 125 app.showModalWindow(data, function(data){ 126 var selectElement = thisInstance.getRelatedModuleContainer(); 127 app.changeSelectElementView(selectElement, 'select2'); 128 if(typeof callback == 'function'){ 129 callback(data); 130 } 131 }); 132 } 133 } 134 ); 135 }, 136 137 transferOwnershipSave : function (form){ 138 var thisInstance = this; 139 var transferOwner = jQuery('#transferOwnerId').val(); 140 var relatedModules = jQuery('#related_modules').val(); 141 var recordId = jQuery('#recordId').val(); 142 var params = { 143 'module': app.getModuleName(), 144 'action' : 'TransferOwnership', 145 'record':recordId, 146 'transferOwnerId' : transferOwner, 147 'related_modules' : relatedModules 148 } 149 AppConnector.request(params).then( 150 function(data) { 151 if(data.success){ 152 app.hideModalWindow(); 153 var params = { 154 title : app.vtranslate('JS_MESSAGE'), 155 text: app.vtranslate('JS_RECORDS_TRANSFERRED_SUCCESSFULLY'), 156 animation: 'show', 157 type: 'info' 158 }; 159 Vtiger_Helper_Js.showPnotify(params); 160 } 161 } 162 ); 163 }, 164 165 /* 166 * Function to get the related module container 167 */ 168 getRelatedModuleContainer : function(){ 169 if(this.getRelatedModulesContainer == false){ 170 this.getRelatedModulesContainer = jQuery('#related_modules'); 171 } 172 return this.getRelatedModulesContainer; 173 }, 174 175 /* 176 * function to trigger delete record action 177 * @params: delete record url. 178 */ 179 deleteRecord : function(deleteRecordActionUrl) { 180 var message = app.vtranslate('LBL_DELETE_CONFIRMATION'); 181 Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then(function(data) { 182 AppConnector.request(deleteRecordActionUrl+'&ajaxDelete=true').then( 183 function(data){ 184 if(data.success == true){ 185 window.location.href = data.result; 186 }else{ 187 Vtiger_Helper_Js.showPnotify(data.error.message); 188 } 189 }); 190 }, 191 function(error, err){ 192 } 193 ); 194 }, 195 196 reloadRelatedList : function(){ 197 var pageNumber = jQuery('[name="currentPageNum"]').val(); 198 var detailInstance = Vtiger_Detail_Js.getInstance(); 199 detailInstance.loadRelatedList(pageNumber); 200 } 201 202 },{ 203 targetPicklistChange : false, 204 targetPicklist : false, 205 detailViewContentHolder : false, 206 detailViewForm : false, 207 detailViewDetailsTabLabel : 'LBL_RECORD_DETAILS', 208 detailViewSummaryTabLabel : 'LBL_RECORD_SUMMARY', 209 detailViewRecentCommentsTabLabel : 'ModComments', 210 detailViewRecentActivitiesTabLabel : 'Activities', 211 detailViewRecentUpdatesTabLabel : 'LBL_UPDATES', 212 detailViewRecentDocumentsTabLabel : 'Documents', 213 214 fieldUpdatedEvent : 'Vtiger.Field.Updated', 215 widgetPostLoad : 'Vtiger.Widget.PostLoad', 216 217 //Filels list on updation of which we need to upate the detailview header 218 updatedFields : ['company','designation','title'], 219 //Event that will triggered before saving the ajax edit of fields 220 fieldPreSave : 'Vtiger.Field.PreSave', 221 222 referenceFieldNames : { 223 'Accounts' : 'parent_id', 224 'Contacts' : 'contact_id', 225 'Leads' : 'parent_id', 226 'Potentials' : 'parent_id', 227 'HelpDesk' : 'parent_id' 228 }, 229 230 //constructor 231 init : function() { 232 233 }, 234 235 getDeleteMessageKey : function() { 236 return 'LBL_DELETE_CONFIRMATION'; 237 }, 238 239 loadWidgets : function(){ 240 var thisInstance = this; 241 var widgetList = jQuery('[class^="widgetContainer_"]'); 242 widgetList.each(function(index,widgetContainerELement){ 243 var widgetContainer = jQuery(widgetContainerELement); 244 thisInstance.loadWidget(widgetContainer); 245 }); 246 }, 247 248 loadWidget : function(widgetContainer) { 249 var thisInstance = this; 250 var aDeferred = jQuery.Deferred(); 251 var contentHeader = jQuery('.widget_header',widgetContainer); 252 var contentContainer = jQuery('.widget_contents',widgetContainer); 253 var urlParams = widgetContainer.data('url'); 254 var relatedModuleName = contentHeader.find('[name="relatedModule"]').val(); 255 256 var params = { 257 'type' : 'GET', 258 'dataType': 'html', 259 'data' : urlParams 260 }; 261 contentContainer.progressIndicator({}); 262 AppConnector.request(params).then( 263 function(data){ 264 contentContainer.progressIndicator({'mode': 'hide'}); 265 contentContainer.html(data); 266 app.registerEventForTextAreaFields(jQuery(".commentcontent")) 267 contentContainer.trigger(thisInstance.widgetPostLoad,{'widgetName' : relatedModuleName}) 268 aDeferred.resolve(params); 269 }, 270 function(){ 271 aDeferred.reject(); 272 } 273 ); 274 return aDeferred.promise(); 275 }, 276 277 /** 278 * Function to load only Comments Widget. 279 */ 280 //TODO improve this API. 281 loadCommentsWidget : function() { 282 283 }, 284 285 loadContents : function(url,data) { 286 var thisInstance = this; 287 var aDeferred = jQuery.Deferred(); 288 289 var detailContentsHolder = this.getContentHolder(); 290 var params = url; 291 if(typeof data != 'undefined'){ 292 params = {}; 293 params.url = url; 294 params.data = data; 295 } 296 AppConnector.requestPjax(params).then( 297 function(responseData){ 298 detailContentsHolder.html(responseData); 299 responseData = detailContentsHolder.html(); 300 //thisInstance.triggerDisplayTypeEvent(); 301 thisInstance.registerBlockStatusCheckOnLoad(); 302 //Make select box more usability 303 app.changeSelectElementView(detailContentsHolder); 304 //Attach date picker event to date fields 305 app.registerEventForDatePickerFields(detailContentsHolder); 306 app.registerEventForTextAreaFields(jQuery(".commentcontent")); 307 jQuery('.commentcontent').autosize(); 308 thisInstance.getForm().validationEngine(); 309 aDeferred.resolve(responseData); 310 }, 311 function(){ 312 313 } 314 ); 315 316 return aDeferred.promise(); 317 }, 318 319 getUpdatefFieldsArray : function(){ 320 return this.updatedFields; 321 }, 322 323 /** 324 * Function to return related tab. 325 * @return : jQuery Object. 326 */ 327 getTabByLabel : function(tabLabel) { 328 var tabs = this.getTabs(); 329 var targetTab = false; 330 tabs.each(function(index,element){ 331 var tab = jQuery(element); 332 var labelKey = tab.data('labelKey'); 333 if(labelKey == tabLabel){ 334 targetTab = tab; 335 return false; 336 } 337 }); 338 return targetTab; 339 }, 340 341 selectModuleTab : function(){ 342 var relatedTabContainer = this.getTabContainer(); 343 var moduleTab = relatedTabContainer.find('li.module-tab'); 344 this.deSelectAllrelatedTabs(); 345 this.markTabAsSelected(moduleTab); 346 }, 347 348 deSelectAllrelatedTabs : function() { 349 var relatedTabContainer = this.getTabContainer(); 350 this.getTabs().removeClass('active'); 351 }, 352 353 markTabAsSelected : function(tabElement){ 354 tabElement.addClass('active'); 355 }, 356 357 getSelectedTab : function() { 358 var tabContainer = this.getTabContainer(); 359 return tabContainer.find('li.active'); 360 }, 361 362 getTabContainer : function(){ 363 return jQuery('div.related'); 364 }, 365 366 getTabs : function() { 367 return this.getTabContainer().find('li'); 368 }, 369 370 getContentHolder : function() { 371 if(this.detailViewContentHolder == false) { 372 this.detailViewContentHolder = jQuery('div.details div.contents'); 373 } 374 return this.detailViewContentHolder; 375 }, 376 377 /** 378 * Function which will give the detail view form 379 * @return : jQuery element 380 */ 381 getForm : function() { 382 if(this.detailViewForm == false) { 383 this.detailViewForm = jQuery('#detailView'); 384 } 385 return this.detailViewForm; 386 }, 387 388 getRecordId : function(){ 389 return jQuery('#recordId').val(); 390 }, 391 392 getRelatedModuleName : function() { 393 return jQuery('.relatedModuleName',this.getContentHolder()).val(); 394 }, 395 396 397 saveFieldValues : function (fieldDetailList) { 398 var aDeferred = jQuery.Deferred(); 399 400 var recordId = this.getRecordId(); 401 402 var data = {}; 403 if(typeof fieldDetailList != 'undefined'){ 404 data = fieldDetailList; 405 } 406 407 data['record'] = recordId; 408 409 data['module'] = app.getModuleName(); 410 data['action'] = 'SaveAjax'; 411 412 AppConnector.request(data).then( 413 function(reponseData){ 414 aDeferred.resolve(reponseData); 415 } 416 ); 417 418 return aDeferred.promise(); 419 }, 420 421 422 getRelatedListCurrentPageNum : function() { 423 return jQuery('input[name="currentPageNum"]',this.getContentHolder()).val(); 424 }, 425 426 /** 427 * function to remove comment block if its exists. 428 */ 429 removeCommentBlockIfExists : function() { 430 var detailContentsHolder = this.getContentHolder(); 431 var Commentswidget = jQuery('.commentsBody',detailContentsHolder); 432 jQuery('.addCommentBlock',Commentswidget).remove(); 433 }, 434 435 /** 436 * function to get the Comment thread for the given parent. 437 * params: Url to get the Comment thread 438 */ 439 getCommentThread : function(url) { 440 var aDeferred = jQuery.Deferred(); 441 AppConnector.request(url).then( 442 function(data) { 443 aDeferred.resolve(data); 444 }, 445 function(error,err){ 446 447 } 448 ) 449 return aDeferred.promise(); 450 }, 451 452 /** 453 * function to save comment 454 * return json response 455 */ 456 saveComment : function(e) { 457 var thisInstance = this; 458 var aDeferred = jQuery.Deferred(); 459 var currentTarget = jQuery(e.currentTarget); 460 var commentMode = currentTarget.data('mode'); 461 var closestCommentBlock = currentTarget.closest('.addCommentBlock'); 462 var commentContent = closestCommentBlock.find('.commentcontent'); 463 var commentContentValue = commentContent.val(); 464 var errorMsg; 465 if(commentContentValue == ""){ 466 errorMsg = app.vtranslate('JS_LBL_COMMENT_VALUE_CANT_BE_EMPTY') 467 commentContent.validationEngine('showPrompt', errorMsg , 'error','bottomLeft',true); 468 aDeferred.reject(); 469 return aDeferred.promise(); 470 } 471 if(commentMode == "edit"){ 472 var editCommentReason = closestCommentBlock.find('[name="reasonToEdit"]').val(); 473 } 474 475 var progressIndicatorElement = jQuery.progressIndicator({}); 476 var element = jQuery(e.currentTarget); 477 element.attr('disabled', 'disabled'); 478 479 var commentInfoHeader = closestCommentBlock.closest('.commentDetails').find('.commentInfoHeader'); 480 var commentId = commentInfoHeader.data('commentid'); 481 var parentCommentId = commentInfoHeader.data('parentcommentid'); 482 var postData = { 483 'commentcontent' : commentContentValue, 484 'related_to': thisInstance.getRecordId(), 485 'module' : 'ModComments' 486 } 487 488 if(commentMode == "edit"){ 489 postData['record'] = commentId; 490 postData['reasontoedit'] = editCommentReason; 491 postData['parent_comments'] = parentCommentId; 492 postData['mode'] = 'edit'; 493 postData['action'] = 'Save'; 494 } else if(commentMode == "add"){ 495 postData['parent_comments'] = commentId; 496 postData['action'] = 'SaveAjax'; 497 } 498 AppConnector.request(postData).then( 499 function(data){ 500 progressIndicatorElement.progressIndicator({'mode':'hide'}); 501 aDeferred.resolve(data); 502 }, 503 function(textStatus, errorThrown){ 504 progressIndicatorElement.progressIndicator({'mode':'hide'}); 505 element.removeAttr('disabled'); 506 aDeferred.reject(textStatus, errorThrown); 507 } 508 ); 509 510 return aDeferred.promise(); 511 }, 512 513 /** 514 * function to return the UI of the comment. 515 * return html 516 */ 517 getCommentUI : function(commentId){ 518 var aDeferred = jQuery.Deferred(); 519 var postData = { 520 'view' : 'DetailAjax', 521 'module' : 'ModComments', 522 'record' : commentId 523 } 524 AppConnector.request(postData).then( 525 function(data){ 526 aDeferred.resolve(data); 527 }, 528 function(error,err){ 529 530 } 531 ); 532 return aDeferred.promise(); 533 }, 534 535 /** 536 * function to return cloned add comment block 537 * return jQuery Obj. 538 */ 539 getCommentBlock : function(){ 540 var detailContentsHolder = this.getContentHolder(); 541 var clonedCommentBlock = jQuery('.basicAddCommentBlock',detailContentsHolder).clone(true,true).removeClass('basicAddCommentBlock hide').addClass('addCommentBlock'); 542 clonedCommentBlock.find('.commentcontenthidden').removeClass('commentcontenthidden').addClass('commentcontent'); 543 return clonedCommentBlock; 544 }, 545 546 /** 547 * function to return cloned edit comment block 548 * return jQuery Obj. 549 */ 550 getEditCommentBlock : function(){ 551 var detailContentsHolder = this.getContentHolder(); 552 var clonedCommentBlock = jQuery('.basicEditCommentBlock',detailContentsHolder).clone(true,true).removeClass('basicEditCommentBlock hide').addClass('addCommentBlock'); 553 clonedCommentBlock.find('.commentcontenthidden').removeClass('commentcontenthidden').addClass('commentcontent'); 554 return clonedCommentBlock; 555 }, 556 557 /* 558 * Function to register the submit event for Send Sms 559 */ 560 registerSendSmsSubmitEvent : function(){ 561 var thisInstance = this; 562 jQuery('body').on('submit','#massSave',function(e){ 563 var form = jQuery(e.currentTarget); 564 var smsTextLength = form.find('#message').val().length; 565 if(smsTextLength > 160) { 566 var params = { 567 title : app.vtranslate('JS_MESSAGE'), 568 text: app.vtranslate('LBL_SMS_MAX_CHARACTERS_ALLOWED'), 569 animation: 'show', 570 type: 'error' 571 }; 572 Vtiger_Helper_Js.showPnotify(params); 573 return false; 574 } 575 var submitButton = form.find(':submit'); 576 submitButton.attr('disabled','disabled'); 577 thisInstance.SendSmsSave(form); 578 e.preventDefault(); 579 }); 580 }, 581 582 /* 583 * Function to Save and sending the Sms and hide the modal window of send sms 584 */ 585 SendSmsSave : function(form){ 586 var progressInstance = jQuery.progressIndicator({ 587 'position' : 'html', 588 'blockInfo' : { 589 'enabled' : true 590 } 591 }); 592 var SendSmsUrl = form.serializeFormData(); 593 AppConnector.request(SendSmsUrl).then( 594 function(data) { 595 app.hideModalWindow(); 596 progressInstance.progressIndicator({ 597 'mode' : 'hide' 598 }); 599 }, 600 function(error,err){ 601 602 } 603 ); 604 }, 605 606 /** 607 * Function which will register events to update the record name in the detail view when any of 608 * the name field is changed 609 */ 610 registerNameAjaxEditEvent : function() { 611 var thisInstance = this; 612 var detailContentsHolder = thisInstance.getContentHolder(); 613 detailContentsHolder.on(thisInstance.fieldUpdatedEvent, '.nameField', function(e, params){ 614 var form = thisInstance.getForm(); 615 var nameFields = form.data('nameFields'); 616 var recordLabel = ''; 617 for(var index in nameFields) { 618 if(index != 0) { 619 recordLabel += ' ' 620 } 621 622 var nameFieldName = nameFields[index]; 623 recordLabel += form.find('[name="'+nameFieldName+'"]').val(); 624 } 625 var recordLabelElement = detailContentsHolder.closest('.contentsDiv').find('.recordLabel'); 626 recordLabelElement.text(recordLabel); 627 }); 628 }, 629 630 updateHeaderNameFields : function(){ 631 var thisInstance = this; 632 var detailContentsHolder = thisInstance.getContentHolder(); 633 var form = thisInstance.getForm(); 634 var nameFields = form.data('nameFields'); 635 var recordLabelElement = detailContentsHolder.closest('.contentsDiv').find('.recordLabel'); 636 var title = ''; 637 for(var index in nameFields) { 638 var nameFieldName = nameFields[index]; 639 var nameField = form.find('[name="'+nameFieldName+'"]'); 640 if(nameField.length > 0){ 641 var recordLabel = nameField.val(); 642 title += recordLabel+" "; 643 recordLabelElement.find('[class="'+nameFieldName+'"]').text(recordLabel); 644 } 645 } 646 var salutatioField = recordLabelElement.find('.salutation'); 647 if(salutatioField.length > 0){ 648 var salutatioValue = salutatioField.text(); 649 title = salutatioValue+title; 650 } 651 recordLabelElement.attr('title',title); 652 }, 653 654 registerAjaxEditEvent : function(){ 655 var thisInstance = this; 656 var detailContentsHolder = thisInstance.getContentHolder(); 657 detailContentsHolder.on(thisInstance.fieldUpdatedEvent,'input,select,textarea',function(e){ 658 thisInstance.updateHeaderValues(jQuery(e.currentTarget)); 659 }); 660 }, 661 662 updateHeaderValues : function(currentElement){ 663 var thisInstance = this; 664 if( currentElement.hasClass('nameField')){ 665 thisInstance.updateHeaderNameFields(); 666 return true; 667 } 668 669 var name = currentElement.attr('name'); 670 var updatedFields = this.getUpdatefFieldsArray(); 671 var detailContentsHolder = thisInstance.getContentHolder(); 672 if(jQuery.inArray(name,updatedFields) != '-1'){ 673 var recordLabel = currentElement.val(); 674 var recordLabelElement = detailContentsHolder.closest('.contentsDiv').find('.'+name+'_label'); 675 recordLabelElement.text(recordLabel); 676 } 677 }, 678 679 /* 680 * Function to register the click event of email field 681 */ 682 registerEmailFieldClickEvent : function(){ 683 var detailContentsHolder = this.getContentHolder(); 684 detailContentsHolder.on('click','.emailField',function(e){ 685 e.stopPropagation(); 686 }) 687 }, 688 689 /* 690 * Function to register the click event of phone field 691 */ 692 registerPhoneFieldClickEvent : function(){ 693 var detailContentsHolder = this.getContentHolder(); 694 detailContentsHolder.on('click','.phoneField',function(e){ 695 e.stopPropagation(); 696 }) 697 }, 698 699 /* 700 * Function to register the click event of url field 701 */ 702 registerUrlFieldClickEvent : function(){ 703 var detailContentsHolder = this.getContentHolder(); 704 detailContentsHolder.on('click','.urlField',function(e){ 705 e.stopPropagation(); 706 }) 707 }, 708 709 /** 710 * Function to register event for related list row click 711 */ 712 registerRelatedRowClickEvent: function(){ 713 var detailContentsHolder = this.getContentHolder(); 714 detailContentsHolder.on('click','.listViewEntries',function(e){ 715 var targetElement = jQuery(e.target, jQuery(e.currentTarget)); 716 if(targetElement.is('td:first-child') && (targetElement.children('input[type="checkbox"]').length > 0)) return; 717 if(jQuery(e.target).is('input[type="checkbox"]')) return; 718 var elem = jQuery(e.currentTarget); 719 var recordUrl = elem.data('recordurl'); 720 if(typeof recordUrl != "undefined"){ 721 window.location.href = recordUrl; 722 } 723 }); 724 725 }, 726 727 loadRelatedList : function(pageNumber){ 728 var relatedListInstance = new Vtiger_RelatedList_Js(this.getRecordId(), app.getModuleName(), this.getSelectedTab(), this.getRelatedModuleName()); 729 var params = {'page':pageNumber}; 730 relatedListInstance.loadRelatedList(params); 731 }, 732 733 registerEventForRelatedListPagination : function(){ 734 var thisInstance = this; 735 var detailContentsHolder = this.getContentHolder(); 736 detailContentsHolder.on('click','#relatedListNextPageButton',function(e){ 737 var element = jQuery(e.currentTarget); 738 if(element.attr('disabled') == "disabled"){ 739 return; 740 } 741 var selectedTabElement = thisInstance.getSelectedTab(); 742 var relatedModuleName = thisInstance.getRelatedModuleName(); 743 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 744 relatedController.nextPageHandler(); 745 }); 746 detailContentsHolder.on('click','#relatedListPreviousPageButton',function(){ 747 var selectedTabElement = thisInstance.getSelectedTab(); 748 var relatedModuleName = thisInstance.getRelatedModuleName(); 749 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 750 relatedController.previousPageHandler(); 751 }); 752 detailContentsHolder.on('click','#relatedListPageJump',function(e){ 753 var selectedTabElement = thisInstance.getSelectedTab(); 754 var relatedModuleName = thisInstance.getRelatedModuleName(); 755 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 756 relatedController.getRelatedPageCount(); 757 }); 758 detailContentsHolder.on('click','#relatedListPageJumpDropDown > li',function(e){ 759 e.stopImmediatePropagation(); 760 }).on('keypress','#pageToJump',function(e){ 761 var selectedTabElement = thisInstance.getSelectedTab(); 762 var relatedModuleName = thisInstance.getRelatedModuleName(); 763 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 764 relatedController.pageJumpHandler(e); 765 }); 766 }, 767 768 /** 769 * Function to register Event for Sorting 770 */ 771 registerEventForRelatedList : function(){ 772 var thisInstance = this; 773 var detailContentsHolder = this.getContentHolder(); 774 detailContentsHolder.on('click','.relatedListHeaderValues',function(e){ 775 var element = jQuery(e.currentTarget); 776 var selectedTabElement = thisInstance.getSelectedTab(); 777 var relatedModuleName = thisInstance.getRelatedModuleName(); 778 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 779 relatedController.sortHandler(element); 780 }); 781 782 detailContentsHolder.on('click', 'button.selectRelation', function(e){ 783 var selectedTabElement = thisInstance.getSelectedTab(); 784 var relatedModuleName = thisInstance.getRelatedModuleName(); 785 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 786 relatedController.showSelectRelationPopup().then(function(data){ 787 var emailEnabledModule = jQuery(data).find('[name="emailEnabledModules"]').val(); 788 if(emailEnabledModule){ 789 thisInstance.registerEventToEditRelatedStatus(); 790 } 791 }); 792 }); 793 794 detailContentsHolder.on('click', 'a.relationDelete', function(e){ 795 e.stopImmediatePropagation(); 796 var element = jQuery(e.currentTarget); 797 var instance = Vtiger_Detail_Js.getInstance(); 798 var key = instance.getDeleteMessageKey(); 799 var message = app.vtranslate(key); 800 Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then( 801 function(e) { 802 var row = element.closest('tr'); 803 var relatedRecordid = row.data('id'); 804 var selectedTabElement = thisInstance.getSelectedTab(); 805 var relatedModuleName = thisInstance.getRelatedModuleName(); 806 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 807 relatedController.deleteRelation([relatedRecordid]).then(function(response){ 808 relatedController.loadRelatedList(); 809 }); 810 }, 811 function(error, err){ 812 } 813 ); 814 }); 815 }, 816 817 registerBlockAnimationEvent : function(){ 818 var detailContentsHolder = this.getContentHolder(); 819 detailContentsHolder.on('click','.blockToggle',function(e){ 820 var currentTarget = jQuery(e.currentTarget); 821 var blockId = currentTarget.data('id'); 822 var closestBlock = currentTarget.closest('.detailview-table'); 823 var bodyContents = closestBlock.find('tbody'); 824 var data = currentTarget.data(); 825 var module = app.getModuleName(); 826 var hideHandler = function() { 827 bodyContents.hide('slow'); 828 app.cacheSet(module+'.'+blockId, 0) 829 } 830 var showHandler = function() { 831 bodyContents.show(); 832 app.cacheSet(module+'.'+blockId, 1) 833 } 834 var data = currentTarget.data(); 835 if(data.mode == 'show'){ 836 hideHandler(); 837 currentTarget.hide(); 838 closestBlock.find("[data-mode='hide']").show(); 839 }else{ 840 showHandler(); 841 currentTarget.hide(); 842 closestBlock.find("[data-mode='show']").show(); 843 } 844 }); 845 846 }, 847 848 registerBlockStatusCheckOnLoad : function(){ 849 var blocks = this.getContentHolder().find('.detailview-table'); 850 var module = app.getModuleName(); 851 blocks.each(function(index,block){ 852 var currentBlock = jQuery(block); 853 var headerAnimationElement = currentBlock.find('.blockToggle').not('.hide'); 854 var bodyContents = currentBlock.find('tbody') 855 var blockId = headerAnimationElement.data('id'); 856 var cacheKey = module+'.'+blockId; 857 var value = app.cacheGet(cacheKey, null); 858 if(value != null){ 859 if(value == 1){ 860 headerAnimationElement.hide(); 861 currentBlock.find("[data-mode='show']").show(); 862 bodyContents.show(); 863 } else { 864 headerAnimationElement.hide(); 865 currentBlock.find("[data-mode='hide']").show(); 866 bodyContents.hide(); 867 } 868 } 869 }); 870 }, 871 872 /** 873 * Function to register event for adding related record for module 874 */ 875 registerEventForAddingRelatedRecord : function(){ 876 var thisInstance = this; 877 var detailContentsHolder = this.getContentHolder(); 878 detailContentsHolder.on('click','[name="addButton"]',function(e){ 879 var element = jQuery(e.currentTarget); 880 var selectedTabElement = thisInstance.getSelectedTab(); 881 var relatedModuleName = thisInstance.getRelatedModuleName(); 882 var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ relatedModuleName +'"]'); 883 if(quickCreateNode.length <= 0) { 884 window.location.href = element.data('url'); 885 return; 886 } 887 888 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 889 relatedController.addRelatedRecord(element); 890 }) 891 }, 892 893 894 /** 895 * Function to handle the ajax edit for detailview and summary view fields 896 * which will expects the currentTdElement 897 */ 898 ajaxEditHandling : function(currentTdElement) { 899 var thisInstance = this; 900 var detailViewValue = jQuery('.value',currentTdElement); 901 var editElement = jQuery('.edit',currentTdElement); 902 var actionElement = jQuery('.summaryViewEdit', currentTdElement); 903 var fieldnameElement = jQuery('.fieldname', editElement); 904 var fieldName = fieldnameElement.val(); 905 var fieldElement = jQuery('[name="'+ fieldName +'"]', editElement); 906 907 if(fieldElement.attr('disabled') == 'disabled'){ 908 return; 909 } 910 911 if(editElement.length <= 0) { 912 return; 913 } 914 915 if(editElement.is(':visible')){ 916 return; 917 } 918 919 detailViewValue.addClass('hide'); 920 editElement.removeClass('hide').show().children().filter('input[type!="hidden"]input[type!="image"],select').filter(':first').focus(); 921 922 var saveTriggred = false; 923 var preventDefault = false; 924 925 var saveHandler = function(e) { 926 var element = jQuery(e.target); 927 if((element.closest('td').is(currentTdElement))){ 928 return; 929 } 930 931 currentTdElement.removeAttr('tabindex'); 932 933 var previousValue = fieldnameElement.data('prevValue'); 934 var formElement = thisInstance.getForm(); 935 var formData = formElement.serializeFormData(); 936 var ajaxEditNewValue = formData[fieldName]; 937 //value that need to send to the server 938 var fieldValue = ajaxEditNewValue; 939 var fieldInfo = Vtiger_Field_Js.getInstance(fieldElement.data('fieldinfo')); 940 941 // Since checkbox will be sending only on and off and not 1 or 0 as currrent value 942 if(fieldElement.is('input:checkbox')) { 943 if(fieldElement.is(':checked')) { 944 ajaxEditNewValue = '1'; 945 } else { 946 ajaxEditNewValue = '0'; 947 } 948 fieldElement = fieldElement.filter('[type="checkbox"]'); 949 } 950 var errorExists = fieldElement.validationEngine('validate'); 951 //If validation fails 952 if(errorExists) { 953 return; 954 } 955 956 957 958 959 fieldElement.validationEngine('hide'); 960 //Before saving ajax edit values we need to check if the value is changed then only we have to save 961 if(previousValue == ajaxEditNewValue) { 962 editElement.addClass('hide'); 963 detailViewValue.removeClass('hide'); 964 actionElement.show(); 965 jQuery(document).off('click', '*', saveHandler); 966 } else { 967 var preFieldSaveEvent = jQuery.Event(thisInstance.fieldPreSave); 968 fieldElement.trigger(preFieldSaveEvent, {'fieldValue' : fieldValue, 'recordId' : thisInstance.getRecordId()}); 969 if(preFieldSaveEvent.isDefaultPrevented()) { 970 //Stop the save 971 saveTriggred = false; 972 preventDefault = true; 973 return 974 } 975 preventDefault = false; 976 977 jQuery(document).off('click', '*', saveHandler); 978 979 if(!saveTriggred && !preventDefault) { 980 saveTriggred = true; 981 }else{ 982 return; 983 } 984 985 currentTdElement.progressIndicator(); 986 editElement.addClass('hide'); 987 var fieldNameValueMap = {}; 988 if(fieldInfo.getType() == 'multipicklist') { 989 var multiPicklistFieldName = fieldName.split('[]'); 990 fieldName = multiPicklistFieldName[0]; 991 } 992 fieldNameValueMap["value"] = fieldValue; 993 fieldNameValueMap["field"] = fieldName; 994 fieldNameValueMap = thisInstance.getCustomFieldNameValueMap(fieldNameValueMap); 995 thisInstance.saveFieldValues(fieldNameValueMap).then(function(response) { 996 var postSaveRecordDetails = response.result; 997 currentTdElement.progressIndicator({'mode':'hide'}); 998 detailViewValue.removeClass('hide'); 999 actionElement.show(); 1000 detailViewValue.html(postSaveRecordDetails[fieldName].display_value); 1001 fieldElement.trigger(thisInstance.fieldUpdatedEvent,{'old':previousValue,'new':fieldValue}); 1002 fieldnameElement.data('prevValue', ajaxEditNewValue); 1003 fieldElement.data('selectedValue', ajaxEditNewValue); 1004 //After saving source field value, If Target field value need to change by user, show the edit view of target field. 1005 if(thisInstance.targetPicklistChange) { 1006 if(jQuery('.summaryView', thisInstance.getForm()).length > 0) { 1007 thisInstance.targetPicklist.find('.summaryViewEdit').trigger('click'); 1008 } else { 1009 thisInstance.targetPicklist.trigger('click'); 1010 } 1011 thisInstance.targetPicklistChange = false; 1012 thisInstance.targetPicklist = false; 1013 } 1014 }, 1015 function(error){ 1016 //TODO : Handle error 1017 currentTdElement.progressIndicator({'mode':'hide'}); 1018 } 1019 ) 1020 } 1021 } 1022 1023 jQuery(document).on('click','*', saveHandler); 1024 }, 1025 1026 1027 triggerDisplayTypeEvent : function() { 1028 var widthType = app.cacheGet('widthType', 'narrowWidthType'); 1029 if(widthType) { 1030 var elements = jQuery('#detailView').find('td'); 1031 elements.addClass(widthType); 1032 } 1033 }, 1034 1035 /** 1036 * Function updates the hidden elements which is used for creating relations 1037 */ 1038 addElementsToQuickCreateForCreatingRelation : function(container,moduleName,recordId){ 1039 jQuery('<input type="hidden" name="sourceModule" value="'+moduleName+'" >').appendTo(container); 1040 jQuery('<input type="hidden" name="sourceRecord" value="'+recordId+'" >').appendTo(container); 1041 jQuery('<input type="hidden" name="relationOperation" value="true" >').appendTo(container); 1042 }, 1043 1044 /** 1045 * Function to register event for activity widget for adding 1046 * event and task from the widget 1047 */ 1048 registerEventForActivityWidget : function(){ 1049 var thisInstance = this; 1050 1051 /* 1052 * Register click event for add button in Related Activities widget 1053 */ 1054 jQuery('.createActivity').on('click', function(e){ 1055 var referenceModuleName = "Calendar"; 1056 var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]'); 1057 var recordId = thisInstance.getRecordId(); 1058 var module = app.getModuleName(); 1059 var element = jQuery(e.currentTarget); 1060 1061 if(quickCreateNode.length <= 0) { 1062 Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED')) 1063 } 1064 var fieldName = thisInstance.referenceFieldNames[module]; 1065 1066 var customParams = {}; 1067 customParams[fieldName] = recordId; 1068 1069 var fullFormUrl = element.data('url'); 1070 var preQuickCreateSave = function(data){ 1071 thisInstance.addElementsToQuickCreateForCreatingRelation(data,module,recordId); 1072 1073 var taskGoToFullFormButton = data.find('[class^="CalendarQuikcCreateContents"]').find('#goToFullForm'); 1074 var eventsGoToFullFormButton = data.find('[class^="EventsQuikcCreateContents"]').find('#goToFullForm'); 1075 var taskFullFormUrl = taskGoToFullFormButton.data('editViewUrl')+"&"+fullFormUrl; 1076 var eventsFullFormUrl = eventsGoToFullFormButton.data('editViewUrl')+"&"+fullFormUrl; 1077 taskGoToFullFormButton.data('editViewUrl',taskFullFormUrl); 1078 eventsGoToFullFormButton.data('editViewUrl',eventsFullFormUrl); 1079 } 1080 1081 var callbackFunction = function() { 1082 var params = {}; 1083 params['record'] = recordId; 1084 params['view'] = 'Detail'; 1085 params['module'] = module; 1086 params['mode'] = 'getActivities'; 1087 1088 AppConnector.request(params).then( 1089 function(data) { 1090 var activitiesWidget = jQuery('#relatedActivities'); 1091 activitiesWidget.html(data); 1092 app.changeSelectElementView(activitiesWidget); 1093 thisInstance.registerEventForActivityWidget(); 1094 } 1095 ); 1096 1097 var summaryViewContainer = thisInstance.getContentHolder(); 1098 var updatesWidget = summaryViewContainer.find("[data-name='LBL_UPDATES']"); 1099 thisInstance.loadWidget(updatesWidget); 1100 } 1101 1102 var QuickCreateParams = {}; 1103 QuickCreateParams['callbackPostShown'] = preQuickCreateSave; 1104 QuickCreateParams['callbackFunction'] = callbackFunction; 1105 QuickCreateParams['data'] = customParams; 1106 QuickCreateParams['noCache'] = false; 1107 quickCreateNode.trigger('click', QuickCreateParams); 1108 }); 1109 }, 1110 1111 1112 /** 1113 * Function to register all the events related to summary view widgets 1114 */ 1115 registerSummaryViewContainerEvents : function(summaryViewContainer) { 1116 var thisInstance = this; 1117 this.registerEventForActivityWidget(); 1118 1119 /** 1120 * Function to handle the ajax edit for summary view fields 1121 */ 1122 summaryViewContainer.on('click', '.summaryViewEdit', function(e){ 1123 var currentTarget = jQuery(e.currentTarget); 1124 currentTarget.hide(); 1125 var currentTdElement = currentTarget.closest('td.fieldValue'); 1126 thisInstance.ajaxEditHandling(currentTdElement); 1127 }); 1128 1129 /** 1130 * Function to handle actions after ajax save in summary view 1131 */ 1132 summaryViewContainer.on(thisInstance.fieldUpdatedEvent, '.recordDetails', function(e, params){ 1133 var updatesWidget = summaryViewContainer.find("[data-name='LBL_UPDATES']"); 1134 thisInstance.loadWidget(updatesWidget); 1135 }); 1136 1137 /* 1138 * Register the event to edit the status for for related activities 1139 */ 1140 summaryViewContainer.on('click', '.editStatus', function(e){ 1141 var currentTarget = jQuery(e.currentTarget); 1142 var currentDiv = currentTarget.closest('.activityStatus'); 1143 var editElement = currentDiv.find('.edit'); 1144 var detailViewElement = currentDiv.find('.value'); 1145 1146 currentTarget.hide(); 1147 detailViewElement.addClass('hide'); 1148 editElement.removeClass('hide').show(); 1149 1150 var callbackFunction = function() { 1151 var fieldnameElement = jQuery('.fieldname', editElement); 1152 var fieldName = fieldnameElement.val(); 1153 var fieldElement = jQuery('[name="'+ fieldName +'"]', editElement); 1154 var previousValue = fieldnameElement.data('prevValue'); 1155 var ajaxEditNewValue = fieldElement.find('option:selected').text(); 1156 1157 if(previousValue == ajaxEditNewValue) { 1158 editElement.addClass('hide'); 1159 detailViewElement.removeClass('hide'); 1160 currentTarget.show(); 1161 } else { 1162 var errorExists = fieldElement.validationEngine('validate'); 1163 //If validation fails 1164 if(errorExists) { 1165 Vtiger_Helper_Js.addClickOutSideEvent(currentDiv, callbackFunction); 1166 return; 1167 } 1168 var activityDiv = currentDiv.closest('.activityEntries'); 1169 var activityId = activityDiv.find('.activityId').val(); 1170 var moduleName = activityDiv.find('.activityModule').val(); 1171 var activityType = activityDiv.find('.activityType').val(); 1172 1173 currentDiv.progressIndicator(); 1174 editElement.addClass('hide'); 1175 var params = { 1176 action : 'SaveAjax', 1177 record : activityId, 1178 field : fieldName, 1179 value : ajaxEditNewValue, 1180 module : moduleName, 1181 activitytype : activityType 1182 }; 1183 1184 AppConnector.request(params).then( 1185 function(data) { 1186 currentDiv.progressIndicator({'mode':'hide'}); 1187 detailViewElement.removeClass('hide'); 1188 currentTarget.show(); 1189 detailViewElement.html(ajaxEditNewValue); 1190 fieldnameElement.data('prevValue', ajaxEditNewValue); 1191 } 1192 ); 1193 } 1194 } 1195 1196 //adding clickoutside event on the currentDiv - to save the ajax edit of status values 1197 Vtiger_Helper_Js.addClickOutSideEvent(currentDiv, callbackFunction); 1198 }); 1199 1200 /* 1201 * Register click event for add button in Related widgets 1202 * to add record from widget 1203 */ 1204 1205 jQuery('.changeDetailViewMode').on('click',function(e){ 1206 var currentElement = jQuery(e.currentTarget); 1207 var detailViewTitleContainer = currentElement.closest('.toggleViewByMode'); 1208 var viewModeElement = jQuery('input[name="viewMode"]',detailViewTitleContainer) 1209 var url = viewModeElement.data('fullUrl'); 1210 1211 var element = jQuery('<div></div>'); 1212 element.progressIndicator({ 1213 'position':'html', 1214 'blockInfo': { 1215 'enabled' : true, 1216 'elementToBlock' : summaryViewContainer 1217 } 1218 }); 1219 1220 thisInstance.loadContents(url).then( 1221 function(){ 1222 element.progressIndicator({'mode' : 'hide'}); 1223 thisInstance.deSelectAllrelatedTabs(); 1224 thisInstance.loadWidgets(); 1225 thisInstance.registerEventForPicklistDependencySetup(thisInstance.getForm()); 1226 1227 // Indicate the page content change 1228 app.notifyPostAjaxReady(); 1229 } 1230 ); 1231 }); 1232 1233 /* 1234 * Register click event for add button in Related widgets 1235 * to add record from widget 1236 */ 1237 jQuery('.createRecord').on('click',function(e){ 1238 var currentElement = jQuery(e.currentTarget); 1239 var summaryWidgetContainer = currentElement.closest('.summaryWidgetContainer'); 1240 var widgetHeaderContainer = summaryWidgetContainer.find('.widget_header'); 1241 var referenceModuleName = widgetHeaderContainer.find('[name="relatedModule"]').val(); 1242 var recordId = thisInstance.getRecordId(); 1243 var module = app.getModuleName(); 1244 var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]'); 1245 var fieldName = thisInstance.referenceFieldNames[module]; 1246 1247 var customParams = {}; 1248 customParams[fieldName] = recordId; 1249 1250 if(quickCreateNode.length <= 0) { 1251 Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED')) 1252 } 1253 1254 var postQuickCreateSave = function(data) { 1255 thisInstance.postSummaryWidgetAddRecord(data,currentElement); 1256 } 1257 1258 var goToFullFormcallback = function(data){ 1259 thisInstance.addElementsToQuickCreateForCreatingRelation(data,module,recordId); 1260 } 1261 1262 var QuickCreateParams = {}; 1263 QuickCreateParams['callbackFunction'] = postQuickCreateSave; 1264 QuickCreateParams['goToFullFormcallback'] = goToFullFormcallback; 1265 QuickCreateParams['data'] = customParams; 1266 QuickCreateParams['noCache'] = false; 1267 quickCreateNode.trigger('click', QuickCreateParams); 1268 }); 1269 }, 1270 1271 addRelationBetweenRecords : function(relatedModule, relatedModuleRecordId){ 1272 var aDeferred = jQuery.Deferred(); 1273 var thisInstance = this; 1274 var selectedTabElement = thisInstance.getSelectedTab(); 1275 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModule); 1276 relatedController.addRelations(relatedModuleRecordId).then( 1277 function(data){ 1278 var summaryViewContainer = thisInstance.getContentHolder(); 1279 var updatesWidget = summaryViewContainer.find("[data-name='LBL_UPDATES']"); 1280 thisInstance.loadWidget(updatesWidget); 1281 aDeferred.resolve(data); 1282 }, 1283 1284 function(textStatus, errorThrown){ 1285 aDeferred.reject(textStatus, errorThrown); 1286 } 1287 ) 1288 return aDeferred.promise(); 1289 }, 1290 1291 /** 1292 * Function to handle Post actions after adding record from 1293 * summary view widget 1294 */ 1295 postSummaryWidgetAddRecord : function(data,currentElement){ 1296 var summaryWidgetContainer = currentElement.closest('.summaryWidgetContainer'); 1297 var widgetHeaderContainer = summaryWidgetContainer.find('.widget_header'); 1298 var widgetDataContainer = summaryWidgetContainer.find('.widget_contents'); 1299 var referenceModuleName = widgetHeaderContainer.find('[name="relatedModule"]').val(); 1300 var recordId = this.getRecordId(); 1301 var module = app.getModuleName(); 1302 var idList = new Array(); 1303 idList.push(data.result._recordId); 1304 widgetDataContainer.progressIndicator({}); 1305 this.addRelationBetweenRecords(referenceModuleName,idList).then( 1306 function(data){ 1307 var params = {}; 1308 params['record'] = recordId; 1309 params['view'] = 'Detail'; 1310 params['module'] = module; 1311 params['page'] = widgetDataContainer.find('[name="page"]').val(); 1312 params['limit'] = widgetDataContainer.find('[name="pageLimit"]').val(); 1313 params['relatedModule'] = referenceModuleName; 1314 params['mode'] = 'showRelatedRecords'; 1315 1316 AppConnector.request(params).then( 1317 function(data) { 1318 var documentsWidget = jQuery('#relatedDocuments'); 1319 widgetDataContainer.progressIndicator({'mode' : 'hide'}); 1320 widgetDataContainer.html(data); 1321 app.changeSelectElementView(documentsWidget); 1322 } 1323 ); 1324 } 1325 ) 1326 }, 1327 1328 /** 1329 * Function to register event for emails related record click 1330 */ 1331 registerEventForEmailsRelatedRecord : function(){ 1332 var detailContentsHolder = this.getContentHolder(); 1333 var emailsRelatedContainer = detailContentsHolder.find('[name="emailsRelatedRecord"]'); 1334 var parentId = this.getRecordId(); 1335 var popupInstance = Vtiger_Popup_Js.getInstance(); 1336 detailContentsHolder.on('click','[name="emailsRelatedRecord"]',function(e){ 1337 var element = jQuery(e.currentTarget); 1338 var recordId = element.data('id'); 1339 var params = {}; 1340 params['module'] = "Emails"; 1341 params['view'] = "ComposeEmail"; 1342 params['mode'] = "emailPreview"; 1343 params['record'] = recordId; 1344 params['parentId'] = parentId; 1345 params['relatedLoad'] = true; 1346 popupInstance.show(params); 1347 }) 1348 detailContentsHolder.on('click','[name="emailsEditView"]',function(e){ 1349 e.stopPropagation(); 1350 var module = "Emails"; 1351 Vtiger_Helper_Js.checkServerConfig(module).then(function(data){ 1352 if(data == true){ 1353 var element = jQuery(e.currentTarget); 1354 var closestROw = element.closest('tr'); 1355 var recordId = closestROw.data('id'); 1356 var parentRecord = new Array(); 1357 parentRecord.push(parentId); 1358 var params = {}; 1359 params['module'] = "Emails"; 1360 params['view'] = "ComposeEmail"; 1361 params['mode'] = "emailEdit"; 1362 params['record'] = recordId; 1363 params['selected_ids'] = parentRecord; 1364 params['parentId'] = parentId; 1365 params['relatedLoad'] = true; 1366 popupInstance.show(params); 1367 } else { 1368 Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_EMAIL_SERVER_CONFIGURATION')); 1369 } 1370 }) 1371 }) 1372 }, 1373 1374 /** 1375 * Function to register event for adding email from related list 1376 */ 1377 registerEventForAddingEmailFromRelatedList : function() { 1378 var detailContentsHolder = this.getContentHolder(); 1379 var parentId = this.getRecordId(); 1380 detailContentsHolder.on('click','[name="composeEmail"]',function(e){ 1381 e.stopPropagation(); 1382 var element = jQuery(e.currentTarget); 1383 var parentRecord = new Array(); 1384 var params = {}; 1385 parentRecord.push(parentId); 1386 params['module'] = app.getModuleName(); 1387 params['view'] = "MassActionAjax"; 1388 params['selected_ids'] = parentRecord; 1389 params['mode'] = "showComposeEmailForm"; 1390 params['step'] = "step1"; 1391 params['relatedLoad'] = true; 1392 Vtiger_Index_Js.showComposeEmailPopup(params); 1393 }) 1394 }, 1395 registerEnterClickEventForTagRecord : function() { 1396 jQuery('#tagRecordText').keypress(function(e) { 1397 if(e.which == 13) { 1398 jQuery('#tagRecord').trigger('click'); 1399 } 1400 }); 1401 }, 1402 checkTagExists : function(tagText) { 1403 var tagsArray = tagText.split(' '); 1404 for(var i=0;i<tagsArray.length;i++){ 1405 var tagElement = jQuery('#tagsList').find("[data-tagname='"+tagsArray[i]+"']"); 1406 if(tagElement.length > 0){ 1407 tagsArray.splice(i,1); 1408 i--; 1409 } 1410 } 1411 var tagName = tagsArray.join(' '); 1412 if(tagName == ''){ 1413 return true; 1414 } else { 1415 return tagName; 1416 } 1417 1418 }, 1419 1420 addTagsToList : function(data,tagText) { 1421 var tagsArray = tagText.split(' '); 1422 1423 for(var i=0;i<tagsArray.length;i++){ 1424 var id = data.result[1][tagsArray[i]]; 1425 jQuery('#tagsList').prepend('<div class="tag row-fluid span11 marginLeftZero" data-tagname="'+tagsArray[i]+'" data-tagid="'+id+'"><span class="tagName textOverflowEllipsis span11 cursorPointer"><a>'+tagsArray[i]+'</a></span><span class="pull-right cursorPointer deleteTag">x</span></div>'); 1426 } 1427 1428 }, 1429 1430 checkTagMaxLengthExceeds : function(tagText) { 1431 var tagsArray = tagText.split(' '); 1432 var maxTagLength = jQuery('#maxTagLength').val(); 1433 1434 for(var i=0;i<tagsArray.length;i++){ 1435 if(tagsArray[i].length > parseInt(maxTagLength)) { 1436 return true; 1437 } 1438 } 1439 return false; 1440 }, 1441 1442 registerClickEventForAddingTagRecord : function() { 1443 var thisInstance = this; 1444 jQuery('#tagRecord').on('click',function(){ 1445 var textElement = jQuery('#tagRecordText'); 1446 var tagText = textElement.val(); 1447 if(tagText == ''){ 1448 textElement.validationEngine('showPrompt', app.vtranslate('JS_PLEASE_ENTER_A_TAG') , 'error','bottomLeft',true); 1449 return; 1450 } 1451 var maxLengthExceeds = thisInstance.checkTagMaxLengthExceeds(tagText); 1452 if(maxLengthExceeds == true){ 1453 var maxTagLenth = jQuery('#maxTagLength').val(); 1454 textElement.validationEngine('showPrompt', app.vtranslate('JS_MAX_TAG_LENGTH_EXCEEDS')+' '+maxTagLenth, 'error','bottomLeft',true); 1455 return; 1456 } 1457 var tagExistResult = thisInstance.checkTagExists(tagText); 1458 if(tagExistResult == true){ 1459 textElement.validationEngine('showPrompt', app.vtranslate('JS_TAG_NAME_ALREADY_EXIST') , 'error','bottomLeft',true); 1460 return; 1461 } else { 1462 tagText = tagExistResult; 1463 } 1464 var params = { 1465 module : app.getModuleName(), 1466 action : 'TagCloud', 1467 mode : 'save', 1468 tagname : tagText, 1469 record : thisInstance.getRecordId() 1470 } 1471 AppConnector.request(params).then( 1472 function(data) { 1473 thisInstance.addTagsToList(data,tagText); 1474 textElement.val(''); 1475 } 1476 ); 1477 }); 1478 }, 1479 registerRemovePromptEventForTagCloud : function(data) { 1480 jQuery('#tagRecordText').on('focus',function(e){ 1481 var errorPrompt = jQuery('.formError',data); 1482 if(errorPrompt.length > 0) { 1483 errorPrompt.remove(); 1484 } 1485 }); 1486 }, 1487 1488 registerDeleteEventForTag : function(data) { 1489 var thisInstance = this; 1490 jQuery(data).on('click','.deleteTag',function(e){ 1491 var tag = jQuery(e.currentTarget).closest('.tag'); 1492 var tagId = tag.data('tagid'); 1493 tag.fadeOut('slow', function() { 1494 tag.remove(); 1495 }); 1496 var params = { 1497 module : app.getModuleName(), 1498 action : 'TagCloud', 1499 mode : 'delete', 1500 tag_id : tagId, 1501 record : thisInstance.getRecordId() 1502 } 1503 AppConnector.request(params).then( 1504 function(data) { 1505 }); 1506 }); 1507 }, 1508 registerTagClickEvent : function(data){ 1509 var thisInstance = this; 1510 jQuery(data).on('click','.tagName',function(e) { 1511 var tagElement = jQuery(e.currentTarget); 1512 var tagId = tagElement.closest('.tag').data('tagid'); 1513 var params = { 1514 'module' : app.getModuleName(), 1515 'view' : 'TagCloudSearchAjax', 1516 'tag_id' : tagId, 1517 'tag_name' : tagElement.find('a').text() 1518 } 1519 AppConnector.request(params).then( 1520 function(data) { 1521 var params = { 1522 'data' : data, 1523 'css' : {'min-width' : '40%'} 1524 } 1525 app.showModalWindow(params); 1526 thisInstance.registerChangeEventForModulesList(); 1527 } 1528 ) 1529 }); 1530 }, 1531 1532 registerChangeEventForModulesList : function() { 1533 jQuery('#tagSearchModulesList').on('change',function(e) { 1534 var modulesSelectElement = jQuery(e.currentTarget); 1535 if(modulesSelectElement.val() == 'all'){ 1536 jQuery('[name="tagSearchModuleResults"]').removeClass('hide'); 1537 } else{ 1538 jQuery('[name="tagSearchModuleResults"]').removeClass('hide'); 1539 var selectedOptionValue = modulesSelectElement.val(); 1540 jQuery('[name="tagSearchModuleResults"]').filter(':not(#'+selectedOptionValue+')').addClass('hide'); 1541 } 1542 }); 1543 }, 1544 1545 registerPostTagCloudWidgetLoad : function() { 1546 var thisInstance = this; 1547 app.getContentsContainer().on('Vtiger.Widget.Load.LBL_TAG_CLOUD',function(e,data){ 1548 thisInstance.registerClickEventForAddingTagRecord(); 1549 thisInstance.registerEnterClickEventForTagRecord(); 1550 thisInstance.registerDeleteEventForTag(data); 1551 thisInstance.registerRemovePromptEventForTagCloud(data); 1552 thisInstance.registerTagClickEvent(data); 1553 }); 1554 }, 1555 1556 registerEventForRelatedTabClick : function(){ 1557 var thisInstance = this; 1558 var detailContentsHolder = thisInstance.getContentHolder(); 1559 var detailContainer = detailContentsHolder.closest('div.detailViewInfo'); 1560 app.registerEventForDatePickerFields(detailContentsHolder); 1561 //Attach time picker event to time fields 1562 app.registerEventForTimeFields(detailContentsHolder); 1563 1564 jQuery('.related', detailContainer).on('click', 'li', function(e, urlAttributes){ 1565 var tabElement = jQuery(e.currentTarget); 1566 var element = jQuery('<div></div>'); 1567 element.progressIndicator({ 1568 'position':'html', 1569 'blockInfo' : { 1570 'enabled' : true, 1571 'elementToBlock' : detailContainer 1572 } 1573 }); 1574 var url = tabElement.data('url'); 1575 if(typeof urlAttributes != 'undefined'){ 1576 var callBack = urlAttributes.callback; 1577 delete urlAttributes.callback; 1578 } 1579 thisInstance.loadContents(url,urlAttributes).then( 1580 function(data){ 1581 thisInstance.deSelectAllrelatedTabs(); 1582 thisInstance.markTabAsSelected(tabElement); 1583 Vtiger_Helper_Js.showHorizontalTopScrollBar(); 1584 element.progressIndicator({'mode': 'hide'}); 1585 if(typeof callBack == 'function'){ 1586 callBack(data); 1587 } 1588 //Summary tab is clicked 1589 if(tabElement.data('linkKey') == thisInstance.detailViewSummaryTabLabel) { 1590 thisInstance.loadWidgets(); 1591 thisInstance.registerSummaryViewContainerEvents(detailContentsHolder); 1592 thisInstance.registerEventForPicklistDependencySetup(thisInstance.getForm()); 1593 }else if(tabElement.data('linkKey') == thisInstance.detailViewDetailsTabLabel){ 1594 thisInstance.registerEventForPicklistDependencySetup(thisInstance.getForm()); 1595 } 1596 1597 // Let listeners know about page state change. 1598 app.notifyPostAjaxReady(); 1599 }, 1600 function (){ 1601 //TODO : handle error 1602 element.progressIndicator({'mode': 'hide'}); 1603 } 1604 ); 1605 }); 1606 }, 1607 1608 /** 1609 * Function to register event for setting up picklistdependency 1610 * for a module if exist on change of picklist value 1611 */ 1612 registerEventForPicklistDependencySetup: function(container) { 1613 var thisInstance = this; 1614 var picklistDependcyElemnt = jQuery('[name="picklistDependency"]', container); 1615 if (picklistDependcyElemnt.length <= 0) { 1616 return; 1617 } 1618 var picklistDependencyMapping = JSON.parse(picklistDependcyElemnt.val()); 1619 var sourcePicklists = Object.keys(picklistDependencyMapping); 1620 if (sourcePicklists.length <= 0) { 1621 return; 1622 } 1623 1624 var sourcePickListNames = ""; 1625 for (var i = 0; i < sourcePicklists.length; i++) { 1626 sourcePickListNames += '[name="' + sourcePicklists[i] + '"],'; 1627 } 1628 var sourcePickListElements = container.find(sourcePickListNames); 1629 sourcePickListElements.on('change', function(e) { 1630 var currentElement = jQuery(e.currentTarget); 1631 var sourcePicklistname = currentElement.attr('name'); 1632 1633 var configuredDependencyObject = picklistDependencyMapping[sourcePicklistname]; 1634 var selectedValue = currentElement.val(); 1635 var targetObjectForSelectedSourceValue = configuredDependencyObject[selectedValue]; 1636 var picklistmap = configuredDependencyObject["__DEFAULT__"]; 1637 1638 if (typeof targetObjectForSelectedSourceValue == 'undefined') { 1639 targetObjectForSelectedSourceValue = picklistmap; 1640 } 1641 jQuery.each(picklistmap, function(targetPickListName, targetPickListValues) { 1642 var targetPickListMap = targetObjectForSelectedSourceValue[targetPickListName]; 1643 if (typeof targetPickListMap == "undefined") { 1644 targetPickListMap = targetPickListValues; 1645 } 1646 var targetPickList = jQuery('[name="' + targetPickListName + '"]', container); 1647 if (targetPickList.length <= 0) { 1648 return; 1649 } 1650 1651 //On change of SourceField value, If TargetField value is not there in mapping, make user to select the new target value also. 1652 var selectedValue = targetPickList.data('selectedValue'); 1653 if (jQuery.inArray(selectedValue, targetPickListMap) == -1) { 1654 thisInstance.targetPicklistChange = true; 1655 thisInstance.targetPicklist = targetPickList.closest('td'); 1656 } else { 1657 thisInstance.targetPicklistChange = false; 1658 thisInstance.targetPicklist = false; 1659 } 1660 1661 var listOfAvailableOptions = targetPickList.data('availableOptions'); 1662 if (typeof listOfAvailableOptions == "undefined") { 1663 listOfAvailableOptions = jQuery('option', targetPickList); 1664 targetPickList.data('available-options', listOfAvailableOptions); 1665 } 1666 1667 var targetOptions = new jQuery(); 1668 var optionSelector = []; 1669 optionSelector.push(''); 1670 for (var i = 0; i < targetPickListMap.length; i++) { 1671 optionSelector.push(targetPickListMap[i]); 1672 } 1673 1674 jQuery.each(listOfAvailableOptions, function(i, e) { 1675 var picklistValue = jQuery(e).val(); 1676 if (jQuery.inArray(picklistValue, optionSelector) != -1) { 1677 targetOptions = targetOptions.add(jQuery(e)); 1678 } 1679 }) 1680 var targetPickListSelectedValue = ''; 1681 targetPickListSelectedValue = targetOptions.filter('[selected]').val(); 1682 if (targetPickListMap.length == 1) { 1683 targetPickListSelectedValue = targetPickListMap[0]; // to automatically select picklist if only one picklistmap is present. 1684 } 1685 targetPickList.html(targetOptions).val(targetPickListSelectedValue).trigger("liszt:updated"); 1686 }) 1687 1688 }); 1689 //To Trigger the change on load 1690 sourcePickListElements.trigger('change'); 1691 }, 1692 1693 /** 1694 * Function to get child comments 1695 */ 1696 getChildComments : function(commentId){ 1697 var aDeferred = jQuery.Deferred(); 1698 var url= 'module='+app.getModuleName()+'&view=Detail&record='+this.getRecordId()+'&mode=showChildComments&commentid='+commentId; 1699 var dataObj = this.getCommentThread(url); 1700 dataObj.then(function(data){ 1701 aDeferred.resolve(data); 1702 }); 1703 return aDeferred.promise(); 1704 }, 1705 1706 /** 1707 * Function to show total records count in listview on hover 1708 * of pageNumber text 1709 */ 1710 registerEventForTotalRecordsCount : function(){ 1711 var thisInstance = this; 1712 var detailContentsHolder = this.getContentHolder(); 1713 detailContentsHolder.on('click','.totalNumberOfRecords',function(e){ 1714 var element = jQuery(e.currentTarget); 1715 var totalNumberOfRecords = jQuery('#totalCount').val(); 1716 element.addClass('hide'); 1717 element.parent().progressIndicator({}); 1718 if(totalNumberOfRecords == '') { 1719 var selectedTabElement = thisInstance.getSelectedTab(); 1720 var relatedModuleName = thisInstance.getRelatedModuleName(); 1721 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 1722 relatedController.getRelatedPageCount().then(function(){ 1723 thisInstance.showPagingInfo(); 1724 }); 1725 }else{ 1726 thisInstance.showPagingInfo(); 1727 } 1728 element.parent().progressIndicator({'mode':'hide'}); 1729 }) 1730 }, 1731 1732 registerEventForActivityFollowupClickEvent : function(){ 1733 var thisInstance = this; 1734 var detailContentsHolder = this.getContentHolder(); 1735 detailContentsHolder.on('click','.holdFollowupOn',function(e){ 1736 e.stopPropagation(); 1737 var selectedTabElement = thisInstance.getSelectedTab(); 1738 var relatedModuleName = thisInstance.getRelatedModuleName(); 1739 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 1740 relatedController.addFollowupEvent(e); 1741 }); 1742 }, 1743 1744 registerEventForMarkAsCompletedClick : function(){ 1745 var thisInstance = this; 1746 var detailContentsHolder = this.getContentHolder(); 1747 detailContentsHolder.on('click','.markAsHeld',function(e){ 1748 e.stopPropagation(); 1749 var selectedTabElement = thisInstance.getSelectedTab(); 1750 var relatedModuleName = thisInstance.getRelatedModuleName(); 1751 var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName); 1752 relatedController.markAsCompleted(e); 1753 }); 1754 }, 1755 1756 showPagingInfo : function() { 1757 var totalNumberOfRecords = jQuery('#totalCount').val(); 1758 var pageNumberElement = jQuery('.pageNumbersText'); 1759 var pageRange = pageNumberElement.text(); 1760 var newPagingInfo = pageRange+" "+app.vtranslate('of')+" "+totalNumberOfRecords; 1761 var listViewEntriesCount = parseInt(jQuery('#noOfEntries').val()); 1762 if(listViewEntriesCount != 0){ 1763 jQuery('.pageNumbersText').html(newPagingInfo); 1764 } else { 1765 jQuery('.pageNumbersText').html(""); 1766 } 1767 }, 1768 1769 getCustomFieldNameValueMap : function(fieldNameValueMap){ 1770 return fieldNameValueMap; 1771 }, 1772 1773 registerEvents : function(){ 1774 var thisInstance = this; 1775 //thisInstance.triggerDisplayTypeEvent(); 1776 thisInstance.registerSendSmsSubmitEvent(); 1777 thisInstance.registerAjaxEditEvent(); 1778 this.registerRelatedRowClickEvent(); 1779 this.registerBlockAnimationEvent(); 1780 this.registerBlockStatusCheckOnLoad(); 1781 this.registerEmailFieldClickEvent(); 1782 this.registerPhoneFieldClickEvent(); 1783 this.registerEventForActivityFollowupClickEvent(); 1784 this.registerEventForMarkAsCompletedClick(); 1785 this.registerEventForRelatedList(); 1786 this.registerEventForRelatedListPagination(); 1787 this.registerEventForAddingRelatedRecord(); 1788 this.registerEventForEmailsRelatedRecord(); 1789 this.registerEventForAddingEmailFromRelatedList(); 1790 this.registerPostTagCloudWidgetLoad(); 1791 this.registerEventForRelatedTabClick(); 1792 Vtiger_Helper_Js.showHorizontalTopScrollBar(); 1793 this.registerUrlFieldClickEvent(); 1794 1795 var detailViewContainer = jQuery('div.detailViewContainer'); 1796 if(detailViewContainer.length <= 0) { 1797 // Not detail view page 1798 return; 1799 } 1800 1801 var detailContentsHolder = thisInstance.getContentHolder(); 1802 app.registerEventForDatePickerFields(detailContentsHolder); 1803 //Attach time picker event to time fields 1804 app.registerEventForTimeFields(detailContentsHolder); 1805 1806 //register all the events for summary view container 1807 this.registerSummaryViewContainerEvents(detailContentsHolder); 1808 thisInstance.registerEventForPicklistDependencySetup(thisInstance.getForm()); 1809 1810 detailContentsHolder.on('click', '#detailViewNextRecordButton', function(e){ 1811 var selectedTabElement = thisInstance.getSelectedTab(); 1812 var url = selectedTabElement.data('url'); 1813 var currentPageNum = thisInstance.getRelatedListCurrentPageNum(); 1814 var requestedPage = parseInt(currentPageNum)+1; 1815 var nextPageUrl = url+'&page='+requestedPage; 1816 thisInstance.loadContents(nextPageUrl); 1817 }); 1818 1819 detailContentsHolder.on('click', '#detailViewPreviousRecordButton', function(e){ 1820 var selectedTabElement = thisInstance.getSelectedTab(); 1821 var url = selectedTabElement.data('url'); 1822 var currentPageNum = thisInstance.getRelatedListCurrentPageNum(); 1823 var requestedPage = parseInt(currentPageNum)-1; 1824 var params = {}; 1825 var nextPageUrl = url+'&page='+requestedPage; 1826 thisInstance.loadContents(nextPageUrl); 1827 }); 1828 1829 detailContentsHolder.on('click','table.detailview-table td.fieldValue', function(e) { 1830 var currentTdElement = jQuery(e.currentTarget); 1831 thisInstance.ajaxEditHandling(currentTdElement); 1832 }); 1833 1834 1835 detailContentsHolder.on('click', '.relatedPopup', function(e){ 1836 var editViewObj = new Vtiger_Edit_Js(); 1837 editViewObj.openPopUp(e); 1838 return false; 1839 }); 1840 1841 detailContentsHolder.on('click','.addCommentBtn', function(e){ 1842 thisInstance.removeCommentBlockIfExists(); 1843 var addCommentBlock = thisInstance.getCommentBlock(); 1844 addCommentBlock.appendTo('.commentBlock'); 1845 }); 1846 1847 detailContentsHolder.on('click','.closeCommentBlock', function(e){ 1848 var currentTarget = jQuery(e.currentTarget); 1849 var commentInfoBlock = currentTarget.closest('.singleComment'); 1850 commentInfoBlock.find('.commentActionsContainer').show(); 1851 commentInfoBlock.find('.commentInfoContent').show(); 1852 thisInstance.removeCommentBlockIfExists(); 1853 }); 1854 1855 detailContentsHolder.on('click','.replyComment', function(e){ 1856 thisInstance.removeCommentBlockIfExists(); 1857 var currentTarget = jQuery(e.currentTarget); 1858 var commentInfoBlock = currentTarget.closest('.singleComment'); 1859 var addCommentBlock = thisInstance.getCommentBlock(); 1860 commentInfoBlock.find('.commentActionsContainer').hide(); 1861 addCommentBlock.appendTo(commentInfoBlock).show(); 1862 app.registerEventForTextAreaFields(jQuery('.commentcontent',commentInfoBlock)); 1863 }); 1864 1865 detailContentsHolder.on('click','.editComment', function(e){ 1866 thisInstance.removeCommentBlockIfExists(); 1867 var currentTarget = jQuery(e.currentTarget); 1868 var commentInfoBlock = currentTarget.closest('.singleComment'); 1869 var commentInfoContent = commentInfoBlock.find('.commentInfoContent'); 1870 var commentReason = commentInfoBlock.find('[name="editReason"]'); 1871 var editCommentBlock = thisInstance.getEditCommentBlock(); 1872 editCommentBlock.find('.commentcontent').text(commentInfoContent.text()); 1873 editCommentBlock.find('[name="reasonToEdit"]').val(commentReason.text()); 1874 commentInfoContent.hide(); 1875 commentInfoBlock.find('.commentActionsContainer').hide(); 1876 editCommentBlock.appendTo(commentInfoBlock).show(); 1877 app.registerEventForTextAreaFields(jQuery('.commentcontent',commentInfoBlock)); 1878 }); 1879 1880 detailContentsHolder.on('click','.viewThread', function(e){ 1881 var currentTarget = jQuery(e.currentTarget); 1882 var currentTargetParent = currentTarget.parent(); 1883 var commentActionsBlock = currentTarget.closest('.commentActions'); 1884 var currentCommentBlock = currentTarget.closest('.commentDetails'); 1885 var ulElements = currentCommentBlock.find('ul'); 1886 if(ulElements.length > 0){ 1887 ulElements.show(); 1888 commentActionsBlock.find('.hideThreadBlock').show(); 1889 currentTargetParent.hide(); 1890 return; 1891 } 1892 var commentId = currentTarget.closest('.commentDiv').find('.commentInfoHeader').data('commentid'); 1893 thisInstance.getChildComments(commentId).then(function(data){ 1894 jQuery(data).appendTo(jQuery(e.currentTarget).closest('.commentDetails')); 1895 commentActionsBlock.find('.hideThreadBlock').show(); 1896 currentTargetParent.hide(); 1897 }); 1898 }); 1899 1900 detailContentsHolder.on('click','.hideThread', function(e){ 1901 var currentTarget = jQuery(e.currentTarget); 1902 var currentTargetParent = currentTarget.parent(); 1903 var commentActionsBlock = currentTarget.closest('.commentActions'); 1904 var currentCommentBlock = currentTarget.closest('.commentDetails'); 1905 currentCommentBlock.find('ul').hide(); 1906 currentTargetParent.hide(); 1907 commentActionsBlock.find('.viewThreadBlock').show(); 1908 }); 1909 1910 detailContentsHolder.on('click','.detailViewThread',function(e){ 1911 var recentCommentsTab = thisInstance.getTabByLabel(thisInstance.detailViewRecentCommentsTabLabel); 1912 var commentId = jQuery(e.currentTarget).closest('.singleComment').find('.commentInfoHeader').data('commentid'); 1913 var commentLoad = function(data){ 1914 window.location.href = window.location.href+'#'+commentId; 1915 } 1916 recentCommentsTab.trigger('click',{'commentid':commentId,'callback':commentLoad}); 1917 }); 1918 1919 detailContentsHolder.on('click','.detailViewSaveComment', function(e){ 1920 var element = jQuery(e.currentTarget); 1921 if(!element.is(":disabled")) { 1922 var dataObj = thisInstance.saveComment(e); 1923 dataObj.then(function(){ 1924 var commentsContainer = detailContentsHolder.find("[data-name='ModComments']"); 1925 thisInstance.loadWidget(commentsContainer).then(function() { 1926 element.removeAttr('disabled'); 1927 }); 1928 }); 1929 } 1930 }); 1931 1932 detailContentsHolder.on('click','.saveComment', function(e){ 1933 var element = jQuery(e.currentTarget); 1934 if(!element.is(":disabled")) { 1935 var currentTarget = jQuery(e.currentTarget); 1936 var mode = currentTarget.data('mode'); 1937 var dataObj = thisInstance.saveComment(e); 1938 dataObj.then(function(data){ 1939 var closestAddCommentBlock = currentTarget.closest('.addCommentBlock'); 1940 var commentTextAreaElement = closestAddCommentBlock.find('.commentcontent'); 1941 var commentInfoBlock = currentTarget.closest('.singleComment'); 1942 commentTextAreaElement.val(''); 1943 if(mode == "add"){ 1944 var commentId = data['result']['id']; 1945 var commentHtml = thisInstance.getCommentUI(commentId); 1946 commentHtml.then(function(data){ 1947 var commentBlock = closestAddCommentBlock.closest('.commentDetails'); 1948 var detailContentsHolder = thisInstance.getContentHolder(); 1949 var noCommentsMsgContainer = jQuery('.noCommentsMsgContainer',detailContentsHolder); 1950 noCommentsMsgContainer.remove(); 1951 if(commentBlock.length > 0){ 1952 closestAddCommentBlock.remove(); 1953 var childComments = commentBlock.find('ul'); 1954 if(childComments.length <= 0){ 1955 var currentChildCommentsCount = commentInfoBlock.find('.viewThreadBlock').data('childCommentsCount'); 1956 var newChildCommentCount = currentChildCommentsCount + 1; 1957 commentInfoBlock.find('.childCommentsCount').text(newChildCommentCount); 1958 var parentCommentId = commentInfoBlock.find('.commentInfoHeader').data('commentid'); 1959 thisInstance.getChildComments(parentCommentId).then(function(responsedata){ 1960 jQuery(responsedata).appendTo(commentBlock); 1961 commentInfoBlock.find('.viewThreadBlock').hide(); 1962 commentInfoBlock.find('.hideThreadBlock').show(); 1963 }); 1964 }else { 1965 jQuery('<ul class="liStyleNone"><li class="commentDetails">'+data+'</li></ul>').appendTo(commentBlock); 1966 } 1967 } else { 1968 jQuery('<ul class="liStyleNone"><li class="commentDetails">'+data+'</li></ul>').prependTo(closestAddCommentBlock.closest('.commentContainer').find('.commentsList')); 1969 commentTextAreaElement.css({height : '71px'}); 1970 } 1971 commentInfoBlock.find('.commentActionsContainer').show(); 1972 }); 1973 }else if(mode == "edit"){ 1974 var modifiedTime = commentInfoBlock.find('.commentModifiedTime'); 1975 var commentInfoContent = commentInfoBlock.find('.commentInfoContent'); 1976 var commentEditStatus = commentInfoBlock.find('[name="editStatus"]'); 1977 var commentReason = commentInfoBlock.find('[name="editReason"]'); 1978 commentInfoContent.html(data.result.commentcontent); 1979 commentReason.html(data.result.reasontoedit); 1980 modifiedTime.text(data.result.modifiedtime); 1981 modifiedTime.attr('title',data.result.modifiedtimetitle) 1982 if(commentEditStatus.hasClass('hide')){ 1983 commentEditStatus.removeClass('hide'); 1984 } 1985 if(data.result.reasontoedit != ""){ 1986 commentInfoBlock.find('.editReason').removeClass('hide') 1987 } 1988 commentInfoContent.show(); 1989 commentInfoBlock.find('.commentActionsContainer').show(); 1990 closestAddCommentBlock.remove(); 1991 } 1992 element.removeAttr('disabled'); 1993 }); 1994 } 1995 }); 1996 1997 detailContentsHolder.on('click','.moreRecentComments', function(){ 1998 var recentCommentsTab = thisInstance.getTabByLabel(thisInstance.detailViewRecentCommentsTabLabel); 1999 recentCommentsTab.trigger('click'); 2000 }); 2001 2002 detailContentsHolder.on('click','.moreRecentUpdates', function(){ 2003 var currentPage = jQuery("#updatesCurrentPage").val(); 2004 var recordId = jQuery("#recordId").val(); 2005 var nextPage = parseInt(currentPage) + 1; 2006 var url = "index.php?module=" + app.getModuleName() + "&view=Detail&record=" + recordId + "&mode=showRecentActivities&page=" + nextPage + "&tab_label=LBL_UPDATES"; 2007 AppConnector.request(url).then( 2008 function(data) { 2009 jQuery("#updatesCurrentPage").remove(); 2010 jQuery("#moreLink").remove(); 2011 jQuery('#updates').append(data); 2012 }, 2013 function(error,err){ 2014 2015 } 2016 ); 2017 }); 2018 2019 2020 detailContentsHolder.on('click','.moreRecentDocuments', function(){ 2021 var recentDocumentsTab = thisInstance.getTabByLabel(thisInstance.detailViewRecentDocumentsTabLabel); 2022 recentDocumentsTab.trigger('click'); 2023 }); 2024 2025 detailContentsHolder.on('click','.moreRecentActivities', function(){ 2026 var recentActivitiesTab = thisInstance.getTabByLabel(thisInstance.detailViewRecentActivitiesTabLabel); 2027 recentActivitiesTab.trigger('click'); 2028 }); 2029 2030 thisInstance.getForm().validationEngine(app.validationEngineOptions); 2031 2032 thisInstance.loadWidgets(); 2033 2034 app.registerEventForTextAreaFields(jQuery('.commentcontent')); 2035 this.registerEventForTotalRecordsCount(); 2036 } 2037 });
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:08:37 2014 | Cross-referenced by PHPXref 0.7.1 |