=== modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-visualizer/scripts/core.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-visualizer/scripts/core.js 2014-10-15 11:27:39 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-visualizer/scripts/core.js 2014-10-20 13:12:14 +0000 @@ -264,8 +264,6 @@ return; } - //config.id = config.id.replace('.', '-'); - return config; }(); }; @@ -329,7 +327,7 @@ // rows: [Dimension] // filters: [Dimension] - + // showTrendLine: boolean (false) // targetLineValue: number @@ -505,7 +503,7 @@ alert('At least one fixed period, one relative period or start/end dates must be specified'); return; } - + config.columns = getValidatedDimensionArray(config.columns); config.rows = getValidatedDimensionArray(config.rows); config.filters = getValidatedDimensionArray(config.filters); @@ -547,7 +545,7 @@ layout.columns = config.columns; layout.rows = config.rows; layout.filters = config.filters; - + layout.type = Ext.isString(config.type) ? config.type : 'column'; layout.program = config.program; layout.programStage = config.programStage; @@ -578,7 +576,7 @@ (Ext.isString(config.rangeAxisTitle) && !Ext.isEmpty(config.rangeAxisTitle) ? config.rangeAxisTitle : null); layout.domainAxisTitle = Ext.isString(config.domainAxisLabel) && !Ext.isEmpty(config.domainAxisLabel) ? config.domainAxisLabel : (Ext.isString(config.domainAxisTitle) && !Ext.isEmpty(config.domainAxisTitle) ? config.domainAxisTitle : null); - + layout.hideLegend = Ext.isBoolean(config.hideLegend) ? config.hideLegend : false; layout.hideTitle = Ext.isBoolean(config.hideTitle) ? config.hideTitle : false; layout.title = Ext.isString(config.title) && !Ext.isEmpty(config.title) ? config.title : null; @@ -1301,7 +1299,7 @@ if (dim.dimension === orgDim.dimension && dim.items && dim.items.length) { var items = []; - + for (var k = 0, option; k < options.length; k++) { option = options[k]; @@ -1759,12 +1757,12 @@ service.response.aggregate = {}; service.response.aggregate.getExtendedResponse = function(xLayout, response) { - var emptyId = '(N/A)', + var emptyId = '[N/A]', meta = ['ou', 'pe'], ouHierarchy, names, headers; - + response = Ext.clone(response); headers = response.headers; ouHierarchy = response.metaData.ouHierarchy, @@ -1869,7 +1867,7 @@ for (var j = 0; j < idIndexOrder.length; j++) { id += row[idIndexOrder[j]]; } - + response.idValueMap[id] = row[valueHeaderIndex]; } @@ -1966,7 +1964,7 @@ } // filters - if (layout.filters) { + if (layout.filters) { for (var i = 0, dim; i < layout.filters.length; i++) { dim = layout.filters[i]; @@ -2064,16 +2062,27 @@ }; web.report.aggregate.createChart = function(layout, xLayout, xResponse, centerRegion) { - var dataTotalKey = Ext.data.IdGenerator.get('uuid').generate(), - //columnIds = xLayout.columns[0] ? xLayout.columns[0].ids : [], - columnIds = xLayout.columnDimensionNames[0] ? xLayout.dimensionNameIdsMap[xLayout.columnDimensionNames[0]] : [], - replacedColumnIds = support.prototype.str.replaceAll(Ext.clone(columnIds), '.', ''), - //rowIds = xLayout.rows[0] ? xLayout.rows[0].ids : [], + var columnIds = xLayout.columnDimensionNames[0] ? xLayout.dimensionNameIdsMap[xLayout.columnDimensionNames[0]] : [], + failSafeColumnIds = [], + failSafeColumnIdMap = {}, + createFailSafeIds = function() { + for (var i = 0, uuid; i < columnIds.length; i++) { + uuid = Ext.data.IdGenerator.get('uuid').generate(); + + failSafeColumnIds.push(uuid); + failSafeColumnIdMap[uuid] = columnIds[i]; + + xResponse.metaData.names[uuid] = xResponse.metaData.names[columnIds[i]]; + } + }(), + + // row ids rowIds = xLayout.rowDimensionNames[0] ? xLayout.dimensionNameIdsMap[xLayout.rowDimensionNames[0]] : [], - replacedRowIds = support.prototype.str.replaceAll(Ext.clone(rowIds), '.', ''), + + // filter ids filterIds = function() { var ids = []; - + if (xLayout.filters) { for (var i = 0; i < xLayout.filters.length; i++) { ids = ids.concat(xLayout.filters[i].ids || []); @@ -2082,21 +2091,9 @@ return ids; }(), - replacedFilterIds = support.prototype.str.replaceAll(Ext.clone(filterIds), '.', ''), - - replacedIdMap = function() { - var map = {}, - names = xResponse.metaData.names, - ids = Ext.clean([].concat(columnIds || [], rowIds || [], filterIds || [])), - replacedIds = Ext.clean([].concat(replacedColumnIds || [], replacedRowIds || [], replacedFilterIds || [])); - - for (var i = 0; i < replacedIds.length; i++) { - map[replacedIds[i]] = ids[i]; - } - - return map; - }(), - + + // totals + dataTotalKey = Ext.data.IdGenerator.get('uuid').generate(), addDataTotals = function(data, ids) { for (var i = 0, obj, total; i < data.length; i++) { obj = data[i]; @@ -2132,11 +2129,7 @@ generator = {}; getDefaultStore = function(isStacked) { - var pe = conf.finals.dimension.period.dimensionName, - columnDimensionName = xLayout.columns[0].dimensionName, - rowDimensionName = xLayout.rows[0].dimensionName, - - data = [], + var data = [], trendLineFields = [], targetLineFields = [], baseLineFields = [], @@ -2148,16 +2141,15 @@ category = rowIds[i]; rowValues = []; isEmpty = false; - obj[conf.finals.data.domain] = xResponse.metaData.names[category]; - + for (var j = 0, id, value; j < columnIds.length; j++) { id = support.prototype.str.replaceAll(columnIds[j], '#', '') + support.prototype.str.replaceAll(rowIds[i], '#', ''); value = xResponse.idValueMap[id]; rowValues.push(value); - obj[columnIds[j]] = value ? parseFloat(value) : '0.0'; + obj[failSafeColumnIds[j]] = value ? parseFloat(value) : '0.0'; } isEmpty = !(Ext.Array.clean(rowValues).length); @@ -2169,13 +2161,13 @@ // stacked if (isStacked) { - addDataTotals(data, columnIds); + addDataTotals(data, failSafeColumnIds); } - + // sort order if (xLayout.sortOrder) { - var sortingKey = isStacked ? dataTotalKey : columnIds[0]; - + var sortingKey = isStacked ? dataTotalKey : failSafeColumnIds[0]; + support.prototype.array.sort(data, xLayout.sortOrder === -1 ? 'ASC' : 'DESC', sortingKey); } @@ -2201,12 +2193,12 @@ xResponse.metaData.names[regressionKey] = NS.i18n.trend + ' (Total)'; } else { - for (var i = 0; i < columnIds.length; i++) { + for (var i = 0; i < failSafeColumnIds.length; i++) { regression = new SimpleRegression(); - regressionKey = conf.finals.data.trendLine + columnIds[i]; + regressionKey = conf.finals.data.trendLine + failSafeColumnIds[i]; for (var j = 0, value; j < data.length; j++) { - value = data[j][replacedColumnIds[i]]; + value = data[j][failSafeColumnIds[i]]; regression.addData(j, parseFloat(value)); } @@ -2215,11 +2207,11 @@ } trendLineFields.push(regressionKey); - xResponse.metaData.names[regressionKey] = NS.i18n.trend + ' (' + xResponse.metaData.names[columnIds[i]] + ')'; + xResponse.metaData.names[regressionKey] = NS.i18n.trend + ' (' + xResponse.metaData.names[failSafeColumnIds[i]] + ')'; } } } - + // target line if (Ext.isNumber(xLayout.targetLineValue) || Ext.isNumber(parseFloat(xLayout.targetLineValue))) { for (var i = 0; i < data.length; i++) { @@ -2240,7 +2232,7 @@ store = Ext.create('Ext.data.Store', { fields: function() { - var fields = Ext.clone(columnIds); + var fields = Ext.clone(failSafeColumnIds); fields.push(conf.finals.data.domain); fields = fields.concat(trendLineFields, targetLineFields, baseLineFields); @@ -2249,7 +2241,7 @@ data: data }); - store.rangeFields = columnIds; + store.rangeFields = failSafeColumnIds; store.domainFields = [conf.finals.data.domain]; store.trendLineFields = trendLineFields; store.targetLineFields = targetLineFields; @@ -2295,11 +2287,11 @@ store.hasDecimals = function() { var records = store.getRange(); - + for (var i = 0; i < records.length; i++) { for (var j = 0, value; j < store.rangeFields.length; j++) { value = records[i].data[store.rangeFields[j]]; - + if (Ext.isNumber(value) && (value % 1)) { return true; } @@ -2312,11 +2304,11 @@ store.getNumberOfDecimals = function() { var records = store.getRange(), values = []; - + for (var i = 0; i < records.length; i++) { for (var j = 0, value; j < store.rangeFields.length; j++) { value = records[i].data[store.rangeFields[j]]; - + if (Ext.isNumber(value) && (value % 1)) { value = value.toString(); @@ -2329,6 +2321,7 @@ }; if (NS.isDebug) { + console.log("store", store); console.log("data", data); console.log("rangeFields", store.rangeFields); console.log("domainFields", store.domainFields); @@ -2412,7 +2405,7 @@ if (xLayout.rangeAxisDecimals) { axis.label.renderer = Ext.util.Format.numberRenderer(getRenderer(xLayout.rangeAxisDecimals)); - } + } if (xLayout.rangeAxisTitle) { axis.title = xLayout.rangeAxisTitle; @@ -2454,7 +2447,7 @@ } else { for (var i = 0, id, name, mxl, ids; i < store.rangeFields.length; i++) { - id = store.rangeFields[i]; + id = failSafeColumnIdMap[store.rangeFields[i]]; name = xResponse.metaData.names[id]; if (Ext.isObject(xLayout.legend) && xLayout.legend.maxLength) { @@ -2464,7 +2457,7 @@ name = name.substr(0, mxl) + '..'; } } - + a.push(name); } } @@ -2497,7 +2490,7 @@ field: store.rangeFields, font: conf.chart.style.fontFamily, renderer: function(n) { - return n === '0.0' ? '' : n; + return n === '0.0' ? '' : n; } }; } @@ -2510,7 +2503,7 @@ for (var i = 0, strokeColor; i < store.trendLineFields.length; i++) { strokeColor = isStacked ? '#000' : conf.chart.theme.dv1[i]; - + a.push({ type: 'line', axis: 'left', @@ -2704,7 +2697,7 @@ if (Ext.Array.contains(meta, dim.dimension)) { var ids = xResponse.metaData[dim.dimension], tmpText = ''; - + for (var ii = 0; ii < ids.length; ii++) { tmpText += (tmpText.length ? ', ' : '') + names[ids[ii]]; } @@ -2714,7 +2707,7 @@ else { if (dim.filter) { var a = dim.filter.split(':'); - + if (a.length === 2) { var operator = a[0], valueArray = a[1].split(';'), @@ -3062,13 +3055,13 @@ // NB, always true for area charts as extjs area charts cannot handle nulls xLayout.hideEmptyRows = true; - + var store = getDefaultStore(true), numericAxis = getDefaultNumericAxis(store), categoryAxis = getDefaultCategoryAxis(store), axes = [numericAxis, categoryAxis], series = getDefaultSeries(store); - + series.type = 'area'; series.style.opacity = 0.7; series.style.lineWidth = 0; @@ -3161,7 +3154,7 @@ store: store, series: series }); - + //chart.legend.position = 'right'; //chart.legend.isVertical = true; chart.insetPadding = 40; @@ -3209,7 +3202,7 @@ series.push(obj); } - + chart = getDefaultChart({ store: store, axes: axes, === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-mapping/scripts/app.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-mapping/scripts/app.js 2014-10-15 09:48:53 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-mapping/scripts/app.js 2014-10-21 08:22:25 +0000 @@ -7181,18 +7181,18 @@ Ext.Ajax.request({ url: gis.init.contextPath + '/api/indicators.json?fields=legendSet[id]&paging=false&filter=id:eq:' + this.getValue(), success: function(r) { - r = Ext.decode(r.responseText); + var set = Ext.decode(r.responseText).indicators[0].legendSet; - if (Ext.isObject(r.mapLegendSet) && r.mapLegendSet.id) { + if (Ext.isObject(set) && set.id) { legendType.setValue(gis.conf.finals.widget.legendtype_predefined); legendTypeToggler(gis.conf.finals.widget.legendtype_predefined); if (gis.store.legendSets.isLoaded) { - legendSet.setValue(r.mapLegendSet.id); + legendSet.setValue(set.id); } else { gis.store.legendSets.loadFn( function() { - legendSet.setValue(r.mapLegendSet.id); + legendSet.setValue(set.id); }); } } @@ -7269,18 +7269,18 @@ Ext.Ajax.request({ url: gis.init.contextPath + '/api/dataElements.json?fields=legendSet[id]&paging=false&filter=id:eq:' + this.getValue(), success: function(r) { - r = Ext.decode(r.responseText); + var set = Ext.decode(r.responseText).dataElements[0].legendSet; - if (Ext.isObject(r.mapLegendSet) && r.mapLegendSet.id) { + if (Ext.isObject(set) && set.id) { legendType.setValue(gis.conf.finals.widget.legendtype_predefined); legendTypeToggler(gis.conf.finals.widget.legendtype_predefined); if (gis.store.legendSets.isLoaded) { - legendSet.setValue(r.mapLegendSet.id); + legendSet.setValue(set.id); } else { gis.store.legendSets.loadFn( function() { - legendSet.setValue(r.mapLegendSet.id); + legendSet.setValue(set.id); }); } } @@ -7342,7 +7342,35 @@ width: gis.conf.layout.widget.item_width, labelWidth: gis.conf.layout.widget.itemlabel_width, listConfig: {loadMask: false}, - store: dataSetStore + store: dataSetStore, + listeners: { + select: function(cb) { + Ext.Ajax.request({ + url: gis.init.contextPath + '/api/dataSets.json?fields=legendSet[id]&paging=false&filter=id:eq:' + this.getValue(), + success: function(r) { + var set = Ext.decode(r.responseText).dataSets[0].legendSet; + + if (Ext.isObject(set) && set.id) { + legendType.setValue(gis.conf.finals.widget.legendtype_predefined); + legendTypeToggler(gis.conf.finals.widget.legendtype_predefined); + + if (gis.store.legendSets.isLoaded) { + legendSet.setValue(set.id); + } + else { + gis.store.legendSets.loadFn( function() { + legendSet.setValue(set.id); + }); + } + } + else { + legendType.setValue(gis.conf.finals.widget.legendtype_automatic); + legendTypeToggler(gis.conf.finals.widget.legendtype_automatic); + } + } + }); + } + } }); onPeriodTypeSelect = function() { === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-visualizer/scripts/app.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-visualizer/scripts/app.js 2014-10-14 15:40:58 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-visualizer/scripts/app.js 2014-10-20 13:12:14 +0000 @@ -15,7 +15,7 @@ core: {}, app: {} }; - + // set app config (function() { @@ -214,7 +214,7 @@ ms.store.on('add', function(store, addedRecords) { var range = store.getRange(); - + if (range.length > 1) { var addedIds = Ext.Array.pluck(addedRecords, 'internalId'), records = Ext.clone(range); @@ -230,10 +230,10 @@ } } } - + Ext.defer( function() { ms.boundList.getSelectionModel().deselectAll(); - }, 10); + }, 10); }); } } @@ -266,7 +266,7 @@ ms.store.on('add', function(store, addedRecords) { var range = store.getRange(); - + if (range.length > 1) { var addedIds = Ext.Array.pluck(addedRecords, 'internalId'), records = Ext.clone(range); @@ -282,10 +282,10 @@ } } } - + Ext.defer( function() { ms.boundList.getSelectionModel().deselectAll(); - }, 10); + }, 10); }); } } @@ -514,7 +514,7 @@ rangeAxisDecimals, rangeAxisTitle, domainAxisTitle, - + hideLegend, hideTitle, title, @@ -686,7 +686,7 @@ enforceMaxLength: true, style: 'margin-bottom:1px' }); - + domainAxisTitle = Ext.create('Ext.form.field.Text', { width: cmpWidth, fieldLabel: NS.i18n.domain_axis_label, @@ -760,7 +760,7 @@ rangeAxisTitle, domainAxisTitle ] - }; + }; general = { bodyStyle: 'border:0 none', @@ -885,7 +885,7 @@ else { domainAxisTitle.reset(); } - + hideLegend.setValue(Ext.isBoolean(layout.hideLegend) ? layout.hideLegend : false); hideTitle.setValue(Ext.isBoolean(layout.hideTitle) ? layout.hideTitle : false); @@ -966,7 +966,7 @@ w.rangeAxisDecimals = rangeAxisDecimals; w.rangeAxisTitle = rangeAxisTitle; w.domainAxisTitle = domainAxisTitle; - + w.hideLegend = hideLegend; w.hideTitle = hideTitle; w.title = title; @@ -1949,7 +1949,7 @@ svg = Ext.get(svg[0]); svg = svg.parent().dom.innerHTML; - +console.log(svg); Ext.query('#svgField')[0].value = svg; Ext.query('#filenameField')[0].value = 'test'; @@ -2223,7 +2223,7 @@ for (var j = 0, dimName, dim; j < dimNames.length; j++) { dimName = dimNames[j]; - + if (dimName === co) { axes[i].push({ dimension: co, @@ -2342,7 +2342,7 @@ fn; fn = function() { - + // create chart ns.app.chart = ns.core.web.chart.createChart(ns ,legendSet); @@ -2749,7 +2749,7 @@ loadStore: function(data, pager, append) { this.loadData(data, append); this.sortStore(); - + this.lastPage = this.nextPage; if (pager.pageCount > this.nextPage) { @@ -2929,7 +2929,7 @@ loadStore: function(data, pager, append) { this.loadData(data, append); this.sortStore(); - + this.lastPage = this.nextPage; if (pager.pageCount > this.nextPage) { @@ -3033,7 +3033,7 @@ loadStore: function(data, pager, append) { this.loadData(data, append); this.sortStore(); - + this.lastPage = this.nextPage; if (pager.pageCount > this.nextPage) { @@ -3083,7 +3083,7 @@ data: [] }); ns.app.stores.fixedPeriodSelected = fixedPeriodSelectedStore; - + chartStore = Ext.create('Ext.data.Store', { fields: ['id', 'name', 'lastUpdated', 'access'], proxy: { @@ -3156,7 +3156,7 @@ isScrolled = function(e) { var el = e.srcElement, scrollBottom = el.scrollTop + ((el.clientHeight / el.scrollHeight) * el.scrollHeight); - + return scrollBottom / el.scrollHeight > 0.9; }; @@ -4199,7 +4199,7 @@ var type = periodType.getValue(), periodOffset = periodType.periodOffset, generator = ns.core.init.periodGenerator, - periods = generator.generateReversedPeriods(type, type === 'Yearly' ? periodOffset - 5 : periodOffset); + periods = generator.generateReversedPeriods(type, type === 'Yearly' ? periodOffset - 5 : periodOffset); for (var i = 0; i < periods.length; i++) { periods[i].id = periods[i].iso; @@ -4208,7 +4208,7 @@ fixedPeriodAvailableStore.setIndex(periods); fixedPeriodAvailableStore.loadData(periods); ns.core.web.multiSelect.filterAvailable(fixedPeriodAvailable, fixedPeriodSelected); - }; + }; periodType = Ext.create('Ext.form.field.ComboBox', { cls: 'ns-combo', @@ -5077,7 +5077,7 @@ }; // viewport - + update = function() { var config = ns.core.web.chart.getLayoutConfig(), layout = ns.core.api.layout.Layout(config); @@ -5850,7 +5850,7 @@ // Layout ns.app.viewport.chartType.setChartType(layout.type); - + ns.app.stores.dimension.removeAll(); ns.app.stores.col.removeAll(); ns.app.stores.row.removeAll(); @@ -5922,7 +5922,7 @@ if (!ns.app.layoutWindow.hasDimension(dimConf.data.dimensionName)) { ns.app.stores.dimension.add({id: dimConf.data.dimensionName, name: dimConf.data.name}); } - + // add orgunit as dimension if (!ns.app.layoutWindow.hasDimension(dimConf.organisationUnit.dimensionName)) { ns.app.stores.dimension.add({id: dimConf.organisationUnit.dimensionName, name: dimConf.organisationUnit.name}); @@ -6274,7 +6274,7 @@ }); // dimensions - requests.push({ + requests.push({ url: contextPath + '/api/dimensions.json?links=false&paging=false', success: function(r) { init.dimensions = Ext.decode(r.responseText).dimensions || []; === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-visualizer/scripts/core.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-visualizer/scripts/core.js 2014-10-17 11:15:46 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-visualizer/scripts/core.js 2014-10-20 14:33:20 +0000 @@ -212,7 +212,7 @@ conf.chart = { style: { inset: 30, - fontFamily: 'Arial,Sans-serif,Lucida Grande,Ubuntu' + fontFamily: 'Arial,Sans-serif,Helvetica,Helvetica Neue,Lucida Grande,Ubuntu' }, theme: { dv1: ['#94ae0a', '#1d5991', '#a61120', '#ff8809', '#7c7474', '#a61187', '#ffd13e', '#24ad9a', '#a66111', '#414141', '#4500c4', '#1d5700'] @@ -226,7 +226,7 @@ ok: 'ok.png' } }; - + conf.url = { analysisFields: [ '*', @@ -614,7 +614,7 @@ (Ext.isString(config.rangeAxisTitle) && !Ext.isEmpty(config.rangeAxisTitle) ? config.rangeAxisTitle : null); layout.domainAxisTitle = Ext.isString(config.domainAxisLabel) && !Ext.isEmpty(config.domainAxisLabel) ? config.domainAxisLabel : (Ext.isString(config.domainAxisTitle) && !Ext.isEmpty(config.domainAxisTitle) ? config.domainAxisTitle : null); - + layout.hideLegend = Ext.isBoolean(config.hideLegend) ? config.hideLegend : false; layout.hideTitle = Ext.isBoolean(config.hideTitle) ? config.hideTitle : false; layout.title = Ext.isString(config.title) && !Ext.isEmpty(config.title) ? config.title : null; @@ -686,7 +686,7 @@ console.log('Response: no valid headers'); return; } - + if (!(Ext.isArray(config.rows) && config.rows.length > 0)) { if (!NS.plugin) { alert('No values found'); @@ -1295,7 +1295,7 @@ if (el) { layout.el = el; } - + if (Ext.isString(layout.id)) { return {id: layout.id}; } @@ -1559,93 +1559,6 @@ }()); return response; - - //response.nameHeaderMap = {}; - //response.idValueMap = {}; - //ids = []; - - //var extendHeaders = function() { - //// Extend headers: index, items, size - //for (var i = 0, header; i < response.headers.length; i++) { - //header = response.headers[i]; - - //// Index - //header.index = i; - - //if (header.meta) { - - //// Items - //header.items = Ext.clone(xLayout.dimensionNameIdsMap[header.name]) || []; - - //// Size - //header.size = header.items.length; - - //// Collect ids, used by extendMetaData - //ids = ids.concat(header.items); - //} - //} - - //// nameHeaderMap (headerName: header) - //for (var i = 0, header; i < response.headers.length; i++) { - //header = response.headers[i]; - - //response.nameHeaderMap[header.name] = header; - //} - //}(); - - //var extendMetaData = function() { - //for (var i = 0, id, splitId ; i < ids.length; i++) { - //id = ids[i]; - - //if (id.indexOf('-') !== -1) { - //splitId = id.split('-'); - //response.metaData.names[id] = response.metaData.names[splitId[0]] + ' ' + response.metaData.names[splitId[1]]; - //} - //} - //}(); - - //var createValueIdMap = function() { - //var valueHeaderIndex = response.nameHeaderMap[conf.finals.dimension.value.value].index, - //coHeader = response.nameHeaderMap[conf.finals.dimension.category.dimensionName], - //axisDimensionNames = xLayout.axisDimensionNames, - //idIndexOrder = []; - - //// idIndexOrder - //for (var i = 0; i < axisDimensionNames.length; i++) { - //idIndexOrder.push(response.nameHeaderMap[axisDimensionNames[i]].index); - - //// If co exists in response, add co after dx - //if (coHeader && axisDimensionNames[i] === conf.finals.dimension.data.dimensionName) { - //idIndexOrder.push(coHeader.index); - //} - //} - - //// idValueMap - //for (var i = 0, row, id; i < response.rows.length; i++) { - //row = response.rows[i]; - //id = ''; - - //for (var j = 0; j < idIndexOrder.length; j++) { - //id += row[idIndexOrder[j]]; - //} - - //response.idValueMap[id] = parseFloat(row[valueHeaderIndex]); - //} - //}(); - - //var getMinMax = function() { - //var valueIndex = response.nameHeaderMap.value.index, - //values = []; - - //for (var i = 0; i < response.rows.length; i++) { - //values.push(parseFloat(response.rows[i][valueIndex])); - //} - - //response.min = Ext.Array.min(values); - //response.max = Ext.Array.max(values); - //}(); - - //return response; }; // legend set @@ -1653,11 +1566,11 @@ service.mapLegend.getColorByValue = function(legendSet, value) { var color; - + if (!(legendSet && value)) { return; } - + for (var i = 0, legend; i < legendSet.mapLegends.length; i++) { legend = legendSet.mapLegends[i]; @@ -1797,18 +1710,29 @@ web.chart = {}; web.chart.createChart = function(ns, legendSet) { - var dataTotalKey = Ext.data.IdGenerator.get('uuid').generate(), - xLayout = ns.app.xLayout, + var xLayout = ns.app.xLayout, xResponse = ns.app.xResponse, - //columnIds = xLayout.columns[0] ? xLayout.columns[0].ids : [], columnIds = xLayout.columnDimensionNames[0] ? xLayout.dimensionNameIdsMap[xLayout.columnDimensionNames[0]] : [], - replacedColumnIds = support.prototype.str.replaceAll(Ext.clone(columnIds), '.', ''), - //rowIds = xLayout.rows[0] ? xLayout.rows[0].ids : [], + failSafeColumnIds = [], + failSafeColumnIdMap = {}, + createFailSafeIds = function() { + for (var i = 0, uuid; i < columnIds.length; i++) { + uuid = Ext.data.IdGenerator.get('uuid').generate(); + + failSafeColumnIds.push(uuid); + failSafeColumnIdMap[uuid] = columnIds[i]; + + xResponse.metaData.names[uuid] = xResponse.metaData.names[columnIds[i]]; + } + }(), + + // row ids rowIds = xLayout.rowDimensionNames[0] ? xLayout.dimensionNameIdsMap[xLayout.rowDimensionNames[0]] : [], - replacedRowIds = support.prototype.str.replaceAll(Ext.clone(rowIds), '.', ''), + + // filter ids filterIds = function() { var ids = []; - + if (xLayout.filters) { for (var i = 0; i < xLayout.filters.length; i++) { ids = ids.concat(xLayout.filters[i].ids || []); @@ -1817,19 +1741,9 @@ return ids; }(), - replacedFilterIds = support.prototype.str.replaceAll(Ext.clone(filterIds), '.', ''), - replacedIdMap = function() { - var map = {}, - names = xResponse.metaData.names, - ids = Ext.clean([].concat(columnIds || [], rowIds || [], filterIds || [])), - replacedIds = Ext.clean([].concat(replacedColumnIds || [], replacedRowIds || [], replacedFilterIds || [])); - - for (var i = 0; i < replacedIds.length; i++) { - map[replacedIds[i]] = ids[i]; - } - - return map; - }(), + + // totals + dataTotalKey = Ext.data.IdGenerator.get('uuid').generate(), addDataTotals = function(data, ids) { for (var i = 0, obj, total; i < data.length; i++) { obj = data[i]; @@ -1861,7 +1775,7 @@ getDefaultChartSizeHandler, getDefaultChartTitlePositionHandler, getDefaultChart, - + generator = {}; getDefaultStore = function(isStacked) { @@ -1876,16 +1790,16 @@ obj = {}; category = rowIds[i]; rowValues = []; - isEmpty = false; + isEmpty = false; obj[conf.finals.data.domain] = xResponse.metaData.names[category]; - + for (var j = 0, id, value; j < columnIds.length; j++) { id = support.prototype.str.replaceAll(columnIds[j], '#', '') + support.prototype.str.replaceAll(rowIds[i], '#', ''); value = xResponse.idValueMap[id]; rowValues.push(value); - obj[columnIds[j]] = value ? parseFloat(value) : '0.0'; + obj[failSafeColumnIds[j]] = value ? parseFloat(value) : '0.0'; } isEmpty = !(Ext.Array.clean(rowValues).length); @@ -1897,13 +1811,13 @@ // stacked if (isStacked) { - addDataTotals(data, columnIds); + addDataTotals(data, failSafeColumnIds); } - + // sort order if (xLayout.sortOrder) { - var sortingKey = isStacked ? dataTotalKey : columnIds[0]; - + var sortingKey = isStacked ? dataTotalKey : failSafeColumnIds[0]; + support.prototype.array.sort(data, xLayout.sortOrder === -1 ? 'ASC' : 'DESC', sortingKey); } @@ -1929,12 +1843,12 @@ xResponse.metaData.names[regressionKey] = NS.i18n.trend + ' (Total)'; } else { - for (var i = 0; i < columnIds.length; i++) { + for (var i = 0; i < failSafeColumnIds.length; i++) { regression = new SimpleRegression(); - regressionKey = conf.finals.data.trendLine + columnIds[i]; + regressionKey = conf.finals.data.trendLine + failSafeColumnIds[i]; for (var j = 0, value; j < data.length; j++) { - value = data[j][replacedColumnIds[i]]; + value = data[j][failSafeColumnIds[i]]; regression.addData(j, parseFloat(value)); } @@ -1943,11 +1857,11 @@ } trendLineFields.push(regressionKey); - xResponse.metaData.names[regressionKey] = NS.i18n.trend + ' (' + xResponse.metaData.names[columnIds[i]] + ')'; + xResponse.metaData.names[regressionKey] = NS.i18n.trend + ' (' + xResponse.metaData.names[failSafeColumnIds[i]] + ')'; } } } - + // target line if (Ext.isNumber(xLayout.targetLineValue) || Ext.isNumber(parseFloat(xLayout.targetLineValue))) { for (var i = 0; i < data.length; i++) { @@ -1968,7 +1882,7 @@ store = Ext.create('Ext.data.Store', { fields: function() { - var fields = Ext.clone(columnIds); + var fields = Ext.clone(failSafeColumnIds); fields.push(conf.finals.data.domain); fields = fields.concat(trendLineFields, targetLineFields, baseLineFields); @@ -1977,7 +1891,7 @@ data: data }); - store.rangeFields = columnIds; + store.rangeFields = failSafeColumnIds; store.domainFields = [conf.finals.data.domain]; store.trendLineFields = trendLineFields; store.targetLineFields = targetLineFields; @@ -2023,11 +1937,11 @@ store.hasDecimals = function() { var records = store.getRange(); - + for (var i = 0; i < records.length; i++) { for (var j = 0, value; j < store.rangeFields.length; j++) { value = records[i].data[store.rangeFields[j]]; - + if (Ext.isNumber(value) && (value % 1)) { return true; } @@ -2040,11 +1954,11 @@ store.getNumberOfDecimals = function() { var records = store.getRange(), values = []; - + for (var i = 0; i < records.length; i++) { for (var j = 0, value; j < store.rangeFields.length; j++) { value = records[i].data[store.rangeFields[j]]; - + if (Ext.isNumber(value) && (value % 1)) { value = value.toString(); @@ -2140,7 +2054,7 @@ if (xLayout.rangeAxisDecimals) { axis.label.renderer = Ext.util.Format.numberRenderer(getRenderer(xLayout.rangeAxisDecimals)); - } + } if (xLayout.rangeAxisTitle) { axis.title = xLayout.rangeAxisTitle; @@ -2182,7 +2096,7 @@ } else { for (var i = 0, id, name, mxl, ids; i < store.rangeFields.length; i++) { - id = store.rangeFields[i]; + id = failSafeColumnIdMap[store.rangeFields[i]]; name = xResponse.metaData.names[id]; if (Ext.isObject(xLayout.legend) && xLayout.legend.maxLength) { @@ -2192,7 +2106,7 @@ name = name.substr(0, mxl) + '..'; } } - + a.push(name); } } @@ -2225,7 +2139,7 @@ field: store.rangeFields, font: conf.chart.style.fontFamily, renderer: function(n) { - return n === '0.0' ? '' : n; + return n === '0.0' ? '' : n; } }; } @@ -2238,7 +2152,7 @@ for (var i = 0, strokeColor; i < store.trendLineFields.length; i++) { strokeColor = isStacked ? '#000' : conf.chart.theme.dv1[i]; - + a.push({ type: 'line', axis: 'left', @@ -2719,13 +2633,13 @@ // NB, always true for area charts as extjs area charts cannot handle nulls xLayout.hideEmptyRows = true; - + var store = getDefaultStore(true), numericAxis = getDefaultNumericAxis(store), categoryAxis = getDefaultCategoryAxis(store), axes = [numericAxis, categoryAxis], series = getDefaultSeries(store); - + series.type = 'area'; series.style.opacity = 0.7; series.style.lineWidth = 0; @@ -2818,7 +2732,7 @@ store: store, series: series }); - + //chart.legend.position = 'right'; //chart.legend.isVertical = true; chart.insetPadding = 40; @@ -2866,7 +2780,7 @@ series.push(obj); } - + chart = getDefaultChart({ store: store, axes: axes, @@ -2898,13 +2812,12 @@ // overwrite items columnIds = [columnIds[0]]; - replacedColumnIds = [replacedColumnIds[0]]; + failSafeColumnIds = [failSafeColumnIds[0]]; rowIds = [rowIds[0]]; - replacedRowIds = [replacedRowIds[0]]; // store store = getDefaultStore(); - + // axis axis = { type: 'gauge', @@ -2917,16 +2830,16 @@ // series, legendset if (legendSet) { - valueColor = service.mapLegend.getColorByValue(legendSet, store.getRange()[0].data[columnIds[0]]) || valueColor; + valueColor = service.mapLegend.getColorByValue(legendSet, store.getRange()[0].data[failSafeColumnIds[0]]) || valueColor; } - + series = { type: 'gauge', field: store.rangeFields[0], //donut: 5, colorSet: [valueColor, '#ddd'] }; - + chart = getDefaultChart({ axes: [axis], series: [series], @@ -2944,7 +2857,7 @@ if (xLayout.showValues) { chart.items.push(Ext.create('Ext.draw.Sprite', { type: 'text', - text: store.getRange()[0].data[columnIds[0]], + text: store.getRange()[0].data[failSafeColumnIds[0]], font: 'normal 26px ' + conf.chart.style.fontFamily, fill: '#111', height: 40,