updates to send query params to list endpoints in api w/ burnettk

This commit is contained in:
jasquat 2022-09-22 15:41:12 -04:00
parent 830c30a650
commit 7ae41c2b24
7 changed files with 84 additions and 70 deletions

View File

@ -53,7 +53,7 @@ export default function ProcessBreadcrumb({
<main style={{ padding: '1rem 0' }}> <main style={{ padding: '1rem 0' }}>
<Breadcrumb> <Breadcrumb>
<Breadcrumb.Item linkAs={Link} linkProps={{ to: '/admin' }}> <Breadcrumb.Item linkAs={Link} linkProps={{ to: '/admin' }}>
Home Process Groups
</Breadcrumb.Item> </Breadcrumb.Item>
{processGroupBreadcrumb} {processGroupBreadcrumb}
{processModelBreadcrumb} {processModelBreadcrumb}

View File

@ -31,5 +31,5 @@ export default function SubNavigation() {
</Nav> </Nav>
); );
} }
return <></>; return null;
} }

View File

@ -50,3 +50,11 @@ span.bjs-crumb {
width:90vw; width:90vw;
margin:auto; margin:auto;
} }
.breadcrumb {
font-size: 1.5em;
}
.breadcrumb-item.active {
color: black;
}

View File

@ -24,7 +24,7 @@ export default function ProcessGroupShow() {
const processResult = (result: any) => { const processResult = (result: any) => {
setProcessGroup(result); setProcessGroup(result);
HttpService.makeCallToBackend({ HttpService.makeCallToBackend({
path: `/process-groups/${params.process_group_id}/process-models?per_page=${perPage}&page=${page}`, path: `/process-models?process_group_identifier=${params.process_group_id}&per_page=${perPage}&page=${page}`,
successCallback: setProcessModelFromResult, successCallback: setProcessModelFromResult,
}); });
}; };
@ -73,7 +73,6 @@ export default function ProcessGroupShow() {
return ( return (
<main style={{ padding: '1rem 0' }}> <main style={{ padding: '1rem 0' }}>
<ProcessBreadcrumb processGroupId={(processGroup as any).id} /> <ProcessBreadcrumb processGroupId={(processGroup as any).id} />
<h2>Process Group: {(processGroup as any).id}</h2>
<ul> <ul>
<Stack direction="horizontal" gap={3}> <Stack direction="horizontal" gap={3}>
<Button <Button

View File

@ -75,7 +75,6 @@ export default function ProcessGroups() {
return ( return (
<main style={{ padding: '1rem 0' }}> <main style={{ padding: '1rem 0' }}>
<ProcessBreadcrumb /> <ProcessBreadcrumb />
<h2>Process Groups</h2>
<Button href="/admin/process-groups/new">Add a process group</Button> <Button href="/admin/process-groups/new">Add a process group</Button>
<br /> <br />
<br /> <br />

View File

@ -6,7 +6,14 @@ import {
useSearchParams, useSearchParams,
} from 'react-router-dom'; } from 'react-router-dom';
import { Button, Table, Stack, Dropdown, Form } from 'react-bootstrap'; import {
Button,
Table,
Stack,
Dropdown,
Form,
InputGroup,
} from 'react-bootstrap';
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'reac... Remove this comment to see the full error message // @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'reac... Remove this comment to see the full error message
import DatePicker from 'react-datepicker'; import DatePicker from 'react-datepicker';
import { Typeahead } from 'react-bootstrap-typeahead'; import { Typeahead } from 'react-bootstrap-typeahead';
@ -45,8 +52,8 @@ export default function ProcessInstanceList() {
const setErrorMessage = (useContext as any)(ErrorContext)[1]; const setErrorMessage = (useContext as any)(ErrorContext)[1];
const [processStatus, setProcessStatus] = useState(PROCESS_STATUSES[0]); const [processStatus, setProcessStatus] = useState(PROCESS_STATUSES[0]);
const [processGroupIdentifier, setProcessGroupIdentifier] = useState([]); const [processModeleSelectionOptions, setProcessModelSelectionOptions] =
const [processModelIdentifier, setProcessModelIdentifier] = useState(null); useState([]);
const [processModelSelection, setProcessModelSelection] = useState<Option[]>( const [processModelSelection, setProcessModelSelection] = useState<Option[]>(
[] []
); );
@ -62,21 +69,19 @@ export default function ProcessInstanceList() {
const parametersToGetFromSearchParams = useMemo(() => { const parametersToGetFromSearchParams = useMemo(() => {
return { return {
process_group_identifier: setProcessGroupIdentifier, process_group_identifier: null,
process_model_identifier: setProcessModelIdentifier, process_model_identifier: null,
process_status: setProcessStatus, process_status: setProcessStatus,
}; };
}, [setProcessStatus, setProcessGroupIdentifier, setProcessModelIdentifier]); }, [setProcessStatus]);
// eslint-disable-next-line sonarjs/cognitive-complexity
useEffect(() => { useEffect(() => {
function setProcessInstancesFromResult(result: any) { function setProcessInstancesFromResult(result: any) {
const processInstancesFromApi = result.results; const processInstancesFromApi = result.results;
setProcessInstances(processInstancesFromApi); setProcessInstances(processInstancesFromApi);
setPagination(result.pagination); setPagination(result.pagination);
} }
function processResultForProcessModels(result: any) {
getProcessInstances();
}
function getProcessInstances() { function getProcessInstances() {
const { page, perPage } = getPageInfoFromSearchParams(searchParams); const { page, perPage } = getPageInfoFromSearchParams(searchParams);
let queryParamString = `per_page=${perPage}&page=${page}`; let queryParamString = `per_page=${perPage}&page=${page}`;
@ -95,20 +100,44 @@ export default function ProcessInstanceList() {
(paramName: string) => { (paramName: string) => {
if (searchParams.get(paramName)) { if (searchParams.get(paramName)) {
// @ts-expect-error TS(7053) FIXME: // @ts-expect-error TS(7053) FIXME:
const functionToCall = parametersToAlwaysFilterBy[paramName]; const functionToCall = parametersToGetFromSearchParams[paramName];
queryParamString += `&${paramName}=${searchParams.get(paramName)}`; queryParamString += `&${paramName}=${searchParams.get(paramName)}`;
if (functionToCall !== null) {
functionToCall(searchParams.get(paramName) || ''); functionToCall(searchParams.get(paramName) || '');
} }
} }
}
); );
HttpService.makeCallToBackend({ HttpService.makeCallToBackend({
path: `/process-instances?${queryParamString}`, path: `/process-instances?${queryParamString}`,
successCallback: setProcessInstancesFromResult, successCallback: setProcessInstancesFromResult,
}); });
} }
function processResultForProcessModels(result: any) {
let processModelFullIdentifier = '';
if (
searchParams.get('process_model_identifier') &&
searchParams.get('process_group_identifier')
) {
processModelFullIdentifier = `${searchParams.get(
'process_group_identifier'
)}/${searchParams.get('process_model_identifier')}`;
}
const selectionArray = result.results.map((item: any) => {
const label = `${item.process_group_id}/${item.id}`;
Object.assign(item, { label });
if (label === processModelFullIdentifier) {
setProcessModelSelection([item]);
}
return item;
});
setProcessModelSelectionOptions(selectionArray);
getProcessInstances();
}
HttpService.makeCallToBackend({ HttpService.makeCallToBackend({
path: `/process-models`, path: `/process-models?per_page=1000`,
successCallback: processResultForProcessModels, successCallback: processResultForProcessModels,
}); });
}, [ }, [
@ -174,6 +203,10 @@ export default function ProcessInstanceList() {
if (processStatus && processStatus !== 'all') { if (processStatus && processStatus !== 'all') {
queryParamString += `&process_status=${processStatus}`; queryParamString += `&process_status=${processStatus}`;
} }
if (processModelSelection.length > 0) {
const currentProcessModel: any = processModelSelection[0];
queryParamString += `&process_group_identifier=${currentProcessModel.process_group_id}&process_model_identifier=${currentProcessModel.id}`;
}
setErrorMessage(''); setErrorMessage('');
navigate(`/admin/process-instances?${queryParamString}`); navigate(`/admin/process-instances?${queryParamString}`);
@ -215,16 +248,34 @@ export default function ProcessInstanceList() {
Object.keys(parametersToGetFromSearchParams).forEach( Object.keys(parametersToGetFromSearchParams).forEach(
(paramName: string) => { (paramName: string) => {
if (searchParams.get(paramName)) { if (searchParams.get(paramName)) {
// @ts-expect-error TS(7053) FIXME:
const functionToCall = parametersToAlwaysFilterBy[paramName];
queryParamString += `&${paramName}=${searchParams.get(paramName)}`; queryParamString += `&${paramName}=${searchParams.get(paramName)}`;
functionToCall(searchParams.get(paramName) || '');
} }
} }
); );
return queryParamString; return queryParamString;
}; };
const processModelSearch = () => {
return (
<Form.Group>
<InputGroup>
<InputGroup.Text className="text-nowrap">
Process Model:{' '}
</InputGroup.Text>
<Typeahead
style={{ width: 500 }}
id="process-model-selection"
labelKey="label"
onChange={setProcessModelSelection}
options={processModeleSelectionOptions}
placeholder="Choose a process model..."
selected={processModelSelection}
/>
</InputGroup>
</Form.Group>
);
};
const filterOptions = () => { const filterOptions = () => {
const processStatusesRows = PROCESS_STATUSES.map((processStatusOption) => { const processStatusesRows = PROCESS_STATUSES.map((processStatusOption) => {
if (processStatusOption === processStatus) { if (processStatusOption === processStatus) {
@ -248,8 +299,11 @@ export default function ProcessInstanceList() {
<div className="container"> <div className="container">
<div className="row"> <div className="row">
<div className="col"> <div className="col">
{processModelSearch()}
<form onSubmit={handleFilter}> <form onSubmit={handleFilter}>
<Stack direction="horizontal" gap={3}>
{processModelSearch()}
</Stack>
<br />
<Stack direction="horizontal" gap={3}> <Stack direction="horizontal" gap={3}>
{dateComponent( {dateComponent(
'Start Range: ', 'Start Range: ',
@ -290,48 +344,6 @@ export default function ProcessInstanceList() {
); );
}; };
const processModelSearch = () => {
const options = [
{
label: 'Alabama',
population: 4780127,
capital: 'Montgomery',
region: 'South',
},
{
label: 'Alaska',
population: 710249,
capital: 'Juneau',
region: 'West',
},
{
label: 'Arizona',
population: 6392307,
capital: 'Phoenix',
region: 'West',
},
{
label: 'Arkansas',
population: 2915958,
capital: 'Little Rock',
region: 'South',
},
];
return (
<Form.Group>
<Form.Label>Single Selection</Form.Label>
<Typeahead
id="basic-typeahead-single"
labelKey="label"
onChange={setProcessModelSelection}
options={options}
placeholder="Choose a state..."
selected={processModelSelection}
/>
</Form.Group>
);
};
const buildTable = () => { const buildTable = () => {
const rows = processInstances.map((row: any) => { const rows = processInstances.map((row: any) => {
const formattedStartDate = const formattedStartDate =
@ -394,7 +406,7 @@ export default function ProcessInstanceList() {
const { page, perPage } = getPageInfoFromSearchParams(searchParams); const { page, perPage } = getPageInfoFromSearchParams(searchParams);
return ( return (
<main style={{ padding: '1rem 0' }}> <main style={{ padding: '1rem 0' }}>
<h2>Process Instances for {params.process_model_id}</h2> <h2>Process Instances</h2>
{filterOptions()} {filterOptions()}
<PaginationForTable <PaginationForTable
page={page} page={page}

View File

@ -130,9 +130,9 @@ export default function ProcessModelShow() {
<ul> <ul>
<li> <li>
<Link <Link
to={`/admin/process-models/${ to={`/admin/process-instances?process_group_identifier=${
(processModel as any).process_group_id (processModel as any).process_group_id
}/${(processModel as any).id}/process-instances`} }&process_model_identifier=${(processModel as any).id}`}
data-qa="process-instance-list-link" data-qa="process-instance-list-link"
> >
List List
@ -201,10 +201,6 @@ export default function ProcessModelShow() {
processGroupId={(processModel as any).process_group_id} processGroupId={(processModel as any).process_group_id}
processModelId={(processModel as any).id} processModelId={(processModel as any).id}
/> />
<Stack direction="horizontal" gap={3}>
<h2>Process Model: {(processModel as any).display_name}</h2>
<span>({(processModel as any).id})</span>
</Stack>
{processInstanceResultTag} {processInstanceResultTag}
<FileInput <FileInput
processModelId={(processModel as any).id} processModelId={(processModel as any).id}