/*+***********************************************************************************
* 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.
*************************************************************************************/
Settings_Vtiger_Edit_Js('Settings_Webforms_Edit_Js', {}, {
duplicateWebformNames : {},
targetFieldsTable : false,
/**
* Function to get source module fields table
*/
getSourceModuleFieldTable : function() {
var editViewForm = this.getForm();
if(this.targetFieldsTable == false){
this.targetFieldsTable = editViewForm.find('[name="targetModuleFields"]');
}
return this.targetFieldsTable;
},
targetModule : false,
/**
* Function to set target module
*/
setTargetModule : function(targetModuleName){
this.targetModule = targetModuleName;
},
/**
* Function to render selected field UI
*/
displaySelectedField : function(selectedField){
var editViewForm = this.getForm();
var targetFieldsTable = this.getSourceModuleFieldTable();
var selectedFieldOption = editViewForm.find('option[value="'+selectedField+'"]');
var selectedFieldInfo = selectedFieldOption.data('fieldInfo');
var selectedOptionLabel = selectedFieldInfo.label;
var selectedOptionName = selectedFieldInfo.name;
var selectedOptionType = selectedFieldInfo.type;
var isCustomField = selectedFieldInfo.customField;
var moduleName = app.getModuleName();
var fieldInstance = Vtiger_Field_Js.getInstance(selectedFieldInfo,moduleName);
var fieldMandatoryStatus = selectedFieldOption.data('mandatory');
var UI = fieldInstance.getUiTypeSpecificHtml();
var UI = jQuery(UI);
var addOnElementExist = UI.find('.add-on');
var parentInputPrepend = addOnElementExist.closest('.input-prepend');
if((parentInputPrepend.length > 0) && (selectedOptionType != "reference")){
parentInputPrepend.find('.add-on').addClass('overWriteAddOnStyles');
}
var webFormTargetFieldStructure = '
';
targetFieldsTable.append(webFormTargetFieldStructure);
var fieldUIContainer = targetFieldsTable.find('[data-name="fieldUI_'+selectedOptionName+'"]');
fieldUIContainer.html(UI);
vtUtils.applyFieldElementsView(fieldUIContainer);
if(selectedOptionType == 'reference'){
this.registerAutoCompleteFields(editViewForm);
this.appendPopupReferenceModuleName(fieldUIContainer.find('[name="popupReferenceModule"]'));
}
},
/**
* Function to register event for onchange event for
* select2 element fro adding and removing fields
*/
registerOnChangeEventForSelect2 : function(){
var thisInstance = this;
var editViewForm = this.getForm();
var fieldsTable = this.getSourceModuleFieldTable();
jQuery('#fieldsList').on('change',function(e){
var element = jQuery(e.currentTarget);
//To handle the options that are removed from select2
if(typeof e.removed != "undefined"){
var removedFieldObject = e.removed;
var removedFieldName = removedFieldObject.id;
var removedFieldLabel = removedFieldObject.text;
var selectedFieldOption = editViewForm.find('option[value="'+removedFieldName+'"]');
var fieldMandatoryStatus = selectedFieldOption.data('mandatory');
//To handle the mandatory option that are removed using backspace from select2
if(fieldMandatoryStatus){
var existingOptions = element.select2("data");
var params = {
'id' : removedFieldName,
'text' : removedFieldLabel
}
existingOptions.push(params);
//By setting data attribute select2 mandatory options are added back to select2
element.select2("data",existingOptions);
thisInstance.triggerLockMandatoryFieldOptions();
} else {
//Remove the row with respect to option that are removed from select2
var selectedFieldInfo = selectedFieldOption.data('fieldInfo');
var removeRowName = selectedFieldInfo.name;
fieldsTable.find('tr[data-name="'+removeRowName+'"]').find('.removeTargetModuleField').trigger('click');
if(element.val().length == 1){
jQuery('#saveFieldsOrder').attr('disabled',true);
}
}
} else if(typeof e.added != "undefined"){
//To add the row according to option that is selected from select2
var addedFieldObject = e.added;
var addedFieldName = addedFieldObject.id;
thisInstance.displaySelectedField(addedFieldName);
thisInstance.registerEventToHandleOnChangeOfOverrideValue();
}
})
},
/**
* Function to register event for making field as required
*/
registerEventForMarkRequiredField : function(){
var thisInstance = this;
this.getSourceModuleFieldTable().on('change','.markRequired',function(e){
var message = app.vtranslate('JS_MANDATORY_FIELDS_WITHOUT_OVERRIDE_VALUE_CANT_BE_HIDDEN');
var element = jQuery(e.currentTarget);
var elementRow = element.closest('tr');
var fieldName= elementRow.data('name');
var fieldType = elementRow.data('type');
if(fieldType == "multipicklist"){
fieldName = fieldName+'[]';
}
var fieldValue = jQuery.trim(elementRow.find('[name="'+fieldName+'"]').val());
var isMandatory = element.closest('tr').data('mandatoryField');
if(isMandatory){
if(element.hasClass('mandatoryField')){
element.attr('checked',true);
}else if(element.hasClass('hiddenField')){
if(fieldValue == ''){
element.attr('checked',false);
thisInstance.showErrorMessage(message);
}
}
e.preventDefault();
return;
}else{
if(element.hasClass('mandatoryField')){
if(element.is(':checked')){
var hiddenOption = elementRow.find('.hiddenField');
if(hiddenOption.is(':checked')){
if(fieldValue == ''){
element.attr('checked',false);
thisInstance.showErrorMessage(message);
e.preventDefault();
return;
}
}
}
}else if(element.hasClass('hiddenField')){
var mandatoryOption = elementRow.find('.mandatoryField');
if(mandatoryOption.is(':checked') && fieldValue == ''){
element.attr('checked',false);
thisInstance.showErrorMessage(message);
e.preventDefault();
return;
}
}
}
})
},
/**
* Function to show error messages
*/
showErrorMessage : function(message){
app.helper.showErrorNotification({"message":message});
},
/**
* Function to handle target module remove field action
*/
registerEventForRemoveTargetModuleField : function(){
var thisInstance = this;
var sourceModuleContainer = this.getSourceModuleFieldTable();
sourceModuleContainer.on('click','.removeTargetModuleField',function(e){
var element = jQuery(e.currentTarget);
var containerRow = element.closest('tr');
var removedFieldLabel = containerRow.find('td.fieldLabel').text();
var selectElement = sourceModuleContainer.find('#fieldsList');
//x click removes element in select2 automatically (2 actions below is not required)
//var select2Element = vtUtils.showSelect2ElementView(selectElement);
//select2Element.find('li.select2-search-choice').find('div:contains('+removedFieldLabel+')').closest('li').remove();
selectElement.find('option:contains('+removedFieldLabel+')').removeAttr('selected');
if(selectElement.val().length == 1){
jQuery('#saveFieldsOrder').attr('disabled',true);
}
thisInstance.triggerLockMandatoryFieldOptions();
containerRow.remove();
})
},
/**
* Function to lock mandatory option in select2
*/
lockMandatoryOptionInSelect2 : function(mandatoryFieldLabel){
var sourceModuleContainer = this.getSourceModuleFieldTable();
var fieldsListSelect2Element = sourceModuleContainer.find('#s2id_fieldsList');
fieldsListSelect2Element.find('.select2-search-choice div:contains("'+mandatoryFieldLabel+'")').closest('li').find('a').remove();
},
/**
* Function to trigger lock mandatory field options in edit mode
*/
triggerLockMandatoryFieldOptions : function(){
var editViewForm = this.getForm();
var selectedOptions = editViewForm.find('#fieldsList option:selected');
for(var i=0;i 0 && (!parentInputPrepend.hasClass('input-append'))){
parentInputPrepend.find('.add-on').addClass('overWriteAddOnStyles');
}
targetModuleFieldsTable.find('input.timepicker-default').removeClass('input-small');
targetModuleFieldsTable.find('textarea').removeClass('input-xxlarge').css('width',"80%");
targetModuleFieldsTable.find('input.currencyField').css('width',"210px")
},
/**
* Function to register Basic Events
*/
registerBasicEvents : function(){
var editViewForm = this.getForm();
vtUtils.applyFieldElementsView(editViewForm);
this.registerOnChangeEventForSelect2();
this.registerEventForRemoveTargetModuleField();
this.registerEventForMarkRequiredField();
this.triggerLockMandatoryFieldOptions();
this.addExternalStylesForElement();
//api to support target module fields sortable
this.makeMenuItemsListSortable();
this.registerEventForFieldsSaveOrder();
this.arrangeSelectedChoicesInOrder();
this.registerEventToHandleOnChangeOfOverrideValue();
this.registerAutoCompleteFields(editViewForm);
//Document file fields handling
this.registerAddFileFieldEvent(editViewForm);
this.registerFileFieldRemoveEvent(editViewForm);
},
fileFieldsLimit: 5,
/**
* Function to handle add file field click event
* @param form - Edit view form.
*/
registerAddFileFieldEvent: function (form) {
var self = this;
var container = jQuery(form);
container.find('#addFileFieldBtn').click(function (e) {
e.preventDefault();
var fileFieldsCount = parseInt(jQuery('#fileFieldsCount').val());
if (fileFieldsCount >= self.fileFieldsLimit) {
app.helper.showAlertNotification({message: app.vtranslate('JS_MAX_FILE_FIELDS_LIMIT', self.fileFieldsLimit)});
return false;
}
var fieldIndex = jQuery('#fileFieldNextIndex').val();
var html = '