← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 9570: Ad-hoc aggregated reports in Tabular reports(WIP) - Allow to add more filter DE fields.

 

------------------------------------------------------------
revno: 9570
committer: Tran Chau <tran.hispvietnam@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2013-01-22 13:42:20 +0700
message:
  Ad-hoc aggregated reports in Tabular reports(WIP) - Allow to add more filter DE fields.
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/patientreport/PatientAggregateReport.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java
  dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java
  dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GenerateAggregateReportAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/resources/org/hisp/dhis/caseentry/i18n_module.properties
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/i18n.vm


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/patientreport/PatientAggregateReport.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/patientreport/PatientAggregateReport.java	2013-01-21 09:52:11 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/patientreport/PatientAggregateReport.java	2013-01-22 06:42:20 +0000
@@ -69,6 +69,8 @@
 
     public static final int POSITION_ROW_DATA_COLUMN_ORGUNIT = 10; // PIVOT FROM
                                                                    // 7
+    
+    public static final String SEPARATE_FILTER = "_";
 
     private ProgramStage programStage;
 

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java	2013-01-21 06:18:31 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceService.java	2013-01-22 06:42:20 +0000
@@ -28,6 +28,7 @@
 
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -111,7 +112,7 @@
         Collection<Integer> orgunitIds, Date startDate, Date endDate, int status, Integer max, Integer min );
 
     Grid getAggregateReport( int position, ProgramStage programStage, Collection<Integer> orgunitIds,
-        String facilityLB, Integer dataElementId, Map<Integer, String> deFilters, Collection<Period> periods,
+        String facilityLB, Integer dataElementId, Map<Integer, Collection<String>>  deFilters, Collection<Period> periods,
         String aggregateType, Integer limit, Boolean useCompletedEvents, I18nFormat format, I18n i18n );
 
 }

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java	2013-01-21 06:18:31 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramStageInstanceStore.java	2013-01-22 06:42:20 +0000
@@ -28,6 +28,7 @@
 
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -102,7 +103,7 @@
         Collection<Integer> orgunitIds, Date startDate, Date endDate, int status, Integer min, Integer max );
 
     Grid getAggregateReport( int position, ProgramStage programStage, Collection<Integer> orgunitIds,
-        String facilityLB, Integer dataElementId, Map<Integer, String> deFilters, Collection<Period> periods,
+        String facilityLB, Integer dataElementId, Map<Integer, Collection<String>> deFilters, Collection<Period> periods,
         String aggregateType, Integer limit, Boolean useCompletedEvents, I18nFormat format, I18n i18n );
 
 }

=== modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java'
--- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java	2013-01-21 06:18:31 +0000
+++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/DefaultProgramStageInstanceService.java	2013-01-22 06:42:20 +0000
@@ -347,7 +347,7 @@
 
     @Override
     public Grid getAggregateReport( int position, ProgramStage programStage, Collection<Integer> orgunitIds,
-        String facilityLB, Integer dataElementId, Map<Integer, String> deFilters, Collection<Period> periods,
+        String facilityLB, Integer dataElementId, Map<Integer, Collection<String>> deFilters, Collection<Period> periods,
         String aggregateType, Integer limit, Boolean useCompletedEvents, I18nFormat format, I18n i18n )
     {
         return programStageInstanceStore.getAggregateReport( position, programStage, orgunitIds, facilityLB,

=== modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java'
--- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java	2013-01-21 07:29:15 +0000
+++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java	2013-01-22 06:42:20 +0000
@@ -392,7 +392,7 @@
     }
 
     public Grid getAggregateReport( int position, ProgramStage programStage, Collection<Integer> orgunitIds,
-        String facilityLB, Integer deGroupBy, Map<Integer, String> deFilters, Collection<Period> periods,
+        String facilityLB, Integer deGroupBy, Map<Integer, Collection<String>> deFilters, Collection<Period> periods,
         String aggregateType, Integer limit, Boolean useCompletedEvents, I18nFormat format, I18n i18n )
     {
         String sql = "";
@@ -590,13 +590,13 @@
             // ---------------------------------------------------------------------
             // Headers cols
             // ---------------------------------------------------------------------
-            
+
             if ( position == PatientAggregateReport.POSITION_ROW_ORGUNIT_COLUMN_DATA )
             {
                 grid.addHeader( new GridHeader( i18n.getString( "orgunit" ), false, true ) );
                 grid.addHeader( new GridHeader( i18n.getString( aggregateType ), false, false ) );
             }
-            
+
             // ---------------------------------------------------------------------
             // Get SQL and build grid
             // ---------------------------------------------------------------------
@@ -1378,7 +1378,7 @@
         }
     }
 
