← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 19710: PT item sorting + configurable user orgunits.

 

------------------------------------------------------------
revno: 19710
committer: Jan Henrik Overland <janhenrik.overland@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2015-08-04 15:19:54 +0200
message:
  PT item sorting + configurable user orgunits.
modified:
  dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/plugin.html
  dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/app.js
  dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/core.js
  dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/table.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-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/plugin.html'
--- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/plugin.html	2015-07-14 21:26:33 +0000
+++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/plugin.html	2015-08-04 13:19:54 +0000
@@ -18,13 +18,13 @@
 		Ext.onReady(function() {
 			var url = 'http://localhost:8080';
 
-			DHIS.getTable({
-				url: url,
-				el: 'table1',
-				uid: 'VkJmOoCE4xu',
-                showDimensionLabels: true,
-                displayDensity: 'compact'
-			});
+			//DHIS.getTable({
+				//url: url,
+				//el: 'table1',
+				//uid: 'VkJmOoCE4xu',
+                //showDimensionLabels: true,
+                //displayDensity: 'compact'
+			//});
 
 			DHIS.getTable({
 				url: url,
@@ -33,17 +33,16 @@
 					{dimension: 'pe', items: [{id: 'LAST_3_MONTHS'}]}
 				],
 				rows: [
-					{dimension: 'ou', items: [{id: 'LEVEL-4'}, {id:'C9uduqDZr9d'}]}
+					{dimension: 'ou', items: [{id: 'USER_ORGUNIT_CHILDREN'}]}
 				],
-				hideEmptyRows: true
+				hideEmptyRows: true,
+                userOrgUnit: ['fdc6uOvgoji', 'e1eIKM1GIF3']
 			});
 		});
 	</script>
 </head>
 
 <body>
-    <h1>TABLE BY UID</h1>
-	<div id="table1"></div>
 
     <h1>TABLE BY CONFIG</h1>
 	<div id="table2"></div>

=== modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/app.js'
--- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/app.js	2015-08-03 10:54:58 +0000
+++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/app.js	2015-08-04 13:19:54 +0000
@@ -2541,19 +2541,32 @@
 			web.pivot.getData = function(layout, isUpdateGui) {
 				var xLayout,
 					paramString,
+                    sortedParamString,
                     onFailure;
 
 				if (!layout) {
 					return;
 				}
 
-                onFailure = function() {
+                onFailure = function(r) {
                     ns.app.viewport.setGui(layout, xLayout, isUpdateGui);
-                    web.mask.hide(ns.app.centerRegion);
+                    web.mask.hide(ns.app.centerRegion);                    
+
+                    if (r) {
+                        r = Ext.decode(r.responseText);
+
+                        if (Ext.Array.contains([413, 414], parseInt(r.httpStatusCode))) {
+                            web.analytics.validateUrl(init.contextPath + '/api/analytics.json' + paramString);
+                        }
+                        else {
+                            ns.alert(r);
+                        }
+                    }
                 };
 
 				xLayout = service.layout.getExtendedLayout(layout);
-				paramString = web.analytics.getParamString(xLayout, true);
+				paramString = web.analytics.getParamString(xLayout) + '&skipData=true';
+				sortedParamString = web.analytics.getParamString(xLayout, true) + '&skipMeta=true';
 
 				// show mask
 				web.mask.show(ns.app.centerRegion);
@@ -2561,7 +2574,7 @@
                 // timing
                 ns.app.dateData = new Date();
 
-				Ext.Ajax.request({
+                Ext.Ajax.request({
 					url: init.contextPath + '/api/analytics.json' + paramString,
 					timeout: 60000,
 					headers: {
@@ -2570,32 +2583,41 @@
 					},
 					disableCaching: false,
 					failure: function(r) {
-                        onFailure();
-
-                        r = Ext.decode(r.responseText);
-
-						if (Ext.Array.contains([413, 414], parseInt(r.httpStatusCode))) {
-							web.analytics.validateUrl(init.contextPath + '/api/analytics.json' + paramString);
-						}
-						else {
-                            ns.alert(r);
-						}
+                        onFailure(r);
 					},
 					success: function(r) {
-                        ns.app.dateCreate = new Date();
-
-						var response = api.response.Response(Ext.decode(r.responseText));
-
-						if (!response) {
-                            onFailure();
-							return;
-						}
-
-						ns.app.paramString = paramString;
-
-						web.pivot.createTable(layout, response, null, isUpdateGui);
-					}
-				});
+                        var metaData = Ext.decode(r.responseText).metaData;                        
+
+                        Ext.Ajax.request({
+                            url: init.contextPath + '/api/analytics.json' + sortedParamString,
+                            timeout: 60000,
+                            headers: {
+                                'Content-Type': 'application/json',
+                                'Accepts': 'application/json'
+                            },
+                            disableCaching: false,
+                            failure: function(r) {
+                                onFailure(r);
+                            },
+                            success: function(r) {
+                                ns.app.dateCreate = new Date();
+
+                                var response = api.response.Response(Ext.decode(r.responseText));
+
+                                if (!response) {
+                                    onFailure();
+                                    return;
+                                }
+
+                                response.metaData = metaData;
+
+                                ns.app.paramString = sortedParamString;
+
+                                web.pivot.createTable(layout, response, null, isUpdateGui);
+                            }
+                        });
+                    }
+                });
 			};
 
 			web.pivot.createTable = function(layout, response, xResponse, isUpdateGui) {

=== modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/core.js'
--- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/core.js	2015-07-15 15:37:02 +0000
+++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/core.js	2015-08-04 13:19:54 +0000
@@ -403,7 +403,7 @@
 
                 // displayProperty: string ('name') // 'name', 'shortname', null
 
-                // userOrganisationUnit: string
+                // userOrgUnit: string
 
 				getValidatedDimensionArray = function(dimensionArray) {
 					var dimensionArray = Ext.clone(dimensionArray);
@@ -575,8 +575,8 @@
                         layout.displayProperty = config.displayProperty;
                     }
 
-                    if (Ext.isString(config.userOrganisationUnit)) {
-                        layout.userOrganisationUnit = config.userOrganisationUnit;
+                    if (Ext.Array.from(config.userOrgUnit).length) {
+                        layout.userOrgUnit = Ext.Array.from(config.userOrgUnit);
                     }
 
                     // TODO program
@@ -1248,91 +1248,20 @@
                 // Set items from init/metaData/xLayout
                 for (var i = 0, dim, metaDataDim, items; i < dimensions.length; i++) {
                     dim = dimensions[i];
-                    dim.items = [];
+                    dim.items = [];                    
                     metaDataDim = response.metaData[dim.objectName];
-
-                    // If ou and children
-                    if (dim.dimensionName === ou) {
-                        if (isUserOrgunit || isUserOrgunitChildren || isUserOrgunitGrandChildren) {
-                            var userOu,
-                                userOuc,
-                                userOugc;
-
-                            if (init.user && isUserOrgunit) {
-                                userOu = [];
-
-                                for (var j = 0; j < init.user.ou.length; j++) {
-                                    userOu.push({
-                                        id: init.user.ou[j],
-                                        name: service.layout.getItemName(xLayout, response, init.user.ou[j], false)
-                                    });
-                                }
-                            }
-                            if (init.user && init.user.ouc && isUserOrgunitChildren) {
-                                userOuc = [];
-
-                                for (var j = 0; j < init.user.ouc.length; j++) {
-                                    userOuc.push({
-                                        id: init.user.ouc[j],
-                                        name: service.layout.getItemName(xLayout, response, init.user.ouc[j], false)
-                                    });
-                                }
-
-                                support.prototype.array.sort(userOuc);
-                            }
-                            if (init.user && init.user.ouc && isUserOrgunitGrandChildren) {
-                                var userOuOuc = [].concat(init.user.ou, init.user.ouc),
-                                    responseOu = response.metaData[ou];
-
-                                userOugc = [];
-
-                                for (var j = 0, id; j < responseOu.length; j++) {
-                                    id = responseOu[j];
-
-                                    if (!Ext.Array.contains(userOuOuc, id)) {
-                                        userOugc.push({
-                                            id: id,
-                                            name: service.layout.getItemName(xLayout, response, id, false)
-                                        });
-                                    }
-                                }
-
-                                support.prototype.array.sort(userOugc);
-                            }
-
-                            dim.items = [].concat(userOu || [], userOuc || [], userOugc || []);
-                        }
-                        else if (isLevel || isGroup) {
-                            for (var j = 0, responseOu = response.metaData[ou], id; j < responseOu.length; j++) {
-                                id = responseOu[j];
-
-                                dim.items.push({
-                                    id: id,
-                                    name: service.layout.getItemName(xLayout, response, id, false)
-                                });
-                            }
-
-                            support.prototype.array.sort(dim.items);
-                        }
-                        else {
-                            dim.items = Ext.clone(xLayout.dimensionNameItemsMap[dim.dimensionName]);
+                    
+                    if (Ext.isArray(metaDataDim) && metaDataDim.length) {
+                        var ids = Ext.clone(response.metaData[dim.dimensionName]);
+                        for (var j = 0; j < ids.length; j++) {
+                            dim.items.push({
+                                id: ids[j],
+                                name: response.metaData.names[ids[j]]
+                            });
                         }
                     }
                     else {
-                        // Items: get ids from metadata -> items
-                        if (Ext.isArray(metaDataDim) && metaDataDim.length) {
-                            var ids = Ext.clone(response.metaData[dim.dimensionName]);
-                            for (var j = 0; j < ids.length; j++) {
-                                dim.items.push({
-                                    id: ids[j],
-                                    name: response.metaData.names[ids[j]]
-                                });
-                            }
-                        }
-                        // Items: get items from xLayout
-                        else {
-                            dim.items = Ext.clone(xLayout.objectNameItemsMap[dim.objectName]);
-                        }
+                        dim.items = Ext.clone(xLayout.objectNameItemsMap[dim.objectName]);
                     }
                 }
 
@@ -2100,10 +2029,6 @@
 			web.analytics = {};
 
 			web.analytics.getParamString = function(xLayout, isSorted) {
-
-                // TODO
-                isSorted = false;
-
 				var axisDimensionNames = isSorted ? xLayout.sortedAxisDimensionNames : xLayout.axisDimensionNames,
 					filterDimensions = isSorted ? xLayout.sortedFilterDimensions : xLayout.filterDimensions,
 					dimensionNameIdsMap = isSorted ? xLayout.dimensionNameSortedIdsMap : xLayout.dimensionNameIdsMap,
@@ -2170,8 +2095,12 @@
                 paramString += '&displayProperty=' + displayProperty.toUpperCase();
 
                 // user organisation unit
-                if (Ext.isString(xLayout.userOrganisationUnit)) {
-					paramString += '&userOrganisationUnit=' + xLayout.userOrganisationUnit;
+                if (Ext.isArray(xLayout.userOrgUnit) && xLayout.userOrgUnit.length) {
+                    paramString += '&userOrgUnit=';
+                    
+                    for (var i = 0; i < xLayout.userOrgUnit.length; i++) {
+                        paramString += xLayout.userOrgUnit[i] + (i < xLayout.userOrgUnit.length - 1 ? ';' : '');
+                    }
 				}
 
 				// data approval level

=== modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/table.js'
--- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/table.js	2015-07-14 21:26:33 +0000
+++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-pivot/scripts/table.js	2015-08-04 13:19:54 +0000
@@ -41,14 +41,14 @@
 
 	// namespace
 	PT = {};
-	var NS = PT;
-
-	NS.instances = [];
-	NS.i18n = {};
-	NS.isDebug = false;
-	NS.isSessionStorage = ('sessionStorage' in window && window['sessionStorage'] !== null);
-
-	NS.getCore = function(ns) {
+	var PT = PT;
+
+	PT.instances = [];
+	PT.i18n = {};
+	PT.isDebug = false;
+	PT.isSessionStorage = ('sessionStorage' in window && window['sessionStorage'] !== null);
+
+	PT.getCore = function(ns) {
         var init = ns.init,
             conf = {},
             api = {},
@@ -63,34 +63,27 @@
 		// conf
 		(function() {
 			conf.finals = {
-				url: {
-					path_module: '/dhis-web-pivot/',
-					organisationunitchildren_get: 'getOrganisationUnitChildren.action'
-				},
 				dimension: {
 					data: {
 						value: 'data',
-						name: NS.i18n.data || 'Data',
+						name: PT.i18n.data || 'Data',
 						dimensionName: 'dx',
-						objectName: 'dx',
-						warning: {
-							filter: '...'//NS.i18n.wm_multiple_filter_ind_de
-						}
+						objectName: 'dx'
 					},
 					category: {
-						name: NS.i18n.assigned_categories || 'Assigned categories',
+						name: PT.i18n.assigned_categories || 'Assigned categories',
 						dimensionName: 'co',
 						objectName: 'co',
 					},
 					indicator: {
 						value: 'indicators',
-						name: NS.i18n.indicators || 'Indicators',
+						name: PT.i18n.indicators || 'Indicators',
 						dimensionName: 'dx',
 						objectName: 'in'
 					},
 					dataElement: {
 						value: 'dataElements',
-						name: NS.i18n.data_elements || 'Data elements',
+						name: PT.i18n.data_elements || 'Data elements',
 						dimensionName: 'dx',
 						objectName: 'de'
 					},
@@ -102,25 +95,25 @@
 					},
 					dataSet: {
 						value: 'dataSets',
-						name: NS.i18n.data_sets || 'Data sets',
+						name: PT.i18n.data_sets || 'Data sets',
 						dimensionName: 'dx',
 						objectName: 'ds'
 					},
 					eventDataItem: {
 						value: 'eventDataItem',
-						name: NS.i18n.event_data_items || 'Event data items',
+						name: PT.i18n.event_data_items || 'Event data items',
 						dimensionName: 'dx',
 						objectName: 'di'
 					},
 					programIndicator: {
 						value: 'programIndicator',
-						name: NS.i18n.program_indicators || 'Program indicators',
+						name: PT.i18n.program_indicators || 'Program indicators',
 						dimensionName: 'dx',
 						objectName: 'pi'
 					},
 					period: {
 						value: 'period',
-						name: NS.i18n.periods || 'Periods',
+						name: PT.i18n.periods || 'Periods',
 						dimensionName: 'pe',
 						objectName: 'pe'
 					},
@@ -132,7 +125,7 @@
 					},
 					organisationUnit: {
 						value: 'organisationUnits',
-						name: NS.i18n.organisation_units || 'Organisation units',
+						name: PT.i18n.organisation_units || 'Organisation units',
 						dimensionName: 'ou',
 						objectName: 'ou'
 					},
@@ -168,17 +161,17 @@
 
 			conf.period = {
 				periodTypes: [
-					{id: 'Daily', name: NS.i18n.daily},
-					{id: 'Weekly', name: NS.i18n.weekly},
-					{id: 'Monthly', name: NS.i18n.monthly},
-					{id: 'BiMonthly', name: NS.i18n.bimonthly},
-					{id: 'Quarterly', name: NS.i18n.quarterly},
-					{id: 'SixMonthly', name: NS.i18n.sixmonthly},
-					{id: 'SixMonthlyApril', name: NS.i18n.sixmonthly_april},
-					{id: 'Yearly', name: NS.i18n.yearly},
-					{id: 'FinancialOct', name: NS.i18n.financial_oct},
-					{id: 'FinancialJuly', name: NS.i18n.financial_july},
-					{id: 'FinancialApril', name: NS.i18n.financial_april}
+					{id: 'Daily', name: PT.i18n.daily},
+					{id: 'Weekly', name: PT.i18n.weekly},
+					{id: 'Monthly', name: PT.i18n.monthly},
+					{id: 'BiMonthly', name: PT.i18n.bimonthly},
+					{id: 'Quarterly', name: PT.i18n.quarterly},
+					{id: 'SixMonthly', name: PT.i18n.sixmonthly},
+					{id: 'SixMonthlyApril', name: PT.i18n.sixmonthly_april},
+					{id: 'Yearly', name: PT.i18n.yearly},
+					{id: 'FinancialOct', name: PT.i18n.financial_oct},
+					{id: 'FinancialJuly', name: PT.i18n.financial_july},
+					{id: 'FinancialApril', name: PT.i18n.financial_april}
 				],
                 relativePeriods: []
 			};
@@ -188,16 +181,14 @@
 				west_fieldset_width: 418,
 				west_width_padding: 2,
 				west_fill: 2,
-				//west_fill_accordion_indicator: 56,
 				west_fill_accordion_indicator: 81,
-				//west_fill_accordion_dataelement: 59,
 				west_fill_accordion_dataelement: 81,
-				//west_fill_accordion_dataset: 31,
 				west_fill_accordion_dataset: 56,
                 west_fill_accordion_eventdataitem: 81,
                 west_fill_accordion_programindicator: 81,
 				west_fill_accordion_period: 303,
 				west_fill_accordion_organisationunit: 58,
+                west_fill_accordion_group: 31,
 				west_maxheight_accordion_indicator: 400,
 				west_maxheight_accordion_dataelement: 400,
 				west_maxheight_accordion_dataset: 400,
@@ -414,7 +405,7 @@
 
                 // displayProperty: string ('name') // 'name', 'shortname', null
 
-                // userOrganisationUnit: string
+                // userOrgUnit: string
 
 				getValidatedDimensionArray = function(dimensionArray) {
 					var dimensionArray = Ext.clone(dimensionArray);
@@ -452,19 +443,19 @@
 
 							// Indicators as filter
 							if (layout.filters[i].dimension === dimConf.indicator.objectName) {
-								ns.alert(NS.i18n.indicators_cannot_be_specified_as_filter || 'Indicators cannot be specified as filter');
+								ns.alert(PT.i18n.indicators_cannot_be_specified_as_filter || 'Indicators cannot be specified as filter');
 								return;
 							}
 
 							// Categories as filter
 							if (layout.filters[i].dimension === dimConf.category.objectName) {
-								ns.alert(NS.i18n.categories_cannot_be_specified_as_filter || 'Categories cannot be specified as filter');
+								ns.alert(PT.i18n.categories_cannot_be_specified_as_filter || 'Categories cannot be specified as filter');
 								return;
 							}
 
 							// Data sets as filter
 							if (layout.filters[i].dimension === dimConf.dataSet.objectName) {
-								ns.alert(NS.i18n.data_sets_cannot_be_specified_as_filter || 'Data sets cannot be specified as filter');
+								ns.alert(PT.i18n.data_sets_cannot_be_specified_as_filter || 'Data sets cannot be specified as filter');
 								return;
 							}
 						}
@@ -519,7 +510,7 @@
 
 					// at least one dimension specified as column or row
 					if (!(config.columns || config.rows)) {
-						ns.alert(NS.i18n.at_least_one_dimension_must_be_specified_as_row_or_column);
+						ns.alert(PT.i18n.at_least_one_dimension_must_be_specified_as_row_or_column);
 						return;
 					}
 
@@ -534,7 +525,7 @@
 
 					// at least one period
 					if (!Ext.Array.contains(objectNames, dimConf.period.objectName)) {
-						ns.alert(NS.i18n.at_least_one_period_must_be_specified_as_column_row_or_filter);
+						ns.alert(PT.i18n.at_least_one_period_must_be_specified_as_column_row_or_filter);
 						return;
 					}
 
@@ -586,8 +577,8 @@
                         layout.displayProperty = config.displayProperty;
                     }
 
-                    if (Ext.isString(config.userOrganisationUnit)) {
-                        layout.userOrganisationUnit = config.userOrganisationUnit;
+                    if (Ext.Array.from(config.userOrgUnit).length) {
+                        layout.userOrgUnit = Ext.Array.from(config.userOrgUnit);
                     }
 
                     // TODO program
@@ -1259,91 +1250,20 @@
                 // Set items from init/metaData/xLayout
                 for (var i = 0, dim, metaDataDim, items; i < dimensions.length; i++) {
                     dim = dimensions[i];
-                    dim.items = [];
+                    dim.items = [];                    
                     metaDataDim = response.metaData[dim.objectName];
-
-                    // If ou and children
-                    if (dim.dimensionName === ou) {
-                        if (isUserOrgunit || isUserOrgunitChildren || isUserOrgunitGrandChildren) {
-                            var userOu,
-                                userOuc,
-                                userOugc;
-
-                            if (init.user && isUserOrgunit) {
-                                userOu = [];
-
-                                for (var j = 0; j < init.user.ou.length; j++) {
-                                    userOu.push({
-                                        id: init.user.ou[j],
-                                        name: service.layout.getItemName(xLayout, response, init.user.ou[j], false)
-                                    });
-                                }
-                            }
-                            if (init.user && init.user.ouc && isUserOrgunitChildren) {
-                                userOuc = [];
-
-                                for (var j = 0; j < init.user.ouc.length; j++) {
-                                    userOuc.push({
-                                        id: init.user.ouc[j],
-                                        name: service.layout.getItemName(xLayout, response, init.user.ouc[j], false)
-                                    });
-                                }
-
-                                support.prototype.array.sort(userOuc);
-                            }
-                            if (init.user && init.user.ouc && isUserOrgunitGrandChildren) {
-                                var userOuOuc = [].concat(init.user.ou, init.user.ouc),
-                                    responseOu = response.metaData[ou];
-
-                                userOugc = [];
-
-                                for (var j = 0, id; j < responseOu.length; j++) {
-                                    id = responseOu[j];
-
-                                    if (!Ext.Array.contains(userOuOuc, id)) {
-                                        userOugc.push({
-                                            id: id,
-                                            name: service.layout.getItemName(xLayout, response, id, false)
-                                        });
-                                    }
-                                }
-
-                                support.prototype.array.sort(userOugc);
-                            }
-
-                            dim.items = [].concat(userOu || [], userOuc || [], userOugc || []);
-                        }
-                        else if (isLevel || isGroup) {
-                            for (var j = 0, responseOu = response.metaData[ou], id; j < responseOu.length; j++) {
-                                id = responseOu[j];
-
-                                dim.items.push({
-                                    id: id,
-                                    name: service.layout.getItemName(xLayout, response, id, false)
-                                });
-                            }
-
-                            support.prototype.array.sort(dim.items);
-                        }
-                        else {
-                            dim.items = Ext.clone(xLayout.dimensionNameItemsMap[dim.dimensionName]);
+                    
+                    if (Ext.isArray(metaDataDim) && metaDataDim.length) {
+                        var ids = Ext.clone(response.metaData[dim.dimensionName]);
+                        for (var j = 0; j < ids.length; j++) {
+                            dim.items.push({
+                                id: ids[j],
+                                name: response.metaData.names[ids[j]]
+                            });
                         }
                     }
                     else {
-                        // Items: get ids from metadata -> items
-                        if (Ext.isArray(metaDataDim) && metaDataDim.length) {
-                            var ids = Ext.clone(response.metaData[dim.dimensionName]);
-                            for (var j = 0; j < ids.length; j++) {
-                                dim.items.push({
-                                    id: ids[j],
-                                    name: response.metaData.names[ids[j]]
-                                });
-                            }
-                        }
-                        // Items: get items from xLayout
-                        else {
-                            dim.items = Ext.clone(xLayout.objectNameItemsMap[dim.objectName]);
-                        }
+                        dim.items = Ext.clone(xLayout.objectNameItemsMap[dim.objectName]);
                     }
                 }
 
@@ -2050,24 +1970,42 @@
 			// message
 			web.message = {};
 
-			web.message.alert = function(msg, type) {
+			web.message.alert = function(obj) {
                 var config = {},
+                    type,
                     window;
 
-                if (!msg) {
+                if (!obj || (Ext.isObject(obj) && !obj.message && !obj.responseText)) {
                     return;
                 }
 
-                type = type || 'error';
-
-				config.title = type === 'error' ? NS.i18n.error : (type === 'warning' ? NS.i18n.warning : NS.i18n.info);
+                // if response object
+                if (Ext.isObject(obj) && obj.responseText && !obj.message) {
+                    obj = Ext.decode(obj.responseText);
+                }
+
+                // if string
+                if (Ext.isString(obj)) {
+                    obj = {
+                        status: 'ERROR',
+                        message: obj
+                    };
+                }
+
+                // web message
+                type = (obj.status || 'INFO').toLowerCase();
+
+				config.title = obj.status;
 				config.iconCls = 'ns-window-title-messagebox ' + type;
 
                 // html
-                config.html = msg + (msg.substr(msg.length - 1) === '.' ? '' : '.');
+                config.html = '';
+                config.html += obj.httpStatusCode ? 'Code: ' + obj.httpStatusCode + '<br>' : '';
+                config.html += obj.httpStatus ? 'Status: ' + obj.httpStatus + '<br><br>' : '';
+                config.html += obj.message + (obj.message.substr(obj.message.length - 1) === '.' ? '' : '.');
 
                 // bodyStyle
-                config.bodyStyle = 'padding: 10px; background: #fff; max-width: 350px; max-height: ' + ns.app.centerRegion.getHeight() / 2 + 'px';
+                config.bodyStyle = 'padding: 12px; background: #fff; max-width: 600px; max-height: ' + ns.app.centerRegion.getHeight() / 2 + 'px';
 
                 // destroy handler
                 config.modal = true;
@@ -2096,7 +2034,7 @@
 
                 // TODO
                 isSorted = false;
-                
+
 				var axisDimensionNames = isSorted ? xLayout.sortedAxisDimensionNames : xLayout.axisDimensionNames,
 					filterDimensions = isSorted ? xLayout.sortedFilterDimensions : xLayout.filterDimensions,
 					dimensionNameIdsMap = isSorted ? xLayout.dimensionNameSortedIdsMap : xLayout.dimensionNameIdsMap,
@@ -2116,14 +2054,15 @@
 					items = Ext.clone(dimensionNameIdsMap[dimName]);
 
 					if (dimName === dx) {
-						for (var j = 0, index; j < items.length; j++) {
-							index = items[j].indexOf('#');
+						//for (var j = 0, index; j < items.length; j++) {
+							//index = items[j].indexOf('#');
 
-							if (index > 0) {
-								addCategoryDimension = true;
-								items[j] = items[j].substr(0, index);
-							}
-						}
+							//if (index > 0) {
+								//addCategoryDimension = true;
+								//items[j] = items[j].substr(0, index);
+                                //items[j] = items[j].replace('#', '.');
+							//}
+						//}
 
 						items = Ext.Array.unique(items);
 					}
@@ -2162,8 +2101,12 @@
                 paramString += '&displayProperty=' + displayProperty.toUpperCase();
 
                 // user organisation unit
-                if (Ext.isString(xLayout.userOrganisationUnit)) {
-					paramString += '&userOrganisationUnit=' + xLayout.userOrganisationUnit;
+                if (Ext.isArray(xLayout.userOrgUnit) && xLayout.userOrgUnit.length) {
+                    paramString += '&userOrgUnit=';
+                    
+                    for (var i = 0; i < xLayout.userOrgUnit.length; i++) {
+                        paramString += xLayout.userOrgUnit[i] + (i < xLayout.userOrgUnit.length - 1 ? ';' : '');
+                    }
 				}
 
 				// data approval level
@@ -2176,7 +2119,7 @@
                     paramString += '&program=' + xLayout.program.id;
                 }
 
-				return paramString;
+				return paramString.replace(/#/g, '.');
 			};
 
 			web.analytics.validateUrl = function(url) {