Advertisement
saadimran

Reports

Mar 25th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. use \Fuse\Forms\ReportFilter as ReportFilterForm;
  3. use \Fuse\Secured\Controllers\ReportsController;
  4. ?>
  5. var reports = {};
  6.  
  7. reports.paramReportType = 'report_type';
  8.  
  9. reports.adTypeRewarded = '<?PHP echo ReportFilterForm::REPORT_TYPE_ADS_REWARDED; ?>';
  10. reports.adTypeNonRewarded = '<?PHP echo ReportFilterForm::REPORT_TYPE_ADS_NON_REWARDED; ?>';
  11.  
  12. reports.adFormatStatic = '<?PHP echo ReportFilterForm::AD_FORMAT_STATIC; ?>';
  13. reports.adFormatVideo = '<?PHP echo ReportFilterForm::AD_FORMAT_VIDEO; ?>';
  14.  
  15. reports.paramRespondType = '<?PHP echo ReportsController::PARAM_RESPOND_TYPE; ?>';
  16. reports.paramValueRespondTypeCSV = '<?PHP echo ReportsController::PARAM_VAL_RESPOND_TYPE_CSV; ?>';
  17.  
  18. reports.paramFilterByAdType = '<?PHP echo ReportsController::PARAM_AD_TYPE; ?>';
  19. reports.paramFilterByAdFormat = '<?PHP echo ReportsController::PARAM_AD_FORMAT; ?>';
  20. reports.paramFilterByOfferType = '<?PHP echo ReportsController::PARAM_OFFER_TYPE; ?>';
  21. reports.paramFilterByAppIDs = '<?PHP echo ReportsController::PARAM_GAME_ID; ?>';
  22. reports.paramFilterByAppVersions = '<?PHP echo ReportsController::PARAM_GAME_VERSION; ?>';
  23. reports.paramFilterByAppStoreIDs = '<?PHP echo ReportsController::PARAM_PLATFORM_ID; ?>';
  24. reports.paramFilterByNotificationIDs = '<?PHP echo ReportsController::PARAM_NOTIFICATION_ID; ?>';
  25. reports.paramFilterByCountryIDs = '<?PHP echo ReportsController::PARAM_COUNTRY_ID; ?>';
  26. reports.paramFilterByZoneIDs = '<?PHP echo ReportsController::PARAM_ZONE_ID; ?>';
  27. reports.paramFilterByIncludeTestUsers = '<?PHP echo ReportsController::PARAM_INCLUDE_TEST_USERS; ?>';
  28.  
  29. reports.paramGroupByTimeUnit = '<?PHP echo ReportsController::PARAM_GROUPBY_TIMEUNIT; ?>';
  30. reports.paramGroupByAppID = '<?PHP echo ReportsController::PARAM_GROUPBY_APP; ?>';
  31. reports.paramGroupByCountryID = '<?PHP echo ReportsController::PARAM_GROUPBY_COUNTRY; ?>';
  32. reports.paramGroupByNetworkID = '<?PHP echo ReportsController::PARAM_GROUPBY_NETWORK; ?>';
  33.  
  34. reports.paramReportingPeriod = '<?PHP echo ReportsController::PARAM_REPORTING_PERIOD; ?>';
  35. reports.paramStartDate = '<?PHP echo ReportsController::PARAM_START_DATE; ?>';
  36. reports.paramEndDate = '<?PHP echo ReportsController::PARAM_END_DATE; ?>';
  37.  
  38. reports.configByType = <?PHP echo json_encode($configByReportType); ?>;
  39. reports.chartMetricOptions = <?PHP echo json_encode(ReportFilterForm::$metricOptions); ?>;
  40. reports.reportingPeriodOptions = <?PHP echo json_encode(ReportFilterForm::$reportingPeriodOptions); ?>;
  41. reports.reportingPeriodAllTimeOption = <?PHP echo json_encode(ReportFilterForm::$reportingPeriodAllTimeOption); ?>;
  42.  
  43. reports.chartContainerElem = $('#report-chart-container');
  44. reports.lineChartBtnElem = reports.chartContainerElem.find('#btn-line-chart');
  45. reports.barChartBtnElem = reports.chartContainerElem.find('#btn-bar-chart');
  46. reports.chartElem = reports.chartContainerElem.find('#report-chart');
  47. reports.spinnerElem = $('#report-spinner');
  48.  
  49. reports.filterForm = $('form#report-filter');
  50. reports.reportTypeElem = reports.filterForm.find('select[name=report_type]');
  51.  
  52. reports.filterByAdTypeElem = reports.filterForm.find('select[name=filter_by_ad_type]');
  53. reports.filterByAdFormatElem = reports.filterForm.find('select[name=filter_by_ad_format]');
  54. reports.filterByOfferTypeElem = reports.filterForm.find('select[name=filter_by_offer_type]');
  55. reports.filterByAppElem = reports.filterForm.find('input[name=filter_by_app]');
  56. reports.filterByAppVersionElem = reports.filterForm.find('input[name=filter_by_app_version]');
  57. reports.filterByAppStoreElem = reports.filterForm.find('select[name=filter_by_app_store]');
  58. reports.filterByNotificationElem = reports.filterForm.find('input[name=filter_by_notification]');
  59. reports.filterByCountryElem = reports.filterForm.find('select[name=filter_by_country]');
  60. reports.filterByZoneElem = reports.filterForm.find('input[name=filter_by_zone]');
  61. reports.filterByTestUsersElem = reports.filterForm.find('input[name=filter_by_test_users]');
  62.  
  63. reports.groupByTimeElem = reports.filterForm.find('input[name=group_by_time]');
  64. reports.groupByTimeUnitElem = reports.filterForm.find('select[name=group_by_time_unit]');
  65. reports.groupByAppElem = reports.filterForm.find('input[name=group_by_app]');
  66. reports.groupByCountryElem = reports.filterForm.find('input[name=group_by_country]');
  67. reports.groupByNetworkElem = reports.filterForm.find('input[name=group_by_network]');
  68.  
  69. reports.chartMetricElem = reports.filterForm.find('select[name=chart_metric]');
  70. reports.reportingPeriodElem = reports.filterForm.find('select[name=reporting_period]');
  71. reports.startDateElem = reports.filterForm.find('input[name=start_date]');
  72. reports.endDateElem = reports.filterForm.find('input[name=end_date]');
  73.  
  74. reports.fetchReportBtn = reports.filterForm.find('button[name=fetch_report]');
  75. reports.downloadReportBtn = reports.filterForm.find('button[name=download_report]');
  76.  
  77. // select2 initializations
  78. reports.reportTypeElem.select2();
  79. reports.filterByAdTypeElem.select2();
  80. reports.filterByAdFormatElem.select2();
  81. reports.filterByOfferTypeElem.select2();
  82. reports.filterByAppElem.select2({
  83.     minimumInputLength: 2,
  84.     multiple: true,
  85.     ajax: {
  86.         delay: 400,
  87.         type: 'POST',
  88.         dataType: 'json',
  89.         url: '<?PHP echo sprintf($URL_datasourceappsdropdown, $partner->getId()); ?>',
  90.         data: function (params) {
  91.             return {term: params};
  92.         },
  93.         results: function (data) {
  94.             return {
  95.                 results: data
  96.             };
  97.         }
  98.     }
  99. });
  100. reports.filterByAppVersionElem.select2({
  101.     multiple: true,
  102.     data: function() {
  103.         return {
  104.             results: !!reports.appData ? reports.appData.versions : []
  105.         };
  106.     }
  107. });
  108.  
  109. reports.filterByAppStoreElem.select2();
  110.  
  111. reports.filterByNotificationElem.select2({
  112.     multiple: true,
  113.     data: function() {
  114.         return {
  115.             results: !!reports.appData ? reports.appData.push_notifications : []
  116.         };
  117.     }
  118. });
  119. reports.filterByCountryElem.select2();
  120. reports.filterByZoneElem.select2({
  121.     multiple: true,
  122.     data: function() {
  123.         return {
  124.             results: !!reports.appData ? reports.appData.zones : []
  125.         };
  126.     }
  127. });
  128. reports.groupByTimeUnitElem.select2();
  129. reports.chartMetricElem.select2();
  130. reports.reportingPeriodElem.select2();
  131.  
  132. /**
  133.  * Report type change event handler.
  134.  */
  135. reports.reportTypeElem.change(function(e){
  136.     reports.updateVisibility();
  137. });
  138.  
  139. /**
  140.  * Ad type change event handler.
  141.  */
  142. reports.filterByAdTypeElem.change(function(e){
  143.     var adTypes = $(this).select2('val');
  144.     if(adTypes.length == 1 && adTypes[0] == reports.adTypeRewarded) {
  145.         reports.filterByAdFormatElem.select2('val', [reports.adFormatVideo]);
  146.         reports.filterByAdFormatElem.select2('enable', false);
  147.     } else {
  148.         reports.filterByAdFormatElem.select2('enable', true);
  149.     }
  150.  
  151.     reports.updateVisibility();
  152.     reports.updateChartMetricOptions();
  153. });
  154.  
  155. /**
  156.  * Offer type change event handler.
  157.  */
  158. reports.filterByOfferTypeElem.change(function(e){
  159.     reports.updateVisibility();
  160.     reports.updateChartMetricOptions();
  161. });
  162.  
  163. /**
  164.  * App selection change event handler.
  165.  */
  166. reports.filterByAppElem.change(function(e){
  167.     reports.updateVisibility();
  168.     reports.updateAppData();
  169. });
  170.  
  171. /**
  172.  * Group by time change event handler.
  173.  */
  174. reports.groupByTimeElem.change(function(e){
  175.     reports.updateVisibility();
  176.     reports.updateReportingPeriodOptions();
  177.     reports.updateVisibility();
  178. });
  179.  
  180. /**
  181.  * Group by time unit change event handler.
  182.  */
  183. reports.groupByTimeUnitElem.change(function(e) {
  184.     reports.updateReportingPeriodOptions();
  185.     reports.updateVisibility();
  186. });
  187.  
  188. /**
  189.  * Reporting period change event handler.
  190.  */
  191. reports.reportingPeriodElem.change(function(e){
  192.     reports.updateVisibility();
  193. });
  194.  
  195. /**
  196.  * Fetch report button click event handler.
  197.  */
  198. reports.fetchReportBtn.click(function(e){
  199.     reports.updateChartMetricOptions();
  200.     reports.fetch();
  201. });
  202.  
  203. /**
  204.  * Download report button click event handler.
  205.  */
  206. reports.downloadReportBtn.click(function(e){
  207.     reports.download();
  208. });
  209.  
  210. /**
  211.  * Chart metric bchange event handler.
  212.  */
  213. reports.chartMetricElem.change(function(e){
  214.     reports.drawChart(-1);
  215. });
  216.  
  217. /**
  218.  * Line chart button click event handler.
  219.  */
  220. reports.lineChartBtnElem.click(function(e){
  221.     reports.drawChart(1);
  222. });
  223.  
  224. /**
  225.  * Bar chart button click event handler.
  226.  */
  227. reports.barChartBtnElem.click(function(e){
  228.     reports.drawChart(2);
  229. });
  230.  
  231. /**
  232.  * Updates the visibility of form elements. I.e. shows/hides elements
  233.  * depending on the scenario.
  234.  */
  235. reports.updateVisibility = function() {
  236.     // hide all conditional elements
  237.     var elems = reports.filterForm.find('.form-group[data-visible-for],.form-group[data-visible-for-app-count]').addClass('nodisplay');
  238.  
  239.     var reportType = reports.reportTypeElem.select2('val');
  240.     elems = reports.filterForm.find('.form-group[data-visible-for*="|' + reportType + '|"]').not('[data-visible-for-app-count]').removeClass('nodisplay');
  241.  
  242.     var appsSelected = reports.filterByAppElem.select2('val');
  243.     if(appsSelected.length == 1) {
  244.         elems = reports.filterForm.find('.form-group[data-visible-for-app-count]').each(function(){
  245.             var elem = $(this);
  246.             var show = !elem.attr('data-visible-for') || elem.is('.form-group[data-visible-for*="|' + reportType + '|"]');
  247.             elem.toggleClass('nodisplay', !show);
  248.         });
  249.     }
  250.  
  251.     var showTimeUnitElem = reports.groupByTimeElem.is(':checked');
  252.     elem = reports.groupByTimeUnitElem.closest('.form-group').toggleClass('nodisplay', !showTimeUnitElem);
  253.  
  254.     var reportingPeriodVal = reports.reportingPeriodElem.select2('val');
  255.     var reportingPeriodDateRange = '<?php echo ReportFilterForm::REPORTING_PERIOD_DATE_RANGE; ?>';
  256.     var showDateRangeElems = reportingPeriodVal == reportingPeriodDateRange;
  257.  
  258.     reports.reportingPeriodElem.closest('.form-group').toggleClass('pull-right', !showDateRangeElems);
  259.     reports.startDateElem.closest('.form-group').toggleClass('nodisplay', !showDateRangeElems);
  260.     reports.endDateElem.closest('.form-group').toggleClass('nodisplay', !showDateRangeElems);
  261. };
  262.  
  263. /**
  264.  * Detect if an element is visible.
  265.  * @param elem
  266.  * @returns {*}
  267.  */
  268. reports.isVisible = function(elem) {
  269.     elem = elem.is('.form-group') ? elem : elem.closest('.form-group');
  270.     return !elem.hasClass('nodisplay');
  271. };
  272.  
  273. /**
  274.  * Updates the app versions, zones and notifications list depending on the number of apps selected.
  275.  */
  276. reports.updateAppData = function() {
  277.     reports.resetAppDataFields();
  278.     var appIds = reports.filterByAppElem.select2('val');
  279.     if (appIds.length == 1) {
  280.         $.ajax({
  281.             url: '<?PHP echo $URL_datasourceappdata; ?>' + appIds[0],
  282.             dataType: 'json',
  283.             success: function(data) {
  284.                 reports.appData = data;
  285.             },
  286.             error: function() {
  287.                 reports.appData = null;
  288.             }
  289.         });
  290.     } else {
  291.         reports.appData = null;
  292.     }
  293. };
  294.  
  295. /**
  296.  * Resets the fields related to app selection.
  297.  */
  298. reports.resetAppDataFields = function() {
  299.     reports.filterByAppVersionElem.select2('val', []);
  300.     reports.filterByZoneElem.select2('val', []);
  301.     reports.filterByNotificationElem.select2('val', []);
  302. };
  303.  
  304. /**
  305.  * Updates the options for the metric that shows on the chart.
  306.  */
  307. reports.updateChartMetricOptions = function() {
  308.     var reportType = reports.reportTypeElem.val();
  309.  
  310.     var options = reports.chartMetricOptions[reportType];
  311.  
  312.     // add specific rewarded type options
  313.     var adTypeRewarded = '<?php echo ReportFilterForm::REPORT_TYPE_ADS_REWARDED; ?>';
  314.     var adTypesSelected = reports.filterByAdTypeElem.select2('val');
  315.     if (reports.isVisible(reports.filterByAdTypeElem) && $.inArray(adTypeRewarded, adTypesSelected) != -1) {
  316.         $.extend(options, reports.chartMetricOptions[adTypeRewarded]);
  317.     }
  318.  
  319.     // add specific IAP offer options
  320.     var offerTypeIAP = '<?php echo ReportFilterForm::REPORT_TYPE_OFFERS_IAP; ?>';
  321.     var offerTypesSelected = reports.filterByOfferTypeElem.select2('val');
  322.     if (reports.isVisible(reports.filterByOfferTypeElem) && $.inArray(offerTypeIAP, offerTypesSelected) != -1) {
  323.         $.extend(options, reports.chartMetricOptions[offerTypeIAP]);
  324.     }
  325.  
  326.     var firstOption = '';
  327.     var optionsHtml = '';
  328.     if (!!options) {
  329.         $.each(options, function(key, val){
  330.             if (firstOption === '') {
  331.                 firstOption = key;
  332.             }
  333.             optionsHtml += '<option value="' + key + '">' + val + '</option>'
  334.         });
  335.     }
  336.    
  337.     // update options and retain current value if possible
  338.     var val = reports.chartMetricElem.select2('val');
  339.     val = !!options[val] ? val : firstOption;
  340.     reports.chartMetricElem.html(optionsHtml).select2('val', val);
  341. };
  342.  
  343. /**
  344.  * Updates the options available in the reporting period element.
  345.  */
  346. reports.updateReportingPeriodOptions = function() {
  347.     var groupByTimeUnitSelected = reports.groupByTimeUnitElem.select2('val');
  348.     var groupByTimeUnitAllTime = '<?php echo ReportFilterForm::TIME_INTERVAL_ALL_TIME; ?>';
  349.  
  350.     var val = '<?PHP echo ReportFilterForm::REPORTING_PERIOD_PAST_WEEK; ?>';
  351.     var options = reports.reportingPeriodOptions;
  352.     if (reports.isVisible(reports.groupByTimeUnitElem) && groupByTimeUnitSelected == groupByTimeUnitAllTime) {
  353.         options = reports.reportingPeriodAllTimeOption;
  354.         val = '<?PHP echo ReportFilterForm::REPORTING_PERIOD_ALL_TIME; ?>';
  355.     }
  356.  
  357.     var optionsHtml = '';
  358.     if (!!options) {
  359.         $.each(options, function(key, val){
  360.             optionsHtml += '<option value="' + key + '">' + val + '</option>'
  361.         });
  362.     }
  363.  
  364.     // update options and retain current value if possible
  365.     var curVal = reports.reportingPeriodElem.select2('val');
  366.     val = !!options[curVal] ? curVal : val;
  367.     reports.reportingPeriodElem.html(optionsHtml).select2('val', val);
  368. };
  369.  
  370. /**
  371.  * Forms the request data to fetch the report.
  372.  */
  373. reports.formRequestData = function() {
  374.     var data = {};
  375.  
  376.     // report type
  377.     data[reports.paramReportType] = reports.reportTypeElem.select2('val');
  378.  
  379.     // filter by ad type
  380.     if (reports.isVisible(reports.filterByAdTypeElem)) {
  381.         data[reports.paramFilterByAdType] = reports.filterByAdTypeElem.select2('val');
  382.     }
  383.  
  384.     // filter by ad format
  385.     if (reports.isVisible(reports.filterByAdFormatElem)) {
  386.         data[reports.paramFilterByAdFormat] = reports.filterByAdFormatElem.select2('val');
  387.     }
  388.  
  389.     // filter by offer type
  390.     if (reports.isVisible(reports.filterByOfferTypeElem)) {
  391.         data[reports.paramFilterByOfferType] = reports.filterByOfferTypeElem.select2('val');
  392.     }
  393.  
  394.     // filter by app ids
  395.     if (reports.isVisible(reports.filterByAppElem)) {
  396.         data[reports.paramFilterByAppIDs] = reports.filterByAppElem.select2('val');
  397.     }
  398.  
  399.     // filter by app versions
  400.     if (reports.isVisible(reports.filterByAppVersionElem)) {
  401.         data[reports.paramFilterByAppVersions] = reports.filterByAppVersionElem.select2('val');
  402.     }
  403.  
  404.     // filter by app stores ids
  405.     if (reports.isVisible(reports.filterByAppStoreElem)) {
  406.         data[reports.paramFilterByAppStoreIDs] = reports.filterByAppStoreElem.select2('val');
  407.     }
  408.  
  409.     // filter by notifications ids
  410.     if (reports.isVisible(reports.filterByNotificationElem)) {
  411.         data[reports.paramFilterByNotificationIDs] = reports.filterByNotificationElem.select2('val');
  412.     }
  413.  
  414.     // filter by country ids
  415.     if (reports.isVisible(reports.filterByCountryElem)) {
  416.         data[reports.paramFilterByCountryIDs] = reports.filterByCountryElem.select2('val');
  417.     }
  418.  
  419.     // filter by zones ids
  420.     if (reports.isVisible(reports.filterByZoneElem)) {
  421.         data[reports.paramFilterByZoneIDs] = reports.filterByZoneElem.select2('val');
  422.     }
  423.  
  424.     // filter by test users
  425.     if (reports.isVisible(reports.filterByTestUsersElem) && reports.filterByTestUsersElem.is(':checked')) {
  426.         data[reports.paramFilterByIncludeTestUsers] = 1;
  427.     }
  428.  
  429.     // group by time unit
  430.     if (reports.isVisible(reports.groupByTimeUnitElem)) {
  431.         data[reports.paramGroupByTimeUnit] = reports.groupByTimeUnitElem.select2('val');
  432.     }
  433.  
  434.     // group by app id
  435.     if (reports.isVisible(reports.groupByAppElem) && reports.groupByAppElem.is(':checked')) {
  436.         data[reports.paramGroupByAppID] = 1;
  437.     }
  438.  
  439.     // group by country id
  440.     if (reports.isVisible(reports.groupByCountryElem) && reports.groupByCountryElem.is(':checked')) {
  441.         data[reports.paramGroupByCountryID] = 1;
  442.     }
  443.  
  444.     // group by network id
  445.     if (reports.isVisible(reports.groupByNetworkElem) && reports.groupByNetworkElem.is(':checked')) {
  446.         data[reports.paramGroupByNetworkID] = 1;
  447.     }
  448.  
  449.     // reporting period
  450.     if (reports.isVisible(reports.reportingPeriodElem)) {
  451.         data[reports.paramReportingPeriod] = reports.reportingPeriodElem.select2('val');
  452.     }
  453.  
  454.     // start date
  455.     if (reports.isVisible(reports.startDateElem)) {
  456.         data[reports.paramStartDate] = reports.startDateElem.val();
  457.     }
  458.  
  459.     // end date
  460.     if (reports.isVisible(reports.endDateElem)) {
  461.         data[reports.paramEndDate] = reports.endDateElem.val();
  462.     }
  463.  
  464.     return data;
  465. };
  466.  
  467. /**
  468.  * Fetches report data from the server.
  469.  */
  470. reports.fetch = function() {
  471.  
  472.     // don't fetch the report if the button is disabled
  473.     if (reports.fetchReportBtn.is(':disabled')) {
  474.         return false;
  475.     }
  476.  
  477.     var requestData = reports.formRequestData();
  478.     var endPoint = reports.configByType[requestData[reports.paramReportType]].endpoint;
  479.  
  480.     var onError = function(jqXHR, textStatus, errorThrown) {
  481.         console.log('An error occurred while fetching the report:');
  482.         console.log('textStatus: ' + textStatus);
  483.         console.log('errorThrown: ' + errorThrown);
  484.  
  485.         reports.reportData = null;
  486.  
  487.         reports.drawTable();
  488.         reports.drawChart(-1);
  489.  
  490.         reports.enableReportElements(true);
  491.     };
  492.  
  493.     // disable report related elements
  494.     reports.enableReportElements(false);
  495.  
  496.     // empty report variables
  497.     reports.reportData = null;
  498.     reports.lastRequestEndpoint = endPoint;
  499.     reports.lastRequestData = requestData;
  500.  
  501.     $.ajax({
  502.         url: endPoint,
  503.         cache: false,
  504.         type: 'post',
  505.         data: requestData,
  506.         dataType: 'json',
  507.         success: function(data, textStatus, jqXHR) {
  508.             if (!!data && data.t == 'error') {
  509.                 onError(jqXHR, data.h, data.m);
  510.             } else {
  511.                 reports.reportData = data.data;
  512.  
  513.                 reports.drawTable();
  514.                 reports.drawChart(-1);
  515.                 console.log(data.m);
  516.  
  517.                 reports.enableReportElements(true);
  518.             }
  519.         },
  520.         error: onError
  521.     });
  522. };
  523.  
  524. reports.download = function() {
  525.     // don't fetch the report if the button is disabled
  526.     if (reports.fetchReportBtn.is(':disabled')) {
  527.         return false;
  528.     }
  529.  
  530.     reports.enableReportElements(false);
  531.  
  532.     var requestData = reports.formRequestData();
  533.     var endPoint = reports.configByType[requestData[reports.paramReportType]].endpoint;
  534.  
  535.     requestData[reports.paramRespondType] = reports.paramValueRespondTypeCSV;
  536.  
  537.     $.fileDownload(endPoint, {
  538.         httpMethod: 'POST',
  539.         data: requestData,
  540.         successCallback: function (url) {
  541.             reports.enableReportElements(true);
  542.         },
  543.         failCallback: function (html, url) {
  544.             reports.enableReportElements(true);
  545.             alert('Your filtering/group-by options produced zero results, and thus a report could not be created.');
  546.         }
  547.     });
  548. };
  549.  
  550. /**
  551.  * Enables or disabled report related elements while report is churning out.
  552.  * @param doEnable
  553.  */
  554. reports.enableReportElements = function(doEnable) {
  555.     reports.fetchReportBtn.prop('disabled', !doEnable);
  556.     reports.downloadReportBtn.prop('disabled', !doEnable);
  557.     reports.spinnerElem.toggleClass('nodisplay', doEnable);
  558. };
  559.  
  560. /**
  561.  * Draws table after report data is fetched.
  562.  */
  563. reports.drawTable = function() {
  564.     // destroy and empty the current table
  565.     if (!!reports.dataTable) {
  566.         reports.dataTable.clear().destroy();
  567.         reports.tableElem.addClass('nodisplay');
  568.         reports.dataTable = null;
  569.         reports.tableElem = null;
  570.     }
  571.  
  572.     // get the report type and associated table config
  573.     var reportType = reports.reportTypeElem.select2('val');
  574.     var reportTypeBaseMetrics = '<?php echo ReportFilterForm::REPORT_TYPE_BASE_METRICS; ?>';
  575.     var tableID = reports.configByType[reportType].dataTableID;
  576.     var config = $.extend(true, {}, reports.configByType[reportType].dataTableConfig);
  577.  
  578.     var groupByTimeUnit = reports.isVisible(reports.groupByTimeUnitElem);
  579.     var groupByAppId = reports.isVisible(reports.groupByAppElem) && reports.groupByAppElem.is(':checked');
  580.     var groupByCountryId = reports.isVisible(reports.groupByCountryElem) && reports.groupByCountryElem.is(':checked');
  581.     var groupByNetworkId = reports.isVisible(reports.groupByNetworkElem) && reports.groupByNetworkElem.is(':checked');
  582.  
  583.     var adTypeRewarded = '<?php echo ReportFilterForm::REPORT_TYPE_ADS_REWARDED; ?>';
  584.     var isAdTypeRewardedSelected = reports.isVisible(reports.filterByAdTypeElem) ? reports.filterByAdTypeElem.select2('val') : false;
  585.     isAdTypeRewardedSelected = $.isArray(isAdTypeRewardedSelected) ? ($.inArray(adTypeRewarded, isAdTypeRewardedSelected) != -1) : false;
  586.  
  587.     var offerTypeIAP = '<?php echo ReportFilterForm::REPORT_TYPE_OFFERS_IAP; ?>';
  588.     var isOfferTypeIapSelected = reports.isVisible(reports.filterByOfferTypeElem) ? reports.filterByOfferTypeElem.select2('val') : false;
  589.     isOfferTypeIapSelected = $.isArray(isOfferTypeIapSelected) ? ($.inArray(offerTypeIAP, isOfferTypeIapSelected) != -1) : false;
  590.  
  591.  
  592.     $.each(config.columns, function(id, col) {
  593.         if (!groupByTimeUnit && col.data == 'time_formatted') {
  594.             col.visible = false;
  595.         }
  596.  
  597.         if (!groupByAppId && (col.data == 'game_name' || col.data == 'os_formatted')) {
  598.             col.visible = false;
  599.         }
  600.  
  601.         if (!groupByCountryId && col.data == 'country_name') {
  602.             col.visible = false;
  603.         }
  604.  
  605.         if (!groupByNetworkId && col.data == 'network_name') {
  606.             col.visible = false;
  607.         }
  608.  
  609.         if (!isAdTypeRewardedSelected && -1 != $.inArray(col.data, ['rewarded_views_started', 'rewarded_views_completed', 'started_views_per_dau', 'completed_views_per_dau'])) {
  610.             col.visible = false;
  611.         }
  612.  
  613.         if (!isOfferTypeIapSelected && -1 != $.inArray(col.data, ['iap_conversions', 'iap_revenue'])) {
  614.             col.visible = false;
  615.         }
  616.  
  617.         if (reportType == reportTypeBaseMetrics && col.data == 'iap_revenue') {
  618.             col.visible = true;
  619.         }
  620.     });
  621.  
  622.     reports.tableElem = $('#' + tableID).removeClass('nodisplay');
  623.     reports.dataTable = reports.tableElem.DataTable(config);
  624.     if (!!reports.reportData) {
  625.         reports.dataTable.rows.add(reports.reportData);
  626.         reports.dataTable.draw();
  627.     }
  628. };
  629.  
  630. reports.drawChart = function(forceChartType, destoryChart) {
  631.     if (forceChartType === -1) {
  632.         if (reports.lineChartBtnElem.not('.nodisplay,.btn-stroke').length == 1) {
  633.          reports.drawChart(1, destoryChart);
  634.         }
  635.         else if (reports.barChartBtnElem.not('.nodisplay,.btn-stroke').length == 1) {
  636.             reports.drawChart(2, destoryChart);
  637.         }
  638.         else {
  639.             reports.drawChart(null, destoryChart);
  640.         }
  641.         return;
  642.     }
  643.  
  644.     reports.chartContainerElem.addClass('nodisplay');
  645.     reports.lineChartBtnElem.addClass('nodisplay').addClass('stroke');
  646.     reports.barChartBtnElem.addClass('nodisplay').addClass('stroke');
  647.  
  648.     var metric = reports.chartMetricElem.select2('val');
  649.     var plot = reports.chartElem.data('plot');
  650.     if (!!plot) {
  651.         plot.shutdown();
  652.         reports.chartElem.empty();
  653.     }
  654.  
  655.     reports.spinnerElem.removeClass('nodisplay');
  656.  
  657.     if (!destoryChart && !!metric && !!reports.lastRequestData && !!reports.reportData && reports.reportData.length > 0) {
  658.  
  659.         if (!reports.chartMetricOptions[reports.lastRequestData[reports.paramReportType]][metric]) {
  660.             //alert('This metric is not in the current data set, try clicking the \'Get Report\' button first.');
  661.             return;
  662.         }
  663.        
  664.         var plotSeries = [];
  665.         var isGroupedByTime = !!reports.lastRequestData[reports.paramGroupByTimeUnit];
  666.  
  667.         if (!!reports.lastRequestData[reports.paramGroupByAppID]) {
  668.             plotSeries.push({valueColumn: 'game_id', labelColumn: 'game_name', fieldName: 'App'});
  669.         }
  670.  
  671.         if (!!reports.lastRequestData[reports.paramGroupByCountryID]) {
  672.             plotSeries.push({valueColumn: 'country_id', labelColumn: 'country_name', fieldName: 'Country'});
  673.         }
  674.  
  675.         if (!!reports.lastRequestData[reports.paramGroupByNetworkID]) {
  676.             plotSeries.push({valueColumn: 'network_id', labelColumn: 'network_name', fieldName: 'Network'});
  677.         }
  678.  
  679.         if (plotSeries.length == 1 || (isGroupedByTime && plotSeries.length == 0)) {
  680.             var dataSets = {};
  681.             var xAxis = {ticks:[], minTick: null, maxTick: null};
  682.             var yAxis = {min: 0, minTick: null, maxTick: null};
  683.             plotSeries = plotSeries.length == 1 ? plotSeries[0] : null;
  684.  
  685.             var isLineChart = (!!isGroupedByTime && !plotSeries) || (!!isGroupedByTime && !!plotSeries);
  686.             var showChartButtons = (!!isGroupedByTime && !!plotSeries);
  687.             if (!!forceChartType && !!showChartButtons) {
  688.                 isLineChart = (forceChartType == 1);
  689.             }
  690.  
  691.             reports.chartContainerElem.removeClass('nodisplay');
  692.             reports.lineChartBtnElem.toggleClass('nodisplay', !showChartButtons).toggleClass('btn-stroke', !isLineChart);
  693.             reports.barChartBtnElem.toggleClass('nodisplay', !showChartButtons).toggleClass('btn-stroke', isLineChart);
  694.  
  695.             var dataSetCount = 0;
  696.  
  697.             var uniqueTicks = [];
  698.  
  699.             $.each(reports.reportData, function(key, row) {
  700.                 var dataSetID = !!plotSeries ? row[plotSeries.valueColumn] : 0;
  701.                 var dataSet = dataSets[dataSetID];
  702.  
  703.                 // create the dataset if it doesnt exist
  704.                 if (!dataSet) {
  705.                     dataSet = {data: [], numCount: 0};
  706.                     if (!!plotSeries) {
  707.                         dataSet.label = row[plotSeries.labelColumn];
  708.                     }
  709.                     dataSets[dataSetID] = dataSet;
  710.                     dataSetCount++;
  711.                 }
  712.  
  713.                 var tick = isGroupedByTime ? row['js_timestamp'] : key;
  714.                 var ytick = row[metric];
  715.                 dataSet.data.push([tick, ytick]);
  716.  
  717.                 xAxis.minTick = (xAxis.minTick === null) ? tick : Math.min(xAxis.minTick, tick);
  718.                 xAxis.maxTick = (xAxis.maxTick === null) ? tick : Math.max(xAxis.maxTick, tick);
  719.  
  720.                 yAxis.minTick = (yAxis.minTick === null) ? ytick : Math.min(yAxis.minTick, ytick);
  721.                 yAxis.maxTick = (yAxis.maxTick === null) ? ytick : Math.max(yAxis.maxTick, ytick);
  722.  
  723.                 if (isGroupedByTime) {
  724.                     var tickLabel = row['time_formatted'];
  725.                     xAxis.ticks.push([tick, tickLabel]);
  726.                 }
  727.  
  728.                 if ($.inArray(tick, uniqueTicks) == -1) {
  729.                     uniqueTicks.push(tick);
  730.                 }
  731.             });
  732.  
  733.             if (dataSetCount > 10) {
  734.                 //alert('Error: The dataset is too large to plot on a chart. Please limit your ' + plotSeries.fieldName + ' selection to a maximum of 10.');
  735.                 reports.drawChart(null, true);
  736.                 return false;
  737.             }
  738.  
  739.             var dataSetArray = [];
  740.             $.each(dataSets, function(dataSetID, dataSet) {
  741.                 dataSetArray.push(dataSet);
  742.             });
  743.  
  744.             var w = (isGroupedByTime ? 100 : 5) * uniqueTicks.length;
  745.             var pw = reports.chartElem.parent().outerWidth();
  746.             w = (w > pw) ? (w + 'px') : '100%';
  747.             reports.chartElem.width(w);
  748.  
  749.             var chartOptions = {
  750.                 colors: [primaryColor],
  751.                 shadowSize: 0,
  752.                 xaxis: xAxis,
  753.                 yaxis: yAxis,
  754.                 series: {
  755.                     stack: !!isGroupedByTime && !!plotSeries && !isLineChart,
  756.                     lines: {
  757.                         show: isLineChart
  758.                     },
  759.                     bars: {
  760.                         show: !isLineChart
  761.                     },
  762.                     points: {
  763.                         show: true
  764.                     }
  765.                 },
  766.                 grid: {
  767.                     color: "#dedede",
  768.                     borderWidth: 0,
  769.                     clickable: true,
  770.                     hoverable: true
  771.                 },
  772.                 tooltip: true,
  773.                 tooltipOpts: {
  774.                     content: function(label, xval, yval) {
  775.                         var val = yval;
  776.                         if (isGroupedByTime) {
  777.                             val = moment(xval, 'x').format('YYYY-MM-DD hh:mm A') + ', ' + val;
  778.                         }
  779.                         return val;
  780.                     }
  781.                 }
  782.             };
  783.  
  784.             if (!!isGroupedByTime) {
  785.                 chartOptions.series.bars.barWidth = 60*60*1000*24;
  786.             }
  787.  
  788.             $.plot(reports.chartElem, dataSetArray, chartOptions);
  789.         }
  790.     }
  791.  
  792.     reports.spinnerElem.addClass('nodisplay');
  793. };
  794.  
  795. reports.updateVisibility();
  796. //reports.fetch();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement