All files / average-table/components/AverageTable index.jsx

42.11% Statements 8/19
0% Branches 0/6
0% Functions 0/3
42.11% Lines 8/19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110                          1x             1x         1x                   1x       1x                               1x                                                     1x         1x                                            
import React from 'react';
import PropTypes from 'prop-types';
import styled from 'styled-components';
import {
  ChartStateNoData as NoData,
  ChartStateLoading as Loading,
  ChartCard,
  ChartHeader,
  GridItem,
} from '@bufferapp/analyze-shared-components';
import AddReport from '@bufferapp/add-report';
import Title from '../Title';
 
const Grid = styled.ul`
  display: flex;
  flex-wrap: wrap;
  padding: 0;
  margin: 0 auto;
`;
 
const Container = styled.div`
  position: relative;
  padding: 0 1.5rem 1rem;
`;
 
export const Table = ({ daily, totals }) =>
  <Grid>
    {totals.map(metric => <GridItem
      key={metric.label}
      metric={metric}
      dailyData={daily}
      gridWidth={`${100 / totals.length}%`}
    />)}
  </Grid>;
 
Table.defaultProps = {
  daily: [],
};
 
Table.propTypes = {
  daily: PropTypes.arrayOf(PropTypes.shape({
    day: PropTypes.string,
    metrics: PropTypes.arrayOf(PropTypes.shape({
      diff: PropTypes.number,
      label: PropTypes.string,
      value: PropTypes.number,
    })),
  })),
  totals: PropTypes.arrayOf(PropTypes.shape({
    label: PropTypes.string,
    value: PropTypes.number,
    diff: PropTypes.number,
  })).isRequired,
};
 
const AverageTable = ({ metrics, loading, hasError }) => {
  let content = null;
  if (hasError) {
    content = null
  } else if (loading) {
    content = <Loading active noBorder />;
  } else if (metrics.totals.length === 0) {
    content = <NoData />;
  } else {
    content = (
      <Table daily={metrics.daily} totals={metrics.totals} />
    );
  }
 
  return (
    <ChartCard hasError={hasError} >
      <ChartHeader>
        <Title />
        <AddReport chart="average" />
      </ChartHeader>
      <Container id="js-dom-to-png-average">
        {content}
      </Container>
    </ChartCard>
  );
};
 
AverageTable.defaultProps = {
  loading: false,
  hasError: false,
};
 
AverageTable.propTypes = {
  loading: PropTypes.bool,
  hasError: PropTypes.bool,
  metrics: PropTypes.shape({
    daily: PropTypes.arrayOf(PropTypes.shape({
      day: PropTypes.string,
      metrics: PropTypes.arrayOf(PropTypes.shape({
        diff: PropTypes.number,
        label: PropTypes.string,
        value: PropTypes.number,
      })),
    })),
    totals: PropTypes.arrayOf(PropTypes.shape({
      label: PropTypes.string,
      value: PropTypes.number,
      diff: PropTypes.number,
    })),
  }).isRequired,
};
 
export default AverageTable;