/*+*********************************************************************************** * 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. *************************************************************************************/ var Settings_Picklist_Js = { registerModuleChangeEvent : function() { jQuery('#pickListModules').on('change',function(e){ var element = jQuery(e.currentTarget); var selectedModule = jQuery(e.currentTarget).val(); if(selectedModule.length <= 0) { Settings_Vtiger_Index_Js.showMessage({'type': 'error','text':app.vtranslate('JS_PLEASE_SELECT_MODULE')}); return; } var params = { module : app.getModuleName(), parent : app.getParentModuleName(), source_module : selectedModule, view : 'IndexAjax', mode : 'getPickListDetailsForModule' } var progressIndicatorElement = jQuery.progressIndicator({ 'position' : 'html', 'blockInfo' : { 'enabled' : true } }); AppConnector.request(params).then(function(data){ jQuery('#modulePickListContainer').html(data); progressIndicatorElement.progressIndicator({'mode':'hide'}); app.changeSelectElementView(jQuery('#modulePickListContainer')); Settings_Picklist_Js.registerModulePickListChangeEvent(); jQuery('#modulePickList').trigger('change'); }); }); }, registerModulePickListChangeEvent : function() { jQuery('#modulePickList').on('change',function(e){ var params = { module : app.getModuleName(), parent : app.getParentModuleName(), source_module : jQuery('#pickListModules').val(), view : 'IndexAjax', mode : 'getPickListValueForField', pickListFieldId : jQuery(e.currentTarget).val() } var progressIndicatorElement = jQuery.progressIndicator({ 'position' : 'html', 'blockInfo' : { 'enabled' : true } }); AppConnector.request(params).then(function(data){ jQuery('#modulePickListValuesContainer').html(data); app.showSelect2ElementView(jQuery('#rolesList')); Settings_Picklist_Js.registerItemActions(); progressIndicatorElement.progressIndicator({'mode':'hide'}); }) }) }, registerAddItemEvent : function() { jQuery('#addItem').on('click',function(e){ var data = jQuery('#createViewContents').find('.modal'); var clonedCreateView = data.clone(true,true).removeClass('basicCreateView').addClass('createView'); clonedCreateView.find('.rolesList').addClass('select2'); var callBackFunction = function(data) { jQuery('[name="addItemForm"]',data).validationEngine(); Settings_Picklist_Js.registerAddItemSaveEvent(data); Settings_Picklist_Js.regiserSelectRolesEvent(data); } app.showModalWindow(clonedCreateView, function(data) { if(typeof callBackFunction == 'function') { callBackFunction(data); } }); }); }, registerAssingValueToRuleEvent : function() { jQuery('#assignValue').on('click',function() { var pickListValuesTable = jQuery('#pickListValuesTable'); var selectedListItem = jQuery('.selectedListItem',pickListValuesTable); if(selectedListItem.length > 0) { var selectedValues = []; jQuery.each(selectedListItem,function(i,element) { selectedValues.push(jQuery(element).closest('tr').data('key')); }); } var params = { module : app.getModuleName(), parent : app.getParentModuleName(), source_module : jQuery('#pickListModules').val(), view : 'IndexAjax', mode : 'showAssignValueToRoleView', pickListFieldId : jQuery('#modulePickList').val() } AppConnector.request(params).then(function(data) { app.showModalWindow(data); jQuery('[name="addItemForm"]',jQuery(data)).validationEngine(); Settings_Picklist_Js.registerAssignValueToRoleSaveEvent(jQuery(data)); if(selectedListItem.length > 0) { jQuery('[name="assign_values[]"]',jQuery('#assignValueToRoleForm')).select2('val',selectedValues); } }); }); }, registerAssignValueToRoleSaveEvent : function(data) { jQuery('#assignValueToRoleForm').on('submit',function(e) { var form = jQuery(e.currentTarget); var assignValuesSelectElement = jQuery('[name="assign_values[]"]',form); var assignValuesSelect2Element = app.getSelect2ElementFromSelect(assignValuesSelectElement); var assignValueResult = Vtiger_MultiSelect_Validator_Js.invokeValidation(assignValuesSelectElement); if(assignValueResult != true){ assignValuesSelect2Element.validationEngine('showPrompt', assignValueResult , 'error','topLeft',true); } else { assignValuesSelect2Element.validationEngine('hide'); } var rolesSelectElement = jQuery('[name="rolesSelected[]"]',form); var select2Element = app.getSelect2ElementFromSelect(rolesSelectElement); var result = Vtiger_MultiSelect_Validator_Js.invokeValidation(rolesSelectElement); if(result != true){ select2Element.validationEngine('showPrompt', result , 'error','bottomLeft',true); } else { select2Element.validationEngine('hide'); } if(assignValueResult != true || result != true) { e.preventDefault(); return; } else { form.find('[name="saveButton"]').attr('disabled',"disabled"); } var params = jQuery(e.currentTarget).serializeFormData(); AppConnector.request(params).then(function(data) { if(typeof data.result != 'undefined') { app.hideModalWindow(); Settings_Vtiger_Index_Js.showMessage({text:app.vtranslate('JS_VALUE_ASSIGNED_SUCCESSFULLY'),type : 'success'}) } }); e.preventDefault(); }); }, registerEnablePickListValueClickEvent : function() { jQuery('#listViewContents').on('click','.assignToRolePickListValue',function(e) { jQuery('#saveOrder').removeAttr('disabled'); var pickListVaue = jQuery(e.currentTarget) if(pickListVaue.hasClass('selectedCell')) { pickListVaue.removeClass('selectedCell').addClass('unselectedCell'); pickListVaue.find('.icon-ok').remove(); } else { pickListVaue.removeClass('unselectedCell').addClass('selectedCell'); pickListVaue.prepend(''); } }); }, registerenableOrDisableListSaveEvent : function() { jQuery('#saveOrder').on('click',function(e) { var progressIndicatorElement = jQuery.progressIndicator({ 'position' : 'html', 'blockInfo' : { 'enabled' : true, 'elementToBlock' : jQuery('.tab-content') } }); var pickListValues = jQuery('.assignToRolePickListValue'); var disabledValues = []; var enabledValues = []; jQuery.each(pickListValues,function(i,element) { var currentValue = jQuery(element); if(currentValue.hasClass('selectedCell')){ enabledValues.push(currentValue.data('id')); } else { disabledValues.push(currentValue.data('id')); } }); var params = { module : app.getModuleName(), parent : app.getParentModuleName(), action : 'SaveAjax', mode : 'enableOrDisable', enabled_values : enabledValues, disabled_values : disabledValues, picklistName : jQuery('[name="picklistName"]').val(), rolesSelected : jQuery('#rolesList').val() } AppConnector.request(params).then(function(data) { if(typeof data.result != 'undefined') { jQuery(e.currentTarget).attr('disabled','disabled'); progressIndicatorElement.progressIndicator({mode : 'hide'}); Settings_Vtiger_Index_Js.showMessage({text:app.vtranslate('JS_LIST_UPDATED_SUCCESSFULLY'),type : 'success'}) } }); }); }, regiserSelectRolesEvent : function(data) { data.find('[name="rolesSelected[]"]').on('change',function(e) { var rolesSelectElement = jQuery(e.currentTarget); var selectedValue = rolesSelectElement.val(); if(jQuery.inArray('all', selectedValue) != -1){ rolesSelectElement.select2("val", ""); rolesSelectElement.select2("val","all"); rolesSelectElement.select2("close"); rolesSelectElement.find('option').not(':first').attr('disabled','disabled'); data.find(jQuery('.modal-body')).append('
'+app.vtranslate('JS_ALL_ROLES_SELECTED')+'
') } else { rolesSelectElement.find('option').removeAttr('disabled','disabled'); data.find('.modal-body').find('.alert').remove(); } }); }, registerRenameItemEvent : function() { var thisInstance = this; jQuery('#renameItem').on('click',function(e){ var pickListValuesTable = jQuery('#pickListValuesTable'); var selectedListItem = jQuery('.selectedListItem',pickListValuesTable); var selectedListItemLength = selectedListItem.length; if(selectedListItemLength > 1) { var params = { title : app.vtranslate('JS_MESSAGE'), text: app.vtranslate('JS_MORE_THAN_ONE_ITEM_SELECTED'), animation: 'show', type: 'error' }; Vtiger_Helper_Js.showPnotify(params); return; } else{ var params = { module : app.getModuleName(), parent : app.getParentModuleName(), source_module : jQuery('#pickListModules').val(), view : 'IndexAjax', mode : 'showEditView', pickListFieldId : jQuery('#modulePickList').val(), fieldValue : selectedListItem.closest('tr').data('key') } AppConnector.request(params).then(function(data){ app.showModalWindow(data); var form = jQuery('#renameItemForm'); thisInstance.registerScrollForNonEditablePicklistValues(form); form.validationEngine(); Settings_Picklist_Js.registerRenameItemSaveEvent(); }); } }); }, /** * Function to register the scroll bar for NonEditable Picklist Values */ registerScrollForNonEditablePicklistValues : function(container) { jQuery(container).find('.nonEditablePicklistValues').slimScroll({ height: '70px', size: '6px' }); }, registerDeleteItemEvent : function() { var thisInstance = this; jQuery('#deleteItem').on('click',function(e){ var pickListValuesTable = jQuery('#pickListValuesTable'); var selectedListItem = jQuery('.selectedListItem',pickListValuesTable); var selectedListItemsArray = new Array(); jQuery.each(selectedListItem,function(index,element){ selectedListItemsArray.push(jQuery(element).closest('tr').data('key')); }) var pickListValues = jQuery('.pickListValue',pickListValuesTable); if(pickListValues.length == selectedListItem.length) { Settings_Vtiger_Index_Js.showMessage({text:app.vtranslate('JS_YOU_CANNOT_DELETE_ALL_THE_VALUES'),type : 'error'}) return; } var params = { module : app.getModuleName(), parent : app.getParentModuleName(), source_module : jQuery('#pickListModules').val(), view : 'IndexAjax', mode : 'showDeleteView', pickListFieldId : jQuery('#modulePickList').val(), fieldValue : JSON.stringify(selectedListItemsArray) } thisInstance.showDeleteItemForm(params); }); }, registerDeleteOptionEvent : function() { function result(value) { var replaceValueElement = jQuery('#replaceValue'); if(typeof value.added != 'undefined'){ var id = value.added.id; jQuery('#replaceValue option[value="'+id+'"]').remove(); replaceValueElement.trigger('liszt:updated'); } else { var id = value.removed.id; var text = value.removed.text; replaceValueElement.append(''); replaceValueElement.trigger('liszt:updated'); } } jQuery('[name="delete_value[]"]').on("change", function(e) { result({ val:e.val, added:e.added, removed:e.removed }); }) }, duplicateItemNameCheck : function(container) { var pickListValues = JSON.parse(jQuery('[name="pickListValues"]',container).val()); var pickListValuesArr = new Array(); jQuery.each(pickListValues,function(i,e){ var decodedValue = app.getDecodedValue(e); pickListValuesArr.push(jQuery.trim(decodedValue.toLowerCase())); }); var mode = jQuery('[name="mode"]', container).val(); var newValue = jQuery.trim(jQuery('[name="newValue"]',container).val()); var lowerCasedNewValue = newValue.toLowerCase(); //Checking the new picklist value is already exists if(jQuery.inArray(lowerCasedNewValue,pickListValuesArr) != -1){ //while renaming the picklist values if(mode == 'rename') { var oldValue = jQuery.trim(jQuery('[name="oldValue"]',container).val()); var lowerCasedOldValue = oldValue.toLowerCase(); //allow to rename when the new value should not be same as old value and the new value only with case diffrence if(oldValue != newValue && lowerCasedOldValue == lowerCasedNewValue) { return false; } } //while adding or renaming with different existing value return true; } else { return false; } }, registerChangeRoleEvent : function() { jQuery('#rolesList').on('change',function(e) { var progressIndicatorElement = jQuery.progressIndicator({ 'position' : 'html', 'blockInfo' : { 'enabled' : true, 'elementToBlock' : jQuery('.tab-content') } }); var rolesList = jQuery(e.currentTarget); var params = { module : app.getModuleName(), parent : app.getParentModuleName(), view : 'IndexAjax', mode : 'getPickListValueByRole', rolesSelected : rolesList.val(), pickListFieldId : jQuery('#modulePickList').val() } AppConnector.request(params).then(function(data) { jQuery('#pickListValeByRoleContainer').html(data); Settings_Picklist_Js.registerenableOrDisableListSaveEvent(); progressIndicatorElement.progressIndicator({mode : 'hide'}); }); }) }, registerAddItemSaveEvent : function(container) { container.find('[name="addItemForm"]').on('submit',function(e){ var form = jQuery(e.currentTarget); var validationResult = form.validationEngine('validate'); if(validationResult == true) { var duplicateCheckResult = Settings_Picklist_Js.duplicateItemNameCheck(container); if(duplicateCheckResult == true) { var errorMessage = app.vtranslate('JS_DUPLIACATE_ENTRIES_FOUND_FOR_THE_VALUE'); var newValueEle = jQuery('[name="newValue"]',container); var newValue = newValueEle.val(); newValueEle.validationEngine('showPrompt', errorMessage+' '+'"'+newValue+'"' , 'error','bottomLeft',true); e.preventDefault(); return; } var invalidFields = form.data('jqv').InvalidFields; if(invalidFields.length == 0){ form.find('[name="saveButton"]').attr('disabled',"disabled"); } var params = jQuery(e.currentTarget).serializeFormData(); var newValue = params.newValue; params.newValue = jQuery.trim(newValue); AppConnector.request(params).then(function(data) { data = data.result; var newValue = jQuery.trim(jQuery('[name="newValue"]',container).val()); var dragImagePath = jQuery('#dragImagePath').val(); var newElement = '  '+newValue+''; var newPickListValueRow = jQuery(newElement).appendTo(jQuery('#pickListValuesTable').find('tbody')); newPickListValueRow.attr('data-key',newValue); newPickListValueRow.attr('data-key-id',data['id']); app.hideModalWindow(); var params = { title : app.vtranslate('JS_MESSAGE'), text: app.vtranslate('JS_ITEM_ADDED_SUCCESSFULLY'), animation: 'show', type: 'success' }; Vtiger_Helper_Js.showPnotify(params); //update the new item in the hidden picklist values array var pickListValuesEle = jQuery('[name="pickListValues"]'); var pickListValuesArray = JSON.parse(pickListValuesEle.val()); pickListValuesArray[data['id']] = newValue; pickListValuesEle.val(JSON.stringify(pickListValuesArray)); }); } e.preventDefault(); }); }, registerRenameItemSaveEvent : function() { jQuery('#renameItemForm').on('submit',function(e) { var form = jQuery(e.currentTarget); var validationResult = form.validationEngine('validate'); if(validationResult == true) { var duplicateCheckResult = Settings_Picklist_Js.duplicateItemNameCheck(form); var newValueEle = jQuery('[name="newValue"]',form); var newValue = jQuery.trim(newValueEle.val()); if(duplicateCheckResult == true) { var errorMessage = app.vtranslate('JS_DUPLIACATE_ENTRIES_FOUND_FOR_THE_VALUE'); newValueEle.validationEngine('showPrompt', errorMessage+' '+'"'+newValue+'"' , 'error','bottomLeft',true); e.preventDefault(); return; } var oldElem = jQuery('[name="oldValue"]',form); var oldValue = oldElem.val(); var id = oldElem.find('option[value="'+oldValue+'"]').data('id'); var params = jQuery(e.currentTarget).serializeFormData(); params.newValue = newValue; params.id = id; var invalidFields = form.data('jqv').InvalidFields; if(invalidFields.length == 0){ form.find('[name="saveButton"]').attr('disabled',"disabled"); } AppConnector.request(params).then(function(data) { if(typeof data.result != 'undefined'){ app.hideModalWindow(); var encodedOldValue = oldValue.replace(/"/g, '\\"'); var dragImagePath = jQuery('#dragImagePath').val(); var renamedElement = '  '+newValue+''; var renamedElement = jQuery(renamedElement).attr('data-key',newValue).attr('data-key-id',id); jQuery('[data-key="'+encodedOldValue+'"]').replaceWith(renamedElement) var params = { title : app.vtranslate('JS_MESSAGE'), text: app.vtranslate('JS_ITEM_RENAMED_SUCCESSFULLY'), animation: 'show', type: 'success' }; Vtiger_Helper_Js.showPnotify(params); //update the new item in the hidden picklist values array var pickListValuesEle = jQuery('[name="pickListValues"]'); var pickListValuesArray = JSON.parse(pickListValuesEle.val()); pickListValuesArray[id] = newValueEle.val(); pickListValuesEle.val(JSON.stringify(pickListValuesArray)); } }); } e.preventDefault(); }); }, showDeleteItemForm : function(params) { var thisInstance = this; AppConnector.request(params).then(function(data){ app.showModalWindow(data, function(data) { if(typeof callBackFunction == 'function') { callBackFunction(data); } }); }); var callBackFunction = function(data) { var form = data.find('#deleteItemForm'); thisInstance.registerScrollForNonEditablePicklistValues(form); var maximumSelectionSize = jQuery('#pickListValuesCount').val()-1; app.changeSelectElementView(jQuery('[name="delete_value[]"]'), 'select2', {maximumSelectionSize: maximumSelectionSize,dropdownCss : {'z-index' : 100001}}); Settings_Picklist_Js.registerDeleteOptionEvent(); var params = app.getvalidationEngineOptions(true); params.onValidationComplete = function(form, valid){ if(valid) { var selectElement = jQuery('[name="delete_value[]"]'); var select2Element = app.getSelect2ElementFromSelect(selectElement); var result = Vtiger_MultiSelect_Validator_Js.invokeValidation(selectElement); if(result != true){ select2Element.validationEngine('showPrompt', result , 'error','topLeft',true); return; } else { select2Element.validationEngine('hide'); form.find('[name="saveButton"]').attr('disabled',"disabled"); } var deleteValues = jQuery('[name="delete_value[]"]').val(); var params = form.serializeFormData(); AppConnector.request(params).then(function(data) { if(typeof data.result != 'undefined'){ app.hideModalWindow(); //delete the item in the hidden picklist values array var pickListValuesEle = jQuery('[name="pickListValues"]'); var pickListValuesArray = JSON.parse(pickListValuesEle.val()); jQuery.each(deleteValues,function(i,e){ var encodedOldValue = e.replace(/"/g, '\\"'); jQuery('[data-key-id="'+encodedOldValue+'"]').remove(); delete pickListValuesArray[e]; }); pickListValuesEle.val(JSON.stringify(pickListValuesArray)); var params = { title : app.vtranslate('JS_MESSAGE'), text: app.vtranslate('JS_ITEMS_DELETED_SUCCESSFULLY'), animation: 'show', type: 'success' }; Vtiger_Helper_Js.showPnotify(params); } }); } return false; } form.validationEngine(params); } }, registerSelectPickListValueEvent : function() { jQuery("#pickListValuesTable").on('click','.pickListValue',function(event) { var currentRow = jQuery(event.currentTarget); var currentRowTd = currentRow.find('td'); event.preventDefault(); if(event.ctrlKey) { currentRowTd.toggleClass('selectedListItem'); } else { jQuery(".pickListValue").find('td').not(currentRowTd).removeClass("selectedListItem"); currentRowTd.toggleClass('selectedListItem'); } }); }, registerPickListValuesSortableEvent : function() { var tbody = jQuery( "tbody",jQuery('#pickListValuesTable')); tbody.sortable({ '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 ui.children().each(function(index,element){ element = jQuery(element); element.width(element.width()); }) return ui; }, 'containment' : tbody, 'revert' : true, update: function(e, ui ) { jQuery('#saveSequence').removeAttr('disabled'); } }); }, registerSaveSequenceClickEvent : function() { jQuery('#saveSequence').on('click',function(e) { var progressIndicatorElement = jQuery.progressIndicator({ 'position' : 'html', 'blockInfo' : { 'enabled' : true, 'elementToBlock' : jQuery('.tab-content') } }); var pickListValuesSequenceArray = {} var pickListValues = jQuery('#pickListValuesTable').find('.pickListValue'); jQuery.each(pickListValues,function(i,element) { pickListValuesSequenceArray[jQuery(element).data('key-id')] = ++i; }); var params = { module : app.getModuleName(), parent : app.getParentModuleName(), action : 'SaveAjax', mode : 'saveOrder', picklistValues : pickListValuesSequenceArray, picklistName : jQuery('[name="picklistName"]').val() } AppConnector.request(params).then(function(data) { if(typeof data.result != 'undefined') { jQuery('#saveSequence').attr('disabled','disabled'); progressIndicatorElement.progressIndicator({mode : 'hide'}); Settings_Vtiger_Index_Js.showMessage({text:app.vtranslate('JS_SEQUENCE_UPDATED_SUCCESSFULLY'),type : 'success'}) } }); }); }, registerAssingValueToRoleTabClickEvent : function() { jQuery('#assignedToRoleTab').on('click',function(e) { jQuery('#rolesList').trigger('change'); }); }, registerItemActions : function() { Settings_Picklist_Js.registerAddItemEvent(); Settings_Picklist_Js.registerRenameItemEvent(); Settings_Picklist_Js.registerDeleteItemEvent(); Settings_Picklist_Js.registerSelectPickListValueEvent(); Settings_Picklist_Js.registerAssingValueToRuleEvent(); Settings_Picklist_Js.registerChangeRoleEvent(); Settings_Picklist_Js.registerAssingValueToRoleTabClickEvent(); Settings_Picklist_Js.registerPickListValuesSortableEvent(); Settings_Picklist_Js.registerSaveSequenceClickEvent(); }, registerEvents : function() { Settings_Picklist_Js.registerModuleChangeEvent(); Settings_Picklist_Js.registerModulePickListChangeEvent(); Settings_Picklist_Js.registerItemActions(); Settings_Picklist_Js.registerEnablePickListValueClickEvent(); } } jQuery(document).ready(function(){ Settings_Picklist_Js.registerEvents(); }) Vtiger_Base_Validator_Js("Vtiger_FieldLabel_Validator_Js",{ /** *Function which invokes field validation *@param accepts field element as parameter * @return error if validation fails true on success */ invokeValidation: function(field, rules, i, options){ var instance = new Vtiger_FieldLabel_Validator_Js(); instance.setElement(field); var response = instance.validate(); if(response != true){ return instance.getError(); } } },{ /** * Function to validate the field label * @return true if validation is successfull * @return false if validation error occurs */ validate: function(){ var fieldValue = this.getFieldValue(); return this.validateValue(fieldValue); }, validateValue : function(fieldValue){ var specialChars = /[<\>\"\,]/ ; if (specialChars.test(fieldValue)) { var errorInfo = app.vtranslate('JS_SPECIAL_CHARACTERS')+" < > \" , "+app.vtranslate('JS_NOT_ALLOWED'); this.setError(errorInfo); return false; } return true; } });