[ 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_List_Js",{ 11 12 listInstance : false, 13 14 getRelatedModulesContainer : false, 15 16 massEditPreSave : 'Vtiger.MassEdit.PreSave', 17 18 getInstance: function(){ 19 if(Vtiger_List_Js.listInstance == false){ 20 var module = app.getModuleName(); 21 var parentModule = app.getParentModuleName(); 22 if(parentModule == 'Settings'){ 23 var moduleClassName = parentModule+"_"+module+"_List_Js"; 24 if(typeof window[moduleClassName] == 'undefined'){ 25 moduleClassName = module+"_List_Js"; 26 } 27 var fallbackClassName = parentModule+"_Vtiger_List_Js"; 28 if(typeof window[fallbackClassName] == 'undefined') { 29 fallbackClassName = "Vtiger_List_Js"; 30 } 31 } else { 32 moduleClassName = module+"_List_Js"; 33 fallbackClassName = "Vtiger_List_Js"; 34 } 35 if(typeof window[moduleClassName] != 'undefined'){ 36 var instance = new window[moduleClassName](); 37 }else{ 38 var instance = new window[fallbackClassName](); 39 } 40 Vtiger_List_Js.listInstance = instance; 41 return instance; 42 } 43 return Vtiger_List_Js.listInstance; 44 }, 45 /* 46 * function to trigger send Email 47 * @params: send email url , module name. 48 */ 49 triggerSendEmail : function(massActionUrl, module, params){ 50 var listInstance = Vtiger_List_Js.getInstance(); 51 var validationResult = listInstance.checkListRecordSelected(); 52 if(validationResult != true){ 53 var selectedIds = listInstance.readSelectedIds(true); 54 var excludedIds = listInstance.readExcludedIds(true); 55 var cvId = listInstance.getCurrentCvId(); 56 var postData = listInstance.getDefaultParams(); 57 58 delete postData.module; 59 delete postData.view; 60 delete postData.parent; 61 postData.selected_ids = selectedIds; 62 postData.excluded_ids = excludedIds; 63 postData.viewname = cvId; 64 if(params){ 65 jQuery.extend(postData,params); 66 } 67 var actionParams = { 68 "type":"POST", 69 "url":massActionUrl, 70 "dataType":"html", 71 "data" : postData 72 }; 73 74 Vtiger_Index_Js.showComposeEmailPopup(actionParams); 75 } else { 76 listInstance.noRecordSelectedAlert(); 77 } 78 79 }, 80 /* 81 * function to trigger Send Sms 82 * @params: send email url , module name. 83 */ 84 triggerSendSms : function(massActionUrl, module){ 85 var listInstance = Vtiger_List_Js.getInstance(); 86 var validationResult = listInstance.checkListRecordSelected(); 87 if(validationResult != true){ 88 var progressIndicatorElement = jQuery.progressIndicator(); 89 Vtiger_Helper_Js.checkServerConfig(module).then(function(data){ 90 progressIndicatorElement.progressIndicator({'mode' : 'hide'}); 91 if(data == true){ 92 Vtiger_List_Js.triggerMassAction(massActionUrl); 93 } else { 94 alert(app.vtranslate('JS_SMS_SERVER_CONFIGURATION')); 95 } 96 }); 97 } else { 98 listInstance.noRecordSelectedAlert(); 99 } 100 101 }, 102 103 triggerTransferOwnership : function(massActionUrl){ 104 var thisInstance = this; 105 var listInstance = Vtiger_List_Js.getInstance(); 106 var validationResult = listInstance.checkListRecordSelected(); 107 if(validationResult != true){ 108 var progressIndicatorElement = jQuery.progressIndicator(); 109 thisInstance.getRelatedModulesContainer = false; 110 var actionParams = { 111 "type":"POST", 112 "url":massActionUrl, 113 "dataType":"html", 114 "data" : {} 115 }; 116 AppConnector.request(actionParams).then( 117 function(data) { 118 progressIndicatorElement.progressIndicator({'mode' : 'hide'}); 119 if(data) { 120 var callback = function(data) { 121 var params = app.validationEngineOptions; 122 params.onValidationComplete = function(form, valid){ 123 if(valid){ 124 thisInstance.transferOwnershipSave(form) 125 } 126 return false; 127 } 128 jQuery('#changeOwner').validationEngine(app.validationEngineOptions); 129 } 130 app.showModalWindow(data, function(data){ 131 var selectElement = thisInstance.getRelatedModuleContainer(); 132 app.changeSelectElementView(selectElement, 'select2'); 133 if(typeof callback == 'function'){ 134 callback(data); 135 } 136 }); 137 } 138 } 139 ); 140 } else { 141 listInstance.noRecordSelectedAlert(); 142 } 143 }, 144 145 transferOwnershipSave : function (form){ 146 var listInstance = Vtiger_List_Js.getInstance(); 147 var selectedIds = listInstance.readSelectedIds(true); 148 var excludedIds = listInstance.readExcludedIds(true); 149 var cvId = listInstance.getCurrentCvId(); 150 var transferOwner = jQuery('#transferOwnerId').val(); 151 var relatedModules = jQuery('#related_modules').val(); 152 153 var params = { 154 'module': app.getModuleName(), 155 'action' : 'TransferOwnership', 156 "viewname" : cvId, 157 "selected_ids":selectedIds, 158 "excluded_ids" : excludedIds, 159 'transferOwnerId' : transferOwner, 160 'related_modules' : relatedModules 161 } 162 AppConnector.request(params).then( 163 function(data) { 164 if(data.success){ 165 app.hideModalWindow(); 166 var params = { 167 title : app.vtranslate('JS_MESSAGE'), 168 text: app.vtranslate('JS_RECORDS_TRANSFERRED_SUCCESSFULLY'), 169 animation: 'show', 170 type: 'info' 171 }; 172 Vtiger_Helper_Js.showPnotify(params); 173 listInstance.getListViewRecords(); 174 Vtiger_List_Js.clearList(); 175 } 176 } 177 ); 178 }, 179 180 /* 181 * Function to get the related module container 182 */ 183 getRelatedModuleContainer : function(){ 184 if(this.getRelatedModulesContainer == false){ 185 this.getRelatedModulesContainer = jQuery('#related_modules'); 186 } 187 return this.getRelatedModulesContainer; 188 }, 189 190 massDeleteRecords : function(url,instance) { 191 var listInstance = Vtiger_List_Js.getInstance(); 192 if(typeof instance != "undefined"){ 193 listInstance = instance; 194 } 195 var validationResult = listInstance.checkListRecordSelected(); 196 if(validationResult != true){ 197 // Compute selected ids, excluded ids values, along with cvid value and pass as url parameters 198 var selectedIds = listInstance.readSelectedIds(true); 199 var excludedIds = listInstance.readExcludedIds(true); 200 var cvId = listInstance.getCurrentCvId(); 201 var message = app.vtranslate('LBL_MASS_DELETE_CONFIRMATION'); 202 Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then( 203 function(e) { 204 205 var deleteURL = url+'&viewname='+cvId+'&selected_ids='+selectedIds+'&excluded_ids='+excludedIds; 206 var listViewInstance = Vtiger_List_Js.getInstance(); 207 var searchValue = listViewInstance.getAlphabetSearchValue(); 208 209 if((typeof searchValue != "undefined") && (searchValue.length > 0)) { 210 deleteURL += '&search_key='+listViewInstance.getAlphabetSearchField(); 211 deleteURL += '&search_value='+searchValue; 212 deleteURL += '&operator=s'; 213 } 214 deleteURL += "&search_params="+JSON.stringify(listViewInstance.getListSearchParams()); 215 var deleteMessage = app.vtranslate('JS_RECORDS_ARE_GETTING_DELETED'); 216 var progressIndicatorElement = jQuery.progressIndicator({ 217 'message' : deleteMessage, 218 'position' : 'html', 219 'blockInfo' : { 220 'enabled' : true 221 } 222 }); 223 AppConnector.request(deleteURL).then( 224 function(data){ 225 progressIndicatorElement.progressIndicator({ 226 'mode' : 'hide' 227 }); 228 listInstance.postMassDeleteRecords(); 229 if(data.error){ 230 var params = { 231 text : app.vtranslate(data.error.message), 232 title : app.vtranslate('JS_LBL_PERMISSION') 233 } 234 Vtiger_Helper_Js.showPnotify(params); 235 } 236 } 237 ); 238 }, 239 function(error, err){ 240 Vtiger_List_Js.clearList(); 241 }) 242 } else { 243 listInstance.noRecordSelectedAlert(); 244 } 245 }, 246 247 248 249 deleteRecord : function(recordId) { 250 var listInstance = Vtiger_List_Js.getInstance(); 251 var message = app.vtranslate('LBL_DELETE_CONFIRMATION'); 252 Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then( 253 function(e) { 254 var module = app.getModuleName(); 255 var postData = { 256 "module": module, 257 "action": "DeleteAjax", 258 "record": recordId, 259 "parent": app.getParentModuleName() 260 } 261 var deleteMessage = app.vtranslate('JS_RECORD_GETTING_DELETED'); 262 var progressIndicatorElement = jQuery.progressIndicator({ 263 'message' : deleteMessage, 264 'position' : 'html', 265 'blockInfo' : { 266 'enabled' : true 267 } 268 }); 269 AppConnector.request(postData).then( 270 function(data){ 271 progressIndicatorElement.progressIndicator({ 272 'mode' : 'hide' 273 }) 274 if(data.success) { 275 var orderBy = jQuery('#orderBy').val(); 276 var sortOrder = jQuery("#sortOrder").val(); 277 var urlParams = { 278 "viewname": data.result.viewname, 279 "orderby": orderBy, 280 "sortorder": sortOrder 281 } 282 jQuery('#recordsCount').val(''); 283 jQuery('#totalPageCount').text(''); 284 listInstance.getListViewRecords(urlParams).then(function(){ 285 listInstance.updatePagination(); 286 }); 287 } else { 288 var params = { 289 text : app.vtranslate(data.error.message), 290 title : app.vtranslate('JS_LBL_PERMISSION') 291 } 292 Vtiger_Helper_Js.showPnotify(params); 293 } 294 }, 295 function(error,err){ 296 297 } 298 ); 299 }, 300 function(error, err){ 301 } 302 ); 303 }, 304 305 306 triggerMassAction : function(massActionUrl,callBackFunction,beforeShowCb, css) { 307 308 //TODO : Make the paramters as an object 309 if(typeof beforeShowCb == 'undefined') { 310 beforeShowCb = function(){return true;}; 311 } 312 313 if(typeof beforeShowCb == 'object') { 314 css = beforeShowCb; 315 beforeShowCb = function(){return true;}; 316 } 317 318 var listInstance = Vtiger_List_Js.getInstance(); 319 var validationResult = listInstance.checkListRecordSelected(); 320 if(validationResult != true){ 321 var progressIndicatorElement = jQuery.progressIndicator(); 322 // Compute selected ids, excluded ids values, along with cvid value and pass as url parameters 323 var selectedIds = listInstance.readSelectedIds(true); 324 var excludedIds = listInstance.readExcludedIds(true); 325 var cvId = listInstance.getCurrentCvId(); 326 var postData = { 327 "viewname" : cvId, 328 "selected_ids":selectedIds, 329 "excluded_ids" : excludedIds 330 }; 331 332 var listViewInstance = Vtiger_List_Js.getInstance(); 333 var searchValue = listViewInstance.getAlphabetSearchValue(); 334 335 if((typeof searchValue != "undefined") && (searchValue.length > 0)) { 336 postData['search_key'] = listViewInstance.getAlphabetSearchField(); 337 postData['search_value'] = searchValue; 338 postData['operator'] = "s"; 339 } 340 341 postData.search_params = JSON.stringify(listInstance.getListSearchParams()); 342 343 var actionParams = { 344 "type":"POST", 345 "url":massActionUrl, 346 "dataType":"html", 347 "data" : postData 348 }; 349 350 if(typeof css == 'undefined'){ 351 css = {}; 352 } 353 var css = jQuery.extend({'text-align' : 'left'},css); 354 355 AppConnector.request(actionParams).then( 356 function(data) { 357 progressIndicatorElement.progressIndicator({'mode' : 'hide'}); 358 if(data) { 359 var result = beforeShowCb(data); 360 if(!result) { 361 return; 362 } 363 app.showModalWindow(data,function(data){ 364 if(typeof callBackFunction == 'function'){ 365 callBackFunction(data); 366 //listInstance.triggerDisplayTypeEvent(); 367 } 368 },css) 369 370 } 371 }, 372 function(error,err){ 373 progressIndicatorElement.progressIndicator({'mode' : 'hide'}); 374 } 375 ); 376 } else { 377 listInstance.noRecordSelectedAlert(); 378 } 379 380 }, 381 382 triggerMassEdit : function(massEditUrl) { 383 var selectedCount = this.getSelectedRecordCount(); 384 if(selectedCount > 500) { 385 var params = { 386 title : app.vtranslate('JS_MESSAGE'), 387 text: app.vtranslate('JS_MASS_EDIT_LIMIT'), 388 animation: 'show', 389 type: 'error' 390 }; 391 Vtiger_Helper_Js.showPnotify(params); 392 return; 393 } 394 Vtiger_List_Js.triggerMassAction(massEditUrl, function(container){ 395 var massEditForm = container.find('#massEdit'); 396 massEditForm.validationEngine(app.validationEngineOptions); 397 var listInstance = Vtiger_List_Js.getInstance(); 398 listInstance.inactiveFieldValidation(massEditForm); 399 listInstance.registerReferenceFieldsForValidation(massEditForm); 400 listInstance.registerFieldsForValidation(massEditForm); 401 listInstance.registerEventForTabClick(massEditForm); 402 listInstance.registerRecordAccessCheckEvent(massEditForm); 403 var editInstance = Vtiger_Edit_Js.getInstance(); 404 editInstance.registerBasicEvents(massEditForm); 405 //To remove the change happended for select elements due to picklist dependency 406 container.find('select').trigger('change',{'forceDeSelect':true}); 407 listInstance.postMassEdit(container); 408 409 listInstance.registerSlimScrollMassEdit(); 410 },{'width':'65%'}); 411 }, 412 413 getSelectedRecordCount : function() { 414 var count; 415 var listInstance = Vtiger_List_Js.getInstance(); 416 var cvId = listInstance.getCurrentCvId(); 417 var selectedIdObj = jQuery('#selectedIds').data(cvId+'Selectedids'); 418 if(selectedIdObj != undefined){ 419 if(selectedIdObj != 'all') { 420 count = selectedIdObj.length; 421 } else { 422 var excludedIdsCount = jQuery('#excludedIds').data(cvId+'Excludedids').length; 423 var totalRecords = jQuery('#recordsCount').val(); 424 count = totalRecords - excludedIdsCount; 425 } 426 } 427 return count; 428 }, 429 430 /* 431 * function to trigger export action 432 * returns UI 433 */ 434 triggerExportAction :function(exportActionUrl){ 435 var listInstance = Vtiger_List_Js.getInstance(); 436 // Compute selected ids, excluded ids values, along with cvid value and pass as url parameters 437 var selectedIds = listInstance.readSelectedIds(true); 438 var excludedIds = listInstance.readExcludedIds(true); 439 var cvId = listInstance.getCurrentCvId(); 440 var pageNumber = jQuery('#pageNumber').val(); 441 442 exportActionUrl += '&selected_ids='+selectedIds+'&excluded_ids='+excludedIds+'&viewname='+cvId+'&page='+pageNumber; 443 444 var listViewInstance = Vtiger_List_Js.getInstance(); 445 var searchValue = listViewInstance.getAlphabetSearchValue(); 446 447 if((typeof searchValue != "undefined") && (searchValue.length > 0)) { 448 exportActionUrl += '&search_key='+listViewInstance.getAlphabetSearchField()+'&search_value='+searchValue+'&operator=s'; 449 } 450 exportActionUrl += '&search_params='+JSON.stringify(listInstance.getListSearchParams()); 451 window.location.href = exportActionUrl; 452 }, 453 454 /** 455 * Function to reload list 456 */ 457 clearList : function() { 458 jQuery('#deSelectAllMsg').trigger('click'); 459 jQuery("#selectAllMsgDiv").hide(); 460 }, 461 462 showDuplicateSearchForm : function(url) { 463 var progressIndicatorElement = jQuery.progressIndicator(); 464 app.showModalWindow("", url, function() { 465 progressIndicatorElement.progressIndicator({'mode' : 'hide'}); 466 Vtiger_List_Js.registerDuplicateSearchButtonEvent(); 467 }); 468 }, 469 470 /** 471 * Function that will enable Duplicate Search Find button 472 */ 473 registerDuplicateSearchButtonEvent : function() { 474 jQuery('#fieldList').on('change', function(e) { 475 var value = jQuery(e.currentTarget).val(); 476 var button = jQuery('#findDuplicate').find('button[type="submit"]'); 477 if(value != null) { 478 button.attr('disabled', false); 479 } else { 480 button.attr('disabled', true); 481 } 482 }) 483 } 484 },{ 485 486 //contains the List View element. 487 listViewContainer : false, 488 489 //Contains list view top menu element 490 listViewTopMenuContainer : false, 491 492 //Contains list view content element 493 listViewContentContainer : false, 494 495 //Contains filter Block Element 496 filterBlock : false, 497 498 filterSelectElement : false, 499 500 501 getListViewContainer : function() { 502 if(this.listViewContainer == false){ 503 this.listViewContainer = jQuery('div.listViewPageDiv'); 504 } 505 return this.listViewContainer; 506 }, 507 508 getListViewTopMenuContainer : function(){ 509 if(this.listViewTopMenuContainer == false){ 510 this.listViewTopMenuContainer = jQuery('.listViewTopMenuDiv'); 511 } 512 return this.listViewTopMenuContainer; 513 }, 514 515 getListViewContentContainer : function(){ 516 if(this.listViewContentContainer == false){ 517 this.listViewContentContainer = jQuery('.listViewContentDiv'); 518 } 519 return this.listViewContentContainer; 520 }, 521 522 getFilterBlock : function(){ 523 if(this.filterBlock == false){ 524 var filterSelectElement = this.getFilterSelectElement(); 525 if(filterSelectElement.length <= 0) { 526 this.filterBlock = jQuery(); 527 }else if(filterSelectElement.is('select')){ 528 this.filterBlock = filterSelectElement.data('select2').dropdown; 529 } 530 } 531 return this.filterBlock; 532 }, 533 534 getFilterSelectElement : function() { 535 536 if(this.filterSelectElement == false) { 537 this.filterSelectElement = jQuery('#customFilter'); 538 } 539 return this.filterSelectElement; 540 }, 541 542 543 getDefaultParams : function() { 544 var pageNumber = jQuery('#pageNumber').val(); 545 var module = app.getModuleName(); 546 var parent = app.getParentModuleName(); 547 var cvId = this.getCurrentCvId(); 548 var orderBy = jQuery('#orderBy').val(); 549 var sortOrder = jQuery("#sortOrder").val(); 550 var params = { 551 'module': module, 552 'parent' : parent, 553 'page' : pageNumber, 554 'view' : "List", 555 'viewname' : cvId, 556 'orderby' : orderBy, 557 'sortorder' : sortOrder 558 } 559 560 var searchValue = this.getAlphabetSearchValue(); 561 562 if((typeof searchValue != "undefined") && (searchValue.length > 0)) { 563 params['search_key'] = this.getAlphabetSearchField(); 564 params['search_value'] = searchValue; 565 params['operator'] = "s"; 566 } 567 params.search_params = JSON.stringify(this.getListSearchParams()); 568 return params; 569 }, 570 571 /* 572 * Function which will give you all the list view params 573 */ 574 getListViewRecords : function(urlParams) { 575 var aDeferred = jQuery.Deferred(); 576 if(typeof urlParams == 'undefined') { 577 urlParams = {}; 578 } 579 580 var thisInstance = this; 581 var loadingMessage = jQuery('.listViewLoadingMsg').text(); 582 var progressIndicatorElement = jQuery.progressIndicator({ 583 'message' : loadingMessage, 584 'position' : 'html', 585 'blockInfo' : { 586 'enabled' : true 587 } 588 }); 589 590 var defaultParams = this.getDefaultParams(); 591 var urlParams = jQuery.extend(defaultParams, urlParams); 592 AppConnector.requestPjax(urlParams).then( 593 function(data){ 594 progressIndicatorElement.progressIndicator({ 595 'mode' : 'hide' 596 }) 597 var listViewContentsContainer = jQuery('#listViewContents') 598 listViewContentsContainer.html(data); 599 app.showSelect2ElementView(listViewContentsContainer.find('select.select2')); 600 app.changeSelectElementView(listViewContentsContainer); 601 thisInstance.registerTimeListSearch(listViewContentsContainer); 602 603 thisInstance.registerDateListSearch(listViewContentsContainer); 604 thisInstance.calculatePages().then(function(data){ 605 //thisInstance.triggerDisplayTypeEvent(); 606 Vtiger_Helper_Js.showHorizontalTopScrollBar(); 607 608 var selectedIds = thisInstance.readSelectedIds(); 609 if(selectedIds != ''){ 610 if(selectedIds == 'all'){ 611 jQuery('.listViewEntriesCheckBox').each( function(index,element) { 612 jQuery(this).attr('checked', true).closest('tr').addClass('highlightBackgroundColor'); 613 }); 614 jQuery('#deSelectAllMsgDiv').show(); 615 var excludedIds = thisInstance.readExcludedIds(); 616 if(excludedIds != ''){ 617 jQuery('#listViewEntriesMainCheckBox').attr('checked',false); 618 jQuery('.listViewEntriesCheckBox').each( function(index,element) { 619 if(jQuery.inArray(jQuery(element).val(),excludedIds) != -1){ 620 jQuery(element).attr('checked', false).closest('tr').removeClass('highlightBackgroundColor'); 621 } 622 }); 623 } 624 } else { 625 jQuery('.listViewEntriesCheckBox').each( function(index,element) { 626 if(jQuery.inArray(jQuery(element).val(),selectedIds) != -1){ 627 jQuery(this).attr('checked', true).closest('tr').addClass('highlightBackgroundColor'); 628 } 629 }); 630 } 631 thisInstance.checkSelectAll(); 632 } 633 aDeferred.resolve(data); 634 635 // Let listeners know about page state change. 636 app.notifyPostAjaxReady(); 637 }); 638 }, 639 640 function(textStatus, errorThrown){ 641 aDeferred.reject(textStatus, errorThrown); 642 } 643 ); 644 return aDeferred.promise(); 645 }, 646 647 /** 648 * Function to calculate number of pages 649 */ 650 calculatePages : function() { 651 var aDeferred = jQuery.Deferred(); 652 var element = jQuery('#totalPageCount'); 653 var totalPageNumber = element.text(); 654 if(totalPageNumber == ""){ 655 var totalRecordCount = jQuery('#totalCount').val(); 656 if(totalRecordCount != '') { 657 var pageLimit = jQuery('#pageLimit').val(); 658 if(pageLimit == '0') pageLimit = 1; 659 pageCount = Math.ceil(totalRecordCount/pageLimit); 660 if(pageCount == 0){ 661 pageCount = 1; 662 } 663 element.text(pageCount); 664 aDeferred.resolve(); 665 return aDeferred.promise(); 666 } 667 this.getPageCount().then(function(data){ 668 var pageCount = data['result']['page']; 669 if(pageCount == 0){ 670 pageCount = 1; 671 } 672 element.text(pageCount); 673 aDeferred.resolve(); 674 }); 675 } else { 676 aDeferred.resolve(); 677 } 678 return aDeferred.promise(); 679 }, 680 681 /* 682 * Function to return alerts if no records selected. 683 */ 684 noRecordSelectedAlert : function(){ 685 return alert(app.vtranslate('JS_PLEASE_SELECT_ONE_RECORD')); 686 }, 687 688 massActionSave : function(form, isMassEdit){ 689 if(typeof isMassEdit == 'undefined') { 690 isMassEdit = false; 691 } 692 var aDeferred = jQuery.Deferred(); 693 var massActionUrl = form.serializeFormData(); 694 if(isMassEdit) { 695 var fieldsChanged = false; 696 var massEditFieldList = jQuery('#massEditFieldsNameList').data('value'); 697 for(var fieldName in massEditFieldList){ 698 var fieldInfo = massEditFieldList[fieldName]; 699 700 var fieldElement = form.find('[name="'+fieldInfo.name+'"]'); 701 if(fieldInfo.type == "reference") { 702 //get the element which will be shown which has "_display" appended to actual field name 703 fieldElement = form.find('[name="'+fieldInfo.name+'_display"]'); 704 }else if(fieldInfo.type == "multipicklist") { 705 fieldElement = form.find('[name="'+fieldInfo.name+'[]"]'); 706 } 707 708 //Not all fields will be enabled for mass edit 709 if(fieldElement.length == 0) { 710 continue; 711 } 712 713 var validationElement = fieldElement.filter('[data-validation-engine]'); 714 //check if you have element enabled has changed 715 if(validationElement.length == 0){ 716 if(fieldInfo.type == "multipicklist") { 717 fieldName = fieldName+"[]"; 718 } 719 delete massActionUrl[fieldName]; 720 if(fieldsChanged != true){ 721 fieldsChanged = false; 722 } 723 } else { 724 fieldsChanged = true; 725 } 726 } 727 if(fieldsChanged == false){ 728 Vtiger_Helper_Js.showPnotify(app.vtranslate('NONE_OF_THE_FIELD_VALUES_ARE_CHANGED_IN_MASS_EDIT')); 729 form.find('[name="saveButton"]').removeAttr('disabled'); 730 aDeferred.reject(); 731 return aDeferred.promise(); 732 } 733 //on submit form trigger the massEditPreSave event 734 var massEditPreSaveEvent = jQuery.Event(Vtiger_List_Js.massEditPreSave); 735 form.trigger(massEditPreSaveEvent); 736 if(massEditPreSaveEvent.isDefaultPrevented()) { 737 form.find('[name="saveButton"]').removeAttr('disabled'); 738 aDeferred.reject(); 739 return aDeferred.promise(); 740 } 741 } 742 var progressIndicatorElement = jQuery.progressIndicator({ 743 'position' : 'html', 744 'blockInfo' : { 745 'enabled' : true 746 } 747 }); 748 AppConnector.request(massActionUrl).then( 749 function(data) { 750 progressIndicatorElement.progressIndicator({ 751 'mode' : 'hide' 752 }); 753 app.hideModalWindow(); 754 aDeferred.resolve(data); 755 }, 756 function(error,err){ 757 app.hideModalWindow(); 758 aDeferred.reject(error,err); 759 } 760 ); 761 return aDeferred.promise(); 762 }, 763 764 /* 765 * Function to check the view permission of a record after save 766 */ 767 registerRecordAccessCheckEvent : function(form) { 768 769 form.on(Vtiger_List_Js.massEditPreSave, function(e) { 770 var assignedToSelectElement = form.find('[name="assigned_user_id"][data-validation-engine]'); 771 if(assignedToSelectElement.length > 0){ 772 if(assignedToSelectElement.data('recordaccessconfirmation') == true) { 773 return; 774 }else{ 775 if(assignedToSelectElement.data('recordaccessconfirmationprogress') != true) { 776 var recordAccess = assignedToSelectElement.find('option:selected').data('recordaccess'); 777 if(recordAccess == false) { 778 var message = app.vtranslate('JS_NO_VIEW_PERMISSION_AFTER_SAVE'); 779 Vtiger_Helper_Js.showConfirmationBox({ 780 'message' : message 781 }).then( 782 function(e) { 783 assignedToSelectElement.data('recordaccessconfirmation',true); 784 assignedToSelectElement.removeData('recordaccessconfirmationprogress'); 785 form.submit(); 786 }, 787 function(error, err){ 788 assignedToSelectElement.removeData('recordaccessconfirmationprogress'); 789 e.preventDefault(); 790 }); 791 assignedToSelectElement.data('recordaccessconfirmationprogress',true); 792 } else { 793 return true; 794 } 795 } 796 } 797 } else{ 798 return true; 799 } 800 e.preventDefault(); 801 }); 802 }, 803 804 checkSelectAll : function(){ 805 var state = true; 806 jQuery('.listViewEntriesCheckBox').each(function(index,element){ 807 if(jQuery(element).is(':checked')){ 808 state = true; 809 }else{ 810 state = false; 811 return false; 812 } 813 }); 814 if(state == true){ 815 jQuery('#listViewEntriesMainCheckBox').attr('checked',true); 816 } else { 817 jQuery('#listViewEntriesMainCheckBox').attr('checked', false); 818 } 819 }, 820 821 getRecordsCount : function(){ 822 var aDeferred = jQuery.Deferred(); 823 var recordCountVal = jQuery("#recordsCount").val(); 824 if(recordCountVal != ''){ 825 aDeferred.resolve(recordCountVal); 826 } else { 827 var count = ''; 828 var cvId = this.getCurrentCvId(); 829 var module = app.getModuleName(); 830 var parent = app.getParentModuleName(); 831 var postData = { 832 "module": module, 833 "parent": parent, 834 "view": "ListAjax", 835 "viewname": cvId, 836 "mode": "getRecordsCount" 837 } 838 839 var searchValue = this.getAlphabetSearchValue(); 840 if((typeof searchValue != "undefined") && (searchValue.length > 0)) { 841 postData['search_key'] = this.getAlphabetSearchField(); 842 postData['search_value'] = this.getAlphabetSearchValue(); 843 postData['operator'] = "s"; 844 } 845 846 postData.search_params = JSON.stringify(this.getListSearchParams()); 847 848 AppConnector.request(postData).then( 849 function(data) { 850 var response = JSON.parse(data); 851 jQuery("#recordsCount").val(response['result']['count']); 852 count = response['result']['count']; 853 aDeferred.resolve(count); 854 }, 855 function(error,err){ 856 857 } 858 ); 859 } 860 861 return aDeferred.promise(); 862 }, 863 864 getSelectOptionFromChosenOption : function(liElement){ 865 var classNames = liElement.attr("class"); 866 var classNamesArr = classNames.split(" "); 867 var currentOptionId = ''; 868 jQuery.each(classNamesArr,function(index,element){ 869 if(element.match("^filterOptionId")){ 870 currentOptionId = element; 871 return false; 872 } 873 }); 874 return jQuery('#'+currentOptionId); 875 }, 876 877 readSelectedIds : function(decode){ 878 var cvId = this.getCurrentCvId(); 879 var selectedIdsElement = jQuery('#selectedIds'); 880 var selectedIdsDataAttr = cvId+'Selectedids'; 881 var selectedIdsElementDataAttributes = selectedIdsElement.data(); 882 if (!(selectedIdsDataAttr in selectedIdsElementDataAttributes) ) { 883 var selectedIds = new Array(); 884 this.writeSelectedIds(selectedIds); 885 } else { 886 selectedIds = selectedIdsElementDataAttributes[selectedIdsDataAttr]; 887 } 888 if(decode == true){ 889 if(typeof selectedIds == 'object'){ 890 return JSON.stringify(selectedIds); 891 } 892 } 893 return selectedIds; 894 }, 895 readExcludedIds : function(decode){ 896 var cvId = this.getCurrentCvId(); 897 var exlcudedIdsElement = jQuery('#excludedIds'); 898 var excludedIdsDataAttr = cvId+'Excludedids'; 899 var excludedIdsElementDataAttributes = exlcudedIdsElement.data(); 900 if(!(excludedIdsDataAttr in excludedIdsElementDataAttributes)){ 901 var excludedIds = new Array(); 902 this.writeExcludedIds(excludedIds); 903 }else{ 904 excludedIds = excludedIdsElementDataAttributes[excludedIdsDataAttr]; 905 } 906 if(decode == true){ 907 if(typeof excludedIds == 'object') { 908 return JSON.stringify(excludedIds); 909 } 910 } 911 return excludedIds; 912 }, 913 914 writeSelectedIds : function(selectedIds){ 915 var cvId = this.getCurrentCvId(); 916 jQuery('#selectedIds').data(cvId+'Selectedids',selectedIds); 917 }, 918 919 writeExcludedIds : function(excludedIds){ 920 var cvId = this.getCurrentCvId(); 921 jQuery('#excludedIds').data(cvId+'Excludedids',excludedIds); 922 }, 923 924 getCurrentCvId : function(){ 925 return jQuery('#customFilter').find('option:selected').data('id'); 926 }, 927 928 getAlphabetSearchField : function() { 929 return jQuery("#alphabetSearchKey").val(); 930 }, 931 932 getAlphabetSearchValue : function() { 933 return jQuery("#alphabetValue").val(); 934 }, 935 936 937 /* 938 * Function to check whether atleast one record is checked 939 */ 940 checkListRecordSelected : function(){ 941 var selectedIds = this.readSelectedIds(); 942 if(typeof selectedIds == 'object' && selectedIds.length <= 0) { 943 return true; 944 } 945 return false; 946 }, 947 948 postMassEdit : function(massEditContainer) { 949 var thisInstance = this; 950 massEditContainer.find('form').on('submit', function(e){ 951 e.preventDefault(); 952 var form = jQuery(e.currentTarget); 953 var invalidFields = form.data('jqv').InvalidFields; 954 if(invalidFields.length == 0){ 955 form.find('[name="saveButton"]').attr('disabled',"disabled"); 956 } 957 var invalidFields = form.data('jqv').InvalidFields; 958 if(invalidFields.length > 0){ 959 return; 960 } 961 thisInstance.massActionSave(form, true).then( 962 function(data) { 963 thisInstance.getListViewRecords(); 964 Vtiger_List_Js.clearList(); 965 }, 966 function(error,err){ 967 } 968 ) 969 }); 970 }, 971 /* 972 * Function to register List view Page Navigation 973 */ 974 registerPageNavigationEvents : function(){ 975 var aDeferred = jQuery.Deferred(); 976 var thisInstance = this; 977 jQuery('#listViewNextPageButton').on('click',function(){ 978 var pageLimit = jQuery('#pageLimit').val(); 979 var noOfEntries = jQuery('#noOfEntries').val(); 980 if(noOfEntries == pageLimit){ 981 var orderBy = jQuery('#orderBy').val(); 982 var sortOrder = jQuery("#sortOrder").val(); 983 var cvId = thisInstance.getCurrentCvId(); 984 var urlParams = { 985 "orderby": orderBy, 986 "sortorder": sortOrder, 987 "viewname": cvId 988 } 989 var pageNumber = jQuery('#pageNumber').val(); 990 var nextPageNumber = parseInt(parseFloat(pageNumber)) + 1; 991 jQuery('#pageNumber').val(nextPageNumber); 992 jQuery('#pageToJump').val(nextPageNumber); 993 thisInstance.getListViewRecords(urlParams).then( 994 function(data){ 995 thisInstance.updatePagination(); 996 aDeferred.resolve(); 997 }, 998 999 function(textStatus, errorThrown){ 1000 aDeferred.reject(textStatus, errorThrown); 1001 } 1002 ); 1003 } 1004 return aDeferred.promise(); 1005 }); 1006 jQuery('#listViewPreviousPageButton').on('click',function(){ 1007 var aDeferred = jQuery.Deferred(); 1008 var pageNumber = jQuery('#pageNumber').val(); 1009 if(pageNumber > 1){ 1010 var orderBy = jQuery('#orderBy').val(); 1011 var sortOrder = jQuery("#sortOrder").val(); 1012 var cvId = thisInstance.getCurrentCvId(); 1013 var urlParams = { 1014 "orderby": orderBy, 1015 "sortorder": sortOrder, 1016 "viewname" : cvId 1017 } 1018 var previousPageNumber = parseInt(parseFloat(pageNumber)) - 1; 1019 jQuery('#pageNumber').val(previousPageNumber); 1020 jQuery('#pageToJump').val(previousPageNumber); 1021 thisInstance.getListViewRecords(urlParams).then( 1022 function(data){ 1023 thisInstance.updatePagination(); 1024 aDeferred.resolve(); 1025 }, 1026 1027 function(textStatus, errorThrown){ 1028 aDeferred.reject(textStatus, errorThrown); 1029 } 1030 ); 1031 } 1032 }); 1033 1034 jQuery('#listViewPageJump').on('click',function(e){ 1035 if(typeof Vtiger_WholeNumberGreaterThanZero_Validator_Js.invokeValidation(jQuery('#pageToJump'))!= 'undefined') { 1036 var pageNo = jQuery('#pageNumber').val(); 1037 jQuery("#pageToJump").val(pageNo); 1038 } 1039 jQuery('#pageToJump').validationEngine('hideAll'); 1040 var element = jQuery('#totalPageCount'); 1041 var totalPageNumber = element.text(); 1042 if(totalPageNumber == ""){ 1043 var totalCountElem = jQuery('#totalCount'); 1044 var totalRecordCount = totalCountElem.val(); 1045 if(totalRecordCount != '') { 1046 var recordPerPage = jQuery('#pageLimit').val(); 1047 if(recordPerPage == '0') recordPerPage = 1; 1048 pageCount = Math.ceil(totalRecordCount/recordPerPage); 1049 if(pageCount == 0){ 1050 pageCount = 1; 1051 } 1052 element.text(pageCount); 1053 return; 1054 } 1055 element.progressIndicator({}); 1056 thisInstance.getPageCount().then(function(data){ 1057 var pageCount = data['result']['page']; 1058 totalCountElem.val(data['result']['numberOfRecords']); 1059 if(pageCount == 0){ 1060 pageCount = 1; 1061 } 1062 element.text(pageCount); 1063 element.progressIndicator({'mode': 'hide'}); 1064 }); 1065 } 1066 }) 1067 1068 jQuery('#listViewPageJumpDropDown').on('click','li',function(e){ 1069 e.stopImmediatePropagation(); 1070 }).on('keypress','#pageToJump',function(e){ 1071 if(e.which == 13){ 1072 e.stopImmediatePropagation(); 1073 var element = jQuery(e.currentTarget); 1074 var response = Vtiger_WholeNumberGreaterThanZero_Validator_Js.invokeValidation(element); 1075 if(typeof response != "undefined"){ 1076 element.validationEngine('showPrompt',response,'',"topLeft",true); 1077 } else { 1078 element.validationEngine('hideAll'); 1079 var currentPageElement = jQuery('#pageNumber'); 1080 var currentPageNumber = currentPageElement.val(); 1081 var newPageNumber = parseInt(jQuery(e.currentTarget).val()); 1082 var totalPages = parseInt(jQuery('#totalPageCount').text()); 1083 if(newPageNumber > totalPages){ 1084 var error = app.vtranslate('JS_PAGE_NOT_EXIST'); 1085 element.validationEngine('showPrompt',error,'',"topLeft",true); 1086 return; 1087 } 1088 if(newPageNumber == currentPageNumber){ 1089 var message = app.vtranslate('JS_YOU_ARE_IN_PAGE_NUMBER')+" "+newPageNumber; 1090 var params = { 1091 text: message, 1092 type: 'info' 1093 }; 1094 Vtiger_Helper_Js.showMessage(params); 1095 return; 1096 } 1097 currentPageElement.val(newPageNumber); 1098 thisInstance.getListViewRecords().then( 1099 function(data){ 1100 thisInstance.updatePagination(); 1101 element.closest('.btn-group ').removeClass('open'); 1102 }, 1103 function(textStatus, errorThrown){ 1104 } 1105 ); 1106 } 1107 return false; 1108 } 1109 }); 1110 }, 1111 1112 /** 1113 * Function to get page count and total number of records in list 1114 */ 1115 getPageCount : function(){ 1116 var aDeferred = jQuery.Deferred(); 1117 var pageCountParams = this.getPageJumpParams(); 1118 AppConnector.request(pageCountParams).then( 1119 function(data) { 1120 var response; 1121 if(typeof data != "object"){ 1122 response = JSON.parse(data); 1123 } else{ 1124 response = data; 1125 } 1126 aDeferred.resolve(response); 1127 }, 1128 function(error,err){ 1129 1130 } 1131 ); 1132 return aDeferred.promise(); 1133 }, 1134 1135 /** 1136 * Function to get Page Jump Params 1137 */ 1138 getPageJumpParams : function(){ 1139 var params = this.getDefaultParams(); 1140 params['view'] = "ListAjax"; 1141 params['mode'] = "getPageCount"; 1142 1143 return params; 1144 }, 1145 1146 /** 1147 * Function to update Pagining status 1148 */ 1149 updatePagination : function(){ 1150 var previousPageExist = jQuery('#previousPageExist').val(); 1151 var nextPageExist = jQuery('#nextPageExist').val(); 1152 var previousPageButton = jQuery('#listViewPreviousPageButton'); 1153 var nextPageButton = jQuery('#listViewNextPageButton'); 1154 var pageJumpButton = jQuery('#listViewPageJump'); 1155 var listViewEntriesCount = parseInt(jQuery('#noOfEntries').val()); 1156 var pageStartRange = parseInt(jQuery('#pageStartRange').val()); 1157 var pageEndRange = parseInt(jQuery('#pageEndRange').val()); 1158 var pages = jQuery('#totalPageCount').text(); 1159 var totalNumberOfRecords = jQuery('.totalNumberOfRecords'); 1160 var pageNumbersTextElem = jQuery('.pageNumbersText'); 1161 1162 if(pages > 1){ 1163 pageJumpButton.removeAttr('disabled'); 1164 } 1165 if(previousPageExist != ""){ 1166 previousPageButton.removeAttr('disabled'); 1167 } else if(previousPageExist == "") { 1168 previousPageButton.attr("disabled","disabled"); 1169 } 1170 1171 if((nextPageExist != "") && (pages >1)){ 1172 nextPageButton.removeAttr('disabled'); 1173 } else if((nextPageExist == "") || (pages == 1)) { 1174 nextPageButton.attr("disabled","disabled"); 1175 } 1176 if(listViewEntriesCount != 0){ 1177 var pageNumberText = pageStartRange+" "+app.vtranslate('to')+" "+pageEndRange; 1178 pageNumbersTextElem.html(pageNumberText); 1179 totalNumberOfRecords.removeClass('hide'); 1180 } else { 1181 pageNumbersTextElem.html("<span> </span>"); 1182 if(!totalNumberOfRecords.hasClass('hide')){ 1183 totalNumberOfRecords.addClass('hide'); 1184 } 1185 } 1186 1187 }, 1188 /* 1189 * Function to register the event for changing the custom Filter 1190 */ 1191 registerChangeCustomFilterEvent : function(){ 1192 var thisInstance = this; 1193 var filterSelectElement = this.getFilterSelectElement(); 1194 filterSelectElement.change(function(e){ 1195 jQuery('#pageNumber').val("1"); 1196 jQuery('#pageToJump').val('1'); 1197 jQuery('#orderBy').val(''); 1198 jQuery("#sortOrder").val(''); 1199 var cvId = thisInstance.getCurrentCvId(); 1200 selectedIds = new Array(); 1201 excludedIds = new Array(); 1202 1203 var urlParams ={ 1204 "viewname" : cvId, 1205 //to make alphabetic search empty 1206 "search_key" : thisInstance.getAlphabetSearchField(), 1207 "search_value" : "", 1208 "search_params" : "" 1209 } 1210 //Make the select all count as empty 1211 jQuery('#recordsCount').val(''); 1212 //Make total number of pages as empty 1213 jQuery('#totalPageCount').text(""); 1214 thisInstance.getListViewRecords(urlParams).then (function(){ 1215 thisInstance.ListViewPostOperation(); 1216 thisInstance.updatePagination(); 1217 }); 1218 }); 1219 }, 1220 1221 //Fix for empty Recycle bin 1222 ListViewPostOperation : function(){ 1223 return true; 1224 }, 1225 1226 /* 1227 * Function to register the click event for list view main check box. 1228 */ 1229 registerMainCheckBoxClickEvent : function(){ 1230 var listViewPageDiv = this.getListViewContainer(); 1231 var thisInstance = this; 1232 listViewPageDiv.on('click','#listViewEntriesMainCheckBox',function(){ 1233 var selectedIds = thisInstance.readSelectedIds(); 1234 var excludedIds = thisInstance.readExcludedIds(); 1235 if(jQuery('#listViewEntriesMainCheckBox').is(":checked")){ 1236 var recordCountObj = thisInstance.getRecordsCount(); 1237 recordCountObj.then(function(data){ 1238 jQuery('#totalRecordsCount').text(data); 1239 if(jQuery("#deSelectAllMsgDiv").css('display') == 'none'){ 1240 jQuery("#selectAllMsgDiv").show(); 1241 } 1242 }); 1243 1244 jQuery('.listViewEntriesCheckBox').each( function(index,element) { 1245 jQuery(this).attr('checked', true).closest('tr').addClass('highlightBackgroundColor'); 1246 if(selectedIds == 'all'){ 1247 if((jQuery.inArray(jQuery(element).val(), excludedIds))!= -1){ 1248 excludedIds.splice(jQuery.inArray(jQuery(element).val(),excludedIds),1); 1249 } 1250 } else if((jQuery.inArray(jQuery(element).val(), selectedIds)) == -1){ 1251 selectedIds.push(jQuery(element).val()); 1252 } 1253 }); 1254 }else{ 1255 jQuery("#selectAllMsgDiv").hide(); 1256 jQuery('.listViewEntriesCheckBox').each( function(index,element) { 1257 jQuery(this).attr('checked', false).closest('tr').removeClass('highlightBackgroundColor'); 1258 if(selectedIds == 'all'){ 1259 excludedIds.push(jQuery(element).val()); 1260 selectedIds = 'all'; 1261 } else { 1262 selectedIds.splice( jQuery.inArray(jQuery(element).val(), selectedIds), 1 ); 1263 } 1264 }); 1265 } 1266 thisInstance.writeSelectedIds(selectedIds); 1267 thisInstance.writeExcludedIds(excludedIds); 1268 1269 }); 1270 }, 1271 1272 /* 1273 * Function to register click event for list view check box. 1274 */ 1275 registerCheckBoxClickEvent : function(){ 1276 var listViewPageDiv = this.getListViewContainer(); 1277 var thisInstance = this; 1278 listViewPageDiv.delegate('.listViewEntriesCheckBox','click',function(e){ 1279 var selectedIds = thisInstance.readSelectedIds(); 1280 var excludedIds = thisInstance.readExcludedIds(); 1281 var elem = jQuery(e.currentTarget); 1282 if(elem.is(':checked')){ 1283 elem.closest('tr').addClass('highlightBackgroundColor'); 1284 if(selectedIds== 'all'){ 1285 excludedIds.splice( jQuery.inArray(elem.val(), excludedIds), 1 ); 1286 } else if((jQuery.inArray(elem.val(), selectedIds)) == -1) { 1287 selectedIds.push(elem.val()); 1288 } 1289 } else { 1290 elem.closest('tr').removeClass('highlightBackgroundColor'); 1291 if(selectedIds == 'all') { 1292 excludedIds.push(elem.val()); 1293 selectedIds = 'all'; 1294 } else { 1295 selectedIds.splice( jQuery.inArray(elem.val(), selectedIds), 1 ); 1296 } 1297 } 1298 thisInstance.checkSelectAll(); 1299 thisInstance.writeSelectedIds(selectedIds); 1300 thisInstance.writeExcludedIds(excludedIds); 1301 }); 1302 }, 1303 1304 /* 1305 * Function to register the click event for select all. 1306 */ 1307 registerSelectAllClickEvent : function(){ 1308 var listViewPageDiv = this.getListViewContainer(); 1309 var thisInstance = this; 1310 listViewPageDiv.delegate('#selectAllMsg','click',function(){ 1311 jQuery('#selectAllMsgDiv').hide(); 1312 jQuery("#deSelectAllMsgDiv").show(); 1313 jQuery('#listViewEntriesMainCheckBox').attr('checked',true); 1314 jQuery('.listViewEntriesCheckBox').each( function(index,element) { 1315 jQuery(this).attr('checked', true).closest('tr').addClass('highlightBackgroundColor'); 1316 }); 1317 thisInstance.writeSelectedIds('all'); 1318 }); 1319 }, 1320 1321 /* 1322 * Function to register the click event for deselect All. 1323 */ 1324 registerDeselectAllClickEvent : function(){ 1325 var listViewPageDiv = this.getListViewContainer(); 1326 var thisInstance = this; 1327 listViewPageDiv.delegate('#deSelectAllMsg','click',function(){ 1328 jQuery('#deSelectAllMsgDiv').hide(); 1329 jQuery('#listViewEntriesMainCheckBox').attr('checked',false); 1330 jQuery('.listViewEntriesCheckBox').each( function(index,element) { 1331 jQuery(this).attr('checked', false).closest('tr').removeClass('highlightBackgroundColor'); 1332 }); 1333 var excludedIds = new Array(); 1334 var selectedIds = new Array(); 1335 thisInstance.writeSelectedIds(selectedIds); 1336 thisInstance.writeExcludedIds(excludedIds); 1337 }); 1338 }, 1339 1340 /* 1341 * Function to register the click event for listView headers 1342 */ 1343 registerHeadersClickEvent : function(){ 1344 var listViewPageDiv = this.getListViewContainer(); 1345 var thisInstance = this; 1346 listViewPageDiv.on('click','.listViewHeaderValues',function(e){ 1347 var fieldName = jQuery(e.currentTarget).data('columnname'); 1348 var sortOrderVal = jQuery(e.currentTarget).data('nextsortorderval'); 1349 var cvId = thisInstance.getCurrentCvId(); 1350 var urlParams = { 1351 "orderby": fieldName, 1352 "sortorder": sortOrderVal, 1353 "viewname" : cvId 1354 } 1355 thisInstance.getListViewRecords(urlParams); 1356 }); 1357 }, 1358 1359 /* 1360 * function to register the click event event for create filter 1361 */ 1362 registerCreateFilterClickEvent : function(){ 1363 var thisInstance = this; 1364 jQuery('#createFilter').on('click',function(event){ 1365 //to close the dropdown 1366 thisInstance.getFilterSelectElement().data('select2').close(); 1367 var currentElement = jQuery(event.currentTarget); 1368 var createUrl = currentElement.data('createurl'); 1369 Vtiger_CustomView_Js.loadFilterView(createUrl); 1370 }); 1371 }, 1372 1373 /* 1374 * Function to register the click event for edit filter 1375 */ 1376 registerEditFilterClickEvent : function(){ 1377 var thisInstance = this; 1378 var listViewFilterBlock = this.getFilterBlock(); 1379 if(listViewFilterBlock != false){ 1380 listViewFilterBlock.on('mouseup','li i.editFilter',function(event){ 1381 //to close the dropdown 1382 thisInstance.getFilterSelectElement().data('select2').close(); 1383 var liElement = jQuery(event.currentTarget).closest('.select2-result-selectable'); 1384 var currentOptionElement = thisInstance.getSelectOptionFromChosenOption(liElement); 1385 var editUrl = currentOptionElement.data('editurl'); 1386 Vtiger_CustomView_Js.loadFilterView(editUrl); 1387 event.stopPropagation(); 1388 }); 1389 } 1390 }, 1391 1392 /* 1393 * Function to register the click event for delete filter 1394 */ 1395 registerDeleteFilterClickEvent: function(){ 1396 var thisInstance = this; 1397 var listViewFilterBlock = this.getFilterBlock(); 1398 if(listViewFilterBlock != false){ 1399 //used mouseup event to stop the propagation of customfilter select change event. 1400 listViewFilterBlock.on('mouseup','li i.deleteFilter',function(event){ 1401 //to close the dropdown 1402 thisInstance.getFilterSelectElement().data('select2').close(); 1403 var liElement = jQuery(event.currentTarget).closest('.select2-result-selectable'); 1404 var message = app.vtranslate('JS_LBL_ARE_YOU_SURE_YOU_WANT_TO_DELETE'); 1405 Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then( 1406 function(e) { 1407 var currentOptionElement = thisInstance.getSelectOptionFromChosenOption(liElement); 1408 var deleteUrl = currentOptionElement.data('deleteurl'); 1409 var newEle = '<form action='+deleteUrl+' method="POST">'+ 1410 '<input type = "hidden" name ="'+csrfMagicName+'" value=\''+csrfMagicToken+'\'>'+ 1411 '</form>'; 1412 var formElement = jQuery(newEle); 1413 formElement.appendTo('body').submit(); 1414 }, 1415 function(error, err){ 1416 } 1417 ); 1418 event.stopPropagation(); 1419 }); 1420 } 1421 }, 1422 1423 /* 1424 * Function to register the click event for approve filter 1425 */ 1426 registerApproveFilterClickEvent: function(){ 1427 var thisInstance = this; 1428 var listViewFilterBlock = this.getFilterBlock(); 1429 1430 if(listViewFilterBlock != false){ 1431 listViewFilterBlock.on('mouseup','li i.approveFilter',function(event){ 1432 //to close the dropdown 1433 thisInstance.getFilterSelectElement().data('select2').close(); 1434 var liElement = jQuery(event.currentTarget).closest('.select2-result-selectable'); 1435 var currentOptionElement = thisInstance.getSelectOptionFromChosenOption(liElement); 1436 var approveUrl = currentOptionElement.data('approveurl'); 1437 window.location.href = approveUrl; 1438 event.stopPropagation(); 1439 }); 1440 } 1441 }, 1442 1443 /* 1444 * Function to register the click event for deny filter 1445 */ 1446 registerDenyFilterClickEvent: function(){ 1447 var thisInstance = this; 1448 var listViewFilterBlock = this.getFilterBlock(); 1449 1450 if(listViewFilterBlock != false){ 1451 listViewFilterBlock.on('mouseup','li i.denyFilter',function(event){ 1452 //to close the dropdown 1453 thisInstance.getFilterSelectElement().data('select2').close(); 1454 var liElement = jQuery(event.currentTarget).closest('.select2-result-selectable'); 1455 var currentOptionElement = thisInstance.getSelectOptionFromChosenOption(liElement); 1456 var denyUrl = currentOptionElement.data('denyurl'); 1457 window.location.href = denyUrl; 1458 event.stopPropagation(); 1459 }); 1460 } 1461 }, 1462 1463 /* 1464 * Function to register the hover event for customview filter options 1465 */ 1466 registerCustomFilterOptionsHoverEvent : function(){ 1467 var thisInstance = this; 1468 var listViewTopMenuDiv = this.getListViewTopMenuContainer(); 1469 var filterBlock = this.getFilterBlock() 1470 if(filterBlock != false){ 1471 filterBlock.on('hover','li.select2-result-selectable',function(event){ 1472 var liElement = jQuery(event.currentTarget); 1473 var liFilterImages = liElement.find('.filterActionImgs'); 1474 if (liElement.hasClass('group-result')){ 1475 return; 1476 } 1477 1478 if( event.type === 'mouseenter' ) { 1479 if(liFilterImages.length > 0){ 1480 liFilterImages.show(); 1481 }else{ 1482 thisInstance.performFilterImageActions(liElement); 1483 } 1484 1485 } else { 1486 liFilterImages.hide(); 1487 } 1488 }); 1489 } 1490 }, 1491 1492 performFilterImageActions : function(liElement) { 1493 jQuery('.filterActionImages').clone(true,true).removeClass('filterActionImages').addClass('filterActionImgs').appendTo(liElement.find('.select2-result-label')).show(); 1494 var currentOptionElement = this.getSelectOptionFromChosenOption(liElement); 1495 var deletable = currentOptionElement.data('deletable'); 1496 if(deletable != '1'){ 1497 liElement.find('.deleteFilter').remove(); 1498 } 1499 var editable = currentOptionElement.data('editable'); 1500 if(editable != '1'){ 1501 liElement.find('.editFilter').remove(); 1502 } 1503 var pending = currentOptionElement.data('pending'); 1504 if(pending != '1'){ 1505 liElement.find('.approveFilter').remove(); 1506 } 1507 var approve = currentOptionElement.data('public'); 1508 if(approve != '1'){ 1509 liElement.find('.denyFilter').remove(); 1510 } 1511 }, 1512 1513 /* 1514 * Function to register the list view row click event 1515 */ 1516 registerRowClickEvent: function(){ 1517 var thisInstance = this; 1518 var listViewContentDiv = this.getListViewContentContainer(); 1519 listViewContentDiv.on('click','.listViewEntries',function(e){ 1520 if(jQuery(e.target, jQuery(e.currentTarget)).is('td:first-child')) return; 1521 if(jQuery(e.target).is('input[type="checkbox"]')) return; 1522 var elem = jQuery(e.currentTarget); 1523 var recordUrl = elem.data('recordurl'); 1524 if(typeof recordUrl == 'undefined') { 1525 return; 1526 } 1527 window.location.href = recordUrl; 1528 }); 1529 }, 1530 1531 /* 1532 * Function to register the list view delete record click event 1533 */ 1534 registerDeleteRecordClickEvent: function(){ 1535 var thisInstance = this; 1536 var listViewContentDiv = this.getListViewContentContainer(); 1537 listViewContentDiv.on('click','.deleteRecordButton',function(e){ 1538 var elem = jQuery(e.currentTarget); 1539 var recordId = elem.closest('tr').data('id'); 1540 Vtiger_List_Js.deleteRecord(recordId); 1541 e.stopPropagation(); 1542 }); 1543 }, 1544 /* 1545 * Function to register the click event of email field 1546 */ 1547 registerEmailFieldClickEvent : function(){ 1548 var listViewContentDiv = this.getListViewContentContainer(); 1549 listViewContentDiv.on('click','.emailField',function(e){ 1550 e.stopPropagation(); 1551 }) 1552 }, 1553 1554 /* 1555 * Function to register the click event of phone field 1556 */ 1557 registerPhoneFieldClickEvent : function(){ 1558 var listViewContentDiv = this.getListViewContentContainer(); 1559 listViewContentDiv.on('click','.phoneField',function(e){ 1560 e.stopPropagation(); 1561 }) 1562 }, 1563 1564 /* 1565 * Function to register the click event of url field 1566 */ 1567 registerUrlFieldClickEvent : function(){ 1568 var listViewContentDiv = this.getListViewContentContainer(); 1569 listViewContentDiv.on('click','.urlField',function(e){ 1570 e.stopPropagation(); 1571 }) 1572 }, 1573 1574 /** 1575 * Function to inactive field for validation in a form 1576 * this will remove data-validation-engine attr of all the elements 1577 * @param Accepts form as a parameter 1578 */ 1579 inactiveFieldValidation : function(form){ 1580 var massEditFieldList = jQuery('#massEditFieldsNameList').data('value'); 1581 for(var fieldName in massEditFieldList){ 1582 var fieldInfo = massEditFieldList[fieldName]; 1583 1584 var fieldElement = form.find('[name="'+fieldInfo.name+'"]'); 1585 if(fieldInfo.type == "reference") { 1586 //get the element which will be shown which has "_display" appended to actual field name 1587 fieldElement = form.find('[name="'+fieldInfo.name+'_display"]'); 1588 }else if(fieldInfo.type == "multipicklist") { 1589 fieldElement = form.find('[name="'+fieldInfo.name+'[]"]'); 1590 } 1591 1592 //Not all the fields will be enabled for mass edit 1593 if(fieldElement.length == 0 ) { 1594 continue; 1595 } 1596 1597 var elemData = fieldElement.data(); 1598 1599 //Blank validation by default 1600 var validationVal = "validate[]" 1601 if('validationEngine' in elemData) { 1602 validationVal = elemData.validationEngine; 1603 delete elemData.validationEngine; 1604 } 1605 fieldElement.data('invalidValidationEngine',validationVal); 1606 fieldElement.removeAttr('data-validation-engine'); 1607 } 1608 }, 1609 1610 /** 1611 * function to register field for validation 1612 * this will add the data-validation-engine attr of all the elements 1613 * make the field available for validation 1614 * @param Accepts form as a parameter 1615 */ 1616 registerFieldsForValidation : function(form){ 1617 form.find('.fieldValue').on('change','input,select,textarea',function(e, params){ 1618 if(typeof params == 'undefined'){ 1619 params = {}; 1620 } 1621 1622 if(typeof params.forceDeSelect == 'undefined') { 1623 params.forceDeSelect = false; 1624 } 1625 var element = jQuery(e.currentTarget); 1626 var fieldValue = element.val(); 1627 var parentTd = element.closest('td'); 1628 if(((fieldValue == "" || fieldValue == null) && (typeof(element.attr('data-validation-engine')) != "undefined")) || params.forceDeSelect){ 1629 if(parentTd.hasClass('massEditActiveField')){ 1630 parentTd.removeClass('massEditActiveField'); 1631 } 1632 element.removeAttr('data-validation-engine'); 1633 element.validationEngine('hide'); 1634 var invalidFields = form.data('jqv').InvalidFields; 1635 var response = jQuery.inArray(element.get(0),invalidFields); 1636 if(response != '-1'){ 1637 invalidFields.splice(response,1); 1638 } 1639 } else if((fieldValue != "") && (typeof(element.attr('data-validation-engine')) == "undefined")){ 1640 element.attr('data-validation-engine', element.data('invalidValidationEngine')); 1641 parentTd.addClass('massEditActiveField'); 1642 } 1643 }) 1644 }, 1645 1646 registerEventForTabClick : function(form){ 1647 var ulContainer = form.find('.massEditTabs'); 1648 ulContainer.on('click','a[data-toggle="tab"]',function(e){ 1649 form.validationEngine('validate'); 1650 var invalidFields = form.data('jqv').InvalidFields; 1651 if(invalidFields.length > 0){ 1652 e.stopPropagation(); 1653 } 1654 }); 1655 }, 1656 1657 registerReferenceFieldsForValidation : function(form){ 1658 var referenceField = form.find('.sourceField'); 1659 form.find('.sourceField').on(Vtiger_Edit_Js.referenceSelectionEvent,function(e,params){ 1660 var element = jQuery(e.currentTarget); 1661 var elementName = element.attr('name'); 1662 var fieldDisplayName = elementName+"_display"; 1663 var fieldDisplayElement = form.find('input[name="'+fieldDisplayName+'"]'); 1664 if(params.selectedName == ""){ 1665 return; 1666 } 1667 fieldDisplayElement.attr('data-validation-engine', fieldDisplayElement.data('invalidValidationEngine')); 1668 var parentTd = fieldDisplayElement.closest('td'); 1669 if(!parentTd.hasClass('massEditActiveField')){ 1670 parentTd.addClass('massEditActiveField'); 1671 } 1672 }) 1673 form.find('.clearReferenceSelection').on(Vtiger_Edit_Js.referenceDeSelectionEvent,function(e){ 1674 var sourceField = form.find('.sourceField'); 1675 var sourceFieldName = sourceField.attr('name'); 1676 var fieldDisplayName = sourceFieldName+"_display"; 1677 var fieldDisplayElement = form.find('input[name="'+fieldDisplayName+'"]').removeAttr('data-validation-engine'); 1678 var parentTd = fieldDisplayElement.closest('td'); 1679 if(parentTd.hasClass('massEditActiveField')){ 1680 parentTd.removeClass('massEditActiveField'); 1681 } 1682 }) 1683 }, 1684 1685 registerSlimScrollMassEdit : function() { 1686 app.showScrollBar(jQuery('div[name="massEditContent"]'), {'height':'400px'}); 1687 }, 1688 1689 /* 1690 * Function to register the submit event for mass Actions save 1691 */ 1692 registerMassActionSubmitEvent : function(){ 1693 var thisInstance = this; 1694 jQuery('body').on('submit','#massSave',function(e){ 1695 var form = jQuery(e.currentTarget); 1696 var commentContent = form.find('#commentcontent') 1697 var commentContentValue = commentContent.val(); 1698 if(commentContentValue == "") { 1699 var errorMsg = app.vtranslate('JS_LBL_COMMENT_VALUE_CANT_BE_EMPTY') 1700 commentContent.validationEngine('showPrompt', errorMsg , 'error','bottomLeft',true); 1701 e.preventDefault(); 1702 return; 1703 } 1704 commentContent.validationEngine('hide'); 1705 jQuery(form).find('[name=saveButton]').attr('disabled','disabled'); 1706 thisInstance.massActionSave(form).then(function(data){ 1707 Vtiger_List_Js.clearList(); 1708 }); 1709 e.preventDefault(); 1710 }); 1711 }, 1712 1713 changeCustomFilterElementView : function() { 1714 var filterSelectElement = this.getFilterSelectElement(); 1715 if(filterSelectElement.length > 0 && filterSelectElement.is("select")) { 1716 app.showSelect2ElementView(filterSelectElement,{ 1717 formatSelection : function(data, contianer){ 1718 var resultContainer = jQuery('<span></span>'); 1719 resultContainer.append(jQuery(jQuery('.filterImage').clone().get(0)).show()); 1720 resultContainer.append(data.text); 1721 return resultContainer; 1722 }, 1723 customSortOptGroup : true 1724 }); 1725 1726 var select2Instance = filterSelectElement.data('select2'); 1727 jQuery('span.filterActionsDiv').appendTo(select2Instance.dropdown).removeClass('hide'); 1728 } 1729 }, 1730 1731 triggerDisplayTypeEvent : function() { 1732 var widthType = app.cacheGet('widthType', 'narrowWidthType'); 1733 if(widthType) { 1734 var elements = jQuery('.listViewEntriesTable').find('td,th'); 1735 elements.attr('class', widthType); 1736 } 1737 }, 1738 1739 registerEventForAlphabetSearch : function() { 1740 var thisInstance = this; 1741 var listViewPageDiv = this.getListViewContentContainer(); 1742 listViewPageDiv.on('click','.alphabetSearch',function(e) { 1743 var alphabet = jQuery(e.currentTarget).find('a').text(); 1744 var cvId = thisInstance.getCurrentCvId(); 1745 var AlphabetSearchKey = thisInstance.getAlphabetSearchField(); 1746 var urlParams = { 1747 "viewname" : cvId, 1748 "search_key" : AlphabetSearchKey, 1749 "search_value" : alphabet, 1750 "operator" : 's', 1751 "page" : 1 1752 } 1753 jQuery('#recordsCount').val(''); 1754 //To Set the page number as first page 1755 jQuery('#pageNumber').val('1'); 1756 jQuery('#pageToJump').val('1'); 1757 jQuery('#totalPageCount').text(""); 1758 thisInstance.getListViewRecords(urlParams).then( 1759 function(data){ 1760 thisInstance.updatePagination(); 1761 //To unmark the all the selected ids 1762 jQuery('#deSelectAllMsg').trigger('click'); 1763 }, 1764 1765 function(textStatus, errorThrown){ 1766 } 1767 ); 1768 }); 1769 }, 1770 1771 /** 1772 * Function to show total records count in listview on hover 1773 * of pageNumber text 1774 */ 1775 registerEventForTotalRecordsCount : function(){ 1776 var thisInstance = this; 1777 jQuery('.totalNumberOfRecords').on('click',function(e){ 1778 var element = jQuery(e.currentTarget); 1779 var totalRecordsElement = jQuery('#totalCount'); 1780 var totalNumberOfRecords = totalRecordsElement.val(); 1781 element.addClass('hide'); 1782 element.parent().progressIndicator({}); 1783 if(totalNumberOfRecords == '') { 1784 thisInstance.getPageCount().then(function(data){ 1785 totalNumberOfRecords = data['result']['numberOfRecords']; 1786 totalRecordsElement.val(totalNumberOfRecords); 1787 thisInstance.showPagingInfo(); 1788 }); 1789 }else{ 1790 thisInstance.showPagingInfo(); 1791 } 1792 element.parent().progressIndicator({'mode':'hide'}); 1793 }) 1794 }, 1795 1796 showPagingInfo : function(){ 1797 var totalNumberOfRecords = jQuery('#totalCount').val(); 1798 var pageNumberElement = jQuery('.pageNumbersText'); 1799 var pageRange = pageNumberElement.text(); 1800 var newPagingInfo = pageRange+" "+app.vtranslate('of')+" "+totalNumberOfRecords; 1801 var listViewEntriesCount = parseInt(jQuery('#noOfEntries').val()); 1802 if(listViewEntriesCount != 0){ 1803 jQuery('.pageNumbersText').html(newPagingInfo); 1804 } else { 1805 jQuery('.pageNumbersText').html(""); 1806 } 1807 }, 1808 1809 registerEvents : function(){ 1810 1811 this.registerRowClickEvent(); 1812 this.registerPageNavigationEvents(); 1813 this.registerMainCheckBoxClickEvent(); 1814 this.registerCheckBoxClickEvent(); 1815 this.registerSelectAllClickEvent(); 1816 this.registerDeselectAllClickEvent(); 1817 this.registerDeleteRecordClickEvent(); 1818 this.registerHeadersClickEvent(); 1819 this.registerMassActionSubmitEvent(); 1820 this.registerEventForAlphabetSearch(); 1821 1822 this.changeCustomFilterElementView(); 1823 this.registerChangeCustomFilterEvent(); 1824 this.registerCreateFilterClickEvent(); 1825 this.registerEditFilterClickEvent(); 1826 this.registerDeleteFilterClickEvent(); 1827 this.registerApproveFilterClickEvent(); 1828 this.registerDenyFilterClickEvent(); 1829 this.registerCustomFilterOptionsHoverEvent(); 1830 this.registerEmailFieldClickEvent(); 1831 this.registerPhoneFieldClickEvent(); 1832 //this.triggerDisplayTypeEvent(); 1833 Vtiger_Helper_Js.showHorizontalTopScrollBar(); 1834 this.registerUrlFieldClickEvent(); 1835 this.registerEventForTotalRecordsCount(); 1836 1837 //Just reset all the checkboxes on page load: added for chrome issue. 1838 var listViewContainer = this.getListViewContentContainer(); 1839 listViewContainer.find('#listViewEntriesMainCheckBox,.listViewEntriesCheckBox').prop('checked', false); 1840 1841 this.registerListSearch(); 1842 this.registerDateListSearch(listViewContainer); 1843 this.registerTimeListSearch(listViewContainer); 1844 }, 1845 1846 /** 1847 * Function that executes after the mass delete action 1848 */ 1849 postMassDeleteRecords : function() { 1850 var aDeferred = jQuery.Deferred(); 1851 var listInstance = Vtiger_List_Js.getInstance(); 1852 app.hideModalWindow(); 1853 var module = app.getModuleName(); 1854 listInstance.getListViewRecords().then( 1855 function(data) { 1856 jQuery('#recordsCount').val(''); 1857 jQuery('#totalPageCount').text(''); 1858 //listInstance.triggerDisplayTypeEvent(); 1859 jQuery('#deSelectAllMsg').trigger('click'); 1860 listInstance.calculatePages().then(function(){ 1861 listInstance.updatePagination(); 1862 }); 1863 aDeferred.resolve(); 1864 }); 1865 jQuery('#recordsCount').val(''); 1866 return aDeferred.promise(); 1867 }, 1868 1869 getListSearchParams : function(){ 1870 var listViewPageDiv = this.getListViewContainer(); 1871 var listViewTable = listViewPageDiv.find('.listViewEntriesTable'); 1872 var searchParams = new Array(); 1873 listViewTable.find('.listSearchContributor').each(function(index,domElement){ 1874 var searchInfo = new Array(); 1875 var searchContributorElement = jQuery(domElement); 1876 var fieldInfo = searchContributorElement.data('fieldinfo'); 1877 var fieldName = searchContributorElement.attr('name'); 1878 1879 var searchValue = searchContributorElement.val(); 1880 1881 if(typeof searchValue == "object") { 1882 if(searchValue == null) { 1883 searchValue = ""; 1884 }else{ 1885 searchValue = searchValue.join(','); 1886 } 1887 } 1888 searchValue = searchValue.trim(); 1889 if(searchValue.length <=0 ) { 1890 //continue 1891 return true; 1892 } 1893 var searchOperator = 'c'; 1894 if(fieldInfo.type == "date" || fieldInfo.type == "datetime") { 1895 searchOperator = 'bw'; 1896 }else if (fieldInfo.type == 'percentage' || fieldInfo.type == "double" || fieldInfo.type == "integer" 1897 || fieldInfo.type == 'currency' || fieldInfo.type == "number" || fieldInfo.type == "boolean" || 1898 fieldInfo.type == "picklist") { 1899 searchOperator = 'e'; 1900 } 1901 searchInfo.push(fieldName); 1902 searchInfo.push(searchOperator); 1903 searchInfo.push(searchValue); 1904 searchParams.push(searchInfo); 1905 }); 1906 return new Array(searchParams); 1907 }, 1908 1909 registerListSearch : function() { 1910 var listViewPageDiv = this.getListViewContainer(); 1911 var thisInstance = this; 1912 listViewPageDiv.on('click','[data-trigger="listSearch"]',function(e){ 1913 thisInstance.getListViewRecords({'page': '1'}).then( 1914 function(data){ 1915 //To unmark the all the selected ids 1916 jQuery('#deSelectAllMsg').trigger('click'); 1917 1918 jQuery('#recordsCount').val(''); 1919 //To Set the page number as first page 1920 jQuery('#pageNumber').val('1'); 1921 jQuery('#pageToJump').val('1'); 1922 jQuery('#totalPageCount').text(""); 1923 thisInstance.calculatePages().then(function(){ 1924 thisInstance.updatePagination(); 1925 }); 1926 }, 1927 1928 function(textStatus, errorThrown){ 1929 } 1930 ); 1931 }) 1932 1933 listViewPageDiv.on('keypress','input.listSearchContributor',function(e){ 1934 if(e.keyCode == 13){ 1935 var element = jQuery(e.currentTarget); 1936 var parentElement = element.closest('tr'); 1937 var searchTriggerElement = parentElement.find('[data-trigger="listSearch"]'); 1938 searchTriggerElement.trigger('click'); 1939 } 1940 }); 1941 }, 1942 1943 registerDateListSearch : function(container) { 1944 container.find('.dateField').each(function(index,element){ 1945 var dateElement = jQuery(element); 1946 var customParams = { 1947 calendars: 3, 1948 mode: 'range', 1949 className : 'rangeCalendar', 1950 onChange: function(formated) { 1951 dateElement.val(formated.join(',')); 1952 } 1953 } 1954 app.registerEventForDatePickerFields(dateElement,false,customParams); 1955 }); 1956 1957 }, 1958 1959 registerTimeListSearch : function(container) { 1960 app.registerEventForTimeFields(container,false); 1961 } 1962 });
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 |