=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Grid.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Grid.java 2013-10-08 17:14:50 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Grid.java 2013-12-31 09:05:21 +0000 @@ -214,6 +214,11 @@ Grid removeColumn( GridHeader header ); /** + * Removes the current row from the grid. + */ + Grid removeCurrentWriteRow(); + + /** * Limits the grid from top by the given argument number. * * @param limit the top limit, must be greater than zero to have an effect. === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java 2013-11-11 23:01:07 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java 2013-12-31 09:05:21 +0000 @@ -661,6 +661,8 @@ // Row data values // ----------------------------------------------------------------- + boolean hasValue = false; + for ( List column : gridColumns ) { String key = getIdentifer( column, row ); @@ -668,6 +670,13 @@ Double value = valueMap.get( key ); grid.addValue( value ); + + hasValue = !hasValue ? value != null : true; + } + + if ( hideEmptyRows && !hasValue ) + { + grid.removeCurrentWriteRow(); } } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsService.java 2013-12-09 17:14:49 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsService.java 2013-12-31 09:05:21 +0000 @@ -152,11 +152,12 @@ * @param hierarchyMeta whether to include meta data about the org units * in the hierarchy. * @param ignoreLimit whether to ignore the max number of cells limit. + * @param hideEmptyRows whether to hide rows without data values, applis to table layout. * @param format the i18n format. * @return a data query parameter object created based on the given URL info. */ - DataQueryParams getFromUrl( Set dimensionParams, Set filterParams, - AggregationType aggregationType, String measureCriteria, boolean skipMeta, boolean skipRounding, boolean hierarchyMeta, boolean ignoreLimit, I18nFormat format ); + DataQueryParams getFromUrl( Set dimensionParams, Set filterParams, AggregationType aggregationType, + String measureCriteria, boolean skipMeta, boolean skipRounding, boolean hierarchyMeta, boolean ignoreLimit, boolean hideEmptyRows, I18nFormat format ); /** * Creates a data query parameter object from the given BaseAnalyticalObject. === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2013-12-09 17:14:49 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2013-12-31 09:05:21 +0000 @@ -136,6 +136,12 @@ */ private boolean ignoreLimit; + /** + * Indicates whether rows with no values should be hidden in the response. + * Applies to responses with table layout only. + */ + private boolean hideEmptyRows; + // ------------------------------------------------------------------------- // Transient properties // ------------------------------------------------------------------------- @@ -1100,6 +1106,16 @@ this.ignoreLimit = ignoreLimit; } + public boolean isHideEmptyRows() + { + return hideEmptyRows; + } + + public void setHideEmptyRows( boolean hideEmptyRows ) + { + this.hideEmptyRows = hideEmptyRows; + } + // ------------------------------------------------------------------------- // Get and set methods for transient properties // ------------------------------------------------------------------------- === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-12-09 17:14:49 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-12-31 09:05:21 +0000 @@ -454,6 +454,7 @@ addIfEmpty( reportTable.getGridRows() ); reportTable.setTitle( IdentifiableObjectUtils.join( params.getFilterItems() ) ); + reportTable.setHideEmptyRows( params.isHideEmptyRows() ); return reportTable.getGrid( new ListGrid(), valueMap, false ); } @@ -586,8 +587,8 @@ } @Override - public DataQueryParams getFromUrl( Set dimensionParams, Set filterParams, - AggregationType aggregationType, String measureCriteria, boolean skipMeta, boolean skipRounding, boolean hierarchyMeta, boolean ignoreLimit, I18nFormat format ) + public DataQueryParams getFromUrl( Set dimensionParams, Set filterParams, AggregationType aggregationType, + String measureCriteria, boolean skipMeta, boolean skipRounding, boolean hierarchyMeta, boolean ignoreLimit, boolean hideEmptyRows, I18nFormat format ) { DataQueryParams params = new DataQueryParams(); @@ -630,6 +631,7 @@ params.setSkipMeta( skipMeta ); params.setSkipRounding( skipRounding ); params.setHierarchyMeta( hierarchyMeta ); + params.setHideEmptyRows( hideEmptyRows ); return params; } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/MockAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/MockAnalyticsService.java 2013-12-09 17:14:49 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/MockAnalyticsService.java 2013-12-31 09:05:21 +0000 @@ -80,8 +80,8 @@ } @Override - public DataQueryParams getFromUrl( Set dimensionParams, Set filterParams, - AggregationType aggregationType, String measureCriteria, boolean skipMeta, boolean skipRounding, boolean hierarchyMeta, boolean ignoreLimit, I18nFormat format ) + public DataQueryParams getFromUrl( Set dimensionParams, Set filterParams, AggregationType aggregationType, + String measureCriteria, boolean skipMeta, boolean skipRounding, boolean hierarchyMeta, boolean hideEmptyRows, boolean ignoreLimit, I18nFormat format ) { throw new NotImplementedException(); } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/data/AnalyticsServiceTest.java' --- dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/data/AnalyticsServiceTest.java 2013-12-09 17:14:49 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/data/AnalyticsServiceTest.java 2013-12-31 09:05:21 +0000 @@ -164,7 +164,7 @@ Set filterParams = new HashSet(); filterParams.add( "ou:" + ouA.getUid() + ";" + ouB.getUid() + ";" + ouC.getUid() + ";" + ouD.getUid() + ";" + ouE.getUid() ); - DataQueryParams params = analyticsService.getFromUrl( dimensionParams, filterParams, null, null, false, false, false, false, null ); + DataQueryParams params = analyticsService.getFromUrl( dimensionParams, filterParams, null, null, false, false, false, false, false, null ); assertEquals( 4, params.getDataElements().size() ); assertEquals( 3, params.getPeriods().size() ); @@ -181,7 +181,7 @@ Set filterParams = new HashSet(); filterParams.add( "ou:" + ouA.getUid() ); - DataQueryParams params = analyticsService.getFromUrl( dimensionParams, filterParams, null, null, false, false, false, false, null ); + DataQueryParams params = analyticsService.getFromUrl( dimensionParams, filterParams, null, null, false, false, false, false, false, null ); assertEquals( 4, params.getDataElements().size() ); assertEquals( 1, params.getFilterOrganisationUnits().size() ); @@ -197,7 +197,7 @@ Set filterParams = new HashSet(); filterParams.add( "ou:" + ouA.getUid() + ";" + ouB.getUid() ); - DataQueryParams params = analyticsService.getFromUrl( dimensionParams, filterParams, null, null, false, false, false, false, null ); + DataQueryParams params = analyticsService.getFromUrl( dimensionParams, filterParams, null, null, false, false, false, false, false, null ); assertEquals( 4, params.getDataElements().size() ); assertEquals( 12, params.getPeriods().size() ); @@ -212,7 +212,7 @@ dimensionParams.add( "dx:" + deA.getUid() + ";" + deB.getUid() ); dimensionParams.add( "pe:2011;2012" ); - DataQueryParams params = analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, null ); + DataQueryParams params = analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, false, null ); assertEquals( 1, params.getOrganisationUnits().size() ); assertEquals( 2, params.getDataElements().size() ); @@ -227,7 +227,7 @@ dimensionParams.add( "dx:" + deA.getUid() + ";" + deB.getUid() ); dimensionParams.add( "pe:2011;2012" ); - DataQueryParams params = analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, null ); + DataQueryParams params = analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, false, null ); assertEquals( 2, params.getOrganisationUnits().size() ); assertEquals( 2, params.getDataElements().size() ); @@ -241,7 +241,7 @@ dimensionParams.add( "dx" ); dimensionParams.add( "pe:2012,2012S1,2012S2" ); - analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, null ); + analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, false, null ); } @Test( expected = IllegalQueryException.class ) @@ -251,7 +251,7 @@ dimensionParams.add( "dx:" + BASE_UID + "A;" + BASE_UID + "B;" + BASE_UID + "C;" + BASE_UID + "D" ); dimensionParams.add( "pe" ); - analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, null ); + analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, false, null ); } @Test( expected = IllegalQueryException.class ) @@ -261,7 +261,7 @@ dimensionParams.add( "dx:" + BASE_UID + "A;" + BASE_UID + "B;" + BASE_UID + "C;" + BASE_UID + "D" ); dimensionParams.add( "ou" ); - analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, null ); + analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, false, null ); } @Test( expected = IllegalQueryException.class ) @@ -271,7 +271,7 @@ dimensionParams.add( "dx:" + BASE_UID + "A;" + BASE_UID + "B;" + BASE_UID + "C;" + BASE_UID + "D" ); dimensionParams.add( "yebo:2012,2012S1,2012S2" ); - analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, null ); + analyticsService.getFromUrl( dimensionParams, null, null, null, false, false, false, false, false, null ); } @Test === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/grid/ListGrid.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/grid/ListGrid.java 2013-12-05 11:59:12 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/grid/ListGrid.java 2013-12-31 09:05:21 +0000 @@ -415,6 +415,15 @@ return this; } + public Grid removeCurrentWriteRow() + { + grid.remove( currentRowWriteIndex ); + + currentRowWriteIndex--; + + return this; + } + public Grid limitGrid( int limit ) { if ( limit < 0 ) === modified file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/grid/GridTest.java' --- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/grid/GridTest.java 2013-10-08 17:14:50 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/grid/GridTest.java 2013-12-31 09:05:21 +0000 @@ -255,6 +255,30 @@ assertEquals( 2, gridA.getWidth() ); } + + @Test + public void testRemoveCurrentWriteRow() + { + assertEquals( 4, gridA.getRows().size() ); + + gridA.addRow(); + gridA.addValue( 51 ); + gridA.addValue( 52 ); + gridA.addValue( 53 ); + + assertEquals( 5, gridA.getRows().size() ); + + gridA.removeCurrentWriteRow(); + + assertEquals( 4, gridA.getRows().size() ); + + gridA.addRow(); + gridA.addValue( 51 ); + gridA.addValue( 52 ); + gridA.addValue( 53 ); + + assertEquals( 5, gridA.getRows().size() ); + } @Test public void testLimit() === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AnalyticsController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AnalyticsController.java 2013-12-09 17:14:49 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AnalyticsController.java 2013-12-31 09:05:21 +0000 @@ -85,12 +85,13 @@ @RequestParam(required = false) boolean hierarchyMeta, @RequestParam(required = false) boolean ignoreLimit, @RequestParam(required = false) boolean tableLayout, + @RequestParam(required = false) boolean hideEmptyRows, @RequestParam(required = false) String columns, @RequestParam(required = false) String rows, Model model, HttpServletResponse response ) throws Exception { - DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, i18nManager.getI18nFormat() ); + DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, hideEmptyRows, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_JSON, CacheStrategy.RESPECT_SYSTEM_SETTING ); Grid grid = analyticsService.getAggregatedDataValues( params, tableLayout, getDimensionsFromParam( columns ), getDimensionsFromParam( rows ) ); @@ -110,12 +111,13 @@ @RequestParam(required = false) boolean hierarchyMeta, @RequestParam(required = false) boolean ignoreLimit, @RequestParam(required = false) boolean tableLayout, + @RequestParam(required = false) boolean hideEmptyRows, @RequestParam(required = false) String columns, @RequestParam(required = false) String rows, Model model, HttpServletResponse response ) throws Exception { - DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, i18nManager.getI18nFormat() ); + DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, hideEmptyRows, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_XML, CacheStrategy.RESPECT_SYSTEM_SETTING ); Grid grid = analyticsService.getAggregatedDataValues( params, tableLayout, getDimensionsFromParam( columns ), getDimensionsFromParam( rows ) ); @@ -133,12 +135,13 @@ @RequestParam(required = false) boolean hierarchyMeta, @RequestParam(required = false) boolean ignoreLimit, @RequestParam(required = false) boolean tableLayout, + @RequestParam(required = false) boolean hideEmptyRows, @RequestParam(required = false) String columns, @RequestParam(required = false) String rows, Model model, HttpServletResponse response ) throws Exception { - DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, i18nManager.getI18nFormat() ); + DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, hideEmptyRows, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_HTML, CacheStrategy.RESPECT_SYSTEM_SETTING ); Grid grid = analyticsService.getAggregatedDataValues( params, tableLayout, getDimensionsFromParam( columns ), getDimensionsFromParam( rows ) ); @@ -156,12 +159,13 @@ @RequestParam(required = false) boolean hierarchyMeta, @RequestParam(required = false) boolean ignoreLimit, @RequestParam(required = false) boolean tableLayout, + @RequestParam(required = false) boolean hideEmptyRows, @RequestParam(required = false) String columns, @RequestParam(required = false) String rows, Model model, HttpServletResponse response ) throws Exception { - DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, i18nManager.getI18nFormat() ); + DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, hideEmptyRows, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_CSV, CacheStrategy.RESPECT_SYSTEM_SETTING, "data.csv", true ); Grid grid = analyticsService.getAggregatedDataValues( params, tableLayout, getDimensionsFromParam( columns ), getDimensionsFromParam( rows ) ); @@ -179,12 +183,13 @@ @RequestParam(required = false) boolean hierarchyMeta, @RequestParam(required = false) boolean ignoreLimit, @RequestParam(required = false) boolean tableLayout, + @RequestParam(required = false) boolean hideEmptyRows, @RequestParam(required = false) String columns, @RequestParam(required = false) String rows, Model model, HttpServletResponse response ) throws Exception { - DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, i18nManager.getI18nFormat() ); + DataQueryParams params = analyticsService.getFromUrl( dimension, filter, aggregationType, measureCriteria, skipMeta, skipRounding, hierarchyMeta, ignoreLimit, hideEmptyRows, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_EXCEL, CacheStrategy.RESPECT_SYSTEM_SETTING, "data.xls", true ); Grid grid = analyticsService.getAggregatedDataValues( params, tableLayout, getDimensionsFromParam( columns ), getDimensionsFromParam( rows ) ); @@ -202,12 +207,13 @@ @RequestParam(required = false) boolean hierarchyMeta, @RequestParam(required = false) boolean ignoreLimit, @RequestParam(required = false) boolean tableLayout, + @RequestParam(required = false) boolean hideEmptyRows, @RequestParam(required = false) String columns, @RequestParam(required = false) String rows, Model model, HttpServletResponse response ) throws Exception { - DataQueryParams params = analyticsService.getFromUrl( dimension, filter, null, null, true, false, false, ignoreLimit, i18nManager.getI18nFormat() ); + DataQueryParams params = analyticsService.getFromUrl( dimension, filter, null, null, true, false, false, false, false, i18nManager.getI18nFormat() ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_XML, CacheStrategy.RESPECT_SYSTEM_SETTING, "data.jrxml", false ); Grid grid = analyticsService.getAggregatedDataValues( params ); === modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/java/org/hisp/dhis/mapping/action/GetGeoJsonAction.java' --- dhis-2/dhis-web/dhis-web-mapping/src/main/java/org/hisp/dhis/mapping/action/GetGeoJsonAction.java 2013-12-09 18:07:53 +0000 +++ dhis-2/dhis-web/dhis-web-mapping/src/main/java/org/hisp/dhis/mapping/action/GetGeoJsonAction.java 2013-12-31 09:05:21 +0000 @@ -117,7 +117,7 @@ ouParams.add( paramString.substring( 0, paramString.length() ) ); - DataQueryParams params = analyticsService.getFromUrl( ouParams, null, AggregationType.SUM, null, false, false, false, false, null ); + DataQueryParams params = analyticsService.getFromUrl( ouParams, null, AggregationType.SUM, null, false, false, false, false, false, null ); DimensionalObject dim = params.getDimension( DimensionalObject.ORGUNIT_DIM_ID ); === modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/java/org/hisp/dhis/mapping/action/GetGeoJsonFacilitiesAction.java' --- dhis-2/dhis-web/dhis-web-mapping/src/main/java/org/hisp/dhis/mapping/action/GetGeoJsonFacilitiesAction.java 2013-12-09 18:07:53 +0000 +++ dhis-2/dhis-web/dhis-web-mapping/src/main/java/org/hisp/dhis/mapping/action/GetGeoJsonFacilitiesAction.java 2013-12-31 09:05:21 +0000 @@ -149,7 +149,7 @@ ouParams.add( paramString.substring( 0, paramString.length() ) ); - DataQueryParams params = analyticsService.getFromUrl( ouParams, null, AggregationType.SUM, null, false, false, false, false, null ); + DataQueryParams params = analyticsService.getFromUrl( ouParams, null, AggregationType.SUM, null, false, false, false, false, false, null ); DimensionalObject dim = params.getDimension( DimensionalObject.ORGUNIT_DIM_ID );