[ 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_RelatedList_Js",{},{ 11 12 selectedRelatedTabElement : false, 13 parentRecordId : false, 14 parentModuleName : false, 15 relatedModulename : false, 16 relatedTabsContainer : false, 17 detailViewContainer : false, 18 relatedContentContainer : false, 19 20 setSelectedTabElement : function(tabElement) { 21 this.selectedRelatedTabElement = tabElement; 22 }, 23 24 getSelectedTabElement : function(){ 25 return this.selectedRelatedTabElement; 26 }, 27 28 getParentId : function(){ 29 return this.parentRecordId; 30 }, 31 32 loadRelatedList : function(params){ 33 var aDeferred = jQuery.Deferred(); 34 var thisInstance = this; 35 if(typeof this.relatedModulename== "undefined" || this.relatedModulename.length <= 0 ) { 36 return; 37 } 38 var progressIndicatorElement = jQuery.progressIndicator({ 39 'position' : 'html', 40 'blockInfo' : { 41 'enabled' : true 42 } 43 }); 44 var completeParams = this.getCompleteParams(); 45 jQuery.extend(completeParams,params); 46 AppConnector.request(completeParams).then( 47 function(responseData){ 48 progressIndicatorElement.progressIndicator({ 49 'mode' : 'hide' 50 }) 51 thisInstance.relatedTabsContainer.find('li').removeClass('active'); 52 thisInstance.selectedRelatedTabElement.addClass('active'); 53 thisInstance.relatedContentContainer.html(responseData); 54 responseData = thisInstance.relatedContentContainer.html(); 55 //thisInstance.triggerDisplayTypeEvent(); 56 Vtiger_Helper_Js.showHorizontalTopScrollBar(); 57 jQuery('.pageNumbers',thisInstance.relatedContentContainer).tooltip(); 58 aDeferred.resolve(responseData); 59 jQuery('input[name="currentPageNum"]', thisInstance.relatedContentContainer).val(completeParams.page); 60 // Let listeners know about page state change. 61 app.notifyPostAjaxReady(); 62 }, 63 64 function(textStatus, errorThrown){ 65 aDeferred.reject(textStatus, errorThrown); 66 } 67 ); 68 return aDeferred.promise(); 69 }, 70 71 triggerDisplayTypeEvent : function() { 72 var widthType = app.cacheGet('widthType', 'narrowWidthType'); 73 if(widthType) { 74 var elements = jQuery('.listViewEntriesTable').find('td,th'); 75 elements.attr('class', widthType); 76 } 77 }, 78 79 showSelectRelationPopup : function(){ 80 var aDeferred = jQuery.Deferred(); 81 var thisInstance = this; 82 var popupInstance = Vtiger_Popup_Js.getInstance(); 83 popupInstance.show(this.getPopupParams(), function(responseString){ 84 var responseData = JSON.parse(responseString); 85 var relatedIdList = Object.keys(responseData); 86 thisInstance.addRelations(relatedIdList).then( 87 function(data){ 88 var relatedCurrentPage = thisInstance.getCurrentPageNum(); 89 var params = {'page':relatedCurrentPage}; 90 thisInstance.loadRelatedList(params).then(function(data){ 91 aDeferred.resolve(data); 92 }); 93 } 94 ); 95 } 96 ); 97 return aDeferred.promise(); 98 }, 99 100 addRelations : function(idList){ 101 var aDeferred = jQuery.Deferred(); 102 var sourceRecordId = this.parentRecordId; 103 var sourceModuleName = this.parentModuleName; 104 var relatedModuleName = this.relatedModulename; 105 106 var params = {}; 107 params['mode'] = "addRelation"; 108 params['module'] = sourceModuleName; 109 params['action'] = 'RelationAjax'; 110 111 params['related_module'] = relatedModuleName; 112 params['src_record'] = sourceRecordId; 113 params['related_record_list'] = JSON.stringify(idList); 114 115 AppConnector.request(params).then( 116 function(responseData){ 117 aDeferred.resolve(responseData); 118 }, 119 120 function(textStatus, errorThrown){ 121 aDeferred.reject(textStatus, errorThrown); 122 } 123 ); 124 return aDeferred.promise(); 125 }, 126 127 getPopupParams : function(){ 128 var parameters = {}; 129 var parameters = { 130 'module' : this.relatedModulename, 131 'src_module' : this.parentModuleName, 132 'src_record' : this.parentRecordId, 133 'multi_select' : true 134 } 135 return parameters; 136 }, 137 138 deleteRelation : function(relatedIdList) { 139 var aDeferred = jQuery.Deferred(); 140 var params = {}; 141 params['mode'] = "deleteRelation"; 142 params['module'] = this.parentModuleName; 143 params['action'] = 'RelationAjax'; 144 145 params['related_module'] = this.relatedModulename; 146 params['src_record'] = this.parentRecordId; 147 params['related_record_list'] = JSON.stringify(relatedIdList); 148 149 AppConnector.request(params).then( 150 function(responseData){ 151 aDeferred.resolve(responseData); 152 }, 153 154 function(textStatus, errorThrown){ 155 aDeferred.reject(textStatus, errorThrown); 156 } 157 ); 158 return aDeferred.promise(); 159 }, 160 161 getCurrentPageNum : function() { 162 return jQuery('input[name="currentPageNum"]',this.relatedContentContainer).val(); 163 }, 164 165 setCurrentPageNumber : function(pageNumber){ 166 jQuery('input[name="currentPageNum"]').val(pageNumber); 167 }, 168 169 /** 170 * Function to get Order by 171 */ 172 getOrderBy : function(){ 173 return jQuery('#orderBy').val(); 174 }, 175 176 /** 177 * Function to get Sort Order 178 */ 179 getSortOrder : function(){ 180 return jQuery("#sortOrder").val(); 181 }, 182 183 getCompleteParams : function(){ 184 var params = {}; 185 params['view'] = "Detail"; 186 params['module'] = this.parentModuleName; 187 params['record'] = this.getParentId(), 188 params['relatedModule'] = this.relatedModulename, 189 params['sortorder'] = this.getSortOrder(), 190 params['orderby'] = this.getOrderBy(), 191 params['page'] = this.getCurrentPageNum(); 192 params['mode'] = "showRelatedList" 193 194 return params; 195 }, 196 197 198 /** 199 * Function to handle Sort 200 */ 201 sortHandler : function(headerElement){ 202 var aDeferred = jQuery.Deferred(); 203 var fieldName = headerElement.data('fieldname'); 204 var sortOrderVal = headerElement.data('nextsortorderval'); 205 var sortingParams = { 206 "orderby" : fieldName, 207 "sortorder" : sortOrderVal, 208 "tab_label" : this.selectedRelatedTabElement.data('label-key') 209 } 210 this.loadRelatedList(sortingParams).then( 211 function(data){ 212 aDeferred.resolve(data); 213 }, 214 215 function(textStatus, errorThrown){ 216 aDeferred.reject(textStatus, errorThrown); 217 } 218 ); 219 return aDeferred.promise(); 220 }, 221 222 /** 223 * Function to handle next page navigation 224 */ 225 nextPageHandler : function(){ 226 var aDeferred = jQuery.Deferred(); 227 var thisInstance = this; 228 var pageLimit = jQuery('#pageLimit').val(); 229 var noOfEntries = jQuery('#noOfEntries').val(); 230 if(noOfEntries == pageLimit){ 231 var pageNumber = this.getCurrentPageNum(); 232 var nextPage = parseInt(pageNumber) + 1; 233 var nextPageParams = { 234 'page' : nextPage 235 } 236 this.loadRelatedList(nextPageParams).then( 237 function(data){ 238 thisInstance.setCurrentPageNumber(nextPage); 239 aDeferred.resolve(data); 240 }, 241 242 function(textStatus, errorThrown){ 243 aDeferred.reject(textStatus, errorThrown); 244 } 245 ); 246 } 247 return aDeferred.promise(); 248 }, 249 250 /** 251 * Function to handle next page navigation 252 */ 253 previousPageHandler : function(){ 254 var aDeferred = jQuery.Deferred(); 255 var thisInstance = this; 256 var aDeferred = jQuery.Deferred(); 257 var pageNumber = this.getCurrentPageNum(); 258 if(pageNumber > 1){ 259 var previousPage = parseInt(pageNumber) - 1; 260 var previousPageParams = { 261 'page' : previousPage 262 } 263 this.loadRelatedList(previousPageParams).then( 264 function(data){ 265 thisInstance.setCurrentPageNumber(previousPage); 266 aDeferred.resolve(data); 267 }, 268 269 function(textStatus, errorThrown){ 270 aDeferred.reject(textStatus, errorThrown); 271 } 272 ); 273 } 274 return aDeferred.promise(); 275 }, 276 277 /** 278 * Function to handle page jump in related list 279 */ 280 pageJumpHandler : function(e){ 281 var aDeferred = jQuery.Deferred(); 282 var thisInstance = this; 283 if(e.which == 13){ 284 var element = jQuery(e.currentTarget); 285 var response = Vtiger_WholeNumberGreaterThanZero_Validator_Js.invokeValidation(element); 286 if(typeof response != "undefined"){ 287 element.validationEngine('showPrompt',response,'',"topLeft",true); 288 e.preventDefault(); 289 } else { 290 element.validationEngine('hideAll'); 291 var jumpToPage = parseInt(element.val()); 292 var totalPages = parseInt(jQuery('#totalPageCount').text()); 293 if(jumpToPage > totalPages){ 294 var error = app.vtranslate('JS_PAGE_NOT_EXIST'); 295 element.validationEngine('showPrompt',error,'',"topLeft",true); 296 } 297 var invalidFields = element.parent().find('.formError'); 298 if(invalidFields.length < 1){ 299 var currentPage = jQuery('input[name="currentPageNum"]').val(); 300 if(jumpToPage == currentPage){ 301 var message = app.vtranslate('JS_YOU_ARE_IN_PAGE_NUMBER')+" "+jumpToPage; 302 var params = { 303 text: message, 304 type: 'info' 305 }; 306 Vtiger_Helper_Js.showMessage(params); 307 e.preventDefault(); 308 return false; 309 } 310 var jumptoPageParams = { 311 'page' : jumpToPage 312 } 313 this.loadRelatedList(jumptoPageParams).then( 314 function(data){ 315 thisInstance.setCurrentPageNumber(jumpToPage); 316 aDeferred.resolve(data); 317 }, 318 319 function(textStatus, errorThrown){ 320 aDeferred.reject(textStatus, errorThrown); 321 } 322 ); 323 } else { 324 e.preventDefault(); 325 } 326 } 327 } 328 return aDeferred.promise(); 329 }, 330 /** 331 * Function to add related record for the module 332 */ 333 addRelatedRecord : function(element , callback){ 334 var aDeferred = jQuery.Deferred(); 335 var thisInstance = this; 336 var referenceModuleName = this.relatedModulename; 337 var parentId = this.getParentId(); 338 var parentModule = this.parentModuleName; 339 var quickCreateParams = {}; 340 var relatedParams = {}; 341 var relatedField = element.data('name'); 342 var fullFormUrl = element.data('url'); 343 relatedParams[relatedField] = parentId; 344 var eliminatedKeys = new Array('view', 'module', 'mode', 'action'); 345 346 var preQuickCreateSave = function(data){ 347 348 var index,queryParam,queryParamComponents; 349 350 //To handle switch to task tab when click on add task from related list of activities 351 //As this is leading to events tab intially even clicked on add task 352 if(typeof fullFormUrl != 'undefined' && fullFormUrl.indexOf('?')!== -1) { 353 var urlSplit = fullFormUrl.split('?'); 354 var queryString = urlSplit[1]; 355 var queryParameters = queryString.split('&'); 356 for(index=0; index<queryParameters.length; index++) { 357 queryParam = queryParameters[index]; 358 queryParamComponents = queryParam.split('='); 359 if(queryParamComponents[0] == 'mode' && queryParamComponents[1] == 'Calendar'){ 360 data.find('a[data-tab-name="Task"]').trigger('click'); 361 } 362 } 363 } 364 jQuery('<input type="hidden" name="sourceModule" value="'+parentModule+'" />').appendTo(data); 365 jQuery('<input type="hidden" name="sourceRecord" value="'+parentId+'" />').appendTo(data); 366 jQuery('<input type="hidden" name="relationOperation" value="true" />').appendTo(data); 367 368 if(typeof relatedField != "undefined"){ 369 var field = data.find('[name="'+relatedField+'"]'); 370 //If their is no element with the relatedField name,we are adding hidden element with 371 //name as relatedField name,for saving of record with relation to parent record 372 if(field.length == 0){ 373 jQuery('<input type="hidden" name="'+relatedField+'" value="'+parentId+'" />').appendTo(data); 374 } 375 } 376 for(index=0; index<queryParameters.length; index++) { 377 queryParam = queryParameters[index]; 378 queryParamComponents = queryParam.split('='); 379 if(jQuery.inArray(queryParamComponents[0], eliminatedKeys) == '-1' && data.find('[name="'+queryParamComponents[0]+'"]').length == 0) { 380 jQuery('<input type="hidden" name="'+queryParamComponents[0]+'" value="'+queryParamComponents[1]+'" />').appendTo(data); 381 } 382 } 383 if(typeof callback !== 'undefined') { 384 callback(); 385 } 386 } 387 var postQuickCreateSave = function(data) { 388 thisInstance.loadRelatedList().then( 389 function(data){ 390 aDeferred.resolve(data); 391 }) 392 } 393 394 //If url contains params then seperate them and make them as relatedParams 395 if(typeof fullFormUrl != 'undefined' && fullFormUrl.indexOf('?')!== -1) { 396 var urlSplit = fullFormUrl.split('?'); 397 var queryString = urlSplit[1]; 398 var queryParameters = queryString.split('&'); 399 for(var index=0; index<queryParameters.length; index++) { 400 var queryParam = queryParameters[index]; 401 var queryParamComponents = queryParam.split('='); 402 if(jQuery.inArray(queryParamComponents[0], eliminatedKeys) == '-1') { 403 relatedParams[queryParamComponents[0]] = queryParamComponents[1]; 404 } 405 } 406 } 407 408 quickCreateParams['data'] = relatedParams; 409 quickCreateParams['callbackFunction'] = postQuickCreateSave; 410 quickCreateParams['callbackPostShown'] = preQuickCreateSave; 411 quickCreateParams['noCache'] = true; 412 var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]'); 413 if(quickCreateNode.length <= 0) { 414 Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED')) 415 } 416 quickCreateNode.trigger('click',quickCreateParams); 417 return aDeferred.promise(); 418 }, 419 420 getRelatedPageCount : function(){ 421 var aDeferred = jQuery.Deferred(); 422 var params = {}; 423 params['action'] = "RelationAjax"; 424 params['module'] = this.parentModuleName; 425 params['record'] = this.getParentId(), 426 params['relatedModule'] = this.relatedModulename, 427 params['tab_label'] = this.selectedRelatedTabElement.data('label-key'); 428 params['mode'] = "getRelatedListPageCount" 429 430 var element = jQuery('#totalPageCount'); 431 var totalCountElem = jQuery('#totalCount'); 432 var totalPageNumber = element.text(); 433 if(totalPageNumber == ""){ 434 element.progressIndicator({}); 435 AppConnector.request(params).then( 436 function(data) { 437 var pageCount = data['result']['page']; 438 var numberOfRecords = data['result']['numberOfRecords']; 439 totalCountElem.val(numberOfRecords); 440 element.text(pageCount); 441 element.progressIndicator({'mode': 'hide'}); 442 aDeferred.resolve(); 443 }, 444 function(error,err){ 445 446 } 447 ); 448 }else{ 449 aDeferred.resolve(); 450 } 451 return aDeferred.promise(); 452 }, 453 454 addFollowupEvent : function(e){ 455 var elem = jQuery(e.currentTarget); 456 var recordId = elem.closest('tr').data('id'); 457 458 var url = 'index.php?module=Calendar&view=QuickCreateFollowupAjax&record='+recordId; 459 var progressIndicatorInstance = jQuery.progressIndicator({}); 460 AppConnector.request(url).then( 461 function(data){ 462 if(data){ 463 progressIndicatorInstance.hide(); 464 app.showModalWindow(data, function(data){ 465 var createFollowupForm = data.find('form.followupCreateView'); 466 createFollowupForm.validationEngine(app.validationEngineOptions); 467 app.registerEventForTimeFields(createFollowupForm); 468 //Form submit 469 createFollowupForm.submit(function(event){ 470 var createButton = jQuery(this).find('button.btn-success'); 471 createButton.attr('disabled','disabled'); 472 progressIndicatorInstance = jQuery.progressIndicator({}); 473 event.preventDefault(); 474 var result = createFollowupForm.validationEngine('validate'); 475 if(!result){ 476 createButton.removeAttr('disabled'); 477 progressIndicatorInstance.hide(); 478 return false; 479 } 480 var moduleName = jQuery(this).find("[name='module']").val(); 481 var recordId = jQuery(this).find("[name='record']").val(); 482 var followupStartDate = jQuery(this).find("[name='followup_date_start']").val(); 483 var followupStartTime = jQuery(this).find("[name='followup_time_start']").val(); 484 var action = jQuery(this).find("[name='action']").val(); 485 var mode = jQuery(this).find("[name='mode']").val(); 486 var defaultCallDuration = jQuery(this).find("[name='defaultCallDuration']").val(); 487 var defaultOtherEventDuration = jQuery(this).find("[name='defaultOtherEventDuration']").val(); 488 var params = { 489 module : moduleName, 490 action : action, 491 mode : mode, 492 record : recordId, 493 followup_date_start : followupStartDate, 494 followup_time_start : followupStartTime, 495 defaultCallDuration : defaultCallDuration, 496 defaultOtherEventDuration : defaultOtherEventDuration 497 } 498 AppConnector.request(params).then(function(data){ 499 app.hideModalWindow(); 500 progressIndicatorInstance.hide(); 501 if(data['result'].created){ 502 //Update related listview and pagination 503 Vtiger_Detail_Js.reloadRelatedList(); 504 } 505 }); 506 }); 507 }); 508 } 509 else{ 510 progressIndicatorInstance.hide(); 511 Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_EDIT_PERMISSION',"Calendar")); 512 } 513 }); 514 }, 515 516 markAsCompleted : function(e){ 517 var elem = jQuery(e.currentTarget); 518 var recordId = elem.closest('tr').data('id'); 519 var message = app.vtranslate('JS_CONFIRM_MARK_AS_HELD'); 520 Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then( 521 function(e) { 522 var params = { 523 module : "Calendar", 524 action : "SaveFollowupAjax", 525 mode : "markAsHeldCompleted", 526 record : recordId 527 } 528 AppConnector.request(params).then(function(data){ 529 if(data['error']){ 530 var param = {text:app.vtranslate('JS_PERMISSION_DENIED')}; 531 Vtiger_Helper_Js.showPnotify(param); 532 } 533 else if(data['result'].valid && data['result'].markedascompleted){ 534 //Update related listview and pagination 535 Vtiger_Detail_Js.reloadRelatedList(); 536 if(data['result'].activitytype == 'Task') 537 var param = {text:app.vtranslate('JS_TODO_MARKED_AS_COMPLETED')}; 538 else 539 var param = {text:app.vtranslate('JS_EVENT_MARKED_AS_HELD')}; 540 Vtiger_Helper_Js.showMessage(param); 541 } 542 else{ 543 var param = {text:app.vtranslate('JS_FUTURE_EVENT_CANNOT_BE_MARKED_AS_HELD')}; 544 Vtiger_Helper_Js.showPnotify(param); 545 } 546 }); 547 }, 548 function(error, err){ 549 return false; 550 }); 551 }, 552 553 init : function(parentId, parentModule, selectedRelatedTabElement, relatedModuleName){ 554 this.selectedRelatedTabElement = selectedRelatedTabElement, 555 this.parentRecordId = parentId; 556 this.parentModuleName = parentModule; 557 this.relatedModulename = relatedModuleName; 558 this.relatedTabsContainer = selectedRelatedTabElement.closest('div.related'); 559 this.detailViewContainer = this.relatedTabsContainer.closest('div.detailViewContainer'); 560 this.relatedContentContainer = jQuery('div.contents',this.detailViewContainer); 561 Vtiger_Helper_Js.showHorizontalTopScrollBar(); 562 } 563 })
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 |