晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/public_html/crm/layouts/vlayout/modules/Vtiger/resources/dashboards/ |
Upload File : |
/*+***********************************************************************************
* 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_Widget_Js',{
widgetPostLoadEvent : 'Vtiget.Dashboard.PostLoad',
widgetPostRefereshEvent : 'Vtiger.Dashboard.PostRefresh',
getInstance : function(container, widgetName, moduleName) {
if(typeof moduleName == 'undefined') {
moduleName = app.getModuleName();
}
var widgetClassName = widgetName.toCamelCase();
var moduleClass = window[moduleName+"_"+widgetClassName+"_Widget_Js"];
var fallbackClass = window["Vtiger_"+widgetClassName+"_Widget_Js"];
var basicClass = Vtiger_Widget_Js;
if(typeof moduleClass != 'undefined') {
var instance = new moduleClass(container);
}else if(typeof fallbackClass != 'undefined') {
var instance = new fallbackClass(container);
} else {
var instance = new basicClass(container);
}
return instance;
}
},{
container : false,
plotContainer : false,
init : function (container) {
this.setContainer(jQuery(container));
this.registerWidgetPostLoadEvent(container);
this.registerWidgetPostRefreshEvent(container);
},
getContainer : function() {
return this.container;
},
setContainer : function(element) {
this.container = element;
return this;
},
isEmptyData : function() {
var container = this.getContainer();
return (container.find('.noDataMsg').length > 0) ? true : false;
},
getUserDateFormat : function() {
return jQuery('#userDateFormat').val();
},
getPlotContainer : function(useCache) {
if(typeof useCache == 'undefined'){
useCache = false;
}
if(this.plotContainer == false || !useCache) {
var container = this.getContainer();
this.plotContainer = container.find('.widgetChartContainer');
}
return this.plotContainer;
},
restrictContentDrag : function(){
this.getContainer().on('mousedown.draggable', function(e){
var element = jQuery(e.target);
var isHeaderElement = element.closest('.dashboardWidgetHeader').length > 0 ? true : false;
if(isHeaderElement){
return;
}
//Stop the event propagation so that drag will not start for contents
e.stopPropagation();
})
},
convertToDateRangePicketFormat : function(userDateFormat) {
if(userDateFormat == 'yyyy-mm-dd') {
return 'yyyy-MM-dd';
}else if( userDateFormat == 'mm-dd-yyyy') {
return 'MM-dd-yyyy';
}else if(userDateFormat == 'dd-mm-yyyy') {
return 'dd-MM-yyyy';
}
},
loadChart : function() {
},
positionNoDataMsg : function() {
var container = this.getContainer();
var widgetContentsContainer = container.find('.dashboardWidgetContent');
var noDataMsgHolder = widgetContentsContainer.find('.noDataMsg');
noDataMsgHolder.position({
'my' : 'center center',
'at' : 'center center',
'of' : widgetContentsContainer
})
},
//Place holdet can be extended by child classes and can use this to handle the post load
postLoadWidget : function() {
if(!this.isEmptyData()) {
this.loadChart();
}else{
this.positionNoDataMsg();
}
this.registerSectionClick();
this.registerFilter();
this.registerFilterChangeEvent();
this.restrictContentDrag();
},
postRefreshWidget : function() {
if(!this.isEmptyData()) {
this.loadChart();
}else{
this.positionNoDataMsg();
}
},
getFilterData : function() {
return {};
},
refreshWidget : function() {
var parent = this.getContainer();
var element = parent.find('a[name="drefresh"]');
var url = element.data('url');
var contentContainer = parent.find('.dashboardWidgetContent');
var params = url;
var widgetFilters = parent.find('.widgetFilter');
if(widgetFilters.length > 0) {
params = {};
params.url = url;
params.data = {}
widgetFilters.each(function(index, domElement){
var widgetFilter = jQuery(domElement);
if(widgetFilter.is('.dateRange')){
var dateRangeVal = widgetFilter.val();
//If not value exists for date field then dont send the value
if(dateRangeVal.length <= 0) {
return true;
}
var name = widgetFilter.attr('name');
var dateRangeValComponents = dateRangeVal.split(',');
params.data[name] = {};
params.data[name].start = dateRangeValComponents[0];
params.data[name].end = dateRangeValComponents[1];
}else{
var filterName = widgetFilter.attr('name');
var filterValue = widgetFilter.val();
params.data[filterName] = filterValue;
}
});
}
var filterData = this.getFilterData();
if(! jQuery.isEmptyObject(filterData)) {
if(typeof params == 'string') {
url = params;
params = {};
params.url = url
params.data = {};
}
params.data = jQuery.extend(params.data, this.getFilterData())
}
var refreshContainer = parent.find('.refresh');
refreshContainer.progressIndicator({
'smallLoadingImage' : true
});
AppConnector.request(params).then(
function(data){
refreshContainer.progressIndicator({'mode': 'hide'});
contentContainer.html(data).trigger(Vtiger_Widget_Js.widgetPostRefereshEvent);
},
function(){
refreshContainer.progressIndicator({'mode': 'hide'});
}
);
},
registerFilter : function() {
var thisInstance = this;
var container = this.getContainer();
var dateRangeElement = container.find('input.dateRange');
var dateChanged = false;
if(dateRangeElement.length <= 0) {
return;
}
var customParams = {
calendars: 3,
mode: 'range',
className : 'rangeCalendar',
onChange: function(formated) {
dateChanged = true;
var element = jQuery(this).data('datepicker').el;
jQuery(element).val(formated);
},
onHide : function() {
if(dateChanged){
container.find('a[name="drefresh"]').trigger('click');
dateChanged = false;
}
},
onBeforeShow : function(elem) {
jQuery(elem).css('z-index','3');
}
}
dateRangeElement.addClass('dateField').attr('data-date-format',thisInstance.getUserDateFormat());
app.registerEventForDatePickerFields(dateRangeElement,false,customParams);
},
registerFilterChangeEvent : function() {
this.getContainer().on('change', '.widgetFilter', function(e) {
var widgetContainer = jQuery(e.currentTarget).closest('li');
widgetContainer.find('a[name="drefresh"]').trigger('click');
})
},
registerWidgetPostLoadEvent : function(container) {
var thisInstance = this;
container.on(Vtiger_Widget_Js.widgetPostLoadEvent, function(e) {
thisInstance.postLoadWidget();
})
},
registerWidgetPostRefreshEvent : function(container) {
var thisInstance = this;
container.on(Vtiger_Widget_Js.widgetPostRefereshEvent, function(e) {
thisInstance.postRefreshWidget();
});
},
registerSectionClick : function() {
this.getContainer().on('jqplotClick', function() {
var sectionData = arguments[3];
var assignedUserId = sectionData[0];
//TODO : we need to construct the list url with the sales stage and filters
});
}
});
Vtiger_Widget_Js('Vtiger_History_Widget_Js', {}, {
postLoadWidget: function() {
this._super();
var widgetContent = jQuery('.dashboardWidgetContent', this.getContainer());
widgetContent.css({height: widgetContent.height()-40});
this.registerLoadMore();
},
postRefreshWidget: function() {
this._super();
this.registerLoadMore();
},
registerLoadMore: function() {
var thisInstance = this;
var parent = thisInstance.getContainer();
var contentContainer = parent.find('.dashboardWidgetContent');
var loadMoreHandler = contentContainer.find('.load-more');
loadMoreHandler.click(function(){
var parent = thisInstance.getContainer();
var element = parent.find('a[name="drefresh"]');
var url = element.data('url');
var params = url;
var widgetFilters = parent.find('.widgetFilter');
if(widgetFilters.length > 0) {
params = { url: url, data: {}};
widgetFilters.each(function(index, domElement){
var widgetFilter = jQuery(domElement);
var filterName = widgetFilter.attr('name');
var filterValue = widgetFilter.val();
params.data[filterName] = filterValue;
});
}
var filterData = thisInstance.getFilterData();
if(! jQuery.isEmptyObject(filterData)) {
if(typeof params == 'string') {
params = { url: url, data: {}};
}
params.data = jQuery.extend(params.data, thisInstance.getFilterData())
}
// Next page.
params.data['page'] = loadMoreHandler.data('nextpage');
var refreshContainer = parent.find('.refresh');
refreshContainer.progressIndicator({
'smallLoadingImage' : true
});
AppConnector.request(params).then(function(data){
refreshContainer.progressIndicator({'mode': 'hide'});
loadMoreHandler.replaceWith(data);
thisInstance.registerLoadMore();
}, function(){
refreshContainer.progressIndicator({'mode': 'hide'});
});
});
}
});
Vtiger_Widget_Js('Vtiger_Funnel_Widget_Js',{},{
postLoadWidget: function() {
this._super();
var thisInstance = this;
this.getContainer().on('jqplotDataClick', function(ev, gridpos, datapos, neighbor, plot) {
var jData = thisInstance.getContainer().find('.widgetData').val();
var data = JSON.parse(jData);
var linkUrl = data[datapos][3];
if(linkUrl) window.location.href = linkUrl;
});
this.getContainer().on("jqplotDataHighlight", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'pointer' );
});
this.getContainer().on("jqplotDataUnhighlight", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'auto' );
});
},
loadChart : function() {
var container = this.getContainer();
var data = container.find('.widgetData').val();
var labels = new Array();
var dataInfo = JSON.parse(data);
for(var i=0; i<dataInfo.length; i++) {
labels[i] = dataInfo[i][2];
dataInfo[i][1] = parseFloat(dataInfo[i][1]);
}
this.getPlotContainer(false).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: 'outside',
labels:labels,
xoffset:20
}
});
},
registerSectionClick : function() {
this.getContainer().on('jqplotDataClick', function() {
var sectionData = arguments[3];
var salesStageValue = sectionData[0];
//TODO : we need to construct the list url with the sales stage and filters
})
}
});
Vtiger_Widget_Js('Vtiger_Pie_Widget_Js',{},{
/**
* Function which will give chart related Data
*/
generateData : function() {
var container = this.getContainer();
var jData = container.find('.widgetData').val();
var data = JSON.parse(jData);
var chartData = [];
for(var index in data) {
var row = data[index];
var rowData = [row.last_name, parseFloat(row.amount), row.id];
chartData.push(rowData);
}
return {'chartData':chartData};
},
postLoadWidget: function() {
this._super();
var thisInstance = this;
this.getContainer().on('jqplotDataClick', function(ev, gridpos, datapos, neighbor, plot) {
var jData = thisInstance.getContainer().find('.widgetData').val();
var data = JSON.parse(jData);
var linkUrl = data[datapos]['links'];
if(linkUrl) window.location.href = linkUrl;
});
this.getContainer().on("jqplotDataHighlight", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'pointer' );
});
this.getContainer().on("jqplotDataUnhighlight", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'auto' );
});
},
loadChart : function() {
var chartData = this.generateData();
this.getPlotContainer(false).jqplot([chartData['chartData']], {
seriesDefaults:{
renderer:jQuery.jqplot.PieRenderer,
rendererOptions: {
showDataLabels: true,
dataLabels: 'value'
}
},
legend: {
show: true,
location: 'e'
},
title : chartData['title']
});
},
registerSectionClick : function() {
this.getPlotContainer().on('jqplotDataClick', function() {
var sectionData = arguments[3];
var assignedUserId = sectionData[2];
//TODO : we need to construct the list url with the sales stage and filters
})
}
});
Vtiger_Widget_Js('Vtiger_Barchat_Widget_Js',{},{
generateChartData : function() {
var container = this.getContainer();
var jData = container.find('.widgetData').val();
var data = JSON.parse(jData);
var chartData = [];
var xLabels = new Array();
var yMaxValue = 0;
for(var index in data) {
var row = data[index];
row[0] = parseInt(row[0]);
xLabels.push(app.getDecodedValue(row[1]))
chartData.push(row[0]);
if(parseInt(row[0]) > yMaxValue){
yMaxValue = parseInt(row[0]);
}
}
// yMaxValue Should be 25% more than Maximum Value
yMaxValue = yMaxValue + 2 + (yMaxValue/100)*25;
return {'chartData':[chartData], 'yMaxValue':yMaxValue, 'labels':xLabels};
},
postLoadWidget: function() {
this._super();
var thisInstance = this;
this.getContainer().on('jqplotDataClick', function(ev, gridpos, datapos, neighbor, plot) {
var jData = thisInstance.getContainer().find('.widgetData').val();
var data = JSON.parse(jData);
var linkUrl = data[datapos]['links'];
if(linkUrl) window.location.href = linkUrl;
});
this.getContainer().on("jqplotDataHighlight", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'pointer' );
});
this.getContainer().on("jqplotDataUnhighlight", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'auto' );
});
},
loadChart : function() {
var data = this.generateChartData();
this.getPlotContainer(false).jqplot(data['chartData'] , {
title: 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: data['labels'],
tickOptions: {
angle: -45
}
},
yaxis: {
min:0,
max: data['yMaxValue'],
tickOptions: {
formatString: '%d'
},
pad : 1.2
}
},
legend: {
show : (data['data_labels']) ? true:false,
location : 'e',
placement : 'outside',
showLabels : (data['data_labels']) ? true:false,
showSwatch : (data['data_labels']) ? true:false,
labels : data['data_labels']
}
});
// this.getPlotContainer(false).on('jqPlotDataClick', function(){
// console.log('here');
// });
// jQuery.jqplot.eventListenerHooks.push(['jqPlotDataClick', myClickHandler]);
}
// registerSectionClick : function() {
// this.getPlotContainer(false);
// }
});
Vtiger_Widget_Js('Vtiger_MultiBarchat_Widget_Js',{
/**
* Function which will give char related Data like data , x labels and legend labels as map
*/
getCharRelatedData : function() {
var container = this.getContainer();
var data = container.find('.widgetData').val();
var users = new Array();
var stages = new Array();
var count = new Array();
for(var i=0; i<data.length;i++) {
if($.inArray(data[i].last_name, users) == -1) {
users.push(data[i].last_name);
}
if($.inArray(data[i].sales_stage, stages) == -1) {
stages.push(data[i].sales_stage);
}
}
for(j in stages) {
var salesStageCount = new Array();
for(i in users) {
var salesCount = 0;
for(var k in data) {
var userData = data[k];
if(userData.sales_stage == stages[j] && userData.last_name == users[i]) {
salesCount = parseInt(userData.count);
break;
}
}
salesStageCount.push(salesCount);
}
count.push(salesStageCount);
}
return {
'data' : count,
'ticks' : users,
'labels' : stages
}
},
loadChart : function(){
var chartRelatedData = this.getCharRelatedData();
var chartData = chartRelatedData.data;
var ticks = chartRelatedData.ticks;
var labels = chartRelatedData.labels;
this.getPlotContainer(false).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,
location: 'e',
placement: 'outside',
labels:labels
}
});
},
postLoadWidget: function() {
this._super();
var thisInstance = this;
this.getContainer().on('jqplotDataClick', function(ev, gridpos, datapos, neighbor) {
var chartRelatedData = thisInstance.getCharRelatedData();
var allLinks = chartRelatedData.links;
if(allLinks)
var linkUrl = allLinks[gridpos][datapos];
if(linkUrl) window.location.href = linkUrl;
});
this.getContainer().on("jqplotDataMouseOver", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'pointer' );
});
this.getContainer().on("jqplotDataUnhighlight", function(evt, seriesIndex, pointIndex, neighbor) {
$('.jqplot-event-canvas').css( 'cursor', 'auto' );
});
}
});
// NOTE Widget-class name camel-case convention
Vtiger_Widget_Js('Vtiger_Minilist_Widget_Js', {}, {
postLoadWidget: function() {
app.hideModalWindow();
this.restrictContentDrag();
}
});
Vtiger_Widget_Js('Vtiger_Tagcloud_Widget_Js',{},{
postLoadWidget : function() {
this._super();
this.registerTagCloud();
this.registerTagClickEvent();
},
registerTagCloud : function() {
jQuery('#tagCloud').find('a').tagcloud({
size: {
start: parseInt('12'),
end: parseInt('30'),
unit: 'px'
},
color: {
start: "#0266c9",
end: "#759dc4"
}
});
},
registerChangeEventForModulesList : function() {
jQuery('#tagSearchModulesList').on('change',function(e) {
var modulesSelectElement = jQuery(e.currentTarget);
if(modulesSelectElement.val() == 'all'){
jQuery('[name="tagSearchModuleResults"]').removeClass('hide');
} else{
jQuery('[name="tagSearchModuleResults"]').removeClass('hide');
var selectedOptionValue = modulesSelectElement.val();
jQuery('[name="tagSearchModuleResults"]').filter(':not(#'+selectedOptionValue+')').addClass('hide');
}
});
},
registerTagClickEvent : function(){
var thisInstance = this;
var container = this.getContainer();
container.on('click','.tagName',function(e) {
var tagElement = jQuery(e.currentTarget);
var tagId = tagElement.data('tagid');
var params = {
'module' : app.getModuleName(),
'view' : 'TagCloudSearchAjax',
'tag_id' : tagId,
'tag_name' : tagElement.text()
}
AppConnector.request(params).then(
function(data) {
var params = {
'data' : data,
'css' : {'min-width' : '40%'}
}
app.showModalWindow(params);
thisInstance.registerChangeEventForModulesList();
}
)
});
},
postRefreshWidget : function() {
this._super();
this.registerTagCloud();
}
});
/* Notebook Widget */
Vtiger_Widget_Js('Vtiger_Notebook_Widget_Js', {
}, {
// Override widget specific functions.
postLoadWidget: function() {
this.reinitNotebookView();
},
reinitNotebookView: function() {
var self = this;
app.showScrollBar(jQuery('.dashboard_notebookWidget_viewarea', this.container), {'height':'200px'});
jQuery('.dashboard_notebookWidget_edit', this.container).click(function(){
self.editNotebookContent();
});
jQuery('.dashboard_notebookWidget_save', this.container).click(function(){
self.saveNotebookContent();
});
},
editNotebookContent: function() {
jQuery('.dashboard_notebookWidget_text', this.container).show();
jQuery('.dashboard_notebookWidget_view', this.container).hide();
},
saveNotebookContent: function() {
var self = this;
var refreshContainer = this.container.find('.refresh');
var textarea = jQuery('.dashboard_notebookWidget_textarea', this.container);
var url = this.container.data('url');
var params = url + '&content=true&mode=save&contents=' + encodeURIComponent(textarea.val());
refreshContainer.progressIndicator({
'smallLoadingImage' : true
});
AppConnector.request(params).then(function(data) {
refreshContainer.progressIndicator({'mode': 'hide'});
jQuery('.dashboardWidgetContent', self.container).html(data);
self.reinitNotebookView();
});
}
});