/*+*********************************************************************************** * 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 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