=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java 2010-07-30 12:59:39 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java 2010-08-28 10:44:15 +0000 @@ -47,6 +47,7 @@ { public static final String DIMENSION_PERIOD = "period"; public static final String DIMENSION_ORGANISATIONUNIT = "organisationUnit"; + public static final String DIMENSION_INDICATOR = "indicator"; public static final String TYPE_BAR = "bar"; public static final String TYPE_LINE = "line"; === modified file 'dhis-2/dhis-services/dhis-service-excel-reporting/src/main/resources/org/hisp/dhis/reportexcel/excelitem/hibernate/ExcelItem.hbm.xml' --- dhis-2/dhis-services/dhis-service-excel-reporting/src/main/resources/org/hisp/dhis/reportexcel/excelitem/hibernate/ExcelItem.hbm.xml 2010-03-11 08:10:12 +0000 +++ dhis-2/dhis-services/dhis-service-excel-reporting/src/main/resources/org/hisp/dhis/reportexcel/excelitem/hibernate/ExcelItem.hbm.xml 2010-08-28 10:44:15 +0000 @@ -21,9 +21,6 @@ foreign-key="fk_exceltitem_group" lazy="false" insert="true" /> - - - @@ -32,7 +29,6 @@ - === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java 2010-07-28 13:44:59 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java 2010-08-28 10:44:15 +0000 @@ -29,6 +29,7 @@ import static org.hisp.dhis.chart.Chart.DIMENSION_ORGANISATIONUNIT; import static org.hisp.dhis.chart.Chart.DIMENSION_PERIOD; +import static org.hisp.dhis.chart.Chart.DIMENSION_INDICATOR; import static org.hisp.dhis.chart.Chart.SIZE_NORMAL; import static org.hisp.dhis.chart.Chart.TYPE_BAR; import static org.hisp.dhis.chart.Chart.TYPE_LINE; @@ -89,17 +90,20 @@ implements ChartService { private static final Font titleFont = new Font( "Tahoma", Font.BOLD, 14 ); + private static final Font subTitleFont = new Font( "Tahoma", Font.PLAIN, 12 ); + private static final String TREND_PREFIX = "Trend - "; + private static final String TITLE_SEPARATOR = " - "; + private static final String DEFAULT_TITLE_PIVOT_CHART = "Pivot Chart"; - - private static final Color[] colors = { - Color.decode( "#d54a4a" ), Color.decode( "#2e4e83" ), Color.decode( "#75e077" ), - Color.decode( "#e3e274" ), Color.decode( "#e58c6d" ), Color.decode( "#df6ff3" ), - Color.decode( "#88878e" ), Color.decode( "#6ff3e8" ), Color.decode( "#6fc3f3" ), - Color.decode( "#aaf36f" ), Color.decode( "#9d6ff3" ), Color.decode( "#474747" ) }; - + + private static final Color[] colors = { Color.decode( "#d54a4a" ), Color.decode( "#2e4e83" ), + Color.decode( "#75e077" ), Color.decode( "#e3e274" ), Color.decode( "#e58c6d" ), Color.decode( "#df6ff3" ), + Color.decode( "#88878e" ), Color.decode( "#6ff3e8" ), Color.decode( "#6fc3f3" ), Color.decode( "#aaf36f" ), + Color.decode( "#9d6ff3" ), Color.decode( "#474747" ) }; + // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -109,10 +113,10 @@ public void setChartStore( ChartStore chartStore ) { this.chartStore = chartStore; - } - + } + private PeriodService periodService; - + public void setPeriodService( PeriodService periodService ) { this.periodService = periodService; @@ -124,14 +128,14 @@ { this.dataValueService = dataValueService; } - + private MinMaxDataElementService minMaxDataElementService; public void setMinMaxDataElementService( MinMaxDataElementService minMaxDataElementService ) { this.minMaxDataElementService = minMaxDataElementService; } - + private AggregationService aggregationService; public void setAggregationService( AggregationService aggregationService ) @@ -150,23 +154,23 @@ public JFreeChart getJFreeChart( int id, I18nFormat format ) { Chart chart = getChart( id ); - + if ( chart.getRelatives() != null ) { - chart.setRelativePeriods( periodService.reloadPeriods( chart.getRelatives().getRelativePeriods( 1, null, false ) ) ); + chart.setRelativePeriods( periodService.reloadPeriods( chart.getRelatives().getRelativePeriods( 1, null, + false ) ) ); } - - chart.setFormat( format ); + + chart.setFormat( format ); chart.init(); - + return getJFreeChart( chart, true ); } - public JFreeChart getJFreeChart( List indicators, List periods, + public JFreeChart getJFreeChart( List indicators, List periods, List organisationUnits, String dimension, boolean regression, I18nFormat format ) { Chart chart = new Chart(); - chart.setTitle( getTitle( indicators, periods, organisationUnits, format ) ); chart.setType( TYPE_BAR ); chart.setSize( SIZE_NORMAL ); @@ -179,69 +183,72 @@ chart.setPeriods( periods ); chart.setOrganisationUnits( organisationUnits ); chart.setFormat( format ); - + chart.init(); - + return getJFreeChart( chart, false ); } - - public JFreeChart getJFreeChart( String title, PlotOrientation orientation, - CategoryLabelPositions labelPositions, Map categoryValues ) + + public JFreeChart getJFreeChart( String title, PlotOrientation orientation, CategoryLabelPositions labelPositions, + Map categoryValues ) { DefaultCategoryDataset dataSet = new DefaultCategoryDataset(); - + for ( Entry entry : categoryValues.entrySet() ) { dataSet.addValue( entry.getValue(), title, entry.getKey() ); } - + CategoryPlot plot = getCategoryPlot( dataSet, getBarRenderer(), orientation, labelPositions ); - + JFreeChart jFreeChart = getBasicJFreeChart( plot ); return jFreeChart; } - - public JFreeChart getJFreeChartHistory( DataElement dataElement, DataElementCategoryOptionCombo categoryOptionCombo, - Period lastPeriod, OrganisationUnit organisationUnit, int historyLength, I18nFormat format ) + + public JFreeChart getJFreeChartHistory( DataElement dataElement, + DataElementCategoryOptionCombo categoryOptionCombo, Period lastPeriod, OrganisationUnit organisationUnit, + int historyLength, I18nFormat format ) { List periods = periodService.getPeriods( lastPeriod, historyLength ); - MinMaxDataElement minMax = minMaxDataElementService.getMinMaxDataElement( organisationUnit, dataElement, categoryOptionCombo ); - + MinMaxDataElement minMax = minMaxDataElementService.getMinMaxDataElement( organisationUnit, dataElement, + categoryOptionCombo ); + UnivariateRealInterpolator interpolator = new SplineInterpolator(); - + Integer periodCount = 0; List x = new ArrayList(); List y = new ArrayList(); - + // --------------------------------------------------------------------- // DataValue, MinValue and MaxValue DataSets // --------------------------------------------------------------------- DefaultCategoryDataset dataValueDataSet = new DefaultCategoryDataset(); DefaultCategoryDataset metaDataSet = new DefaultCategoryDataset(); - + for ( Period period : periods ) { ++periodCount; - + period.setName( format.formatPeriod( period ) ); - - DataValue dataValue = dataValueService.getDataValue( organisationUnit, dataElement, period, categoryOptionCombo ); - + + DataValue dataValue = dataValueService.getDataValue( organisationUnit, dataElement, period, + categoryOptionCombo ); + double value = 0; - + if ( dataValue != null && dataValue.getValue() != null && MathUtils.isNumeric( dataValue.getValue() ) ) { value = Double.parseDouble( dataValue.getValue() ); - + x.add( periodCount.doubleValue() ); y.add( value ); } - + dataValueDataSet.addValue( value, dataElement.getShortName(), period.getName() ); - + if ( minMax != null ) { metaDataSet.addValue( minMax.getMin(), "Min value", period.getName() ); @@ -258,14 +265,14 @@ periodCount = 0; double[] xa = getArray( x ); - + int min = MathUtils.getMin( xa ).intValue(); int max = MathUtils.getMax( xa ).intValue(); - + try { UnivariateRealFunction function = interpolator.interpolate( xa, getArray( y ) ); - + for ( Period period : periods ) { if ( ++periodCount >= min && periodCount <= max ) @@ -284,16 +291,17 @@ // Plots // --------------------------------------------------------------------- - CategoryPlot plot = getCategoryPlot( dataValueDataSet, getBarRenderer(), PlotOrientation.VERTICAL, CategoryLabelPositions.UP_45 ); - - plot.setDataset( 1, metaDataSet ); + CategoryPlot plot = getCategoryPlot( dataValueDataSet, getBarRenderer(), PlotOrientation.VERTICAL, + CategoryLabelPositions.UP_45 ); + + plot.setDataset( 1, metaDataSet ); plot.setRenderer( 1, getLineRenderer() ); - + JFreeChart jFreeChart = getBasicJFreeChart( plot ); return jFreeChart; } - + // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- @@ -310,11 +318,11 @@ return jFreeChart; } - + /** * Returns a CategoryPlot. */ - private CategoryPlot getCategoryPlot( CategoryDataset dataSet, CategoryItemRenderer renderer, + private CategoryPlot getCategoryPlot( CategoryDataset dataSet, CategoryItemRenderer renderer, PlotOrientation orientation, CategoryLabelPositions labelPositions ) { CategoryPlot plot = new CategoryPlot( dataSet, new CategoryAxis(), new NumberAxis(), renderer ); @@ -327,7 +335,7 @@ return plot; } - + /** * Returns a bar renderer. */ @@ -342,10 +350,10 @@ renderer.setSeriesPaint( i, colors[i] ); renderer.setShadowVisible( false ); } - + return renderer; } - + /** * Returns a line and shape renderer. */ @@ -357,10 +365,10 @@ { renderer.setSeriesPaint( i, colors[i] ); } - + return renderer; } - + /** * Returns a JFreeChart of type defined in the chart argument. */ @@ -368,13 +376,13 @@ { final BarRenderer barRenderer = getBarRenderer(); final LineAndShapeRenderer lineRenderer = getLineRenderer(); - + // --------------------------------------------------------------------- // Plot // --------------------------------------------------------------------- CategoryPlot plot = null; - + CategoryDataset[] dataSets = getCategoryDataSet( chart ); if ( chart.isType( TYPE_LINE ) ) @@ -382,36 +390,38 @@ plot = new CategoryPlot( dataSets[0], new CategoryAxis(), new NumberAxis(), lineRenderer ); } else - { - plot = new CategoryPlot( dataSets[0], new CategoryAxis(), new NumberAxis(), barRenderer ); + { + plot = new CategoryPlot( dataSets[0], new CategoryAxis(), new NumberAxis(), barRenderer ); } - + if ( chart.isRegression() ) { plot.setDataset( 1, dataSets[1] ); plot.setRenderer( 1, lineRenderer ); } - + JFreeChart jFreeChart = new JFreeChart( chart.getTitle(), titleFont, plot, !chart.isHideLegend() ); - + if ( subTitle ) { jFreeChart.addSubtitle( getSubTitle( chart, chart.getFormat() ) ); } - + // --------------------------------------------------------------------- // Plot orientation // --------------------------------------------------------------------- - plot.setOrientation( chart.isHorizontalPlotOrientation() ? PlotOrientation.HORIZONTAL : PlotOrientation.VERTICAL ); + plot.setOrientation( chart.isHorizontalPlotOrientation() ? PlotOrientation.HORIZONTAL + : PlotOrientation.VERTICAL ); plot.setDatasetRenderingOrder( DatasetRenderingOrder.FORWARD ); - + // --------------------------------------------------------------------- // Category label positions // --------------------------------------------------------------------- CategoryAxis xAxis = plot.getDomainAxis(); - xAxis.setCategoryLabelPositions( chart.isVerticalLabels() ? CategoryLabelPositions.UP_45 : CategoryLabelPositions.STANDARD ); + xAxis.setCategoryLabelPositions( chart.isVerticalLabels() ? CategoryLabelPositions.UP_45 + : CategoryLabelPositions.STANDARD ); // --------------------------------------------------------------------- // Color & antialias @@ -422,7 +432,7 @@ return jFreeChart; } - + /** * Returns a DefaultCategoryDataSet based on aggregated data for the chart. */ @@ -430,19 +440,20 @@ { final DefaultCategoryDataset regularDataSet = new DefaultCategoryDataset(); final DefaultCategoryDataset regressionDataSet = new DefaultCategoryDataset(); - + if ( chart != null ) { Period selectedPeriod = chart.getAllPeriods().get( 0 ); OrganisationUnit selectedOrganisationUnit = chart.getOrganisationUnits().get( 0 ); - + for ( Indicator indicator : chart.getIndicators() ) { final SimpleRegression regression = new SimpleRegression(); - + int columnIndex = 0; - - if ( chart.isDimension( DIMENSION_PERIOD ) ) + + if ( chart.isDimension( DIMENSION_PERIOD ) || chart.isDimension( DIMENSION_INDICATOR ) ) + { // --------------------------------------------------------- // Regular dataset @@ -450,33 +461,51 @@ for ( Period period : chart.getAllPeriods() ) { - final Double value = aggregationService.getAggregatedIndicatorValue( indicator, period.getStartDate(), period.getEndDate(), selectedOrganisationUnit ); - - regularDataSet.addValue( value != null ? value : 0, indicator.getShortName(), chart.getFormat().formatPeriod( period ) ); - + final Double value = aggregationService.getAggregatedIndicatorValue( indicator, period + .getStartDate(), period.getEndDate(), selectedOrganisationUnit ); + + if ( chart.isDimension( DIMENSION_PERIOD ) ) + { + + regularDataSet.addValue( value != null ? value : 0, indicator.getShortName(), chart + .getFormat().formatPeriod( period ) ); + + } + else + { + regularDataSet.addValue( value != null ? value : 0, + chart.getFormat().formatPeriod( period ), indicator.getShortName() ); + } columnIndex++; - - if ( value != null && value != 0.0 ) // Omit missing values and 0 from regression + + if ( value != null && value != 0.0 ) // Omit missing + // values and 0 + // from regression { regression.addData( columnIndex, value ); } } - + // --------------------------------------------------------- // Regression dataset // --------------------------------------------------------- columnIndex = 0; - + if ( chart.isRegression() ) { for ( Period period : chart.getAllPeriods() ) { final double value = regression.predict( columnIndex++ ); - - if ( !Double.isNaN( value ) ) // Enough values must exist for regression + + if ( !Double.isNaN( value ) ) // Enough values + // must + // exist for + // regression { - regressionDataSet.addValue( value, TREND_PREFIX + indicator.getShortName(), chart.getFormat().formatPeriod( period ) ); + regressionDataSet.addValue( value, TREND_PREFIX + indicator.getShortName(), chart + .getFormat().formatPeriod( period ) ); + } } } @@ -489,65 +518,69 @@ for ( OrganisationUnit unit : chart.getOrganisationUnits() ) { - final Double value = aggregationService.getAggregatedIndicatorValue( indicator, selectedPeriod.getStartDate(), selectedPeriod.getEndDate(), unit ); - - regularDataSet.addValue( value != null ? value : 0, indicator.getShortName(), unit.getShortName() ); - + final Double value = aggregationService.getAggregatedIndicatorValue( indicator, selectedPeriod + .getStartDate(), selectedPeriod.getEndDate(), unit ); + + regularDataSet.addValue( value != null ? value : 0, indicator.getShortName(), unit + .getShortName() ); + columnIndex++; } - - // Regression not relevant for organisation unit category + + // Regression not relevant for organisation unit + // category } + } } - + return new CategoryDataset[] { regularDataSet, regressionDataSet }; } /** * Returns a title based on the chart meta data. */ - private String getTitle( List indicators, List periods, + private String getTitle( List indicators, List periods, List organisationUnits, I18nFormat format ) { String title = ""; - + if ( indicators != null && indicators.size() == 1 ) { title += indicators.get( 0 ).getShortName() + TITLE_SEPARATOR; } - + if ( periods != null && periods.size() == 1 ) { title += format.formatPeriod( periods.get( 0 ) ) + TITLE_SEPARATOR; } - + if ( organisationUnits != null && organisationUnits.size() == 1 ) { title += organisationUnits.get( 0 ).getShortName() + TITLE_SEPARATOR; } - + if ( title.length() == 0 ) { title = DEFAULT_TITLE_PIVOT_CHART; } else { - title = title.substring( 0, ( title.length() - TITLE_SEPARATOR.length() ) ); + title = title.substring( 0, (title.length() - TITLE_SEPARATOR.length()) ); } - + return title; } - + /** * Returns a subtitle based on the chart dimension. */ private TextTitle getSubTitle( Chart chart, I18nFormat format ) { TextTitle subTitle = new TextTitle(); - + subTitle.setFont( subTitleFont ); - + if ( chart.isDimension( DIMENSION_PERIOD ) && chart.getOrganisationUnits().size() > 0 ) { subTitle.setText( chart.getOrganisationUnits().get( 0 ).getName() ); @@ -556,10 +589,10 @@ { subTitle.setText( format.formatPeriod( chart.getAllPeriods().get( 0 ) ) ); } - + return subTitle; } - + // ------------------------------------------------------------------------- // CRUD operations // ------------------------------------------------------------------------- @@ -568,32 +601,32 @@ { return chartStore.save( chart ); } - + public void saveOrUpdate( Chart chart ) { chartStore.saveOrUpdate( chart ); } - + public Chart getChart( int id ) { return chartStore.get( id ); } - + public void deleteChart( Chart chart ) { chartStore.delete( chart ); } - + public Collection getAllCharts() { return chartStore.getAll(); } - + public Chart getChartByTitle( String name ) { return chartStore.getByTitle( name ); } - + public Collection getCharts( final Collection identifiers ) { Collection charts = getAllCharts(); === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/org/hisp/dhis/dd/i18n_module.properties' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/org/hisp/dhis/dd/i18n_module.properties 2010-07-19 13:19:26 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/org/hisp/dhis/dd/i18n_module.properties 2010-08-28 10:44:15 +0000 @@ -306,7 +306,7 @@ select_indicator = Please select indicator annualized = Annualized could_not_save = Could not save -object_not_deleted_associated_by_objects = Object not deleted becuause it is associated by objects of type +object_not_deleted_associated_by_objects = Object not deleted because it is associated by objects of type hide_warning = Hide warning please_enter_name = Please enter name ! group_ready_exist = Group ready exist === modified file 'dhis-2/dhis-web/dhis-web-reporting/src/main/java/org/hisp/dhis/reporting/chart/action/ViewChartAction.java' --- dhis-2/dhis-web/dhis-web-reporting/src/main/java/org/hisp/dhis/reporting/chart/action/ViewChartAction.java 2010-04-12 21:23:33 +0000 +++ dhis-2/dhis-web/dhis-web-reporting/src/main/java/org/hisp/dhis/reporting/chart/action/ViewChartAction.java 2010-08-28 10:44:15 +0000 @@ -110,7 +110,7 @@ chart = chartService.getJFreeChart( id, format ); Chart temp = chartService.getChart( id ); - + width = temp.getWidth(); height = temp.getHeight(); === modified file 'dhis-2/dhis-web/dhis-web-reporting/src/main/resources/org/hisp/dhis/reporting/i18n_module.properties' --- dhis-2/dhis-web/dhis-web-reporting/src/main/resources/org/hisp/dhis/reporting/i18n_module.properties 2010-08-27 07:07:57 +0000 +++ dhis-2/dhis-web/dhis-web-reporting/src/main/resources/org/hisp/dhis/reporting/i18n_module.properties 2010-08-28 10:44:15 +0000 @@ -307,4 +307,10 @@ intro_chart = View and add charts. Charts are based on indicators and either organisation units or periods. intro_pivot_table = Browse pivot tables, which can be pivoted on any of the indicator, organisation unit and period dimensions. intro_report_table = Add and generate report tables. Report tables are highly customizable database tables which can be used as basis for reports. -intro_data_completeness = Browse the submission rates of data sets. This can be viewed by organisation unit and period, and later reported to PDF and Workbook. \ No newline at end of file +intro_data_completeness = Browse the submission rates of data sets. This can be viewed by organisation unit and period, and later reported to PDF and Workbook. +add_indicator_chart = Add indicator chart +create_period_by_indicator_chart = Create period by indicator chart +value_x_selected_indicators = Value (X) - Selected indicators +value_x_available_indicators = Value (X) - Available indicators +category_y_selected_periods = Value (Y) - Selected periods +value_y_available_indicators = Value (Y) - Available periods \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/addChartForm.vm' --- dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/addChartForm.vm 2010-06-25 10:31:20 +0000 +++ dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/addChartForm.vm 2010-08-28 10:44:15 +0000 @@ -1,9 +1,10 @@ - #macro ( getHeader ) #if ( $dimension == "period" ) $i18n.getString( "create_indicator_by_period_chart" ) - #else + #elseif ( $dimension == "organisationUnit" ) $i18n.getString( "create_indicator_by_organisation_unit_chart" ) + #elseif ( $dimension == "indicator" ) + $i18n.getString( "create_period_by_indicator_chart" ) #end #end @@ -64,75 +65,12 @@ +#if ( $dimension == "indicator" ) + #parse( "dhis-web-reporting/addChartIndicatorModeForm.vm" ) +#else + #parse( "dhis-web-reporting/addChartOrgunitOrPeriodForm.vm" ) +#end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #if ( $dimension == "period" ) - #parse( "dhis-web-reporting/addChartPeriodModeForm.vm" ) - #else - #parse( "dhis-web-reporting/addChartOrganisationUnitModeForm.vm" ) - #end - - - - - === modified file 'dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/addChartPeriodModeForm.vm' --- dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/addChartPeriodModeForm.vm 2010-07-18 15:17:23 +0000 +++ dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/addChartPeriodModeForm.vm 2010-08-28 10:44:15 +0000 @@ -1,4 +1,4 @@ - +
$i18n.getString( "value_y_available_indicators" )
- -
- -
- -
$i18n.getString( "value_y_selected_indicators" )
- - -

- -
@@ -123,3 +123,4 @@ +
=== modified file 'dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/javascript/chart.js' --- dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/javascript/chart.js 2010-07-04 23:55:46 +0000 +++ dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/javascript/chart.js 2010-08-28 10:44:15 +0000 @@ -73,7 +73,7 @@ { selectAllById( "selectedIndicators" ); - if ( dimension == "period" ) + if ( dimension == "period" || dimension == "indicator") { selectAllById( "selectedPeriods" ); } === modified file 'dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/viewChartForm.vm' --- dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/viewChartForm.vm 2010-07-04 23:55:46 +0000 +++ dhis-2/dhis-web/dhis-web-reporting/src/main/webapp/dhis-web-reporting/viewChartForm.vm 2010-08-28 10:44:15 +0000 @@ -8,7 +8,8 @@

- +
+