From fffcb7459ad64d299f178185c744a40dadb2d130 Mon Sep 17 00:00:00 2001 From: Elizabeth Esswein Date: Thu, 7 Sep 2023 13:53:10 -0400 Subject: [PATCH] add page titles for most routes (#468) --- spiffworkflow-frontend/src/helpers.tsx | 4 ++++ .../src/routes/Configuration.tsx | 2 ++ .../src/routes/DataStorePage.tsx | 2 ++ .../src/routes/MessageListPage.tsx | 2 ++ .../src/routes/ProcessGroupEdit.tsx | 2 ++ .../src/routes/ProcessGroupList.tsx | 3 ++- .../src/routes/ProcessGroupNew.tsx | 2 ++ .../src/routes/ProcessGroupShow.tsx | 2 ++ .../src/routes/ProcessInstanceList.tsx | 6 +++++- .../src/routes/ProcessInstanceShow.tsx | 11 +++++++++++ .../src/routes/ProcessModelEdit.tsx | 2 ++ .../src/routes/ProcessModelEditDiagram.tsx | 9 ++++++++- .../src/routes/ProcessModelNew.tsx | 6 +++++- .../src/routes/ProcessModelShow.tsx | 2 ++ .../src/routes/ReactFormEditor.tsx | 16 ++++++++++++++-- spiffworkflow-frontend/src/routes/TaskShow.tsx | 2 ++ 16 files changed, 67 insertions(+), 6 deletions(-) diff --git a/spiffworkflow-frontend/src/helpers.tsx b/spiffworkflow-frontend/src/helpers.tsx index a6fdddb1..f6a1d1bd 100644 --- a/spiffworkflow-frontend/src/helpers.tsx +++ b/spiffworkflow-frontend/src/helpers.tsx @@ -347,6 +347,10 @@ export const getBpmnProcessIdentifiers = (rootBpmnElement: any) => { return childProcesses; }; +export const setPageTitle = (items: Array) => { + document.title = ['SpiffWorkflow'].concat(items).join(' - '); +}; + export const isInteger = (str: string | number) => { return /^\d+$/.test(str.toString()); }; diff --git a/spiffworkflow-frontend/src/routes/Configuration.tsx b/spiffworkflow-frontend/src/routes/Configuration.tsx index 4a514389..6f95085b 100644 --- a/spiffworkflow-frontend/src/routes/Configuration.tsx +++ b/spiffworkflow-frontend/src/routes/Configuration.tsx @@ -11,6 +11,7 @@ import AuthenticationList from './AuthenticationList'; import { useUriListForPermissions } from '../hooks/UriListForPermissions'; import { PermissionsToCheck } from '../interfaces'; import { usePermissionFetcher } from '../hooks/PermissionService'; +import { setPageTitle } from '../helpers'; export default function Configuration() { const location = useLocation(); @@ -29,6 +30,7 @@ export default function Configuration() { useEffect(() => { removeError(); + setPageTitle(['Configuration']); let newSelectedTabIndex = 0; if (location.pathname.match(/^\/admin\/configuration\/authentications\b/)) { newSelectedTabIndex = 1; diff --git a/spiffworkflow-frontend/src/routes/DataStorePage.tsx b/spiffworkflow-frontend/src/routes/DataStorePage.tsx index 7d04732b..f609168d 100644 --- a/spiffworkflow-frontend/src/routes/DataStorePage.tsx +++ b/spiffworkflow-frontend/src/routes/DataStorePage.tsx @@ -1,7 +1,9 @@ import React from 'react'; import DataStoreList from '../components/DataStoreList'; +import { setPageTitle } from '../helpers'; export default function DataStorePage() { + setPageTitle(['Data Stores']); return ( <>

Data Stores

diff --git a/spiffworkflow-frontend/src/routes/MessageListPage.tsx b/spiffworkflow-frontend/src/routes/MessageListPage.tsx index fca96950..aae97589 100644 --- a/spiffworkflow-frontend/src/routes/MessageListPage.tsx +++ b/spiffworkflow-frontend/src/routes/MessageListPage.tsx @@ -1,6 +1,8 @@ import MessageInstanceList from '../components/MessageInstanceList'; +import { setPageTitle } from '../helpers'; export default function MessageListPage() { + setPageTitle(['Messages']); return ( <>

Messages

diff --git a/spiffworkflow-frontend/src/routes/ProcessGroupEdit.tsx b/spiffworkflow-frontend/src/routes/ProcessGroupEdit.tsx index d15aac57..eabace54 100644 --- a/spiffworkflow-frontend/src/routes/ProcessGroupEdit.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessGroupEdit.tsx @@ -5,6 +5,7 @@ import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import HttpService from '../services/HttpService'; import ProcessGroupForm from '../components/ProcessGroupForm'; import { ProcessGroup } from '../interfaces'; +import { setPageTitle } from '../helpers'; export default function ProcessGroupEdit() { const params = useParams(); @@ -22,6 +23,7 @@ export default function ProcessGroupEdit() { }, [params]); if (processGroup) { + setPageTitle([`Editing ${processGroup.display_name}`]); return ( <> { diff --git a/spiffworkflow-frontend/src/routes/ProcessGroupNew.tsx b/spiffworkflow-frontend/src/routes/ProcessGroupNew.tsx index d762a2b2..9555a99f 100644 --- a/spiffworkflow-frontend/src/routes/ProcessGroupNew.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessGroupNew.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import ProcessGroupForm from '../components/ProcessGroupForm'; import { ProcessGroup, HotCrumbItem } from '../interfaces'; +import { setPageTitle } from '../helpers'; export default function ProcessGroupNew() { const searchParams = new URLSearchParams(document.location.search); @@ -11,6 +12,7 @@ export default function ProcessGroupNew() { display_name: '', description: '', }); + setPageTitle(['New Process Group']); const hotCrumbs: HotCrumbItem[] = [['Process Groups', '/admin']]; if (parentGroupId) { diff --git a/spiffworkflow-frontend/src/routes/ProcessGroupShow.tsx b/spiffworkflow-frontend/src/routes/ProcessGroupShow.tsx index e4f467c4..dc7ce8c2 100644 --- a/spiffworkflow-frontend/src/routes/ProcessGroupShow.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessGroupShow.tsx @@ -19,6 +19,7 @@ import { getPageInfoFromSearchParams, modifyProcessIdentifierForPathParam, unModifyProcessIdentifierForPathParam, + setPageTitle, } from '../helpers'; import { PaginationObject, @@ -59,6 +60,7 @@ export default function ProcessGroupShow() { }; const processResult = (result: any) => { setProcessGroup(result); + setPageTitle([result.display_name]); const unmodifiedProcessGroupId = unModifyProcessIdentifierForPathParam( (params as any).process_group_id ); diff --git a/spiffworkflow-frontend/src/routes/ProcessInstanceList.tsx b/spiffworkflow-frontend/src/routes/ProcessInstanceList.tsx index 45bcd6ac..f359229b 100644 --- a/spiffworkflow-frontend/src/routes/ProcessInstanceList.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessInstanceList.tsx @@ -4,7 +4,10 @@ import 'react-datepicker/dist/react-datepicker.css'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import ProcessInstanceListTable from '../components/ProcessInstanceListTable'; -import { getProcessModelFullIdentifierFromSearchParams } from '../helpers'; +import { + getProcessModelFullIdentifierFromSearchParams, + setPageTitle, +} from '../helpers'; import ProcessInstanceListTabs from '../components/ProcessInstanceListTabs'; type OwnProps = { @@ -13,6 +16,7 @@ type OwnProps = { export default function ProcessInstanceList({ variant }: OwnProps) { const [searchParams] = useSearchParams(); + setPageTitle(['Process Instances']); const processInstanceBreadcrumbElement = () => { const processModelFullIdentifier = diff --git a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx index 02c29bd1..d32ea1ae 100644 --- a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx @@ -47,6 +47,7 @@ import { modifyProcessIdentifierForPathParam, truncateString, unModifyProcessIdentifierForPathParam, + setPageTitle, } from '../helpers'; import ButtonWithConfirmation from '../components/ButtonWithConfirmation'; import { useUriListForPermissions } from '../hooks/UriListForPermissions'; @@ -162,6 +163,16 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + useEffect(() => { + if (processInstance) { + setPageTitle([ + processInstance.process_model_display_name, + `Process Instance ${processInstance.id}`, + ]); + } + return undefined; + }, [processInstance]); + useEffect(() => { if (!permissionsLoaded) { return undefined; diff --git a/spiffworkflow-frontend/src/routes/ProcessModelEdit.tsx b/spiffworkflow-frontend/src/routes/ProcessModelEdit.tsx index e8db66ee..6dea6c55 100644 --- a/spiffworkflow-frontend/src/routes/ProcessModelEdit.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessModelEdit.tsx @@ -5,6 +5,7 @@ import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import HttpService from '../services/HttpService'; import ProcessModelForm from '../components/ProcessModelForm'; import { ProcessModel } from '../interfaces'; +import { setPageTitle } from '../helpers'; export default function ProcessModelEdit() { const params = useParams(); @@ -19,6 +20,7 @@ export default function ProcessModelEdit() { }, [processModelPath]); if (processModel) { + setPageTitle([`Editing ${processModel.display_name}`]); return ( <> { diff --git a/spiffworkflow-frontend/src/routes/ProcessModelNew.tsx b/spiffworkflow-frontend/src/routes/ProcessModelNew.tsx index c3d3a67c..a964c83d 100644 --- a/spiffworkflow-frontend/src/routes/ProcessModelNew.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessModelNew.tsx @@ -3,7 +3,10 @@ import { useParams } from 'react-router-dom'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import { ProcessModel } from '../interfaces'; import ProcessModelForm from '../components/ProcessModelForm'; -import { unModifyProcessIdentifierForPathParam } from '../helpers'; +import { + unModifyProcessIdentifierForPathParam, + setPageTitle, +} from '../helpers'; export default function ProcessModelNew() { const params = useParams(); @@ -15,6 +18,7 @@ export default function ProcessModelNew() { primary_process_id: '', files: [], }); + setPageTitle(['Add New Process Model']); return ( <> diff --git a/spiffworkflow-frontend/src/routes/ProcessModelShow.tsx b/spiffworkflow-frontend/src/routes/ProcessModelShow.tsx index b5afb231..a65c8366 100644 --- a/spiffworkflow-frontend/src/routes/ProcessModelShow.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessModelShow.tsx @@ -33,6 +33,7 @@ import useAPIError from '../hooks/UseApiError'; import { getGroupFromModifiedModelId, modifyProcessIdentifierForPathParam, + setPageTitle, } from '../helpers'; import { PermissionsToCheck, @@ -96,6 +97,7 @@ export default function ProcessModelShow() { const processResult = (result: ProcessModel) => { setProcessModel(result); setReloadModel(false); + setPageTitle([result.display_name]); }; HttpService.makeCallToBackend({ path: `/process-models/${modifiedProcessModelId}`, diff --git a/spiffworkflow-frontend/src/routes/ReactFormEditor.tsx b/spiffworkflow-frontend/src/routes/ReactFormEditor.tsx index 1cc1fc9c..d8cbaf59 100644 --- a/spiffworkflow-frontend/src/routes/ReactFormEditor.tsx +++ b/spiffworkflow-frontend/src/routes/ReactFormEditor.tsx @@ -9,8 +9,8 @@ import { Can } from '@casl/react'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import HttpService from '../services/HttpService'; import ButtonWithConfirmation from '../components/ButtonWithConfirmation'; -import { modifyProcessIdentifierForPathParam } from '../helpers'; -import { ProcessFile, PermissionsToCheck } from '../interfaces'; +import { modifyProcessIdentifierForPathParam, setPageTitle } from '../helpers'; +import { ProcessFile, PermissionsToCheck, ProcessModel } from '../interfaces'; import { Notification } from '../components/Notification'; import useAPIError from '../hooks/UseApiError'; import { usePermissionFetcher } from '../hooks/PermissionService'; @@ -38,6 +38,7 @@ export default function ReactFormEditor() { const [displaySaveFileMessage, setDisplaySaveFileMessage] = useState(false); + const [processModel, setProcessModel] = useState(null); const [processModelFile, setProcessModelFile] = useState( null ); @@ -80,6 +81,11 @@ export default function ReactFormEditor() { setProcessModelFileContents(result.file_contents); }; + HttpService.makeCallToBackend({ + path: `/process-models/${modifiedProcessModelId}?include_file_references=true`, + successCallback: setProcessModel, + }); + if (params.file_name) { HttpService.makeCallToBackend({ path: `/process-models/${modifiedProcessModelId}/files/${params.file_name}`, @@ -88,6 +94,12 @@ export default function ReactFormEditor() { } }, [params, modifiedProcessModelId]); + useEffect(() => { + if (processModelFile && processModel) { + setPageTitle([processModel.display_name, processModelFile.name]); + } + }, [processModel, processModelFile]); + const navigateToProcessModelFile = (file: ProcessFile) => { setDisplaySaveFileMessage(true); if (file.file_contents_hash) { diff --git a/spiffworkflow-frontend/src/routes/TaskShow.tsx b/spiffworkflow-frontend/src/routes/TaskShow.tsx index 007a45a5..9850baa2 100644 --- a/spiffworkflow-frontend/src/routes/TaskShow.tsx +++ b/spiffworkflow-frontend/src/routes/TaskShow.tsx @@ -11,6 +11,7 @@ import { doNothing, modifyProcessIdentifierForPathParam, recursivelyChangeNullAndUndefined, + setPageTitle, } from '../helpers'; import { BasicTask, @@ -63,6 +64,7 @@ export default function TaskShow() { useEffect(() => { const processBasicTaskResult = (result: BasicTask) => { setBasicTask(result); + setPageTitle([result.name_for_display]); if (!result.can_complete) { navigateToInterstitial(result); }