You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
12 KiB
JavaScript

import React, { useState, useEffect } from 'react'
import { usePrevious } from 'react-use'
import { Inertia } from '@inertiajs/inertia'
import DatePicker from 'react-datepicker'
import {
Chart as ChartJS,
CategoryScale,
LinearScale,
BarElement,
Title,
Tooltip,
Legend,
} from 'chart.js'
import { Bar } from 'react-chartjs-2'
ChartJS.register(CategoryScale, LinearScale, BarElement, Title, Tooltip)
import Authenticated from '@/Layouts/Authenticated'
import { Head } from '@inertiajs/inertia-react'
import { formatIDR } from '@/utils'
export default function Dashboard(props) {
const {
employee,
product,
totalAmount,
totalItem,
employees,
products,
charts,
_startDate,
_endDate,
} = props
const [startDate, setStartDate] = useState(
_startDate ? new Date(_startDate) : new Date()
)
const [endDate, setEndDate] = useState(
_endDate ? new Date(_endDate) : new Date()
)
const preValue = usePrevious(`${startDate}-${endDate}`)
const options = {
responsive: true,
};
const data = {
labels: charts.map((item) => item.date),
datasets: [
{
label: 'Sales',
data: charts.map((item) => item.amount),
backgroundColor: 'rgb(87, 13, 248, 0.5)', //rgb(87, 13, 248, 0.5) //rgba(255, 99, 132, 0.5)
},
],
}
useEffect(() => {
if (preValue) {
Inertia.get(route(route().current()), {startDate, endDate}, {
replace: true,
preserveState: true,
})
}
}, [startDate, endDate])
return (
<Authenticated
auth={props.auth}
errors={props.errors}
3 years ago
header={
<h2 className="font-semibold text-xl text-gray-800 leading-tight">
Dashboard
</h2>
}
>
<Head title="Dashboard" />
<div className="py-12">
<div className="flex flex-col md:flex-row sm:px-6 lg:px-8 space-x-0 md:space-x-4 space-y-2 md:space-y-0">
3 years ago
<div className="bg-white overflow-hidden shadow-sm rounded-lg w-full">
<div className="py-4 px-4 font-bold text-xl">
<div className="text-4xl">{product}</div>
Barang
3 years ago
</div>
</div>
<div className="bg-white overflow-hidden shadow-sm rounded-lg w-full">
<div className="py-4 px-4 font-bold text-xl">
<div className="text-4xl">{employee}</div>
Karyawan
3 years ago
</div>
</div>
<div className="bg-white overflow-hidden shadow-sm rounded-lg w-full">
<div className="py-4 px-4 font-bold text-xl">
<div className="text-4xl">
Rp. {formatIDR(totalAmount)}
</div>
Minggu ini
</div>
</div>
<div className="bg-white overflow-hidden shadow-sm rounded-lg w-full">
<div className="py-4 px-4 font-bold text-xl">
<div className="text-4xl">
{formatIDR(totalItem)}
</div>
Minggu ini
</div>
</div>
</div>
<div className="flex flex-col md:flex-row sm:px-6 lg:px-8 space-x-0 md:space-x-4 space-y-2 md:space-y-0 mt-4">
<div className="bg-white overflow-hidden shadow-sm rounded-lg w-full">
<div className="flex flex-col md:flex-row justify-between pt-4 px-4 font-bold text-xl">
<div className="my-auto">Gajian Minggu ini</div>
<div>
<div className="flex flex-row md:space-x-4">
<div>
<label className="label">
<span className="label-text">
Tanggal Awal
</span>
</label>
<div className="relative">
<DatePicker
selected={startDate}
onChange={(date) => {
setStartDate(date)
}}
format="dd/mm/yyyy"
className="input input-bordered"
nextMonthButtonLabel=">"
previousMonthButtonLabel="<"
/>
<div className="absolute right-2.5 rounded-l-none y-0 flex items-center top-2.5">
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</svg>
</div>
</div>
</div>
<div>
<label className="label">
<span className="label-text">
Tanggal Akhir
</span>
</label>
<div className="relative">
<DatePicker
selected={endDate}
onChange={(date) => {
setEndDate(date)
}}
format="dd/mm/yyyy"
className="input input-bordered"
nextMonthButtonLabel=">"
previousMonthButtonLabel="<"
/>
<div className="absolute right-2.5 rounded-l-none y-0 flex items-center top-2.5">
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</svg>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="px-4 pb-4">
<Bar options={options} data={data} className='max-h-96' />;
</div>
</div>
</div>
<div className="flex flex-col md:flex-row sm:px-6 lg:px-8 space-x-0 md:space-x-4 space-y-2 md:space-y-0 mt-4">
<div className="bg-white overflow-hidden shadow-sm rounded-lg w-full">
<div className="py-4 px-4 font-bold text-xl border-b-2 border-b-gray-400">
Kerjaan karyawan minggu ini
</div>
<div className="overflow-x-auto">
<table className="table w-full table-compact">
<thead>
<tr>
<th>Nama</th>
<th>Quantity</th>
<th>Grand Total</th>
</tr>
</thead>
<tbody>
{employees.map((item) => (
<tr
key={`employee-${item.employee_id}`}
>
<td>{item.employee.name}</td>
<td>{formatIDR(item.count)}</td>
<td>{formatIDR(item.amount)}</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
<div className="bg-white overflow-hidden shadow-sm rounded-lg w-full">
<div className="py-4 px-4 font-bold text-xl border-b-2 border-b-gray-400">
Produk Masuk minggu ini
</div>
<div className="overflow-x-auto">
<table className="table w-full table-compact">
<thead>
<tr>
<th>Nama</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
{products.map((item) => (
<tr key={`product-${item.product_id}`}>
<td>{item.product.name}</td>
<td>{formatIDR(item.count)}</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
</div>
</div>
</Authenticated>
3 years ago
)
}