Files
CRM/layouts/vlayout/modules/Settings/PickListDependency/resources/PickListDependency.js
BACHIR SOULDI 2794e62571 first commit
2025-09-28 08:49:37 +01:00

603 lines
20 KiB
JavaScript

/*+***********************************************************************************
* 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.
*************************************************************************************/
jQuery.Class('Settings_PickListDependency_Js', {
//holds the picklist dependency instance
pickListDependencyInstance : false,
/**
* Function used to triggerAdd new Dependency for the picklists
*/
triggerAdd : function(event) {
event.stopPropagation();
var instance = Settings_PickListDependency_Js.pickListDependencyInstance;
instance.updatedSourceValues = [];
instance.showEditView(instance.listViewForModule).then(
function(data) {
instance.registerAddViewEvents();
}
);
},
/**
* This function used to trigger Edit picklist dependency
*/
triggerEdit : function(event, module, sourceField, targetField) {
event.stopPropagation();
var instance = Settings_PickListDependency_Js.pickListDependencyInstance;
instance.updatedSourceValues = [];
instance.showEditView(module, sourceField, targetField).then(
function(data){
var form = jQuery('#pickListDependencyForm');
form.find('[name="sourceModule"],[name="sourceField"],[name="targetField"]').select2('disable');
var element = form.find('.dependencyMapping');
app.showHorizontalScrollBar(element);
instance.registerDependencyGraphEvents();
instance.registerSubmitEvent();
}
);
},
/**
* This function used to trigger Delete picklist dependency
*/
triggerDelete : function(event, module, sourceField, targetField) {
event.stopPropagation();
var currentTarget = jQuery(event.currentTarget);
var currentTrEle = currentTarget.closest('tr');
var instance = Settings_PickListDependency_Js.pickListDependencyInstance;
var message = app.vtranslate('JS_LBL_ARE_YOU_SURE_YOU_WANT_TO_DELETE');
Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then(
function(e) {
instance.deleteDependency(module, sourceField, targetField).then(
function(data){
var params = {};
params.text = app.vtranslate('JS_DEPENDENCY_DELETED_SUEESSFULLY');
Settings_Vtiger_Index_Js.showMessage(params);
currentTrEle.fadeOut('slow').remove();
}
);
},
function(error, err){
}
);
}
}, {
//constructor
init : function() {
Settings_PickListDependency_Js.pickListDependencyInstance = this;
},
//holds the listview forModule
listViewForModule : '',
//holds the updated sourceValues while editing dependency
updatedSourceValues : [],
//holds the new mapping of source values and target values
valueMapping : [],
//holds the list of selected source values for dependency
selectedSourceValues : [],
/*
* function to show editView for Add/Edit Dependency
* @params: module - selected module
* sourceField - source picklist
* targetField - target picklist
*/
showEditView : function(module, sourceField, targetField) {
var aDeferred = jQuery.Deferred();
var progressIndicatorElement = jQuery.progressIndicator({
'position' : 'html',
'blockInfo' : {
'enabled' : true
}
});
var params = {};
params['module'] = app.getModuleName();
params['parent'] = app.getParentModuleName();
params['view'] = 'Edit';
params['sourceModule'] = module;
params['sourcefield'] = sourceField;
params['targetfield'] = targetField;
AppConnector.requestPjax(params).then(
function(data) {
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
var container = jQuery('.contentsDiv');
container.html(data);
//register all select2 Elements
app.showSelect2ElementView(container.find('select.select2'), {dropdownCss : {'z-index' : 0}});
aDeferred.resolve(data);
},
function(error) {
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
aDeferred.reject(error);
}
);
return aDeferred.promise();
},
/**
* Function to get the Dependency graph based on selected module
*/
getModuleDependencyGraph : function(form) {
var thisInstance = this;
form.find('[name="sourceModule"]').on('change', function() {
var forModule = form.find('[name="sourceModule"]').val();
thisInstance.showEditView(forModule).then(
function(data) {
thisInstance.registerAddViewEvents();
}
);
})
},
/**
* Register change event for picklist fields in add/edit picklist dependency
*/
registerPicklistFieldsChangeEvent : function(form) {
var thisInstance = this;
form.find('[name="sourceField"],[name="targetField"]').on('change', function() {
thisInstance.checkValuesForDependencyGraph(form);
})
},
/**
* Function used to check the selected picklist fields are valid before showing dependency graph
*/
checkValuesForDependencyGraph : function(form) {
var thisInstance = this;
var sourceField = form.find('[name="sourceField"]');
var targetField = form.find('[name="targetField"]');
var select2SourceField = app.getSelect2ElementFromSelect(sourceField);
var select2TargetField = app.getSelect2ElementFromSelect(targetField);
var sourceFieldValue = sourceField.val();
var targetFieldValue = targetField.val();
var dependencyGraph = jQuery('#dependencyGraph');
if(sourceFieldValue != '' && targetFieldValue != '') {
var result = app.vtranslate('JS_SOURCE_AND_TARGET_FIELDS_SHOULD_NOT_BE_SAME');
form.find('.errorMessage').addClass('hide');
if(sourceFieldValue == targetFieldValue) {
select2TargetField.validationEngine('showPrompt', result , 'error','topLeft',true);
dependencyGraph.html('');
} else {
select2SourceField.validationEngine('hide');
select2TargetField.validationEngine('hide');
var sourceModule = form.find('[name="sourceModule"]').val();
var progressIndicatorElement = jQuery.progressIndicator({
'position' : 'html',
'blockInfo' : {
'enabled' : true
}
});
thisInstance.checkCyclicDependency(sourceModule, sourceFieldValue, targetFieldValue).then(
function(data) {
var result = data['result'];
if(!result['result']) {
thisInstance.addNewDependencyPickList(sourceModule, sourceFieldValue, targetFieldValue);
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
} else {
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
form.find('.errorMessage').removeClass('hide');
form.find('.cancelAddView').removeClass('hide');
dependencyGraph.html('');
}
},
function(error, err) {
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
}
);
}
} else {
form.find('.errorMessage').addClass('hide');
var result = app.vtranslate('JS_SELECT_SOME_VALUE');
if(sourceFieldValue == '') {
select2SourceField.validationEngine('showPrompt', result , 'error','topRight',true);
}else if(targetFieldValue == '') {
select2TargetField.validationEngine('showPrompt', result , 'error','topRight',true);
}
}
},
/**
* Function used to check the cyclic dependency of the selected picklist fields
* @params: sourceModule - selected module
* sourceFieldValue - source picklist value
* targetFieldValue - target picklist value
*/
checkCyclicDependency : function(sourceModule, sourceFieldValue, targetFieldValue) {
var aDeferred = jQuery.Deferred();
var params = {};
params['mode'] = 'checkCyclicDependency';
params['module'] = app.getModuleName();
params['parent'] = app.getParentModuleName();
params['action'] = 'Index';
params['sourceModule'] = sourceModule;
params['sourcefield'] = sourceFieldValue;
params['targetfield'] = targetFieldValue;
AppConnector.request(params).then(
function(data) {
aDeferred.resolve(data);
}, function(error, err) {
aDeferred.reject();
}
);
return aDeferred.promise();
},
/**
* Function used to show the new picklist dependency graph
* @params: sourceModule - selected module
* sourceFieldValue - source picklist value
* targetFieldValue - target picklist value
*/
addNewDependencyPickList : function(sourceModule, sourceFieldValue, targetFieldValue) {
var thisInstance = this;
thisInstance.updatedSourceValues = [];
var params = {};
params['mode'] = 'getDependencyGraph';
params['module'] = app.getModuleName();
params['parent'] = app.getParentModuleName();
params['view'] = 'IndexAjax';
params['sourceModule'] = sourceModule;
params['sourcefield'] = sourceFieldValue;
params['targetfield'] = targetFieldValue;
AppConnector.request(params).then(
function(data) {
var dependencyGraph = jQuery('#dependencyGraph');
dependencyGraph.html(data).css( {'padding': '10px','border': '1px solid #ddd','background': '#fff'});
var element = dependencyGraph.find('.dependencyMapping');
app.showHorizontalScrollBar(element);
thisInstance.registerDependencyGraphEvents();
}, function(error, err) {
}
);
},
/**
* This function will delete the pickList Dependency
* @params: module - selected module
* sourceField - source picklist value
* targetField - target picklist value
*/
deleteDependency : function(module, sourceField, targetField) {
var aDeferred = jQuery.Deferred();
var params = {};
params['module'] = app.getModuleName();
params['parent'] = app.getParentModuleName();
params['action'] = 'DeleteAjax';
params['sourceModule'] = module;
params['sourcefield'] = sourceField;
params['targetfield'] = targetField;
AppConnector.request(params).then(
function(data) {
aDeferred.resolve(data);
}, function(error, err) {
aDeferred.reject();
}
);
return aDeferred.promise();
},
/**
* Function used to show cancel link in add view and register click event for cancel
*/
registerCancelAddView : function(form) {
var thisInstance = this;
var cancelDiv = form.find('.cancelAddView');
cancelDiv.removeClass('hide');
cancelDiv.find('.cancelLink').click(function() {
thisInstance.loadListViewContents(thisInstance.listViewForModule);
})
},
/**
* Register all the events related to addView of picklist dependency
*/
registerAddViewEvents : function() {
var thisInstance = this;
var form = jQuery('#pickListDependencyForm');
thisInstance.registerCancelAddView(form);
thisInstance.getModuleDependencyGraph(form);
thisInstance.registerPicklistFieldsChangeEvent(form);
thisInstance.registerSubmitEvent();
},
/**
* Register all the events in editView of picklist dependency
*/
registerDependencyGraphEvents : function() {
var thisInstance = this;
var form = jQuery('#pickListDependencyForm');
var dependencyGraph = jQuery('#dependencyGraph');
form.find('.cancelAddView').addClass('hide');
thisInstance.registerTargetFieldsClickEvent(dependencyGraph);
thisInstance.registerSelectSourceValuesClick(dependencyGraph);
thisInstance.registerCancelDependency(form);
},
/**
* Register all the events related to listView of picklist dependency
*/
registerListViewEvents : function() {
var thisInstance = this;
var forModule = jQuery('.contentsDiv').find('.pickListSupportedModules').val();
thisInstance.listViewForModule = forModule;
//thisInstance.triggerDisplayTypeEvent();
thisInstance.registerSourceModuleChangeEvent();
},
/**
* Register the click event for cancel picklist dependency changes
*/
registerCancelDependency : function(form) {
var thisInstance = this;
//Register click event for cancel link
var cancelDependencyLink = form.find('.cancelDependency');
cancelDependencyLink.click(function() {
thisInstance.loadListViewContents(thisInstance.listViewForModule);
})
},
/**
* Register the click event for target fields in dependency graph
*/
registerTargetFieldsClickEvent : function(dependencyGraph) {
var thisInstance = this;
thisInstance.updatedSourceValues = [];
dependencyGraph.find('td.picklistValueMapping').on('click', function(e) {
var currentTarget = jQuery(e.currentTarget);
var sourceValue = currentTarget.data('sourceValue');
if(jQuery.inArray(sourceValue, thisInstance.updatedSourceValues) == -1) {
thisInstance.updatedSourceValues.push(sourceValue);
}
if(currentTarget.hasClass('selectedCell')) {
currentTarget.addClass('unselectedCell').removeClass('selectedCell').find('i.icon-ok').remove();
} else {
currentTarget.addClass('selectedCell').removeClass('unselectedCell').prepend('<i class="icon-ok pull-left"></i>');
}
});
},
/**
* Function used to update the value mapping to save the picklist dependency
*/
updateValueMapping : function(dependencyGraph) {
var thisInstance = this;
thisInstance.valueMapping = [];
var sourceValuesArray = thisInstance.updatedSourceValues;
var dependencyTable = dependencyGraph.find('.pickListDependencyTable');
for(var key in sourceValuesArray) {
if(typeof sourceValuesArray[key] == 'string'){
var encodedSourceValue = sourceValuesArray[key].replace(/"/g, '\\"');
} else {
encodedSourceValue = sourceValuesArray[key];
}
var selectedTargetValues = dependencyTable.find('td[data-source-value="'+encodedSourceValue+'"]').filter('.selectedCell');
var targetValues = [];
if(selectedTargetValues.length > 0) {
jQuery.each(selectedTargetValues, function(index, element) {
targetValues.push(jQuery(element).data('targetValue'));
});
} else {
targetValues.push('');
}
thisInstance.valueMapping.push({'sourcevalue' : sourceValuesArray[key], 'targetvalues' : targetValues});
}
},
/**
* register click event for select source values button in add/edit view
*/
registerSelectSourceValuesClick : function(dependencyGraph) {
var thisInstance = this;
dependencyGraph.find('button.sourceValues').click(function() {
var selectSourceValues = dependencyGraph.find('.modalCloneCopy');
var clonedContainer = selectSourceValues.clone(true, true).removeClass('modalCloneCopy');
var callBackFunction = function(data) {
data.find('.sourcePicklistValuesModal').removeClass('hide');
data.find('[name="saveButton"]').click(function(e) {
thisInstance.selectedSourceValues = [];
var sourceValues = data.find('.sourceValue');
jQuery.each(sourceValues, function(index, ele) {
var element = jQuery(ele);
var value = element.val();
if(typeof value == 'string'){
var encodedValue = value.replace(/"/g, '\\"');
} else {
encodedValue = value;
}
var hiddenElement = selectSourceValues.find('[class*="'+encodedValue+'"]');
if(element.is(':checked')) {
thisInstance.selectedSourceValues.push(value);
hiddenElement.attr('checked', true);
} else {
hiddenElement.removeAttr('checked');
}
})
app.hideModalWindow();
thisInstance.loadMappingForSelectedValues(dependencyGraph);
});
}
app.showModalWindow(clonedContainer,function(data) {
if(typeof callBackFunction == 'function') {
callBackFunction(data);
}
}, {'width':'1000px'});
})
},
/**
* Function used to load mapping for selected picklist fields
*/
loadMappingForSelectedValues : function(dependencyGraph) {
var thisInstance = this;
var allSourcePickListValues = jQuery.parseJSON(dependencyGraph.find('.allSourceValues').val());
var dependencyTable = dependencyGraph.find('.pickListDependencyTable');
for(var key in allSourcePickListValues) {
if(typeof allSourcePickListValues[key] == 'string'){
var encodedSourcePickListValue = allSourcePickListValues[key].replace(/"/g, '\\"');
} else {
encodedSourcePickListValue = allSourcePickListValues[key];
}
var mappingCells = dependencyTable.find('[data-source-value="'+encodedSourcePickListValue+'"]');
if(jQuery.inArray(allSourcePickListValues[key], thisInstance.selectedSourceValues) == -1) {
mappingCells.hide();
} else {
mappingCells.show();
}
}
dependencyGraph.find('.dependencyMapping').mCustomScrollbar("update");
},
/**
* This function will save the picklist dependency details
*/
savePickListDependency : function(form) {
var thisInstance = this;
var progressIndicatorElement = jQuery.progressIndicator({
'position' : 'html',
'blockInfo' : {
'enabled' : true
}
});
var data = form.serializeFormData();
data['module'] = app.getModuleName();
data['parent'] = app.getParentModuleName();
data['action'] = 'SaveAjax';
data['mapping'] = JSON.stringify(thisInstance.valueMapping);
AppConnector.request(data).then(
function(data) {
if(data['success']) {
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
var params = {};
params.text = app.vtranslate('JS_PICKLIST_DEPENDENCY_SAVED');
Settings_Vtiger_Index_Js.showMessage(params);
thisInstance.loadListViewContents(thisInstance.listViewForModule);
}
},
function(error) {
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
}
);
},
/**
* This function will load the listView contents after Add/Edit picklist dependency
*/
loadListViewContents : function(forModule) {
var thisInstance = this;
var progressIndicatorElement = jQuery.progressIndicator({
'position' : 'html',
'blockInfo' : {
'enabled' : true
}
});
var params = {};
params['module'] = app.getModuleName();
params['parent'] = app.getParentModuleName();
params['view'] = 'List';
params['formodule'] = forModule;
AppConnector.requestPjax(params).then(
function(data) {
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
//replace the new list view contents
jQuery('.contentsDiv').html(data);
app.changeSelectElementView(jQuery('.contentsDiv').find('.pickListSupportedModules'));
thisInstance.registerListViewEvents();
}, function(error, err) {
progressIndicatorElement.progressIndicator({'mode' : 'hide'});
}
);
},
/**
* trigger the display type event to show the width
*/
triggerDisplayTypeEvent : function() {
var widthType = app.cacheGet('widthType', 'narrowWidthType');
if(widthType) {
var elements = jQuery('.listViewEntriesTable').find('td,th');
elements.attr('class', widthType);
}
},
/**
* register change event for source module in add/edit picklist dependency
*/
registerSourceModuleChangeEvent : function() {
var thisInstance = this;
var container = jQuery('.contentsDiv');
container.find('.pickListSupportedModules').on('change', function(e) {
var currentTarget = jQuery(e.currentTarget);
var forModule = currentTarget.val();
thisInstance.loadListViewContents(forModule);
});
},
/**
* register the form submit event
*/
registerSubmitEvent : function() {
var thisInstance = this;
var form = jQuery('#pickListDependencyForm');
var dependencyGraph = jQuery('#dependencyGraph');
form.submit(function(e) {
e.preventDefault();
try{
thisInstance.updateValueMapping(dependencyGraph);
}catch(e) {
bootbox.alert(e.message);
return;
}
thisInstance.savePickListDependency(form);
});
},
/**
* register events for picklist dependency
*/
registerEvents : function() {
var thisInstance = this;
var form = jQuery('#pickListDependencyForm');
if(form.length > 0) {
var element = form.find('.dependencyMapping');
app.showHorizontalScrollBar(element);
if(form.find('.editDependency').val() == "true") {
form.find('[name="sourceModule"],[name="sourceField"],[name="targetField"]').select2('disable');
thisInstance.registerDependencyGraphEvents();
thisInstance.registerSubmitEvent();
} else {
thisInstance.registerAddViewEvents();
}
} else {
thisInstance.registerListViewEvents();
}
}
});
jQuery(document).ready(function(){
var instance = new Settings_PickListDependency_Js();
instance.registerEvents();
})