563 lines
20 KiB
JavaScript
563 lines
20 KiB
JavaScript
/*+***********************************************************************************
|
|
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
|
|
* ("License"); You may not use this file except in compliance with the License
|
|
* The Original Code is: vtiger CRM Open Source
|
|
* The Initial Developer of the Original Code is vtiger.
|
|
* Portions created by vtiger are Copyright (C) vtiger.
|
|
* All Rights Reserved.
|
|
*************************************************************************************/
|
|
|
|
jQuery.Class("Vtiger_RelatedList_Js",{},{
|
|
|
|
selectedRelatedTabElement : false,
|
|
parentRecordId : false,
|
|
parentModuleName : false,
|
|
relatedModulename : false,
|
|
relatedTabsContainer : false,
|
|
detailViewContainer : false,
|
|
relatedContentContainer : false,
|
|
|
|
setSelectedTabElement : function(tabElement) {
|
|
this.selectedRelatedTabElement = tabElement;
|
|
},
|
|
|
|
getSelectedTabElement : function(){
|
|
return this.selectedRelatedTabElement;
|
|
},
|
|
|
|
getParentId : function(){
|
|
return this.parentRecordId;
|
|
},
|
|
|
|
loadRelatedList : function(params){
|
|
var aDeferred = jQuery.Deferred();
|
|
var thisInstance = this;
|
|
if(typeof this.relatedModulename== "undefined" || this.relatedModulename.length <= 0 ) {
|
|
return;
|
|
}
|
|
var progressIndicatorElement = jQuery.progressIndicator({
|
|
'position' : 'html',
|
|
'blockInfo' : {
|
|
'enabled' : true
|
|
}
|
|
});
|
|
var completeParams = this.getCompleteParams();
|
|
jQuery.extend(completeParams,params);
|
|
AppConnector.request(completeParams).then(
|
|
function(responseData){
|
|
progressIndicatorElement.progressIndicator({
|
|
'mode' : 'hide'
|
|
})
|
|
thisInstance.relatedTabsContainer.find('li').removeClass('active');
|
|
thisInstance.selectedRelatedTabElement.addClass('active');
|
|
thisInstance.relatedContentContainer.html(responseData);
|
|
responseData = thisInstance.relatedContentContainer.html();
|
|
//thisInstance.triggerDisplayTypeEvent();
|
|
Vtiger_Helper_Js.showHorizontalTopScrollBar();
|
|
jQuery('.pageNumbers',thisInstance.relatedContentContainer).tooltip();
|
|
aDeferred.resolve(responseData);
|
|
jQuery('input[name="currentPageNum"]', thisInstance.relatedContentContainer).val(completeParams.page);
|
|
// Let listeners know about page state change.
|
|
app.notifyPostAjaxReady();
|
|
},
|
|
|
|
function(textStatus, errorThrown){
|
|
aDeferred.reject(textStatus, errorThrown);
|
|
}
|
|
);
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
triggerDisplayTypeEvent : function() {
|
|
var widthType = app.cacheGet('widthType', 'narrowWidthType');
|
|
if(widthType) {
|
|
var elements = jQuery('.listViewEntriesTable').find('td,th');
|
|
elements.attr('class', widthType);
|
|
}
|
|
},
|
|
|
|
showSelectRelationPopup : function(){
|
|
var aDeferred = jQuery.Deferred();
|
|
var thisInstance = this;
|
|
var popupInstance = Vtiger_Popup_Js.getInstance();
|
|
popupInstance.show(this.getPopupParams(), function(responseString){
|
|
var responseData = JSON.parse(responseString);
|
|
var relatedIdList = Object.keys(responseData);
|
|
thisInstance.addRelations(relatedIdList).then(
|
|
function(data){
|
|
var relatedCurrentPage = thisInstance.getCurrentPageNum();
|
|
var params = {'page':relatedCurrentPage};
|
|
thisInstance.loadRelatedList(params).then(function(data){
|
|
aDeferred.resolve(data);
|
|
});
|
|
}
|
|
);
|
|
}
|
|
);
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
addRelations : function(idList){
|
|
var aDeferred = jQuery.Deferred();
|
|
var sourceRecordId = this.parentRecordId;
|
|
var sourceModuleName = this.parentModuleName;
|
|
var relatedModuleName = this.relatedModulename;
|
|
|
|
var params = {};
|
|
params['mode'] = "addRelation";
|
|
params['module'] = sourceModuleName;
|
|
params['action'] = 'RelationAjax';
|
|
|
|
params['related_module'] = relatedModuleName;
|
|
params['src_record'] = sourceRecordId;
|
|
params['related_record_list'] = JSON.stringify(idList);
|
|
|
|
AppConnector.request(params).then(
|
|
function(responseData){
|
|
aDeferred.resolve(responseData);
|
|
},
|
|
|
|
function(textStatus, errorThrown){
|
|
aDeferred.reject(textStatus, errorThrown);
|
|
}
|
|
);
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
getPopupParams : function(){
|
|
var parameters = {};
|
|
var parameters = {
|
|
'module' : this.relatedModulename,
|
|
'src_module' : this.parentModuleName,
|
|
'src_record' : this.parentRecordId,
|
|
'multi_select' : true
|
|
}
|
|
return parameters;
|
|
},
|
|
|
|
deleteRelation : function(relatedIdList) {
|
|
var aDeferred = jQuery.Deferred();
|
|
var params = {};
|
|
params['mode'] = "deleteRelation";
|
|
params['module'] = this.parentModuleName;
|
|
params['action'] = 'RelationAjax';
|
|
|
|
params['related_module'] = this.relatedModulename;
|
|
params['src_record'] = this.parentRecordId;
|
|
params['related_record_list'] = JSON.stringify(relatedIdList);
|
|
|
|
AppConnector.request(params).then(
|
|
function(responseData){
|
|
aDeferred.resolve(responseData);
|
|
},
|
|
|
|
function(textStatus, errorThrown){
|
|
aDeferred.reject(textStatus, errorThrown);
|
|
}
|
|
);
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
getCurrentPageNum : function() {
|
|
return jQuery('input[name="currentPageNum"]',this.relatedContentContainer).val();
|
|
},
|
|
|
|
setCurrentPageNumber : function(pageNumber){
|
|
jQuery('input[name="currentPageNum"]').val(pageNumber);
|
|
},
|
|
|
|
/**
|
|
* Function to get Order by
|
|
*/
|
|
getOrderBy : function(){
|
|
return jQuery('#orderBy').val();
|
|
},
|
|
|
|
/**
|
|
* Function to get Sort Order
|
|
*/
|
|
getSortOrder : function(){
|
|
return jQuery("#sortOrder").val();
|
|
},
|
|
|
|
getCompleteParams : function(){
|
|
var params = {};
|
|
params['view'] = "Detail";
|
|
params['module'] = this.parentModuleName;
|
|
params['record'] = this.getParentId(),
|
|
params['relatedModule'] = this.relatedModulename,
|
|
params['sortorder'] = this.getSortOrder(),
|
|
params['orderby'] = this.getOrderBy(),
|
|
params['page'] = this.getCurrentPageNum();
|
|
params['mode'] = "showRelatedList"
|
|
|
|
return params;
|
|
},
|
|
|
|
|
|
/**
|
|
* Function to handle Sort
|
|
*/
|
|
sortHandler : function(headerElement){
|
|
var aDeferred = jQuery.Deferred();
|
|
var fieldName = headerElement.data('fieldname');
|
|
var sortOrderVal = headerElement.data('nextsortorderval');
|
|
var sortingParams = {
|
|
"orderby" : fieldName,
|
|
"sortorder" : sortOrderVal,
|
|
"tab_label" : this.selectedRelatedTabElement.data('label-key')
|
|
}
|
|
this.loadRelatedList(sortingParams).then(
|
|
function(data){
|
|
aDeferred.resolve(data);
|
|
},
|
|
|
|
function(textStatus, errorThrown){
|
|
aDeferred.reject(textStatus, errorThrown);
|
|
}
|
|
);
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
/**
|
|
* Function to handle next page navigation
|
|
*/
|
|
nextPageHandler : function(){
|
|
var aDeferred = jQuery.Deferred();
|
|
var thisInstance = this;
|
|
var pageLimit = jQuery('#pageLimit').val();
|
|
var noOfEntries = jQuery('#noOfEntries').val();
|
|
if(noOfEntries == pageLimit){
|
|
var pageNumber = this.getCurrentPageNum();
|
|
var nextPage = parseInt(pageNumber) + 1;
|
|
var nextPageParams = {
|
|
'page' : nextPage
|
|
}
|
|
this.loadRelatedList(nextPageParams).then(
|
|
function(data){
|
|
thisInstance.setCurrentPageNumber(nextPage);
|
|
aDeferred.resolve(data);
|
|
},
|
|
|
|
function(textStatus, errorThrown){
|
|
aDeferred.reject(textStatus, errorThrown);
|
|
}
|
|
);
|
|
}
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
/**
|
|
* Function to handle next page navigation
|
|
*/
|
|
previousPageHandler : function(){
|
|
var aDeferred = jQuery.Deferred();
|
|
var thisInstance = this;
|
|
var aDeferred = jQuery.Deferred();
|
|
var pageNumber = this.getCurrentPageNum();
|
|
if(pageNumber > 1){
|
|
var previousPage = parseInt(pageNumber) - 1;
|
|
var previousPageParams = {
|
|
'page' : previousPage
|
|
}
|
|
this.loadRelatedList(previousPageParams).then(
|
|
function(data){
|
|
thisInstance.setCurrentPageNumber(previousPage);
|
|
aDeferred.resolve(data);
|
|
},
|
|
|
|
function(textStatus, errorThrown){
|
|
aDeferred.reject(textStatus, errorThrown);
|
|
}
|
|
);
|
|
}
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
/**
|
|
* Function to handle page jump in related list
|
|
*/
|
|
pageJumpHandler : function(e){
|
|
var aDeferred = jQuery.Deferred();
|
|
var thisInstance = this;
|
|
if(e.which == 13){
|
|
var element = jQuery(e.currentTarget);
|
|
var response = Vtiger_WholeNumberGreaterThanZero_Validator_Js.invokeValidation(element);
|
|
if(typeof response != "undefined"){
|
|
element.validationEngine('showPrompt',response,'',"topLeft",true);
|
|
e.preventDefault();
|
|
} else {
|
|
element.validationEngine('hideAll');
|
|
var jumpToPage = parseInt(element.val());
|
|
var totalPages = parseInt(jQuery('#totalPageCount').text());
|
|
if(jumpToPage > totalPages){
|
|
var error = app.vtranslate('JS_PAGE_NOT_EXIST');
|
|
element.validationEngine('showPrompt',error,'',"topLeft",true);
|
|
}
|
|
var invalidFields = element.parent().find('.formError');
|
|
if(invalidFields.length < 1){
|
|
var currentPage = jQuery('input[name="currentPageNum"]').val();
|
|
if(jumpToPage == currentPage){
|
|
var message = app.vtranslate('JS_YOU_ARE_IN_PAGE_NUMBER')+" "+jumpToPage;
|
|
var params = {
|
|
text: message,
|
|
type: 'info'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
e.preventDefault();
|
|
return false;
|
|
}
|
|
var jumptoPageParams = {
|
|
'page' : jumpToPage
|
|
}
|
|
this.loadRelatedList(jumptoPageParams).then(
|
|
function(data){
|
|
thisInstance.setCurrentPageNumber(jumpToPage);
|
|
aDeferred.resolve(data);
|
|
},
|
|
|
|
function(textStatus, errorThrown){
|
|
aDeferred.reject(textStatus, errorThrown);
|
|
}
|
|
);
|
|
} else {
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
return aDeferred.promise();
|
|
},
|
|
/**
|
|
* Function to add related record for the module
|
|
*/
|
|
addRelatedRecord : function(element , callback){
|
|
var aDeferred = jQuery.Deferred();
|
|
var thisInstance = this;
|
|
var referenceModuleName = this.relatedModulename;
|
|
var parentId = this.getParentId();
|
|
var parentModule = this.parentModuleName;
|
|
var quickCreateParams = {};
|
|
var relatedParams = {};
|
|
var relatedField = element.data('name');
|
|
var fullFormUrl = element.data('url');
|
|
relatedParams[relatedField] = parentId;
|
|
var eliminatedKeys = new Array('view', 'module', 'mode', 'action');
|
|
|
|
var preQuickCreateSave = function(data){
|
|
|
|
var index,queryParam,queryParamComponents;
|
|
|
|
//To handle switch to task tab when click on add task from related list of activities
|
|
//As this is leading to events tab intially even clicked on add task
|
|
if(typeof fullFormUrl != 'undefined' && fullFormUrl.indexOf('?')!== -1) {
|
|
var urlSplit = fullFormUrl.split('?');
|
|
var queryString = urlSplit[1];
|
|
var queryParameters = queryString.split('&');
|
|
for(index=0; index<queryParameters.length; index++) {
|
|
queryParam = queryParameters[index];
|
|
queryParamComponents = queryParam.split('=');
|
|
if(queryParamComponents[0] == 'mode' && queryParamComponents[1] == 'Calendar'){
|
|
data.find('a[data-tab-name="Task"]').trigger('click');
|
|
}
|
|
}
|
|
}
|
|
jQuery('<input type="hidden" name="sourceModule" value="'+parentModule+'" />').appendTo(data);
|
|
jQuery('<input type="hidden" name="sourceRecord" value="'+parentId+'" />').appendTo(data);
|
|
jQuery('<input type="hidden" name="relationOperation" value="true" />').appendTo(data);
|
|
|
|
if(typeof relatedField != "undefined"){
|
|
var field = data.find('[name="'+relatedField+'"]');
|
|
//If their is no element with the relatedField name,we are adding hidden element with
|
|
//name as relatedField name,for saving of record with relation to parent record
|
|
if(field.length == 0){
|
|
jQuery('<input type="hidden" name="'+relatedField+'" value="'+parentId+'" />').appendTo(data);
|
|
}
|
|
}
|
|
for(index=0; index<queryParameters.length; index++) {
|
|
queryParam = queryParameters[index];
|
|
queryParamComponents = queryParam.split('=');
|
|
if(jQuery.inArray(queryParamComponents[0], eliminatedKeys) == '-1' && data.find('[name="'+queryParamComponents[0]+'"]').length == 0) {
|
|
jQuery('<input type="hidden" name="'+queryParamComponents[0]+'" value="'+queryParamComponents[1]+'" />').appendTo(data);
|
|
}
|
|
}
|
|
if(typeof callback !== 'undefined') {
|
|
callback();
|
|
}
|
|
}
|
|
var postQuickCreateSave = function(data) {
|
|
thisInstance.loadRelatedList().then(
|
|
function(data){
|
|
aDeferred.resolve(data);
|
|
})
|
|
}
|
|
|
|
//If url contains params then seperate them and make them as relatedParams
|
|
if(typeof fullFormUrl != 'undefined' && fullFormUrl.indexOf('?')!== -1) {
|
|
var urlSplit = fullFormUrl.split('?');
|
|
var queryString = urlSplit[1];
|
|
var queryParameters = queryString.split('&');
|
|
for(var index=0; index<queryParameters.length; index++) {
|
|
var queryParam = queryParameters[index];
|
|
var queryParamComponents = queryParam.split('=');
|
|
if(jQuery.inArray(queryParamComponents[0], eliminatedKeys) == '-1') {
|
|
relatedParams[queryParamComponents[0]] = queryParamComponents[1];
|
|
}
|
|
}
|
|
}
|
|
|
|
quickCreateParams['data'] = relatedParams;
|
|
quickCreateParams['callbackFunction'] = postQuickCreateSave;
|
|
quickCreateParams['callbackPostShown'] = preQuickCreateSave;
|
|
quickCreateParams['noCache'] = true;
|
|
var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]');
|
|
if(quickCreateNode.length <= 0) {
|
|
Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED'))
|
|
}
|
|
quickCreateNode.trigger('click',quickCreateParams);
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
getRelatedPageCount : function(){
|
|
var aDeferred = jQuery.Deferred();
|
|
var params = {};
|
|
params['action'] = "RelationAjax";
|
|
params['module'] = this.parentModuleName;
|
|
params['record'] = this.getParentId(),
|
|
params['relatedModule'] = this.relatedModulename,
|
|
params['tab_label'] = this.selectedRelatedTabElement.data('label-key');
|
|
params['mode'] = "getRelatedListPageCount"
|
|
|
|
var element = jQuery('#totalPageCount');
|
|
var totalCountElem = jQuery('#totalCount');
|
|
var totalPageNumber = element.text();
|
|
if(totalPageNumber == ""){
|
|
element.progressIndicator({});
|
|
AppConnector.request(params).then(
|
|
function(data) {
|
|
var pageCount = data['result']['page'];
|
|
var numberOfRecords = data['result']['numberOfRecords'];
|
|
totalCountElem.val(numberOfRecords);
|
|
element.text(pageCount);
|
|
element.progressIndicator({'mode': 'hide'});
|
|
aDeferred.resolve();
|
|
},
|
|
function(error,err){
|
|
|
|
}
|
|
);
|
|
}else{
|
|
aDeferred.resolve();
|
|
}
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
addFollowupEvent : function(e){
|
|
var elem = jQuery(e.currentTarget);
|
|
var recordId = elem.closest('tr').data('id');
|
|
|
|
var url = 'index.php?module=Calendar&view=QuickCreateFollowupAjax&record='+recordId;
|
|
var progressIndicatorInstance = jQuery.progressIndicator({});
|
|
AppConnector.request(url).then(
|
|
function(data){
|
|
if(data){
|
|
progressIndicatorInstance.hide();
|
|
app.showModalWindow(data, function(data){
|
|
var createFollowupForm = data.find('form.followupCreateView');
|
|
createFollowupForm.validationEngine(app.validationEngineOptions);
|
|
app.registerEventForTimeFields(createFollowupForm);
|
|
//Form submit
|
|
createFollowupForm.submit(function(event){
|
|
var createButton = jQuery(this).find('button.btn-success');
|
|
createButton.attr('disabled','disabled');
|
|
progressIndicatorInstance = jQuery.progressIndicator({});
|
|
event.preventDefault();
|
|
var result = createFollowupForm.validationEngine('validate');
|
|
if(!result){
|
|
createButton.removeAttr('disabled');
|
|
progressIndicatorInstance.hide();
|
|
return false;
|
|
}
|
|
var moduleName = jQuery(this).find("[name='module']").val();
|
|
var recordId = jQuery(this).find("[name='record']").val();
|
|
var followupStartDate = jQuery(this).find("[name='followup_date_start']").val();
|
|
var followupStartTime = jQuery(this).find("[name='followup_time_start']").val();
|
|
var action = jQuery(this).find("[name='action']").val();
|
|
var mode = jQuery(this).find("[name='mode']").val();
|
|
var defaultCallDuration = jQuery(this).find("[name='defaultCallDuration']").val();
|
|
var defaultOtherEventDuration = jQuery(this).find("[name='defaultOtherEventDuration']").val();
|
|
var params = {
|
|
module : moduleName,
|
|
action : action,
|
|
mode : mode,
|
|
record : recordId,
|
|
followup_date_start : followupStartDate,
|
|
followup_time_start : followupStartTime,
|
|
defaultCallDuration : defaultCallDuration,
|
|
defaultOtherEventDuration : defaultOtherEventDuration
|
|
}
|
|
AppConnector.request(params).then(function(data){
|
|
app.hideModalWindow();
|
|
progressIndicatorInstance.hide();
|
|
if(data['result'].created){
|
|
//Update related listview and pagination
|
|
Vtiger_Detail_Js.reloadRelatedList();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|
|
else{
|
|
progressIndicatorInstance.hide();
|
|
Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_EDIT_PERMISSION',"Calendar"));
|
|
}
|
|
});
|
|
},
|
|
|
|
markAsCompleted : function(e){
|
|
var elem = jQuery(e.currentTarget);
|
|
var recordId = elem.closest('tr').data('id');
|
|
var message = app.vtranslate('JS_CONFIRM_MARK_AS_HELD');
|
|
Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then(
|
|
function(e) {
|
|
var params = {
|
|
module : "Calendar",
|
|
action : "SaveFollowupAjax",
|
|
mode : "markAsHeldCompleted",
|
|
record : recordId
|
|
}
|
|
AppConnector.request(params).then(function(data){
|
|
if(data['error']){
|
|
var param = {text:app.vtranslate('JS_PERMISSION_DENIED')};
|
|
Vtiger_Helper_Js.showPnotify(param);
|
|
}
|
|
else if(data['result'].valid && data['result'].markedascompleted){
|
|
//Update related listview and pagination
|
|
Vtiger_Detail_Js.reloadRelatedList();
|
|
if(data['result'].activitytype == 'Task')
|
|
var param = {text:app.vtranslate('JS_TODO_MARKED_AS_COMPLETED')};
|
|
else
|
|
var param = {text:app.vtranslate('JS_EVENT_MARKED_AS_HELD')};
|
|
Vtiger_Helper_Js.showMessage(param);
|
|
}
|
|
else{
|
|
var param = {text:app.vtranslate('JS_FUTURE_EVENT_CANNOT_BE_MARKED_AS_HELD')};
|
|
Vtiger_Helper_Js.showPnotify(param);
|
|
}
|
|
});
|
|
},
|
|
function(error, err){
|
|
return false;
|
|
});
|
|
},
|
|
|
|
init : function(parentId, parentModule, selectedRelatedTabElement, relatedModuleName){
|
|
this.selectedRelatedTabElement = selectedRelatedTabElement,
|
|
this.parentRecordId = parentId;
|
|
this.parentModuleName = parentModule;
|
|
this.relatedModulename = relatedModuleName;
|
|
this.relatedTabsContainer = selectedRelatedTabElement.closest('div.related');
|
|
this.detailViewContainer = this.relatedTabsContainer.closest('div.detailViewContainer');
|
|
this.relatedContentContainer = jQuery('div.contents',this.detailViewContainer);
|
|
Vtiger_Helper_Js.showHorizontalTopScrollBar();
|
|
}
|
|
}) |