CE-1115 - Update to be used as a modal, and to take a usage prop, e.g., to differentiate between being used as query screen vs. used on report-setup screen

This commit is contained in:
2024-04-09 16:03:15 -05:00
parent 37b854baf0
commit f47924787a

View File

@ -76,7 +76,7 @@ import ProcessUtils from "qqq/utils/qqq/ProcessUtils";
import {SavedViewUtils} from "qqq/utils/qqq/SavedViewUtils"; import {SavedViewUtils} from "qqq/utils/qqq/SavedViewUtils";
import TableUtils from "qqq/utils/qqq/TableUtils"; import TableUtils from "qqq/utils/qqq/TableUtils";
import ValueUtils from "qqq/utils/qqq/ValueUtils"; import ValueUtils from "qqq/utils/qqq/ValueUtils";
import React, {forwardRef, useContext, useEffect, useReducer, useRef, useState} from "react"; import React, {forwardRef, useContext, useEffect, useImperativeHandle, useReducer, useRef, useState} from "react";
import {useLocation, useNavigate, useSearchParams} from "react-router-dom"; import {useLocation, useNavigate, useSearchParams} from "react-router-dom";
const CURRENT_SAVED_VIEW_ID_LOCAL_STORAGE_KEY_ROOT = "qqq.currentSavedViewId"; const CURRENT_SAVED_VIEW_ID_LOCAL_STORAGE_KEY_ROOT = "qqq.currentSavedViewId";
@ -84,18 +84,16 @@ const DENSITY_LOCAL_STORAGE_KEY_ROOT = "qqq.density";
const VIEW_LOCAL_STORAGE_KEY_ROOT = "qqq.recordQueryView"; const VIEW_LOCAL_STORAGE_KEY_ROOT = "qqq.recordQueryView";
export const TABLE_VARIANT_LOCAL_STORAGE_KEY_ROOT = "qqq.tableVariant"; export const TABLE_VARIANT_LOCAL_STORAGE_KEY_ROOT = "qqq.tableVariant";
export type QueryScreenUsage = "queryScreen" | "reportSetup"
interface Props interface Props
{ {
table?: QTableMetaData; table?: QTableMetaData;
launchProcess?: QProcessMetaData; launchProcess?: QProcessMetaData;
usage?: QueryScreenUsage;
isModal?: boolean;
} }
RecordQuery.defaultProps = {
table: null,
launchProcess: null
};
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
// define possible values for our pageState variable // // define possible values for our pageState variable //
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
@ -120,7 +118,7 @@ const getLoadingScreen = () =>
** **
** Yuge component. The best. Lots of very smart people are saying so. ** Yuge component. The best. Lots of very smart people are saying so.
*******************************************************************************/ *******************************************************************************/
function RecordQuery({table, launchProcess}: Props): JSX.Element const RecordQuery = forwardRef(({table, usage, isModal}: Props, ref) =>
{ {
const tableName = table.name; const tableName = table.name;
const [searchParams] = useSearchParams(); const [searchParams] = useSearchParams();
@ -136,6 +134,16 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
const [firstRender, setFirstRender] = useState(true); const [firstRender, setFirstRender] = useState(true);
const [isFirstRenderAfterChangingTables, setIsFirstRenderAfterChangingTables] = useState(false); const [isFirstRenderAfterChangingTables, setIsFirstRenderAfterChangingTables] = useState(false);
useImperativeHandle(ref, () =>
{
return {
getCurrentView(): RecordQueryView
{
return view;
}
}
});
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// manage "state" being passed from some screens (like delete) into query screen - by grabbing, and then deleting // // manage "state" being passed from some screens (like delete) into query screen - by grabbing, and then deleting //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -687,10 +695,13 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
else if (!searchParams.has("filter")) else if (!searchParams.has("filter"))
{ {
if (localStorage.getItem(currentSavedViewLocalStorageKey)) if (localStorage.getItem(currentSavedViewLocalStorageKey))
{
if(usage == "queryScreen")
{ {
currentSavedViewId = Number.parseInt(localStorage.getItem(currentSavedViewLocalStorageKey)); currentSavedViewId = Number.parseInt(localStorage.getItem(currentSavedViewLocalStorageKey));
navigate(`${metaData.getTablePathByName(tableName)}/savedView/${currentSavedViewId}`); navigate(`${metaData.getTablePathByName(tableName)}/savedView/${currentSavedViewId}`);
} }
}
else else
{ {
doClearCurrentSavedView(); doClearCurrentSavedView();
@ -943,7 +954,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
console.log(`Received error for query ${thisQueryId}`); console.log(`Received error for query ${thisQueryId}`);
console.log(error); console.log(error);
var errorMessage; let errorMessage;
if (error && error.message) if (error && error.message)
{ {
errorMessage = error.message; errorMessage = error.message;
@ -2183,6 +2194,8 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
<GridToolbarDensitySelector nonce={undefined} /> <GridToolbarDensitySelector nonce={undefined} />
</div> </div>
{
usage == "queryScreen" &&
<div style={{zIndex: 10}}> <div style={{zIndex: 10}}>
<MenuButton label="Selection" iconName={selectedIds.length == 0 ? "check_box_outline_blank" : "check_box"} disabled={totalRecords == 0} options={selectionMenuOptions} callback={selectionMenuCallback} /> <MenuButton label="Selection" iconName={selectedIds.length == 0 ? "check_box_outline_blank" : "check_box"} disabled={totalRecords == 0} options={selectionMenuOptions} callback={selectionMenuCallback} />
<SelectionSubsetDialog isOpen={selectionSubsetSizePromptOpen} initialValue={selectionSubsetSize} closeHandler={(value) => <SelectionSubsetDialog isOpen={selectionSubsetSizePromptOpen} initialValue={selectionSubsetSize} closeHandler={(value) =>
@ -2204,6 +2217,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
} }
}} /> }} />
</div> </div>
}
<div> <div>
{ {
@ -2302,6 +2316,9 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
if (pageState == "ready") if (pageState == "ready")
{ {
const newFilterHash = JSON.stringify(prepQueryFilterForBackend(queryFilter)); const newFilterHash = JSON.stringify(prepQueryFilterForBackend(queryFilter));
const filterForBackend = prepQueryFilterForBackend(queryFilter);
const newFilterHash = JSON.stringify(filterForBackend);
if (filterHash != newFilterHash) if (filterHash != newFilterHash)
{ {
setFilterHash(newFilterHash); setFilterHash(newFilterHash);
@ -2474,7 +2491,10 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
{ {
const currentSavedViewId = Number.parseInt(localStorage.getItem(currentSavedViewLocalStorageKey)); const currentSavedViewId = Number.parseInt(localStorage.getItem(currentSavedViewLocalStorageKey));
console.log(`returning to previously active saved view ${currentSavedViewId}`); console.log(`returning to previously active saved view ${currentSavedViewId}`);
if(usage == "queryScreen")
{
navigate(`${metaData.getTablePathByName(tableName)}/savedView/${currentSavedViewId}`); navigate(`${metaData.getTablePathByName(tableName)}/savedView/${currentSavedViewId}`);
}
setViewIdInLocation(currentSavedViewId); setViewIdInLocation(currentSavedViewId);
///////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////
@ -2623,7 +2643,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
let savedViewsComponent = null; let savedViewsComponent = null;
if (metaData && metaData.processes.has("querySavedView")) if (metaData && metaData.processes.has("querySavedView"))
{ {
savedViewsComponent = (<SavedViews qController={qController} metaData={metaData} tableMetaData={tableMetaData} view={view} viewAsJson={viewAsJson} currentSavedView={currentSavedView} tableDefaultView={tableDefaultView} viewOnChangeCallback={handleSavedViewChange} loadingSavedView={loadingSavedView} />); savedViewsComponent = (<SavedViews qController={qController} metaData={metaData} tableMetaData={tableMetaData} view={view} viewAsJson={viewAsJson} currentSavedView={currentSavedView} tableDefaultView={tableDefaultView} viewOnChangeCallback={handleSavedViewChange} loadingSavedView={loadingSavedView} queryScreenUsage={usage} />);
} }
@ -2700,7 +2720,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
}; };
////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////
// these numbers help set the height of the grid (so page won't scroll) based on spcae above & below it // // these numbers help set the height of the grid (so page won't scroll) based on space above & below it //
////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////
let spaceBelowGrid = 40; let spaceBelowGrid = 40;
let spaceAboveGrid = 205; let spaceAboveGrid = 205;
@ -2714,19 +2734,26 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
spaceAboveGrid += 60; spaceAboveGrid += 60;
} }
if(isModal)
{
spaceAboveGrid += 130;
}
//////////////////////// ////////////////////////
// main screen render // // main screen render //
//////////////////////// ////////////////////////
return ( const body = (
<BaseLayout> <React.Fragment>
<Box display="flex" justifyContent="space-between"> <Box display="flex" justifyContent="space-between">
<Box> <Box>
<Typography textTransform="capitalize" variant="h3"> <Typography textTransform="capitalize" variant="h3">
{pageLoadingState.isLoading() && ""} {pageLoadingState.isLoading() && ""}
{pageLoadingState.isLoadingSlow() && "Loading..."} {pageLoadingState.isLoadingSlow() && "Loading..."}
{pageLoadingState.isNotLoading() && getPageHeader(tableMetaData, visibleJoinTables, tableVariant)} {pageLoadingState.isNotLoading() && !isModal && getPageHeader(tableMetaData, visibleJoinTables, tableVariant)}
</Typography> </Typography>
</Box> </Box>
{
!isModal &&
<Box whiteSpace="nowrap"> <Box whiteSpace="nowrap">
<GotoRecordButton metaData={metaData} tableMetaData={tableMetaData} /> <GotoRecordButton metaData={metaData} tableMetaData={tableMetaData} />
<Box display="inline-block" width="150px"> <Box display="inline-block" width="150px">
@ -2748,6 +2775,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
<QCreateNewButton tablePath={metaData?.getTablePathByName(tableName)} /> <QCreateNewButton tablePath={metaData?.getTablePathByName(tableName)} />
} }
</Box> </Box>
}
</Box> </Box>
<div className="recordQuery"> <div className="recordQuery">
{/* {/*
@ -2801,6 +2829,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
setQuickFilterFieldNames={doSetQuickFilterFieldNames} setQuickFilterFieldNames={doSetQuickFilterFieldNames}
gridApiRef={gridApiRef} gridApiRef={gridApiRef}
mode={mode} mode={mode}
queryScreenUsage={usage}
setMode={doSetMode} setMode={doSetMode}
savedViewsComponent={savedViewsComponent} savedViewsComponent={savedViewsComponent}
columnMenuComponent={buildColumnMenu()} columnMenuComponent={buildColumnMenu()}
@ -2841,7 +2870,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
sortingMode="server" sortingMode="server"
filterMode="server" filterMode="server"
page={pageNumber} page={pageNumber}
checkboxSelection checkboxSelection={usage == "queryScreen"}
disableSelectionOnClick disableSelectionOnClick
autoHeight={false} autoHeight={false}
rows={rows} rows={rows}
@ -2850,7 +2879,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
rowBuffer={10} rowBuffer={10}
rowCount={totalRecords === null || totalRecords === undefined ? 0 : totalRecords} rowCount={totalRecords === null || totalRecords === undefined ? 0 : totalRecords}
onPageSizeChange={handleRowsPerPageChange} onPageSizeChange={handleRowsPerPageChange}
onRowClick={handleRowClick} onRowClick={usage == "queryScreen" ? handleRowClick : null}
onStateChange={handleStateChange} onStateChange={handleStateChange}
density={density} density={density}
loading={loading} loading={loading}
@ -2908,8 +2937,26 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
</Modal> </Modal>
} }
</div> </div>
</BaseLayout> </React.Fragment>
); );
if(isModal)
{
return body;
} }
return (
<BaseLayout>{body}</BaseLayout>
)
})
RecordQuery.defaultProps = {
table: null,
usage: "queryScreen",
launchProcess: null,
isModal: false,
};
export default RecordQuery; export default RecordQuery;