← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 19264: Program indicator add/edit screen. Included filter.

 

Merge authors:
  Lars Helge Øverland (larshelge)
------------------------------------------------------------
revno: 19264 [merge]
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2015-06-02 20:23:24 +0200
message:
  Program indicator add/edit screen. Included filter.
modified:
  dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/programindicator/GetProgramIndicatorAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addProgramIndicator.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/programIndicator.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/programIndicatorForm.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramIndicator.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-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css'
--- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css	2015-06-02 12:31:34 +0000
+++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css	2015-06-02 18:23:24 +0000
@@ -906,7 +906,7 @@
 
 .message 
 {
-    border: 1px solid #ccc;
+    border: 1px solid #ddd;
     border-radius: 3px;
     width: 450px;
     padding: 9px;

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/programindicator/GetProgramIndicatorAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/programindicator/GetProgramIndicatorAction.java	2015-03-29 20:22:47 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/programindicator/GetProgramIndicatorAction.java	2015-06-02 18:23:24 +0000
@@ -86,6 +86,13 @@
     {
         return description;
     }
+    
+    private String filter;
+    
+    public String getFilter()
+    {
+        return filter;
+    }
 
     private List<Constant> constants;
 
@@ -105,6 +112,8 @@
         programIndicator = programIndicatorService.getProgramIndicator( id );
 
         description = programIndicatorService.getExpressionDescription( programIndicator.getExpression() );
+        
+        filter = programIndicatorService.getExpressionDescription( programIndicator.getFilter() );
 
         constants = new ArrayList<>( constantService.getAllConstants() );
         

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties	2015-06-02 12:18:46 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties	2015-06-02 18:23:24 +0000
@@ -547,4 +547,7 @@
 hide_section = Hide section
 template_reminder_message_management=Template reminder message management
 expression_description=Expression description
-expression_items=Expression items
\ No newline at end of file
+expression_items=Expression items
+filter_items=Filter items
+filter_description=Filter description
+select_program_stage=Select program stage
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addProgramIndicator.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addProgramIndicator.vm	2015-02-16 11:46:32 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addProgramIndicator.vm	2015-06-02 18:23:24 +0000
@@ -73,18 +73,6 @@
 			</td>
 			<td></td>
 		</tr>
-		<tr>
-			<td><label for="programStageId">$i18n.getString( "program_stage" ) </label></td>
-			<td>
-				<select id="programStageId" name="programStageId" onChange="getTrackedEntityDataElements();">
-					<option value=''>[$i18n.getString('please_select')]</option>
-					#foreach( $programStage in $program.programStages )
-					<option value='$programStage.uid'>$programStage.displayName</option>
-					#end
-				</select>
-			</td>
-			<td></td>
-		</tr>		
 </table>
 <br>
 

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/programIndicator.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/programIndicator.js	2015-06-02 15:46:55 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/programIndicator.js	2015-06-02 18:23:24 +0000
@@ -57,9 +57,9 @@
     }	    
 }
 
