=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/core.js' --- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/core.js 2013-04-17 14:53:47 +0000 +++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/core.js 2013-05-16 09:32:16 +0000 @@ -1339,6 +1339,8 @@ iid = feature.attributes.internalId; if (featureMap.hasOwnProperty(iid) && valueMap.hasOwnProperty(iid)) { feature.attributes.value = valueMap[iid]; + //var m = Math.random(); + //feature.attributes.value = m < 0.3 ? -5 : m < 0.6 ? null : 1; feature.attributes.label = feature.attributes.name + ' (' + feature.attributes.value + ')'; newFeatures.push(feature); } === modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/java/org/hisp/dhis/pivot/action/InitializeAction.java' --- dhis-2/dhis-web/dhis-web-pivot/src/main/java/org/hisp/dhis/pivot/action/InitializeAction.java 2013-04-15 20:44:56 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/java/org/hisp/dhis/pivot/action/InitializeAction.java 2013-05-15 09:45:38 +0000 @@ -33,14 +33,11 @@ import org.apache.struts2.ServletActionContext; import org.hisp.dhis.api.utils.ContextUtils; -import org.hisp.dhis.dataelement.DataElementGroupSet; -import org.hisp.dhis.dataelement.DataElementService; +import org.hisp.dhis.common.DimensionalObject; +import org.hisp.dhis.common.DimensionService; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.mapping.MapLegendSet; -import org.hisp.dhis.mapping.MappingService; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.organisationunit.OrganisationUnitGroupService; -import org.hisp.dhis.organisationunit.OrganisationUnitGroupSet; import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodService; @@ -66,20 +63,6 @@ this.organisationUnitService = organisationUnitService; } - private OrganisationUnitGroupService organisationUnitGroupService; - - public void setOrganisationUnitGroupService( OrganisationUnitGroupService organisationUnitGroupService ) - { - this.organisationUnitGroupService = organisationUnitGroupService; - } - - private DataElementService dataElementService; - - public void setDataElementService( DataElementService dataElementService ) - { - this.dataElementService = dataElementService; - } - private PeriodService periodService; public void setPeriodService( PeriodService periodService ) @@ -87,11 +70,11 @@ this.periodService = periodService; } - private MappingService mappingService; + private DimensionService dimensionService; - public void setMappingService( MappingService mappingService ) + public void setDimensionService( DimensionService dimensionService ) { - this.mappingService = mappingService; + this.dimensionService = dimensionService; } private I18nFormat format; @@ -119,20 +102,6 @@ return rootNodes; } - private Collection organisationUnitGroupSets; - - public Collection getOrganisationUnitGroupSets() - { - return organisationUnitGroupSets; - } - - private Collection dataElementGroupSets; - - public Collection getDataElementGroupSets() - { - return dataElementGroupSets; - } - private List lastMonth; public List getLastMonth() @@ -202,6 +171,13 @@ { return last5Years; } + + private Collection dimensions; + + public Collection getDimensions() + { + return dimensions; + } private Collection legendSets; @@ -226,10 +202,6 @@ rootNodes.add( new OrganisationUnit() ); } - organisationUnitGroupSets = organisationUnitGroupService.getAllOrganisationUnitGroupSets(); - - dataElementGroupSets = dataElementService.getAllDataElementGroupSets(); - RelativePeriods rp = new RelativePeriods(); rp.clear().setReportingMonth( true ); @@ -262,7 +234,7 @@ rp.clear().setLast5Years( true ); last5Years = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) ); - legendSets = mappingService.getAllMapLegendSets(); + dimensions = dimensionService.getAllDimensions(); return SUCCESS; } === modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-web/dhis-web-pivot/src/main/resources/META-INF/dhis/beans.xml 2013-04-15 20:44:56 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/resources/META-INF/dhis/beans.xml 2013-05-15 09:45:38 +0000 @@ -13,11 +13,9 @@ + - - - - + === 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-05-09 19:52:43 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js 2013-05-22 14:06:23 +0000 @@ -17,9 +17,9 @@ // Init - var pt = PT.core.getInstance(); + pt = PT.core.getInstance(); - PT.app.instances = [pt]; + PT.core.instances = [pt]; PT.app.getInits = function(r) { var init = Ext.decode(r.responseText); @@ -28,22 +28,17 @@ 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; - } - + // Sort and extend dynamic dimensions + init.dimensions = pt.util.array.sortObjectsByString(init.dimensions); + + for (var i = 0, dim; i < init.dimensions.length; i++) { + dim = init.dimensions[i]; + dim.dimensionName = dim.id; + dim.objectName = pt.conf.finals.dimension.dimension.objectName; + pt.conf.finals.dimension.objectNameMap[dim.id] = dim; + } + + // Viewport afterrender init.afterRender = function() { // Resize event handler @@ -57,7 +52,7 @@ // Left gui var viewportHeight = pt.viewport.westRegion.getHeight(), - numberOfTabs = pt.init.ougs.length + pt.init.degs.length + 5, + numberOfTabs = pt.init.dimensions.length + 5, tabHeight = 28, minPeriodHeight = 380; @@ -95,6 +90,72 @@ PT.app.getUtils = function() { var util = pt.util || {}; + util.pivot.getLayoutConfig = function() { + var panels = pt.cmp.dimension.panels, + columnDimNames = pt.viewport.colStore.getDimensionNames(), + rowDimNames = pt.viewport.rowStore.getDimensionNames(), + filterDimNames = pt.viewport.filterStore.getDimensionNames(), + config = pt.viewport.optionsWindow.getOptions(), + dimConf = pt.conf.finals.dimension, + dx = dimConf.data.dimensionName, + co = dimConf.category.dimensionName, + nameDimArrayMap = {}, + getDimension; + + config.columns = []; + config.rows = []; + config.filters = []; + + // Panel data + for (var i = 0, dim, dimName; i < panels.length; i++) { + dim = panels[i].getDimension(); + + if (dim) { + nameDimArrayMap[dim.dimension] = [dim]; + } + } + + nameDimArrayMap[dx] = Ext.Array.clean([].concat( + nameDimArrayMap[dimConf.indicator.objectName], + nameDimArrayMap[dimConf.dataElement.objectName], + nameDimArrayMap[dimConf.operand.objectName], + nameDimArrayMap[dimConf.dataSet.objectName] + )); + + // Columns, rows, filters + for (var i = 0, nameArrays = [columnDimNames, rowDimNames, filterDimNames], axes = [config.columns, config.rows, config.filters], dimNames; i < nameArrays.length; i++) { + dimNames = nameArrays[i]; + + for (var j = 0, dimName, dim; j < dimNames.length; j++) { + dimName = dimNames[j]; + + if (dimName === co) { + axes[i].push({ + dimension: co, + items: [] + }); + } + else if (dimName === dx && nameDimArrayMap.hasOwnProperty(dimName) && nameDimArrayMap[dimName]) { + for (var k = 0; k < nameDimArrayMap[dx].length; k++) { + axes[i].push(Ext.clone(nameDimArrayMap[dx][k])); + } + } + else if (nameDimArrayMap.hasOwnProperty(dimName) && nameDimArrayMap[dimName]) { + //axes[i].push(Ext.clone(nameDimArrayMap[dimName])); + + for (var k = 0; k < nameDimArrayMap[dimName].length; k++) { + axes[i].push(Ext.clone(nameDimArrayMap[dimName][k])); + } + } + } + } + + config.userOrganisationUnit = pt.viewport.userOrganisationUnit.getValue(); + config.userOrganisationUnitChildren = pt.viewport.userOrganisationUnitChildren.getValue(); + + return config; + }; + util.dimension = { panel: { setHeight: function(mx) { @@ -166,80 +227,6 @@ } }; - util.pivot.getLayoutConfig = function() { - var data = {}, - setup = pt.viewport.layoutWindow ? pt.viewport.layoutWindow.getSetup() : {}, - getData, - extendLayout, - config; - - config = { - col: [], - row: [], - filter: [], - objects: [], - userOrganisationUnit: false, - userOrganisationUnitChildren: false - }; - - getData = function() { - var panels = pt.cmp.dimension.panels, - dxItems = []; - - for (var i = 0, dim; i < panels.length; i++) { - dim = panels[i].getData(); - - if (dim) { - config.objects.push(dim); - - if (dim.dimensionName === pt.conf.finals.dimension.data.dimensionName) { - dxItems = dxItems.concat(dim.items); - } - else { - data[dim.dimensionName] = dim.items; - } - } - } - - if (dxItems.length) { - data[pt.conf.finals.dimension.data.dimensionName] = dxItems; - } - }(); - - extendLayout = function() { - for (var i = 0, dimensionName; i < setup.col.length; i++) { - dimensionName = setup.col[i]; - config.col.push({ - dimensionName: dimensionName, - items: data[dimensionName] - }); - } - - for (var i = 0, dimensionName; i < setup.row.length; i++) { - dimensionName = setup.row[i]; - config.row.push({ - dimensionName: dimensionName, - items: data[dimensionName] - }); - } - - for (var i = 0, dimensionName; i < setup.filter.length; i++) { - dimensionName = setup.filter[i]; - config.filter.push({ - dimensionName: dimensionName, - items: data[dimensionName] - }); - } - }(); - - config.options = pt.viewport.optionsWindow.getOptions(); - - config.options.userOrganisationUnit = pt.viewport.userOrganisationUnit.getValue(); - config.options.userOrganisationUnitChildren = pt.viewport.userOrganisationUnitChildren.getValue(); - - return config; - }; - util.url = { getUrlParam: function(s) { var output = ''; @@ -489,10 +476,7 @@ data.push({id: dimConf.organisationUnit.dimensionName, name: dimConf.organisationUnit.name}); } - return data.concat( - pt.util.array.sortObjectsByString(Ext.clone(pt.init.ougs)), - pt.util.array.sortObjectsByString(Ext.clone(pt.init.degs)) - ); + return data.concat(Ext.clone(pt.init.dimensions)); }; getStore = function(data) { @@ -504,6 +488,16 @@ config.data = data; } + config.getDimensionNames = function() { + var dimensionNames = []; + + this.each(function(r) { + dimensionNames.push(r.data.id); + }); + + return Ext.clone(dimensionNames); + }; + return Ext.create('Ext.data.Store', config); }; @@ -947,6 +941,19 @@ parentOrganisationUnit: parentOrganisationUnit.getValue() }; }, + setOptions: function(layout) { + showTotals.setValue(Ext.isBoolean(layout.showTotals) ? layout.showTotals : true); + showSubTotals.setValue(Ext.isBoolean(layout.showSubTotals) ? layout.showSubTotals : true); + hideEmptyRows.setValue(Ext.isBoolean(layout.hideEmptyRows) ? layout.hideEmptyRows : false); + + displayDensity.setValue(Ext.isString(layout.displayDensity) ? layout.displayDensity : 'normal'); + fontSize.setValue(Ext.isString(layout.fontSize) ? layout.fontSize : 'normal'); + digitGroupSeparator.setValue(Ext.isString(layout.digitGroupSeparator) ? layout.digitGroupSeparator : 'space'); + + reportingPeriod.setValue(Ext.isBoolean(layout.reportingPeriod) ? layout.reportingPeriod : false); + organisationUnit.setValue(Ext.isBoolean(layout.organisationUnit) ? layout.organisationUnit : false); + parentOrganisationUnit.setValue(Ext.isBoolean(layout.parentOrganisationUnit) ? layout.parentOrganisationUnit : false); + }, items: [ { bodyStyle: 'border:0 none; color:#222; font-size:12px; font-weight:bold', @@ -1053,8 +1060,8 @@ getBody = function() { var favorite; - if (pt.xLayout) { - favorite = Ext.clone(pt.xLayout.options); + if (pt.layout) { + favorite = Ext.clone(pt.layout); // Server sync favorite.totals = favorite.showTotals; @@ -1072,103 +1079,7 @@ delete favorite.organisationUnit; delete favorite.parentOrganisationUnit; - // Dimensions - for (var i = 0, obj, key, items; i < pt.xLayout.objects.length; i++) { - obj = pt.xLayout.objects[i]; - - if (obj.objectName === pt.conf.finals.dimension.period.objectName) { - for (var j = 0, item; j < obj.items.length; j++) { - item = obj.items[j]; - - if (pt.conf.period.relativePeriodValueKeys[item]) { - key = pt.conf.finals.dimension.relativePeriod.value; - - if (!favorite[key]) { - favorite[key] = {}; - } - - favorite[key][pt.conf.period.relativePeriodValueKeys[item]] = true; - } - else { - key = pt.conf.finals.dimension.fixedPeriod.value; - - if (!favorite[key]) { - favorite[key] = []; - } - - favorite[key].push({ - id: item - }); - } - } - } - else if (obj.objectName === pt.conf.finals.dimension.organisationUnitGroupSet.objectName || - obj.objectName === pt.conf.finals.dimension.dataElementGroupSet.objectName) { - key = pt.conf.finals.dimension.objectNameMap[obj.objectName].value; - - if (!favorite[key]) { - favorite[key] = {}; - } - - favorite[key][obj.dimensionName] = []; - - for (var j = 0, item; j < obj.items.length; j++) { - item = obj.items[j]; - - favorite[key][obj.dimensionName].push({ - id: item - }); - } - } - else { - key = pt.conf.finals.dimension.objectNameMap[obj.objectName].value; - favorite[key] = []; - - for (var j = 0, item; j < obj.items.length; j++) { - item = obj.items[j]; - - favorite[key].push({ - id: item - }); - } - } - } - - // Relative periods PUT workaround - if (!favorite.relativePeriods) { - favorite.relativePeriods = {}; - } - - // Layout - if (pt.xLayout.col) { - var a = []; - - for (var i = 0; i < pt.xLayout.col.length; i++) { - a.push(pt.xLayout.col[i].dimensionName); - } - - favorite.columnDimensions = a; - } - - if (pt.xLayout.row) { - var a = []; - - for (var i = 0; i < pt.xLayout.row.length; i++) { - a.push(pt.xLayout.row[i].dimensionName); - } - - favorite.rowDimensions = a; - } - - if (pt.xLayout.filter) { - var a = []; - - for (var i = 0; i < pt.xLayout.filter.length; i++) { - a.push(pt.xLayout.filter[i].dimensionName); - } - - favorite.filterDimensions = a; - } + delete favorite.parentGraphMap; } return favorite; @@ -1196,7 +1107,7 @@ text: PT.i18n.create, handler: function() { var favorite = getBody(); - favorite.name = nameTextfield.getValue (); + favorite.name = nameTextfield.getValue(); if (favorite && favorite.name) { Ext.Ajax.request({ @@ -1921,8 +1832,8 @@ userOrganisationUnitChildren, treePanel, organisationUnit, - groupSetIdAvailableStoreMap = {}, - groupSetIdSelectedStoreMap = {}, + dimensionIdAvailableStoreMap = {}, + dimensionIdSelectedStoreMap = {}, getGroupSetPanels, validateSpecialCases, update, @@ -2025,18 +1936,17 @@ xtype: 'panel', title: '
' + PT.i18n.indicators + '
', hideCollapseTool: true, - getData: function() { - var data = { - dimensionName: pt.conf.finals.dimension.indicator.dimensionName, - objectName: pt.conf.finals.dimension.indicator.objectName, + getDimension: function() { + var config = { + dimension: pt.conf.finals.dimension.indicator.objectName, items: [] }; pt.store.indicatorSelected.each( function(r) { - data.items.push(r.data.id); + config.items.push({id: r.data.id}); }); - return data.items.length ? data : null; + return config.items.length ? config : null; }, onExpand: function() { var h = pt.viewport.westRegion.hasScrollbar ? @@ -2214,18 +2124,17 @@ xtype: 'panel', title: '
' + PT.i18n.data_elements + '
', hideCollapseTool: true, - getData: function() { - var data = { - dimensionName: pt.conf.finals.dimension.dataElement.dimensionName, - objectName: pt.conf.finals.dimension.dataElement.objectName, + getDimension: function() { + var config = { + dimension: pt.conf.finals.dimension.dataElement.objectName, items: [] }; pt.store.dataElementSelected.each( function(r) { - data.items.push(r.data.id); + config.items.push({id: r.data.id}); }); - return data.items.length ? data : null; + return config.items.length ? config : null; }, onExpand: function() { var h = pt.viewport.westRegion.hasScrollbar ? @@ -2403,18 +2312,17 @@ xtype: 'panel', title: '
' + PT.i18n.reporting_rates + '
', hideCollapseTool: true, - getData: function() { - var data = { - dimensionName: pt.conf.finals.dimension.dataSet.dimensionName, - objectName: pt.conf.finals.dimension.dataSet.objectName, + getDimension: function() { + var config = { + dimension: pt.conf.finals.dimension.dataSet.objectName, items: [] }; pt.store.dataSetSelected.each( function(r) { - data.items.push(r.data.id); + config.items.push({id: r.data.id}); }); - return data.items.length ? data : null; + return config.items.length ? config : null; }, onExpand: function() { var h = pt.viewport.westRegion.hasScrollbar ? @@ -2870,25 +2778,24 @@ xtype: 'panel', title: '
Periods
', hideCollapseTool: true, - getData: function() { - var data = { - dimensionName: pt.conf.finals.dimension.period.dimensionName, - objectName: pt.conf.finals.dimension.period.objectName, + getDimension: function() { + var config = { + dimension: pt.conf.finals.dimension.period.objectName, items: [] }, chb = pt.cmp.dimension.relativePeriod.checkbox; pt.store.fixedPeriodSelected.each( function(r) { - data.items.push(r.data.id); + config.items.push({id: r.data.id}); }); for (var i = 0; i < chb.length; i++) { if (chb[i].getValue()) { - data.items.push(chb[i].relativePeriodId); + config.items.push({id: chb[i].relativePeriodId}); } } - return data.items.length ? data : null; + return config.items.length ? config : null; }, onExpand: function() { var h = pt.viewport.westRegion.hasScrollbar ? @@ -3165,19 +3072,28 @@ bodyStyle: 'padding-top:5px', hideCollapseTool: true, collapsed: false, - getData: function() { - var records = treePanel.getSelectionModel().getSelection(), - data = { - dimensionName: pt.conf.finals.dimension.organisationUnit.dimensionName, - objectName: pt.conf.finals.dimension.organisationUnit.objectName, + getDimension: function() { + var r = treePanel.getSelectionModel().getSelection(), + config = { + dimension: pt.conf.finals.dimension.organisationUnit.objectName, items: [] }; - for (var i = 0; i < records.length; i++) { - data.items.push(records[i].data.id); + if (userOrganisationUnit.getValue() || userOrganisationUnitChildren.getValue()) { + if (userOrganisationUnit.getValue()) { + config.items.push({id: 'USER_ORGUNIT'}); + } + if (userOrganisationUnitChildren.getValue()) { + config.items.push({id: 'USER_ORGUNIT_CHILDREN'}); + } + } + else { + for (var i = 0; i < r.length; i++) { + config.items.push({id: r[i].data.id}); + } } - return data.items.length ? data : null; + return config.items.length ? config : null; }, onExpand: function() { var h = pt.viewport.westRegion.hasScrollbar ? @@ -3206,33 +3122,39 @@ } }; - getGroupSetPanels = function(groupSets, objectName, iconCls) { + getDimensionPanels = function(dimensions, iconCls) { var getAvailableStore, getSelectedStore, createPanel, getPanels; - getAvailableStore = function(groupSet) { + getAvailableStore = function(dimension) { return Ext.create('Ext.data.Store', { fields: ['id', 'name'], - data: groupSet.items, + proxy: { + type: 'ajax', + url: pt.baseUrl + '/api/dimensions/' + dimension.id + '.json', + reader: { + type: 'json', + root: 'items' + } + }, isLoaded: false, storage: {}, sortStore: function() { this.sort('name', 'ASC'); }, - reload: function() { - this.removeAll(); - this.storage = {}; - this.loadData(groupSet.items); + reset: function() { + if (this.isLoaded) { + this.removeAll(); + pt.util.store.loadFromStorage(this); + this.sortStore(); + } }, listeners: { load: function(s) { s.isLoaded = true; - //s.each( function(r) { - //r.data.name = pt.conf.util.jsonEncodeString(r.data.name); - //}); pt.util.store.addToStorage(s); } } @@ -3246,7 +3168,7 @@ }); }; - createPanel = function(groupSet) { + createPanel = function(dimension) { var getAvailable, getSelected, @@ -3340,11 +3262,11 @@ }); }; - availableStore = getAvailableStore(groupSet); + availableStore = getAvailableStore(dimension); selectedStore = getSelectedStore(); - groupSetIdAvailableStoreMap[groupSet.id] = availableStore; - groupSetIdSelectedStoreMap[groupSet.id] = selectedStore; + dimensionIdAvailableStoreMap[dimension.id] = availableStore; + dimensionIdSelectedStoreMap[dimension.id] = selectedStore; available = getAvailable(availableStore); selected = getSelected(selectedStore); @@ -3355,20 +3277,21 @@ panel = { xtype: 'panel', - title: '
' + groupSet.name + '
', + title: '
' + dimension.name + '
', hideCollapseTool: true, - getData: function() { - var data = { - dimensionName: groupSet.id, - objectName: objectName, + availableStore: availableStore, + selectedStore: selectedStore, + getDimension: function() { + var config = { + dimension: dimension.id, items: [] }; selectedStore.each( function(r) { - data.items.push(r.data.id); + config.items.push({id: r.data.id}); }); - return data.items.length ? data : null; + return config.items.length ? config : null; }, onExpand: function() { if (!availableStore.isLoaded) { @@ -3410,14 +3333,10 @@ }; getPanels = function() { - var panels = [], - groupSet, - last; - - for (var i = 0, panel; i < groupSets.length; i++) { - groupSet = groupSets[i]; - - panel = createPanel(groupSet); + var panels = []; + + for (var i = 0, panel; i < dimensions.length; i++) { + panel = createPanel(dimensions[i]); panels.push(panel); } @@ -3429,58 +3348,57 @@ }; validateSpecialCases = function(layout) { - var dimConf = pt.conf.finals.dimension, - dimensionNames = [], - layoutObjects = [].concat(Ext.clone(layout.col || []), Ext.clone(layout.row || []), Ext.clone(layout.filter || [])); + var dimConf = pt.conf.finals.dimension; + //dimensionNames = [], + //layoutObjects = [].concat(Ext.clone(layout.columns || []), Ext.clone(layout.rows || []), Ext.clone(layout.filters || [])); // Layout names - for (var i = 0; i < layoutObjects.length; i++) { - dimensionNames.push(layoutObjects[i].dimensionName); + //for (var i = 0; i < layoutObjects.length; i++) { + //dimensionNames.push(layoutObjects[i].dimension); + //} + if (!layout) { + return; } - // Indicator as filter - if (layout.filter && pt.store.indicatorSelected.data.length) { - for (var i = 0; i < layout.filter.length; i++) { - if (layout.filter[i].dimensionName === dimConf.data.dimensionName) { + if (layout.filters && layout.filters.length) { + for (var i = 0; i < layout.filters.length; i++) { + + // Indicators as filter + if (layout.filters[i].dimension === dimConf.indicator.objectName) { alert(PT.i18n.indicators_cannot_be_specified_as_filter); return; } + + // Categories as filter + if (layout.filters[i].dimension === dimConf.category.objectName) { + alert(PT.i18n.categories_cannot_be_specified_as_filter); + return; + } } } - // Categories as filter - if (layout.filter && pt.viewport.layoutWindow.filterStore.getById(dimConf.category.dimensionName)) { - alert(PT.i18n.categories_cannot_be_specified_as_filter); - return; - } - // Degs and datasets in the same query - if (Ext.Array.contains(dimensionNames, dimConf.data.dimensionName) && pt.store.dataSetSelected.data.length) { - for (var i = 0; i < pt.init.degs.length; i++) { - if (Ext.Array.contains(dimensionNames, pt.init.degs[i].id)) { - alert(PT.i18n.data_element_group_sets_cannot_be_specified_together_with_data_sets); - return; - } - } - } + //if (Ext.Array.contains(dimensionNames, dimConf.data.dimensionName) && pt.store.dataSetSelected.data.length) { + //for (var i = 0; i < pt.init.degs.length; i++) { + //if (Ext.Array.contains(dimensionNames, pt.init.degs[i].id)) { + //alert(PT.i18n.data_element_group_sets_cannot_be_specified_together_with_data_sets); + //return; + //} + //} + //} return true; }; update = function() { var config = pt.util.pivot.getLayoutConfig(), - layout = pt.api.Layout(config); + layout = pt.api.layout.Layout(config); - if (!layout) { - return; - } if (!validateSpecialCases(layout)) { return; } - if (layout) { - pt.util.pivot.createTable(layout, pt); - } + pt.util.pivot.createTable(layout, pt); }; accordionBody = Ext.create('Ext.panel.Panel', { @@ -3497,14 +3415,11 @@ period, organisationUnit ], - ougs = Ext.clone(pt.init.ougs), - degs = Ext.clone(pt.init.degs); - - pt.util.array.sortObjectsByString(ougs); - pt.util.array.sortObjectsByString(degs); - - panels = panels.concat(getGroupSetPanels(ougs, pt.conf.finals.dimension.organisationUnitGroupSet.objectName, 'pt-panel-title-organisationunitgroupset')); - panels = panels.concat(getGroupSetPanels(degs, pt.conf.finals.dimension.dataElementGroupSet.objectName, 'pt-panel-title-dataelementgroupset')); + dims = Ext.clone(pt.init.dimensions); + + pt.util.array.sortObjectsByString(dims); + + panels = panels.concat(getDimensionPanels(dims, 'pt-panel-title-dimension')); last = panels[panels.length - 1]; last.cls = 'pt-accordion-last'; @@ -3722,77 +3637,79 @@ } }); - setFavorite = function(r) { + setFavorite = function(layout) { + var dimConf = pt.conf.finals.dimension, + xLayout, + dimMap, + recMap, + objectName, + periodRecords, + fixedPeriodRecords = [], + isOu = false, + isOuc = false; + + pt.util.pivot.createTable(layout, pt); + + xLayout = pt.util.pivot.getExtendedLayout(layout); + dimMap = xLayout.objectNameDimensionsMap; + recMap = xLayout.objectNameItemsMap; + graphMap = layout.parentGraphMap; // Indicators pt.store.indicatorSelected.removeAll(); - if (Ext.isArray(r.indicators)) { - pt.store.indicatorSelected.add(r.indicators); + objectName = dimConf.indicator.objectName; + if (dimMap[objectName]) { + pt.store.indicatorSelected.add(Ext.clone(recMap[objectName])); + pt.util.multiselect.filterAvailable({store: pt.store.indicatorAvailable}, {store: pt.store.indicatorSelected}); } // Data elements pt.store.dataElementSelected.removeAll(); - if (Ext.isArray(r.dataElements)) { - pt.store.dataElementSelected.add(r.dataElements); + objectName = dimConf.dataElement.objectName; + if (dimMap[objectName]) { + pt.store.dataElementSelected.add(Ext.clone(recMap[objectName])); + pt.util.multiselect.filterAvailable({store: pt.store.dataElementAvailable}, {store: pt.store.dataElementSelected}); } // Data sets pt.store.dataSetSelected.removeAll(); - if (Ext.isArray(r.dataSets)) { - pt.store.dataSetSelected.add(r.dataSets); + objectName = dimConf.dataSet.objectName; + if (dimMap[objectName]) { + pt.store.dataSetSelected.add(Ext.clone(recMap[objectName])); + pt.util.multiselect.filterAvailable({store: pt.store.dataSetAvailable}, {store: pt.store.dataSetSelected}); } - // Fixed periods + // Periods pt.store.fixedPeriodSelected.removeAll(); - if (Ext.isArray(r.periods)) { - pt.store.fixedPeriodSelected.add(r.periods); - } - - // Relative periods - if (Ext.isObject(r.relativePeriods)) { - for (var key in r.relativePeriods) { - if (r.relativePeriods.hasOwnProperty(key) && pt.conf.period.relativePeriodParamKeys.hasOwnProperty(key)) { - var value = pt.conf.period.relativePeriodParamKeys[key]; - relativePeriod.valueComponentMap[value].setValue(!!r.relativePeriods[key]); - } - } - } - - // Organisation units: tree sync/async - - // User orgunit - userOrganisationUnit.setValue(r.userOrganisationUnit); - userOrganisationUnitChildren.setValue(r.userOrganisationUnitChildren); - - // Reset groupset stores - for (var key in groupSetIdSelectedStoreMap) { - if (groupSetIdSelectedStoreMap.hasOwnProperty(key)) { - var a = groupSetIdAvailableStoreMap[key], - s = groupSetIdSelectedStoreMap[key]; + pt.util.checkbox.setAllFalse(); + periodRecords = recMap[dimConf.period.objectName] || []; + for (var i = 0, peroid, checkbox; i < periodRecords.length; i++) { + period = periodRecords[i]; + checkbox = relativePeriod.valueComponentMap[period.id]; + if (checkbox) { + checkbox.setValue(true); + } + else { + fixedPeriodRecords.push(period); + } + } + pt.store.fixedPeriodSelected.add(fixedPeriodRecords); + pt.util.multiselect.filterAvailable({store: pt.store.fixedPeriodAvailable}, {store: pt.store.fixedPeriodSelected}); + + // Group sets + for (var key in dimensionIdSelectedStoreMap) { + if (dimensionIdSelectedStoreMap.hasOwnProperty(key)) { + var a = dimensionIdAvailableStoreMap[key], + s = dimensionIdSelectedStoreMap[key]; if (s.getCount() > 0) { - a.reload(); + a.reset(); s.removeAll(); } - } - } - - // Organisation unit group sets - if (Ext.isObject(r.organisationUnitGroupSets)) { - for (var key in r.organisationUnitGroupSets) { - if (r.organisationUnitGroupSets.hasOwnProperty(key)) { - groupSetIdSelectedStoreMap[key].add(r.organisationUnitGroupSets[key]); - pt.util.multiselect.filterAvailable({store: groupSetIdAvailableStoreMap[key]}, {store: groupSetIdSelectedStoreMap[key]}); - } - } - } - - // Data element group sets - if (Ext.isObject(r.dataElementGroupSets)) { - for (var key in r.dataElementGroupSets) { - if (r.dataElementGroupSets.hasOwnProperty(key)) { - groupSetIdSelectedStoreMap[key].add(r.dataElementGroupSets[key]); - pt.util.multiselect.filterAvailable({store: groupSetIdAvailableStoreMap[key]}, {store: groupSetIdSelectedStoreMap[key]}); + + if (recMap[key]) { + s.add(recMap[key]); + dv.util.multiselect.filterAvailable({store: a}, {store: s}); } } } @@ -3803,9 +3720,9 @@ pt.viewport.rowStore.removeAll(); pt.viewport.filterStore.removeAll(); - if (Ext.isArray(r.columnDimensions)) { - for (var i = 0, dim; i < r.columnDimensions.length; i++) { - dim = pt.conf.finals.dimension.objectNameMap[r.columnDimensions[i]]; + if (layout.columns) { + for (var i = 0, dim; i < layout.columns.length; i++) { + dim = dimConf.objectNameMap[layout.columns[i].dimension]; pt.viewport.colStore.add({ id: dim.dimensionName, @@ -3813,13 +3730,12 @@ }); pt.viewport.dimensionStore.remove(pt.viewport.dimensionStore.getById(dim.dimensionName)); - } } - if (Ext.isArray(r.rowDimensions)) { - for (var i = 0, dim; i < r.rowDimensions.length; i++) { - dim = pt.conf.finals.dimension.objectNameMap[r.rowDimensions[i]]; + if (layout.rows) { + for (var i = 0, dim; i < layout.rows.length; i++) { + dim = dimConf.objectNameMap[layout.rows[i].dimension]; pt.viewport.rowStore.add({ id: dim.dimensionName, @@ -3830,9 +3746,9 @@ } } - if (Ext.isArray(r.filterDimensions)) { - for (var i = 0, dim; i < r.filterDimensions.length; i++) { - dim = pt.conf.finals.dimension.objectNameMap[r.filterDimensions[i]]; + if (layout.filters) { + for (var i = 0, dim; i < layout.filters.length; i++) { + dim = dimConf.objectNameMap[layout.filters[i].dimension]; pt.viewport.filterStore.add({ id: dim.dimensionName, @@ -3844,42 +3760,35 @@ } // Options - pt.viewport.showTotals.setValue(r.totals); - 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.digitGroupSeparator.setValue(r.digitGroupSeparator); - - if (Ext.isObject(r.reportParams)) { - pt.viewport.reportingPeriod.setValue(r.reportParams.paramReportingPeriod); - pt.viewport.organisationUnit.setValue(r.reportParams.paramOrganisationUnit); - pt.viewport.parentOrganisationUnit.setValue(r.reportParams.paramParentOrganisationUnit); - } - - // Upgrade fixes - if (!Ext.isArray(r.organisationUnits) || !r.organisationUnits.length) { - if (Ext.isObject(r.reportParams) && r.reportParams.paramOrganisationUnit) { - userOrganisationUnit.setValue(true); - } - - if (Ext.isObject(r.reportParams) && r.reportParams.paramParentOrganisationUnit) { - userOrganisationUnit.setValue(true); - } - } - - // Organisation units: If fav has organisation units, execute from tree callback instead - 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)) { - treePanel.multipleExpand(key, r.parentGraphMap[key], true); + pt.viewport.optionsWindow.setOptions(layout); + + // Organisation units + if (recMap[dimConf.organisationUnit.objectName]) { + for (var i = 0, ouRecords = recMap[dimConf.organisationUnit.objectName]; i < ouRecords.length; i++) { + if (ouRecords[i].id === 'USER_ORGUNIT') { + isOu = true; + } + if (ouRecords[i].id === 'USER_ORGUNIT_CHILDREN') { + isOuc = true; + } + } + } + + userOrganisationUnit.setValue(isOu); + userOrganisationUnitChildren.setValue(isOuc); + + // If fav has organisation units, wait for tree callback before update + if (recMap[dimConf.organisationUnit.objectName] && graphMap) { + treePanel.numberOfRecords = pt.util.object.getLength(graphMap); + for (var key in graphMap) { + if (graphMap.hasOwnProperty(key)) { + treePanel.multipleExpand(key, graphMap[key], true); } } } else { treePanel.reset(); - update(); + //update(); } }; @@ -3951,5 +3860,6 @@ url: pt.conf.finals.ajax.path_pivot + 'initialize.action', success: function(r) { PT.app.init.onInitialize(r); - }}); + } + }); }); === 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-04-30 14:46:15 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js 2013-05-22 14:00:22 +0000 @@ -4,7 +4,7 @@ PT.core.getConfigs = function() { var conf = {}, - dim; + dimConf; conf.finals = { ajax: { @@ -61,6 +61,12 @@ dimensionName: 'dx', objectName: 'de' }, + operand: { + value: 'operand', + name: 'Operand', + dimensionName: 'dx', + objectName: 'dc' + }, dataSet: { value: 'dataSets', name: PT.i18n.data_sets, @@ -71,10 +77,7 @@ value: 'period', name: PT.i18n.periods, dimensionName: 'pe', - objectName: 'pe', - warning: { - filter: '...'//PT.i18n.wm_multiple_filter_period - } + objectName: 'pe' }, fixedPeriod: { value: 'periods' @@ -86,18 +89,11 @@ value: 'organisationUnits', name: PT.i18n.organisation_units, dimensionName: 'ou', - objectName: 'ou', - warning: { - filter: '...'//PT.i18n.wm_multiple_filter_orgunit - } + objectName: 'ou' }, - organisationUnitGroupSet: { - value: 'organisationUnitGroupSets', - objectName: 'ougs' - }, - dataElementGroupSet: { - value: 'dataElementGroupSets', - objectName: 'degs' + dimension: { + value: 'dimension' + //objectName: 'di' }, value: { value: 'value' @@ -108,18 +104,18 @@ } }; - dim = conf.finals.dimension; + dimConf = conf.finals.dimension; - dim.objectNameMap = {}; - dim.objectNameMap[dim.data.objectName] = dim.data; - 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; - dim.objectNameMap[dim.dataElementGroupSet.objectName] = dim.dataElementGroupSet; + dimConf.objectNameMap = {}; + dimConf.objectNameMap[dimConf.data.objectName] = dimConf.data; + dimConf.objectNameMap[dimConf.indicator.objectName] = dimConf.indicator; + dimConf.objectNameMap[dimConf.dataElement.objectName] = dimConf.dataElement; + dimConf.objectNameMap[dimConf.operand.objectName] = dimConf.operand; + dimConf.objectNameMap[dimConf.dataSet.objectName] = dimConf.dataSet; + dimConf.objectNameMap[dimConf.category.objectName] = dimConf.category; + dimConf.objectNameMap[dimConf.period.objectName] = dimConf.period; + dimConf.objectNameMap[dimConf.organisationUnit.objectName] = dimConf.organisationUnit; + dimConf.objectNameMap[dimConf.dimension.objectName] = dimConf.dimension; conf.period = { relativePeriods: { @@ -447,12 +443,16 @@ return 0; }); - // Sort object items order + // Sort object items, ids for (var i = 0, dim; i < dimensions.length; i++) { dim = dimensions[i]; if (dim.items) { - dimensions[i].items.sort(); + dimensions[i].items = util.array.sortDimensions(dim.items, 'id'); + } + + if (dim.ids) { + dimensions[i].ids = dim.ids.sort(); } } @@ -507,91 +507,221 @@ }; util.pivot = { - createTable: function(settings, pt) { - var options = settings.options, - extendLayout, + getExtendedLayout: function(layout) { + var dimConf = pt.conf.finals.dimension, + layout = Ext.clone(layout), + xLayout = { + columns: [], + rows: [], + filters: [], + + columnObjectNames: [], + columnDimensionNames: [], + rowObjectNames: [], + rowDimensionNames: [], + + // Axis + axisDimensions: [], + axisObjectNames: [], + axisDimensionNames: [], + + // For param string + sortedAxisDimensionNames: [], + + // Filter + filterDimensions: [], + filterObjectNames: [], + filterDimensionNames: [], + + // For param string + sortedFilterDimensions: [], + + // All + dimensions: [], + objectNames: [], + dimensionNames: [], + + // Object name maps + objectNameDimensionsMap: {}, + objectNameItemsMap: {}, + objectNameIdsMap: {}, + + // Dimension name maps + dimensionNameDimensionsMap: {}, + dimensionNameItemsMap: {}, + dimensionNameIdsMap: {}, + + // For param string + dimensionNameSortedIdsMap: {} + }; + + // Columns, rows, filters + if (layout.columns) { + for (var i = 0, dim, items, xDim; i < layout.columns.length; i++) { + dim = layout.columns[i]; + items = dim.items; + xDim = {}; + + xDim.dimension = dim.dimension; + xDim.objectName = dim.dimension; + xDim.dimensionName = dimConf.objectNameMap[dim.dimension].dimensionName; + + if (items) { + xDim.items = items; + xDim.ids = []; + + for (var j = 0; j < items.length; j++) { + xDim.ids.push(items[j].id); + } + } + + xLayout.columns.push(xDim); + + xLayout.columnObjectNames.push(xDim.objectName); + xLayout.columnDimensionNames.push(xDim.dimensionName); + + xLayout.axisDimensions.push(xDim); + xLayout.axisObjectNames.push(xDim.objectName); + xLayout.axisDimensionNames.push(dimConf.objectNameMap[xDim.objectName].dimensionName); + + xLayout.objectNameDimensionsMap[xDim.objectName] = xDim; + xLayout.objectNameItemsMap[xDim.objectName] = xDim.items; + xLayout.objectNameIdsMap[xDim.objectName] = xDim.ids; + } + } + + if (layout.rows) { + for (var i = 0, dim, items, xDim; i < layout.rows.length; i++) { + dim = layout.rows[i]; + items = dim.items; + xDim = {}; + + xDim.dimension = dim.dimension; + xDim.objectName = dim.dimension; + xDim.dimensionName = dimConf.objectNameMap[dim.dimension].dimensionName; + + if (items) { + xDim.items = items; + xDim.ids = []; + + for (var j = 0; j < items.length; j++) { + xDim.ids.push(items[j].id); + } + } + + xLayout.rows.push(xDim); + + xLayout.rowObjectNames.push(xDim.objectName); + xLayout.rowDimensionNames.push(xDim.dimensionName); + + xLayout.axisDimensions.push(xDim); + xLayout.axisObjectNames.push(xDim.objectName); + xLayout.axisDimensionNames.push(dimConf.objectNameMap[xDim.objectName].dimensionName); + + xLayout.objectNameDimensionsMap[xDim.objectName] = xDim; + xLayout.objectNameItemsMap[xDim.objectName] = xDim.items; + xLayout.objectNameIdsMap[xDim.objectName] = xDim.ids; + } + } + + if (layout.filters) { + for (var i = 0, dim, items, xDim; i < layout.filters.length; i++) { + dim = layout.filters[i]; + items = dim.items; + xDim = {}; + + xDim.dimension = dim.dimension; + xDim.objectName = dim.dimension; + xDim.dimensionName = dimConf.objectNameMap[dim.dimension].dimensionName; + + if (items) { + xDim.items = items; + xDim.ids = []; + + for (var j = 0; j < items.length; j++) { + xDim.ids.push(items[j].id); + } + } + + xLayout.filters.push(xDim); + + xLayout.filterDimensions.push(xDim); + xLayout.filterObjectNames.push(xDim.objectName); + xLayout.filterDimensionNames.push(dimConf.objectNameMap[xDim.objectName].dimensionName); + + xLayout.objectNameDimensionsMap[xDim.objectName] = xDim; + xLayout.objectNameItemsMap[xDim.objectName] = xDim.items; + xLayout.objectNameIdsMap[xDim.objectName] = xDim.ids; + } + } + + // Unique dimension names + xLayout.axisDimensionNames = Ext.Array.unique(xLayout.axisDimensionNames); + xLayout.filterDimensionNames = Ext.Array.unique(xLayout.filterDimensionNames); + + xLayout.columnDimensionNames = Ext.Array.unique(xLayout.columnDimensionNames); + xLayout.rowDimensionNames = Ext.Array.unique(xLayout.rowDimensionNames); + xLayout.filterDimensionNames = Ext.Array.unique(xLayout.filterDimensionNames); + + // For param string + xLayout.sortedAxisDimensionNames = Ext.clone(xLayout.axisDimensionNames).sort(); + xLayout.sortedFilterDimensions = pt.util.array.sortDimensions(Ext.clone(xLayout.filterDimensions)); + + // All + xLayout.dimensions = [].concat(xLayout.axisDimensions, xLayout.filterDimensions); + xLayout.objectNames = [].concat(xLayout.axisObjectNames, xLayout.filterObjectNames); + xLayout.dimensionNames = [].concat(xLayout.axisDimensionNames, xLayout.filterDimensionNames); + + // Dimension name maps + for (var i = 0, dimName; i < xLayout.dimensionNames.length; i++) { + dimName = xLayout.dimensionNames[i]; + + xLayout.dimensionNameDimensionsMap[dimName] = []; + xLayout.dimensionNameItemsMap[dimName] = []; + xLayout.dimensionNameIdsMap[dimName] = []; + } + + for (var i = 0, xDim; i < xLayout.dimensions.length; i++) { + xDim = xLayout.dimensions[i]; + + xLayout.dimensionNameDimensionsMap[xDim.dimensionName].push(xDim); + xLayout.dimensionNameItemsMap[xDim.dimensionName] = xLayout.dimensionNameItemsMap[xDim.dimensionName].concat(xDim.items); + xLayout.dimensionNameIdsMap[xDim.dimensionName] = xLayout.dimensionNameIdsMap[xDim.dimensionName].concat(xDim.ids); + } + + // For param string + for (var key in xLayout.dimensionNameIdsMap) { + if (xLayout.dimensionNameIdsMap.hasOwnProperty(key)) { + xLayout.dimensionNameSortedIdsMap[key] = Ext.clone(xLayout.dimensionNameIdsMap[key]).sort(); + } + } + + return xLayout; + }, + + createTable: function(layout, pt) { + var dimConf = pt.conf.finals.dimension, getSyncronizedXLayout, getParamString, - validateResponse, - extendResponse, - extendAxis, + getExtendedResponse, + getExtendedAxis, validateUrl, getTableHtml, - initialize, - - dimConf = pt.conf.finals.dimension; - - extendLayout = function(settings) { - var xLayout = Ext.clone(settings), - addDimensions, - addDimensionNames, - addSortedDimensions, - addSortedFilterDimensions; - - addDimensions = function() { - xLayout.dimensions = [].concat(Ext.clone(xLayout.col) || [], Ext.clone(xLayout.row) || []); - }(); - - addDimensionNames = function() { - var a = [], - dimensions = Ext.clone(xLayout.dimensions) || []; - - for (var i = 0; i < dimensions.length; i++) { - a.push(dimensions[i].dimensionName); - } - - xLayout.dimensionNames = a; - }(); - - addSortedDimensions = function() { - xLayout.sortedDimensions = pt.util.array.sortDimensions(Ext.clone(xLayout.dimensions) || []); - }(); - - addSortedFilterDimensions = function() { - xLayout.sortedFilterDimensions = pt.util.array.sortDimensions(Ext.clone(xLayout.filter) || []); - }(); - - addNameItemsMap = function() { - var map = {}, - dimensions = Ext.clone(xLayout.dimensions) || []; - - for (var i = 0, dim; i < dimensions.length; i++) { - dim = dimensions[i]; - - map[dim.dimensionName] = dim.items || []; - } - - xLayout.nameItemsMap = map; - }(); - - return xLayout; - }; + initialize; getSyncronizedXLayout = function(xLayout, response) { - var getHeaderNames, - - headerNames, - newLayout; - - getHeaderNames = function() { - var a = []; - - for (var i = 0; i < response.headers.length; i++) { - a.push(response.headers[i].name); - } - - return a; - }; - - removeDimensionFromLayout = function(dimensionName) { - var getCleanAxis; - - getAxis = function(axis) { - var axis = Ext.clone(axis), - dimension; + var removeDimensionFromXLayout, + getHeaderNames; + + removeDimensionFromXLayout = function(objectName) { + var getUpdatedAxis; + + getUpdatedAxis = function(axis) { + var dimension; + axis = Ext.clone(axis); for (var i = 0; i < axis.length; i++) { - if (axis[i].dimensionName === dimensionName) { + if (axis[i].dimension === objectName) { dimension = axis[i]; } } @@ -603,93 +733,98 @@ return axis; }; - if (settings.col) { - settings.col = getAxis(settings.col); - } - if (settings.row) { - settings.row = getAxis(settings.row); - } - if (settings.filter) { - settings.filter = getAxis(settings.filter); - } - }; - - headerNames = getHeaderNames(); - - // remove co from settings if it does not exist in response - if (Ext.Array.contains(xLayout.dimensionNames, dimConf.category.dimensionName) && !(Ext.Array.contains(headerNames, dimConf.category.dimensionName))) { - removeDimensionFromLayout(dimConf.category.dimensionName); - - newLayout = pt.api.Layout(settings); - - if (!newLayout) { - return; - } - - return extendLayout(newLayout); - } - else { + if (xLayout.columns) { + xLayout.columns = getUpdatedAxis(xLayout.columns); + } + if (xLayout.rows) { + xLayout.rows = getUpdatedAxis(xLayout.rows); + } + if (xLayout.filters) { + xLayout.filters = getUpdatedAxis(xLayout.filters); + } + }; + + getHeaderNames = function() { + var headerNames = []; + + for (var i = 0; i < response.headers.length; i++) { + headerNames.push(response.headers[i].name); + } + + return headerNames; + }; + + return function() { + var headerNames = getHeaderNames(), + co = dimConf.category.objectName, + layout; + + // Remove co from layout if it does not exist in response + if (Ext.Array.contains(xLayout.axisDimensionNames, co) && !(Ext.Array.contains(headerNames, co))) { + removeDimensionFromXLayout(co); + + layout = pt.api.layout.Layout(xLayout); + + return layout ? pt.util.pivot.getExtendedLayout(layout) : null; + } + return xLayout; - } + }(); }; getParamString = function(xLayout) { - var sortedDimensions = xLayout.sortedDimensions, + var sortedAxisDimensionNames = xLayout.sortedAxisDimensionNames, sortedFilterDimensions = xLayout.sortedFilterDimensions, - paramString = '?'; - - for (var i = 0, sortedDim; i < sortedDimensions.length; i++) { - sortedDim = sortedDimensions[i]; - - paramString += 'dimension=' + sortedDim.dimensionName; - - if (sortedDim.dimensionName !== pt.conf.finals.dimension.category.dimensionName) { - paramString += ':' + sortedDim.items.join(';'); + dimensionNameSortedIdsMap = xLayout.dimensionNameSortedIdsMap, + paramString = '?', + dimConf = pt.conf.finals.dimension, + addCategoryDimension = false, + map = xLayout.dimensionNameItemsMap, + dx = dimConf.indicator.dimensionName; + + for (var i = 0, dimName, items; i < sortedAxisDimensionNames.length; i++) { + dimName = sortedAxisDimensionNames[i]; + + paramString += 'dimension=' + dimName; + + items = Ext.clone(dimensionNameSortedIdsMap[dimName]); + + if (dimName === dx) { + 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); + } + } + + items = Ext.Array.unique(items); } - if (i < (sortedDimensions.length - 1)) { + paramString += ':' + items.join(';'); + + if (i < (sortedAxisDimensionNames.length - 1)) { paramString += '&'; } } - if (sortedFilterDimensions) { - for (var i = 0, sortedFilterDim; i < sortedFilterDimensions.length; i++) { - sortedFilterDim = sortedFilterDimensions[i]; - - paramString += '&filter=' + sortedFilterDim.dimensionName + ':' + sortedFilterDim.items.join(';'); + if (addCategoryDimension) { + paramString += '&dimension=' + pt.conf.finals.dimension.category.dimensionName; + } + + if (Ext.isArray(sortedFilterDimensions) && sortedFilterDimensions.length) { + for (var i = 0, dim; i < sortedFilterDimensions.length; i++) { + dim = sortedFilterDimensions[i]; + + paramString += '&filter=' + dim.dimensionName + ':' + dim.ids.join(';'); } } return paramString; }; - validateResponse = function(response) { - if (!(response && Ext.isObject(response))) { - alert('Data invalid'); - return false; - } - - if (!(response.headers && Ext.isArray(response.headers) && response.headers.length)) { - alert('Data invalid'); - return false; - } - - if (!(Ext.isNumber(response.width) && response.width > 0 && - Ext.isNumber(response.height) && response.height > 0 && - Ext.isArray(response.rows) && response.rows.length > 0)) { - alert('No values found'); - return false; - } - - if (response.headers.length !== response.rows[0].length) { - alert('Data invalid'); - return false; - } - - return true; - }; - - extendResponse = function(response, xLayout) { + getExtendedResponse = function(response, xLayout) { response.nameHeaderMap = {}; response.idValueMap = {}; @@ -711,7 +846,7 @@ header.items = [].concat(response.metaData[pt.conf.finals.dimension.period.dimensionName]); } else { - header.items = xLayout.nameItemsMap[header.name]; + header.items = xLayout.dimensionNameIdsMap[header.name]; } header.size = header.items.length; @@ -728,7 +863,7 @@ var createValueIds = function() { var valueHeaderIndex = response.nameHeaderMap[pt.conf.finals.dimension.value.value].index, - dimensionNames = xLayout.dimensionNames, + dimensionNames = xLayout.axisDimensionNames, idIndexOrder = []; // idIndexOrder @@ -752,12 +887,13 @@ return response; }; - extendAxis = function(type, axis, xResponse) { - if (!axis || (Ext.isArray(axis) && !axis.length)) { + getExtendedAxis = function(type, dimensionNames, xResponse) { + if (!dimensionNames || (Ext.isArray(dimensionNames) && !dimensionNames.length)) { return; } - var axis = Ext.clone(axis), + var dimensionNames = Ext.clone(dimensionNames), + mDimensions = [], spanType = type === 'col' ? 'colSpan' : 'rowSpan', nCols = 1, aNumCols = [], @@ -769,11 +905,17 @@ aAllObjects = [], aUniqueIds; + for (var i = 0; i < dimensionNames.length; i++) { + mDimensions.push({ + dimensionName: dimensionNames[i] + }); + } + aUniqueIds = function() { var a = []; - for (var i = 0, dim; i < axis.length; i++) { - dim = axis[i]; + for (var i = 0, dim; i < mDimensions.length; i++) { + dim = mDimensions[i]; a.push(xResponse.nameHeaderMap[dim.dimensionName].items); } @@ -804,7 +946,7 @@ aSpan.push(nCols); //if just one item and top level, span all } else { - if (options.hideEmptyRows && type === 'row') { + if (layout.hideEmptyRows && type === 'row') { aSpan.push(nCols / aAccNumCols[i]); } else { @@ -870,7 +1012,7 @@ aColIds.push(id); } - //aColIds = [ aaaaaaaaBBBBBBBBccccccc, aaaaaaaaaccccccccccbbbbbbbbbb, ... ] + //aColIds = [ abc, bcd, ... ] @@ -925,7 +1067,7 @@ return { type: type, - items: axis, + items: mDimensions, xItems: { unique: aUniqueIds, gui: aGuiItems, @@ -990,7 +1132,7 @@ totalColObjects = [], htmlArray; - getTdHtml = function(options, config) { + getTdHtml = function(config) { var cls, colSpan, rowSpan, @@ -1008,20 +1150,20 @@ colSpan = config.colSpan ? 'colspan="' + config.colSpan + '"' : ''; rowSpan = config.rowSpan ? 'rowspan="' + config.rowSpan + '"' : ''; htmlValue = config.collapsed ? ' ' : config.htmlValue || config.value || ' '; - htmlValue = config.type !== 'dimension' ? pt.util.number.pp(htmlValue, options.digitGroupSeparator) : htmlValue; - displayDensity = pt.conf.pivot.displayDensity[config.displayDensity] || pt.conf.pivot.displayDensity[options.displayDensity]; - fontSize = pt.conf.pivot.fontSize[config.fontSize] || pt.conf.pivot.fontSize[options.fontSize]; + htmlValue = config.type !== 'dimension' ? pt.util.number.pp(htmlValue, layout.digitGroupSeparator) : htmlValue; + displayDensity = pt.conf.pivot.displayDensity[config.displayDensity] || pt.conf.pivot.displayDensity[layout.displayDensity]; + fontSize = pt.conf.pivot.fontSize[config.fontSize] || pt.conf.pivot.fontSize[layout.fontSize]; return '' + htmlValue + ''; }; doSubTotals = function(xAxis) { - return !!options.showSubTotals && xAxis && xAxis.dims > 1; + return !!layout.showSubTotals && xAxis && xAxis.dims > 1; //var multiItemDimension = 0, //unique; - //if (!(options.showSubTotals && xAxis && xAxis.dims > 1)) { + //if (!(layout.showSubTotals && xAxis && xAxis.dims > 1)) { //return false; //} @@ -1037,7 +1179,7 @@ }; doTotals = function() { - return !!options.showTotals; + return !!layout.showTotals; }; getColAxisHtmlArray = function() { @@ -1045,7 +1187,7 @@ getEmptyHtmlArray; getEmptyHtmlArray = function() { - return (xColAxis && xRowAxis) ? getTdHtml(options, {cls: 'pivot-dim-empty', colSpan: xRowAxis.dims, rowSpan: xColAxis.dims}) : ''; + return (xColAxis && xRowAxis) ? getTdHtml({cls: 'pivot-dim-empty', colSpan: xRowAxis.dims, rowSpan: xColAxis.dims}) : ''; }; if (!(xColAxis && Ext.isObject(xColAxis))) { @@ -1063,7 +1205,7 @@ for (var j = 0, id; j < dimItems.length; j++) { id = dimItems[j]; - dimHtml.push(getTdHtml(options, { + dimHtml.push(getTdHtml({ type: 'dimension', cls: 'pivot-dim', colSpan: colSpan, @@ -1071,7 +1213,7 @@ })); if (doSubTotals(xColAxis) && i === 0) { - dimHtml.push(getTdHtml(options, { + dimHtml.push(getTdHtml({ type: 'dimensionSubtotal', cls: 'pivot-dim-subtotal', rowSpan: xColAxis.dims @@ -1080,7 +1222,7 @@ if (doTotals()) { if (i === 0 && j === (dimItems.length - 1)) { - dimHtml.push(getTdHtml(options, { + dimHtml.push(getTdHtml({ type: 'dimensionTotal', cls: 'pivot-dim-total', rowSpan: xColAxis.dims, @@ -1199,7 +1341,7 @@ // Hide empty rows (dims/values/totals) if (xColAxis && xRowAxis) { - if (options.hideEmptyRows) { + if (layout.hideEmptyRows) { for (var i = 0, valueRow, empty, parent; i < valueObjects.length; i++) { valueRow = valueObjects[i]; empty = []; @@ -1402,7 +1544,7 @@ row = []; for (var j = 0; j < mergedObjects[i].length; j++) { - row.push(getTdHtml(options, mergedObjects[i][j])); + row.push(getTdHtml(mergedObjects[i][j])); } a.push(row); @@ -1469,7 +1611,7 @@ // Total col html items for (var i = 0; i < xTotalColObjects.length; i++) { - a.push(getTdHtml(options, xTotalColObjects[i])); + a.push(getTdHtml(xTotalColObjects[i])); } } @@ -1491,7 +1633,7 @@ } if (xColAxis && xRowAxis) { - a.push(getTdHtml(options, { + a.push(getTdHtml({ type: 'valueGrandTotal', cls: 'pivot-value-grandtotal', htmlValue: Ext.Array.contains(empty, false) ? pt.util.number.roundIf(total, 1).toString() : ' ', @@ -1512,7 +1654,7 @@ if (doTotals()) { if (xRowAxis) { - dimTotalArray = [getTdHtml(options, { + dimTotalArray = [getTdHtml({ type: 'dimensionSubtotal', cls: 'pivot-dim-total', colSpan: xRowAxis.dims, @@ -1551,15 +1693,19 @@ xColAxis, xRowAxis; - xLayout = extendLayout(settings); + // Extended layout + xLayout = util.pivot.getExtendedLayout(layout); + // Param string pt.paramString = getParamString(xLayout); url = pt.init.contextPath + '/api/analytics.json' + pt.paramString; + // Validate request size if (!validateUrl(url)) { return; } + // Show load mask pt.util.mask.showMask(pt.viewport); Ext.Ajax.request({ @@ -1578,13 +1724,14 @@ }, success: function(r) { var html, - response = Ext.decode(r.responseText); + response = pt.api.response.Response(Ext.decode(r.responseText)); - if (!validateResponse(response)) { + if (!response) { pt.util.mask.hideMask(); return; } + // Synchronize xLayout xLayout = getSyncronizedXLayout(xLayout, response); if (!xLayout) { @@ -1592,13 +1739,17 @@ return; } - xResponse = extendResponse(response, xLayout); - - xColAxis = extendAxis('col', xLayout.col, xResponse); - xRowAxis = extendAxis('row', xLayout.row, xResponse); - + // Extended response + xResponse = getExtendedResponse(response, xLayout); + + // Extended axes + xColAxis = getExtendedAxis('col', xLayout.columnDimensionNames, xResponse); + xRowAxis = getExtendedAxis('row', xLayout.rowDimensionNames, xResponse); + + // Create html html = getTableHtml(xColAxis, xRowAxis, xResponse); + // Update viewport pt.viewport.centerRegion.removeAll(true); pt.viewport.centerRegion.update(html); @@ -1609,8 +1760,11 @@ pt.viewport.downloadButton.enable(); } + pt.layout = layout; pt.xLayout = xLayout; pt.xResponse = xResponse; +console.log("xResponse", xResponse); +console.log("xLayout", xLayout); } }); @@ -1624,15 +1778,18 @@ } Ext.Ajax.request({ - url: pt.baseUrl + '/api/reportTables/' + id + '.json?links=false', + url: pt.baseUrl + '/api/reportTables/' + id + '.json?links=false&viewClass=dimensional', method: 'GET', failure: function(r) { pt.util.mask.hideMask(); alert(r.responseText); }, success: function(r) { - var response = Ext.decode(r.responseText); - pt.viewport.setFavorite(response); + var layout = pt.api.layout.Layout(Ext.decode(r.responseText)); + + if (layout) { + pt.viewport.setFavorite(layout); + } } }); } @@ -1642,152 +1799,293 @@ }; PT.core.getAPI = function(pt) { - var api = {}; - - api.Layout = function(config) { - var col, - row, - filter, - - removeEmptyDimensions, - getValidatedAxis, - validateLayout, - - defaultOptions = { - showTotals: true, - showSubTotals: true, - hideEmptyRows: false, - displayDensity: 'normal', - fontSize: 'normal', - digitGroupSeparator: 'space', - reportingPeriod: false, - organisationUnit: false, - parentOrganisationUnit: false - }; - - removeEmptyDimensions = function(axis) { - if (!axis) { - return; - } - - for (var i = 0, dimension, remove; i < axis.length; i++) { - remove = false; - dimension = axis[i]; - - if (dimension.dimensionName !== pt.conf.finals.dimension.category.dimensionName) { - if (!(Ext.isArray(dimension.items) && dimension.items.length)) { - remove = true; - } - else { - for (var j = 0; j < dimension.items.length; j++) { - if (!Ext.isString(dimension.items[j])) { - remove = true; - } - } - } - } - - if (remove) { - axis = Ext.Array.erase(axis, i, 1); - i = i - 1; - } - } - - return axis; - }; - - getValidatedAxis = function(axis) { - if (!(axis && Ext.isArray(axis) && axis.length)) { - return; - } - - for (var i = 0, dimension; i < axis.length; i++) { - dimension = axis[i]; - - if (!(Ext.isObject(dimension) && Ext.isString(dimension.dimensionName))) { - return; - } - } - - axis = removeEmptyDimensions(axis); - - return axis.length ? axis : null; - }; - - getValidatedOptions = function(options) { - if (!(options && Ext.isObject(options))) { - return defaultOptions; - } - - options.showTotals = Ext.isDefined(options.showTotals) ? options.showTotals : defaultOptions.showTotals; - options.showSubTotals = Ext.isDefined(options.showSubTotals) ? options.showSubTotals : defaultOptions.showSubTotals; - options.hideEmptyRows = Ext.isDefined(options.hideEmptyRows) ? options.hideEmptyRows : defaultOptions.hideEmptyRows; - options.displayDensity = options.displayDensity || defaultOptions.displayDensity; - options.fontSize = options.fontSize || defaultOptions.fontSize; - options.digitGroupSeparator = Ext.isDefined(options.digitGroupSeparator) ? options.digitGroupSeparator : defaultOptions.digitGroupSeparator; - options.reportingPeriod = Ext.isDefined(options.reportingPeriod) ? options.reportingPeriod : defaultOptions.reportingPeriod; - options.organisationUnit = Ext.isDefined(options.organisationUnit) ? options.organisationUnit : defaultOptions.organisationUnit; - options.parentOrganisationUnit = Ext.isDefined(options.parentOrganisationUnit) ? options.parentOrganisationUnit : defaultOptions.parentOrganisationUnit; - - return options; - }; - - validateLayout = function() { - var a = [].concat(Ext.clone(col), Ext.clone(row), Ext.clone(filter)), - dimensionNames = [], + var dimConf = pt.conf.finals.dimension, + api = { + layout: { + Record: null, + Dimension: null, + Layout: null + }, + response: { + Header: null, + Response: null + } + }; + + // Layout + + api.layout.Record = function(config) { + var record = {}; + + // id: string + + return function() { + if (!Ext.isObject(config)) { + console.log('Record config is not an object: ' + config); + return; + } + + if (!Ext.isString(config.id)) { + alert('Record id is not text: ' + config); + return; + } + + record.id = config.id; + + if (Ext.isString(config.name)) { + record.name = config.name; + } + + return Ext.clone(record); + }(); + }; + + api.layout.Dimension = function(config) { + var dimension = {}; + + // dimension: string + + // items: [Record] + + return function() { + if (!Ext.isObject(config)) { + console.log('Dimension config is not an object: ' + config); + return; + } + + if (!Ext.isString(config.dimension)) { + console.log('Dimension name is not text: ' + config); + return; + } + + if (config.dimension !== pt.conf.finals.dimension.category.objectName) { + var records = []; + + if (!Ext.isArray(config.items)) { + console.log('Dimension items is not an array: ' + config); + return; + } + + for (var i = 0; i < config.items.length; i++) { + record = api.layout.Record(config.items[i]); + + if (record) { + records.push(record); + } + } + + config.items = records; + + if (!config.items.length) { + console.log('Dimension has no valid items: ' + config); + return; + } + } + + dimension.dimension = config.dimension; + dimension.items = config.items; + + return Ext.clone(dimension); + }(); + }; + + api.layout.Layout = function(config) { + var layout = {}; + + // columns: [Dimension] + + // rows: [Dimension] + + // filters: [Dimension] + + // showTotals: boolean (true) + + // showSubTotals: boolean (true) + + // hideEmptyRows: boolean (false) + + // displayDensity: string ('normal') - 'compact', 'normal', 'comfortable' + + // fontSize: string ('normal') - 'small', 'normal', 'large' + + // digitGroupSeparator: string ('space') - 'none', 'comma', 'space' + + // userOrganisationUnit: boolean (false) + + // userOrganisationUnitChildren: boolean (false) + + // parentGraphMap: string ('') + + // reportingPeriod: boolean (false) //report tables only + + // organisationUnit: boolean (false) //report tables only + + // parentOrganisationUnit: boolean (false) //report tables only + + var getValidatedDimensionArray = function(dimensionArray) { + var dimensions = []; + + if (!(dimensionArray && Ext.isArray(dimensionArray) && dimensionArray.length)) { + return; + } + + for (var i = 0, dimension; i < dimensionArray.length; i++) { + dimension = api.layout.Dimension(dimensionArray[i]); + + if (dimension) { + dimensions.push(dimension); + } + } + + dimensionArray = dimensions; + + return dimensionArray.length ? dimensionArray : null; + }; + + return function() { + var a = [], + objectNames = [], dimConf = pt.conf.finals.dimension; - if (!(col || row)) { + config.columns = getValidatedDimensionArray(config.columns); + config.rows = getValidatedDimensionArray(config.rows); + config.filters = getValidatedDimensionArray(config.filters); + + // Config must be an object + if (!(config && Ext.isObject(config))) { + alert(pt.el + ': Layout config is not an object'); + return; + } + + // At least one dimension specified as column or row + if (!(config.columns || config.rows)) { alert(PT.i18n.at_least_one_dimension_must_be_specified_as_row_or_column); return; } - // Selected dimension names + // At least one period specified + a = [].concat(config.columns, config.rows, config.filters); for (var i = 0; i < a.length; i++) { if (a[i]) { - dimensionNames.push(a[i].dimensionName); + objectNames.push(a[i].dimension); } } - if (!Ext.Array.contains(dimensionNames, dimConf.period.dimensionName)) { + if (!Ext.Array.contains(objectNames, dimConf.period.objectName)) { alert(PT.i18n.at_least_one_period_must_be_specified_as_column_row_or_filter); return; } - return true; - }; - - return function() { - var obj = {}; + // Layout + layout.columns = config.columns; + layout.rows = config.rows; + layout.filters = config.filters; + + // Properties + layout.showTotals = Ext.isBoolean(config.totals) ? config.totals : (Ext.isBoolean(config.showTotals) ? config.showTotals : true); + layout.showSubTotals = Ext.isBoolean(config.subtotals) ? config.subtotals : (Ext.isBoolean(config.showSubTotals) ? config.showSubTotals : true); + layout.hideEmptyRows = Ext.isBoolean(config.hideEmptyRows) ? config.hideEmptyRows : false; + + layout.displayDensity = Ext.isString(config.displayDensity) && !Ext.isEmpty(config.displayDensity) ? config.displayDensity : 'normal'; + layout.fontSize = Ext.isString(config.fontSize) && !Ext.isEmpty(config.fontSize) ? config.fontSize : 'normal'; + layout.digitGroupSeparator = Ext.isString(config.digitGroupSeparator) && !Ext.isEmpty(config.digitGroupSeparator) ? config.digitGroupSeparator : 'space'; + + layout.userOrganisationUnit = Ext.isBoolean(config.userOrganisationUnit) ? config.userOrganisationUnit : false; + layout.userOrganisationUnitChildren = Ext.isBoolean(config.userOrganisationUnitChildren) ? config.userOrganisationUnitChildren : false; + + layout.parentGraphMap = Ext.isString(config.parentGraphMap) ? config.parentGraphMap : ''; + + layout.reportingPeriod = Ext.isBoolean(config.reportingPeriod) ? config.reportingPeriod : false; + layout.organisationUnit = Ext.isBoolean(config.organisationUnit) ? config.organisationUnit : false; + layout.parentOrganisationUnit = Ext.isBoolean(config.parentOrganisationUnit) ? config.parentOrganisationUnit : false; + + + return Ext.clone(layout); + }(); + }; + + // Response + + api.response.Header = function(config) { + var header = {}; + + // name: string + + // meta: boolean + + return function() { + if (!Ext.isObject(config)) { + console.log('Header is not an object: ' + config); + return; + } + + if (!Ext.isString(config.name)) { + console.log('Header name is not text: ' + config); + return; + } + + if (!Ext.isBoolean(config.meta)) { + console.log('Header meta is not boolean: ' + config); + return; + } + + header.name = config.name; + header.meta = config.meta; + + return Ext.clone(header); + }(); + }; + + api.response.Response = function(config) { + var response = {}; + + // headers: [Header] + + return function() { + var headers = []; if (!(config && Ext.isObject(config))) { - console.log('Layout config is not an object'); - return; - } - - col = getValidatedAxis(config.col); - row = getValidatedAxis(config.row); - filter = getValidatedAxis(config.filter); - - if (!validateLayout()) { - return; - } - - if (col) { - obj.col = col; - } - if (row) { - obj.row = row; - } - if (filter) { - obj.filter = filter; - } - - obj.objects = config.objects; - - obj.options = getValidatedOptions(config.options); - - return obj; + alert('Data response invalid'); + return false; + } + + if (!(config.headers && Ext.isArray(config.headers))) { + alert('Data response invalid'); + return false; + } + + for (var i = 0, header; i < config.headers.length; i++) { + header = api.response.Header(config.headers[i]); + + if (header) { + headers.push(header); + } + } + + config.headers = headers; + + if (!config.headers.length) { + alert('No valid response headers'); + return; + } + + if (!(Ext.isArray(config.rows) && config.rows.length > 0)) { + alert('No values found'); + return false; + } + + if (config.headers.length !== config.rows[0].length) { + alert('Data invalid'); + return false; + } + + response.headers = config.headers; + response.metaData = config.metaData; + response.width = config.width; + response.height = config.height; + response.rows = config.rows; + + return response; }(); }; === modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/styles/style.css' --- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/styles/style.css 2013-04-22 13:26:31 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/styles/style.css 2013-05-15 09:45:38 +0000 @@ -234,8 +234,7 @@ .pt-panel-title-data, .pt-panel-title-period, .pt-panel-title-organisationunit, -.pt-panel-title-organisationunitgroupset, -.pt-panel-title-dataelementgroupset { +.pt-panel-title-dimension { height: 17px; background-repeat: no-repeat; padding-left: 20px @@ -250,10 +249,7 @@ .pt-panel-title-organisationunit { background-image: url(../images/organisationunit.png); } -.pt-panel-title-organisationunitgroupset { - background-image: url(../images/organisationunitgroupset.png); -} -.pt-panel-title-dataelementgroupset { +.pt-panel-title-dimension { background-image: url(../images/dataelementgroupset.png); } === modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/jsonInitialize.vm' --- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/jsonInitialize.vm 2013-04-15 20:44:56 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/jsonInitialize.vm 2013-05-15 09:45:38 +0000 @@ -4,8 +4,5 @@ "ou":{"id":"$currentUser.getOrganisationUnit().uid","name":"$currentUser.getOrganisationUnit().name"}, "ouc":[#foreach($ou in $currentUser.getOrganisationUnit().getSortedChildren()){"id":"$ou.uid","name":"$ou.name"}#if($velocityCount < $oucSize),#end#end]}, "rootNodes":[#foreach($node in $rootNodes){"id": "$!{node.uid}","text": "$!encoder.jsonEncode( ${node.name} )","level": 1,"hasChildrenWithCoordinates": $!{node.hasChildrenWithCoordinates()},"expanded": true}#if($velocityCount<$rootNodes.size()),#end#end], -"ougs":[#foreach($ougs in $organisationUnitGroupSets){"id":"$!{ougs.uid}","name":"$!encoder.jsonEncode($!{ougs.name})","items":[#foreach($oug in $ougs.getSortedGroups()){"id":"$!{oug.uid}","name":"$!encoder.jsonEncode($!{oug.name})"}#if($velocityCount<$ougs.getSortedGroups().size()),#end#end]}#if($velocityCount<$organisationUnitGroupSets.size()),#end#end], -"degs":[#foreach($degs in $dataElementGroupSets){"id":"$!{degs.uid}","name":"$!encoder.jsonEncode($!{degs.name})","items":[#foreach($deg in $degs.getSortedGroups()){"id":"$!{deg.uid}","name":"$!encoder.jsonEncode($!{deg.name})"}#if($velocityCount<$degs.getSortedGroups().size()),#end#end]}#if($velocityCount<$dataElementGroupSets.size()),#end#end], -"legendSets":[#foreach($set in $legendSets){"id":"$!{set.uid}","name":"$!encoder.jsonEncode($!{set.name})","legends":[#foreach($legend in $set.getMapLegends()){"id":"$!{legend.uid}","name":"$!encoder.jsonEncode($!{legend.name})","startValue":"$!{legend.startValue}","endValue":"$!{legend.endValue}","color":"$!encoder.jsonEncode($!{legend.color})","image":"$!encoder.jsonEncode($!{legend.image})"}#if($velocityCount<$set.getMapLegends().size()),#end#end]}#if($velocityCount<$legendSets.size()),#end#end] -} - \ No newline at end of file +"dimensions":[#foreach($dim in $dimensions){"id":"$!{dim.uid}","name":"$!encoder.jsonEncode($!{dim.name})"}#if($velocityCount<$dimensions.size()),#end#end] +} \ No newline at end of file === 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-05-14 10:58:38 +0000 +++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/scripts/app.js 2013-05-22 14:06:23 +0000 @@ -27,12 +27,9 @@ init.rootNodes[i].path = '/' + dv.conf.finals.root.id + '/' + init.rootNodes[i].id; } - // Dynamic dimensions - - // Sort by name + // Sort and extend dynamic dimensions init.dimensions = dv.util.array.sortObjectsByString(init.dimensions); - // Extend for (var i = 0, dim; i < init.dimensions.length; i++) { dim = init.dimensions[i]; dim.dimensionName = dim.id; @@ -40,6 +37,7 @@ dv.conf.finals.dimension.objectNameMap[dim.id] = dim; } + // Viewport afterrender init.afterRender = function() { // Resize event handler @@ -128,17 +126,11 @@ config.filters = []; getDimension = function(config) { - if (dv.api.objectNameDimensionClassMap[config.objectName]) { - return dv.api.objectNameDimensionClassMap[config.objectName]({ - dimension: config.objectName, - items: config.items - }); + if (dv.api.objectNameDimensionClassMap[config.dimension]) { + return dv.api.objectNameDimensionClassMap[config.dimension](config); } else { - return dv.api.Dimension({ - dimension: config.dimension, - items: config.items - }); + return dv.api.Dimension(config); } }; @@ -4117,7 +4109,9 @@ dimConf = dv.conf.finals.dimension, objectName, periodRecords, - fixedPeriodRecords = []; + fixedPeriodRecords = [], + isOu = false, + isOuc = false; // Type dv.viewport.chartType.setChartType(xLayout.type); @@ -4136,6 +4130,7 @@ objectName = dimConf.indicator.objectName; if (dimMap[objectName]) { dv.store.indicatorSelected.add(Ext.clone(recMap[objectName])); + pt.util.multiselect.filterAvailable({store: pt.store.indicatorAvailable}, {store: pt.store.indicatorSelected}); } // Data elements @@ -4143,6 +4138,7 @@ objectName = dimConf.dataElement.objectName; if (dimMap[objectName]) { dv.store.dataElementSelected.add(Ext.clone(recMap[objectName])); + pt.util.multiselect.filterAvailable({store: pt.store.dataElementAvailable}, {store: pt.store.dataElementSelected}); dv.viewport.dataElementDetailLevel.setValue(objectName); } @@ -4150,6 +4146,7 @@ objectName = dimConf.operand.objectName; if (dimMap[objectName]) { dv.store.dataElementSelected.add(Ext.clone(recMap[objectName])); + pt.util.multiselect.filterAvailable({store: pt.store.dataSetAvailable}, {store: pt.store.dataSetSelected}); dv.viewport.dataElementDetailLevel.setValue(objectName); } @@ -4175,6 +4172,7 @@ } } dv.store.fixedPeriodSelected.add(fixedPeriodRecords); + pt.util.multiselect.filterAvailable({store: pt.store.fixedPeriodAvailable}, {store: pt.store.fixedPeriodSelected}); // Group sets for (var key in dimensionIdSelectedStoreMap) { @@ -4199,9 +4197,6 @@ // Organisation units if (recMap[dimConf.organisationUnit.objectName]) { - var isOu = false, - isOuc = false; - for (var i = 0, ouRecords = recMap[dimConf.organisationUnit.objectName]; i < ouRecords.length; i++) { if (ouRecords[i].id === 'USER_ORGUNIT') { isOu = true; === modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/scripts/core.js' --- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/scripts/core.js 2013-05-14 10:30:34 +0000 +++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/scripts/core.js 2013-05-15 13:00:34 +0000 @@ -2113,7 +2113,7 @@ } if (!Ext.isBoolean(config.showTrendLine)) { - delete config.showTrendLine; + config.showTrendLine = layout.showTrendLine; } if (!Ext.isNumber(config.targetLineValue)) { delete config.targetLineValue; @@ -2128,13 +2128,13 @@ delete config.baseLineTitle; } if (!Ext.isBoolean(config.showValues)) { - delete config.showValues; + config.showValues = layout.showValues; } if (!Ext.isBoolean(config.hideLegend)) { - delete config.hideLegend; + config.hideLegend = layout.hideLegend; } if (!Ext.isBoolean(config.hideTitle)) { - delete config.hideTitle; + config.hideTitle = layout.hideTitle; } if (!Ext.isString(config.title) || Ext.isEmpty(config.title)) { delete config.title; @@ -2146,10 +2146,10 @@ delete config.rangeAxisTitle; } if (!Ext.isBoolean(config.userOrganisationUnit)) { - delete config.userOrganisationUnit; + config.userOrganisationUnit = layout.userOrganisationUnit; } if (!Ext.isBoolean(config.userOrganisationUnitChildren)) { - delete config.userOrganisationUnitChildren; + config.userOrganisationUnitChildren = layout.userOrganisationUnitChildren; } return true;