PATH:
home
/
letacommog
/
crmleta
/
layouts
/
vlayout
/
modules
/
Vtiger
/
resources
/
dashboards
/*+*********************************************************************************** * 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(); }); } });
[+]
..
[-] Widget.js
[edit]