晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/layouts/v7/modules/Vtiger/resources/ |
Upload File : |
/*+***********************************************************************************
* 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.
*************************************************************************************/
Vtiger.Class("Vtiger_Detail_Js",{
detailInstance : false,
PreAjaxSaveEvent : 'PreAjaxSaveEvent',
PostAjaxSaveEvent : 'PostAjaxSaveEvent',
getInstance: function(){
if( Vtiger_Detail_Js.detailInstance == false ){
var module = app.getModuleName();
var view = app.view;
var moduleClassName = module+"_"+view+"_Js";
var fallbackClassName = Vtiger_Detail_Js;
if(typeof window[moduleClassName] != 'undefined'){
var instance = new window[moduleClassName]();
}else{
var instance = new fallbackClassName();
}
Vtiger_Detail_Js.detailInstance = instance;
}
return Vtiger_Detail_Js.detailInstance;
},
getInstanceByModuleName : function(moduleName){
if(typeof moduleName == "undefined"){
moduleName = app.getModuleName();
}
var parentModule = app.getParentModuleName();
if(parentModule == 'Settings'){
var moduleClassName = parentModule+"_"+moduleName+"_Detail_Js";
if(typeof window[moduleClassName] == 'undefined'){
moduleClassName = moduleName+"_Detail_Js";
}
var fallbackClassName = parentModule+"_Vtiger_Detail_Js";
if(typeof window[fallbackClassName] == 'undefined') {
fallbackClassName = "Vtiger_Detail_Js";
}
} else {
moduleClassName = moduleName+"_Detail_Js";
fallbackClassName = "Vtiger_Detail_Js";
}
if(typeof window[moduleClassName] != 'undefined'){
var instance = new window[moduleClassName]();
}else{
var instance = new window[fallbackClassName]();
}
return instance;
},
triggerSendSms: function(detailActionUrl, module) {
var self = this.getInstance();
self.sendSMS(detailActionUrl,module);
},
deleteRelatedActivity : function(e) {
var thisInstance = this;
var currentElement = jQuery(e.currentTarget);
var id = currentElement.data('id');
var recurringEnabled = currentElement.data('recurringEnabled');
var postData = {'related_record_list' : [id]};
if(recurringEnabled) {
app.helper.showConfirmationForRepeatEvents().then(function(params) {
jQuery.extend(postData, params);
thisInstance.deleteActivityRelation(postData);
},
function(error, err) {
});
} else {
var message = app.vtranslate('JS_LBL_ARE_YOU_SURE_YOU_WANT_TO_DELETE');
app.helper.showConfirmationBox({'message' : message}).then(function(data) {
thisInstance.deleteActivityRelation(postData);
},
function(error,err) {
});
}
},
deleteActivityRelation : function(customParams) {
var params = {
'module' : app.getModuleName(),
'related_module' : 'Calendar',
'action' : 'RelationAjax',
'mode' : 'deleteRelation',
'src_record' : jQuery('#recordId').val()
};
params = jQuery.extend(params, customParams);
app.request.post({data: params}).then(function(err, data) {
if(data) {
params = {
'record' : jQuery('#recordId').val(),
'view' : 'Detail',
'module' : app.getModuleName(),
'mode' : 'getActivities'
};
app.request.get({data: params}).then(function(err, result) {
jQuery('#relatedActivities').html(result);
Vtiger_Detail_Js.getInstance().registerEventForActivityWidget();
});
}
});
},
showUpdates : function(element){
jQuery(".historyButtons").find("button").removeAttr("disabled").removeClass("btn-success");
var currentElement = jQuery(element);
currentElement.attr("disabled","disabled").addClass("btn-success");
var params = [];
var recordId = jQuery('#recordId').val();
params.url = "index.php?view=Detail&module="+app.getModuleName()+"&mode=showRecentActivities&record="+recordId;
app.helper.showProgress();
app.request.get(params).then(function(error,response){
app.helper.hideProgress();
jQuery(".HistoryContainer").find(".data-body").html(response);
});
},
checkSMSStatus: function(url) {
app.request.post({url: url}).then(
function(err, data) {
var status = data['status'];
if(status == 'Failed'){
var message = data['message'];
app.helper.showErrorNotification({title: status, message: message});
}
else if (status == null) {
app.helper.showErrorNotification({title: 'Error', message: 'Failed to send SMS.'});
}
else {
var message = data['message'];
app.helper.showErrorNotification({title:status, message:message});
}
});
},
/*
* function to trigger delete record action
* @params: delete record url.
*/
deleteRecord : function(deleteRecordActionUrl) {
var detailInstance = window.app.controller();
detailInstance.remove(deleteRecordActionUrl);
},
/**
* Function to trigger Transfer Ownership
* @param {type} massActionUrl
* @returns {undefined}
*/
triggerTransferOwnership : function(massActionUrl){
var thisInstance = this;
var params = app.convertUrlToDataParams(massActionUrl);
app.helper.showProgress();
app.request.post({data:params}).then(
function(error, data) {
app.helper.hideProgress();
app.helper.showModal(data);
var form = jQuery('form#changeOwner');
var isFormExists = form.length;
if(isFormExists){
thisInstance.transferOwnershipSave(form);
}
}
);
},
/**
* Saving transfer ownership
* @param {type} form
* @returns {undefined}
*/
transferOwnershipSave : function (form){
form.on("click","button[name='saveButton']",function(e){
e.preventDefault();
var rules = {};
rules["related_modules"] = {'required' : true};
rules["transferOwnerId"] = {'required' : true};
var params = {
rules : rules,
submitHandler: function(form) {
// to Prevent submit if already submitted
jQuery(form).find("button[name='saveButton']").attr("disabled","disabled");
if(this.numberOfInvalids() > 0) {
return false;
}
var transferOwner = jQuery('#transferOwnerId').val();
var relatedModules = jQuery('#related_modules').val();
var recordId = jQuery('#recordId').val();
var reqParams = {
'module': app.getModuleName(),
'action' : 'TransferOwnership',
'record':recordId,
'transferOwnerId' : transferOwner,
'related_modules' : relatedModules
};
app.request.post({data:reqParams}).then(
function(error,data) {
if(error === null){
jQuery('.vt-notification').remove();
app.helper.hideModal();
app.helper.showSuccessNotification({message:app.vtranslate('JS_RECORDS_TRANSFERRED_SUCCESSFULLY')});
} else {
app.event.trigger('post.save.failed', error);
jQuery(form).find("button[name='saveButton']").removeAttr('disabled');
}
}
);
}
};
validateAndSubmitForm(form,params);
});
},
/*
* function to trigger send Email
* @params: send email url , module name.
*/
triggerSendEmail : function(detailActionUrl, module){
var currentInstance = window.app.controller();
var parentRecord = new Array();
var params = {};
parentRecord.push(currentInstance.getRecordId());
var urlParams = app.convertUrlToDataParams(detailActionUrl);
urlParams['selected_ids'] = parentRecord;
Vtiger_Index_Js.showComposeEmailPopup(urlParams);
},
/**
* Function to show the content of a file in an iframe
* @param {type} e
* @param {type} recordId
* @returns {undefined}
*/
previewFile: function (e, recordId,attachmentId) {
Vtiger_Index_Js.previewFile(e, recordId,attachmentId);
}
},{
detailViewSummaryTabLabel : 'LBL_RECORD_SUMMARY',
detailViewDetailTabLabel : 'LBL_RECORD_DETAILS',
detailViewHistoryTabLabel : 'LBL_HISTORY',
detailViewRecentCommentsTabLabel : 'ModComments',
detailViewRecentActivitiesTabLabel : 'Activities',
detailViewRecentDocumentsLabel : 'Documents',
widgetPostLoad : 'Vtiger.Widget.PostLoad',
_moduleName : false,
targetPicklistChange : false,
targetPicklist : false,
sourcePicklistname : false,
getModuleName : function() {
if(this._moduleName != false){
return this._moduleName;
}
return app.module();
},
setModuleName : function(module){
this._moduleName = module;
return this;
},
registerOverlayEditEvents: function(module, container) {
var editInstance = Vtiger_Edit_Js.getInstanceByModuleName(module);
editInstance.setModuleName(module);
var editContainer = container.find('.overlayEdit');
editInstance.setEditViewContainer(editContainer);
editInstance.registerEvents(false);
},
setContentHolder: function(container){
this.detailViewContentHolder = container;
},
overlayMode: false,
setOverlayDetailMode: function(option){
this.overlayMode = option;
},
getOverlayDetailMode: function(){
return this.overlayMode;
},
registerRelatedRecordSave: function(){
var thisInstance = this;
app.event.on('post.overLayEditView.loaded',function(e, container){
jQuery('#EditView').vtValidate({
submitHandler : function(form){
window.onbeforeunload = null;
var e = jQuery.Event(Vtiger_Edit_Js.recordPresaveEvent);
app.event.trigger(e);
if(e.isDefaultPrevented()) {
return false;
}
var formData = new FormData(form);
var postParams = {
data: formData,
contentType: false,
processData: false
};
app.helper.showProgress();
app.request.post(postParams).then(function(err,data){
app.helper.hideProgress();
if (err === null) {
jQuery('.vt-notification').remove();
app.helper.hidePageContentOverlay();
var relatedModuleName = formData.module;
if(relatedModuleName == 'Events') {
relatedModuleName = 'Calendar';
}
var relatedController = thisInstance.getRelatedController(relatedModuleName);
relatedController.loadRelatedList();
} else {
app.event.trigger('post.save.failed', err);
}
});
return false;
}
});
jQuery('#EditView').find('.saveButton').on('click', function(e){
window.onbeforeunload = null;
});
});
},
referenceFieldNames : {
'Accounts' : 'parent_id',
'Contacts' : 'contact_id',
'Leads' : 'parent_id',
'Potentials' : 'parent_id',
'HelpDesk' : 'parent_id',
'Project' : 'projectid'
},
init : function() {
this.addComponents();
},
addComponents : function() {
var emailPreviewClassName = 'Vtiger_EmailPreview_Js';
this.addIndexComponent();
this.addComponent(emailPreviewClassName);
this.addComponent('Vtiger_Tag_Js');
},
addIndexComponent : function() {
this.addModuleSpecificComponent('Index','Vtiger',app.getParentModuleName());
},
/**
* Function which will give the detail view form
* @return : jQuery element
*/
detailViewForm : false,
getForm : function() {
if(this.detailViewForm == false) {
this.detailViewForm = jQuery('#detailView');
}
return this.detailViewForm;
},
detailViewContainer : false,
getDetailViewContainer : function(){
if(this.detailViewContainer === false){
this.detailViewContainer = jQuery('.detailViewContainer');
}
return this.detailViewContainer;
},
setDetailViewContainer : function(container){
this.detailViewContainer = container;
},
detailViewContentHolder : false,
getContentHolder : function() {
if(this.detailViewContentHolder == false) {
this.detailViewContentHolder = jQuery('div.details');
}
return this.detailViewContentHolder;
},
/**
* Function to load related list
*/
loadRelatedListRecords : function(urlParams) {
var self = this;
var aDeferred = jQuery.Deferred();
var defParams = self.getDefaultParams();
urlParams = jQuery.extend(defParams, urlParams);
app.helper.showProgress();
app.request.get({data:urlParams}).then(function(err, res){
aDeferred.resolve(res);
var container = jQuery('.relatedContainer');
container.html(res);
app.helper.hideProgress();
app.event.trigger("post.relatedListLoad.click",container.find(".searchRow"));
});
return aDeferred.promise();
},
sendSMS: function(detailActionUrl, module){
var self = this;
app.helper.checkServerConfig(module).then(function(data) {
if (data == true) {
var cb = function(container) {
$('#phoneFormatWarningPop').popover();
}
self.sendSMSAction(detailActionUrl, cb);
} else {
app.helper.showAlertBox({message:app.vtranslate('JS_SMS_SERVER_CONFIGURATION')})
}
});
},
sendSMSAction: function(detailActionUrl, callBackFunction) {
var self = this;
var selectedIds = new Array();
selectedIds.push(self.getRecordId());
var postData = {
"selected_ids": JSON.stringify(selectedIds)
};
app.request.post({url:detailActionUrl, data:postData, dataType:"html"}).then(
function(err, data) {
if (data) {
app.helper.showModal(data);
if (typeof callBackFunction == 'function') {
callBackFunction(data);
}
}
});
},
/**
* Function to fetch default params
*/
getDefaultParams : function() {
var module = app.module();
var activeModule = jQuery(".related-tabs li.active");
var relatedModule = activeModule.attr("data-module")
var label = activeModule.attr("data-label-key");
var relationId = activeModule.attr("data-relation-id");
var orderBy = jQuery('#orderBy').val();
var sortOrder = jQuery("#sortOrder").val();
var pageNumber = jQuery('#pageNumber').val();
var recordId = jQuery('#recordId').val();
var params = {
'module': module,
'relatedModule': relatedModule,
'view' : "Detail",
'record' : recordId,
'page' : pageNumber,
'mode' : 'showRelatedList',
'relationId' : relationId,
'tab_label' : label,
'orderby' : orderBy,
'sortorder' : sortOrder
};
params.search_params = JSON.stringify(this.getRelatedListSearchParams());
params.nolistcache = (jQuery('#noFilterCache').val() == 1) ? 1 : 0;
return params;
},
/**
* Function to fetch search params
*/
getRelatedListSearchParams : function() {
var detailViewContainer = this.getDetailViewContainer();
var relatedListTable = detailViewContainer.find('.searchRow');
var searchParams = [];
var currentSearchParams = [];
if(jQuery('#currentSearchParams').val()) {
currentSearchParams = JSON.parse(jQuery('#currentSearchParams').val());
}
relatedListTable.find('.listSearchContributor').each(function(index,domElement){
var searchInfo = [];
var searchContributorElement = jQuery(domElement);
var fieldName = searchContributorElement.attr('name');
var fieldInfo = related_uimeta.field.get(fieldName);
if(fieldName in currentSearchParams) {
delete currentSearchParams[fieldName];
}
var searchValue = searchContributorElement.val();
if(typeof searchValue == "object") {
if(searchValue == null) {
searchValue = "";
}else{
searchValue = searchValue.join(',');
}
}
searchValue = searchValue.trim();
if(searchValue.length <=0 ) {
//continue
return true;
}
var searchOperator = 'c';
if(fieldInfo.type == "date" || fieldInfo.type == "datetime") {
searchOperator = 'bw';
}else if (fieldInfo.type == 'percentage' || fieldInfo.type == "double" || fieldInfo.type == "integer"
|| fieldInfo.type == 'currency' || fieldInfo.type == "number" || fieldInfo.type == "boolean" ||
fieldInfo.type == "picklist") {
searchOperator = 'e';
}
var storedOperator = searchContributorElement.parent().parent().find('.operatorValue').val();
if(storedOperator) {
searchOperator = storedOperator;
storedOperator = false;
}
searchInfo.push(fieldName);
searchInfo.push(searchOperator);
searchInfo.push(searchValue);
searchInfo.push(fieldInfo.type);
searchParams.push(searchInfo);
});
for(var i in currentSearchParams) {
var fieldName = currentSearchParams[i]['fieldName'];
var searchValue = currentSearchParams[i]['searchValue'];
var searchOperator = currentSearchParams[i]['comparator'];
if(fieldName== null || fieldName.length <=0 ){
continue;
}
var searchInfo = [];
searchInfo.push(fieldName);
searchInfo.push(searchOperator);
searchInfo.push(searchValue);
searchParams.push(searchInfo);
}
var params = [];
params.push(searchParams);
return params;
},
getTabContainer : function(){
return jQuery('div.related-tabs');
},
getRecordId : function(){
return app.getRecordId();
},
getRelatedTabs : function() {
return this.getTabContainer().find('li');
},
deSelectAllrelatedTabs : function() {
this.getRelatedTabs().removeClass('active');
},
markRelatedTabAsSelected : function(tabElement){
tabElement.addClass('active');
},
/*
* Function to register the submit event for Send Sms
*/
registerSendSmsSubmitEvent: function() {
var thisInstance = this;
jQuery('body').on('submit', '#massSave', function(e) {
var form = jQuery(e.currentTarget);
form.vtValidate({onsubmit : false});
if(!form.valid()) {
return false;
}
var smsTextLength = form.find('#message').val().length;
if (smsTextLength > 160) {
app.helper.showErrorNotification({message:app.vtranslate('LBL_SMS_MAX_CHARACTERS_ALLOWED')});
return false;
}
var submitButton = form.find(':submit');
submitButton.attr('disabled', 'disabled');
thisInstance.SendSmsSave(form);
e.preventDefault();
});
},
/*
* Function to Save and sending the Sms and hide the modal window of send sms
*/
SendSmsSave: function(form) {
app.helper.showProgress();
var formData = form.serializeFormData();
app.request.post({data: formData}).then(
function(err, data) {
app.helper.hideProgress();
app.helper.hideModal();
if(err){
app.helper.showErrorNotification({message:app.vtranslate('JS_PHONEFORMAT_ERROR')});
return;
}
var statusDetails = data.statusdetails;
var status = statusDetails.status;
if(status == 'Failed') {
var errorMsg = statusDetails.statusmessage+'<br>'+app.vtranslate('JS_PHONEFORMAT_ERROR');
app.helper.showErrorNotification({'title' : status, 'message' : errorMsg});
} else {
var msg = statusDetails.statusmessage;
app.helper.showSuccessNotification({'title' : status, 'message' : msg});
}
}
);
},
/**
* To load Related List Contents
* @returns {undefined}
*/
registerEventForRelatedTabClick : function(){
var self = this;
var detailViewContainer = this.getDetailViewContainer();
jQuery('.related-tabs', detailViewContainer).on('click', 'li.tab-item a', function(e, urlAttributes) {
e.preventDefault();
});
jQuery('.related-tabs', detailViewContainer).on('click', 'li.more-tab a', function(e, urlAttributes) {
e.preventDefault();
});
jQuery('.related-tabs', detailViewContainer).on('click', 'li.more-tab', function(e,urlAttributes){
if(jQuery('.moreTabElement').length != 0){
jQuery('.moreTabElement').remove();
}
var moreTabElement = jQuery(e.currentTarget).clone();
moreTabElement.find('.content').text('');
moreTabElement.addClass('moreTabElement');
moreTabElement.addClass('active');
var moreElementTitle = moreTabElement.find('a').attr('displaylabel')
moreTabElement.attr('title',moreElementTitle);
moreTabElement.find('.tab-icon').removeClass('textOverflowEllipsis');
jQuery('.related-tab-more-element').before(moreTabElement);
self.loadSelectedTabContents(moreTabElement, urlAttributes);
self.registerQtipevent(moreTabElement);
});
jQuery('.related-tabs', detailViewContainer).on('click', 'li.tab-item', function(e,urlAttributes){
var tabElement = jQuery(e.currentTarget);
self.loadSelectedTabContents(tabElement, urlAttributes);
});
},
loadSelectedTabContents: function(tabElement, urlAttributes){
var self = this;
var detailViewContainer = this.getDetailViewContainer();
var url = tabElement.data('url');
self.loadContents(url,urlAttributes).then(function(data){
self.deSelectAllrelatedTabs();
self.markRelatedTabAsSelected(tabElement);
var container = jQuery('.relatedContainer');
app.event.trigger("post.relatedListLoad.click",container.find(".searchRow"));
// Added this to register pagination events in related list
var relatedModuleInstance = self.getRelatedController();
//Summary tab is clicked
if(tabElement.data('linkKey') == self.detailViewSummaryTabLabel) {
self.registerSummaryViewContainerEvents(detailViewContainer);
self.registerEventForPicklistDependencySetup(self.getForm());
}
//Detail tab is clicked
if(tabElement.data('linkKey') == self.detailViewDetailTabLabel) {
self.registerEventForPicklistDependencySetup(self.getForm());
}
// Registering engagement events if clicked tab is History
if(tabElement.data('labelKey') == self.detailViewHistoryTabLabel){
var engagementsContainer = jQuery(".engagementsContainer");
if(engagementsContainer.length > 0){
app.event.trigger("post.engagements.load");
}
}
relatedModuleInstance.initializePaginationEvents();
//prevent detail view ajax form submissions
jQuery('form#detailView').on('submit', function(e) {
e.preventDefault();
});
});
},
registerRollupCommentsSwitchEvent : function() {
var self = this;
var commentsRelatedContainer = jQuery('.commentsRelatedContainer');
if(jQuery('#rollupcomments').length > 0 && commentsRelatedContainer.length) {
app.helper.hideProgress();
commentsRelatedContainer.off('switchChange.bootstrapSwitch')
.on('switchChange.bootstrapSwitch','#rollupcomments', function(e){
app.helper.showProgress();
self.toggleRollupComments(e);
});
if(jQuery('#rollupcomments').attr('rollup-status') == 1) {
jQuery('#rollupcomments').bootstrapSwitch('state', true, true);
}else{
jQuery('#rollupcomments').bootstrapSwitch('state', false, true);
}
}
},
/**
* To handle related record delete confirmation message
*/
getDeleteMessageKey : function() {
return 'LBL_DELETE_CONFIRMATION';
},
/**
* Funtion to register Related List Events
* @returns {undefined}
*/
registerEventsForRelatedList : function(){
var self = this;
var detailContentsHolder = this.getContentHolder();
this.registerRelatedRecordEdit();
this.registerEventForRelatedTabClick();
this.registerRelatedListSearch();
this.registerRelatedListSort();
this.registerRemoveRelatedListSort();
this.registerEventForEmailsRelatedRecord();
this.registerRelatedListPageNavigationEvents();
this.registerEventForAddingRelatedRecord();
this.registerEventForSelectingRelatedRecord();
self.registerScrollForRollupEvents();
app.event.on("post.relatedListLoad.click",function(event, container){
vtUtils.applyFieldElementsView(container);
vtUtils.enableTooltips();
var vtigerInstance = Vtiger_Index_Js.getInstance();
vtigerInstance.registerMultiUpload();
//For Rollup Comments
self.registerRollupCommentsSwitchEvent();
//END
});
var vtigerInstance = Vtiger_Index_Js.getInstance();
vtigerInstance.registerMultiUpload();
detailContentsHolder.on('click', 'a.relationDelete', function(e){
e.stopImmediatePropagation();
var element = jQuery(e.currentTarget);
var key = self.getDeleteMessageKey();
var message = app.vtranslate(key);
var relatedModuleName = self.getRelatedModuleName();
var row = element.closest('tr');
var relatedRecordid = row.data('id');
var relatedController = self.getRelatedController();
if(relatedController){
if(relatedModuleName == 'Calendar' && row.data('recurringEnabled')) {
app.helper.showConfirmationForRepeatEvents().then(function(customParams) {
relatedController.deleteRelation([relatedRecordid], customParams).then(function(response){
relatedController.loadRelatedList().then(function() {
relatedController.triggerRelationAdditionalActions();
});
});
},
function(error, err) {
});
} else {
app.helper.showConfirmationBox({'message' : message}).then(
function(e) {
if(relatedModuleName == 'Emails') {
var parentId = row.find('.parentId').data('parent-id');
if(typeof parentId != 'undefined')
relatedController.parentId = parentId;
}
relatedController.deleteRelation([relatedRecordid]).then(function(response){
relatedController.loadRelatedList().then(function() {
relatedController.triggerRelationAdditionalActions();
});
});
},
function(error, err){
}
);
}
}
});
},
registerEventForEmailsRelatedRecord : function(){
var detailContentsHolder = this.getContentHolder();
var parentId = this.getRecordId();
var params = {};
params['module'] = "Emails";
params['view'] = "ComposeEmail";
params['parentId'] = parentId;
params['relatedLoad'] = true;
detailContentsHolder.on('click','[name="emailsRelatedRecord"], [name="emailsDetailView"]',function(e){
e.stopPropagation();
var element = jQuery(e.currentTarget);
var recordId = element.data('id');
if(element.data('emailflag') == 'SAVED') {
var mode = 'emailEdit';
} else {
mode = 'emailPreview';
params['parentModule'] = app.getModuleName();
}
params['mode'] = mode;
params['record'] = recordId;
app.helper.showProgress();
app.request.post({data:params}).then(function(err,data){
app.helper.hideProgress();
if(err === null){
var dataObj = jQuery(data);
var descriptionContent = dataObj.find('#iframeDescription').val();
app.helper.showModal(data,{cb:function(){
if(mode === 'emailEdit'){
var editInstance = new Emails_MassEdit_Js();
editInstance.registerEvents();
}else {
app.event.trigger('post.EmailPreview.load',null);
}
jQuery('#emailPreviewIframe').contents().find('html').html(descriptionContent);
jQuery("#emailPreviewIframe").height(jQuery('.email-body-preview').height());
jQuery('#emailPreviewIframe').contents().find('html').find('a').on('click', function(e) {
e.preventDefault();
var url = jQuery(e.currentTarget).attr('href');
window.open(url, '_blank');
});
//jQuery("#emailPreviewIframe").height(jQuery('#emailPreviewIframe').contents().find('html').height());
}});
}
});
})
detailContentsHolder.on('click','[name="emailsEditView"]',function(e){
e.stopPropagation();
var module = "Emails";
app.helper.checkServerConfig(module).then(function(data){
if(data == true){
var element = jQuery(e.currentTarget);
var closestROw = element.closest('tr');
var recordId = closestROw.data('id');
var parentRecord = new Array();
parentRecord.push(parentId);
params['mode'] = "emailEdit";
params['record'] = recordId;
params['selected_ids'] = parentRecord;
app.helper.showProgress();
app.request.post({'data':params}).then(function(err,data){
app.helper.hideProgress();
if(err === null){
app.helper.showModal(data);
var editInstance = new Emails_MassEdit_Js();
editInstance.registerEvents();
}
});
} else {
app.helper.showErrorMessage(app.vtranslate('JS_EMAIL_SERVER_CONFIGURATION'));
}
})
})
},
/**
* To Delete Record from detail View
* @param {type} deleteRecordActionUrl
* @returns {undefined}
*/
remove : function(deleteRecordActionUrl){
var message = app.vtranslate('LBL_DELETE_CONFIRMATION');
app.helper.showConfirmationBox({'message' : message}).then(function(data) {
var params = app.convertUrlToDataParams(deleteRecordActionUrl+"&ajaxDelete=true");
app.request.post({data:params}).then(
function(err,data){
if(err === null){
if(typeof data !== 'object'){
var appName = app.getAppName();
window.location.href = data+'&app='+appName;
}else {
app.helper.showAlertBox({'message' : data.prototype.message});
}
} else {
app.helper.showAlertBox({'message' : err});
}
});
}
);
},
/**
* Function to register the related list search event
*/
registerRelatedListSearch : function() {
var thisInstance = this;
var detailViewContainer = thisInstance.getDetailViewContainer();
detailViewContainer.on('click','[data-trigger="relatedListSearch"]',function(e){
var params = {'page' : '1'};
thisInstance.getRelatedController().loadRelatedList(params);
});
detailViewContainer.on('keypress','input.listSearchContributor',function(e){
if(e.keyCode == 13){
var element = jQuery(e.currentTarget);
var parentElement = element.closest('tr');
var searchTriggerElement = parentElement.find('[data-trigger="relatedListSearch"]');
searchTriggerElement.trigger('click');
}
});
},
/**
* Function to register the related list sort event
*/
registerRelatedListSort : function() {
var thisInstance = this;
var detailViewContainer = thisInstance.getDetailViewContainer();
detailViewContainer.on('click','.listViewContentHeaderValues,.relatedListHeaderValues',function(e){
var fieldName = jQuery(e.currentTarget).attr('data-fieldname');
var sortOrderVal = jQuery(e.currentTarget).attr('data-nextsortorderval');
if(sortOrderVal === 'ASC'){
jQuery('i',e.currentTarget).addClass('fa-sort-asc');
}else{
jQuery('i',e.currentTarget).addClass('fa-sort-desc');
}
jQuery('#sortOrder').val(sortOrderVal);
jQuery('#orderBy').val(fieldName);
var params = [];
thisInstance.getRelatedController().loadRelatedList(params);
});
},
/**
* Function to register remove related list sorting
*/
registerRemoveRelatedListSort : function() {
var thisInstance = this;
var detailViewContainer = thisInstance.getDetailViewContainer();
detailViewContainer.on('click','.removeSorting',function(e){
jQuery('#sortOrder').val(null);
jQuery('#orderBy').val(null);
var params = [];
thisInstance.getRelatedController().loadRelatedList(params);
});
},
/**
* Function to register Related List View Pagination
* @returns {undefined}
*/
registerRelatedListPageNavigationEvents : function(){
var thisInstance = this;
var detailViewContainer = thisInstance.getDetailViewContainer();
var urlParams = {};
detailViewContainer.on('click','#listViewNextPageButton',function(e){
var pageLimit = jQuery('#pageLimit').val();
var noOfEntries = jQuery('#noOfEntries').val();
var nextPageExist = jQuery('#nextPageExist').val();
if(noOfEntries == pageLimit && nextPageExist){
var pageNumber = jQuery('#pageNumber').val();
var nextPageNumber = parseInt(parseFloat(pageNumber)) + 1;
jQuery('#pageNumber').val(nextPageNumber);
var params = [];
thisInstance.loadRelatedListRecords(params);
}
});
detailViewContainer.on('click','#listViewPreviousPageButton',function(e){
var pageNumber = jQuery('#pageNumber').val();
if(pageNumber > 1){
var previousPageNumber = parseInt(parseFloat(pageNumber)) - 1;
jQuery('#pageNumber').val(previousPageNumber);
var params = [];
thisInstance.loadRelatedListRecords(params);
}
});
},
/**
* Function to register event for adding related record for module
*/
registerEventForAddingRelatedRecord : function(){
var thisInstance = this;
var detailViewContainer = thisInstance.getDetailViewContainer();
detailViewContainer.on('click','[name="addButton"]',function(e){
var element = jQuery(e.currentTarget);
var relatedModuleName = element.attr('module');
var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ relatedModuleName +'"]');
if(quickCreateNode.length <= 0) {
window.location.href = element.data('url');
return;
}
var relatedController = thisInstance.getRelatedController(relatedModuleName);
if(relatedController){
relatedController.addRelatedRecord(element);
}
})
},
/**
* Function to register event for selecting related record for module
*/
registerEventForSelectingRelatedRecord : function() {
var thisInstance = this;
var detailViewContainer = thisInstance.getDetailViewContainer();
detailViewContainer.on('click', 'button.selectRelation', function(e){
var relatedController = thisInstance.getRelatedController();
if(relatedController){
relatedController.showSelectRelationPopup();
}
});
},
getRelatedModuleName : function() {
return jQuery('.relatedModuleName').val();
},
getRelatedController : function(relatedModuleName) {
var thisInstance = this;
var recordId = thisInstance.getRecordId();
var moduleName = app.getModuleName();
var selectedTabElement = thisInstance.getSelectedTab();
if (typeof relatedModuleName == 'undefined') {
var relatedModuleName = thisInstance.getRelatedModuleName();
}
var relatedListClass = 'Vtiger_RelatedList_Js';
if(typeof window[relatedListClass] != 'undefined'){
return Vtiger_RelatedList_Js.getInstance(recordId, moduleName, selectedTabElement, relatedModuleName);
}
return null;
},
getSelectedTab : function() {
var tabContainer = this.getTabContainer();
return tabContainer.find('li.active');
},
/**
* To Register Ajax Edit Event
* @returns {undefined}
*/
registerAjaxEditEvent : function(){
var thisInstance = this;
var detailContentsHolder = this.getContentHolder();
detailContentsHolder.on('click','table.detailview-table td.fieldValue .editAction', function(e) {
var editedLength = jQuery('table.detailview-table td.fieldValue .ajaxEdited').length;
if(editedLength === 0) {
var selection = window.getSelection().toString();
if(selection.length == 0) {
var currentTdElement = jQuery(e.currentTarget).closest('td');
thisInstance.ajaxEditHandling(currentTdElement);
}
}
});
},
/**
* To Save Ajax Edited field
* @param {type} fieldDetailList
* @returns {unresolved}
*/
saveFieldValues : function (fieldDetailList) {
var aDeferred = jQuery.Deferred();
var recordId = this.getRecordId();
var data = {};
if(typeof fieldDetailList != 'undefined'){
data = fieldDetailList;
}
data['record'] = recordId;
data['module'] = this.getModuleName();
data['action'] = 'SaveAjax';
app.request.post({data:data}).then(
function(err, reponseData){
if(err === null){
app.helper.showSuccessNotification({"message":app.vtranslate('JS_RECORD_UPDATED')});
}
aDeferred.resolve(err, reponseData);
}
);
return aDeferred.promise();
},
registerSaveOnEnterEvent: function(editElement) {
editElement.find('.inputElement:not(textarea)').on('keyup', function(e) {
var textArea = editElement.find('textarea');
var ignoreList = ['reference','picklist','multipicklist','owner'];
var fieldType = jQuery(e.target).closest('.ajaxEdited').find('.fieldBasicData').data('type');
if(ignoreList.indexOf(fieldType) !== -1) return;
if(!textArea.length){
(e.keyCode || e.which) === 13 && editElement.find('.inlineAjaxSave').trigger('click');
}
});
},
/**
* Handling Ajax Edit
* @param {type} currentTdElement
* @returns {undefined}
*/
ajaxEditHandling : function(currentTdElement){
var thisInstance = this;
var detailViewValue = jQuery('.value',currentTdElement);
var editElement = jQuery('.edit',currentTdElement);
var fieldBasicData = jQuery('.fieldBasicData', editElement);
var fieldName = fieldBasicData.data('name');
var fieldType = fieldBasicData.data('type');
var value = fieldBasicData.data('displayvalue');
var rawValue = fieldBasicData.data('value');
var self = this;
var fieldElement = jQuery('[name="'+ fieldName +'"]', editElement);
// If Reference field has value, then we are disabling the field by default
if(fieldElement.attr('disabled') == 'disabled' && fieldType != 'reference'){
return;
}
if(editElement.length <= 0) {
return;
}
if(editElement.is(':visible')){
return;
}
if(fieldType === 'multipicklist') {
var multiPicklistFieldName = fieldName.split('[]');
fieldName = multiPicklistFieldName[0];
}
var customHandlingFields = ['owner','ownergroup','picklist','multipicklist','reference','currencyList','text'];
if(jQuery.inArray(fieldType, customHandlingFields) !== -1){
value = rawValue;
}
if(jQuery('.editElement',editElement).length === 0){
var fieldInfo;
if(self.getOverlayDetailMode() == true){
fieldInfo = related_uimeta.field.get(fieldName);
}
else{
fieldInfo = uimeta.field.get(fieldName);
}
if(fieldType == "boolean"){
if(rawValue == 0){
fieldInfo['value'] = "No";
}
else{
fieldInfo['value'] = "Yes";
}
}
else{
fieldInfo['value'] = value;
}
var fieldObject = Vtiger_Field_Js.getInstance(fieldInfo);
var fieldModel = fieldObject.getUiTypeModel();
var ele = jQuery('<div class="input-group editElement"></div>');
var actionButtons = '<span class="pointerCursorOnHover input-group-addon input-group-addon-save inlineAjaxSave"><i class="fa fa-check"></i></span>';
actionButtons += '<span class="pointerCursorOnHover input-group-addon input-group-addon-cancel inlineAjaxCancel"><i class="fa fa-close"></i></span>';
//wrapping action buttons with class called input-save-wrap
var inlineSaveWrap=jQuery('<div class="input-save-wrap"></div>');
inlineSaveWrap.append(actionButtons);
// we should have atleast one submit button for the form to submit which is required for validation
ele.append(fieldModel.getUi()).append(inlineSaveWrap);
ele.find('.inputElement').addClass('form-control');
editElement.append(ele);
}
// for reference fields, actual value will be ID but we need to show related name of that ID
if(fieldType === 'reference'){
if(value !== 0){
jQuery('input[name="'+fieldName+'"]',editElement).prop('value',jQuery.trim(detailViewValue.text()));
var referenceElement = jQuery('input[name="'+fieldName+'"]',editElement);
if(!referenceElement.attr('disabled')) {
referenceElement.attr('disabled','disabled');
editElement.find('.clearReferenceSelection').removeClass('hide')
}
}
}
detailViewValue.css('display', 'none');
editElement.removeClass('hide').show().children().filter('input[type!="hidden"]input[type!="image"],select').filter(':first').focus();
vtUtils.applyFieldElementsView(currentTdElement);
var contentHolder = this.getDetailViewContainer();
var vtigerInstance = Vtiger_Index_Js.getInstance();
vtigerInstance.registerAutoCompleteFields(contentHolder);
vtigerInstance.referenceModulePopupRegisterEvent(contentHolder);
editElement.addClass('ajaxEdited');
thisInstance.registerSaveOnEnterEvent(editElement);
jQuery('.editAction').addClass('hide');
if(fieldType == 'picklist' || fieldType == 'ownergroup' || fieldType == 'owner') {
var sourcePicklistFieldName = thisInstance.getDependentSourcePicklistName(fieldName);
if(sourcePicklistFieldName) {
thisInstance.handlePickListDependencyMap(sourcePicklistFieldName);
}
}
},
getDependentSourcePicklistName : function(fieldName) {
var container = this.getForm();
var picklistDependcyElemnt = jQuery('[name="picklistDependency"]',container);
if(picklistDependcyElemnt.length <= 0) {
return '';
}
var picklistDependencyMapping = JSON.parse(picklistDependcyElemnt.val());
var sourcePicklists = Object.keys(picklistDependencyMapping);
if(sourcePicklists.length <= 0){
return '';
}
var sourcePicklistFieldName = '';
jQuery.each(picklistDependencyMapping, function(sourcePicklistName, configuredDependencyObject) {
var picklistmap = configuredDependencyObject["__DEFAULT__"];
jQuery.each(picklistmap,function(targetPickListName,targetPickListValues){
if(targetPickListName == fieldName){
sourcePicklistFieldName = sourcePicklistName;
}
});
});
return sourcePicklistFieldName;
},
getInlineWrapper : function(element) {
var wrapperElement = element.closest('td');
if(!wrapperElement.length) {
wrapperElement = element.closest('.td');
}
return wrapperElement;
},
/**
* Ajax Edit Save Event
* @param {type} currentTdElement
* @returns {undefined}
*/
registerAjaxEditSaveEvent : function(contentHolder){
var thisInstance = this;
if(typeof contentHolder === 'undefined') {
contentHolder = this.getContentHolder();
}
contentHolder.on('click','.inlineAjaxSave',function(e){
e.preventDefault();
e.stopPropagation();
var currentTarget = jQuery(e.currentTarget);
var currentTdElement = thisInstance.getInlineWrapper(currentTarget);
var detailViewValue = jQuery('.value',currentTdElement);
var editElement = jQuery('.edit',currentTdElement);
var actionElement = jQuery('.editAction', currentTdElement);
var fieldBasicData = jQuery('.fieldBasicData', editElement);
var fieldName = fieldBasicData.data('name');
var fieldType = fieldBasicData.data("type");
var previousValue = jQuery.trim(fieldBasicData.data('displayvalue'));
var fieldElement = jQuery('[name="'+ fieldName +'"]', editElement);
var ajaxEditNewValue = fieldElement.val();
// ajaxEditNewValue should be taken based on field Type
if(fieldElement.is('input:checkbox')) {
if(fieldElement.is(':checked')) {
ajaxEditNewValue = '1';
} else {
ajaxEditNewValue = '0';
}
fieldElement = fieldElement.filter('[type="checkbox"]');
} else if(fieldType == 'reference'){
ajaxEditNewValue = fieldElement.data('value');
}
// prev Value should be taken based on field Type
var customHandlingFields = ['owner','ownergroup','picklist','multipicklist','reference','boolean'];
if(jQuery.inArray(fieldType, customHandlingFields) !== -1){
previousValue = fieldBasicData.data('value');
}
// Field Specific custom Handling
if(fieldType === 'multipicklist'){
var multiPicklistFieldName = fieldName.split('[]');
fieldName = multiPicklistFieldName[0];
}
var fieldValue = ajaxEditNewValue;
//Before saving ajax edit values we need to check if the value is changed then only we have to save
if(previousValue == ajaxEditNewValue) {
detailViewValue.css('display', 'inline-block');
editElement.addClass('hide');
editElement.removeClass('ajaxEdited');
jQuery('.editAction').removeClass('hide');
actionElement.show();
}else{
var fieldNameValueMap = {};
fieldNameValueMap['value'] = fieldValue;
fieldNameValueMap['field'] = fieldName;
var form = currentTarget.closest('form');
var params = {
'ignore' : 'span.hide .inputElement,input[type="hidden"]',
submitHandler : function(form){
var preAjaxSaveEvent = jQuery.Event(Vtiger_Detail_Js.PreAjaxSaveEvent);
app.event.trigger(preAjaxSaveEvent,{form:jQuery(form),triggeredFieldInfo:fieldNameValueMap});
if(preAjaxSaveEvent.isDefaultPrevented()) {
return false;
}
jQuery(currentTdElement).find('.input-group-addon').addClass('disabled');
app.helper.showProgress();
thisInstance.saveFieldValues(fieldNameValueMap).then(function(err, response) {
app.helper.hideProgress();
if (err !== null) {
app.event.trigger('post.save.failed', err);
jQuery(currentTdElement).find('.input-group-addon').removeClass('disabled');
return true;
}
jQuery('.vt-notification').remove();
var postSaveRecordDetails = response;
if(fieldBasicData.data('type') == 'picklist' && app.getModuleName() != 'Users') {
var color = postSaveRecordDetails[fieldName].colormap[postSaveRecordDetails[fieldName].value];
if(color) {
var contrast = app.helper.getColorContrast(color);
var textColor = (contrast === 'dark') ? 'white' : 'black';
var picklistHtml = '<span class="picklist-color" style="background-color: ' + color + '; color: '+ textColor + ';">' +
postSaveRecordDetails[fieldName].display_value +
'</span>';
} else {
var picklistHtml = '<span class="picklist-color">' +
postSaveRecordDetails[fieldName].display_value +
'</span>';
}
detailViewValue.html(picklistHtml);
} else if(fieldBasicData.data('type') == 'multipicklist' && app.getModuleName() != 'Users') {
var picklistHtml = '';
var rawPicklistValues = postSaveRecordDetails[fieldName].value;
rawPicklistValues = rawPicklistValues.split('|##|');
var picklistValues = postSaveRecordDetails[fieldName].display_value;
picklistValues = picklistValues.split(',');
for(var i=0; i< rawPicklistValues.length; i++) {
var color = postSaveRecordDetails[fieldName].colormap[rawPicklistValues[i].trim()];
if(color) {
var contrast = app.helper.getColorContrast(color);
var textColor = (contrast === 'dark') ? 'white' : 'black';
picklistHtml = picklistHtml +
'<span class="picklist-color" style="background-color: ' + color + '; color: '+ textColor + ';">' +
picklistValues[i] +
'</span>';
} else {
picklistHtml = picklistHtml +
'<span class="picklist-color">' +
picklistValues[i] +
'</span>';
}
if(picklistValues[i+1]!==undefined)
picklistHtml+=' , ';
}
detailViewValue.html(picklistHtml);
} else if(fieldBasicData.data('type') == 'currency' && app.getModuleName() != 'Users') {
detailViewValue.find('.currencyValue').html(postSaveRecordDetails[fieldName].display_value);
contentHolder.closest('.detailViewContainer').find('.detailview-header-block').find('.'+fieldName).html(postSaveRecordDetails[fieldName].display_value);
}else {
detailViewValue.html(postSaveRecordDetails[fieldName].display_value);
//update namefields displayvalue in header
if(contentHolder.hasClass('overlayDetail')) {
contentHolder.find('.overlayDetailHeader').find('.'+fieldName)
.html(postSaveRecordDetails[fieldName].display_value);
} else {
contentHolder.closest('.detailViewContainer').find('.detailview-header-block')
.find('.'+fieldName).html(postSaveRecordDetails[fieldName].display_value);
}
}
fieldBasicData.data('displayvalue',postSaveRecordDetails[fieldName].display_value);
fieldBasicData.data('value',postSaveRecordDetails[fieldName].value);
jQuery(currentTdElement).find('.input-group-addon').removeClass("disabled");
detailViewValue.css('display', 'inline-block');
editElement.addClass('hide');
editElement.removeClass('ajaxEdited');
jQuery('.editAction').removeClass('hide');
actionElement.show();
var postAjaxSaveEvent = jQuery.Event(Vtiger_Detail_Js.PostAjaxSaveEvent);
app.event.trigger(postAjaxSaveEvent, fieldBasicData, postSaveRecordDetails, contentHolder);
//After saving source field value, If Target field value need to change by user, show the edit view of target field.
if(thisInstance.targetPicklistChange) {
var sourcePicklistname = thisInstance.sourcePicklistname;
thisInstance.targetPicklist.find('.editAction').trigger('click');
thisInstance.targetPicklistChange = false;
thisInstance.targetPicklist = false;
thisInstance.handlePickListDependencyMap(sourcePicklistname);
thisInstance.sourcePicklistname = false;
}
});
}
};
validateAndSubmitForm(form,params);
}
});
},
handlePickListDependencyMap : function(sourcePicklistName) {
var container = this.getForm();
var picklistDependcyElemnt = jQuery('[name="picklistDependency"]',container);
if(picklistDependcyElemnt.length <= 0) {
return;
}
var picklistDependencyMapping = JSON.parse(picklistDependcyElemnt.val());
var sourcePicklists = Object.keys(picklistDependencyMapping);
if(sourcePicklists.length <= 0){
return;
}
var configuredDependencyObject = picklistDependencyMapping[sourcePicklistName];
var selectedValue = container.find('[data-name='+sourcePicklistName+']').data('value');
var targetObjectForSelectedSourceValue = configuredDependencyObject[selectedValue];
var picklistmap = configuredDependencyObject["__DEFAULT__"];
if(typeof targetObjectForSelectedSourceValue == 'undefined'){
targetObjectForSelectedSourceValue = picklistmap;
}
jQuery.each(picklistmap,function(targetPickListName,targetPickListValues){
var targetPickListMap = targetObjectForSelectedSourceValue[targetPickListName];
if(typeof targetPickListMap == "undefined"){
targetPickListMap = targetPickListValues;
}
var targetPickList = jQuery('[name="'+targetPickListName+'"]',container);
if(targetPickList.length <= 0){
return;
}
var listOfAvailableOptions = targetPickList.data('available-options');
if(typeof listOfAvailableOptions == "undefined"){
listOfAvailableOptions = jQuery('option',targetPickList);
targetPickList.data('available-options', listOfAvailableOptions);
}
var targetOptions = new jQuery();
var optionSelector = [];
optionSelector.push('');
for(var i=0; i<targetPickListMap.length; i++){
optionSelector.push(targetPickListMap[i]);
}
jQuery.each(listOfAvailableOptions, function(i,e) {
var picklistValue = jQuery(e).val();
if(jQuery.inArray(picklistValue, optionSelector) != -1) {
targetOptions = targetOptions.add(jQuery(e));
}
})
var targetPickListSelectedValue = '';
targetPickListSelectedValue = targetOptions.filter('[selected]').val();
if(targetPickListMap.length == 1) {
targetPickListSelectedValue = targetPickListMap[0]; // to automatically select picklist if only one picklistmap is present.
}
if((targetPickListName == 'group_id' || targetPickListName == 'assigned_user_id') && jQuery("[data-name="+ sourcePicklistName +"]").data('value') == ''){
return false;
}
targetPickList.html(targetOptions).val(targetPickListSelectedValue).trigger("change");
})
},
/**
* Ajax Edit Calcel Event
* @param {type} currentTdElement
* @returns {undefined}
*/
registerAjaxEditCancelEvent : function(contentHolder){
var thisInstance = this;
if(typeof contentHolder === 'undefined') {
contentHolder = this.getContentHolder();
}
contentHolder.on('click','.inlineAjaxCancel',function(e){
e.preventDefault();
e.stopPropagation();
var currentTarget = jQuery(e.currentTarget);
var currentTdElement = thisInstance.getInlineWrapper(currentTarget);
var detailViewValue = jQuery('.value',currentTdElement);
var editElement = jQuery('.edit',currentTdElement);
var actionElement = jQuery('.editAction', currentTdElement);
detailViewValue.css('display', 'inline-block');
editElement.addClass('hide');
editElement.find('.inputElement').trigger('Vtiger.Validation.Hide.Messsage')
editElement.removeClass('ajaxEdited');
jQuery('.editAction').removeClass('hide');
actionElement.show();
});
},
registerClearReferenceSelectionEvent : function(contentHolder) {
var thisInstance = this;
if(typeof contentHolder === 'undefined') {
contentHolder = this.getContentHolder();
}
contentHolder.off('click', '.clearReferenceSelection');
contentHolder.on('click','.clearReferenceSelection',function(e){
e.preventDefault();
var element = jQuery(e.currentTarget);
var parentTdElement = thisInstance.getInlineWrapper(element);
var inputElement = parentTdElement.find('.inputElement');
parentTdElement.find('.referencefield-wrapper').removeClass('selected');
inputElement.removeAttr("disabled");
inputElement.attr("value","");
inputElement.data('value','');
inputElement.val("");
element.addClass('hide');
});
},
searchModuleNames : function(params) {
var aDeferred = jQuery.Deferred();
if(typeof params.module == 'undefined') {
params.module = app.getModuleName();
}
if(typeof params.action == 'undefined') {
params.action = 'BasicAjax';
}
if(typeof params.base_record == 'undefined') {
var record = jQuery('[name="record"]');
var recordId = app.getRecordId();
if(record.length) {
params.base_record = record.val();
} else if(recordId) {
params.base_record = recordId;
} else if(app.view() == 'List') {
var editRecordId = jQuery('#listview-table').find('tr.listViewEntries.edited').data('id');
if(editRecordId) {
params.base_record = editRecordId;
}
}
}
app.request.get({data:params}).then(
function(err, res){
aDeferred.resolve(res);
},
function(error){
//TODO : Handle error
aDeferred.reject();
}
);
return aDeferred.promise();
},
/**
* Function to get reference search params
*/
getReferenceSearchParams : function(element){
var tdElement = jQuery(element).closest('td');
var params = {};
var referenceModuleElement = jQuery('input[name="referenceModule"]',tdElement).length ?
jQuery('input[name="referenceModule"]',tdElement) : jQuery('input.referenceModule',tdElement);
var searchModule = referenceModuleElement.val();
params.search_module = searchModule;
return params;
},
/**
* Load Detail View Contents
* @param {type} url
* @returns {unresolved}
*/
loadContents : function(url,data){
var thisInstance = this;
var detailContentsHolder = this.getContentHolder();
var aDeferred = jQuery.Deferred();
if(url.indexOf('index.php') < 0) {
url = 'index.php?' + url;
}
var params = [];
params.url = url;
if(typeof data != 'undefined'){
params.data = data;
}
app.helper.showProgress();
app.request.pjax(params).then(function(error,response){
detailContentsHolder.html(response);
thisInstance.detailViewForm = jQuery('#detailView');
thisInstance.registerBlockStatusCheckOnLoad();
aDeferred.resolve(response);
app.helper.hideProgress();
});
return aDeferred.promise();
},
registerBlockAnimationEvent : function(){
var detailContentsHolder = this.getContentHolder();
detailContentsHolder.on('click','.blockToggle',function(e){
var currentTarget = jQuery(e.currentTarget);
var blockId = currentTarget.data('id');
var closestBlock = currentTarget.parents('.block');
var bodyContents = closestBlock.find('.blockData table tbody');
var data = currentTarget.data();
var module = app.getModuleName();
var hideHandler = function() {
bodyContents.hide('slow');
app.storage.set(module+'.'+blockId, 0);
}
var showHandler = function() {
bodyContents.removeClass('hide').show();
app.storage.set(module+'.'+blockId, 1);
}
if(data.mode == 'show'){
hideHandler();
currentTarget.hide();
closestBlock.find("[data-mode='hide']").removeClass('hide').show();
}else{
showHandler();
currentTarget.hide();
closestBlock.find("[data-mode='show']").removeClass('hide').show();
}
});
},
registerBlockStatusCheckOnLoad : function(){
var blocks = this.getContentHolder().find('.block');
var module = app.getModuleName();
blocks.each(function(index,block){
var currentBlock = jQuery(block);
var headerAnimationElement = currentBlock.find('.blockToggle').not('.hide');
var bodyContents = currentBlock.find('.blockData table tbody');
var blockId = headerAnimationElement.data('id');
var cacheKey = module+'.'+blockId;
var value = app.storage.get(cacheKey);
if(value != null){
if(value == 1){
headerAnimationElement.hide();
currentBlock.find("[data-mode='show']").removeClass('hide').show();
bodyContents.removeClass('hide').show();
} else {
headerAnimationElement.hide();
currentBlock.find("[data-mode='hide']").removeClass('hide').show();
bodyContents.hide();
}
} else {
if(bodyContents.hasClass("hide")) {
headerAnimationElement.hide();
currentBlock.find("[data-mode='hide']").show();
bodyContents.hide();
}
}
});
},
registerEventForActivityWidget : function(){
var thisInstance = this;
/*
* Register click event for add button in Related Activities widget
*/
jQuery('.createActivity').on('click', function(e){
var currentTarget = jQuery(e.currentTarget);
var referenceModuleName;
if(currentTarget.hasClass('toDotask')){
referenceModuleName = 'Calendar';
}else{
referenceModuleName = "Events";
}
var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]');
var recordId = thisInstance.getRecordId();
var module = app.getModuleName();
var element = jQuery(e.currentTarget);
if(quickCreateNode.length <= 0) {
app.helper.showErrorMessage(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED'));
}
var fieldName = thisInstance.referenceFieldNames[module];
if(typeof fieldName == 'undefined' && module != 'Contacts'){
fieldName = 'parent_id';
}
var customParams = {};
customParams[fieldName] = recordId;
customParams['parentModule'] = module;
app.event.on("post.QuickCreateForm.show",function(event,form){
jQuery('<input type="hidden" name="sourceModule" value="'+module+'" >').appendTo(form);
jQuery('<input type="hidden" name="sourceRecord" value="'+recordId+'" >').appendTo(form);
jQuery('<input type="hidden" name="relationOperation" value="true" >').appendTo(form);
jQuery('<input type="hidden" name="'+fieldName+'" value="'+recordId+'" >').appendTo(form);
});
app.event.on('post.QuickCreateForm.save',function(event,data){
var params = {};
params['record'] = recordId;
params['view'] = 'Detail';
params['module'] = module;
params['mode'] = 'getActivities';
app.request.post({"data":params}).then(
function(err,data) {
var activitiesWidget = jQuery('#relatedActivities');
activitiesWidget.html(data);
vtUtils.applyFieldElementsView(activitiesWidget);
thisInstance.registerEventForActivityWidget();
}
);
});
var QuickCreateParams = {};
QuickCreateParams['noCache'] = false;
QuickCreateParams['data'] = customParams;
quickCreateNode.trigger('click', QuickCreateParams);
});
},
registerSummaryViewContainerEvents : function(summaryViewContainer){
var self = this;
this.registerEventForActivityWidget();
this.loadWidgets();
/**
* Function to handle the ajax edit for summary view fields
*/
summaryViewContainer.on('click','table.summary-table td.fieldValue .editAction', function(e){
var currentTarget = jQuery(e.currentTarget);
currentTarget.hide();
var currentTdElement = currentTarget.closest('td.fieldValue');
self.ajaxEditHandling(currentTdElement);
});
jQuery('.createRecord').on('click',function(e){
var currentElement = jQuery(e.currentTarget);
var summaryWidgetContainer = currentElement.closest('.summaryWidgetContainer');
var widgetHeaderContainer = summaryWidgetContainer.find('.widget_header');
var referenceModuleName = widgetHeaderContainer.find('[name="relatedModule"]').val();
var recordId = self.getRecordId();
var module = self.getModuleName();
var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]');
var fieldName = self.referenceFieldNames[module];
var customParams = {};
customParams[fieldName] = recordId;
if(quickCreateNode.length <= 0) {
app.helper.showErrorMessage(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED'));
}
app.event.on('post.QuickCreateForm.save',function(event,data){
var idList = new Array();
idList.push(data._recordId);
self.addRelationBetweenRecords(referenceModuleName,idList).then(function(data){
self.loadWidget(summaryWidgetContainer.find('[class^="widgetContainer_"]'));
});
});
var QuickCreateParams = {};
QuickCreateParams['data'] = customParams;
QuickCreateParams['noCache'] = false;
quickCreateNode.trigger('click', QuickCreateParams);
});
/*
* Register the event to edit the status for for related activities
*/
summaryViewContainer.on('click', '.editStatus', function(e){
var currentTarget = jQuery(e.currentTarget);
var currentDiv = currentTarget.closest('.activityStatus');
var editElement = currentDiv.find('.edit');
var detailViewElement = currentDiv.find('.value');
currentTarget.hide();
detailViewElement.addClass('hide');
editElement.removeClass('hide').show();
var callbackFunction = function() {
var fieldnameElement = jQuery('.fieldname', editElement);
var fieldName = fieldnameElement.val();
var fieldElement = jQuery('[name="'+ fieldName +'"]', editElement);
var previousValue = fieldnameElement.data('prevValue');
var ajaxEditNewValue = fieldElement.find('option:selected').val();
var translatedValue = fieldElement.find('option:selected').text();
var select2Element = fieldElement.parent().find('.select2-container');
if(ajaxEditNewValue == '') {
vtUtils.showValidationMessage(select2Element, app.vtranslate('JS_REQUIRED_FIELD'));
app.helper.addClickOutSideEvent(currentDiv,callbackFunction);
return;
} else {
vtUtils.hideValidationMessage(select2Element);
}
if(previousValue == ajaxEditNewValue) {
editElement.addClass('hide');
detailViewElement.removeClass('hide');
currentTarget.show();
} else {
var activityDiv = currentDiv.closest('.activityEntries');
var activityId = activityDiv.find('.activityId').val();
var moduleName = activityDiv.find('.activityModule').val();
var activityType = activityDiv.find('.activityType').val();
app.helper.showProgress();
editElement.addClass('hide');
var params = {
action : 'SaveAjax',
record : activityId,
field : fieldName,
value : ajaxEditNewValue,
module : moduleName,
activitytype : activityType,
calendarModule : moduleName,
origin : 'SummaryWidget'
};
app.request.post({"data":params}).then(
function(err,data) {
app.helper.hideProgress();
if (err == null) {
jQuery('.vt-notification').remove();
detailViewElement.removeClass('hide');
currentTarget.show();
detailViewElement.html(translatedValue);
fieldnameElement.data('prevValue', ajaxEditNewValue);
} else {
app.event.trigger('post.save.failed', err);
detailViewElement.removeClass('hide');
currentTarget.show();
fieldElement.select2('val', previousValue);
}
});
}
}
app.helper.addClickOutSideEvent(currentDiv,callbackFunction);
});
},
addRelationBetweenRecords : function(relatedModule, relatedModuleRecordId){
var aDeferred = jQuery.Deferred();
var thisInstance = this;
var relatedController = thisInstance.getRelatedController(relatedModule);
if(thisInstance.getOverlayDetailMode() == true){
relatedController.parentModuleName = thisInstance.getModuleName();
relatedController.setSelectedTabElement('');
}
if(relatedController){
relatedController.addRelations(relatedModuleRecordId).then(
function(data){
aDeferred.resolve(data);
},
function(textStatus, errorThrown){
aDeferred.reject(textStatus, errorThrown);
}
)
}
return aDeferred.promise();
},
loadWidgets : function(){
var self = this;
var widgetList = jQuery('[class^="widgetContainer_"]');
widgetList.each(function(index,widgetContainerELement){
var widgetContainer = jQuery(widgetContainerELement);
self.loadWidget(widgetContainer).then(function(){
app.event.trigger('post.summarywidget.load',widgetContainer);
});
});
},
loadWidget : function(widgetContainer) {
var aDeferred = jQuery.Deferred();
var thisInstance = this;
var contentContainer = jQuery('.widget_contents',widgetContainer);
var urlParams = widgetContainer.data('url');
var params = {
'type' : 'GET',
'dataType': 'html',
'data' : urlParams
};
app.helper.showProgress();
app.request.post(params).then(
function(err,data){
app.helper.hideProgress();
contentContainer.html(data);
contentContainer.trigger(thisInstance.widgetPostLoad);
var adjustedHeight = contentContainer.height()-50;
app.helper.showVerticalScroll(contentContainer.find('.twitterContainer'),{
'setHeight' : adjustedHeight
});
aDeferred.resolve(params);
},
function(){
aDeferred.reject();
}
);
return aDeferred.promise();
},
getTabs : function() {
return this.getTabContainer().find('li');
},
/**
* Function to return related tab.
* @return : jQuery Object.
*/
getTabByLabel : function(tabLabel) {
var tabs = this.getTabs();
var targetTab = false;
tabs.each(function(index,element){
var tab = jQuery(element);
var labelKey = tab.data('labelKey');
if(labelKey == tabLabel){
targetTab = tab;
return false;
}
});
return targetTab;
},
/**
* function to save comment
* return json response
*/
saveComment : function(e) {
var self = this;
var aDeferred = jQuery.Deferred();
var currentTarget = jQuery(e.currentTarget);
var form = jQuery(e.currentTarget).closest('form');
var commentMode = currentTarget.data('mode');
var closestCommentBlock = currentTarget.closest('.addCommentBlock');
var commentContent = closestCommentBlock.find('.commentcontent');
var formData = new FormData(form[0]);
var commentContentValue = commentContent.val();
var isPrivate;
if(closestCommentBlock.find('#is_private').is(":checked")) {
isPrivate = 1;
} else {
isPrivate = 0;
}
var errorMsg;
if(commentContentValue.trim() == ""){
errorMsg = app.vtranslate('JS_LBL_COMMENT_VALUE_CANT_BE_EMPTY');
vtUtils.showValidationMessage(commentContent, errorMsg);
aDeferred.reject();
return aDeferred.promise();
}
vtUtils.hideValidationMessage(commentContent);
if(commentMode == "edit"){
var editCommentReason = closestCommentBlock.find('[name="reasonToEdit"]').val();
isPrivate = closestCommentBlock.find('[name="is_private"]').val();
}
app.helper.showProgress();
var element = jQuery(e.currentTarget);
element.attr('disabled', 'disabled');
var commentInfoHeader = closestCommentBlock.closest('.commentDetails').find('.commentInfoHeader');
var commentId = commentInfoHeader.data('commentid');
var parentCommentId = commentInfoHeader.data('parentcommentid');
var commentRelatedTo = commentInfoHeader.data('relatedto');
if(!commentRelatedTo) commentRelatedTo = self.getRecordId();
var postData = {
'commentcontent' : commentContentValue,
'related_to': commentRelatedTo,
'module' : 'ModComments',
'is_private' : isPrivate
}
var incrementCount = false;
if(commentMode == "edit"){
postData['record'] = commentId;
postData['reasontoedit'] = editCommentReason;
postData['parent_comments'] = parentCommentId;
postData['mode'] = 'edit';
postData['action'] = 'Save';
} else if(commentMode == "add"){
postData['parent_comments'] = commentId;
postData['action'] = 'SaveAjax';
postData['filename'] = Vtiger_Index_Js.files,
incrementCount = true;
}
jQuery.each(postData, function (key, value) {
formData.append(key, value);
});
postData = {
'url': 'index.php',
'type': 'POST',
'data': formData,
processData: false,
contentType: false
};
app.request.post(postData).then(
function(err,data){
Vtiger_Index_Js.files = '';
jQuery('.MultiFile-remove').trigger('click');
app.helper.hideProgress();
if(incrementCount){
// to increment related records count when we add comment from related tab / summary view widget
var tabElement = self.getTabByLabel("ModComments");
var relatedController = new Vtiger_RelatedList_Js(self.getRecordId(), app.getModuleName(), tabElement, self.getRelatedModuleName());
relatedController.updateRelatedRecordsCount(jQuery(tabElement).data('relation-id'),[1],true);
}
aDeferred.resolve(data);
},
function(textStatus, errorThrown){
app.helper.hideProgress();
element.removeAttr('disabled');
aDeferred.reject(textStatus, errorThrown);
}
);
return aDeferred.promise();
},
/**
* function to remove comment block if its exists.
*/
removeCommentBlockIfExists : function() {
var detailContentsHolder = this.getContentHolder();
var Commentswidget = jQuery('.commentsBody',detailContentsHolder);
jQuery('.addCommentBlock',Commentswidget).remove();
},
/**
* function to return cloned edit comment block
* return jQuery Obj.
*/
getEditCommentBlock : function(){
var detailContentsHolder = this.getContentHolder();
var clonedCommentBlock = jQuery('.basicEditCommentBlock',detailContentsHolder).clone(true,true).removeClass('basicEditCommentBlock hide').addClass('addCommentBlock');
clonedCommentBlock.find('.commentcontenthidden').removeClass('commentcontenthidden').addClass('commentcontent');
return clonedCommentBlock;
},
/**
* function to return cloned add comment block
* return jQuery Obj.
*/
getCommentBlock : function(){
var detailContentsHolder = this.getContentHolder();
var clonedCommentBlock = jQuery('.basicAddCommentBlock',detailContentsHolder).clone(true,true).removeClass('basicAddCommentBlock hide').addClass('addCommentBlock');
clonedCommentBlock.find('.commentcontenthidden').removeClass('commentcontenthidden').addClass('commentcontent');
return clonedCommentBlock;
},
/**
* function to get the Comment thread for the given parent.
* params: Url to get the Comment thread
*/
getCommentThread : function(url) {
var aDeferred = jQuery.Deferred();
app.request.post({"url":url}).then(function(err,data) {
aDeferred.resolve(data);
});
return aDeferred.promise();
},
/**
* Function to get child comments
*/
getChildComments : function(commentId){
var aDeferred = jQuery.Deferred();
var url= 'module='+app.getModuleName()+'&view=Detail&record='+this.getRecordId()+'&mode=showChildComments&commentid='+commentId;
var dataObj = this.getCommentThread(url);
dataObj.then(function(data){
aDeferred.resolve(data);
});
return aDeferred.promise();
},
/**
* function to return the UI of the comment.
* return html
*/
getCommentUI : function(commentId){
var aDeferred = jQuery.Deferred();
var postData = {
'view' : 'DetailAjax',
'module' : 'ModComments',
'record' : commentId
}
app.request.post({"data":postData}).then(
function(err,data){
aDeferred.resolve(data);
});
return aDeferred.promise();
},
getRelatedRecordsCount : function(recordId, moduleName){
var aDeferred = jQuery.Deferred();
var params = {
'type' : 'GET',
'data' : {
'module' : moduleName,
'recordId' : recordId,
'action' : 'RelatedRecordsAjax',
'mode' : 'getRelatedRecordsCount'
}
};
app.request.get(params).then(function(err,data){
if(err == null){
aDeferred.resolve(data);
}
});
return aDeferred.promise();
},
updateRelatedRecordsCount : function(){
var self = this;
var recordId = self.getRecordId();
var moduleName = app.getModuleName();
self.getRelatedRecordsCount(recordId, moduleName).then(function(data){
jQuery.each(data, function(key, value){
var element = new Object(jQuery("a","li[data-relation-id="+key+"]"));
var numberEle = element.find('.numberCircle');
numberEle.text(value);
if(parseInt(value) > 0){
numberEle.removeClass('hide');
} else{
numberEle.addClass('hide');
}
element.attr("recordscount",value);
});
});
},
toggleCommentContent: function (e) {
var currentTarget = jQuery(e.currentTarget);
var commentContentBlock = currentTarget.closest('.commentInfoContentBlock');
var commentContentInfo = commentContentBlock.find('.commentInfoContent');
var toggleElement = jQuery('<div><a class="pull-right toggleComment" style="color: blue;"><small></small></a><div>');
var fullComment = vtUtils.linkifyStr(commentContentInfo.data('fullcomment'));
if (currentTarget.hasClass('showMore')) {
toggleElement.find('small').text(commentContentInfo.data('less'));
commentContentInfo.html(fullComment+toggleElement.clone().html());
} else {
var maxLength = commentContentInfo.data('maxlength');
toggleElement.find('small').text(commentContentInfo.data('more'));
toggleElement.find('.toggleComment').addClass('showMore');
commentContentInfo.html(vtUtils.htmlSubstring(fullComment, maxLength)+"..."+toggleElement.clone().html());
}
},
toggleRollupComments : function (e) {
e.stopPropagation();
e.preventDefault();
var self = this;
var currentTarget = jQuery(e.currentTarget);
var moduleName = currentTarget.attr('module');
var recordId = currentTarget.attr('record');
var rollupId = currentTarget.attr('rollupid');
var rollup_status = currentTarget.attr('rollup-status');
var rollupstatus = 0;
if (rollup_status == 0) {
rollupstatus = 1;
}
var viewtype = currentTarget.data('view');
var contents, url, params;
if(viewtype == 'relatedlist') {
url = 'index.php?module=Vtiger&view=ModCommentsDetailAjax&parent='+moduleName+'&parentId='+recordId+
'&rollupid='+rollupId+'&rollup_status='+rollupstatus+'&mode=saveRollupSettings';
params = {
'type' : 'GET',
'url' : url
};
app.request.get(params).then(function(err, data){
currentTarget.attr('rollup-status', !rollupstatus);
jQuery('div.related-tabs li[data-label-key="ModComments"]').trigger('click');
});
} else {
url = 'index.php?module='+moduleName+'&relatedModule=ModComments&view=Detail&record='+
recordId+'&mode=showRecentComments'+'&rollupid='+rollupId
+'&rollup_status='+rollupstatus+'&parent='+moduleName+'&rollup-toggle=1&limit=5';
contents = jQuery('div[data-name="ModComments"] div.widget_contents');
params = {
'type' : 'GET',
'url' : url
};
app.request.get(params).then(function(err, data){
app.helper.hideProgress();
contents.html(data);
vtUtils.enableTooltips();
self.registerRollupCommentsSwitchEvent();
jQuery('#rollupcomments').bootstrapSwitch('state', rollupstatus, true);
});
}
},
registerScrollForRollupEvents : function() {
var relatedController = this.getRelatedController();
if(relatedController)
relatedController.registerScrollForRollupComments();
},
registerStarToggle : function() {
var self = this;
jQuery('#starToggle').on('click',function(e){
var element = jQuery(e.currentTarget);
if(element.hasClass('processing')) return;
element.addClass('processing');
var record = self.getRecordId();
var params = {};
params.module = app.getModuleName();
params.action = 'SaveStar';
params.record = record;
if(element.hasClass('active')) {
params.value = 0;
}else {
params.value = 1;
}
element.toggleClass('active');
app.request.post({data:params}).then(function(err,data){
element.removeClass('processing');
})
if(element.hasClass('active')){
app.helper.showSuccessNotification({'message':app.vtranslate('JS_FOLLOW_RECORD')});
} else {
app.helper.showSuccessNotification({'message':app.vtranslate('JS_UNFOLLOW_RECORD')});
}
});
},
saveTag : function(callerParams) {
var self = this;
var aDeferred = jQuery.Deferred();
var params = {
'module' : app.getModuleName(),
'action' : 'TagCloud',
'mode' : 'saveTags',
'record' : this.getRecordId()
};
var params = jQuery.extend(params, callerParams);
app.request.post({'data': params}).then(
function(error, data) {
if(error == null) {
var tagContainer = jQuery('.tagContainer');
var tagInstance = self.getComponentInstance('Vtiger_Tag_Js');
tagInstance.addTagsToShowAllTagContianer(data.tags);
self.addTagsToSummaryTag(data.tags);
if(parseInt(data.moreTagCount) > 0) {
tagContainer.find('.tagMoreCount').text(data.moreTagCount).closest('.moreTags').removeClass('hide');
}
aDeferred.resolve(data);
}else{
aDeferred.reject(data);
}
}
);
return aDeferred.promise();
},
deleteTag : function(callerParams) {
var aDeferred = jQuery.Deferred();
var params = {
'module' : app.getModuleName(),
'action' : 'TagCloud',
'mode' : 'delete',
'record' : this.getRecordId()
}
var params = jQuery.extend(params, callerParams);
app.request.post({'data': params}).then(
function(error, data) {
if(error == null) {
aDeferred.resolve(data);
}else{
aDeferred.reject(data);
}
}
);
return aDeferred.promise();
},
constructTagElement : function (params) {
var tagElement = jQuery(jQuery('#dummyTagElement').html()).clone(true);
tagElement.attr('data-id',params.id).attr('data-type',params.type);
tagElement.find('.tagLabel').html(params.name);
return tagElement
},
showAllTags : function(container) {
var self = this;
var showTagModal = container.find('.showAllTagContainer').clone(true);
app.helper.showModal(showTagModal.find('.modal-dialog'),{'cb' : function(modalContainer){
var registerShowAllTagEvents = function(modalContainer) {
var currentTagsSelected = new Array();
var currentTagHolder = modalContainer.find('.currentTag');
modalContainer.find('.dropdown-menu').on('click',function(e){
e.stopPropagation();
});
modalContainer.find('.currentTagMenu > li > a ').on('click', function(e){
var element = jQuery(e.currentTarget);
var selectedTag = jQuery(element.html());
currentTagsSelected.push(selectedTag.data('id'));
element.remove();
currentTagHolder.append(selectedTag);
});
app.helper.showVerticalScroll(currentTagHolder);
modalContainer.find('.currentTagSelector').instaFilta({
targets : '.currentTagMenu > li',
sections : '.currentTagMenu',
scope : '.detailShowAllModal',
hideEmptySections : true,
beginsWith : false,
caseSensitive : false,
typeDelay : 0
});
var tagInputEle = modalContainer.find('input[name="createNewTag"]');
var params = {tags : [], tokenSeparators: [","]};
vtUtils.showSelect2ElementView(tagInputEle, params);
var form = modalContainer.find('form');
form.on('submit',function(e){
e.preventDefault();
var modalContainerClone = modalContainer.clone(true);
app.helper.hideModal();
var saveParams = {};
var saveTagList = {};
saveTagList['existing'] = currentTagsSelected;
saveTagList['new'] = tagInputEle.val().split(',')
saveParams['tagsList'] = saveTagList;
var formData = form.serializeFormData();
saveParams['newTagType'] = formData['visibility'];
self.saveTag(saveParams).then(function(data){
jQuery('.showAllTagContainer').find('.currentTag').html(modalContainerClone.find('.currentTag').html());
jQuery('.showAllTagContainer').find('.currentTagMenu').html(modalContainerClone.find('.currentTagMenu').html());
})
return false;
})
}
registerShowAllTagEvents(modalContainer);
}});
},
addTagsToSummaryTag : function(tagsList) {
var summaryTagList = jQuery('.detailTagList');
var numOfTagsToShow = parseInt(summaryTagList.data('numOfTagsToShow'));
var numOfTagsToAppend = numOfTagsToShow - (parseInt(summaryTagList.find('.tag').length));
for(var index in tagsList) {
if(numOfTagsToAppend <= 0) {
break;
}
var tagInfo = tagsList[index];
var tagId = tagInfo.id;
if(summaryTagList.find('[data-id="'+ tagId +'"]').length <= 0) {
var newTagEle = this.constructTagElement(tagInfo);
summaryTagList.find('.moreTags').before(newTagEle);
summaryTagList.find('.noTagsPlaceHolder').addClass('hide');
numOfTagsToAppend--;
}
}
if(summaryTagList.find('.tag').length > 0){
summaryTagList.closest('.tag-contents').removeClass('hide');
}
},
removeDeletedTagsFromSummaryTag : function(deletedTags){
var summaryTagContainer = jQuery('.detailTagList');
for(var index in deletedTags) {
var tag = summaryTagContainer.find('.tag[data-id="'+deletedTags[index]+'"]');
if(tag.length > 0){
var showAllTagContainer = jQuery('.showAllTagContainer');
var currentTagHolder = showAllTagContainer.find('.currentTag');
var summaryLastTag = summaryTagContainer.find('.tag').filter(':last');
var nextTag = currentTagHolder.find('[data-id="'+ summaryLastTag.data('id') +'"]').next();
summaryTagContainer.find('.moreTags').before(nextTag.clone(true));
tag.remove();
}
}
if(summaryTagContainer.find(".tag").length <=0){
summaryTagContainer.find(".noTagsPlaceHolder").removeClass("hide");
}
},
registerTagSearch : function() {
jQuery('#tag-search').instaFilta({
targets : '#addTagContainer .existingTag .tag-item',
sections : '#addTagContainer .existingTag',
hideEmptySections : true,
beginsWith : false,
caseSensitive : false,
typeDelay : 0
});
},
postTagDeleteActions : function(deletedTagClone) {
var summaryTagContainer = jQuery('.detailTagList');
var tagInstance = this.getComponentInstance('Vtiger_Tag_Js');
var tagInfo = {
'id' : deletedTagClone.data('id')
};
tagInstance.removeTagsFromShowTagContainer(new Array(tagInfo));
if(summaryTagContainer.find('.tag').length <= 0 ) {
summaryTagContainer.find('.noTagsPlaceHolder').removeClass('hide');
}else{
var moreTagsEle = summaryTagContainer.find('.tagMoreCount');
if(!moreTagsEle.closest('.moreTags').hasClass('hide')) {
var moreTagsCount = parseInt(moreTagsEle.text());
moreTagsCount--;
moreTagsEle.text(moreTagsCount);
if(moreTagsCount <=0 ){
moreTagsEle.closest('.moreTags').addClass('hide');
}
}
}
},
registerTagEvents : function() {
var self = this;
var tagContainer = jQuery('.tagContainer');
tagContainer.find('#addTagContainer .dropdown-menu').on('click',function(e){
e.stopPropagation();
});
var tagInputEle = tagContainer.find('.newTags');
var params = {tags : [], tokenSeparators: [","]};
vtUtils.showSelect2ElementView(tagInputEle, params);
var existinTagContainer = tagContainer.find('.existingTag');
app.helper.showVerticalScroll(existinTagContainer);
this.registerTagSearch();
jQuery('#saveTag').on('click', function(e){
tagContainer.find('.dropdown-toggle').dropdown('toggle');
var element = jQuery(e.currentTarget);
var createTagContainer = element.closest('.createTagContainer');
var existingTagContainer = createTagContainer.find('.existingTag');
var selectedExistingTags = new Array();
var selectedTagElement = existingTagContainer.find('.tagSelector').filter(':checked').closest('li.tag-item');
selectedTagElement.each(function(index, domEle){
var ele = jQuery(domEle);
selectedExistingTags.push(ele.find('.tag').data('id'));
});
var newTagEle = createTagContainer.find('input.newTags');
var newTags = newTagEle.val();
var tagsList = {};
tagsList['new'] = newTags.split(',');
tagsList['existing'] = selectedExistingTags;
var visibility = createTagContainer.find('[name="visibility"]').val();
var visibilityCheckBox = createTagContainer.find('[type="checkbox"][name="visibility"]');
if(visibilityCheckBox.is(':checked')){
visibility = visibilityCheckBox.val();
}
self.saveTag({'tagsList':tagsList,'newTagType': visibility}).then(function(data){
selectedTagElement.remove();
newTagEle.select2('val','');
});
});
tagContainer.find('.cancelLink').on('click', function(e){
tagContainer.find('.dropdown-toggle').dropdown('toggle');
});
app.event.on('post.MassTag.save',function(e, modalContainerClone, data){
var moreTagCount = parseInt(data.moreTagCount);
if(moreTagCount === 0) {
tagContainer.find('.tagMoreCount').closest('.moreTags').addClass('hide');
} else if(moreTagCount > 0){
tagContainer.find('.tagMoreCount').text(data.moreTagCount).closest('.moreTags').removeClass('hide');
}
jQuery('.showAllTagContainer').find('.currentTag').html(modalContainerClone.find('.currentTag').html());
jQuery('.viewAllTagsContainer').find('.currentTag').html(modalContainerClone.find('.currentTag').html());
jQuery('.showAllTagContainer').find('.currentTagMenu').html(modalContainerClone.find('.currentTagMenu').html());
var tagInstance = self.getComponentInstance('Vtiger_Tag_Js');
tagInstance.addTagsToShowAllTagContianer(data.tags);
self.removeDeletedTagsFromSummaryTag(data.deleted);
self.addTagsToSummaryTag(data.tags);
})
tagContainer.find('.moreTags').on('click',function(e){
//self.showAllTags(tagContainer);
app.event.trigger('Request.AllTag.show',tagContainer, {'record' : self.getRecordId()});
});
tagContainer.on('click', '.deleteTag', function(e){
var tag = jQuery(e.currentTarget).closest('.tag');
self.deleteTag({'tag_id':tag.data('id')}).then(function(){
var summaryTagContainer = jQuery('.detailTagList');
var showAllTagContainer = jQuery('.showAllTagContainer');
var currentTagHolder = showAllTagContainer.find('.currentTag');
var summaryLastTag = summaryTagContainer.find('.tag').filter(':last');
var nextTag = currentTagHolder.find('[data-id="'+ summaryLastTag.data('id') +'"]').next();
summaryTagContainer.find('.moreTags').before(nextTag.clone(true));
tag.remove();
self.postTagDeleteActions(tag.clone(true));
if(summaryTagContainer.find('.tag').length == 0){
summaryTagContainer.closest('.tag-contents').addClass('hide');
}
})
});
jQuery('#addTagTriggerer').on('click', function(e){
app.event.trigger('Request.MassTag.show',tagContainer, {'record' : self.getRecordId()});
});
},
/**
* Function to register event for related list row click
*/
registerRelatedRowClickEvent: function() {
var detailContentsHolder = this.getContentHolder();
detailContentsHolder.on('click','.relatedListEntryValues a',function(e){
e.preventDefault();
});
detailContentsHolder.on('click','.listViewEntries',function(e){
var selection = window.getSelection().toString();
if(selection.length == 0) {
var targetElement = jQuery(e.target, jQuery(e.currentTarget));
if(targetElement.hasClass('js-reference-display-value')) return;
if(targetElement.is('td:first-child') && (targetElement.children('input[type="checkbox"]').length > 0)) return;
if(jQuery(e.target).is('input[type="checkbox"]')) return;
var elem = jQuery(e.currentTarget);
var recordUrl = elem.data('recordurl');
if(typeof recordUrl != "undefined"){
var params = app.convertUrlToDataParams(recordUrl);
//Display Mode to show details in overlay
params['mode'] = 'showDetailViewByMode';
params['requestMode'] = 'full';
params['displayMode'] = 'overlay';
var parentRecordId = app.getRecordId();
app.helper.showProgress();
app.request.get({data: params}).then(function(err, response) {
app.helper.hideProgress();
var overlayParams = {'backdrop' : 'static', 'keyboard' : false};
app.helper.loadPageContentOverlay(response, overlayParams).then(function(container) {
var detailjs = Vtiger_Detail_Js.getInstanceByModuleName(params.module);
detailjs.showScroll(jQuery('.overlayDetail .modal-body'));
detailjs.setModuleName(params.module);
detailjs.setOverlayDetailMode(true);
detailjs.setContentHolder(container.find('.overlayDetail'));
detailjs.setDetailViewContainer(container.find('.overlayDetail'));
detailjs.registerOverlayEditEvent();
detailjs.registerBasicEvents();
detailjs.registerClickEvent();
detailjs.registerHeaderAjaxEditEvents(container.find('.overlayDetailHeader'));
detailjs.registerEventToReloadRelatedListOnCloseOverlay(parentRecordId);
app.event.trigger('post.overlay.load', parentRecordId, params);
container.find('form#detailView').on('submit', function(e) {
e.preventDefault();
});
});
});
}
}
});
},
registerEventToReloadRelatedListOnCloseOverlay: function(parentId) {
var self = this;
var overlayContainer = jQuery('#overlayPageContent');
overlayContainer.one("click", ".close", function(e) {
self.loadRelatedListOfParent(parentId);
});
},
loadRelatedListOfParent: function(parentRecordId) {
var self = this;
var relatedController = self.getRelatedController();
relatedController.setParentId(parentRecordId);
if (relatedController) {
relatedController.loadRelatedList();
}
},
showOverlayEditView: function(recordUrl) {
var self = this;
var params = app.convertUrlToDataParams(recordUrl);
params['displayMode'] = 'overlay';
var postData = self.getDefaultParams();
for (var key in postData) {
if (postData[key]) {
if (key == 'relatedModule') {
params['returnrelatedModuleName'] = postData[key];
} else {
params['return' + key] = postData[key];
}
delete postData[key];
} else {
delete postData[key];
}
}
params['returnrecord'] = jQuery('[name="record_id"]').val();
app.helper.showProgress();
app.request.get({data: params}).then(function(err, response) {
app.helper.hideProgress();
var overlayParams = {'backdrop': 'static', 'keyboard': false};
app.helper.loadPageContentOverlay(response, overlayParams).then(function(container) {
var height = jQuery(window).height() - jQuery('.app-fixed-navbar').height() - jQuery('.overlayFooter').height() - 80;
var scrollParams = {
setHeight: height,
alwaysShowScrollbar: 2,
autoExpandScrollbar: true,
setTop: 0,
scrollInertia: 70
}
app.helper.showVerticalScroll(jQuery('.editViewContents'), scrollParams);
self.registerOverlayEditEvents(params.module, container);
self.registerRelatedRecordSave();
app.event.trigger('post.overLayEditView.loaded', jQuery('.overlayEdit'));
});
});
},
registerOverlayEditEvent: function() {
var self = this;
jQuery('.editRelatedRecord').on('click', function() {
var editUrl = jQuery('.editRelatedRecord').val();
self.showOverlayEditView(editUrl);
});
},
registerRelatedRecordEdit: function(){
var self = this;
var detailViewContainer = this.getContentHolder();
detailViewContainer.on('click', 'a[name="relationEdit"]', function(e) {
e.stopImmediatePropagation();
var element = jQuery(e.currentTarget);
var editUrl = element.data('url');
self.showOverlayEditView(editUrl);
});
},
getDetails: function() {
return jQuery('.details');
},
registerClickEvent: function() {
this.getContentHolder().on('click', '.inventoryLineItemDetails', function(e) {
jQuery('.inventoryLineItemDetails').popover({html: true}).show();
});
},
showScroll: function(container) {
var params = {
setHeight: container.height,
alwaysShowScrollbar: 2,
autoExpandScrollbar: true,
setTop: 0,
scrollInertia: 70,
mouseWheel: {preventDefault: true}
};
app.helper.showVerticalScroll(container, params);
},
recordImageRandomColors: function(){
var color= jQuery('.recordImage').css('background-color');
if(color === "rgba(0, 0, 0, 0)"){
jQuery('.recordImage').css('background-color', app.helper.getRandomColor());
}
},
getFieldValue : function(fieldName,sourceElement){
var form = this.getForm();
var fieldBasicData = form.find('.fieldBasicData').filter('[data-name="'+fieldName+'"]');
return fieldBasicData.attr('data-value');
},
registerQtipevent: function (tabItem) {
if(typeof tabItem == 'undefined'){
var container = jQuery('.related-tabs.row');
var scrollContent = container.find('.dropdown #relatedmenuList');
app.helper.showVerticalScroll(scrollContent,{autoHideScrollbar: true});
tabItem = container.find('.tab-item, .more-tab');
}
var title;
jQuery(tabItem).each(function () {
title = jQuery(this).attr('title');
jQuery(this).qtip({
content: title,
hide: {
event:'click mouseleave',
},
position: {
my: 'bottom center',
at: 'top left',
adjust: {
x: 30,
y: 10
}
},
style: {
classes: 'qtip-dark'
}
});
});
},
registerEvents : function() {
this._super();
this.registerEventsForRelatedList();
var detailContentsHolder = this.getContentHolder();
var self = this;
this.registerSendSmsSubmitEvent();
detailContentsHolder.on('click','.viewThread', function(e){
var currentTarget = jQuery(e.currentTarget);
var currentTargetParent = currentTarget.parent();
var commentActionsBlock = currentTarget.closest('.commentActions');
var currentCommentBlock = currentTarget.closest('.commentDetails');
var ulElements = currentCommentBlock.find('ul');
if(ulElements.length > 0){
ulElements.show();
commentActionsBlock.find('.hideThreadBlock').show();
currentTargetParent.hide();
return;
}
var commentId = currentTarget.closest('.commentDiv').find('.commentInfoHeader').data('commentid');
self.getChildComments(commentId).then(function(data){
jQuery(data).appendTo(jQuery(e.currentTarget).closest('.commentDetails'));
commentActionsBlock.find('.hideThreadBlock').show();
currentTargetParent.hide();
});
});
detailContentsHolder.on('click','.hideThread', function(e){
var currentTarget = jQuery(e.currentTarget);
var currentTargetParent = currentTarget.parent();
var commentActionsBlock = currentTarget.closest('.commentActions');
var currentCommentBlock = currentTarget.closest('.commentDetails');
currentCommentBlock.find('ul').hide();
currentTargetParent.hide();
commentActionsBlock.find('.viewThreadBlock').show();
});
detailContentsHolder.on('click','.detailViewThread',function(e){
var recentCommentsTab = self.getTabByLabel(self.detailViewRecentCommentsTabLabel);
var commentId = jQuery(e.currentTarget).closest('.singleComment').find('.commentInfoHeader').data('commentid');
recentCommentsTab.trigger('click',{'commentid':commentId});
});
this.registerStarToggle();
this.registerTagEvents();
app.event.on("post.mail.sent",function(event,data){
var resultEle = jQuery(data);
var success = resultEle.find('.mailSentSuccessfully');
if(success.length > 0){
var relatedLoad = success.data("relatedload");
if(relatedLoad == 1){
var pageNumber = jQuery('[name="currentPageNum"]').val();
window.app.controller().loadRelatedListRecords({page: pageNumber});
} else {
app.helper.showModal(data);
}
}
});
detailContentsHolder.on('click','.moreRecentUpdates', function() {
app.helper.showProgress();
var currentPage = jQuery("#updatesCurrentPage").val();
var recordId = jQuery("#recordId").val();
var nextPage = parseInt(currentPage) + 1;
var url = "index.php?module=" + app.getModuleName() + "&view=Detail&record=" + recordId + "&mode=showRecentActivities&page="
+ nextPage + "&limit=5&tab_label=LBL_UPDATES";
var postParams = app.convertUrlToDataParams(url);
app.request.post({data:postParams}).then(function(err,data){
jQuery("#updatesCurrentPage").remove();
jQuery("#moreLink").remove();
jQuery("#more_button").remove();
data = jQuery(data).removeClass("recentActivitiesContainer");
jQuery('#updates').append(data);
app.helper.hideProgress();
});
});
this.updateRelatedRecordsCount();
//RegisterBasicEvents for Related-List overlay's
this.registerBasicEvents();
this.registerHeaderAjaxEditEvents();
detailContentsHolder.on('click','.detailViewSaveComment', function(e){
var element = jQuery(e.currentTarget);
if(!element.is(":disabled")) {
var dataObj = self.saveComment(e);
dataObj.then(function(){
var commentsContainer = detailContentsHolder.find("[data-name='ModComments']");
self.loadWidget(commentsContainer).then(function() {
element.removeAttr('disabled');
app.event.trigger('post.summarywidget.load',commentsContainer);
var indexInstance = Vtiger_Index_Js.getInstance();
indexInstance.registerMultiUpload();
});
});
}
});
detailContentsHolder.on('click','.saveComment', function(e){
var element = jQuery(e.currentTarget);
if(!element.is(":disabled")) {
var currentTarget = jQuery(e.currentTarget);
var mode = currentTarget.data('mode');
var dataObj = self.saveComment(e);
dataObj.then(function(data){
var closestAddCommentBlock = currentTarget.closest('.addCommentBlock');
var commentTextAreaElement = closestAddCommentBlock.find('.commentcontent');
var commentInfoBlock = currentTarget.closest('.singleComment');
commentTextAreaElement.val('');
closestAddCommentBlock.find('#is_private').removeAttr('checked');
if(mode == "add"){
var commentId = data['id'];
var commentHtml = self.getCommentUI(commentId);
commentHtml.then(function(data){
var html;
if(jQuery(data).hasClass('privateComment')) {
html = '<ul class="unstyled"><li class="commentDetails" style="background: #fff9ea;">'+data+'</li></ul>';
} else {
html = '<ul class="unstyled"><li class="commentDetails">'+data+'</li></ul>';
}
var commentBlock = closestAddCommentBlock.closest('.commentDetails');
var detailContentsHolder = self.getContentHolder();
var noCommentsMsgContainer = jQuery('.noCommentsMsgContainer',detailContentsHolder);
noCommentsMsgContainer.remove();
if(commentBlock.length > 0){
closestAddCommentBlock.remove();
var childComments = commentBlock.find('ul');
if(childComments.length <= 0){
var currentChildCommentsCount = commentInfoBlock.find('.viewThreadBlock').data('childCommentsCount');
var newChildCommentCount = currentChildCommentsCount + 1;
commentInfoBlock.find('.childCommentsCount').text(newChildCommentCount);
var parentCommentId = commentInfoBlock.find('.commentInfoHeader').data('commentid');
self.getChildComments(parentCommentId).then(function(responsedata){
jQuery(responsedata).appendTo(commentBlock);
commentInfoBlock.find('.viewThreadBlock').hide();
commentInfoBlock.find('.hideThreadBlock').show();
});
}else {
jQuery(html).appendTo(commentBlock);
}
} else {
jQuery(html).prependTo(closestAddCommentBlock.closest('.commentContainer').find('.commentsList'));
commentTextAreaElement.css({height : '71px'});
}
commentInfoBlock.find('.commentActionsContainer').show();
});
}else if(mode == "edit"){
var modifiedTime = commentInfoBlock.find('.commentModifiedTime');
var commentInfoContent = commentInfoBlock.find('.commentInfoContent');
var commentEditStatus = commentInfoBlock.find('[name="editStatus"]');
var commentReason = commentInfoBlock.find('[name="editReason"]');
commentInfoContent.html(data.commentcontent);
commentReason.html(data.reasontoedit);
modifiedTime.text(data.modifiedtime);
modifiedTime.attr('title',data.modifiedtimetitle)
if(commentEditStatus.hasClass('hide')){
commentEditStatus.removeClass('hide');
}
if(data.reasontoedit != ""){
commentInfoBlock.find('.editReason').removeClass('hide')
}
commentInfoContent.show();
commentInfoBlock.find('.commentActionsContainer').show();
closestAddCommentBlock.remove();
}
element.removeAttr('disabled');
var indexInstance = Vtiger_Index_Js.getInstance();
indexInstance.registerMultiUpload();
});
}
});
detailContentsHolder.on('click','.editComment', function(e){
self.removeCommentBlockIfExists();
var currentTarget = jQuery(e.currentTarget);
var commentInfoBlock = currentTarget.closest('.singleComment');
var commentInfoContent = commentInfoBlock.find('.commentInfoContent');
var commentReason = commentInfoBlock.find('[name="editReason"]');
var editCommentBlock = self.getEditCommentBlock();
var fullComment = commentInfoContent.data('fullcomment');
if (fullComment) {
fullComment = app.helper.getDecodedValue(fullComment);
} else {
fullComment = commentInfoContent.text();
}
editCommentBlock.find('.commentcontent').text(fullComment);
editCommentBlock.find('[name="reasonToEdit"]').val(commentReason.text());
editCommentBlock.find('[name="is_private"]').val(commentInfoBlock.find('[name="is_private"]').val());
/*commentInfoContent.hide();
commentInfoBlock.find('.commentActionsContainer').hide();*/
editCommentBlock.appendTo(commentInfoBlock).show();
});
detailContentsHolder.on('click','.closeCommentBlock', function(e){
var currentTarget = jQuery(e.currentTarget);
var commentInfoBlock = currentTarget.closest('.singleComment');
commentInfoBlock.find('.commentActionsContainer').show();
commentInfoBlock.find('.commentInfoContent').show();
self.removeCommentBlockIfExists();
});
detailContentsHolder.on('click','.replyComment', function(e){
self.removeCommentBlockIfExists();
var currentTarget = jQuery(e.currentTarget);
var commentInfoBlock = currentTarget.closest('.singleComment');
var message = commentInfoBlock.find('.commentInfoContent').text();
var commentInfoHeader = commentInfoBlock.find('.commentInfoHeader');
var commentId = commentInfoHeader.data('commentid');
var addCommentBlock = self.getCommentBlock();
/*commentInfoBlock.find('.commentActionsContainer').hide();*/
addCommentBlock.appendTo(commentInfoBlock).show();
var params = {
'module': app.getModuleName(),
'action': 'MentionedUsers',
'message':message,
'crmid':commentId
};
app.request.post({data: params}).then(
function(err, data) {
if (data) {
var commentArea = commentInfoBlock.find('.commentcontent');
commentArea.val(data.usersString);
commentArea.focus();
var strLength= commentArea.val().length * 2;
commentArea[0].setSelectionRange(strLength, strLength);
}
});
});
detailContentsHolder.on('click','.moreRecentComments', function(){
var recentCommentsTab = self.getTabByLabel(self.detailViewRecentCommentsTabLabel);
recentCommentsTab.trigger('click');
});
detailContentsHolder.on('click','.moreRecentActivities', function(){
var recentActivitiesTab = self.getTabByLabel(self.detailViewRecentActivitiesTabLabel);
recentActivitiesTab.trigger('click');
});
detailContentsHolder.on('click', '.moreRecentDocuments', function () {
var recentDocumentsTab = self.getTabByLabel(self.detailViewRecentDocumentsLabel);
recentDocumentsTab.trigger('click');
});
detailContentsHolder.off('.toggleComment').on('click', '.toggleComment', function (e) {
self.toggleCommentContent(e);
});
app.event.on('post.summarywidget.load',function(event,widgetContainer){
vtUtils.applyFieldElementsView(widgetContainer);
//For Rollup Comments
if(jQuery('#rollupcomments').length > 0 && widgetContainer.data('name') == 'ModComments') {
widgetContainer.off('switchChange.bootstrapSwitch').on('switchChange.bootstrapSwitch', '#rollupcomments', function(e){
app.helper.showProgress();
self.toggleRollupComments(e);
});
if(jQuery('#rollupcomments').attr('rollup-status') == 1) {
jQuery('#rollupcomments').bootstrapSwitch('state', true, true);
}else{
jQuery('#rollupcomments').bootstrapSwitch('state', false, true);
}
}
var vtigerInstance = Vtiger_Index_Js.getInstance();
vtUtils.enableTooltips();
//END
});
//For Rollup Comments
if(jQuery('#rollupcomments').length > 0) {
detailContentsHolder.on('switchChange.bootstrapSwitch', '#rollupcomments', function(e){
app.helper.showProgress();
self.toggleRollupComments(e);
});
if(jQuery('#rollupcomments').attr('rollup-status') == 1) {
jQuery('#rollupcomments').bootstrapSwitch('state', true, true);
}else{
jQuery('#rollupcomments').bootstrapSwitch('state', false, true);
}
}
//END
this.registerRelatedRowClickEvent();
this.registerSummaryViewContainerEvents(this.getContentHolder());
//prevent detail view ajax form submissions
jQuery('form#detailView, form#headerForm').on('submit', function(e) {
e.preventDefault();
});
if(typeof jQuery.fn.sadropdown === 'function') {
jQuery('.widgetContainer_documents').find('.dropdown-toggle').sadropdown({
relativeTo: '#detailView'
});
}
},
/**
* Function to register event for setting up picklistdependency
* for a module if exist on change of picklist value
*/
registerEventForPicklistDependencySetup : function(container){
var thisInstance = this;
var picklistDependcyElemnt = jQuery('[name="picklistDependency"]',container);
if(picklistDependcyElemnt.length <= 0) {
return;
}
var picklistDependencyMapping = JSON.parse(picklistDependcyElemnt.val());
var sourcePicklists = Object.keys(picklistDependencyMapping);
if(sourcePicklists.length <= 0){
return;
}
var sourcePickListNames = "";
for(var i=0;i<sourcePicklists.length;i++){
sourcePickListNames += '[name="'+sourcePicklists[i]+'"],';
}
sourcePickListNames = sourcePickListNames.replace(/(^,)|(,$)/g, "");
container.on('change', sourcePickListNames, function(e) {
var currentElement = jQuery(e.currentTarget);
var sourcePicklistname = currentElement.attr('name');
var configuredDependencyObject = picklistDependencyMapping[sourcePicklistname];
var selectedValue = currentElement.val();
var targetObjectForSelectedSourceValue = configuredDependencyObject[selectedValue];
var picklistmap = configuredDependencyObject["__DEFAULT__"];
if(typeof targetObjectForSelectedSourceValue == 'undefined'){
targetObjectForSelectedSourceValue = picklistmap;
}
jQuery.each(picklistmap,function(targetPickListName,targetPickListValues){
var targetPickListMap = targetObjectForSelectedSourceValue[targetPickListName];
if(typeof targetPickListMap == "undefined"){
targetPickListMap = targetPickListValues;
}
var targetPickList = jQuery('[data-name="'+targetPickListName+'"]',container);
if(targetPickList.length <= 0){
return;
}
//On change of SourceField value, If TargetField value is not there in mapping, make user to select the new target value also.
var selectedValue = targetPickList.data('value');
if(jQuery.inArray(selectedValue, targetPickListMap) == -1) {
thisInstance.targetPicklistChange = true;
thisInstance.targetPicklist = targetPickList.closest('td');
thisInstance.sourcePicklistname = sourcePicklistname;
} else {
thisInstance.targetPicklistChange = false;
thisInstance.targetPicklist = false;
thisInstance.sourcePicklistname = false;
}
})
});
},
registerPostAjaxSaveEvent: function () {
var _this = this;
app.event.on(Vtiger_Detail_Js.PostAjaxSaveEvent, function (e, fieldBasicData, postSaveRecordDetails,contentHolder) {
if(typeof contentHolder == 'undefined'){
return;
}
var isHeaderAjax = contentHolder.find('.headerAjaxEdit').length;
if (fieldBasicData.length && isHeaderAjax) {
var detailViewContainer = _this.getDetailViewContainer();
var activeTabItem = jQuery('.related-tabs', detailViewContainer).find('li.tab-item').filter('.active');
if (!activeTabItem.length) {
activeTabItem = jQuery('.related-tabs', detailViewContainer).find('li.tab-item:first');
}
var activeTabName = activeTabItem.data('label-key');
if (activeTabName == 'Details' || activeTabName == 'Summary') {
activeTabItem.trigger('click');
}
}
});
},
registerHeaderAjaxEditEvents : function(contentHolder) {
var self = this;
if(typeof contentHolder === 'undefined') {
contentHolder = jQuery('.detailview-header');
}
contentHolder.on('click','.recordBasicInfo .fieldLabel .editAction', function(e){
var currentTarget = jQuery(e.currentTarget);
currentTarget.hide();
var currentContainerElement = currentTarget.closest('.headerAjaxEdit');
self.ajaxEditHandling(currentContainerElement);
});
this.registerAjaxEditSaveEvent(contentHolder);
this.registerAjaxEditCancelEvent(contentHolder);
this.registerClearReferenceSelectionEvent(contentHolder);
this.registerPostAjaxSaveEvent();
},
//Events common for DetailView and OverlayDetailView
registerBasicEvents: function(){
var self = this;
this.registerAjaxEditEvent();
this.registerAjaxEditSaveEvent();
this.registerAjaxEditCancelEvent();
this.recordImageRandomColors();
this.registerQtipevent();
app.event.on("post.RecordList.click", function(event, data) {
var responseData = JSON.parse(data);
var idList = new Array();
for (var id in responseData) {
idList.push(id);
}
app.helper.hideModal();
var relatedController = self.getRelatedController();
if (relatedController) {
relatedController.addRelations(idList).then(function() {
relatedController.loadRelatedList();
});
}
});
this.registerBlockAnimationEvent();
this.registerBlockStatusCheckOnLoad();
this.registerClearReferenceSelectionEvent();
//register event for picklist dependency setup
this.registerEventForPicklistDependencySetup(this.getForm());
vtUtils.enableTooltips();
},
});