revenue-updates-chart

PreviousNext

A Chart component with optional code display for UI blocks.

Docs
tailwind-admincomponent

Preview

Loading preview…
app/components/ui-blocks/charts/code/RevenueUpdatesCode.tsx
"use client"
import { useState } from "react"
import { Button } from "@/components/ui/button";
import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import dynamic from "next/dynamic";
import { Icon } from "@iconify/react/dist/iconify.js";
import { Card } from "@/components/ui/card";
const Chart = dynamic(() => import("react-apexcharts"), { ssr: false });

const RevenueUpdate = () => {
  const [selectedMonth, setSelectedMonth] = useState("Year 2025");

  // Chart data for each month
  const chartDataByMonth: Record<string, any> = {
    'Year 2025': {
      series: [
        { name: 'Earnings ', data: [1500, 2700, 2200, 3000, 1500, 1000, 1400] },
        { name: 'Expense ', data: [-1800, -1100, -2500, -1500, -600, -1800, -1200] },
      ],
      xaxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'],
      },
    },
    'Year 2024': {
      series: [
        { name: 'Earnings ', data: [2000, 2500, 2800, 3000, 2000, 1500, 2700] },
        { name: 'Expense ', data: [-1200, -1500, -2000, -1000, -800, -1300, -1500] },
      ],
      xaxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'],
      },
    },
    'Year 2023': {
      series: [
        { name: 'Earnings ', data: [1800, 2200, 2600, 3000, 1700, 1200, 2000] },
        { name: 'Expense ', data: [-1500, -1300, -2200, -1200, -700, -1600, -1200] },
      ],
      xaxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'],
      },
    },
  };

  // Base chart options (shared)
  const baseChartOptions = {
    chart: {
      toolbar: { show: false },
      type: 'bar' as const,
      fontFamily: 'inherit',
      foreColor: '#adb0bb',
      height: 310,
      stacked: true,
      width: '100%',
      offsetX: -20,
      animations: {
        enabled: true,
        easing: 'easeinout' as const,
        speed: 800,
        animateGradually: {
          enabled: true,
          delay: 150,
        },
        dynamicAnimation: {
          enabled: true,
          speed: 800,
        },
      },
    },
    colors: ['var(--color-primary)', 'var(--color-secondary)'],
    plotOptions: {
      bar: {
        horizontal: false,
        barHeight: '60%',
        columnWidth: '20%',
        borderRadius: 6,
        borderRadiusApplication: 'end',
        borderRadiusWhenStacked: 'all',
      } satisfies {
        borderRadiusApplication?: 'end' | 'around';
        borderRadiusWhenStacked?: 'all';
        horizontal?: boolean;
        barHeight?: string;
        columnWidth?: string;
        borderRadius?: number;
      },
    },
    dataLabels: { enabled: false },
    legend: { show: false },
    grid: {
      borderColor: 'rgba(0,0,0,0.1)',
      strokeDashArray: 3,
    },

    yaxis: {
      min: -3000,
      max: 3000,
      labels: {
        formatter: (val: number) => {
          return `${val / 1000}k`;
        },
      },
    },
    tooltip: {
      theme: 'dark',
      y: {
        formatter: (val: number) => {
          return `${(val / 1000).toFixed(1)}k`;
        },
      },
    },
  };

  const ChartData = {
    ...baseChartOptions,
    xaxis: {
      ...chartDataByMonth[selectedMonth].xaxis,
      axisBorder: {
        show: false,
      },
      axisTicks: {
        show: false,
      },
    },
  };

  return (
    <>
      <Card>
        <div className="h-full">
          <div className="sm:flex items-center justify-between mb-6">
            <div>
              <h5 className="text-lg font-semibold text-dark dark:text-white">Revenue Updates</h5>
              <p className="text-sm">Overview of profit</p>
            </div>
            <div className="sm:mt-0 mt-4">
              <Select value={selectedMonth} onValueChange={setSelectedMonth}>
                <SelectTrigger>
                  <SelectValue placeholder="Select a Year" />
                </SelectTrigger>
                <SelectContent>
                  <SelectGroup>
                    <SelectItem value="Year 2025">Year 2025</SelectItem>
                    <SelectItem value="Year 2024">Year 2024</SelectItem>
                    <SelectItem value="Year 2023">Year 2023</SelectItem>
                  </SelectGroup>
                </SelectContent>
              </Select>
            </div>
          </div>
          <div className="grid grid-cols-12 items-center gap-6">
            <div className="lg:col-span-8 md:col-span-8 sm:col-span-12 col-span-12">
              <div>
                <Chart
                  options={ChartData}
                  series={chartDataByMonth[selectedMonth].series}
                  type="bar"
                  height="330px"
                  width={"100%"}
                />
              </div>
            </div>
            <div className="lg:col-span-4 md:col-span-4 sm:col-span-12 col-span-12">
              <div className="flex items-center gap-4">
                <div className="bg-lightprimary dark:bg-darkprimary shrink-0 h-10 w-10 flex justify-center items-center rounded-md">
                  <Icon icon="tabler:grid-dots" className="text-xl text-primary" />
                </div>
                <div>
                  <h4 className="text-2xl text-dark dark:text-white font-semibold">
                    $63,489.50
                  </h4>
                  <p className="text-sm">Total Earnings</p>
                </div>
              </div>
              <div className="flex items-baseline gap-3 pt-9">
                <i className="h-2 w-2 rounded-full bg-primary" />
                <div>
                  <p className="text-sm">Earnings this month</p>
                  <h6 className="text-lg">$48,820</h6>
                </div>
              </div>
              <div className="flex items-baseline gap-3 pt-5">
                <i className="h-2 w-2  rounded-full bg-secondary" />
                <div>
                  <p className="text-sm">Expense this month</p>
                  <h6 className="text-lg">$26,498</h6>
                </div>
              </div>
              <a href="/assets/revenue_expense_report.csv" download >
                <Button color="primary" className="mt-7 rounded-md capitalize w-full" >
                  view full report
                </Button>
              </a>
            </div>
          </div>
        </div>
      </Card>
    </>
  )
}
export default RevenueUpdate

Installation

npx shadcn@latest add @tailwind-admin/revenue-updates-chart

Usage

import { RevenueUpdatesChart } from "@/components/revenue-updates-chart"
<RevenueUpdatesChart />