-    private String filterSQLStatement( Map<Integer, String> deFilters )
+    private String filterSQLStatement( Map<Integer, Collection<String>> deFilters )
     {
         String filter = "";
         if ( deFilters != null )
@@ -1389,26 +1389,22 @@
             while ( iterFilter.hasNext() )
             {
                 Integer id = iterFilter.next();
-                String[] filterKey = deFilters.get( id ).split( "_" );
-
-                filter += "AND (SELECT value ";
-                filter += "FROM patientdatavalue ";
-                filter += "WHERE programstageinstanceid=psi_1.programstageinstanceid AND ";
-                if ( !flag )
-                {
-                    filter += "dataelementid= pdv_1.dataelementid AND ";
-                    flag = true;
-                }
-                filter += "dataelementid=" + id + "  ";
-                filter += ") " + filterKey[0] + " " + filterKey[1] + " ";
-
-                if ( filterKey.length == 4 )
-                {
+                for ( String filterValue : deFilters.get( id ) )
+                {
+                    int index = filterValue.indexOf( PatientAggregateReport.SEPARATE_FILTER );
+                    String operator = (filterValue.substring( 0, index ));
+                    String value = filterValue.substring( index + 1, filterValue.length() );
+
                     filter += "AND (SELECT value ";
                     filter += "FROM patientdatavalue ";
                     filter += "WHERE programstageinstanceid=psi_1.programstageinstanceid AND ";
+                    if ( !flag )
+                    {
+                        filter += "dataelementid= pdv_1.dataelementid AND ";
+                        flag = true;
+                    }
                     filter += "dataelementid=" + id + "  ";
-                    filter += ") " + filterKey[2] + " " + filterKey[3] + " ";
+                    filter += ") " + operator + " " + value + " ";
                 }
             }
         }

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GenerateAggregateReportAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GenerateAggregateReportAction.java	2013-01-21 06:18:31 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/report/GenerateAggregateReportAction.java	2013-01-22 06:42:20 +0000
@@ -38,6 +38,7 @@
 import org.hisp.dhis.i18n.I18n;
 import org.hisp.dhis.i18n.I18nFormat;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
+import org.hisp.dhis.patientreport.PatientAggregateReport;
 import org.hisp.dhis.period.Period;
 import org.hisp.dhis.period.PeriodService;
 import org.hisp.dhis.period.PeriodType;
@@ -57,8 +58,6 @@
 public class GenerateAggregateReportAction
     implements Action
 {
-    private final String SEPARATE_FILTER = "_";
-
     // -------------------------------------------------------------------------
     // Dependencies
     // -------------------------------------------------------------------------
@@ -243,7 +242,7 @@
         // ---------------------------------------------------------------------
 
         Collection<OrganisationUnit> userOrgunits = currentUserService.getCurrentUser().getOrganisationUnits();
-        
+
         if ( userOrganisationUnit || userOrganisationUnitChildren )
         {
             orgunitIds = new HashSet<Integer>();
@@ -301,15 +300,26 @@
         // ---------------------------------------------------------------------
 
         ProgramStage programStage = programStageService.getProgramStage( programStageId );
-        Map<Integer, String> deFilterMap = null;
+        Map<Integer, Collection<String>> deFilterMap = null;
         if ( deFilters != null )
         {
-            deFilterMap = new HashMap<Integer, String>();
+            deFilterMap = new HashMap<Integer, Collection<String>>();
             for ( String deFilter : deFilters )
             {
-                int index = deFilter.indexOf( SEPARATE_FILTER );
-                deFilterMap.put( Integer.parseInt( deFilter.substring( 0, index ) ),
-                    deFilter.substring( index + 1, deFilter.length() ) );
+                int index = deFilter.indexOf( PatientAggregateReport.SEPARATE_FILTER );
+                Integer deId = Integer.parseInt( deFilter.substring( 0, index ) );
+                String filter = deFilter.substring( index + 1, deFilter.length() );
+                if ( deFilterMap.containsKey( deId ) )
+                {
+                    Collection<String> filterValues = deFilterMap.get( deId );
+                    filterValues.add( filter );
+                }
+                else
+                {
+                    Collection<String> filterValues = new HashSet<String>();
+                    filterValues.add( filter );
+                    deFilterMap.put( deId, filterValues );
+                }
             }
         }
 

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/resources/org/hisp/dhis/caseentry/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/resources/org/hisp/dhis/caseentry/i18n_module.properties	2013-01-21 07:29:15 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/resources/org/hisp/dhis/caseentry/i18n_module.properties	2013-01-22 06:42:20 +0000
@@ -528,7 +528,7 @@
 rows = Rows
 columns = Columns
 filters = Filters
-enter_filter_value = Enter filter value 
+Filter_value = Filter value 
 filter_values = Filter values
 fill_filter_values_for_all_selected_data_elements = Please fill filter values for all selected data elements
 data_filter = Data filter

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js	2013-01-21 09:52:11 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js	2013-01-22 06:42:20 +0000
@@ -379,59 +379,93 @@
 			},
 			addFilterField: function( p, id, name, valueType ){
 				var xtype = TR.value.covertXType(valueType);
+				var panelid = 'p_' + id;
+				var idx = 0;
+				var subPanel = Ext.getCmp(panelid);
+				if( subPanel == undefined )
+				{
+					var panel = {
+						xtype: 'panel',
+						id: panelid,
+						layout: 'column',
+						bodyStyle: 'border-style:none',
+						autoScroll: true,
+						overflowX: 'hidden',
+						overflowY: 'auto',
+						width: TR.conf.layout.west_fieldset_width - 40
+					};
+					Ext.getCmp(p).add(panel);
+					subPanel = Ext.getCmp(panelid);
+				}
+				else {
+					idx = subPanel.items.length/4;
+				}
 				
-				var fields = [];
-				fields[0] = {
+				var items = [];
+				var fieldid = id + '_' + idx;
+				items[0] = {
 					xtype: 'label',
-					id: 'filter_lb_' + id,
+					id: 'filter_lb_' + fieldid,
 					text:name,
-					width:(TR.conf.layout.west_fieldset_width - TR.conf.layout.west_width_subtractor) / 2
+					width:(TR.conf.layout.west_fieldset_width - TR.conf.layout.west_width_subtractor) / 2 - 60
 				};
-				fields[1] = this.createOperatorField(valueType, id);
-				fields[2] = this.createFilterField( xtype, id, name );
+				items[1] = this.createOperatorField(valueType, fieldid);
+				items[2] = this.createFilterField( xtype, fieldid );
+				if( idx == 0 ){
+					items[3] = this.addFieldBtn( panelid, id, name, valueType, idx );
+				}
+				else
+				{
+					items[3] = this.removeFieldBtn( panelid, fieldid );
+				}
 				
-				if(valueType != 'string' && valueType != 'trueOnly' 
-					&& valueType != 'bool' && valueType != 'list' ){
-					id = id + '_1';
-					fields[3] = {
-						xtype: 'label',
-						id: 'filter_lb_' + id,
-						text: '-',
-						width:(TR.conf.layout.west_fieldset_width - TR.conf.layout.west_width_subtractor) / 2
-					};
-					fields[4] = this.createOperatorField(valueType, id);
-					fields[5] = this.createFilterField( xtype, id, name );
-				}
-				Ext.getCmp(p).add(fields);
+				subPanel.add(items);
 			},
-			removeFilterField: function( p, id, valueType ){
-				var e1 = Ext.getCmp( 'filter_' + id );
-				var e2 = Ext.getCmp( 'filter_opt_' + id );
-				var e3 = Ext.getCmp( 'filter_lb_' + id );
-				
-				Ext.getCmp(p).remove(e1);
-				Ext.getCmp(p).remove(e2);
-				Ext.getCmp(p).remove(e3);
-				
-				if(valueType != 'string' && valueType != 'trueOnly' && valueType != 'bool'){
-					id = id + '_1';
-					var e4 = Ext.getCmp( 'filter_' + id );
-					var e5 = Ext.getCmp( 'filter_opt_' + id );
-					var e6 = Ext.getCmp( 'filter_lb_' + id );
-					Ext.getCmp(p).remove(e4);
-					Ext.getCmp(p).remove(e5);
-					Ext.getCmp(p).remove(e6);
-				}
-				
+			removeFilterField: function( p, id ){
+				var e = Ext.getCmp( 'p_' + id );
+				Ext.getCmp(p).remove(e);
 				Ext.getCmp(p).doLayout();
 			},
+			createOperatorField: function( valueType, id ){
+				var params = {};
+				params.xtype = 'combobox';
+				params.id = 'filter_opt_' + id;
+				params.width = 50;
+				params.queryMode = 'local';
+				params.valueField = 'value';
+				params.displayField = 'name';
+				params.editable = false;
+				params.value = '=';
+				
+				if(valueType == 'string' || valueType == 'trueOnly' 
+					|| valueType == 'bool' || valueType == 'list' ){
+					params.store = new Ext.data.ArrayStore({
+						fields: ['value','name'],
+						data: [ ['=','='],['like',TR.i18n.like],['in',TR.i18n.in] ]
+					});
+				}
+				else
+				{
+					params.store = new Ext.data.ArrayStore({
+						fields: ['value','name'],
+						data: [ ['=','='],
+								['>','>'],
+								['>=','>='],
+								['<','<'],
+								['<=','<='],
+								['!=','!=' ] ]
+					});
+				}
+				
+				return params;
+			},
 			createFilterField: function( xtype, id ){
 				var params = {};
 				params.xtype = xtype;
 				params.id = 'filter_' + id;
 				params.cls = 'tr-textfield-alt1';
-				params.emptyText = TR.i18n.enter_filter_value;
-				params.width = (TR.conf.layout.west_fieldset_width - TR.conf.layout.west_width_subtractor) / 2 - 70;
+				params.emptyText = TR.i18n.filter_value;
+				params.width = (TR.conf.layout.west_fieldset_width - TR.conf.layout.west_width_subtractor) / 2 - 50;
 				xtype = xtype.toLowerCase();
 				if( xtype == 'datefield' )
 				{
@@ -475,36 +509,33 @@
 				}
 				return params;
 			},
-			createOperatorField: function( valueType, id){
-				var params = {};
-				params.xtype = 'combobox';
-				params.id = 'filter_opt_' + id;
-				params.width = 40;
-				params.queryMode = 'local';
-				params.valueField = 'value';
-				params.displayField = 'name';
-				params.value = '=';
-				
-				if(valueType == 'string' || valueType == 'trueOnly' 
-					|| valueType == 'bool' || valueType == 'list' ){
-					params.store = new Ext.data.ArrayStore({
-						fields: ['value','name'],
-						data: [ ['=','='],['like',TR.i18n.like],['in',TR.i18n.in] ]
-					});
-				}
-				else
-				{
-					params.store = new Ext.data.ArrayStore({
-						fields: ['value','name'],
-						data: [ ['=','='],
-								['>','>'],
-								['>=','>='],
-								['<','<'],
-								['<=','<='],
-								['!=','!=' ] ]
-					});
-				}
-				
+			addFieldBtn: function( p, id, name, valueType, idx ){
+				var params = {};
+				params.xtype = 'button';
+				params.text = "+";
+				params.tooltip = TR.i18n.add,
+				params.handler = function() {
+					TR.util.multiselect.addFilterField(p, id, name, valueType);
+				}
+				
+				return params;
+			},
+			removeFieldBtn: function( p, id ){
+				var params = {};
+				params.xtype = 'button';
+				params.id = 'filter_rmv_' + id;	
+				params.text = "-";
+				params.tooltip = TR.i18n.add,
+				params.handler = function() {
+					var e1 = Ext.getCmp( 'filter_' + id );
+					var e2 = Ext.getCmp( 'filter_opt_' + id );	
+					var e3 = Ext.getCmp( 'filter_lb_' + id );
+					var e4 = Ext.getCmp( 'filter_rmv_' + id );
+					Ext.getCmp(p).remove(e1);
+					Ext.getCmp(p).remove(e2);
+					Ext.getCmp(p).remove(e3);
+					Ext.getCmp(p).remove(e4);
+				}
 				return params;
 			}
         },
@@ -1671,10 +1702,10 @@
 						return false;
 					}
 				
-					/* if (TR.state.orgunitIds.length == 0) {
+					if (TR.state.orgunitIds.length == 0) {
 						TR.util.notification.error(TR.i18n.et_no_orgunits, TR.i18n.em_no_orgunits);
 						return false;
-					} */
+					}
 					
 					if (Ext.getCmp('programStageCombobox').getValue() == '') {
 						TR.util.notification.error(TR.i18n.em_no_program_stage, TR.i18n.em_no_program_stage);
@@ -1844,37 +1875,31 @@
 				TR.cmp.params.dataelement.selected.store.each( function(r) {
 					var valueType = r.data.valueType;
 					var deId = r.data.id;
-					var filterOpt = Ext.getCmp('filter_opt_' + deId).rawValue;
-					var filterValue = Ext.getCmp('filter_' + deId).rawValue;
-					var filter = deId.split('_')[1] + "_" + filterOpt + '_';
-					
-					if( valueType == 'string' || valueType == 'trueOnly' 
-						|| valueType == 'bool' || valueType == 'list' )
-					{
-						var filterValues = filterValue.split(";");
-						filter +=" (";
-						for(var i=0;i<filterValues.length;i++)
-						{
-							filter += "'"+ filterValues[i] +"',";
-						}
-						filter = filter.substr(0,filter.length - 1) + " ) ";
-					}
-					else 
-					{
-						filter += filterValue;
-						
-						var deId = deId + '_1';
-						if( Ext.getCmp('filter_' + deId) != undefined
-							&& Ext.getCmp('filter_' + deId).rawValue != '' )
-						{
-							filterOpt = Ext.getCmp('filter_opt_' + deId).rawValue;
-							filterValue = Ext.getCmp('filter_' + deId).rawValue;
-							filter += "_" + filterOpt + "_" + filterValue;
-						}
-					
-					}
-					p.deFilters.push( filter );
-					
+					var length = Ext.getCmp('p_' + deId).items.length/4;
+					
+					for(var idx=0;idx<length;idx++)
+					{
+						var id = deId + '_' + idx;
+						var filterOpt = Ext.getCmp('filter_opt_' + id).rawValue;
+						var filterValue = Ext.getCmp('filter_' + id).rawValue;
+						var filter = deId.split('_')[1] + "_" + filterOpt + '_';
+					
+						if( valueType == 'list' )
+						{
+							var filterValues = filterValue.split(";");
+							filter +=" (";
+							for(var i=0;i<filterValues.length;i++)
+							{
+								filter += "'"+ filterValues[i] +"',";
+							}
+							filter = filter.substr(0,filter.length - 1) + " ) ";
+						}
+						else 
+						{
+							filter += "'" + filterValue + "'";
+						}
+						p.deFilters.push( filter );
+					}
 				});
 				
 				// Period range
@@ -2029,12 +2054,12 @@
 						return false;
 					}
 				
-					/* if (TR.state.orgunitIds.length == 0 
+					if (TR.state.orgunitIds.length == 0 
 						&& TR.cmp.aggregateFavorite.userorganisationunit.getValue() == 'false'
 						&& TR.cmp.aggregateFavorite.userorganisationunitchildren.getValue() == 'false' ) {
 						TR.util.notification.error(TR.i18n.et_no_orgunits, TR.i18n.em_no_orgunits);
 						return false;
-					}*/ 
+					}
 					
 					if (Ext.getCmp('programStageCombobox').getValue() == '') {
 						TR.util.notification.error(TR.i18n.em_no_program_stage, TR.i18n.em_no_program_stage);
@@ -2061,10 +2086,15 @@
 					
 					TR.cmp.params.dataelement.selected.store.each( function(r) {
 						var deId = r.data.id;
-						var filterValue = Ext.getCmp('filter_' + deId).getValue();
-						if( filterValue == null ){
-							TR.util.notification.error(TR.i18n.fill_filter_values_for_all_selected_data_elements, TR.i18n.fill_filter_values_for_all_selected_data_elements);
-							return false;
+						var length = Ext.getCmp('p_' + deId).items.length/4;
+						for(var idx=0;idx<length;idx++)
+						{
+							var id = deId + '_' + idx;
+							var filterValue = Ext.getCmp('filter_' + id).getValue();
+							if( filterValue == null ){
+								TR.util.notification.error(TR.i18n.fill_filter_values_for_all_selected_data_elements, TR.i18n.fill_filter_values_for_all_selected_data_elements);
+								return false;
+							}
 						}
 					});
 					
@@ -3874,7 +3904,7 @@
 																		Ext.getCmp('selectedDEBar').setVisible(false);
 																		Ext.getCmp('availableDataelements').setVisible(false);
 																		Ext.getCmp('selectedDataelements').setVisible(false);
-																		Ext.getCmp('filterPanel').setHeight(210);
+																		Ext.getCmp('filterPanel').setHeight(260);
 																		this.setIcon('images/arrowdown.png');
 																		this.up = false;
 																	}
@@ -3883,7 +3913,7 @@
 																		Ext.getCmp('selectedDEBar').setVisible(true);
 																		Ext.getCmp('availableDataelements').setVisible(true);
 																		Ext.getCmp('selectedDataelements').setVisible(true);
-																		Ext.getCmp('filterPanel').setHeight(65);
+																		Ext.getCmp('filterPanel').setHeight(110);
 																		this.setIcon('images/arrowup.png');
 																		this.up = true;
 																	}
@@ -3897,6 +3927,8 @@
 														id: 'filterPanel',
 														bodyStyle: 'background-color:transparent; padding:10px 10px 0px 3px',
 														autoScroll: true,
+														overflowX: 'hidden',
+														overflowY: 'auto',
 														height: 110,
 														width: (TR.conf.layout.west_fieldset_width - TR.conf.layout.west_width_subtractor) ,
 														items: []

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/i18n.vm'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/i18n.vm	2013-01-21 07:29:15 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/i18n.vm	2013-01-22 06:42:20 +0000
@@ -132,7 +132,7 @@
 orgunit: '$encoder.jsEscape($i18n.getString( 'orgunit' ) , "'")',
 data: '$encoder.jsEscape($i18n.getString( 'data' ) , "'")',
 select_data_element_for_grouping: '$encoder.jsEscape($i18n.getString( 'select_data_element_for_grouping' ) , "'")',
-enter_filter_value: '$encoder.jsEscape($i18n.getString( 'enter_filter_value' ) , "'")',
+filter_value: '$encoder.jsEscape($i18n.getString( 'filter_value' ) , "'")',
 add: '$encoder.jsEscape($i18n.getString( 'add' ) , "'")',
 xls: '$encoder.jsEscape($i18n.getString( 'xls' ) , "'")',
 pdf: '$encoder.jsEscape($i18n.getString( 'pdf' ) , "'")',