All files / components/Admin/AdminHome OrdersApexChartsModal.vue

100% Statements 3/3
100% Branches 0/0
100% Functions 0/0
100% Lines 3/3

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 111 112 113 114 115 116 117                                                                                  1x   1x                                                                                                                                         1x        
<template>
  <BModal
    v-model="show"
    id="orders-apex-charts"
    title="Orders"
    size="lg"
    centered
    hide-footer
  >
    <div class="d-flex flex-column justify-content-center align-items-center">
      <div class="d-flex justify-content-start w-100">
        <button
          class="btn mx-1"
          :class="active === 'month' ? 'btn-success' : 'btn-primary'"
          v-on:click="byMonth"
        >
          month
        </button>
        <button
          class="btn btn-primary mx-1"
          :class="active === 'half year' ? 'btn-success' : 'btn-primary'"
          v-on:click="byHalfYear"
        >
          half year</button
        ><button
          class="btn btn-primary mx-1"
          :class="active === 'year' ? 'btn-success' : 'btn-primary'"
          v-on:click="byYear"
        >
          year
        </button>
      </div>
      <VueApexCharts
        class="w-100"
        height="400"
        :options="chartOptions"
        :series="series"
      />
    </div>
  </BModal>
</template>
 
<script>
import { mapGetters, mapActions } from "vuex";
 
export default {
  name: "OrdersApexChartsModal",
  data: () => ({
    show: false,
    active: "month",
    chartOptions: {
      chart: {
        id: "vuechart-example",
        type: "area",
      },
      xaxis: {
        type: "datetime",
      },
    },
    series: [{ name: "orders", data: [] }],
  }),
  methods: {
    ...mapActions({
      getOrdersByTime: "admin_orders/getOrdersByTime",
    }),
    byMonth: function () {
      const fromDate = new Date(new Date().setMonth(new Date().getMonth() - 1));
 
      this.setOrdersByTime(fromDate);
      this.active = "month";
    },
    byHalfYear: function () {
      const fromDate = new Date(new Date().setMonth(new Date().getMonth() - 6));
 
      this.setOrdersByTime(fromDate);
      this.active = "half year";
    },
    byYear: function () {
      const fromDate = new Date(
        new Date().setFullYear(new Date().getFullYear() - 1)
      );
 
      this.setOrdersByTime(fromDate);
      this.active = "year";
    },
    setOrdersByTime: async function (fromDate) {
      const result = await this.getOrdersByTime(fromDate);
 
      const data = result.reduce((acc, item) => {
        const date = new Date(item.created_at).toDateString();
 
        if (!acc.length) {
          acc.push({ x: date, y: 1 });
          return acc;
        }
 
        const index = acc.findIndex((item) => item.x === date);
 
        if (index !== -1) {
          acc[index].y = acc[index].y + 1;
        } else {
          acc.push({ x: date, y: 1 });
        }
        return acc;
      }, []);
 
      this.series[0].data = data;
    },
  },
  async mounted() {
    this.byMonth();
  },
};
</script>
 
<style scoped>
</style>