govau/performance-dashboard

View on GitHub
client/src/editor/scripts/components/datagroupPreview/datagroupPreview.js

Summary

Maintainability
A
25 mins
Test Coverage
import React from 'react';
import PropTypes from 'prop-types';
import LegendDot from './../svgs/legendDot';
import { getHumanisedUnits } from 'shared/redux/datasets/datasetsHelper';
import { getHumanisedVeryShortDate } from 'shared/utils/formatDates';
import { formatCurrency2dp } from './../../utils/formatCurrency';
import { formatPercentile2dp } from './../../utils/formatPercentile';

/**
 * Format and decorate value provided for the View
 * @param value {Number|String<Number>|null}
 * @param units {String}
 * @returns {String}
 */
export const formatValue = (value, units) => {
  if (typeof value === 'undefined') {
    throw Error(
      'Group has no datapoint or value is not provided. Something is very wrong.',
    );
  }

  if (value === null) {
    return 'No data';
  }

  let formattedValue;
  let formattedUnits = getHumanisedUnits(units);
  let unitsStr = formattedUnits ? ` ${formattedUnits}` : '';
  if (units === '$') {
    formattedValue = formatCurrency2dp(value) + unitsStr;
  } else if (units === '%') {
    formattedValue = formatPercentile2dp(value) + unitsStr;
  } else {
    formattedValue = value + unitsStr;
  }
  return formattedValue;
};

const Preview = ({ slice, getColorByRowFn }) => {
  return (
    <div className="preview">
      <p className="most-recent-text strong">
        {slice.period === 'custom' && slice.row_label}

        {slice.period !== 'custom' &&
          getHumanisedVeryShortDate(slice.period_start)}
      </p>
      {slice.groups.map((group, idx) => {
        return (
          <div key={idx} className="preview-table">
            <span className="key">
              <LegendDot color={getColorByRowFn(idx)} />
            </span>

            {!!group.dataset && (
              <span className="description">{group.dataset.label}</span>
            )}

            {!!group.dataset && (
              <span className="value">
                {formatValue(
                  typeof group.value !== 'undefined' ? group.value : null,
                  group.dataset.units,
                )}
              </span>
            )}
          </div>
        );
      })}
    </div>
  );
};

Preview.propTypes = {
  slice: PropTypes.object.isRequired,
  getColorByRowFn: PropTypes.func.isRequired,
};

export default Preview;