X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/0494b8d9b9bb03ab6c22b34dae81261e3cd7e3e6..7a654f8d43fdb43d78b63d90528bed6e86b608cc:/src/widgets/grid/PivotAxis.js?ds=sidebyside diff --git a/src/widgets/grid/PivotAxis.js b/src/widgets/grid/PivotAxis.js deleted file mode 100644 index 7ad2b3e8..00000000 --- a/src/widgets/grid/PivotAxis.js +++ /dev/null @@ -1,319 +0,0 @@ -/*! - * Ext JS Library 3.3.1 - * Copyright(c) 2006-2010 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -/** - * @class Ext.grid.PivotAxis - * @extends Ext.Component - *
PivotAxis is a class that supports a {@link Ext.grid.PivotGrid}. Each PivotGrid contains two PivotAxis instances - the left - * axis and the top axis. Each PivotAxis defines an ordered set of dimensions, each of which should correspond to a field in a - * Store's Record (see {@link Ext.grid.PivotGrid} documentation for further explanation).
- *Developers should have little interaction with the PivotAxis instances directly as most of their management is performed by - * the PivotGrid. An exception is the dynamic reconfiguration of axes at run time - to achieve this we use PivotAxis's - * {@link #setDimensions} function and refresh the grid:
-
-var pivotGrid = new Ext.grid.PivotGrid({
- //some PivotGrid config here
-});
-
-//change the left axis dimensions
-pivotGrid.leftAxis.setDimensions([
- {
- dataIndex: 'person',
- direction: 'DESC',
- width : 100
- },
- {
- dataIndex: 'product',
- direction: 'ASC',
- width : 80
- }
-]);
-
-pivotGrid.view.refresh(true);
-
- * This clears the previous dimensions on the axis and redraws the grid with the new dimensions.
- */
-Ext.grid.PivotAxis = Ext.extend(Ext.Component, {
- /**
- * @cfg {String} orientation One of 'vertical' or 'horizontal'. Defaults to horizontal
- */
- orientation: 'horizontal',
-
- /**
- * @cfg {Number} defaultHeaderWidth The width to render each row header that does not have a width specified via
- {@link #getRowGroupHeaders}. Defaults to 80.
- */
- defaultHeaderWidth: 80,
-
- /**
- * @private
- * @cfg {Number} paddingWidth The amount of padding used by each cell.
- * TODO: From 4.x onwards this can be removed as it won't be needed. For now it is used to account for the differences between
- * the content box and border box measurement models
- */
- paddingWidth: 7,
-
- /**
- * Updates the dimensions used by this axis
- * @param {Array} dimensions The new dimensions
- */
- setDimensions: function(dimensions) {
- this.dimensions = dimensions;
- },
-
- /**
- * @private
- * Builds the html table that contains the dimensions for this axis. This branches internally between vertical
- * and horizontal orientations because the table structure is slightly different in each case
- */
- onRender: function(ct, position) {
- var rows = this.orientation == 'horizontal'
- ? this.renderHorizontalRows()
- : this.renderVerticalRows();
-
- this.el = Ext.DomHelper.overwrite(ct.dom, {tag: 'table', cn: rows}, true);
- },
-
- /**
- * @private
- * Specialised renderer for horizontal oriented axes
- * @return {Object} The HTML Domspec for a horizontal oriented axis
- */
- renderHorizontalRows: function() {
- var headers = this.buildHeaders(),
- rowCount = headers.length,
- rows = [],
- cells, cols, colCount, i, j;
-
- for (i = 0; i < rowCount; i++) {
- cells = [];
- cols = headers[i].items;
- colCount = cols.length;
-
- for (j = 0; j < colCount; j++) {
- cells.push({
- tag: 'td',
- html: cols[j].header,
- colspan: cols[j].span
- });
- }
-
- rows[i] = {
- tag: 'tr',
- cn: cells
- };
- }
-
- return rows;
- },
-
- /**
- * @private
- * Specialised renderer for vertical oriented axes
- * @return {Object} The HTML Domspec for a vertical oriented axis
- */
- renderVerticalRows: function() {
- var headers = this.buildHeaders(),
- colCount = headers.length,
- rowCells = [],
- rows = [],
- rowCount, col, row, colWidth, i, j;
-
- for (i = 0; i < colCount; i++) {
- col = headers[i];
- colWidth = col.width || 80;
- rowCount = col.items.length;
-
- for (j = 0; j < rowCount; j++) {
- row = col.items[j];
-
- rowCells[row.start] = rowCells[row.start] || [];
- rowCells[row.start].push({
- tag : 'td',
- html : row.header,
- rowspan: row.span,
- width : Ext.isBorderBox ? colWidth : colWidth - this.paddingWidth
- });
- }
- }
-
- rowCount = rowCells.length;
- for (i = 0; i < rowCount; i++) {
- rows[i] = {
- tag: 'tr',
- cn : rowCells[i]
- };
- }
-
- return rows;
- },
-
- /**
- * @private
- * Returns the set of all unique tuples based on the bound store and dimension definitions.
- * Internally we construct a new, temporary store to make use of the multi-sort capabilities of Store. In
- * 4.x this functionality should have been moved to MixedCollection so this step should not be needed.
- * @return {Array} All unique tuples
- */
- getTuples: function() {
- var newStore = new Ext.data.Store({});
-
- newStore.data = this.store.data.clone();
- newStore.fields = this.store.fields;
-
- var sorters = [],
- dimensions = this.dimensions,
- length = dimensions.length,
- i;
-
- for (i = 0; i < length; i++) {
- sorters.push({
- field : dimensions[i].dataIndex,
- direction: dimensions[i].direction || 'ASC'
- });
- }
-
- newStore.sort(sorters);
-
- var records = newStore.data.items,
- hashes = [],
- tuples = [],
- recData, hash, info, data, key;
-
- length = records.length;
-
- for (i = 0; i < length; i++) {
- info = this.getRecordInfo(records[i]);
- data = info.data;
- hash = "";
-
- for (key in data) {
- hash += data[key] + '---';
- }
-
- if (hashes.indexOf(hash) == -1) {
- hashes.push(hash);
- tuples.push(info);
- }
- }
-
- newStore.destroy();
-
- return tuples;
- },
-
- /**
- * @private
- */
- getRecordInfo: function(record) {
- var dimensions = this.dimensions,
- length = dimensions.length,
- data = {},
- dimension, dataIndex, i;
-
- //get an object containing just the data we are interested in based on the configured dimensions
- for (i = 0; i < length; i++) {
- dimension = dimensions[i];
- dataIndex = dimension.dataIndex;
-
- data[dataIndex] = record.get(dataIndex);
- }
-
- //creates a specialised matcher function for a given tuple. The returned function will return
- //true if the record passed to it matches the dataIndex values of each dimension in this axis
- var createMatcherFunction = function(data) {
- return function(record) {
- for (var dataIndex in data) {
- if (record.get(dataIndex) != data[dataIndex]) {
- return false;
- }
- }
-
- return true;
- };
- };
-
- return {
- data: data,
- matcher: createMatcherFunction(data)
- };
- },
-
- /**
- * @private
- * Uses the calculated set of tuples to build an array of headers that can be rendered into a table using rowspan or
- * colspan. Basically this takes the set of tuples and spans any cells that run into one another, so if we had dimensions
- * of Person and Product and several tuples containing different Products for the same Person, those Products would be
- * spanned.
- * @return {Array} The headers
- */
- buildHeaders: function() {
- var tuples = this.getTuples(),
- rowCount = tuples.length,
- dimensions = this.dimensions,
- colCount = dimensions.length,
- headers = [],
- tuple, rows, currentHeader, previousHeader, span, start, isLast, changed, i, j;
-
- for (i = 0; i < colCount; i++) {
- dimension = dimensions[i];
- rows = [];
- span = 0;
- start = 0;
-
- for (j = 0; j < rowCount; j++) {
- tuple = tuples[j];
- isLast = j == (rowCount - 1);
- currentHeader = tuple.data[dimension.dataIndex];
-
- /*
- * 'changed' indicates that we need to create a new cell. This should be true whenever the cell
- * above (previousHeader) is different from this cell, or when the cell on the previous dimension
- * changed (e.g. if the current dimension is Product and the previous was Person, we need to start
- * a new cell if Product is the same but Person changed, so we check the previous dimension and tuple)
- */
- changed = previousHeader != undefined && previousHeader != currentHeader;
- if (i > 0 && j > 0) {
- changed = changed || tuple.data[dimensions[i-1].dataIndex] != tuples[j-1].data[dimensions[i-1].dataIndex];
- }
-
- if (changed) {
- rows.push({
- header: previousHeader,
- span : span,
- start : start
- });
-
- start += span;
- span = 0;
- }
-
- if (isLast) {
- rows.push({
- header: currentHeader,
- span : span + 1,
- start : start
- });
-
- start += span;
- span = 0;
- }
-
- previousHeader = currentHeader;
- span++;
- }
-
- headers.push({
- items: rows,
- width: dimension.width || this.defaultHeaderWidth
- });
-
- previousHeader = undefined;
- }
-
- return headers;
- }
-});