Files
crm.clientright.ru/libraries/jquery/VtJqplotInterface.js
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- 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.
2025-10-16 11:17:21 +03:00

331 lines
12 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.
*************************************************************************************/
var vtJqPlotInterface = function() {
this.legendPlacement = 'outside'; /* refer: http://www.jqplot.com/docs/files/jqplot-core-js.html#Legend.placement */
this.renderPie = function() {
this.element.jqplot([this.data['chartData']], {
seriesDefaults:{
renderer:jQuery.jqplot.PieRenderer,
rendererOptions: {
showDataLabels: true,
dataLabels: 'value'
}
},
legend: {
show: true,
location: 'e'
},
title : this.data['title']
});
}
this.renderBar = function() {
this.element.jqplot(this.data['chartData'] , {
title: this.data['title'],
animate: !$.jqplot.use_excanvas,
seriesDefaults:{
renderer:jQuery.jqplot.BarRenderer,
rendererOptions: {
showDataLabels: true,
dataLabels: 'value',
barDirection : 'vertical'
},
pointLabels: {show: true,edgeTolerance: -15}
},
axes: {
xaxis: {
tickRenderer: jQuery.jqplot.CanvasAxisTickRenderer,
renderer: jQuery.jqplot.CategoryAxisRenderer,
ticks: this.data['labels'],
tickOptions: {
angle: -45
}
},
yaxis: {
min:0,
max: this.data['yMaxValue'],
tickOptions: {
formatString: '%d'
},
pad : 1.2
}
},
legend: {
show : (this.data['data_labels']) ? true:false,
location : 'e',
placement : this.legendPlacement,
showLabels : (this.data['data_labels']) ? true:false,
showSwatch : (this.data['data_labels']) ? true:false,
labels : this.data['data_labels']
}
});
}
this.renderFunnel = function() {
var labels = new Array();
var dataInfo = JSON.parse(this.data);
for(var i=0; i<dataInfo.length; i++) {
labels[i] = dataInfo[i][2];
dataInfo[i][1] = parseFloat(dataInfo[i][1]);
}
/* Transform data friendly to Funnel renderer */
var tmpdataInfo = [];
for (var k in dataInfo) {
tmpdataInfo.push(Object.values(dataInfo[k]));
}
dataInfo = tmpdataInfo;
/* End */
this.element.jqplot([dataInfo], {
seriesDefaults: {
renderer:jQuery.jqplot.FunnelRenderer,
rendererOptions:{
sectionMargin: 12,
widthRatio: 0.1,
showDataLabels:true,
dataLabelThreshold: 0,
dataLabels: 'value'
}
},
legend: {
show: true,
location: 'ne',
placement: this.legendPlacement,
labels:labels,
xoffset:20
}
});
}
this.renderMultibar = function() {
var chartData = this.data.data;
var ticks = this.data.ticks;
var labels = this.data.labels;
this.element.jqplot( chartData, {
stackSeries: true,
captureRightClick: true,
seriesDefaults:{
renderer:$.jqplot.BarRenderer,
rendererOptions: {
// Put a 30 pixel margin between bars.
barMargin: 10,
// Highlight bars when mouse button pressed.
// Disables default highlighting on mouse over.
highlightMouseDown: true,
highlightMouseOver : true
},
pointLabels: {show: true,hideZeros: true}
},
axes: {
xaxis: {
renderer: $.jqplot.CategoryAxisRenderer,
tickRenderer: $.jqplot.CanvasAxisTickRenderer,
tickOptions: {
angle: -45
},
ticks: ticks
},
yaxis: {
// Don't pad out the bottom of the data range. By default,
// axes scaled as if data extended 10% above and below the
// actual range to prevent data points right on grid boundaries.
// Don't want to do that here.
padMin: 0,
min:0
}
},
legend: {
show: true,
//SalesPaltform.ru begin
location: 'ne',
placement: this.legendPlacement,
//location: 'e',
//placement: this.legendPlacement,
//SalesPaltform.ru end
labels:labels
}
});
}
this.renderHorizontalbar = function() {
this.element.jqplot(this.data['chartData'], {
title: this.data['title'],
animate: !$.jqplot.use_excanvas,
seriesDefaults: {
renderer:$.jqplot.BarRenderer,
showDataLabels: true,
pointLabels: { show: true, location: 'e', edgeTolerance: -15 },
shadowAngle: 135,
rendererOptions: {
barDirection: 'horizontal'
}
},
axes: {
yaxis: {
tickRenderer: jQuery.jqplot.CanvasAxisTickRenderer,
renderer: jQuery.jqplot.CategoryAxisRenderer,
ticks: this.data['labels'],
tickOptions: {
angle: -45
}
}
},
legend: {
show: true,
location: 'e',
placement: this.legendPlacement,
showSwatch : true,
showLabels : true,
labels:this.data['data_labels']
}
});
}
this.renderLine = function() {
this.element.jqplot(this.data['chartData'], {
title: this.data['title'],
legend:{
show:true,
labels:this.data['data_labels'],
location:'ne',
showSwatch : true,
showLabels : true,
placement : this.legendPlacement,
},
seriesDefaults: {
pointLabels: {
show: true
}
},
axes: {
xaxis: {
min:0,
pad: 1,
tickRenderer: jQuery.jqplot.CanvasAxisTickRenderer,
renderer: $.jqplot.CategoryAxisRenderer,
ticks:this.data['labels'],
tickOptions: {
formatString: '%b %#d',
angle: -30
}
}
},
cursor: {
show: true
}
});
}
this.renderColumn = function() {
var chartData = [];
var ticks = this.data.categories;
var labels = [];
for(var i = 0; i < this.data.chartData.length ; i++){
labels.push(this.data.chartData[i].name);
chartData.push(this.data.chartData[i].data);
}
this.element.jqplot( chartData, {
stackSeries: false,
captureRightClick: true,
seriesDefaults:{
renderer:$.jqplot.BarRenderer,
rendererOptions: {
// Put a 30 pixel margin between bars.
barMargin: 10,
// Highlight bars when mouse button pressed.
// Disables default highlighting on mouse over.
highlightMouseDown: true,
highlightMouseOver : true
},
pointLabels: {show: true,hideZeros: true}
},
axes: {
xaxis: {
renderer: $.jqplot.CategoryAxisRenderer,
tickRenderer: $.jqplot.CanvasAxisTickRenderer,
tickOptions: {
angle: -45
},
ticks: ticks
},
yaxis: {
// Don't pad out the bottom of the data range. By default,
// axes scaled as if data extended 10% above and below the
// actual range to prevent data points right on grid boundaries.
// Don't want to do that here.
padMin: 0,
min:0
}
},
legend: {
show: true,
location: 'e',
placement: this.legendPlacement,
labels:labels
}
});
}
this.registerClick = function() {
var thisInstance = this;
this.element.on('jqplotDataClick',function(ev, gridpos, datapos, neighbor, plot){
var url;
switch(thisInstance.options.renderer){
case 'funnel' :
url = thisInstance.options.links[datapos]['links'];
break;
case 'multibar' :
if(thisInstance.options.links)
url = thisInstance.options.links[gridpos][datapos];
break;
// bar,pie,linechart,horizontalbar
default :
if(typeof thisInstance.options.links != 'undefined')
url = thisInstance.options.links[datapos];
break;
}
thisInstance.triggerClick({'url':url});
});
}
this.postRendering = function() {
this.element.on("jqplotDataMouseOver", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'pointer' );
});
this.element.on("jqplotDataUnhighlight", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'auto' );
});
this.registerClick();
}
this.init = function(element,data,options) {
this.element = element;
this.data = data;
this.options = options;
switch(this.options.renderer) {
case 'pie' : this.renderPie();break;
case 'bar' : this.renderBar();break;
case 'funnel' : this.renderFunnel();break;
case 'multibar' : this.renderMultibar();break;
case 'horizontalbar' : this.renderHorizontalbar();break;
case 'linechart' : this.renderLine();break;
case 'column' : this.renderColumn();break;
default : console.log('jqplot renderer not supported');
}
this.postRendering();
}
}