/*+***********************************************************************************
* 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('Settings_Customer_Portal_Js', {}, {
//This will store the CustomerPortal Form
customerPortalForm: false,
//store the class name for customer portal module row
rowClass: 'portalModuleRow',
init: function () {
this.addComponents();
},
addComponents: function () {
this.addModuleSpecificComponent('Index', 'Vtiger', app.getParentModuleName());
},
/**
* Function to get the customerPortal form
*/
getForm: function () {
if (this.customerPortalForm == false) {
this.customerPortalForm = jQuery('#customerPortalForm');
}
return this.customerPortalForm;
},
/**
* Function to regiser the event to make the portal modules list sortable
*/
makeModulesListSortable: function () {
var thisInstance = this;
var modulesTable = jQuery('#portalModulesTable');
modulesTable.sortable({
'containment': modulesTable,
'items': 'li:not(".unsortable")',
'revert': true,
'tolerance': 'pointer',
'dealy': '3000',
'helper': function (e, ui) {
//while dragging helper elements td element will take width as contents width
//so we are explicity saying that it has to be same width so that element will not
//look like distrubed
jQuery('#savePortalInfo').trigger('change');
ui.children().each(function (index, element) {
element = jQuery(element);
element.width(element.width());
})
return ui;
},
});
},
/**
* Function which will update sequence numbers of portal modules list by order
*/
updatePortalModulesListByOrder: function () {
var form = this.getForm();
jQuery('li.portalModuleRow', form).each(function (index, domElement) {
var portalModuleRow = jQuery(domElement);
var tabId = portalModuleRow.data('id');
var sequenceEle = portalModuleRow.find('[name="portalModulesInfo['+tabId+'][sequence]"]');
var expectedRowSequence = (index+1);
var actualRowSequence = sequenceEle.val();
if (expectedRowSequence != actualRowSequence) {
return sequenceEle.val(expectedRowSequence);
}
});
},
/*
* function to save the customer portal settings
* @params: form - customer portal form.
*/
saveCustomerPortal: function (form) {
var aDeferred = jQuery.Deferred();
app.helper.showProgress();
var params = this.sanitizeFormData(form);
params['module'] = app.getModuleName();
params['parent'] = app.getParentModuleName();
params['action'] = 'Save';
app.request.post({data: params}).then(function (error, data) {
app.helper.hideProgress();
if (data) {
aDeferred.resolve(data);
} else {
aDeferred.reject(error);
}
}
);
return aDeferred.promise();
},
sanitizeFormData: function (form) {
var formData = form.serializeFormData();
var modules = jQuery('input.enabledModules');
var enabledModules = {};
jQuery.each(modules, function (i, module) {
if (jQuery(module).is(":checked")) {
enabledModules[jQuery(module).attr('name')] = 1;
}
else {
enabledModules[jQuery(module).attr('name')] = 0;
}
});
formData['enableModules'] = JSON.stringify(enabledModules);
var portalModules = jQuery('ul#portalModulesTable li.portalModuleRow');
var selectedFields = {};
var relatedModuleInfo = {};
var recordsVisible = {};
var recordPermissionsInfo = {};
var isAllMandatoryFieldsSelected = function (mandatoryFields, selectedFields) {
var containsAllMandatory = true;
jQuery.each(mandatoryFields, function (i, field) {
if (!selectedFields.hasOwnProperty(field)) {
containsAllMandatory = false;
}
});
return containsAllMandatory;
}
var returnFormData = true;
var message = '';
jQuery.each(portalModules, function (index, element) {
var mandatoryFields = [];
var list = element.attributes;
var moduleName = list['data-module'].value;
if (moduleName != 'Dashboard') {
var moduleFields = jQuery('input[name="availableFields_'+moduleName+'"]').val();
if (typeof moduleFields != 'undefined') {
var allFields = JSON.parse(moduleFields);
jQuery.each(allFields, function (i, fields) {
if (fields.mandatory)
mandatoryFields.push(fields.fieldname);
});
var fieldInfo = jQuery('input[name="selectedFields_'+moduleName+'"]').val();
if (fieldInfo != 'null' && isAllMandatoryFieldsSelected(mandatoryFields, JSON.parse(fieldInfo))) {
selectedFields[moduleName] = fieldInfo;
} else {
returnFormData = false;
message = app.vtranslate('JS_MANDATORY_FIELDS_MISSING');
}
var relModuleInfo = jQuery('input[name="relatedModules_'+moduleName+'"]').val();
if (typeof relModuleInfo != 'undefined') {
relatedModuleInfo[moduleName] = relModuleInfo;
}
var recordVisible = jQuery('.portal-record-privilege').find('input[name="recordvisible_'+moduleName+'"]').serialize();
if (typeof recordVisible != 'undefined') {
recordsVisible[moduleName] = recordVisible.split('=')[1];
}
var recordPermissions = jQuery('input[name="recordPermissions_'+moduleName+'"]').val();
if (typeof recordPermissions !== 'undefined') {
recordPermissionsInfo[moduleName] = JSON.parse(recordPermissions);
}
}
}
});
if (!returnFormData) {
app.helper.showErrorNotification({"message": message});
return false
}
var activeWidgets = {};
var defaultWidgets = JSON.parse(jQuery('input[name="defaultWidgets"]').val());
var defaultWidgetModules = ['HelpDesk', 'Faq', 'Documents'];
var widgetsInfo = jQuery("input.widgetsInfo");
jQuery.each(widgetsInfo, function (index, widget) {
var element = jQuery(widget);
if (element.is(":checked")) {
activeWidgets[element.attr('id')] = 1;
}
else {
activeWidgets[element.attr('id')] = 0;
}
});
defaultWidgetModules.forEach(function (module) {
if (activeWidgets[module] === undefined)
activeWidgets[module] = parseInt(defaultWidgets.widgets[module]);
});
if (widgetsInfo.length === 0) {
activeWidgets = defaultWidgets.widgets;
}
formData['moduleFieldsInfo'] = selectedFields;
formData['relatedModuleList'] = relatedModuleInfo;
formData['recordsVisible'] = recordsVisible;
formData['activeWidgets'] = JSON.stringify(activeWidgets);
formData['recordPermissions'] = recordPermissionsInfo;
return formData;
},
activateNavPills: function () {
var thisInstance = this;
jQuery('#portalModulesTable li').on('click', function (e) {
var previousTab = jQuery("li[class='portalModuleRow cp-tabs ui-sortable-handle active']").data('module');
var currentTarget = jQuery(e.currentTarget);
var targetModule = jQuery(currentTarget).data('module');
if (typeof previousTab == 'undefined') {
previousTab = 'Dashboard';
jQuery('.portalModuleRow[data-module="'+previousTab+'"]').addClass('bgColor')
}
if (previousTab != targetModule) {
jQuery('.portalModuleRow[data-module="'+previousTab+'"]').addClass('bgColor');
jQuery('.portalModuleRow').removeClass('active');
jQuery(currentTarget).removeClass('bgColor');
jQuery(currentTarget).addClass('active');
var params = {
"parent": "Settings",
"module": "CustomerPortal",
"targetModule": targetModule,
"view": "EditAjax"
};
if (jQuery('#moduleData_'+targetModule).length > 0) {
if (targetModule != 'Dashboard') {
jQuery('#fieldContent_'+targetModule).removeClass('hide');
jQuery('#fieldContent_'+targetModule).addClass('show');
if (previousTab == 'Dashboard') {
jQuery('#dashboardContent').removeClass('show');
jQuery('#dashboardContent').addClass('hide');
} else {
jQuery('#fieldContent_'+previousTab).removeClass('show');
jQuery('#fieldContent_'+previousTab).addClass('hide');
thisInstance.registerRecordPermissionsEvent();
thisInstance.registerDisableAddFieldsEvent(thisInstance.getForm(), targetModule);
thisInstance.registerEnableAddFieldsEvent(thisInstance.getForm(), targetModule);
}
} else {
jQuery('#dashboardContent').removeClass('hide');
jQuery('#dashboardContent').addClass('show');
jQuery('#fieldContent_'+previousTab).removeClass('show');
jQuery('#fieldContent_'+previousTab).addClass('hide');
}
} else {
app.request.post({data: params}).then(function (error, data) {
if (targetModule != 'Dashboard') {
jQuery('#fieldContent_'+targetModule).removeClass('hide');
jQuery('#fieldContent_'+targetModule).addClass('show');
if (previousTab == 'Dashboard') {
jQuery('#dashboardContent').removeClass('show');
jQuery('#dashboardContent').addClass('hide');
} else {
jQuery('#fieldContent_'+previousTab).removeClass('show');
jQuery('#fieldContent_'+previousTab).addClass('hide');
}
jQuery('#fieldContent_'+targetModule).html(data);
} else {
jQuery('#dashboardContent').removeClass('hide');
jQuery('#dashboardContent').addClass('show');
jQuery('#fieldContent_'+previousTab).removeClass('show');
jQuery('#fieldContent_'+previousTab).addClass('hide');
}
vtUtils.showSelect2ElementView(jQuery('#addField_'+targetModule), {
_maximumSelectionSize: 7,
dropdownCss: {
'z-index': 0
}
});
thisInstance.updateFieldInfo(targetModule);
thisInstance.registerAddFieldAction();
thisInstance.registerDeleteField(targetModule);
thisInstance.registerRelatedModuleInfoEvent(targetModule);
thisInstance.registerRecordPermissionsEvent();
thisInstance.registerDisableAddFieldsEvent(thisInstance.getForm(), targetModule);
thisInstance.registerEnableAddFieldsEvent(thisInstance.getForm(), targetModule);
});
}
}
});
thisInstance.registerFieldsToggler();
},
updateFieldInfo: function (targetModule) {
var thisInstance = this;
var allowedModules = ['HelpDesk', 'Assets'];
if (targetModule != 'Dashboard') {
var defaultFields = JSON.parse(jQuery('input[name="availableFields_'+targetModule+'"]').val());
var selectedFieldss = JSON.parse(jQuery('input[name="selectedFields_'+targetModule+'"]').val());
var selectedFields = [];
if (selectedFieldss) {
for (var x in selectedFieldss) {
selectedFields.push(x);
}
var alreadySelectedFields = {};
jQuery.each(selectedFieldss, function (i, field) {
alreadySelectedFields[i] = selectedFieldss[i];
});
}
jQuery.each(defaultFields, function (index, value) {
var fieldStatusValue = 0;
if (jQuery.inArray(value['fieldname'], selectedFields) === -1) {
if (value['mandatory'] && value['iseditable'])
jQuery('select#addField_'+targetModule).append('');
else
jQuery('select#addField_'+targetModule).append('');
} else {
fieldStatusValue = parseInt(alreadySelectedFields[value['fieldname']]);
var divElement = '';
if (value['mandatory']) {
if (allowedModules.indexOf(targetModule) >= 0) {
if (value['iseditable']) {
if (fieldStatusValue > 0) {
divElement = '
';
}
}
jQuery('#fieldRows_'+targetModule).append(divElement);
}
});
}
},
registerAddFieldAction: function () {
var thisInstance = this;
var allowedModules = ['HelpDesk', 'Assets'];
var currentModule = jQuery("li.portalModuleRow.active").data('module');
jQuery('#addField_'+currentModule).select2({
placeholder: app.vtranslate("JS_ADD_FIELD")
});
jQuery('#addFieldButton_'+currentModule).on('click', function (e) {
e.preventDefault();
var publishFields = jQuery('#addField_'+currentModule).val();
var defaultFields = JSON.parse(jQuery('input[name="availableFields_'+currentModule+'"]').val());
if (publishFields != undefined) {
var publishedFields = {};
for (var i = 0; i < publishFields.length; i++) {
var fieldInfo = publishFields[i].split('##');
jQuery.each(defaultFields, function (index, value) {
var sliderValue = 0;
if (value['fieldname'] == fieldInfo[0]) {
if (value['mandatory']) {
sliderValue = value['iseditable'];
if (allowedModules.indexOf(currentModule) >= 0) {
if (value['iseditable']) {
var divElement = '
'+value['fieldlabel']+'*
';
} else {
sliderValue = 0;
var divElement = '
'+value['fieldlabel']+'*
';
}
} else {
sliderValue = 0;
var divElement = '
'+value['fieldlabel']+'
';
}
} else {
if (value['iseditable'] && allowedModules.indexOf(currentModule) >= 0) {
sliderValue = 0;
var divElement = '
'+value['fieldlabel']+'
';
}
else {
sliderValue = 0;
var divElement = '
'+value['fieldlabel']+'
';
}
}
jQuery('#fieldRows_'+currentModule).append(divElement);
publishedFields[value['fieldname']] = sliderValue;
}
});
}
jQuery("#addField_"+currentModule).select2("val", "");
jQuery("#addFieldButton_"+currentModule).attr("disabled", "disabled");
thisInstance.registerUpdateSelectionEvent(publishedFields, currentModule);
}
});
},
registerUpdateSelectionEvent: function (latestselectedFields, currentModule) {
var defaultFields = JSON.parse(jQuery('input[name="availableFields_'+currentModule+'"]').val());
var fields = JSON.parse(jQuery('input[name="selectedFields_'+currentModule+'"]').val());
var selectedFields = $.extend({}, fields, latestselectedFields);
jQuery('select#addField_'+currentModule+' option').remove();
var finalSelectedFields = [];
for (var x in selectedFields) {
finalSelectedFields.push(x);
}
jQuery.each(defaultFields, function (index, value) {
if (jQuery.inArray(value['fieldname'], finalSelectedFields) === -1) {
if (value['mandatory'] && value['iseditable'])
jQuery('select#addField_'+currentModule).append('');
else
jQuery('select#addField_'+currentModule).append('');
}
});
jQuery('input[name="selectedFields_'+currentModule+'"]').val(JSON.stringify(selectedFields));
},
registerDeleteField: function (module) {
jQuery('#fieldRows_'+module).on('click', '.deleteField', function (e) {
e.preventDefault();
jQuery('#savePortalInfo').trigger('change');
var currentTarget = jQuery(e.currentTarget);
var currentName = currentTarget.attr('data-name');
var element = jQuery(currentTarget).parents('div#'+module+'_'+currentName);
var deletedColumn = currentName;
var deletedColumnLabel = currentTarget.attr('data-label');
var availableFields = JSON.parse(jQuery('input[name="availableFields_'+module+'"]').val());
var mandatoryFields = [];
jQuery.each(availableFields, function (index, fields) {
if (fields.mandatory) {
mandatoryFields.push(fields.fieldname);
}
});
if (mandatoryFields.indexOf(currentName) >= 0) {
return false;
} else {
jQuery(element).remove();
}
var selectedFields = JSON.parse(jQuery('input[name="selectedFields_'+module+'"]').val());
var fields = {};
for (var x in selectedFields) {
if (x != currentName) {
fields[x] = selectedFields[x];
}
}
jQuery('select#addField_'+module).append('');
jQuery('input[name="selectedFields_'+module+'"]').val(JSON.stringify(fields));
});
},
registerSaveFunction: function () {
var thisInstance = this;
jQuery('#savePortalInfo').on('click', function (e) {
e.preventDefault();
var form = thisInstance.getForm();
var renewalPeriod = form.find('[name=renewalPeriod]').val();
//update the sequence of customer portal modules
thisInstance.updatePortalModulesListByOrder();
//save the customer portal settings
if (form.valid()) {
thisInstance.saveCustomerPortal(form).then(
function (data) {
if (data['success']) {
var saveElement = jQuery("#savePortalInfo");
saveElement.attr('disabled', 'disabled');
app.helper.showSuccessNotification({"message": app.vtranslate('JS_PORTAL_INFO_SAVED')});
}
},
function (error) {
//TODO: Handle Error
}
);
} else {
jQuery('html, body').animate({
scrollTop: form.closest("#listViewContent").offset().top
}, 1000);
}
});
},
registerRelatedModuleInfoEvent: function (module) {
jQuery("input.relmoduleinfo_"+module).change('checkbox', function (e) {
var checkBox = jQuery(e.currentTarget);
if (checkBox.is(":checked") == true) {
checkBox.attr('value', 1);
} else {
checkBox.attr('value', 0);
}
var x = jQuery('input.relmoduleinfo_'+module);
var list = [];
jQuery.each(x, function (i, cb) {
var o = {};
if (checkBox.data('relmodule') == cb.name && checkBox.is(":checked") == true) {
cb.value = 1;
} else if (checkBox.data('relmodule') == x && checkBox.is(":checked") == false) {
cb.value = 0;
}
o.name = cb.name;
o.value = cb.value;
list.push(o);
});
jQuery('input[name="relatedModules_'+module+'"]').val(JSON.stringify(list))
});
},
registerEventForAddCustomModule: function () {
var thisInstance = this;
jQuery("#addToPortalMenu").on('click', function () {
var moduleValues = jQuery("select[name='custommodules']").val();
var customRelModules = JSON.parse(jQuery('#customRelModules').val());
var customModule = moduleValues.split('::');
jQuery("select[name='custommodules'] option").remove();
var tempModules = {}
for (var tabid in customRelModules) {
if (tabid != customModule[0]) {
tempModules[tabid] = customRelModules[tabid];
jQuery("select[name='custommodules']").append('');
}
}
var li = "