myems-web/src/components/dashboard-alt/TotalSales.js

Summary

Maintainability
F
6 days
Test Coverage
import React, { useContext, useState } from 'react';
import { Card, CardBody, CustomInput } from 'reactstrap';
import PropTypes from 'prop-types';
import * as echarts from 'echarts/lib/echarts';
import ReactEchartsCore from 'echarts-for-react/lib/core';
import { getPosition, getGrays, themeColors, rgbaColor, isIterableArray, capitalize } from '../../helpers/utils';
import CardDropdown from './CardDropdown';
import FalconCardHeader from '../common/FalconCardHeader';
import Flex from '../common/Flex';
import AppContext from '../../context/Context';

import { BarChart } from 'echarts/charts';
import { TooltipComponent, LegendComponent } from 'echarts/components';

import { totalSalesByMonth } from '../../data/dashboard/topProducts';

echarts.use([BarChart, TooltipComponent, LegendComponent]);
function getFormatter(params) {
  const { name, value } = params[0];
  return `${Object.keys(totalSalesByMonth)[0]} ${name}, ${value}`;
}

const getOption = (month, isDark) => {
  const grays = getGrays(isDark);
  return {
    tooltip: {
      trigger: 'axis',
      padding: [7, 10],
      backgroundColor: grays.white,
      borderColor: grays['300'],
      borderWidth: 1,
      textStyle: { color: themeColors.dark },
      formatter(params) {
        return getFormatter(params);
      },
      transitionDuration: 0,
      position(pos, params, dom, rect, size) {
        return getPosition(pos, params, dom, rect, size);
      }
    },
    xAxis: {
      type: 'category',
      data: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25],
      boundaryGap: false,
      axisPointer: {
        lineStyle: {
          color: grays['300'],
          type: 'dashed'
        }
      },
      splitLine: { show: false },
      axisLine: {
        lineStyle: {
          color: rgbaColor('#000', 0.01),
          type: 'dashed'
        }
      },
      axisTick: { show: false },
      axisLabel: {
        color: grays['400'],
        formatter: function(value) {
          return `${capitalize(month.slice(0, 3))} ${value}`;
        },
        margin: 15
      }
    },
    yAxis: {
      type: 'value',
      axisPointer: { show: false },
      splitLine: {
        lineStyle: {
          color: grays['300'],
          type: 'dashed'
        }
      },
      boundaryGap: false,
      axisLabel: {
        show: true,
        color: grays['400'],
        margin: 15
      },
      axisTick: { show: false },
      axisLine: { show: false }
    },
    series: [
      {
        type: 'line',
        data: totalSalesByMonth[month],
        lineStyle: { color: themeColors.primary },
        itemStyle: {
          color: grays['100'],
          borderColor: themeColors.primary,
          borderWidth: 2
        },
        symbol: 'circle',
        symbolSize: 10,
        smooth: false,
        emphasis: {
          scale: true
        },
        areaStyle: {
          color: {
            type: 'linear',
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [
              {
                offset: 0,
                color: rgbaColor(themeColors.primary, 0.2)
              },
              {
                offset: 1,
                color: rgbaColor(themeColors.primary, 0)
              }
            ]
          }
        }
      }
    ],
    animationDuration: 90000,
    grid: { right: '28px', left: '40px', bottom: '15%', top: '5%' }
  };
};

const TotalSales = ({ className }) => {
  const { isDark } = useContext(AppContext);
  const [month, setMonth] = useState('january');

  const months = Object.keys(totalSalesByMonth);

  return (
    <Card className={className}>
      <FalconCardHeader title="Total Sales" light={false} titleTag="h6" className="pb-0">
        <Flex>
          <CustomInput
            type="select"
            id="exampleCustomSelect"
            bsSize="sm"
            className="select-month mr-2"
            value={month}
            onChange={({ target }) => setMonth(target.value)}
          >
            {isIterableArray(months) &&
              months.map((month, index) => (
                <option key={index} value={month}>
                  {capitalize(month)}
                </option>
              ))}
          </CustomInput>
          <CardDropdown />
        </Flex>
      </FalconCardHeader>

      <CardBody className="h-100">
        <ReactEchartsCore echarts={echarts} option={getOption(month, isDark)} style={{ minHeight: '18.75rem' }} />
      </CardBody>
    </Card>
  );
};

TotalSales.propTypes = {
  className: PropTypes.string
};

export default TotalSales;