← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 10137: (PT) Favorites (wip).

 

Merge authors:
  Jan Henrik Øverland (janhenrik-overland)
------------------------------------------------------------
revno: 10137 [merge]
committer: Jan Henrik Overland <janhenrik.overland@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2013-03-11 16:15:22 +0100
message:
  (PT) Favorites (wip).
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java
  dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/reporttable/hibernate/ReportTable.hbm.xml
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/app.js
  dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js
  dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js
  dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/scripts/app.js


--
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/reporttable/ReportTable.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java	2013-03-10 12:38:39 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java	2013-03-11 14:11:16 +0000
@@ -303,6 +303,11 @@
      * Indicates rendering of sub-totals for the table.
      */
     private boolean subtotals;
+
+    /**
+     * Indicates rendering of empty rows for the table.
+     */
+    private boolean hideEmptyRows;
     
     /**
      * The display density of the text in the table.
@@ -1384,6 +1389,19 @@
     @JsonProperty
     @JsonView( {DetailedView.class, ExportView.class} )
     @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0)
+    public boolean isHideEmptyRows()
+    {
+        return hideEmptyRows;
+    }
+
+    public void setHideEmptyRows( boolean hideEmptyRows )
+    {
+        this.hideEmptyRows = hideEmptyRows;
+    }
+
+    @JsonProperty
+    @JsonView( {DetailedView.class, ExportView.class} )
+    @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0)
     public String getDisplayDensity()
     {
         return displayDensity;
@@ -1611,6 +1629,7 @@
             sortOrder = reportTable.getSortOrder() == null ? sortOrder : reportTable.getSortOrder();
             topLimit = reportTable.getTopLimit() == null ? topLimit : reportTable.getTopLimit();
             subtotals = reportTable.isSubtotals();
+            hideEmptyRows = reportTable.isHideEmptyRows();
             displayDensity = reportTable.getDisplayDensity();
             fontSize = reportTable.getFontSize();
             userOrganisationUnit = reportTable.isUserOrganisationUnit();

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java	2013-03-10 12:38:39 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java	2013-03-11 14:31:35 +0000
@@ -422,10 +422,11 @@
         executeSql( "update reporttable set last5financialyears = false where last5financialyears is null" );
         executeSql( "update reporttable set cumulative = false where cumulative is null" );
         executeSql( "update reporttable set subtotals = false where subtotals is null" );
-        executeSql( "update reporttable set userOrganisationUnit = false where userOrganisationUnit is null" );
-        executeSql( "update reporttable set userOrganisationUnitChildren = false where userOrganisationUnitChildren is null" );
+        executeSql( "update reporttable set userorganisationunit = false where userorganisationunit is null" );
+        executeSql( "update reporttable set userorganisationunitchildren = false where userorganisationunitchildren is null" );
         executeSql( "update reporttable set displaydensity = 'normal' where displaydensity is null" );
         executeSql( "update reporttable set fontsize = 'normal' where fontsize is null" );
+        executeSql( "update reporttable set hideemptyrows = false where hideemptyrows is null" );
 
         executeSql( "update chart set reportingmonth = false where reportingmonth is null" );
         executeSql( "update chart set reportingbimonth = false where reportingbimonth is null" );

=== modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/reporttable/hibernate/ReportTable.hbm.xml'
--- dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/reporttable/hibernate/ReportTable.hbm.xml	2013-02-27 16:14:56 +0000
+++ dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/reporttable/hibernate/ReportTable.hbm.xml	2013-03-11 14:11:16 +0000
@@ -136,9 +136,15 @@
     
     <property name="subtotals" />
     
+    <property name="hideEmptyRows" />
+    
     <property name="displayDensity" />
     
     <property name="fontSize" />
+    
+    <property name="userOrganisationUnit" />
+    
+    <property name="userOrganisationUnitChildren" />
 
     <!-- Access properties -->
     <many-to-one name="user" class="org.hisp.dhis.user.User" column="userid" foreign-key="fk_reporttable_userid" />

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/app.js'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/app.js	2013-02-07 07:45:56 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/app.js	2013-03-11 15:11:59 +0000
@@ -1714,7 +1714,7 @@
 				{
 					dataIndex: 'name',
 					sortable: false,
-					width: 334,
+					width: 340,
 					renderer: function(value, metaData, record) {
 						var fn = function() {
 							var el = Ext.get(record.data.id);
@@ -1974,6 +1974,7 @@
 			title: 'Manage favorites',
 			iconCls: 'gis-window-title-icon-favorite',
 			cls: 'gis-container-default',
+			bodyStyle: 'padding:5px',
 			resizable: false,
 			modal: true,
 			width: 450,

=== modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js	2013-03-08 16:25:52 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js	2013-03-11 15:11:59 +0000
@@ -28,6 +28,22 @@
 			init.rootNodes[i].path = '/' + pt.conf.finals.root.id + '/' + init.rootNodes[i].id;
 		}
 
+		// Ougs
+		for (var i = 0, dim = pt.conf.finals.dimension, oug; i < init.ougs.length; i++) {
+			oug = init.ougs[i];
+			oug.dimensionName = oug.id;
+			oug.objectName = pt.conf.finals.dimension.organisationUnitGroupSet.objectName;
+			dim.objectNameMap[oug.id] = oug;
+		}
+
+		// Degs
+		for (var i = 0, dim = pt.conf.finals.dimension, deg; i < init.degs.length; i++) {
+			deg = init.degs[i];
+			deg.dimensionName = deg.id;
+			deg.objectName = pt.conf.finals.dimension.dataElementGroupSet.objectName;
+			dim.objectNameMap[deg.id] = deg;
+		}
+
 		init.afterRender = function() {
 			pt.cmp.dimension.panels[0].expand();
 
@@ -81,6 +97,15 @@
 				else {
 					w.setPosition(targetx, y);
 				}
+			},
+			addBlurHandler: function(w) {
+				var el = Ext.get(document.getElementsByClassName('x-mask')[0]);
+
+				el.on('click', function() {
+					w.hide();
+				});
+
+				w.hasBlurHandler = true;
 			}
 		};
 
@@ -150,6 +175,9 @@
 
 			config.options = pt.viewport.optionsWindow.getOptions();
 
+			config.options.userOrganisationUnit = pt.viewport.userOrganisationUnit.getValue();
+			config.options.userOrganisationUnitChildren = pt.viewport.userOrganisationUnitChildren.getValue();
+
 			return config;
 		};
 
@@ -380,14 +408,14 @@
 			var data = [];
 
 			if (all) {
-				data.push({id: dimConf.data.dimensionName, name: dimConf.data.rawValue});
+				data.push({id: dimConf.data.dimensionName, name: dimConf.data.name});
 			}
 
-			data.push({id: dimConf.category.dimensionName, name: dimConf.category.rawValue});
+			data.push({id: dimConf.category.dimensionName, name: dimConf.category.name});
 
 			if (all) {
-				data.push({id: dimConf.period.dimensionName, name: dimConf.period.rawValue});
-				data.push({id: dimConf.organisationUnit.dimensionName, name: dimConf.organisationUnit.rawValue});
+				data.push({id: dimConf.period.dimensionName, name: dimConf.period.name});
+				data.push({id: dimConf.organisationUnit.dimensionName, name: dimConf.organisationUnit.name});
 			}
 
 			return data.concat(pt.init.ougs, pt.init.degs);
@@ -427,15 +455,15 @@
 
 		rowStore = getStore();
 		pt.viewport.rowStore = rowStore;
-		rowStore.add({id: dimConf.period.dimensionName, name: dimConf.period.rawValue}); //i18n
+		rowStore.add({id: dimConf.period.dimensionName, name: dimConf.period.name}); //i18n
 
 		colStore = getStore();
 		pt.viewport.colStore = colStore;
-		colStore.add({id: dimConf.data.dimensionName, name: dimConf.data.rawValue}); //i18n
+		colStore.add({id: dimConf.data.dimensionName, name: dimConf.data.name}); //i18n
 
 		filterStore = getStore();
 		pt.viewport.filterStore = filterStore;
-		filterStore.add({id: dimConf.organisationUnit.dimensionName, name: dimConf.organisationUnit.rawValue}); //i18n
+		filterStore.add({id: dimConf.organisationUnit.dimensionName, name: dimConf.organisationUnit.name}); //i18n
 
 		getCmpHeight = function() {
 			var size = dimensionStore.totalCount,
@@ -656,13 +684,7 @@
 					pt.util.window.setAnchorPosition(w, pt.viewport.layoutButton);
 
 					if (!w.hasBlurHandler) {
-						var el = Ext.get(document.getElementsByClassName('x-mask')[0]);
-
-						el.on('click', function() {
-							w.hide();
-						});
-
-						w.hasBlurHandler = true;
+						pt.util.window.addBlurHandler(w);
 					}
 				}
 			}
@@ -805,13 +827,7 @@
 					pt.util.window.setAnchorPosition(w, pt.viewport.optionsButton);
 
 					if (!w.hasBlurHandler) {
-						var el = Ext.get(document.getElementsByClassName('x-mask')[0]);
-
-						el.on('click', function() {
-							w.hide();
-						});
-
-						w.hasBlurHandler = true;
+						pt.util.window.addBlurHandler(w);
 					}
 				}
 			}
@@ -861,6 +877,9 @@
 			if (pt.xSettings) {
 				favorite = Ext.clone(pt.xSettings.options);
 
+				// server
+				favorite.subtotals = favorite.showSubTotals;
+
 				favorite.name = name;
 				favorite.user = system ? null : {id: 'currentUser'};
 
@@ -1079,7 +1098,7 @@
 		});
 
 		searchTextfield = Ext.create('Ext.form.field.Text', {
-			width: 340,
+			width: 350,
 			height: 26,
 			fieldStyle: 'padding-right: 0; padding-left: 6px; border-radius: 1px; border-color: #bbb; font-size:11px',
 			emptyText: 'Search for favorites', //i18n
@@ -1141,7 +1160,7 @@
 				{
 					dataIndex: 'name',
 					sortable: false,
-					width: 334,
+					width: 340,
 					renderer: function(value, metaData, record) {
 						var fn = function() {
 							var el = Ext.get(record.data.id);
@@ -1150,7 +1169,10 @@
 								el.addClsOnOver('link');
 								el.pt = pt;
 								el.favoriteId = record.data.id;
-								el.dom.setAttribute('onclick', 'Ext.get(this).pt.util.pivot.loadTable(Ext.get(this).favoriteId);');
+								el.hideWindow = function() {
+									favoriteWindow.hide();
+								};
+								el.dom.setAttribute('onclick', 'Ext.get(this).hideWindow(); Ext.get(this).pt.util.pivot.loadTable(Ext.get(this).favoriteId);');
 							}
 						};
 
@@ -1376,7 +1398,7 @@
 		favoriteWindow = Ext.create('Ext.window.Window', {
 			title: 'Manage favorites',
 			//iconCls: 'pt-window-title-icon-favorite',
-			bodyStyle: 'padding: 8px; background-color:#fff',
+			bodyStyle: 'padding: 5px; background-color:#fff',
 			resizable: false,
 			modal: true,
 			width: 450,
@@ -1384,14 +1406,13 @@
 				{
 					xtype: 'panel',
 					layout: 'hbox',
-					width: 422,
 					bodyStyle: 'border:0 none',
 					items: [
 						addButton,
 						{
 							height: 24,
 							width: 1,
-							style: 'width: 1px; margin-left: 7px; margin-right: 7px; margin-top: 1px',
+							style: 'width: 1px; margin-left: 5px; margin-right: 5px; margin-top: 1px',
 							bodyStyle: 'border-left: 1px solid #aaa'
 						},
 						searchTextfield
@@ -1402,6 +1423,10 @@
 			listeners: {
 				show: function(w) {
 					pt.util.window.setAnchorPosition(w, pt.viewport.favoriteButton);
+
+					if (!w.hasBlurHandler) {
+						pt.util.window.addBlurHandler(w);
+					}
 				}
 			}
 		});
@@ -1427,6 +1452,9 @@
 				fixedPeriodAvailable,
 				fixedPeriodSelected,
 				period,
+				userOrganisationUnit,
+				userOrganisationUnitChildren,
+				treePanel,
 				organisationUnit,
 				groupSetIdStoreMap,
 				getGroupSetPanels,
@@ -2141,24 +2169,24 @@
 										boxLabel: 'Last 5 years', //i18n pt.i18n.last_5_years
 									}
 								]
-							},
-							{
-								xtype: 'panel',
-								layout: 'anchor',
-								bodyStyle: 'border-style:none; padding:5px 0 0 46px',
-								defaults: {
-									labelSeparator: '',
-									style: 'margin-bottom:2px',
-								},
-								items: [
-									{
-										xtype: 'label',
-										text: 'Options',
-										cls: 'pt-label-period-heading-options'
-									},
-									rewind
-								]
 							}
+							//{
+								//xtype: 'panel',
+								//layout: 'anchor',
+								//bodyStyle: 'border-style:none; padding:5px 0 0 46px',
+								//defaults: {
+									//labelSeparator: '',
+									//style: 'margin-bottom:2px',
+								//},
+								//items: [
+									//{
+										//xtype: 'label',
+										//text: 'Options',
+										//cls: 'pt-label-period-heading-options'
+									//},
+									//rewind
+								//]
+							//}
 						]
 					}
 				]
@@ -2366,6 +2394,176 @@
 				}
 			};
 
+			treePanel = Ext.create('Ext.tree.Panel', {
+				cls: 'pt-tree',
+				style: 'border-top: 1px solid #ddd; padding-top: 1px',
+				width: pt.conf.layout.west_fieldset_width - pt.conf.layout.west_width_padding,
+				rootVisible: false,
+				autoScroll: true,
+				multiSelect: true,
+				rendered: false,
+				reset: function() {
+					var rootNode = this.getRootNode().findChild('id', pt.init.rootNodes[0].id);
+					this.collapseAll();
+					this.expandPath(rootNode.getPath());
+					this.getSelectionModel().select(rootNode);
+				},
+				selectRootIf: function() {
+					if (this.getSelectionModel().getSelection().length < 1) {
+						var node = this.getRootNode().findChild('id', pt.init.rootNodes[0].id);
+						if (this.rendered) {
+							this.getSelectionModel().select(node);
+						}
+						return node;
+					}
+				},
+				numberOfRecords: 0,
+				recordsToSelect: [],
+				multipleSelectIf: function() {
+					if (this.recordsToSelect.length === this.numberOfRecords) {
+						this.getSelectionModel().select(this.recordsToSelect);
+						this.recordsToSelect = [];
+						this.numberOfRecords = 0;
+					}
+				},
+				multipleExpand: function(id, path) {
+					this.expandPath('/' + pt.conf.finals.root.id + path, 'id', '/', function() {
+						var record = this.getRootNode().findChild('id', id, true);
+						this.recordsToSelect.push(record);
+						this.multipleSelectIf();
+					}, this);
+				},
+				select: function(url, params) {
+					if (!params) {
+						params = {};
+					}
+					Ext.Ajax.request({
+						url: url,
+						method: 'GET',
+						params: params,
+						scope: this,
+						success: function(r) {
+							var a = Ext.decode(r.responseText).organisationUnits;
+							this.numberOfRecords = a.length;
+							for (var i = 0; i < a.length; i++) {
+								this.multipleExpand(a[i].id, a[i].path);
+							}
+						}
+					});
+				},
+				selectByGroup: function(id) {
+					if (id) {
+						var url = pt.conf.finals.ajax.path_pivot + pt.conf.finals.ajax.organisationunit_getbygroup,
+							params = {id: id};
+						this.select(url, params);
+					}
+				},
+				selectByLevel: function(level) {
+					if (level) {
+						var url = pt.conf.finals.ajax.path_pivot + pt.conf.finals.ajax.organisationunit_getbylevel,
+							params = {level: level};
+						this.select(url, params);
+					}
+				},
+				selectByIds: function(ids) {
+					if (ids) {
+						var url = pt.conf.finals.ajax.path_pivot + pt.conf.finals.ajax.organisationunit_getbyids;
+						Ext.Array.each(ids, function(item) {
+							url = Ext.String.urlAppend(url, 'ids=' + item);
+						});
+						if (!this.rendered) {
+							pt.cmp.dimension.organisationUnit.panel.expand();
+						}
+						this.select(url);
+					}
+				},
+				store: Ext.create('Ext.data.TreeStore', {
+					proxy: {
+						type: 'ajax',
+						url: pt.conf.finals.ajax.path_pivot + pt.conf.finals.ajax.organisationunitchildren_get
+					},
+					root: {
+						id: pt.conf.finals.root.id,
+						expanded: true,
+						children: pt.init.rootNodes
+					},
+					listeners: {
+						load: function(s, node, r) {
+							for (var i = 0; i < r.length; i++) {
+								r[i].data.text = pt.conf.util.jsonEncodeString(r[i].data.text);
+							}
+						}
+					}
+				}),
+				xable: function(checked, value) {
+					if (checked || value) {
+						this.disable();
+					}
+					else {
+						this.enable();
+					}
+				},
+				listeners: {
+					added: function() {
+						pt.cmp.dimension.organisationUnit.treepanel = this;
+					},
+					render: function() {
+						this.rendered = true;
+					},
+					afterrender: function() {
+						this.getSelectionModel().select(0);
+					},
+					itemcontextmenu: function(v, r, h, i, e) {
+						v.getSelectionModel().select(r, false);
+
+						if (v.menu) {
+							v.menu.destroy();
+						}
+						v.menu = Ext.create('Ext.menu.Menu', {
+							id: 'treepanel-contextmenu',
+							showSeparator: false,
+							shadow: false
+						});
+						if (!r.data.leaf) {
+							v.menu.add({
+								id: 'treepanel-contextmenu-item',
+								text: 'Select all children', //i18n pt.i18n.select_all_children,
+								icon: 'images/node-select-child.png',
+								handler: function() {
+									r.expand(false, function() {
+										v.getSelectionModel().select(r.childNodes, true);
+										v.getSelectionModel().deselect(r);
+									});
+								}
+							});
+						}
+						else {
+							return;
+						}
+
+						v.menu.showAt(e.xy);
+					}
+				}
+			});
+
+			userOrganisationUnit = Ext.create('Ext.form.field.Checkbox', {
+				columnWidth: 0.5,
+				boxLabel: 'User organisation unit', //i18n pt.i18n.user_orgunit,
+				labelWidth: pt.conf.layout.form_label_width,
+				handler: function(chb, checked) {
+					treePanel.xable(checked, userOrganisationUnitChildren.getValue());
+				}
+			});
+
+			userOrganisationUnitChildren = Ext.create('Ext.form.field.Checkbox', {
+				columnWidth: 0.5,
+				boxLabel: 'User organisation unit children', //i18n pt.i18n.user_orgunit_children,
+				labelWidth: pt.conf.layout.form_label_width,
+				handler: function(chb, checked) {
+					treePanel.xable(checked, userOrganisationUnit.getValue());
+				}
+			});
+
 			organisationUnit = {
 				xtype: 'panel',
 				title: '<div class="pt-panel-title-organisationunit">Organisation units</div>', //i18n pt.i18n.organisation_units
@@ -2373,7 +2571,7 @@
 				hideCollapseTool: true,
 				collapsed: false,
 				getData: function() {
-					var records = pt.cmp.dimension.organisationUnit.treepanel.getSelectionModel().getSelection(),
+					var records = treePanel.getSelectionModel().getSelection(),
 						data = {
 							dimensionName: pt.conf.finals.dimension.organisationUnit.dimensionName,
 							objectName: pt.conf.finals.dimension.organisationUnit.objectName,
@@ -2388,279 +2586,18 @@
 				},
 				onExpand: function() {
 					pt.util.dimension.panel.setHeight(pt.conf.layout.west_maxheight_accordion_organisationunit);
-					pt.cmp.dimension.organisationUnit.treepanel.setHeight(this.getHeight() - pt.conf.layout.west_fill_accordion_organisationunit);
+					treePanel.setHeight(this.getHeight() - pt.conf.layout.west_fill_accordion_organisationunit);
 				},
 				items: [
 					{
 						layout: 'column',
 						bodyStyle: 'border:0 none; padding-bottom:3px; padding-left:7px',
 						items: [
-							{
-								xtype: 'checkbox',
-								columnWidth: 0.5,
-								boxLabel: 'User organisation unit', //i18n pt.i18n.user_orgunit,
-								labelWidth: pt.conf.layout.form_label_width,
-								handler: function(chb, checked) {
-									//pt.cmp.dimension.organisationUnit.toolbar.xable(checked, pt.cmp.favorite.userOrganisationUnitChildren.getValue());
-									pt.cmp.dimension.organisationUnit.treepanel.xable(checked, pt.cmp.favorite.userOrganisationUnitChildren.getValue());
-								},
-								listeners: {
-									added: function() {
-										pt.cmp.favorite.userOrganisationUnit = this;
-									}
-								}
-							},
-							{
-								xtype: 'checkbox',
-								columnWidth: 0.5,
-								boxLabel: 'User organisation unit children', //i18n pt.i18n.user_orgunit_children,
-								labelWidth: pt.conf.layout.form_label_width,
-								handler: function(chb, checked) {
-									//pt.cmp.dimension.organisationUnit.toolbar.xable(checked, pt.cmp.favorite.userOrganisationUnit.getValue());
-									pt.cmp.dimension.organisationUnit.treepanel.xable(checked, pt.cmp.favorite.userOrganisationUnit.getValue());
-								},
-								listeners: {
-									added: function() {
-										pt.cmp.favorite.userOrganisationUnitChildren = this;
-									}
-								}
-							}
+							userOrganisationUnit,
+							userOrganisationUnitChildren
 						]
 					},
-					//{
-						//id: 'organisationunit_t',
-						//xtype: 'toolbar',
-						//style: 'margin-bottom: 4px',
-						//width: pt.conf.layout.west_fieldset_width - pt.conf.layout.west_width_padding,
-						//xable: function(checked, value) {
-							//if (checked || value) {
-								//this.disable();
-							//}
-							//else {
-								//this.enable();
-							//}
-						//},
-						//defaults: {
-							//height: 22
-						//},
-						//items: [
-							//{
-								//xtype: 'label',
-								//text: 'Auto-select organisation units by', //i18n
-								//style: 'padding-left:8px; color:#666; line-height:23px'
-							//},
-							//'->',
-							//{
-								//text: 'Group..',
-								//handler: function() {},
-								//listeners: {
-									//added: function() {
-										//this.menu = Ext.create('Ext.menu.Menu', {
-											//shadow: false,
-											//showSeparator: false,
-											//width: pt.conf.layout.treepanel_toolbar_menu_width_group,
-											//items: [
-												//{
-													//xtype: 'grid',
-													//cls: 'pt-menugrid',
-													//width: pt.conf.layout.treepanel_toolbar_menu_width_group,
-													//scroll: 'vertical',
-													//columns: [
-														//{
-															//dataIndex: 'name',
-															//width: pt.conf.layout.treepanel_toolbar_menu_width_group,
-															//style: 'display:none'
-														//}
-													//],
-													//setHeightInMenu: function(store) {
-														//var h = store.getCount() * 24,
-															//sh = pt.util.viewport.getSize().y * 0.6;
-														//this.setHeight(h > sh ? sh : h);
-														//this.doLayout();
-														//this.up('menu').doLayout();
-													//},
-													//store: pt.store.group,
-													//listeners: {
-														//itemclick: function(g, r) {
-															//g.getSelectionModel().select([], false);
-															//this.up('menu').hide();
-															//pt.cmp.dimension.organisationUnit.treepanel.selectByGroup(r.data.id);
-														//}
-													//}
-												//}
-											//],
-											//listeners: {
-												//show: function() {
-													//var store = pt.store.group;
-
-													//if (!store.isLoaded) {
-														//store.load({scope: this, callback: function() {
-															//this.down('grid').setHeightInMenu(store);
-														//}});
-													//}
-													//else {
-														//this.down('grid').setHeightInMenu(store);
-													//}
-												//}
-											//}
-										//});
-									//}
-								//}
-							//}
-						//],
-						//listeners: {
-							//added: function() {
-								//pt.cmp.dimension.organisationUnit.toolbar = this;
-							//}
-						//}
-					//},
-					{
-						xtype: 'treepanel',
-						cls: 'pt-tree',
-						style: 'border-top: 1px solid #ddd; padding-top: 1px',
-						width: pt.conf.layout.west_fieldset_width - pt.conf.layout.west_width_padding,
-						rootVisible: false,
-						autoScroll: true,
-						multiSelect: true,
-						rendered: false,
-						selectRootIf: function() {
-							if (this.getSelectionModel().getSelection().length < 1) {
-								var node = this.getRootNode().findChild('id', pt.init.rootnodes[0].id, true);
-								if (this.rendered) {
-									this.getSelectionModel().select(node);
-								}
-								return node;
-							}
-						},
-						numberOfRecords: 0,
-						recordsToSelect: [],
-						multipleSelectIf: function() {
-							if (this.recordsToSelect.length === this.numberOfRecords) {
-								this.getSelectionModel().select(this.recordsToSelect);
-								this.recordsToSelect = [];
-								this.numberOfRecords = 0;
-							}
-						},
-						multipleExpand: function(id, path) {
-							this.expandPath('/' + pt.conf.finals.root.id + path, 'id', '/', function() {
-								var record = this.getRootNode().findChild('id', id, true);
-								this.recordsToSelect.push(record);
-								this.multipleSelectIf();
-							}, this);
-						},
-						select: function(url, params) {
-							if (!params) {
-								params = {};
-							}
-							Ext.Ajax.request({
-								url: url,
-								method: 'GET',
-								params: params,
-								scope: this,
-								success: function(r) {
-									var a = Ext.decode(r.responseText).organisationUnits;
-									this.numberOfRecords = a.length;
-									for (var i = 0; i < a.length; i++) {
-										this.multipleExpand(a[i].id, a[i].path);
-									}
-								}
-							});
-						},
-						selectByGroup: function(id) {
-							if (id) {
-								var url = pt.conf.finals.ajax.path_pivot + pt.conf.finals.ajax.organisationunit_getbygroup,
-									params = {id: id};
-								this.select(url, params);
-							}
-						},
-						selectByLevel: function(level) {
-							if (level) {
-								var url = pt.conf.finals.ajax.path_pivot + pt.conf.finals.ajax.organisationunit_getbylevel,
-									params = {level: level};
-								this.select(url, params);
-							}
-						},
-						selectByIds: function(ids) {
-							if (ids) {
-								var url = pt.conf.finals.ajax.path_pivot + pt.conf.finals.ajax.organisationunit_getbyids;
-								Ext.Array.each(ids, function(item) {
-									url = Ext.String.urlAppend(url, 'ids=' + item);
-								});
-								if (!this.rendered) {
-									pt.cmp.dimension.organisationUnit.panel.expand();
-								}
-								this.select(url);
-							}
-						},
-						store: Ext.create('Ext.data.TreeStore', {
-							proxy: {
-								type: 'ajax',
-								url: pt.conf.finals.ajax.path_pivot + pt.conf.finals.ajax.organisationunitchildren_get
-							},
-							root: {
-								id: pt.conf.finals.root.id,
-								expanded: true,
-								children: pt.init.rootNodes
-							},
-							listeners: {
-								load: function(s, node, r) {
-									for (var i = 0; i < r.length; i++) {
-										r[i].data.text = pt.conf.util.jsonEncodeString(r[i].data.text);
-									}
-								}
-							}
-						}),
-						xable: function(checked, value) {
-							if (checked || value) {
-								this.disable();
-							}
-							else {
-								this.enable();
-							}
-						},
-						listeners: {
-							added: function() {
-								pt.cmp.dimension.organisationUnit.treepanel = this;
-								organisationUnit.treePanel = this;
-							},
-							render: function() {
-								this.rendered = true;
-							},
-							afterrender: function() {
-								this.getSelectionModel().select(0);
-							},
-							itemcontextmenu: function(v, r, h, i, e) {
-								v.getSelectionModel().select(r, false);
-
-								if (v.menu) {
-									v.menu.destroy();
-								}
-								v.menu = Ext.create('Ext.menu.Menu', {
-									id: 'treepanel-contextmenu',
-									showSeparator: false,
-									shadow: false
-								});
-								if (!r.data.leaf) {
-									v.menu.add({
-										id: 'treepanel-contextmenu-item',
-										text: 'Select all children', //i18n pt.i18n.select_all_children,
-										icon: 'images/node-select-child.png',
-										handler: function() {
-											r.expand(false, function() {
-												v.getSelectionModel().select(r.childNodes, true);
-												v.getSelectionModel().deselect(r);
-											});
-										}
-									});
-								}
-								else {
-									return;
-								}
-
-								v.menu.showAt(e.xy);
-							}
-						}
-					}
+					treePanel
 				],
 				listeners: {
 					added: function() {
@@ -3141,26 +3078,26 @@
 			setFavorite = function(r) {
 
 				// Indicators
+				pt.store.indicatorSelected.removeAll();
 				if (Ext.isArray(r.indicators)) {
-					pt.store.indicatorSelected.removeAll();
 					pt.store.indicatorSelected.add(r.indicators);
 				}
 
 				// Data elements
+				pt.store.dataElementSelected.removeAll();
 				if (Ext.isArray(r.dataElements)) {
-					pt.store.dataElementSelected.removeAll();
 					pt.store.dataElementSelected.add(r.dataElements);
 				}
 
 				// Data sets
+				pt.store.dataSetSelected.removeAll();
 				if (Ext.isArray(r.dataSets)) {
-					pt.store.dataSetsSelected.removeAll();
-					pt.store.dataSetsSelected.add(r.dataSets);
+					pt.store.dataSetSelected.add(r.dataSets);
 				}
 
 				// Fixed periods
+				pt.store.fixedPeriodSelected.removeAll();
 				if (Ext.isArray(r.periods)) {
-					pt.store.fixedPeriodSelected.removeAll();
 					pt.store.fixedPeriodSelected.add(r.periods);
 				}
 
@@ -3181,12 +3118,20 @@
 
 				// Organisation units
 				if (Ext.isArray(r.organisationUnits) && Ext.isObject(r.parentGraphMap)) {
+					treePanel.numberOfRecords = pt.util.object.getLength(r.parentGraphMap);
+
 					for (var key in r.parentGraphMap) {
 						if (r.parentGraphMap.hasOwnProperty(key)) {
-							organisationUnit.treePanel.selectPath('/root' + r.parentGraphMap[key] + '/' + key);
+							treePanel.multipleExpand(key, r.parentGraphMap[key]);
 						}
 					}
 				}
+				else {
+					treePanel.reset();
+				}
+
+				userOrganisationUnit.setValue(r.userOrganisationUnit);
+				userOrganisationUnitChildren.setValue(r.userOrganisationUnitChildren);
 
 				// Organisation unit group sets
 				if (Ext.isObject(r.organisationUnitGroupSets)) {
@@ -3219,7 +3164,7 @@
 						dim = pt.conf.finals.dimension.objectNameMap[r.columnDimensions[i]];
 						pt.viewport.colStore.add({
 							id: dim.dimensionName,
-							name: dim.rawValue
+							name: dim.name
 						});
 					}
 				}
@@ -3229,7 +3174,7 @@
 						dim = pt.conf.finals.dimension.objectNameMap[r.rowDimensions[i]];
 						pt.viewport.rowStore.add({
 							id: dim.dimensionName,
-							name: dim.rawValue
+							name: dim.name
 						});
 					}
 				}
@@ -3239,16 +3184,16 @@
 						dim = pt.conf.finals.dimension.objectNameMap[r.filterDimensions[i]];
 						pt.viewport.filterStore.add({
 							id: dim.dimensionName,
-							name: dim.rawValue
+							name: dim.name
 						});
 					}
 				}
 
 				// Options
-				pt.viewport.showSubTotals.setValue(!!r.subtotals);
-				pt.viewport.hideEmptyRows.setValue(!!r.hideEmptyRows);
-				pt.viewport.displayDensity.setValue(!!r.displayDensity);
-				pt.viewport.fontSize.setValue(!!r.fontSize);
+				pt.viewport.showSubTotals.setValue(r.subtotals);
+				pt.viewport.hideEmptyRows.setValue(r.hideEmptyRows);
+				pt.viewport.displayDensity.setValue(r.displayDensity);
+				pt.viewport.fontSize.setValue(r.fontSize);
 
 				update();
 			};
@@ -3262,6 +3207,8 @@
 				optionsButton: optionsButton,
 				favoriteButton: favoriteButton,
 				downloadButton: downloadButton,
+				userOrganisationUnit: userOrganisationUnit,
+				userOrganisationUnitChildren: userOrganisationUnitChildren,
 				setFavorite: setFavorite,
 				groupSetIdStoreMap: groupSetIdStoreMap,
 				items: [

=== modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js	2013-03-10 16:59:38 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js	2013-03-11 15:05:14 +0000
@@ -43,7 +43,7 @@
         dimension: {
             data: {
                 value: 'data',
-                rawValue: 'Data', //i18n PT.i18n.data,
+                name: 'Data', //i18n PT.i18n.data,
                 dimensionName: 'dx',
                 objectName: 'dx',
                 warning: {
@@ -51,31 +51,31 @@
 				}
             },
             category: {
-				rawValue: 'Categories',
+				name: 'Categories',
 				dimensionName: 'co',
                 objectName: 'co',
 			},
             indicator: {
                 value: 'indicators',
-                rawValue: 'Indicators', //i18n PT.i18n.indicator,
+                name: 'Indicators', //i18n PT.i18n.indicator,
                 dimensionName: 'dx',
                 objectName: 'in'
             },
             dataElement: {
                 value: 'dataElements',
-                rawValue: 'Data elements', //i18n PT.i18n.data_element,
+                name: 'Data elements', //i18n PT.i18n.data_element,
                 dimensionName: 'dx',
                 objectName: 'de'
             },
             dataSet: {
 				value: 'dataSets',
-                rawValue: 'Data sets', //i18n PT.i18n.dataset,
+                name: 'Data sets', //i18n PT.i18n.dataset,
                 dimensionName: 'dx',
                 objectName: 'ds'
 			},
             period: {
                 value: 'period',
-                rawValue: 'Periods', //i18n PT.i18n.period,
+                name: 'Periods', //i18n PT.i18n.period,
                 dimensionName: 'pe',
                 objectName: 'pe',
                 warning: {
@@ -90,9 +90,11 @@
 			},
             organisationUnit: {
                 value: 'organisationUnits',
-                rawValue: 'Organisation units', //i18n PT.i18n.organisation_unit,
+                name: 'Organisation units', //i18n PT.i18n.organisation_unit,
                 dimensionName: 'ou',
                 objectName: 'ou',
+                userOrganisationUnit: 'USER_ORGUNIT',
+                userOrganisationUnitChildren: 'USER_ORGUNIT_CHILDREN',
                 warning: {
 					filter: '...'//PT.i18n.wm_multiple_filter_orgunit
 				}
@@ -121,6 +123,7 @@
 	dim.objectNameMap[dim.indicator.objectName] = dim.indicator;
 	dim.objectNameMap[dim.dataElement.objectName] = dim.dataElement;
 	dim.objectNameMap[dim.dataSet.objectName] = dim.dataSet;
+	dim.objectNameMap[dim.category.objectName] = dim.category;
 	dim.objectNameMap[dim.period.objectName] = dim.period;
 	dim.objectNameMap[dim.organisationUnit.objectName] = dim.organisationUnit;
 	dim.objectNameMap[dim.organisationUnitGroupSet.objectName] = dim.organisationUnitGroupSet;
@@ -185,7 +188,7 @@
         west_fill_accordion_indicator: 63,
         west_fill_accordion_dataelement: 63,
         west_fill_accordion_dataset: 33,
-        west_fill_accordion_period: 256,
+        west_fill_accordion_period: 240,
         west_fill_accordion_organisationunit: 62,
         west_maxheight_accordion_indicator: 400,
         west_maxheight_accordion_dataelement: 400,
@@ -490,8 +493,15 @@
 		},
 
 		roundIf: function(x, fix) {
-			var dec = pt.util.number.getNumberOfDecimals(x);
-			return parseFloat(dec > fix ? x.toFixed(fix) : x);
+			if (Ext.isString(x)) {
+				x = parseFloat(x);
+			}
+
+			if (Ext.isNumber(x) && Ext.isNumber(fix)) {
+				var dec = pt.util.number.getNumberOfDecimals(x);
+				return parseFloat(dec > fix ? x.toFixed(fix) : x);
+			}
+			return x;
 		},
 
 		pp: function(x) {

=== modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js	2013-03-08 16:25:52 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js	2013-03-11 13:53:25 +0000
@@ -13,9 +13,12 @@
 		{name: 'ou', items: ['ImspTQPwCqd']}
 	],
 	options: {
-		showSubTotals: false,
+		showSubTotals: true,
+		hideEmptyRows: false,
 		displayDensity: 'normal',
-		fontSize: 'normal'
+		fontSize: 'normal',
+		userOrganisationUnit: true,
+		userOrganisationUnitChildren: false
 	}
 };
 

=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/scripts/app.js'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/scripts/app.js	2013-03-06 18:50:22 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/scripts/app.js	2013-03-11 13:05:31 +0000
@@ -3930,10 +3930,7 @@
 														items: [
 															{
 																xtype: 'checkbox',
-																//style: 'margin-right:6px',
-																//columnWidth: 0.5,
 																boxLabel: DV.i18n.show_data,
-																//labelWidth: DV.conf.layout.form_label_width,
 																listeners: {
 																	added: function() {
 																		DV.cmp.favorite.showdata = this;
@@ -3942,10 +3939,7 @@
 															},
 															{
 																xtype: 'checkbox',
-																//style: 'margin-right:6px',
-																//columnWidth: 0.5,
 																boxLabel: DV.i18n.trend_line,
-																//labelWidth: DV.conf.layout.form_label_width,
 																listeners: {
 																	added: function() {
 																		DV.cmp.favorite.trendline = this;
@@ -3961,9 +3955,7 @@
 														items: [
 															{
 																xtype: 'checkbox',
-																//width: ((DV.conf.layout.west_fieldset_width - DV.conf.layout.west_width_padding) / 2) - 3,
 																boxLabel: DV.i18n.hide_legend,
-																//labelWidth: DV.conf.layout.form_label_width,
 																listeners: {
 																	added: function() {
 																		DV.cmp.favorite.hidelegend = this;
@@ -3972,9 +3964,7 @@
 															},
 															{
 																xtype: 'checkbox',
-																//width: ((DV.conf.layout.west_fieldset_width - DV.conf.layout.west_width_padding) / 2) - 1,
 																boxLabel: DV.i18n.hide_subtitle,
-																//labelWidth: DV.conf.layout.form_label_width,
 																listeners: {
 																	added: function() {
 																		DV.cmp.favorite.hidesubtitle = this;