mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-18 05:10:45 +00:00
Merge remote-tracking branch 'origin/dev' into feature/CTLE-477-need-to-see-demand-for-boxes
# Conflicts: # src/qqq/components/widgets/Widget.tsx
This commit is contained in:
@ -97,9 +97,25 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
|
|||||||
widgetData[i] = {};
|
widgetData[i] = {};
|
||||||
(async () =>
|
(async () =>
|
||||||
{
|
{
|
||||||
widgetData[i] = await qController.widget(widgetMetaData.name, urlParams);
|
try
|
||||||
setWidgetData(widgetData);
|
{
|
||||||
setWidgetCounter(widgetCounter + 1);
|
widgetData[i] = await qController.widget(widgetMetaData.name, urlParams);
|
||||||
|
setWidgetData(widgetData);
|
||||||
|
setWidgetCounter(widgetCounter + 1);
|
||||||
|
if(widgetData[i])
|
||||||
|
{
|
||||||
|
widgetData[i]["errorLoading"] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(e)
|
||||||
|
{
|
||||||
|
console.error(e);
|
||||||
|
if(widgetData[i])
|
||||||
|
{
|
||||||
|
widgetData[i]["errorLoading"] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
forceUpdate();
|
forceUpdate();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
@ -111,13 +127,31 @@ function DashboardWidgets({widgetMetaDataList, tableName, entityPrimaryKey, omit
|
|||||||
{
|
{
|
||||||
const urlParams = getQueryParams(widgetMetaDataList[index], data);
|
const urlParams = getQueryParams(widgetMetaDataList[index], data);
|
||||||
setCurrentUrlParams(urlParams);
|
setCurrentUrlParams(urlParams);
|
||||||
|
widgetData[index] = {};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
widgetData[index] = await qController.widget(widgetMetaDataList[index].name, urlParams);
|
||||||
|
setWidgetCounter(widgetCounter + 1);
|
||||||
|
setWidgetData(widgetData);
|
||||||
|
|
||||||
|
if (widgetData[index])
|
||||||
|
{
|
||||||
|
widgetData[index]["errorLoading"] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(e)
|
||||||
|
{
|
||||||
|
console.error(e);
|
||||||
|
if (widgetData[index])
|
||||||
|
{
|
||||||
|
widgetData[index]["errorLoading"] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
widgetData[index] = await qController.widget(widgetMetaDataList[index].name, urlParams);
|
|
||||||
setWidgetCounter(widgetCounter + 1);
|
|
||||||
setWidgetData(widgetData);
|
|
||||||
forceUpdate();
|
forceUpdate();
|
||||||
})();
|
})();
|
||||||
};
|
}
|
||||||
|
|
||||||
function getQueryParams(widgetMetaData: QWidgetMetaData, extraParams: string): string
|
function getQueryParams(widgetMetaData: QWidgetMetaData, extraParams: string): string
|
||||||
{
|
{
|
||||||
|
@ -46,6 +46,7 @@ export interface WidgetData
|
|||||||
}[][];
|
}[][];
|
||||||
dropdownNeedsSelectedText?: string;
|
dropdownNeedsSelectedText?: string;
|
||||||
hasPermission?: boolean;
|
hasPermission?: boolean;
|
||||||
|
errorLoading?: boolean;
|
||||||
[other: string]: any;
|
[other: string]: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,6 +401,7 @@ function Widget(props: React.PropsWithChildren<Props>): JSX.Element
|
|||||||
needLabelBox ||= isSet(props.widgetMetaData?.label);
|
needLabelBox ||= isSet(props.widgetMetaData?.label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const errorLoading = props.widgetData?.errorLoading !== undefined && props.widgetData?.errorLoading === true;
|
||||||
const widgetContent =
|
const widgetContent =
|
||||||
<Box sx={{width: "100%", height: "100%", minHeight: props.widgetMetaData?.minHeight ? props.widgetMetaData?.minHeight : "initial"}}>
|
<Box sx={{width: "100%", height: "100%", minHeight: props.widgetMetaData?.minHeight ? props.widgetMetaData?.minHeight : "initial"}}>
|
||||||
{
|
{
|
||||||
@ -465,11 +467,6 @@ function Widget(props: React.PropsWithChildren<Props>): JSX.Element
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{/*
|
|
||||||
<Button onClick={() => toggleFullScreenWidget()}>
|
|
||||||
{fullScreenWidgetClassName ? "-" : "+"}
|
|
||||||
</Button>
|
|
||||||
*/}
|
|
||||||
{
|
{
|
||||||
hasPermission && (
|
hasPermission && (
|
||||||
effectiveLabelAdditionalComponentsLeft.map((component, i) =>
|
effectiveLabelAdditionalComponentsLeft.map((component, i) =>
|
||||||
@ -495,22 +492,29 @@ function Widget(props: React.PropsWithChildren<Props>): JSX.Element
|
|||||||
props.widgetMetaData?.isCard && (reloading ? <LinearProgress color="info" sx={{overflow: "hidden", borderRadius: "0"}} /> : <Box height="0.375rem"/>)
|
props.widgetMetaData?.isCard && (reloading ? <LinearProgress color="info" sx={{overflow: "hidden", borderRadius: "0"}} /> : <Box height="0.375rem"/>)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
hasPermission && props.widgetData?.dropdownNeedsSelectedText ? (
|
errorLoading ? (
|
||||||
<Box pb={3} pr={3} sx={{width: "100%", textAlign: "right"}}>
|
<Box pb={3} sx={{display: "flex", justifyContent: "center", alignItems: "flex-start"}}>
|
||||||
<Typography variant="body2">
|
<Icon color="error">error</Icon>
|
||||||
{props.widgetData?.dropdownNeedsSelectedText}
|
<Typography sx={{paddingLeft: "4px", textTransform: "revert"}} variant="button">An error occurred loading widget content.</Typography>
|
||||||
</Typography>
|
|
||||||
</Box>
|
</Box>
|
||||||
) : (
|
) : (
|
||||||
hasPermission ? (
|
hasPermission && props.widgetData?.dropdownNeedsSelectedText ? (
|
||||||
props.children
|
<Box pb={3} pr={3} sx={{width: "100%", textAlign: "right"}}>
|
||||||
|
<Typography variant="body2">
|
||||||
|
{props.widgetData?.dropdownNeedsSelectedText}
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
) : (
|
) : (
|
||||||
<Box mt={2} mb={5} sx={{display: "flex", justifyContent: "center"}}><Typography variant="body2">You do not have permission to view this data.</Typography></Box>
|
hasPermission ? (
|
||||||
|
props.children
|
||||||
|
) : (
|
||||||
|
<Box mt={2} mb={5} sx={{display: "flex", justifyContent: "center"}}><Typography variant="body2">You do not have permission to view this data.</Typography></Box>
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
props?.footerHTML && (
|
! errorLoading && props?.footerHTML && (
|
||||||
<Box mt={1} ml={3} mr={3} mb={2} sx={{fontWeight: 300, color: "#7b809a", display: "flex", alignContent: "flex-end", fontSize: "14px"}}>{parse(props.footerHTML)}</Box>
|
<Box mt={1} ml={3} mr={3} mb={2} sx={{fontWeight: 300, color: "#7b809a", display: "flex", alignContent: "flex-end", fontSize: "14px"}}>{parse(props.footerHTML)}</Box>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,8 @@ import {QProcessMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/
|
|||||||
import {QReportMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QReportMetaData";
|
import {QReportMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QReportMetaData";
|
||||||
import {QTableMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QTableMetaData";
|
import {QTableMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QTableMetaData";
|
||||||
import {QWidgetMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QWidgetMetaData";
|
import {QWidgetMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QWidgetMetaData";
|
||||||
import {Box, Icon, Typography} from "@mui/material";
|
import {Icon, Typography} from "@mui/material";
|
||||||
|
import Box from "@mui/material/Box";
|
||||||
import Card from "@mui/material/Card";
|
import Card from "@mui/material/Card";
|
||||||
import Divider from "@mui/material/Divider";
|
import Divider from "@mui/material/Divider";
|
||||||
import Grid from "@mui/material/Grid";
|
import Grid from "@mui/material/Grid";
|
||||||
@ -316,7 +317,7 @@ function AppHome({app}: Props): JSX.Element
|
|||||||
<Grid key={table.name} item xs={12} md={12} lg={tileSizeLg}>
|
<Grid key={table.name} item xs={12} md={12} lg={tileSizeLg}>
|
||||||
{hasTablePermission(tableName) ?
|
{hasTablePermission(tableName) ?
|
||||||
<Link to={table.name}>
|
<Link to={table.name}>
|
||||||
<Box mb={3}>
|
<Box className="big-icon" mb={3}>
|
||||||
<MiniStatisticsCard
|
<MiniStatisticsCard
|
||||||
title={{fontWeight: "bold", text: table.label}}
|
title={{fontWeight: "bold", text: table.label}}
|
||||||
count={!tableCounts.has(table.name) || tableCounts.get(table.name).isLoading ? "..." : (tableCountNumbers.get(table.name))}
|
count={!tableCounts.has(table.name) || tableCounts.get(table.name).isLoading ? "..." : (tableCountNumbers.get(table.name))}
|
||||||
|
@ -386,16 +386,15 @@ input[type="search"]::-webkit-search-results-decoration { display: none; }
|
|||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.MuiGrid-root > .MuiBox-root > .material-icons-round,
|
.big-icon .material-icons-round
|
||||||
.MuiBox-root > .MuiBox-root > .material-icons-round
|
|
||||||
{
|
{
|
||||||
font-size: 2rem !important;
|
font-size: 2rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dashboard-schedule-icon
|
.dashboard-schedule-icon
|
||||||
{
|
{
|
||||||
font-size: 1rem !important;
|
font-size: 1.1rem !important;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: -13px;
|
top: -5px;
|
||||||
margin-right: 3px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user