API Docs for: 3.0.1.91d25ad1
Show:

File: addon/components/models-table/cell-column-summary.js

import {layout as templateLayout, tagName} from '@ember-decorators/component';
import Component from '@ember/component';
import {get, computed} from '@ember/object';
import layout from '../../templates/components/models-table/cell-column-summary';

function sumBy(collection) {
  return computed(`${collection}.[]`, function () {
    const c = get(this, collection);
    return c ? c.reduce((a, b) => a + b, 0) : 0;
  });
}

function avgBy(collection, sumBy) {
  return computed(sumBy, function () {
    const count = get(this, `${collection}.length`);
    return count ? get(this, sumBy) / count : 0;
  });
}

function minBy(collection) {
  return computed(`${collection}.[]`, function () {
    return Math.min.apply(Math, get(this, collection));
  });
}

function maxBy(collection) {
  return computed(`${collection}.[]`, function () {
    return Math.max.apply(Math, get(this, collection));
  });
}

function medianBy(collection) {
  return computed(`${collection}.[]`, function () {
    let c = get(this, collection);
    if (!get(c, 'length')) {
      return null;
    }
    c = c.slice().sort((a, b) => a - b);
    let lowMiddle = Math.floor((c.length - 1) / 2);
    let highMiddle = Math.ceil((c.length - 1) / 2);
    return (c[lowMiddle] + c[highMiddle]) / 2;
  });
}

/**
 * Component for table-footer cells. Used as column-summary.
 *
 * It yields several properties:
 *
 * * [minSelected](Components.ModelsTableCellColumnSummary.html#property_minSelected) - min of selected items
 * * [maxSelected](Components.ModelsTableCellColumnSummary.html#property_maxSelected) - max of selected items
 * * [sumSelected](Components.ModelsTableCellColumnSummary.html#property_sumSelected) - sum of selected items
 * * [avgSelected](Components.ModelsTableCellColumnSummary.html#property_avgSelected) - average of selected items
 * * [medianSelected](Components.ModelsTableCellColumnSummary.html#property_medianSelected) - median of selected items
 * * [minData](Components.ModelsTableCellColumnSummary.html#property_minData) - min of data
 * * [maxData](Components.ModelsTableCellColumnSummary.html#property_maxData) - max of data
 * * [sumData](Components.ModelsTableCellColumnSummary.html#property_sumData) - sum of data
 * * [avgData](Components.ModelsTableCellColumnSummary.html#property_avgData) - average of data
 * * [medianData](Components.ModelsTableCellColumnSummary.html#property_medianData) - median of data
 *
 * Here `selectedItems` and `data` are bound from `models-table` and are mapped by `column.propertyName`.
 *
 * Component should be used only for column with set `propertyName`.
 *
 * Component should be extended or its template should be overridden.
 *
 * @namespace Components
 * @class ModelsTableCellColumnSummary
 * @extends Ember.Component
 */
export default
@templateLayout(layout)
@tagName('td')
class CellColumnSummaryComponent extends Component {

  /**
   * @property tagName
   * @type string
   * @default 'td'
   */

  /**
   * Bound from [ModelsTable.selectedItems](Components.ModelsTable.html#property_selectedItems)
   *
   * @property selectedItems
   * @type object[]
   * @default null
   */
  selectedItems = null;

  /**
   * Bound from [ModelsTable.expandedItems](Components.ModelsTable.html#property_expandedItems)
   *
   * @property expandedItems
   * @type object[]
   * @default null
   */
  expandedItems = null;

  /**
   * Bound from [ModelsTable.data](Components.ModelsTable.html#property_data)
   *
   * @property data
   * @type object[]
   * @default null
   */
  data = null;

  /**
   * `selectedItems.mapBy(column.propertyName)`
   *
   * @property mappedSelectedItems
   * @default []
   * @type array
   */
  mappedSelectedItems = [];

  /**
   * `expandedItems.mapBy(column.propertyName)`
   *
   * @property mappedExpandedItems
   * @default []
   * @type array
   */
  mappedExpandedItems = [];

  /**
   * `data.mapBy(column.propertyName)`
   *
   * @property mappedData
   * @default []
   * @type object[]
   */
  mappedData = [];

  /**
   * @property minSelected
   * @type number
   * @protected
   */
  @minBy('mappedSelectedItems') minSelected;

  /**
   * @property minData
   * @type number
   * @protected
   */
  @minBy('mappedData') minData;

  /**
   * @property maxSelected
   * @type number
   * @protected
   */
  @maxBy('mappedSelectedItems') maxSelected;

  /**
   * @property maxData
   * @type number
   * @protected
   */
  @maxBy('mappedData') maxData;

  /**
   * @property sumSelected
   * @type number
   * @protected
   */
  @sumBy('mappedSelectedItems') sumSelected;

  /**
   * @property sumData
   * @type number
   * @protected
   */
  @sumBy('mappedData') sumData;

  /**
   * @property avgSelected
   * @type number
   * @protected
   */
  @avgBy('mappedSelectedItems', 'sumSelected') avgSelected;

  /**
   * @property avgData
   * @type number
   * @protected
   */
  @avgBy('mappedData', 'sumData') avgData;

  /**
   * @property medianSelected
   * @type number
   * @protected
   */
  @medianBy('mappedSelectedItems') medianSelected;

  /**
   * @property medianData
   * @type number
   * @protected
   */
  @medianBy('mappedData') medianData;

}