From 6fc11bb0ba1a318e713c28e8420805da62569229 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 29 May 2025 11:30:17 -0500 Subject: [PATCH] Add support for using api-versioned query screen --- .../misc/FilterAndColumnsSetupWidget.tsx | 72 ++++++++++++++++--- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx b/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx index 590eb58..79194bd 100644 --- a/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx +++ b/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx @@ -20,6 +20,7 @@ */ +import {ApiVersion} from "@kingsrook/qqq-frontend-core/lib/controllers/QControllerV1"; import {QTableMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QTableMetaData"; import {QWidgetMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QWidgetMetaData"; import {QCriteriaOperator} from "@kingsrook/qqq-frontend-core/lib/model/query/QCriteriaOperator"; @@ -80,6 +81,7 @@ unborderedButtonSX.opacity = "0.7"; const qController = Client.getInstance(); +const qControllerV1 = Client.getInstanceV1(); /******************************************************************************* ** Component for editing the main setup of a report - that is: filter & columns @@ -90,13 +92,17 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp, const [hideColumns] = useState(widgetData?.hideColumns); const [hidePreview] = useState(widgetData?.hidePreview); const [hideSortBy] = useState(widgetData?.hideSortBy); - const [isEditable] = useState(widgetData?.overrideIsEditable ?? isEditableProp) + const [isEditable] = useState(widgetData?.overrideIsEditable ?? isEditableProp); const [tableMetaData, setTableMetaData] = useState(null as QTableMetaData); + const [isApiVersioned] = useState(widgetData?.isApiVersioned); + const [apiVersion, setApiVersion] = useState(null as ApiVersion | null); + const [filterFieldName] = useState(widgetData?.filterFieldName ?? "queryFilterJson"); const [columnsFieldName] = useState(widgetData?.columnsFieldName ?? "columnsJson"); const [alertContent, setAlertContent] = useState(null as string); + const [widgetFailureAlertContent, setWidgetFailureAlertContent] = useState(null as string); ////////////////////////////////////////////////////////////////////////////////////////////////// // we'll actually keep 2 copies of the query filter around here - // @@ -114,7 +120,9 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp, ///////////////////////////// let columns: QQueryColumns = null; let usingDefaultEmptyFilter = false; - let queryFilter = recordValues[filterFieldName] && JSON.parse(recordValues[filterFieldName]) as QQueryFilter; + const rawFilterValueFromRecord = recordValues[filterFieldName]; + let queryFilter = rawFilterValueFromRecord && + ((typeof rawFilterValueFromRecord == "string" ? JSON.parse(rawFilterValueFromRecord) : rawFilterValueFromRecord) as QQueryFilter); const defaultFilterFields = widgetData?.filterDefaultFieldNames; if (!queryFilter) { @@ -167,16 +175,56 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp, tableName = recordValues["tableName"]; } + let version: ApiVersion | null = null; + if (isApiVersioned) + { + let apiName = widgetData?.apiName; + let apiPath = widgetData?.apiPath; + let apiVersion = widgetData?.apiVersion; + + if (!apiName && recordValues["apiName"]) + { + apiName = recordValues["apiName"]; + } + + if (!apiPath && recordValues["apiPath"]) + { + apiPath = recordValues["apiPath"]; + } + + if (!apiVersion && recordValues["apiVersion"]) + { + apiVersion = recordValues["apiVersion"]; + } + + if (!apiName || !apiPath || !apiVersion) + { + console.log("API Name/Path/Version not set, but widget isApiVersioned, so cannot load table meta data..."); + return; + } + + version = {name: apiName, path: apiPath, version: apiVersion}; + setApiVersion(version); + } + if (tableName) { (async () => { - const tableMetaData = await qController.loadTableMetaData(tableName); - setTableMetaData(tableMetaData); + try + { + const tableMetaData = await qControllerV1.loadTableMetaData(tableName, version); + setTableMetaData(tableMetaData); - const queryFilterForFrontend = Object.assign({}, queryFilter); - await FilterUtils.cleanupValuesInFilerFromQueryString(qController, tableMetaData, queryFilterForFrontend); - setFrontendQueryFilter(queryFilterForFrontend); + const queryFilterForFrontend = Object.assign({}, queryFilter); + await FilterUtils.cleanupValuesInFilerFromQueryString(qController, tableMetaData, queryFilterForFrontend); + setFrontendQueryFilter(queryFilterForFrontend); + } + catch (e) + { + //@ts-ignore e.message + setWidgetFailureAlertContent("Error preparing filter widget: " + (e.message ?? "Details not available.")); + } })(); } }, [JSON.stringify(recordValues)]); @@ -337,7 +385,7 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp, ///////////////////////////////////////////////// // add link to widget header for opening modal // ///////////////////////////////////////////////// - const selectTableFirstTooltipTitle = tableMetaData ? null : "You must select a table before you can set up your report filters and columns"; + const selectTableFirstTooltipTitle = tableMetaData ? null : `You must select a table${isApiVersioned ? " and API details" : ""} before you can set up your filters${hideColumns ? "" : " and columns"}`; const labelAdditionalElementsRight: JSX.Element[] = []; if (isEditable) { @@ -351,6 +399,12 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp, } } + if (widgetFailureAlertContent) + { + return ( + {widgetFailureAlertContent} + ); + } return ( @@ -424,6 +478,7 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp, isModal={true} initialQueryFilter={frontendQueryFilter} initialColumns={columns} + apiVersion={apiVersion} /> )} @@ -449,6 +504,7 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp, isModal={true} initialQueryFilter={usingDefaultEmptyFilter ? null : frontendQueryFilter} initialColumns={columns} + apiVersion={apiVersion} /> }