mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-18 13:20:43 +00:00
211 lines
9.2 KiB
TypeScript
211 lines
9.2 KiB
TypeScript
/*
|
|
* QQQ - Low-code Application Framework for Engineers.
|
|
* Copyright (C) 2021-2022. Kingsrook, LLC
|
|
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
|
|
* contact@kingsrook.com
|
|
* https://github.com/Kingsrook/
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import Card from "@mui/material/Card";
|
|
import Grid from "@mui/material/Grid";
|
|
import Icon from "@mui/material/Icon";
|
|
import Menu from "@mui/material/Menu";
|
|
import MenuItem from "@mui/material/MenuItem";
|
|
import Tooltip from "@mui/material/Tooltip";
|
|
import {useState} from "react";
|
|
import DefaultLineChart from "examples/Charts/LineCharts/DefaultLineChart";
|
|
import DashboardLayout from "examples/LayoutContainers/DashboardLayout";
|
|
import DataTable from "examples/Tables/DataTable";
|
|
import Footer from "qqq/components/Footer";
|
|
import Navbar from "qqq/components/Navbar";
|
|
import MDBadgeDot from "qqq/components/Temporary/MDBadgeDot";
|
|
import MDBox from "qqq/components/Temporary/MDBox";
|
|
import MDButton from "qqq/components/Temporary/MDButton";
|
|
import MDTypography from "qqq/components/Temporary/MDTypography";
|
|
import ShipmentsByWarehouseTable from "qqq/pages/dashboards/Tables/ShipmentsByWarehouseTable";
|
|
import carrierSpendData from "qqq/pages/dashboards/Widgets/Data/CarrierSpendData";
|
|
import carrierVolumeLineChartData from "qqq/pages/dashboards/Widgets/Data/CarrierVolumeLineChartData";
|
|
import smallShipmentsByWarehouseData from "qqq/pages/dashboards/Widgets/Data/SmallShipmentsByWarehouseData";
|
|
import timeInTransitBarChartData from "qqq/pages/dashboards/Widgets/Data/timeInTransitBarChartData";
|
|
import ShipmentsByCarrierPieChart from "qqq/pages/dashboards/Widgets/ShipmentsByChannelPieChart";
|
|
import SimpleStatisticsCard from "qqq/pages/dashboards/Widgets/SimpleStatisticsCard";
|
|
import HorizontalBarChart from "./Widgets/HorizontalBarChart";
|
|
|
|
function CarrierPerformance(): JSX.Element
|
|
{
|
|
const [salesDropdownValue, setSalesDropdownValue] = useState<string>("Last 30 Days");
|
|
const [customersDropdownValue, setCustomersDropdownValue] = useState<string>("Last 30 Days");
|
|
const [revenueDropdownValue, setRevenueDropdownValue] = useState<string>("Last 30 Days");
|
|
|
|
const [salesDropdown, setSalesDropdown] = useState<string | null>(null);
|
|
const [customersDropdown, setCustomersDropdown] = useState<string | null>(null);
|
|
const [revenueDropdown, setRevenueDropdown] = useState<string | null>(null);
|
|
|
|
const openSalesDropdown = ({currentTarget}: any) => setSalesDropdown(currentTarget);
|
|
const closeSalesDropdown = ({currentTarget}: any) =>
|
|
{
|
|
setSalesDropdown(null);
|
|
setSalesDropdownValue(currentTarget.innerText || salesDropdownValue);
|
|
};
|
|
const openCustomersDropdown = ({currentTarget}: any) => setCustomersDropdown(currentTarget);
|
|
const closeCustomersDropdown = ({currentTarget}: any) =>
|
|
{
|
|
setCustomersDropdown(null);
|
|
setCustomersDropdownValue(currentTarget.innerText || salesDropdownValue);
|
|
};
|
|
const openRevenueDropdown = ({currentTarget}: any) => setRevenueDropdown(currentTarget);
|
|
const closeRevenueDropdown = ({currentTarget}: any) =>
|
|
{
|
|
setRevenueDropdown(null);
|
|
setRevenueDropdownValue(currentTarget.innerText || salesDropdownValue);
|
|
};
|
|
|
|
// Dropdown menu template for the DefaultStatisticsCard
|
|
const renderMenu = (state: any, close: any) => (
|
|
<Menu
|
|
anchorEl={state}
|
|
transformOrigin={{vertical: "top", horizontal: "center"}}
|
|
open={Boolean(state)}
|
|
onClose={close}
|
|
keepMounted
|
|
disableAutoFocusItem
|
|
>
|
|
<MenuItem onClick={close}>Last 7 days</MenuItem>
|
|
<MenuItem onClick={close}>Last week</MenuItem>
|
|
<MenuItem onClick={close}>Last 30 days</MenuItem>
|
|
</Menu>
|
|
);
|
|
|
|
return (
|
|
<DashboardLayout>
|
|
<Navbar />
|
|
<MDBox py={3}>
|
|
<MDBox mb={3}>
|
|
<Grid container spacing={3}>
|
|
<Grid item xs={12} sm={4}>
|
|
<SimpleStatisticsCard
|
|
title="total shipments"
|
|
count="50,234"
|
|
percentage={{
|
|
color: "success",
|
|
value: "+5%",
|
|
label: "since last month",
|
|
}}
|
|
dropdown={{
|
|
action: openSalesDropdown,
|
|
menu: renderMenu(salesDropdown, closeSalesDropdown),
|
|
value: salesDropdownValue,
|
|
}}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={4}>
|
|
<SimpleStatisticsCard
|
|
title="Successful deliveries"
|
|
count="49,234"
|
|
percentage={{
|
|
color: "success",
|
|
value: "+12%",
|
|
label: "since last month",
|
|
}}
|
|
dropdown={{
|
|
action: openCustomersDropdown,
|
|
menu: renderMenu(customersDropdown, closeCustomersDropdown),
|
|
value: customersDropdownValue,
|
|
}}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={4}>
|
|
<SimpleStatisticsCard
|
|
title="service failures"
|
|
count="832"
|
|
percentage={{
|
|
color: "error",
|
|
value: "+1.2%",
|
|
label: "since last month",
|
|
}}
|
|
dropdown={{
|
|
action: openRevenueDropdown,
|
|
menu: renderMenu(revenueDropdown, closeRevenueDropdown),
|
|
value: revenueDropdownValue,
|
|
}}
|
|
/>
|
|
</Grid>
|
|
</Grid>
|
|
</MDBox>
|
|
<MDBox mb={3}>
|
|
<Grid container spacing={3}>
|
|
<Grid item xs={12} sm={6} lg={4}>
|
|
<ShipmentsByCarrierPieChart />
|
|
</Grid>
|
|
<Grid item xs={12} sm={6} lg={8}>
|
|
<DefaultLineChart
|
|
title="Carrier Volume by Month"
|
|
description={
|
|
<MDBox display="flex" justifyContent="space-between">
|
|
<MDBox display="flex" ml={-1}>
|
|
<MDBadgeDot color="dark" size="sm" badgeContent="AxleHire" />
|
|
<MDBadgeDot color="info" size="sm" badgeContent="CDL" />
|
|
<MDBadgeDot color="primary" size="sm" badgeContent="DHL" />
|
|
<MDBadgeDot color="success" size="sm" badgeContent="FedEx" />
|
|
<MDBadgeDot color="error" size="sm" badgeContent="LSO" />
|
|
<MDBadgeDot color="secondary" size="sm" badgeContent="OnTrac" />
|
|
<MDBadgeDot color="warning" size="sm" badgeContent="UPS" />
|
|
</MDBox>
|
|
</MDBox>
|
|
}
|
|
chart={carrierVolumeLineChartData}
|
|
/>
|
|
</Grid>
|
|
</Grid>
|
|
</MDBox>
|
|
<Grid container spacing={3} mb={3}>
|
|
<Grid item xs={12}>
|
|
<Card>
|
|
<MDBox pt={3} px={3}>
|
|
<MDTypography variant="h6" fontWeight="medium">
|
|
Spend by Carrier YTD
|
|
</MDTypography>
|
|
</MDBox>
|
|
<MDBox py={1}>
|
|
<DataTable
|
|
table={carrierSpendData}
|
|
entriesPerPage={false}
|
|
showTotalEntries={false}
|
|
isSorted={false}
|
|
noEndBorder
|
|
/>
|
|
</MDBox>
|
|
</Card>
|
|
</Grid>
|
|
</Grid>
|
|
<MDBox mb={3}>
|
|
<Grid container spacing={3}>
|
|
<Grid item xs={12} lg={8}>
|
|
<HorizontalBarChart title="Time in Transit Last 30 Days" chart={timeInTransitBarChartData} />
|
|
</Grid>
|
|
<Grid item xs={12} lg={4}>
|
|
<ShipmentsByWarehouseTable title="Shipments by Warehouse" rows={smallShipmentsByWarehouseData} />
|
|
</Grid>
|
|
</Grid>
|
|
</MDBox>
|
|
</MDBox>
|
|
<Footer />
|
|
</DashboardLayout>
|
|
);
|
|
}
|
|
|
|
export default CarrierPerformance;
|