mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-18 05:10:45 +00:00
CE-604 Initial checkin
This commit is contained in:
104
src/qqq/components/widgets/components/ChartSubheaderWithData.tsx
Normal file
104
src/qqq/components/widgets/components/ChartSubheaderWithData.tsx
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* 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 {Skeleton} from "@mui/material";
|
||||||
|
import Box from "@mui/material/Box";
|
||||||
|
import Icon from "@mui/material/Icon";
|
||||||
|
import Typography from "@mui/material/Typography";
|
||||||
|
import React from "react";
|
||||||
|
import {Link} from "react-router-dom";
|
||||||
|
import colors from "qqq/assets/theme/base/colors";
|
||||||
|
import ValueUtils from "qqq/utils/qqq/ValueUtils";
|
||||||
|
|
||||||
|
export interface ChartSubheaderData
|
||||||
|
{
|
||||||
|
mainNumber: number;
|
||||||
|
vsPreviousPercent: number;
|
||||||
|
vsPreviousNumber: number;
|
||||||
|
isUpVsPrevious: boolean;
|
||||||
|
isGoodVsPrevious: boolean;
|
||||||
|
vsDescription: string;
|
||||||
|
mainNumberUrl: string;
|
||||||
|
previousNumberUrl: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Props
|
||||||
|
{
|
||||||
|
chartSubheaderData: ChartSubheaderData;
|
||||||
|
}
|
||||||
|
|
||||||
|
const GOOD_COLOR = colors.success.main;
|
||||||
|
const BAD_COLOR = colors.error.main;
|
||||||
|
const UP_ICON = "arrow_drop_up";
|
||||||
|
const DOWN_ICON = "arrow_drop_down";
|
||||||
|
|
||||||
|
function StackedBarChart({chartSubheaderData}: Props): JSX.Element
|
||||||
|
{
|
||||||
|
let color = "black";
|
||||||
|
if (chartSubheaderData && chartSubheaderData.isGoodVsPrevious != null)
|
||||||
|
{
|
||||||
|
color = chartSubheaderData.isGoodVsPrevious ? GOOD_COLOR : BAD_COLOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
let iconName: string = null;
|
||||||
|
if (chartSubheaderData && chartSubheaderData.isUpVsPrevious != null)
|
||||||
|
{
|
||||||
|
iconName = chartSubheaderData.isUpVsPrevious ? UP_ICON : DOWN_ICON;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mainNumberElement = <Typography variant="h2" display="inline">{ValueUtils.getFormattedNumber(chartSubheaderData.mainNumber)}</Typography>;
|
||||||
|
if(chartSubheaderData.mainNumberUrl)
|
||||||
|
{
|
||||||
|
mainNumberElement = <Link to={chartSubheaderData.mainNumberUrl}>{mainNumberElement}</Link>
|
||||||
|
}
|
||||||
|
|
||||||
|
let previousNumberElement = (
|
||||||
|
<>
|
||||||
|
<Typography display="inline" variant="body2" sx={{color: colors.black.main}}>
|
||||||
|
{chartSubheaderData.vsDescription}
|
||||||
|
{chartSubheaderData.vsPreviousNumber && (<> ({ValueUtils.getFormattedNumber(chartSubheaderData.vsPreviousNumber)})</>)}
|
||||||
|
</Typography>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
|
||||||
|
if(chartSubheaderData.previousNumberUrl)
|
||||||
|
{
|
||||||
|
previousNumberElement = <Link to={chartSubheaderData.previousNumberUrl}>{previousNumberElement}</Link>
|
||||||
|
}
|
||||||
|
|
||||||
|
return chartSubheaderData ? (
|
||||||
|
<Box display="inline-flex" alignItems="flex-end">
|
||||||
|
{mainNumberElement}
|
||||||
|
{
|
||||||
|
chartSubheaderData.vsPreviousPercent != null && iconName != null && (
|
||||||
|
<Box display="inline-flex" alignItems="flex-end" pb={1} pl={0.5}>
|
||||||
|
<Icon fontSize="medium" sx={{color: color}}>{iconName}</Icon>
|
||||||
|
<Typography display="inline" variant="body2" sx={{color: color}}>{chartSubheaderData.vsPreviousPercent}%</Typography>
|
||||||
|
{previousNumberElement}
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</Box>
|
||||||
|
) : <Skeleton sx={{marginLeft: "20px", marginRight: "20px", height: "12px"}} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default StackedBarChart;
|
Reference in New Issue
Block a user