Don't crash app home if count comes back null; don't crash table if no field named 'id'

This commit is contained in:
2022-10-24 15:42:47 -05:00
parent 0a9577eb4a
commit 7aa3521775
2 changed files with 37 additions and 17 deletions

View File

@ -55,6 +55,8 @@ function AppHome({app}: Props): JSX.Element
const [reports, setReports] = useState([] as QReportMetaData[]); const [reports, setReports] = useState([] as QReportMetaData[]);
const [childApps, setChildApps] = useState([] as QAppMetaData[]); const [childApps, setChildApps] = useState([] as QAppMetaData[]);
const [tableCounts, setTableCounts] = useState(new Map<string, { isLoading: boolean, value: number }>()); const [tableCounts, setTableCounts] = useState(new Map<string, { isLoading: boolean, value: number }>());
const [tableCountNumbers, setTableCountNumbers] = useState(new Map<string, string>());
const [tableCountTexts, setTableCountTexts] = useState(new Map<string, string>());
const [updatedTableCounts, setUpdatedTableCounts] = useState(new Date()); const [updatedTableCounts, setUpdatedTableCounts] = useState(new Date());
const [widgets, setWidgets] = useState([] as any[]); const [widgets, setWidgets] = useState([] as any[]);
@ -113,6 +115,8 @@ function AppHome({app}: Props): JSX.Element
setChildApps(newChildApps); setChildApps(newChildApps);
const tableCounts = new Map<string, { isLoading: boolean, value: number }>(); const tableCounts = new Map<string, { isLoading: boolean, value: number }>();
const tableCountNumbers = new Map<string, string>();
const tableCountTexts = new Map<string, string>();
newTables.forEach((table) => newTables.forEach((table) =>
{ {
tableCounts.set(table.name, {isLoading: true, value: null}); tableCounts.set(table.name, {isLoading: true, value: null});
@ -122,6 +126,20 @@ function AppHome({app}: Props): JSX.Element
const count = await qController.count(table.name); const count = await qController.count(table.name);
tableCounts.set(table.name, {isLoading: false, value: count}); tableCounts.set(table.name, {isLoading: false, value: count});
setTableCounts(tableCounts); setTableCounts(tableCounts);
if(count !== null && count !== undefined)
{
tableCountNumbers.set(table.name, count.toLocaleString());
tableCountTexts.set(table.name, count === 1 ? "total record" : "total records");
}
else
{
tableCountNumbers.set(table.name, "--");
tableCountTexts.set(table.name, " ");
}
setTableCountNumbers(tableCountNumbers);
setTableCountTexts(tableCountTexts);
setUpdatedTableCounts(new Date()); setUpdatedTableCounts(new Date());
}, 1); }, 1);
}); });
@ -261,8 +279,8 @@ function AppHome({app}: Props): JSX.Element
<MDBox mb={3}> <MDBox 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 ? "..." : tableCounts.get(table.name).value.toLocaleString()} count={!tableCounts.has(table.name) || tableCounts.get(table.name).isLoading ? "..." : (tableCountNumbers.get(table.name))}
percentage={{color: "info", text: (!tableCounts.has(table.name) || tableCounts.get(table.name).isLoading ? "" : (tableCounts.get(table.name).value === 1 ? "total record" : "total records"))}} percentage={{color: "info", text: (!tableCounts.has(table.name) || tableCounts.get(table.name).isLoading ? "" : (tableCountTexts.get(table.name)))}}
icon={{color: "info", component: <Icon>{table.iconName || app.iconName}</Icon>}} icon={{color: "info", component: <Icon>{table.iconName || app.iconName}</Icon>}}
direction="right" direction="right"
/> />

View File

@ -592,9 +592,26 @@ function EntityList({table, launchProcess}: Props): JSX.Element
row[field.name] = value; row[field.name] = value;
}); });
if(!row["id"])
{
row["id"] = row[tableMetaData.primaryKeyField];
}
rows.push(row); rows.push(row);
}); });
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// do this secondary check for columnsToRender - in case we didn't have any rows above, and our check for string isn't enough. //
// ... shouldn't this be just based on the field definition anyway... ? plus adornments? //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
fields.forEach((field) =>
{
if(field.possibleValueSourceName)
{
columnsToRender[field.name] = true;
}
});
if(columnsModel.length == 0) if(columnsModel.length == 0)
{ {
setupGridColumns(columnsToRender); setupGridColumns(columnsToRender);
@ -877,21 +894,6 @@ function EntityList({table, launchProcess}: Props): JSX.Element
return ""; return "";
} }
function getRecordIdsForProcess(): string | QQueryFilter
{
if (selectFullFilterState === "filter")
{
return (buildQFilter(filterModel));
}
if (selectedIds.length > 0)
{
return (selectedIds.join(","));
}
return "";
}
const openModalProcess = (process: QProcessMetaData = null) => const openModalProcess = (process: QProcessMetaData = null) =>
{ {
if (selectFullFilterState === "filter") if (selectFullFilterState === "filter")