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

Summary

Maintainability
A
3 hrs
Test Coverage
import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import FalconCardHeader from '../common/FalconCardHeader';
import CardDropdown from './CardDropdown';
import { Button, Card, CardBody } from 'reactstrap';
import { Link } from 'react-router-dom';
import Flex from '../common/Flex';
import * as echarts from 'echarts/lib/echarts';
import ReactEchartsCore from 'echarts-for-react/lib/core';
import { getPosition, getGrays } from '../../helpers/utils';
import AppContext from '../../context/Context';
import { BarChart } from 'echarts/charts';
import { TooltipComponent, LegendComponent } from 'echarts/components';

echarts.use([BarChart, TooltipComponent, LegendComponent]);
const getOption = (data, colors, isDark) => {
  const grays = getGrays(isDark);
  return {
    dataset: { source: data },
    tooltip: {
      trigger: 'item',
      padding: [7, 10],
      backgroundColor: grays.white,
      borderColor: grays['300'],
      borderWidth: 1,
      textStyle: { color: grays.dark },
      transitionDuration: 0,
      position(pos, params, dom, rect, size) {
        return getPosition(pos, params, dom, rect, size);
      },
      formatter: function(params) {
        return `<div class="font-weight-semi-bold">${params.seriesName}</div><div class="fs--1 text-600">
        <strong>${params.name}:</strong> ${params.value[params.componentIndex + 1]}
      </div>`;
      }
    },
    legend: {
      data: data[0].slice(1),
      left: 'left',
      itemWidth: 10,
      itemHeight: 10,
      borderRadius: 0,
      icon: 'circle',
      inactiveColor: grays['500'],
      textStyle: { color: grays['1100'] }
    },
    xAxis: {
      type: 'category',
      axisLabel: { color: grays['400'] },
      axisLine: {
        lineStyle: {
          color: grays['300'],
          type: 'dashed'
        }
      },
      axisTick: false,
      boundaryGap: true
    },
    yAxis: {
      axisPointer: { type: 'none' },
      axisTick: 'none',
      splitLine: {
        lineStyle: {
          color: grays['300'],
          type: 'dashed'
        }
      },
      axisLine: { show: false },
      axisLabel: { color: grays['400'] }
    },
    series: data[0].slice(1).map((value, index) => ({
      type: 'bar',
      barWidth: '12%',
      barGap: '30%',
      label: { normal: { show: false } },
      z: 10,
      itemStyle: {
        normal: {
          barBorderRadius: [10, 10, 0, 0],
          color: colors[index]
        }
      }
    })),
    grid: { right: '0', left: '30px', bottom: '10%', top: '20%' }
  };
};

const TopProducts = ({ data, colors, className }) => {
  const { isDark } = useContext(AppContext);

  return (
    <Card className={className}>
      <FalconCardHeader title="Top Products" titleTag="h6" className="py-2">
        <Flex>
          <Button color="link" size="sm" tag={Link} className="mr-2" to="#!">
            View Details
          </Button>
          <CardDropdown />
        </Flex>
      </FalconCardHeader>
      <CardBody className="h-100">
        <ReactEchartsCore
          echarts={echarts}
          option={getOption(data, colors, isDark)}
          style={{ minHeight: '18.75rem' }}
        />
      </CardBody>
    </Card>
  );
};

TopProducts.propTypes = {
  data: PropTypes.array.isRequired,
  colors: PropTypes.arrayOf(PropTypes.string).isRequired,
  className: PropTypes.string
};

export default TopProducts;