=== 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-08-17 10:22:45 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js 2013-08-25 18:44:06 +0000 @@ -1,8 +1,8 @@ Ext.onReady( function() { - - // ext config + + // ext config Ext.Ajax.method = 'GET'; - + // namespace if (!('PT' in window)) { PT = { @@ -12,13 +12,13 @@ // mode PT.isDebug = false; - + // html5 PT.isSessionStorage = 'sessionStorage' in window && window['sessionStorage'] !== null; // core - - PT.core = {}; + + PT.core = {}; PT.core.instances = []; PT.core.getInstance = function(init) { @@ -309,7 +309,7 @@ } } }; - + util.store = { addToStorage: function(s, records) { s.each( function(r) { @@ -428,7 +428,7 @@ return str.replace(new RegExp(find, 'g'), replace); } }; - + util.color = { hexToRgb: function(hex) { var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; @@ -459,18 +459,13 @@ util.message = { alert: function(message) { - if (pt.isPlugin) { - console.log(pt.init.el + ': ' + message); - } - else { - alert(message); - } + alert(message); } }; }()); // init - (function() { + (function() { // sort and extend dynamic dimensions init.dimensions = util.array.sortObjectsByString(init.dimensions); @@ -645,7 +640,7 @@ } dimensions = Ext.Array.clean([].concat(layout.columns, layout.rows, layout.filters)); - + for (var i = 0; i < dimensions.length; i++) { objectNameDimensionMap[dimensions[i].dimension] = dimensions[i]; } @@ -655,19 +650,19 @@ // Indicators as filter if (layout.filters[i].dimension === dimConf.indicator.objectName) { - pt.util.message.alert(PT.i18n.indicators_cannot_be_specified_as_filter || 'Indicators cannot be specified as filter'); + util.message.alert(PT.i18n.indicators_cannot_be_specified_as_filter || 'Indicators cannot be specified as filter'); return; } // Categories as filter if (layout.filters[i].dimension === dimConf.category.objectName) { - pt.util.message.alert(PT.i18n.categories_cannot_be_specified_as_filter || 'Categories cannot be specified as filter'); + util.message.alert(PT.i18n.categories_cannot_be_specified_as_filter || 'Categories cannot be specified as filter'); return; } // Data sets as filter if (layout.filters[i].dimension === dimConf.category.objectName) { - pt.util.message.alert(PT.i18n.data_sets_cannot_be_specified_as_filter || 'Data sets cannot be specified as filter'); + util.message.alert(PT.i18n.data_sets_cannot_be_specified_as_filter || 'Data sets cannot be specified as filter'); return; } } @@ -675,32 +670,32 @@ // dc and in if (objectNameDimensionMap[dimConf.operand.objectName] && objectNameDimensionMap[dimConf.indicator.objectName]) { - pt.util.message.alert('Indicators and detailed data elements cannot be specified together'); + util.message.alert('Indicators and detailed data elements cannot be specified together'); return; } // dc and de if (objectNameDimensionMap[dimConf.operand.objectName] && objectNameDimensionMap[dimConf.dataElement.objectName]) { - pt.util.message.alert('Detailed data elements and totals cannot be specified together'); + util.message.alert('Detailed data elements and totals cannot be specified together'); return; } // dc and ds if (objectNameDimensionMap[dimConf.operand.objectName] && objectNameDimensionMap[dimConf.dataSet.objectName]) { - pt.util.message.alert('Data sets and detailed data elements cannot be specified together'); + util.message.alert('Data sets and detailed data elements cannot be specified together'); return; } // dc and co if (objectNameDimensionMap[dimConf.operand.objectName] && objectNameDimensionMap[dimConf.category.objectName]) { - pt.util.message.alert('Categories and detailed data elements cannot be specified together'); + util.message.alert('Categories and detailed data elements cannot be specified together'); 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)) { + //if (Ext.Array.contains(dimensionNames, dimConf.data.dimensionName) && store.dataSetSelected.data.length) { + //for (var i = 0; i < init.degs.length; i++) { + //if (Ext.Array.contains(dimensionNames, init.degs[i].id)) { //alert(PT.i18n.data_element_group_sets_cannot_be_specified_together_with_data_sets); //return; //} @@ -708,7 +703,7 @@ //} return true; - }; + }; return function() { var a = [], @@ -725,7 +720,7 @@ // Config must be an object if (!(config && Ext.isObject(config))) { - alert(pt.init.el + ': Layout config is not an object'); + alert(init.el + ': Layout config is not an object'); return; } @@ -798,7 +793,7 @@ layout.cumulative = Ext.isBoolean(config.cumulative) ? config.cumulative : false; layout.sortOrder = Ext.isNumber(config.sortOrder) ? config.sortOrder : 0; layout.topLimit = Ext.isNumber(config.topLimit) ? config.topLimit : 0; - + if (!validateSpecialCases()) { return; } @@ -1116,7 +1111,7 @@ items = Ext.Array.unique(items); } - + if (dimName !== co) { paramString += ':' + items.join(';'); } @@ -1125,7 +1120,7 @@ paramString += '&'; } } - + if (addCategoryDimension) { paramString += '&dimension=' + conf.finals.dimension.category.dimensionName; } @@ -1226,7 +1221,7 @@ } } } - + return false; }(), isGroup = function() { @@ -1237,7 +1232,7 @@ } } } - + return false; }(), co = dimConf.category.objectName, @@ -1338,27 +1333,27 @@ // Re-layout layout = pt.api.layout.Layout(xLayout); - + if (layout) { dimensions = [].concat(layout.columns || [], layout.rows || [], layout.filters || []); - - for (var i = 0, idNameMap = response.metaData.names, dimItems; i < dimensions.length; i++) { + + for (var i = 0, idNameMap = response.metaData.names, dimItems; i < dimensions.length; i++) { dimItems = dimensions[i].items; - + if (Ext.isArray(dimItems) && dimItems.length) { for (var j = 0, item; j < dimItems.length; j++) { item = dimItems[j]; - + if (Ext.isObject(item) && Ext.isString(idNameMap[item.id]) && !Ext.isString(item.name)) { item.name = idNameMap[item.id] || ''; } } } } - + return pt.engine.getExtendedLayout(layout); } - + return null; }(); }; @@ -1571,7 +1566,7 @@ // allObjects - + for (var i = 0, allRow; i < aAllItems.length; i++) { allRow = []; @@ -1610,9 +1605,9 @@ allRow = aAllObjects[i]; for (var j = 0, obj, sizeCount = 0, span = aSpan[i - 1], parentObj = aAllObjects[i - 1][0]; j < allRow.length; j++) { - obj = allRow[j]; + obj = allRow[j]; obj.parent = parentObj; - + sizeCount++; if (sizeCount === span) { @@ -1622,7 +1617,7 @@ } } } - + // add uuids array to leaves if (aAllObjects.length) { for (var i = 0, leaf, parentUuids, obj, span = aAllObjects.length > 1 ? aSpan[aAllObjects.length - 2] : 1, leafUuids = []; i < aAllObjects[aAllObjects.length - 1].length; i++) { @@ -1630,28 +1625,28 @@ leafUuids.push(leaf.uuid); parentUuids = []; obj = leaf; - + // get parent uuids while (obj.parent) { obj = obj.parent; parentUuids.push(obj.uuid); } - + // add parent uuids leaf.uuids = Ext.clone(parentUuids); - + // add uuid for all leaves if (leafUuids.length === span) { for (var j = i - span + 1, leaf; j <= i; j++) { leaf = aAllObjects[aAllObjects.length - 1][j]; leaf.uuids = leaf.uuids.concat(Ext.clone(leafUuids)); } - + leafUuids = []; } } } - + // populate uuid-object map for (var i = 0; i < aAllObjects.length; i++) { for (var j = 0, object; j < aAllObjects[i].length; j++) { @@ -1661,8 +1656,8 @@ } } - //console.log("aAllObjects", aAllObjects); - + //console.log("aAllObjects", aAllObjects); + return { type: type, items: mDimensions, @@ -1693,18 +1688,18 @@ setMouseHandlers = function() { var valueElement; - + for (var key in uuidDimUuidsMap) { if (uuidDimUuidsMap.hasOwnProperty(key)) { valueElement = Ext.get(key); - + if (parseFloat(valueElement.dom.textContent)) { valueElement.dom.pt = pt; valueElement.dom.setAttribute('onclick', 'this.pt.engine.onMouseClick(this.id, this.pt);'); } } } - }; + }; getTableHtml = function(xColAxis, xRowAxis, xResponse) { var getRoundedHtmlValue, @@ -1742,7 +1737,7 @@ valueObjects = [], totalColObjects = [], htmlArray; - + getRoundedHtmlValue = function(value, dec) { dec = dec || 2; return parseFloat(pt.util.number.roundIf(value, 2)).toString(); @@ -1761,7 +1756,7 @@ isValue = Ext.isObject(config) && Ext.isString(config.type) && config.type === 'value' && !config.empty, cls = '', html = ''; - + if (!Ext.isObject(config)) { return ''; } @@ -1778,14 +1773,14 @@ } } } - + 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, layout.digitGroupSeparator) : htmlValue; displayDensity = conf.pivot.displayDensity[config.displayDensity] || conf.pivot.displayDensity[layout.displayDensity]; fontSize = conf.pivot.fontSize[config.fontSize] || conf.pivot.fontSize[layout.fontSize]; - + cls += config.hidden ? ' td-hidden' : ''; cls += config.collapsed ? ' td-collapsed' : ''; cls += isValue ? ' pointer' : ''; @@ -1871,26 +1866,26 @@ for (var j = 0, obj, spanCount = 0; j < xColAxis.size; j++) { spanCount++; - + obj = xColAxis.objects.all[i][j]; obj.type = 'dimension'; obj.cls = 'pivot-dim'; obj.noBreak = false; obj.hidden = !(obj.rowSpan || obj.colSpan); obj.htmlValue = xResponse.metaData.names[obj.id]; - + dimHtml.push(getTdHtml(obj)); - + if (i === 0 && spanCount === xColAxis.span[i] && doSubTotals(xColAxis) ) { dimHtml.push(getTdHtml({ type: 'dimensionSubtotal', cls: 'pivot-dim-subtotal', rowSpan: xColAxis.dims })); - + spanCount = 0; } - + if (i === 0 && (j === xColAxis.size - 1) && doTotals()) { dimHtml.push(getTdHtml({ type: 'dimensionTotal', @@ -1931,7 +1926,7 @@ recursiveReduce(obj.parent); } }; - + // Populate dim objects if (xRowAxis) { for (var i = 0, row; i < xRowAxis.size; i++) { @@ -1960,21 +1955,21 @@ for (var j = 0, id, value, htmlValue, empty, uuid, uuids; j < colSize; j++) { empty = false; uuids = []; - + // meta data uid id = (xColAxis ? pt.util.str.replaceAll(xColAxis.ids[j], '-', '') : '') + (xRowAxis ? pt.util.str.replaceAll(xRowAxis.ids[i], '-', '') : ''); - + // value html element id uuid = Ext.data.IdGenerator.get('uuid').generate(); - - // col and row dim element ids + + // col and row dim element ids if (xColAxis) { uuids = uuids.concat(xColAxis.objects.all[xColAxis.dims - 1][j].uuids); } if (xRowAxis) { uuids = uuids.concat(xRowAxis.objects.all[xRowAxis.dims - 1][i].uuids); } - + if (idValueMap[id]) { value = parseFloat(idValueMap[id]); htmlValue = value.toString(); @@ -1995,7 +1990,7 @@ empty: empty, uuids: uuids }); - + // Map element id to dim element ids uuidDimUuidsMap[uuid] = uuids; } @@ -2380,7 +2375,7 @@ // Extended layout xLayout = engine.getExtendedLayout(layout); - + // Param string pt.paramString = engine.getParamString(xLayout, true); url = pt.init.contextPath + '/api/analytics.json' + pt.paramString; @@ -2390,7 +2385,7 @@ return; } - // Show load mask + // Show load mask pt.util.mask.showMask(pt.viewport.centerRegion); Ext.Ajax.request({ @@ -2430,7 +2425,7 @@ // Extended axes xColAxis = getExtendedAxis('col', xLayout.columnDimensionNames, xResponse); xRowAxis = getExtendedAxis('row', xLayout.rowDimensionNames, xResponse); - + // Create html html = getTableHtml(xColAxis, xRowAxis, xResponse); @@ -2439,7 +2434,7 @@ pt.viewport.centerRegion.update(html); // After table success - + // Resize render elements if plugin if (pt.isPlugin) { var baseEl = Ext.get(pt.init.el), @@ -2448,13 +2443,13 @@ baseElPaddingW = parseInt(baseEl.getStyle('padding-left')) + parseInt(baseEl.getStyle('padding-right')), baseElPaddingH = parseInt(baseEl.getStyle('padding-top')) + parseInt(baseEl.getStyle('padding-bottom')), el = Ext.get(tableUuid); - + pt.viewport.centerRegion.setWidth(el.getWidth()); pt.viewport.centerRegion.setHeight(el.getHeight()); baseEl.setWidth(el.getWidth() + baseElBorderW + baseElPaddingW); baseEl.setHeight(el.getHeight() + baseElBorderH + baseElPaddingH); } - + // Hide mask util.mask.hideMask(pt.viewport.centerRegion); @@ -2462,11 +2457,11 @@ if (pt.viewport.downloadButton) { pt.viewport.downloadButton.enable(); } - + // Add uuid maps to instance pt.uuidDimUuidsMap = uuidDimUuidsMap; pt.uuidObjectMap = uuidObjectMap; - + // Add value event handlers, set session storage if (!pt.isPlugin && PT.isSessionStorage) { setMouseHandlers(); @@ -2477,7 +2472,7 @@ pt.layout = layout; pt.xLayout = xLayout; pt.xResponse = xResponse; - + if (PT.isDebug) { console.log("xResponse", xResponse); console.log("xLayout", xLayout); @@ -2494,12 +2489,12 @@ method = 'GET', success, failure; - + if (!Ext.isString(id)) { alert('Invalid uid'); return; } - + success = function(layoutConfig) { var layout = api.layout.Layout(layoutConfig); @@ -2511,12 +2506,12 @@ pt.viewport.setFavorite(layout); } }; - + failure = function(responseText) { util.mask.hideMask(pt.viewport.centerRegion); alert(responseText); }; - + if (pt.isPlugin) { Ext.data.JsonP.request({ url: url + '.jsonp' + params, @@ -2542,17 +2537,17 @@ }); } }; - + engine.onMouseHover = function(uuid, event, param, pt) { var dimUuids; - if (param === 'chart') { + if (param === 'chart') { if (Ext.isString(uuid) && Ext.isArray(pt.uuidDimUuidsMap[uuid])) { dimUuids = pt.uuidDimUuidsMap[uuid]; - + for (var i = 0, el; i < dimUuids.length; i++) { el = Ext.get(dimUuids[i]); - + if (el) { if (event === 'mouseover') { el.addCls('highlighted'); @@ -2565,7 +2560,7 @@ } } }; - + engine.onMouseClick = function(uuid, pt) { var that = this, uuids = pt.uuidDimUuidsMap[uuid], @@ -2580,12 +2575,12 @@ for (var i = 0; i < uuids.length; i++) { objects.push(pt.uuidObjectMap[uuids[i]]); } - + // clear layoutConfig dimension items for (var i = 0, a = [].concat(layoutConfig.columns, layoutConfig.rows); i < a.length; i++) { a[i].items = []; } - + // add new items for (var i = 0, obj, axis; i < objects.length; i++) { obj = objects[i]; @@ -2632,7 +2627,7 @@ handler: function() { that.setSessionStorage(layoutConfig, pt.init.contextPath + '/dhis-web-mapping/app/index.html'); } - } + } ] }); === modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js' --- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js 2013-08-13 09:32:39 +0000 +++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/plugin.js 2013-08-25 18:44:06 +0000 @@ -1,5 +1,5 @@ Ext.onReady(function() { - + // css css = 'table.pivot { \n font-family: arial,sans-serif,ubuntu,consolas; \n } \n'; css += '.td-nobreak { \n white-space: nowrap; \n } \n'; @@ -18,93 +18,107 @@ css += '.pivot-value-total { \n background-color: #e4e4e4; \n white-space: nowrap; \n text-align: right; \n } \n'; css += '.pivot-value-total-subgrandtotal { \n background-color: #d8d8d8; \n white-space: nowrap; \n text-align: right; \n } \n'; css += '.pivot-value-grandtotal { \n background-color: #c8c8c8; \n white-space: nowrap; \n text-align: right; \n } \n'; - + css += '.x-mask-msg { \n padding: 0; \n border: 0 none; \n background-image: none; \n background-color: transparent; \n } \n'; css += '.x-mask-msg div { \n background-position: 11px center; \n } \n'; - css += '.x-mask-msg .x-mask-loading { \n border: 0 none; \n background-color: #000; \n color: #fff; \n border-radius: 2px; \n padding: 12px 14px 12px 30px; \n opacity: 0.65; \n } \n'; - + css += '.x-mask-msg .x-mask-loading { \n border: 0 none; \n background-color: #000; \n color: #fff; \n border-radius: 2px; \n padding: 12px 14px 12px 30px; \n opacity: 0.65; \n } \n'; + css += '.pivot td.legend { \n padding: 0; \n } \n'; css += '.pivot div.legendCt { \n display: table; \n float: right; \n width: 100%; \n } \n'; css += '.pivot div.arrowCt { \n display: table-cell; \n vertical-align: top; \n width: 8px; \n } \n'; css += '.pivot div.arrow { \n width: 0; \n height: 0; \n } \n'; css += '.pivot div.number { \n display: table-cell; \n } \n', - css += '.pivot div.legendColor { \n display: table-cell; \n width: 2px; \n } \n'; - + css += '.pivot div.legendColor { \n display: table-cell; \n width: 2px; \n } \n'; + Ext.util.CSS.createStyleSheet(css); - - // plugin + + // plugin PT.plugin = {}; - + PT.plugin.getTable = function(config) { var validateConfig, + extendInstance, createViewport, initialize, pt; - + validateConfig = function(config) { if (!Ext.isObject(config)) { console.log('Report table configuration is not an object'); return; } - + if (!Ext.isString(config.el)) { console.log('No valid element id provided'); return; } - + if (!Ext.isString(config.url)) { console.log('No valid url provided'); return; } - + return true; }; - + + extendInstance = function(pt) { + var util = pt.util || {}, + init = pt.init || {}; + + init.el = config.el; + + util.message = { + alert: function() { + console.log(pt.init.el + ': ' + message); + } + }; + }; + createViewport = function() { var setFavorite, centerRegion; - + setFavorite = function(layout) { pt.engine.createTable(layout, pt); }; - + centerRegion = Ext.create('Ext.panel.Panel', { renderTo: Ext.get(pt.init.el), bodyStyle: 'border: 0 none', layout: 'fit' }); - + return { setFavorite: setFavorite, centerRegion: centerRegion }; }; - + initialize = function() { - + if (!validateConfig(config)) { return; - } - + } + Ext.data.JsonP.request({ url: config.url + '/dhis-web-pivot/initialize.action', success: function(r) { pt = PT.core.getInstance(r); - - pt.init.el = config.el; - pt.isPlugin = true; - pt.viewport = createViewport(); - + extendInstance(pt); + + pt.viewport = createViewport(); + pt.isPlugin = true; + if (config.uid) { pt.engine.loadTable(config.uid, pt); } else { layout = pt.api.layout.Layout(config); - + if (!layout) { return; } - + pt.engine.createTable(layout, pt); } }