From 7e97ce674f16d7298cddd6c7e5e18bc5a6bd6022 Mon Sep 17 00:00:00 2001 From: jasquat Date: Fri, 11 Nov 2022 11:07:21 -0500 Subject: [PATCH] added tasks for my open processes page w/ burnettk --- .../routes/process_api_blueprint.py | 2 +- .../src/routes/HomePageRoutes.tsx | 24 ++- .../src/routes/TasksForMyOpenProcesses.tsx | 141 ++++++++++++++++++ 3 files changed, 152 insertions(+), 15 deletions(-) create mode 100644 spiffworkflow-frontend/src/routes/TasksForMyOpenProcesses.tsx diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_api_blueprint.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_api_blueprint.py index 6e8bc3eb..a5b92870 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_api_blueprint.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_api_blueprint.py @@ -1007,7 +1007,7 @@ def task_list_for_my_open_processes(page: int = 1, per_page: int = 100) -> flask # just need this add_columns to add the process_model_identifier. Then add everything back that was removed. .add_columns( ProcessInstanceModel.process_model_identifier, - ProcessInstanceModel.status, + ProcessInstanceModel.status.label("process_instance_status"), ProcessInstanceModel.updated_at_in_seconds, ProcessInstanceModel.created_at_in_seconds, GroupModel.identifier.label("group_identifier"), diff --git a/spiffworkflow-frontend/src/routes/HomePageRoutes.tsx b/spiffworkflow-frontend/src/routes/HomePageRoutes.tsx index 261e9035..cbd1bd4e 100644 --- a/spiffworkflow-frontend/src/routes/HomePageRoutes.tsx +++ b/spiffworkflow-frontend/src/routes/HomePageRoutes.tsx @@ -5,6 +5,7 @@ import { Tabs, TabList, Tab } from '@carbon/react'; import TaskShow from './TaskShow'; import ErrorContext from '../contexts/ErrorContext'; import MyTasks from './MyTasks'; +import TasksForMyOpenProcesses from './TasksForMyOpenProcesses'; export default function HomePageRoutes() { const location = useLocation(); @@ -15,7 +16,7 @@ export default function HomePageRoutes() { useEffect(() => { setErrorMessage(null); let newSelectedTabIndex = 0; - if (location.pathname.match(/^\/tasks\/\d/)) { + if (location.pathname.match(/^\/tasks\/for-my-open-processes/)) { newSelectedTabIndex = 1; } setSelectedTabIndex(newSelectedTabIndex); @@ -23,28 +24,23 @@ export default function HomePageRoutes() { return ( <> - { - setSelectedTabIndex(event.selectedIndex); - }} - > + navigate('/tasks/my-tasks')}>My Tasks - - navigate('/tasks/9/4dc9f6e3-2256-47b2-9f78-6bc2f061db80') - } - > - One Task + navigate('/tasks/for-my-open-processes')}> + Tasks for My Open Processes
} /> - } /> + } /> } /> + } + /> ); diff --git a/spiffworkflow-frontend/src/routes/TasksForMyOpenProcesses.tsx b/spiffworkflow-frontend/src/routes/TasksForMyOpenProcesses.tsx new file mode 100644 index 00000000..9ac84334 --- /dev/null +++ b/spiffworkflow-frontend/src/routes/TasksForMyOpenProcesses.tsx @@ -0,0 +1,141 @@ +import { useEffect, useState } from 'react'; +// @ts-ignore +import { Button, Table } from '@carbon/react'; +import { Link, useSearchParams } from 'react-router-dom'; +import PaginationForTable from '../components/PaginationForTable'; +import { + convertSecondsToFormattedDateTime, + getPageInfoFromSearchParams, + modifyProcessModelPath, +} from '../helpers'; +import HttpService from '../services/HttpService'; +import { PaginationObject } from '../interfaces'; + +const PER_PAGE_FOR_TASKS_ON_HOME_PAGE = 5; + +export default function MyOpenProcesses() { + const [searchParams] = useSearchParams(); + const [tasks, setTasks] = useState([]); + const [pagination, setPagination] = useState(null); + + useEffect(() => { + const { page, perPage } = getPageInfoFromSearchParams( + searchParams, + PER_PAGE_FOR_TASKS_ON_HOME_PAGE + ); + const setTasksFromResult = (result: any) => { + setTasks(result.results); + setPagination(result.pagination); + }; + HttpService.makeCallToBackend({ + path: `/tasks/for-my-open-processes?per_page=${perPage}&page=${page}`, + successCallback: setTasksFromResult, + }); + }, [searchParams]); + + const buildTable = () => { + const rows = tasks.map((row) => { + const rowToUse = row as any; + const taskUrl = `/tasks/${rowToUse.process_instance_id}/${rowToUse.id}`; + const modifiedProcessModelIdentifier = modifyProcessModelPath( + rowToUse.process_model_identifier + ); + return ( + + + + {rowToUse.process_model_display_name} + + + + + View {rowToUse.process_instance_id} + + + + {rowToUse.task_title} + + {rowToUse.process_instance_status} + {rowToUse.group_identifier || '-'} + + {convertSecondsToFormattedDateTime( + rowToUse.created_at_in_seconds + ) || '-'} + + + {convertSecondsToFormattedDateTime( + rowToUse.updated_at_in_seconds + ) || '-'} + + + + + + ); + }); + return ( + + + + + + + + + + + + + + {rows} +
Process ModelProcess InstanceTask NameProcess Instance StatusAssigned GroupProcess StartedProcess UpdatedActions
+ ); + }; + + const tasksWaitingForMeComponent = () => { + if (pagination && pagination.total < 1) { + return null; + } + const { page, perPage } = getPageInfoFromSearchParams( + searchParams, + PER_PAGE_FOR_TASKS_ON_HOME_PAGE + ); + return ( + <> +

Tasks for my open processes

+ + + ); + }; + + const tasksWaitingForMe = tasksWaitingForMeComponent(); + + if (pagination) { + if (tasksWaitingForMe === null) { + return

No tasks are waiting for you.

; + } + return <>{tasksWaitingForMe}; + } + return null; +}