=== 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'] }); }); -

TABLE BY UID

-

TABLE BY CONFIG

=== 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 + '
' : ''; + config.html += obj.httpStatus ? 'Status: ' + obj.httpStatus + '

' : ''; + 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) {