add page titles for most routes (#468)

This commit is contained in:
Elizabeth Esswein 2023-09-07 13:53:10 -04:00 committed by GitHub
parent beb0449a5a
commit ef297b1eeb
16 changed files with 67 additions and 6 deletions

View File

@ -347,6 +347,10 @@ export const getBpmnProcessIdentifiers = (rootBpmnElement: any) => {
return childProcesses; return childProcesses;
}; };
export const setPageTitle = (items: Array<string>) => {
document.title = ['SpiffWorkflow'].concat(items).join(' - ');
};
export const isInteger = (str: string | number) => { export const isInteger = (str: string | number) => {
return /^\d+$/.test(str.toString()); return /^\d+$/.test(str.toString());
}; };

View File

@ -11,6 +11,7 @@ import AuthenticationList from './AuthenticationList';
import { useUriListForPermissions } from '../hooks/UriListForPermissions'; import { useUriListForPermissions } from '../hooks/UriListForPermissions';
import { PermissionsToCheck } from '../interfaces'; import { PermissionsToCheck } from '../interfaces';
import { usePermissionFetcher } from '../hooks/PermissionService'; import { usePermissionFetcher } from '../hooks/PermissionService';
import { setPageTitle } from '../helpers';
export default function Configuration() { export default function Configuration() {
const location = useLocation(); const location = useLocation();
@ -29,6 +30,7 @@ export default function Configuration() {
useEffect(() => { useEffect(() => {
removeError(); removeError();
setPageTitle(['Configuration']);
let newSelectedTabIndex = 0; let newSelectedTabIndex = 0;
if (location.pathname.match(/^\/admin\/configuration\/authentications\b/)) { if (location.pathname.match(/^\/admin\/configuration\/authentications\b/)) {
newSelectedTabIndex = 1; newSelectedTabIndex = 1;

View File

@ -1,7 +1,9 @@
import React from 'react'; import React from 'react';
import DataStoreList from '../components/DataStoreList'; import DataStoreList from '../components/DataStoreList';
import { setPageTitle } from '../helpers';
export default function DataStorePage() { export default function DataStorePage() {
setPageTitle(['Data Stores']);
return ( return (
<> <>
<h1>Data Stores</h1> <h1>Data Stores</h1>

View File

@ -1,6 +1,8 @@
import MessageInstanceList from '../components/MessageInstanceList'; import MessageInstanceList from '../components/MessageInstanceList';
import { setPageTitle } from '../helpers';
export default function MessageListPage() { export default function MessageListPage() {
setPageTitle(['Messages']);
return ( return (
<> <>
<h1>Messages</h1> <h1>Messages</h1>

View File

@ -5,6 +5,7 @@ import ProcessBreadcrumb from '../components/ProcessBreadcrumb';
import HttpService from '../services/HttpService'; import HttpService from '../services/HttpService';
import ProcessGroupForm from '../components/ProcessGroupForm'; import ProcessGroupForm from '../components/ProcessGroupForm';
import { ProcessGroup } from '../interfaces'; import { ProcessGroup } from '../interfaces';
import { setPageTitle } from '../helpers';
export default function ProcessGroupEdit() { export default function ProcessGroupEdit() {
const params = useParams(); const params = useParams();
@ -22,6 +23,7 @@ export default function ProcessGroupEdit() {
}, [params]); }, [params]);
if (processGroup) { if (processGroup) {
setPageTitle([`Editing ${processGroup.display_name}`]);
return ( return (
<> <>
<ProcessBreadcrumb <ProcessBreadcrumb

View File

@ -7,7 +7,7 @@ import {
import { Can } from '@casl/react'; import { Can } from '@casl/react';
import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb';
import HttpService from '../services/HttpService'; import HttpService from '../services/HttpService';
import { modifyProcessIdentifierForPathParam } from '../helpers'; import { modifyProcessIdentifierForPathParam, setPageTitle } from '../helpers';
import { CarbonComboBoxSelection, PermissionsToCheck } from '../interfaces'; import { CarbonComboBoxSelection, PermissionsToCheck } from '../interfaces';
import { useUriListForPermissions } from '../hooks/UriListForPermissions'; import { useUriListForPermissions } from '../hooks/UriListForPermissions';
import { usePermissionFetcher } from '../hooks/PermissionService'; import { usePermissionFetcher } from '../hooks/PermissionService';
@ -42,6 +42,7 @@ export default function ProcessGroupList() {
path: `/process-models?per_page=1000&recursive=true&include_parent_groups=true`, path: `/process-models?per_page=1000&recursive=true&include_parent_groups=true`,
successCallback: processResultForProcessModels, successCallback: processResultForProcessModels,
}); });
setPageTitle(['Process Groups']);
}, [searchParams]); }, [searchParams]);
const processModelSearchArea = () => { const processModelSearchArea = () => {

View File

@ -2,6 +2,7 @@ import { useState } from 'react';
import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb';
import ProcessGroupForm from '../components/ProcessGroupForm'; import ProcessGroupForm from '../components/ProcessGroupForm';
import { ProcessGroup, HotCrumbItem } from '../interfaces'; import { ProcessGroup, HotCrumbItem } from '../interfaces';
import { setPageTitle } from '../helpers';
export default function ProcessGroupNew() { export default function ProcessGroupNew() {
const searchParams = new URLSearchParams(document.location.search); const searchParams = new URLSearchParams(document.location.search);
@ -11,6 +12,7 @@ export default function ProcessGroupNew() {
display_name: '', display_name: '',
description: '', description: '',
}); });
setPageTitle(['New Process Group']);
const hotCrumbs: HotCrumbItem[] = [['Process Groups', '/admin']]; const hotCrumbs: HotCrumbItem[] = [['Process Groups', '/admin']];
if (parentGroupId) { if (parentGroupId) {

View File

@ -19,6 +19,7 @@ import {
getPageInfoFromSearchParams, getPageInfoFromSearchParams,
modifyProcessIdentifierForPathParam, modifyProcessIdentifierForPathParam,
unModifyProcessIdentifierForPathParam, unModifyProcessIdentifierForPathParam,
setPageTitle,
} from '../helpers'; } from '../helpers';
import { import {
PaginationObject, PaginationObject,
@ -59,6 +60,7 @@ export default function ProcessGroupShow() {
}; };
const processResult = (result: any) => { const processResult = (result: any) => {
setProcessGroup(result); setProcessGroup(result);
setPageTitle([result.display_name]);
const unmodifiedProcessGroupId = unModifyProcessIdentifierForPathParam( const unmodifiedProcessGroupId = unModifyProcessIdentifierForPathParam(
(params as any).process_group_id (params as any).process_group_id
); );

View File

@ -4,7 +4,10 @@ import 'react-datepicker/dist/react-datepicker.css';
import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb';
import ProcessInstanceListTable from '../components/ProcessInstanceListTable'; import ProcessInstanceListTable from '../components/ProcessInstanceListTable';
import { getProcessModelFullIdentifierFromSearchParams } from '../helpers'; import {
getProcessModelFullIdentifierFromSearchParams,
setPageTitle,
} from '../helpers';
import ProcessInstanceListTabs from '../components/ProcessInstanceListTabs'; import ProcessInstanceListTabs from '../components/ProcessInstanceListTabs';
type OwnProps = { type OwnProps = {
@ -13,6 +16,7 @@ type OwnProps = {
export default function ProcessInstanceList({ variant }: OwnProps) { export default function ProcessInstanceList({ variant }: OwnProps) {
const [searchParams] = useSearchParams(); const [searchParams] = useSearchParams();
setPageTitle(['Process Instances']);
const processInstanceBreadcrumbElement = () => { const processInstanceBreadcrumbElement = () => {
const processModelFullIdentifier = const processModelFullIdentifier =

View File

@ -47,6 +47,7 @@ import {
modifyProcessIdentifierForPathParam, modifyProcessIdentifierForPathParam,
truncateString, truncateString,
unModifyProcessIdentifierForPathParam, unModifyProcessIdentifierForPathParam,
setPageTitle,
} from '../helpers'; } from '../helpers';
import ButtonWithConfirmation from '../components/ButtonWithConfirmation'; import ButtonWithConfirmation from '../components/ButtonWithConfirmation';
import { useUriListForPermissions } from '../hooks/UriListForPermissions'; import { useUriListForPermissions } from '../hooks/UriListForPermissions';
@ -162,6 +163,16 @@ export default function ProcessInstanceShow({ variant }: OwnProps) {
// eslint-disable-next-line react-hooks/exhaustive-deps // 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(() => { useEffect(() => {
if (!permissionsLoaded) { if (!permissionsLoaded) {
return undefined; return undefined;

View File

@ -5,6 +5,7 @@ import ProcessBreadcrumb from '../components/ProcessBreadcrumb';
import HttpService from '../services/HttpService'; import HttpService from '../services/HttpService';
import ProcessModelForm from '../components/ProcessModelForm'; import ProcessModelForm from '../components/ProcessModelForm';
import { ProcessModel } from '../interfaces'; import { ProcessModel } from '../interfaces';
import { setPageTitle } from '../helpers';
export default function ProcessModelEdit() { export default function ProcessModelEdit() {
const params = useParams(); const params = useParams();
@ -19,6 +20,7 @@ export default function ProcessModelEdit() {
}, [processModelPath]); }, [processModelPath]);
if (processModel) { if (processModel) {
setPageTitle([`Editing ${processModel.display_name}`]);
return ( return (
<> <>
<ProcessBreadcrumb <ProcessBreadcrumb

View File

@ -33,7 +33,11 @@ import HttpService from '../services/HttpService';
import ReactDiagramEditor from '../components/ReactDiagramEditor'; import ReactDiagramEditor from '../components/ReactDiagramEditor';
import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb';
import useAPIError from '../hooks/UseApiError'; import useAPIError from '../hooks/UseApiError';
import { makeid, modifyProcessIdentifierForPathParam } from '../helpers'; import {
makeid,
modifyProcessIdentifierForPathParam,
setPageTitle,
} from '../helpers';
import { import {
CarbonComboBoxProcessSelection, CarbonComboBoxProcessSelection,
ProcessFile, ProcessFile,
@ -178,6 +182,9 @@ export default function ProcessModelEditDiagram() {
successCallback: setCallers, successCallback: setCallers,
}); });
} }
if (processModel && processModelFile) {
setPageTitle([processModel.display_name, processModelFile.name]);
}
}, [processModel, processModelFile]); }, [processModel, processModelFile]);
const handleFileNameCancel = () => { const handleFileNameCancel = () => {

View File

@ -3,7 +3,10 @@ import { useParams } from 'react-router-dom';
import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb';
import { ProcessModel } from '../interfaces'; import { ProcessModel } from '../interfaces';
import ProcessModelForm from '../components/ProcessModelForm'; import ProcessModelForm from '../components/ProcessModelForm';
import { unModifyProcessIdentifierForPathParam } from '../helpers'; import {
unModifyProcessIdentifierForPathParam,
setPageTitle,
} from '../helpers';
export default function ProcessModelNew() { export default function ProcessModelNew() {
const params = useParams(); const params = useParams();
@ -15,6 +18,7 @@ export default function ProcessModelNew() {
primary_process_id: '', primary_process_id: '',
files: [], files: [],
}); });
setPageTitle(['Add New Process Model']);
return ( return (
<> <>

View File

@ -33,6 +33,7 @@ import useAPIError from '../hooks/UseApiError';
import { import {
getGroupFromModifiedModelId, getGroupFromModifiedModelId,
modifyProcessIdentifierForPathParam, modifyProcessIdentifierForPathParam,
setPageTitle,
} from '../helpers'; } from '../helpers';
import { import {
PermissionsToCheck, PermissionsToCheck,
@ -96,6 +97,7 @@ export default function ProcessModelShow() {
const processResult = (result: ProcessModel) => { const processResult = (result: ProcessModel) => {
setProcessModel(result); setProcessModel(result);
setReloadModel(false); setReloadModel(false);
setPageTitle([result.display_name]);
}; };
HttpService.makeCallToBackend({ HttpService.makeCallToBackend({
path: `/process-models/${modifiedProcessModelId}`, path: `/process-models/${modifiedProcessModelId}`,

View File

@ -9,8 +9,8 @@ import { Can } from '@casl/react';
import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb';
import HttpService from '../services/HttpService'; import HttpService from '../services/HttpService';
import ButtonWithConfirmation from '../components/ButtonWithConfirmation'; import ButtonWithConfirmation from '../components/ButtonWithConfirmation';
import { modifyProcessIdentifierForPathParam } from '../helpers'; import { modifyProcessIdentifierForPathParam, setPageTitle } from '../helpers';
import { ProcessFile, PermissionsToCheck } from '../interfaces'; import { ProcessFile, PermissionsToCheck, ProcessModel } from '../interfaces';
import { Notification } from '../components/Notification'; import { Notification } from '../components/Notification';
import useAPIError from '../hooks/UseApiError'; import useAPIError from '../hooks/UseApiError';
import { usePermissionFetcher } from '../hooks/PermissionService'; import { usePermissionFetcher } from '../hooks/PermissionService';
@ -38,6 +38,7 @@ export default function ReactFormEditor() {
const [displaySaveFileMessage, setDisplaySaveFileMessage] = const [displaySaveFileMessage, setDisplaySaveFileMessage] =
useState<boolean>(false); useState<boolean>(false);
const [processModel, setProcessModel] = useState<ProcessModel | null>(null);
const [processModelFile, setProcessModelFile] = useState<ProcessFile | null>( const [processModelFile, setProcessModelFile] = useState<ProcessFile | null>(
null null
); );
@ -80,6 +81,11 @@ export default function ReactFormEditor() {
setProcessModelFileContents(result.file_contents); setProcessModelFileContents(result.file_contents);
}; };
HttpService.makeCallToBackend({
path: `/process-models/${modifiedProcessModelId}?include_file_references=true`,
successCallback: setProcessModel,
});
if (params.file_name) { if (params.file_name) {
HttpService.makeCallToBackend({ HttpService.makeCallToBackend({
path: `/process-models/${modifiedProcessModelId}/files/${params.file_name}`, path: `/process-models/${modifiedProcessModelId}/files/${params.file_name}`,
@ -88,6 +94,12 @@ export default function ReactFormEditor() {
} }
}, [params, modifiedProcessModelId]); }, [params, modifiedProcessModelId]);
useEffect(() => {
if (processModelFile && processModel) {
setPageTitle([processModel.display_name, processModelFile.name]);
}
}, [processModel, processModelFile]);
const navigateToProcessModelFile = (file: ProcessFile) => { const navigateToProcessModelFile = (file: ProcessFile) => {
setDisplaySaveFileMessage(true); setDisplaySaveFileMessage(true);
if (file.file_contents_hash) { if (file.file_contents_hash) {

View File

@ -11,6 +11,7 @@ import {
doNothing, doNothing,
modifyProcessIdentifierForPathParam, modifyProcessIdentifierForPathParam,
recursivelyChangeNullAndUndefined, recursivelyChangeNullAndUndefined,
setPageTitle,
} from '../helpers'; } from '../helpers';
import { import {
BasicTask, BasicTask,
@ -63,6 +64,7 @@ export default function TaskShow() {
useEffect(() => { useEffect(() => {
const processBasicTaskResult = (result: BasicTask) => { const processBasicTaskResult = (result: BasicTask) => {
setBasicTask(result); setBasicTask(result);
setPageTitle([result.name_for_display]);
if (!result.can_complete) { if (!result.can_complete) {
navigateToInterstitial(result); navigateToInterstitial(result);
} }