- Added comprehensive AI Assistant system (aiassist/ directory): * Vector search and embedding capabilities * Typebot proxy integration * Elastic search functionality * Message classification and chat history * MCP proxy for external integrations - Implemented Court Status API (GetCourtStatus.php): * Real-time court document status checking * Integration with external court systems * Comprehensive error handling and logging - Enhanced S3 integration: * Improved file backup system with metadata * Batch processing capabilities * Enhanced error logging and recovery * Copy operations with URL fixing - Added Telegram contact creation API - Improved error logging across all modules - Enhanced callback system for AI responses - Extensive backup file storage with timestamps - Updated documentation and README files - File storage improvements: * Thousands of backup files with proper metadata * Fix operations for broken file references * Project-specific backup and recovery systems * Comprehensive file integrity checking Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
404 lines
13 KiB
JavaScript
404 lines
13 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.
|
|
************************************************************************************/
|
|
|
|
if (typeof(ImportJs) == 'undefined') {
|
|
/*
|
|
* Namespaced javascript class for Import
|
|
*/
|
|
ImportJs = {
|
|
|
|
toogleMergeConfiguration: function() {
|
|
var mergeChecked = jQuery('#auto_merge').is(':checked');
|
|
var duplicateMergeConfiguration = jQuery('#duplicates_merge_configuration');
|
|
if(mergeChecked) {
|
|
duplicateMergeConfiguration.show();
|
|
} else {
|
|
duplicateMergeConfiguration.hide();
|
|
}
|
|
},
|
|
|
|
checkFileType: function() {
|
|
var filePath = jQuery('#import_file').val();
|
|
if(filePath != '') {
|
|
var fileExtension = filePath.split('.').pop();
|
|
jQuery('#type').val(fileExtension);
|
|
ImportJs.handleFileTypeChange();
|
|
}
|
|
},
|
|
|
|
handleFileTypeChange: function() {
|
|
var fileType = jQuery('#type').val();
|
|
var delimiterContainer = jQuery('#delimiter_container');
|
|
var hasHeaderContainer = jQuery('#has_header_container');
|
|
if(fileType != 'csv') {
|
|
delimiterContainer.hide();
|
|
hasHeaderContainer.hide();
|
|
} else {
|
|
delimiterContainer.show();
|
|
hasHeaderContainer.show();
|
|
}
|
|
},
|
|
|
|
uploadAndParse: function() {
|
|
if(!ImportJs.validateFilePath()) return false;
|
|
if(!ImportJs.validateMergeCriteria()) return false;
|
|
return true;
|
|
},
|
|
|
|
registerImportClickEvent : function(){
|
|
jQuery('#importButton').on('click',function(e){
|
|
var result = ImportJs.sanitizeAndSubmit()
|
|
return result;
|
|
});
|
|
},
|
|
|
|
validateFilePath: function() {
|
|
var importFile = jQuery('#import_file');
|
|
var filePath = importFile.val();
|
|
if(jQuery.trim(filePath) == '') {
|
|
var errorMessage = app.vtranslate('JS_IMPORT_FILE_CAN_NOT_BE_EMPTY');
|
|
var params = {
|
|
text: errorMessage,
|
|
type: 'error'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
importFile.focus();
|
|
return false;
|
|
}
|
|
if(!ImportJs.uploadFilter("import_file", "csv|vcf")) {
|
|
return false;
|
|
}
|
|
if(!ImportJs.uploadFileSize("import_file")) {
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
uploadFilter: function(elementId, allowedExtensions) {
|
|
var obj = jQuery('#'+elementId);
|
|
if(obj) {
|
|
var filePath = obj.val();
|
|
var fileParts = filePath.toLowerCase().split('.');
|
|
var fileType = fileParts[fileParts.length-1];
|
|
var validExtensions = allowedExtensions.toLowerCase().split('|');
|
|
|
|
if(validExtensions.indexOf(fileType) < 0) {
|
|
var errorMessage = app.vtranslate('JS_SELECT_FILE_EXTENSION')+'\n' +validExtensions;
|
|
var params = {
|
|
text: errorMessage,
|
|
type: 'error'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
obj.focus();
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
},
|
|
|
|
uploadFileSize : function(elementId) {
|
|
var element = jQuery('#'+elementId);
|
|
var importMaxUploadSize = element.closest('td').data('importUploadSize');
|
|
var importMaxUploadSizeInMb = element.closest('td').data('importUploadSizeMb');
|
|
var uploadedFileSize = element.get(0).files[0].size;
|
|
if(uploadedFileSize > importMaxUploadSize){
|
|
var errorMessage = app.vtranslate('JS_UPLOADED_FILE_SIZE_EXCEEDS')+" "+importMaxUploadSizeInMb+ " MB." + app.vtranslate('JS_PLEASE_SPLIT_FILE_AND_IMPORT_AGAIN');
|
|
var params = {
|
|
text: errorMessage,
|
|
type: 'error'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
validateMergeCriteria: function() {
|
|
$mergeChecked = jQuery('#auto_merge').is(':checked');
|
|
if($mergeChecked) {
|
|
var selectedOptions = jQuery('#selected_merge_fields option');
|
|
if(selectedOptions.length == 0) {
|
|
var errorMessage = app.vtranslate('JS_PLEASE_SELECT_ONE_FIELD_FOR_MERGE');
|
|
var params = {
|
|
text: errorMessage,
|
|
'type': 'error'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
return false;
|
|
}
|
|
}
|
|
ImportJs.convertOptionsToJSONArray('#selected_merge_fields', '#merge_fields');
|
|
return true;
|
|
},
|
|
|
|
//TODO move to a common file
|
|
convertOptionsToJSONArray : function(objName, targetObjName) {
|
|
var obj = jQuery(objName);
|
|
var arr = [];
|
|
if(typeof(obj) != 'undefined' && obj[0] != '') {
|
|
for (i=0; i<obj[0].length; ++i) {
|
|
arr.push(obj[0].options[i].value);
|
|
}
|
|
}
|
|
if(targetObjName != 'undefined') {
|
|
var targetObj = $(targetObjName);
|
|
if(typeof(targetObj) != 'undefined') targetObj.val(JSON.stringify(arr));
|
|
}
|
|
return arr;
|
|
},
|
|
|
|
//TODO: move to a common file
|
|
copySelectedOptions : function(source, destination) {
|
|
|
|
var srcObj = jQuery(source);
|
|
var destObj = jQuery(destination);
|
|
|
|
if(typeof(srcObj) == 'undefined' || typeof(destObj) == 'undefined') return;
|
|
|
|
for (i=0;i<srcObj[0].length;i++) {
|
|
if (srcObj[0].options[i].selected == true) {
|
|
var rowFound = false;
|
|
var existingObj = null;
|
|
for (j=0;j<destObj[0].length;j++) {
|
|
if (destObj[0].options[j].value == srcObj[0].options[i].value) {
|
|
rowFound = true;
|
|
existingObj = destObj[0].options[j];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (rowFound != true) {
|
|
var opt = $('<option selected>');
|
|
opt.attr('value', srcObj[0].options[i].value);
|
|
opt.text(srcObj[0].options[i].text);
|
|
jQuery(destObj[0]).append(opt);
|
|
srcObj[0].options[i].selected = false;
|
|
rowFound = false;
|
|
} else {
|
|
if(existingObj != null) existingObj.selected = true;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
//TODO move to a common file
|
|
removeSelectedOptions : function (objName) {
|
|
var obj = jQuery(objName);
|
|
if(obj == null || typeof(obj) == 'undefined') return;
|
|
|
|
for (i=obj[0].options.length-1;i>=0;i--) {
|
|
if (obj[0].options[i].selected == true) {
|
|
obj[0].options[i] = null;
|
|
}
|
|
}
|
|
},
|
|
|
|
sanitizeAndSubmit: function() {
|
|
if(!ImportJs.sanitizeFieldMapping()) return false;
|
|
if(!ImportJs.validateCustomMap()) return false;
|
|
return true;
|
|
},
|
|
|
|
sanitizeFieldMapping: function() {
|
|
var fieldsList = jQuery('.fieldIdentifier');
|
|
var mappedFields = {};
|
|
var errorMessage;
|
|
var params = {};
|
|
var mappedDefaultValues = {};
|
|
for(var i=0; i<fieldsList.length; ++i) {
|
|
var fieldElement = jQuery(fieldsList.get(i));
|
|
var rowId = jQuery('[name=row_counter]', fieldElement).get(0).value;
|
|
var selectedFieldElement = jQuery('select option:selected', fieldElement);
|
|
var selectedFieldName = selectedFieldElement.val();
|
|
var selectedFieldDefaultValueElement = jQuery('#'+selectedFieldName+'_defaultvalue', fieldElement);
|
|
var defaultValue = '';
|
|
if(selectedFieldDefaultValueElement.attr('type') == 'checkbox') {
|
|
defaultValue = selectedFieldDefaultValueElement.is(':checked');
|
|
} else {
|
|
defaultValue = selectedFieldDefaultValueElement.val();
|
|
}
|
|
if(selectedFieldName != '') {
|
|
if(selectedFieldName in mappedFields) {
|
|
errorMessage = app.vtranslate('JS_FIELD_MAPPED_MORE_THAN_ONCE')+" " + selectedFieldElement.data('label');
|
|
params = {
|
|
text: errorMessage,
|
|
'type': 'error'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
return false;
|
|
}
|
|
mappedFields[selectedFieldName] = rowId-1;
|
|
if(defaultValue != '') {
|
|
mappedDefaultValues[selectedFieldName] = defaultValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
var mandatoryFields = JSON.parse(jQuery('#mandatory_fields').val());
|
|
var moduleName = app.getModuleName();
|
|
if(moduleName == 'PurchaseOrder' || moduleName == 'Invoice' || moduleName == 'Quotes' || moduleName == 'SalesOrder') {
|
|
mandatoryFields.hdnTaxType = app.vtranslate('Tax Type');
|
|
}
|
|
var missingMandatoryFields = [];
|
|
for(var mandatoryFieldName in mandatoryFields) {
|
|
if(mandatoryFieldName in mappedFields) {
|
|
continue;
|
|
} else {
|
|
missingMandatoryFields.push('"'+mandatoryFields[mandatoryFieldName]+'"');
|
|
}
|
|
}
|
|
if(missingMandatoryFields.length > 0) {
|
|
errorMessage = app.vtranslate('JS_MAP_MANDATORY_FIELDS')+ missingMandatoryFields.join(',');
|
|
params = {
|
|
text: errorMessage,
|
|
'type': 'error'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
return false;
|
|
}
|
|
jQuery('#field_mapping').val(JSON.stringify(mappedFields));
|
|
jQuery('#default_values').val(JSON.stringify(mappedDefaultValues));
|
|
return true;
|
|
},
|
|
|
|
validateCustomMap: function() {
|
|
var errorMessage;
|
|
var params = {};
|
|
var saveMap = jQuery('#save_map').is(':checked');
|
|
if(saveMap) {
|
|
var mapName = jQuery('#save_map_as').val();
|
|
if(jQuery.trim(mapName) == '') {
|
|
errorMessage = app.vtranslate('JS_MAP_NAME_CAN_NOT_BE_EMPTY');
|
|
params = {
|
|
text: errorMessage,
|
|
'type': 'error'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
return false;
|
|
}
|
|
var mapOptions = jQuery('#saved_maps option');
|
|
for(var i=0; i<mapOptions.length; ++i) {
|
|
var mapOption = jQuery(mapOptions.get(i));
|
|
if(mapOption.html() == mapName) {
|
|
errorMessage = app.vtranslate('JS_MAP_NAME_ALREADY_EXISTS');
|
|
params = {
|
|
text: errorMessage,
|
|
'type': 'error'
|
|
};
|
|
Vtiger_Helper_Js.showMessage(params);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
},
|
|
|
|
loadSavedMap: function() {
|
|
var selectedMapElement = jQuery('#saved_maps option:selected');
|
|
var mapId = selectedMapElement.attr('id');
|
|
var fieldsList = jQuery('.fieldIdentifier');
|
|
var deleteMapContainer = jQuery('#delete_map_container');
|
|
fieldsList.each(function(i, element) {
|
|
var fieldElement = jQuery(element);
|
|
jQuery('[name=mapped_fields]', fieldElement).val('');
|
|
});
|
|
if(mapId == -1) {
|
|
deleteMapContainer.hide();
|
|
return;
|
|
}
|
|
deleteMapContainer.show();
|
|
var mappingString = selectedMapElement.val()
|
|
if(mappingString == '') return;
|
|
var mappingPairs = mappingString.split('&');
|
|
var mapping = {};
|
|
for(var i=0; i<mappingPairs.length; ++i) {
|
|
var mappingPair = mappingPairs[i].split('=');
|
|
var header = mappingPair[0];
|
|
header = header.replace(/\/eq\//g, '=');
|
|
header = header.replace(/\/amp\//g, '&');
|
|
mapping["'"+header+"'"] = mappingPair[1];
|
|
}
|
|
fieldsList.each(function(i, element) {
|
|
var fieldElement = jQuery(element);
|
|
var mappedFields = jQuery('[name=mapped_fields]', fieldElement);
|
|
var rowId = jQuery('[name=row_counter]', fieldElement).get(0).value;
|
|
var headerNameElement = jQuery('[name=header_name]', fieldElement).get(0);
|
|
var headerName = jQuery(headerNameElement).html();
|
|
if("'"+headerName+"'" in mapping) {
|
|
mappedFields.val(mapping["'"+headerName+"'"]);
|
|
} else if(rowId in mapping) {
|
|
mappedFields.val($rowId);
|
|
}
|
|
mappedFields.trigger('liszt:updated');
|
|
ImportJs.loadDefaultValueWidget(fieldElement.attr('id'));
|
|
});
|
|
},
|
|
|
|
deleteMap : function(module) {
|
|
if(confirm(app.vtranslate('LBL_DELETE_CONFIRMATION'))) {
|
|
var selectedMapElement = jQuery('#saved_maps option:selected');
|
|
var mapId = selectedMapElement.attr('id');
|
|
var status = jQuery('#status');
|
|
status.show();
|
|
var postData = {
|
|
"module": module,
|
|
"view": 'Import',
|
|
"mode": 'deleteMap',
|
|
"mapid": mapId
|
|
}
|
|
|
|
AppConnector.request(postData).then(
|
|
function(data){
|
|
jQuery('#savedMapsContainer').html(data);
|
|
status.hide();
|
|
var parent = jQuery("#saved_maps");
|
|
app.changeSelectElementView(parent);
|
|
},
|
|
function(error,err){
|
|
|
|
}
|
|
);
|
|
}
|
|
},
|
|
|
|
loadDefaultValueWidget: function(rowIdentifierId) {
|
|
var affectedRow = jQuery('#'+rowIdentifierId);
|
|
if(typeof affectedRow == 'undefined' || affectedRow == null) return;
|
|
var selectedFieldElement = jQuery('[name=mapped_fields]', affectedRow).get(0);
|
|
var selectedFieldName = jQuery(selectedFieldElement).val();
|
|
var defaultValueContainer = jQuery(jQuery('[name=default_value_container]', affectedRow).get(0));
|
|
var allDefaultValuesContainer = jQuery('#defaultValuesElementsContainer');
|
|
if(defaultValueContainer.children.length > 0) {
|
|
var copyOfDefaultValueWidget = jQuery(':first', defaultValueContainer).detach();
|
|
copyOfDefaultValueWidget.appendTo(allDefaultValuesContainer);
|
|
}
|
|
var selectedFieldDefValueContainer = jQuery('#'+selectedFieldName+'_defaultvalue_container', allDefaultValuesContainer);
|
|
var defaultValueWidget = selectedFieldDefValueContainer.detach();
|
|
defaultValueWidget.appendTo(defaultValueContainer);
|
|
},
|
|
|
|
loadDefaultValueWidgetForMappedFields: function() {
|
|
var fieldsList = jQuery('.fieldIdentifier');
|
|
fieldsList.each(function(i, element) {
|
|
var fieldElement = jQuery(element);
|
|
var mappedFieldName = jQuery('[name=mapped_fields]', fieldElement).val();
|
|
if(mappedFieldName != '') {
|
|
ImportJs.loadDefaultValueWidget(fieldElement.attr('id'));
|
|
}
|
|
});
|
|
|
|
}
|
|
}
|
|
|
|
jQuery(document).ready(function() {
|
|
ImportJs.toogleMergeConfiguration();
|
|
ImportJs.loadDefaultValueWidgetForMappedFields();
|
|
ImportJs.registerImportClickEvent();
|
|
});
|
|
} |