- 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.
336 lines
11 KiB
JavaScript
336 lines
11 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("Vtiger_CustomView_Js",{
|
|
},{
|
|
contianer : false,
|
|
|
|
advanceFilterInstance : false,
|
|
|
|
columnListSelect2Element : false,
|
|
|
|
columnSelectElement : false,
|
|
|
|
reIntialize : function () {
|
|
this.contianer = false;
|
|
this.columnListSelect2Element = false;
|
|
this.advanceFilterInstance = false;
|
|
this.columnSelectElement = false;
|
|
},
|
|
|
|
getContainer : function() {
|
|
if(this.container == false) {
|
|
this.container = jQuery('#filterContainer');
|
|
}
|
|
return this.container
|
|
},
|
|
|
|
getColumnListSelect2Element : function() {
|
|
if(this.columnListSelect2Element == false){
|
|
this.columnListSelect2Element = jQuery('#s2id_viewColumnsSelect');
|
|
}
|
|
return this.columnListSelect2Element;
|
|
},
|
|
|
|
/**
|
|
* Function to get the view columns selection element
|
|
* @return : jQuery object of view columns selection element
|
|
*/
|
|
getColumnSelectElement : function() {
|
|
if(this.columnSelectElement == false) {
|
|
this.columnSelectElement = jQuery('#viewColumnsSelect');
|
|
}
|
|
return this.columnSelectElement;
|
|
},
|
|
|
|
/**
|
|
* Function to regiser the event to make the columns list sortable
|
|
*/
|
|
makeColumnListSortable : function() {
|
|
var select2Element = this.getColumnListSelect2Element();
|
|
//TODO : peform the selection operation in context this might break if you have multi select element in advance filter
|
|
//The sorting is only available when Select2 is attached to a hidden input field.
|
|
var chozenChoiceElement = select2Element.find('ul.select2-choices');
|
|
chozenChoiceElement.sortable({
|
|
'containment': chozenChoiceElement,
|
|
start: function() { },
|
|
update: function() {}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Function which will arrange the chosen element choices in order
|
|
*/
|
|
arrangeSelectChoicesInOrder : function() {
|
|
var contentsContainer = this.getContainer();
|
|
var chosenElement = this.getColumnListSelect2Element();
|
|
var choicesContainer = chosenElement.find('ul.select2-choices');
|
|
var choicesList = choicesContainer.find('li.select2-search-choice');
|
|
var columnListSelectElement = this.getColumnSelectElement();
|
|
var selectedOptions = columnListSelectElement.find('option:selected');
|
|
var selectedOrder = JSON.parse(jQuery('input[name="columnslist"]', contentsContainer).val());
|
|
|
|
for(var index=selectedOrder.length ; index > 0 ; index--) {
|
|
var selectedValue = selectedOrder[index-1];
|
|
var value = selectedValue.replace("'", "'");
|
|
var option = selectedOptions.filter('[value="'+value+'"]');
|
|
choicesList.each(function(choiceListIndex,element){
|
|
var liElement = jQuery(element);
|
|
if(liElement.find('div').html() == option.html()){
|
|
choicesContainer.prepend(liElement);
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Function which will get the selected columns with order preserved
|
|
* @return : array of selected values in order
|
|
*/
|
|
getSelectedColumns : function() {
|
|
var columnListSelectElement = this.getColumnSelectElement();
|
|
var select2Element = this.getColumnListSelect2Element();
|
|
|
|
var selectedValuesByOrder = new Array();
|
|
var selectedOptions = columnListSelectElement.find('option:selected');
|
|
|
|
var orderedSelect2Options = select2Element.find('li.select2-search-choice').find('div');
|
|
orderedSelect2Options.each(function(index,element){
|
|
var chosenOption = jQuery(element);
|
|
selectedOptions.each(function(optionIndex, domOption){
|
|
var option = jQuery(domOption);
|
|
if(option.html() == chosenOption.html()) {
|
|
selectedValuesByOrder.push(option.val());
|
|
return false;
|
|
}
|
|
});
|
|
});
|
|
return selectedValuesByOrder;
|
|
},
|
|
|
|
doOperation : function (url) {
|
|
var aDeferred = new jQuery.Deferred();
|
|
app.helper.showProgress();
|
|
app.request.get({'url':url}).then(function(error,data){
|
|
app.helper.hideProgress();
|
|
aDeferred.resolve(data);
|
|
});
|
|
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
showCreateFilter : function(data){
|
|
var self = this;
|
|
self.reIntialize();
|
|
app.helper.loadPageContentOverlay(data).then(function(data){
|
|
data.find('.data').css('height','100%');
|
|
var Options= {
|
|
autoExpandScrollbar: true,
|
|
scrollInertia: 200,
|
|
autoHideScrollbar: true,
|
|
|
|
mouseWheel: {
|
|
enable: true,
|
|
preventDefault: true,
|
|
scrollAmount: 50
|
|
}
|
|
};
|
|
app.helper.showVerticalScroll(jQuery('.customview-content '), Options);
|
|
self.advanceFilterInstance = new Vtiger_AdvanceFilter_Js(data.find('.filterConditionsDiv'));
|
|
self.registerFilterCreateEvents();
|
|
});
|
|
},
|
|
|
|
saveFilter : function() {
|
|
var aDeferred = jQuery.Deferred();
|
|
var formElement = jQuery("#CustomView");
|
|
var formData = formElement.serializeFormData();
|
|
|
|
app.helper.showProgress();
|
|
|
|
app.request.post({'data':formData}).then(
|
|
function(error,data){
|
|
if(error === null){
|
|
app.helper.hideProgress();
|
|
window.onbeforeunload = null;
|
|
aDeferred.resolve(data);
|
|
}
|
|
else{
|
|
app.helper.hideProgress();
|
|
aDeferred.reject();
|
|
app.helper.showErrorNotification({'message': app.vtranslate('JS_VIEW_ALREADY_EXISTS')});
|
|
}
|
|
}
|
|
);
|
|
return aDeferred.promise();
|
|
},
|
|
|
|
saveAndViewFilter : function(){
|
|
this.saveFilter().then(function (response) {
|
|
if (typeof response != "undefined") {
|
|
app.helper.showSuccessNotification({'message':app.vtranslate('JS_LIST_SAVED')});
|
|
var appName = app.getAppName();
|
|
var url = response['listviewurl']+'&app='+appName;
|
|
window.location.href = url;
|
|
} else {
|
|
app.helper.showErrorNotification({message: app.vtranslate('JS_FAILED_TO_SAVE')});
|
|
}
|
|
});
|
|
},
|
|
|
|
isAllUsersSelected : function() {
|
|
var memberList = jQuery('#memberList').val();
|
|
return (memberList != null && (memberList.indexOf('All::Users') != -1)) ? true : false
|
|
},
|
|
|
|
registerOnlyAllUsersInSharedList : function(){
|
|
var self = this;
|
|
jQuery('#memberList').on('change',function(e){
|
|
var element = jQuery(e.currentTarget);
|
|
if(self.isAllUsersSelected()){
|
|
element.find('option').not('[value="All::Users"]').prop('disabled',true);
|
|
element.select2('val',['All::Users']);
|
|
element.select2('close');
|
|
}else{
|
|
element.find('option').removeProp('disabled');
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Function which will register the select2 elements for columns selection
|
|
*/
|
|
registerSelect2ElementForColumnsSelection : function() {
|
|
var selectElement = this.getColumnSelectElement();
|
|
vtUtils.showSelect2ElementView(selectElement,{maximumSelectionSize: 15});
|
|
},
|
|
|
|
registerFilterCreateEvents : function() {
|
|
var self = this;
|
|
self.registerSelect2ElementForColumnsSelection();
|
|
this.arrangeSelectChoicesInOrder();
|
|
this.makeColumnListSortable();
|
|
this.registerToogleShareList();
|
|
this.registerOnlyAllUsersInSharedList();
|
|
var customViewForm = jQuery('#CustomView');
|
|
|
|
if(customViewForm.length > 0) {
|
|
customViewForm.vtValidate({
|
|
submitHandler : function(form){
|
|
var form = jQuery(form);
|
|
var selectElement = form.find('#viewColumnsSelect');
|
|
var mandatoryFieldsList = JSON.parse(jQuery('#mandatoryFieldsList').val());
|
|
var selectedOptions = selectElement.val();
|
|
var mandatoryFieldsMissing = true;
|
|
for(var i=0; i<selectedOptions.length; i++) {
|
|
if(jQuery.inArray(selectedOptions[i], mandatoryFieldsList) >= 0) {
|
|
mandatoryFieldsMissing = false;
|
|
break;
|
|
}
|
|
}
|
|
if(mandatoryFieldsMissing){
|
|
//SalesPlatform.ru begin localization fix
|
|
//app.helper.showErrorNotification({message:"Select atleast one mandatory value."});
|
|
app.helper.showErrorNotification({message:app.vtranslate('JS_PLEASE_SELECT_ATLEAST_ONE_MANDATORY_FIELD')});
|
|
//SalesPlatform.ru end localization fix
|
|
return false;
|
|
}
|
|
//handled advanced filters saved values.
|
|
var advfilterlist = self.advanceFilterInstance.getValues();
|
|
jQuery('#advfilterlist').val(JSON.stringify(advfilterlist));
|
|
|
|
var selectValueElements = self.getColumnSelectElement().select2('data');
|
|
var selectedValues = [];
|
|
for(i=0; i<selectValueElements.length; i++) {
|
|
selectedValues.push(selectValueElements[i].id);
|
|
}
|
|
var selectValues = JSON.stringify(selectedValues);
|
|
jQuery('input[name="columnslist"]', self.getContainer()).val(selectValues);
|
|
var allUsersStatusEle = jQuery('#allUsersStatusValue');
|
|
if(self.isAllUsersSelected() && (jQuery('[data-toogle-members]').is(":checked"))){
|
|
allUsersStatusEle.val(allUsersStatusEle.data('public'));
|
|
}else{
|
|
allUsersStatusEle.val(allUsersStatusEle.data('private'));
|
|
}
|
|
self.saveAndViewFilter();
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
registerToogleShareList : function() {
|
|
jQuery('[data-toogle-members]').on('change',function(e){
|
|
var element = jQuery(e.currentTarget);
|
|
if(element.is(':checked')){
|
|
jQuery('#memberList').addClass('fadeInx').data('rule-required',true);
|
|
}
|
|
else {
|
|
jQuery('#memberList').removeClass('fadeInx').data('rule-required',false);
|
|
}
|
|
});
|
|
},
|
|
|
|
registerEvents : function() {
|
|
var self = this;
|
|
jQuery(document).on('post.CreateFilter.click',function(e,params){
|
|
self.doOperation(params.url).then(function(data){
|
|
self.showCreateFilter(data);
|
|
var form = jQuery('#CustomView');
|
|
app.helper.registerLeavePageWithoutSubmit(form);
|
|
app.helper.registerModalDismissWithoutSubmit(form);
|
|
})
|
|
});
|
|
|
|
jQuery(document).on('post.DeleteFilter.click',function(e,params){
|
|
var target = jQuery(e.target);
|
|
// SalesPlatform.ru begin
|
|
//app.helper.showConfirmationBox({'message': app.vtranslate('LBL_LIST_DELETE_CONFIRMATION')}).then(
|
|
app.helper.showConfirmationBox({'message': app.vtranslate('JS_LIST_DELETE_CONFIRMATION')}).then(
|
|
// SalesPlatform.ru end
|
|
function(){
|
|
app.helper.showProgress();
|
|
app.request.post({'url':params.url}).then(function(){
|
|
app.helper.hideProgress();
|
|
target.trigger('post.DeletedFilter');
|
|
// moduleFiltersId is Default All Filter Id
|
|
var moduleFiltersId = jQuery('.module-filters input[name=allCvId]').val();
|
|
jQuery(".listViewFilter ").find('.filterName').each(function(key, ele){
|
|
var filterId = jQuery(ele).data('filter-id');
|
|
if(filterId == moduleFiltersId){
|
|
jQuery(ele).trigger('click');
|
|
return false;
|
|
}
|
|
});
|
|
});
|
|
},
|
|
function(){
|
|
}
|
|
);
|
|
});
|
|
|
|
jQuery(document).on('post.ToggleDefault.click',function(e,params){
|
|
var target = jQuery(e.target);
|
|
var url = target.data('url');
|
|
var currentValue = target.data('isDefault');
|
|
var params = {};
|
|
params.url = url;
|
|
params.data = {};
|
|
if(currentValue) {
|
|
params.data.setdefault = '0';
|
|
}else{
|
|
params.data.setdefault = '1';
|
|
}
|
|
app.request.post(params).then(function(error,data){
|
|
target.trigger('post.ToggleDefault.saved',data);
|
|
})
|
|
});
|
|
}
|
|
}); |