-function getTrackedEntityDataElements() {
-  clearListById('dataElements');
-  clearListById('deSumId');
+function getTrackedEntityDataElements( type ) {
+  var fieldId = type + '-data-elements';
+  clearListById(fieldId);
   var programStageId = getFieldValue('programStageId');
 
   jQuery.getJSON('getTrackedEntityDataElements.action',
@@ -68,7 +68,7 @@
       programStageId: programStageId
     }
     , function( json ) {
-      var dataElements = jQuery('#dataElements');
+      var dataElements = jQuery('#' + fieldId);
       for( i in json.dataElements ) {
         if( json.dataElements[i].type == 'int' || json.dataElements[i].type == 'date' ) {
           dataElements.append("<option value='" + json.dataElements[i].id + "' title='" + json.dataElements[i].name + "' suggested='" + json.dataElements[i].optionset + "'>" + json.dataElements[i].name + "</option>");
@@ -77,45 +77,55 @@
     });
 }
 
-function insertDataElement( element ) {
-  var programStageId = getFieldValue('programStageId');
-  var dataElementId = element.options[element.selectedIndex].value;
-
-  insertTextCommon('expression', "#{" + programStageId + "." + dataElementId + "}");
-  getConditionDescription();
-}
-
-function insertData( element, key ){
-   var attributeId = element.options[element.selectedIndex].value;
-
-  insertTextCommon('expression', key + "{" + attributeId + "}");
-  getConditionDescription();
-}
-
-function insertInfo( element, isProgramStageProperty ) {
-  var id = "";
-  if( isProgramStageProperty ) {
-    id = getFieldValue('programStageId');
-  }
-  else {
-    id = getFieldValue('programId');
-  }
-
-  value = element.options[element.selectedIndex].value.replace('*', id);
-  insertTextCommon('expression', value);
-  getConditionDescription();
-}
-
-function insertOperator( value ) {
-  insertTextCommon('expression', ' ' + value + ' ');
+function insertDataElement( type ) {
+  var psFieldId = type + '-program-stage',
+      deFieldId = type + '-data-elements',
+      areaId = type,
+      programStageId = getFieldValue(psFieldId),
+      dataElementId = getFieldValue(deFieldId);
+
+  insertTextCommon(areaId, "#{" + programStageId + "." + dataElementId + "}");
+  getConditionDescription();
+}
+
+function insertAttribute( type ){
+  var atFieldId = type + '-attributes',
+      areaId = type,
+      attributeId = getFieldValue(atFieldId);
+
+  insertTextCommon(areaId, "A{" + attributeId + "}");
+  getConditionDescription();
+}
+
+function insertVariable( type ){
+  var varFieldId = type + '-variables',
+      areaId = type,
+      variableId = getFieldValue(varFieldId);
+
+  insertTextCommon(areaId, "V{" + variableId + "}");
+  getConditionDescription();
+}
+
+function insertConstant( type ){
+  var coFieldId = type + '-constants',
+      areaId = type,
+      constantId = getFieldValue(coFieldId);
+
+  insertTextCommon(areaId, "C{" + constantId + "}");
+  getConditionDescription();
+}
+
+function insertOperator( type, value ) {
+  insertTextCommon(type, ' ' + value + ' ');
   getConditionDescription();
 }
 
 function getConditionDescription() {
 	var expression = getFieldValue('expression');
+	
 	if( expression == '' )
 	{
-		setInnerHTML('aggregationDescription', '');
+		setInnerHTML('expression-description', '');
 	}
 	else
 	{
@@ -124,11 +134,11 @@
 		}, function( json ) {
 			if( json.valid ){
 				setFieldValue('checkExpression', json.message);
-				setInnerHTML('aggregationDescription', json.description);
+				setInnerHTML('expression-description', json.description);
 			}
 			else {
 				setFieldValue('checkExpression','');
-				setInnerHTML('aggregationDescription', json.message);
+				setInnerHTML('expression-description', json.message);
 			}
 		});
 	}

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/programIndicatorForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/programIndicatorForm.vm	2015-06-02 15:46:55 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/programIndicatorForm.vm	2015-06-02 18:23:24 +0000
@@ -1,7 +1,12 @@
-<table>
+<!-- Expression -->
+
+<table style="margin-top:10px">
+	<tr>
+		<td><div class="message message-info">The expression defines how the indicator is calculated</div></td> 
+	</tr>
 	<tr>
 		<th>$i18n.getString( "expression_items" )</th>
-	</tr>	
+	</tr>
 	<tr>
 		<td>
 	
@@ -19,13 +24,20 @@
 			  <table style="width:100%">
 		        <tr>
 					<td>
-						<input type='text' id='txtSearchValue' name='txtSearchValue' onKeyUp="filterExpressionSelect(event, this.value, 'dataElements');" placeholder="$i18n.getString('filter')" />
-						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('txtSearchValue', '');" />			
+						<select id="expression-program-stage" onChange="getTrackedEntityDataElements('expression');" style="width:35%;margin-right:20px;">
+							<option value=''>[ $i18n.getString('select_program_stage') ]</option>
+							#foreach( $programStage in $program.programStages )
+							<option value='$programStage.uid'>$programStage.displayName</option>
+							#end
+						</select>
+						<input type='text' id='expression-de-search' onKeyUp="filterExpressionSelect(event, this.value, 'expression-data-elements');" placeholder="$i18n.getString('filter')" />
+						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('expression-de-search', '');" />
+						
 					</td>
 		        </tr>
 		        <tr>
 					<td>
-						<select multiple id="dataElements" name="dataElements" size="7" style="width:100%" ondblclick="insertDataElement(this);"></select>
+						<select multiple id="expression-data-elements" name="expression-data-elements" size="7" style="width:100%" ondblclick="insertDataElement('expression');"></select>
 					</td>
 				</tr>
 		      </table>
@@ -37,13 +49,13 @@
 				<table style="width:100%">
 		        <tr>
 					<td>
-						<input type='text' id='txtSearchAttrValue' name='txtSearchAttrValue' onKeyUp="filterExpressionSelect(event, this.value, 'attributes');" placeholder="$i18n.getString('filter')" />
-						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('txtSearchAttrValue', '');" />			
+						<input type='text' id='expression-attr-search' onKeyUp="filterExpressionSelect(event, this.value, 'expression-attributes');" placeholder="$i18n.getString('filter')" />
+						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('expression-attr-search', '');" />			
 					</td>
 		        </tr>
 		        <tr>
 					<td>
-						<select multiple id="attributes" name="attributes" size="7" style="width:100%" ondblclick="insertData(this,'A');">
+						<select multiple id="expression-attributes" name="expression-attributes" size="7" style="width:100%" ondblclick="insertAttribute(this,'A');">
 							#foreach( $programAttribute in $program.programAttributes )
 								#if( $programAttribute.attribute.valueType=='number' )
 									<option value='$programAttribute.attribute.uid'>$encoder.htmlEncode($programAttribute.attribute.displayName)</option>
@@ -59,18 +71,18 @@
 				<table style="width:100%">
 				  <tr>
 				    <td>
-					  <input type='text' id='txtSearchPropertyValue' name='txtSearchValue' onKeyUp="filterExpressionSelect(event, this.value, 'programProperty');" placeholder="$i18n.getString('filter')" />
-					  <input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('txtSearchPropertyValue', '');" />			
+					  <input type='text' id='expression-var-search' onKeyUp="filterExpressionSelect(event, this.value, 'expression-variables');" placeholder="$i18n.getString('filter')" />
+					  <input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('expression-var-search', '');" />			
 					</td>
 		        </tr>
 				<tr>
 					<td>
-						<select multiple id="programProperty" name="programProperty" size="7" style="width:100%" ondblclick="insertInfo(this, false);" >
-							<option value="V{incident_date}">$i18n.getString( "incident_date" )</option>
-							<option value="V{enrollment_date}">$i18n.getString( "date_of_enrollment" )</option>
-							<option value="V{current_date}">$i18n.getString( "current_date" )</option>
-							<option value="V{value_count}">$i18n.getString( "value_count" )</option>
-							<option value="V{zero_pos_value_count}">$i18n.getString( "zero_pos_value_count" )</option>
+						<select multiple id="expression-variables" name="expression-variables" size="7" style="width:100%" ondblclick="insertVariable('expression');" >
+							<option value="incident_date">$i18n.getString( "incident_date" )</option>
+							<option value="enrollment_date">$i18n.getString( "date_of_enrollment" )</option>
+							<option value="current_date">$i18n.getString( "current_date" )</option>
+							<option value="value_count">$i18n.getString( "value_count" )</option>
+							<option value="zero_pos_value_count">$i18n.getString( "zero_pos_value_count" )</option>
 						</select>
 					</td>
 				</tr>
@@ -83,13 +95,13 @@
 				<table style="width:100%">
 		        <tr>
 					<td>
-						<input type='text' id='txtSearchContsValue' name='txtSearchAttrValue' onKeyUp="filterExpressionSelect(event, this.value, 'constants');" placeholder="$i18n.getString('filter')" />
-						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('txtSearchContsValue', '');" />			
+						<input type='text' id='expression-const-search' onKeyUp="filterExpressionSelect(event, this.value, 'expression-constants');" placeholder="$i18n.getString('filter')" />
+						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('expression-const-search', '');" />			
 					</td>
 		        </tr>
 		        <tr>
 					<td>
-						<select multiple id="constants" name="constants" size="7" style="width:100%" ondblclick="insertData(this,'C');">
+						<select multiple id="expression-constants" name="expression-constants" size="7" style="width:100%" ondblclick="insertConstant('expression');">
 							#foreach( $constant in $constants )
 								<option value='$constant.uid'>$encoder.htmlEncode($constant.displayName)</option>
 							#end
@@ -112,13 +124,13 @@
 		</td>
 	</tr>	
 	<tr>
-		<td>
-			<a class="greyButtonLink" href="javascript:insertOperator( '(' )" title="$i18n.getString( 'left_brackets' )">&#40;</a>
-			<a class="greyButtonLink" href="javascript:insertOperator( ')' )" title="$i18n.getString( 'right_brackets' )">&#41;</a>
-			<a class="greyButtonLink" href="javascript:insertOperator( '*' )" title="$i18n.getString( 'multiply' )">&#42;</a>
-			<a class="greyButtonLink" href="javascript:insertOperator( '/' )" title="$i18n.getString( 'divide' )">&#47;</a>
-			<a class="greyButtonLink" href="javascript:insertOperator( '+' )" title="$i18n.getString( 'plus' )">&#43;</a>
-			<a class="greyButtonLink" href="javascript:insertOperator( '-' )" title="$i18n.getString( 'minus' )">&#45;</a><br><br>
+		<td style="padding-top:4px">
+			<a class="greyButtonLink" href="javascript:insertOperator( 'expression', '(' )" title="$i18n.getString( 'left_brackets' )">&#40;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'expression', ')' )" title="$i18n.getString( 'right_brackets' )">&#41;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'expression', '*' )" title="$i18n.getString( 'multiply' )">&#42;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'expression', '/' )" title="$i18n.getString( 'divide' )">&#47;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'expression', '+' )" title="$i18n.getString( 'plus' )">&#43;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'expression', '-' )" title="$i18n.getString( 'minus' )">&#45;</a><br><br>
 		</td>
 	</tr>	
 	<tr>
@@ -126,12 +138,135 @@
     </tr>	
 	<tr>
 		<td>
-			<div id='aggregationDescription' style="padding: 5px 0 20px 0">$!encoder.htmlEncode($!description)</div>			
-			<input type="hidden" id="checkExpression" name="checkExpression" title="$i18n.getString('expression_is_not_well_formed')" class="{validate:{required:true}}"  />
-		</td>
-	</tr>
-</table>		
+			<div id='expression-description' style="padding: 5px 0 20px 0">$!encoder.htmlEncode($!description)</div>			
+			<input type="hidden" id="checkExpression" name="checkExpression" title="$i18n.getString('expression_is_not_well_formed')" class="{validate:{required:true}}"  />
+		</td>
+	</tr>
+</table>
+
+<!-- Filter -->
+
+<table style="margin-top:30px">
+	<tr>
+		<td><div class="message message-info">The filter is applied to events and filters the data source used for the calculation</div></td> 
+	</tr>
+	<tr>
+		<th>$i18n.getString( "filter_items" )</th>
+	</tr>	
+	<tr>
+		<td>
+	
+		<div id="filter-tabs" style="width:670px; margin: 1px 0;">
+			<ul>
+				<li><a href="#filter-tab1">$i18n.getString("data_elements")</a></li>
+				#if($program.type!='3')
+					<li><a href="#filter-tab2">$i18n.getString("attributes")</a></li>
+				#end
+				<li><a href="#filter-tab4">$i18n.getString("constants")</a></li>
+			</ul>	
+			
+			<div id="filter-tab1">
+			  <table style="width:100%">
+		        <tr>
+					<td>
+						<select id="filter-program-stage" onChange="getTrackedEntityDataElements('filter');" style="width:35%;margin-right:20px;">
+							<option value=''>[ $i18n.getString('select_program_stage') ]</option>
+							#foreach( $programStage in $program.programStages )
+							<option value='$programStage.uid'>$programStage.displayName</option>
+							#end
+						</select>
+						<input type='text' id='filter-de-search' onKeyUp="filterExpressionSelect(event, this.value, 'filter-data-elements');" placeholder="$i18n.getString('filter')" />
+						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('filter-de-search', '');" />			
+					</td>
+		        </tr>
+		        <tr>
+					<td>
+						<select multiple id="filter-data-elements" name="filter-data-elements" size="7" style="width:100%" ondblclick="insertDataElement('filter');"></select>
+					</td>
+				</tr>
+		      </table>
+			</div>
+			
+		#if($program.type!='3')
+		
+			<div id="filter-tab2">
+				<table style="width:100%">
+		        <tr>
+					<td>
+						<input type='text' id='filter-attr-search' onKeyUp="filterExpressionSelect(event, this.value, 'filter-attributes');" placeholder="$i18n.getString('filter')" />
+						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('filter-attr-search', '');" />			
+					</td>
+		        </tr>
+		        <tr>
+					<td>
+						<select multiple id="filter-attributes" name="filter-attributes" size="7" style="width:100%" ondblclick="insertAttribute('filter');">
+							#foreach( $programAttribute in $program.programAttributes )
+								#if( $programAttribute.attribute.valueType=='number' )
+									<option value='$programAttribute.attribute.uid'>$encoder.htmlEncode($programAttribute.attribute.displayName)</option>
+								#end
+							#end
+						</select>
+					</td>
+				</tr>
+		      </table>
+			</div>
+						
+		#end
+		
+			<div id="filter-tab4">
+				<table style="width:100%">
+		        <tr>
+					<td>
+						<input type='text' id='filter-const-search' onKeyUp="filterExpressionSelect(event, this.value, 'filter-constants');" placeholder="$i18n.getString('filter')" />
+						<input type='button' value='$i18n.getString("clear")' onClick="setFieldValue('filter-const-search', '');" />			
+					</td>
+		        </tr>
+		        <tr>
+					<td>
+						<select multiple id="filter-constants" name="filter-constants" size="7" style="width:100%" ondblclick="insertConstant('filter')">
+							#foreach( $constant in $constants )
+								<option value='$constant.uid'>$encoder.htmlEncode($constant.displayName)</option>
+							#end
+						</select>
+					</td>
+				</tr>
+		      </table>
+			</div>
+			
+		</div>
+		
+		</td>
+	</tr>
+	<tr>
+        <th style="padding-top:15px">$i18n.getString( "filter" ) <span class="tipText">Tip: use abs(x) sin(x) cos(x) tan(x) ln(x) log(x) sqrt(x) mod(x,y) oizp(x) zing(x)</span></th>
+    </tr>	
+	<tr>
+		<td>
+			<textarea style="width:665px" id="filter" name="filter" onkeyup='getConditionDescription();' >$!encoder.htmlEncode($!programIndicator.filter)</textarea>
+		</td>
+	</tr>	
+	<tr>
+		<td style="padding-top:4px">
+			<a class="greyButtonLink" href="javascript:insertOperator( 'filter', '(' )" title="$i18n.getString( 'left_brackets' )">&#40;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'filter', ')' )" title="$i18n.getString( 'right_brackets' )">&#41;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'filter', '*' )" title="$i18n.getString( 'multiply' )">&#42;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'filter', '/' )" title="$i18n.getString( 'divide' )">&#47;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'filter', '+' )" title="$i18n.getString( 'plus' )">&#43;</a>
+			<a class="greyButtonLink" href="javascript:insertOperator( 'filter', '-' )" title="$i18n.getString( 'minus' )">&#45;</a><br><br>
+		</td>
+	</tr>	
+	<tr>
+        <th style="padding-top:4px">$i18n.getString( "filter_description" )</th>
+    </tr>	
+	<tr>
+		<td>
+			<div id='filter-description' style="padding: 5px 0 20px 0">$!encoder.htmlEncode($!description)</div>			
+			<input type="hidden" id="checkExpression" name="checkExpression" title="$i18n.getString('expression_is_not_well_formed')" class="{validate:{required:true}}"  />
+		</td>
+	</tr>
+</table>
 
 <script type="text/javascript">
 	$('#expression-tabs').tabs();
+	$('#filter-tabs').tabs();
 </script>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramIndicator.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramIndicator.vm	2015-03-31 16:25:10 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramIndicator.vm	2015-06-02 18:23:24 +0000
@@ -77,18 +77,6 @@
 		</td>
 		<td></td>
 	</tr>
-	<tr>
-			<td><label for="programStageId">$i18n.getString( "program_stage" ) </label></td>
-			<td>
-				<select id="programStageId" name="programStageId" onChange="getTrackedEntityDataElements();">
-					<option value=''>[$i18n.getString('please_select')]</option>
-					#foreach( $programStage in $programIndicator.program.programStages )
-					<option value='$programStage.uid'>$encoder.htmlEncode($programStage.displayName)</option>
-					#end
-				</select>
-			</td>
-			<td></td>
-		</tr>
 </table>
 <br>