diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/spec_reference.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/spec_reference.py index 92d59ee8..1e85f722 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/spec_reference.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/spec_reference.py @@ -47,7 +47,7 @@ class SpecReferenceCache(SpiffworkflowBaseDBModel): file_name = db.Column(db.String(255)) relative_path = db.Column(db.String(255)) has_lanes = db.Column(db.Boolean()) - is_executable = db.Column(db.Boolean()) # either 'process' or 'decision' + is_executable = db.Column(db.Boolean()) is_primary = db.Column(db.Boolean()) @classmethod diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py index 36570ade..547159e6 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/file_system_service.py @@ -54,7 +54,8 @@ class FileSystemService: @staticmethod def process_group_path_for_spec(spec: ProcessModelInfo) -> str: """Category_path_for_spec.""" - process_group_id, _ = os.path.split(spec.id) + # os.path.split apparently returns 2 element tulple like: (first/path, last_item) + process_group_id, _ = os.path.split(spec.id_for_file_path()) return FileSystemService.process_group_path(process_group_id) @staticmethod diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py index 4f160b12..a6449f88 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py @@ -45,7 +45,9 @@ class SpecFileService(FileSystemService): ) -> List[File]: """Return all files associated with a workflow specification.""" # path = SpecFileService.workflow_path(process_model_info) - path = os.path.join(FileSystemService.root_path(), process_model_info.id) + path = os.path.join( + FileSystemService.root_path(), process_model_info.id_for_file_path() + ) files = SpecFileService._get_files(path, file_name) if extension_filter != "": files = list( @@ -88,7 +90,7 @@ class SpecFileService(FileSystemService): """ references: list[SpecReference] = [] full_file_path = SpecFileService.full_file_path(process_model_info, file.name) - file_path = os.path.join(process_model_info.id, file.name) + file_path = os.path.join(process_model_info.id_for_file_path(), file.name) parser = MyCustomParser() parser_type = None sub_parser = None diff --git a/spiffworkflow-frontend/src/components/PermissionService.tsx b/spiffworkflow-frontend/src/hooks/PermissionService.tsx similarity index 100% rename from spiffworkflow-frontend/src/components/PermissionService.tsx rename to spiffworkflow-frontend/src/hooks/PermissionService.tsx diff --git a/spiffworkflow-frontend/src/hooks/UriListForPermissions.tsx b/spiffworkflow-frontend/src/hooks/UriListForPermissions.tsx new file mode 100644 index 00000000..8491b1e9 --- /dev/null +++ b/spiffworkflow-frontend/src/hooks/UriListForPermissions.tsx @@ -0,0 +1,15 @@ +import { useParams } from 'react-router-dom'; + +export const useUriListForPermissions = () => { + const params = useParams(); + const targetUris = { + processGroupListPath: `/v1.0/process-groups`, + processGroupShowPath: `/v1.0/process-groups/${params.process_group_id}`, + processModelListPath: `/v1.0/process-models`, + processModelShowPath: `/v1.0/process-models/${params.process_model_id}`, + processInstanceListPath: `/v1.0/process-instances`, + processInstanceActionPath: `/v1.0/process-models/${params.process_model_id}/process-instances`, + }; + + return { targetUris }; +}; diff --git a/spiffworkflow-frontend/src/routes/ProcessGroupList.tsx b/spiffworkflow-frontend/src/routes/ProcessGroupList.tsx index 63e9050d..1a5c59c3 100644 --- a/spiffworkflow-frontend/src/routes/ProcessGroupList.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessGroupList.tsx @@ -10,6 +10,7 @@ import { // ClickableTile, // @ts-ignore } from '@carbon/react'; +import { Can } from '@casl/react'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import PaginationForTable from '../components/PaginationForTable'; import HttpService from '../services/HttpService'; @@ -17,8 +18,14 @@ import { getPageInfoFromSearchParams, modifyProcessModelPath, } from '../helpers'; -import { CarbonComboBoxSelection, ProcessGroup } from '../interfaces'; +import { + CarbonComboBoxSelection, + PermissionsToCheck, + ProcessGroup, +} from '../interfaces'; import ProcessModelSearch from '../components/ProcessModelSearch'; +import { useUriListForPermissions } from '../hooks/UriListForPermissions'; +import { usePermissionFetcher } from '../hooks/PermissionService'; // Example process group json // {'process_group_id': 'sure', 'display_name': 'Test Workflows', 'id': 'test_process_group'} @@ -32,6 +39,12 @@ export default function ProcessGroupList() { [] ); + const { targetUris } = useUriListForPermissions(); + const permissionRequestData: PermissionsToCheck = { + [targetUris.processGroupListPath]: ['POST'], + }; + const { ability } = usePermissionFetcher(permissionRequestData); + useEffect(() => { const setProcessGroupsFromResult = (result: any) => { setProcessGroups(result.results); @@ -84,17 +97,6 @@ export default function ProcessGroupList() { {rows} ); - // const rows = processGroups.map((row: ProcessGroup) => { - // return ( - // - // - // {row.display_name} - // - // - // ); - // }); - // - // return
{rows}
; }; const processGroupsDisplayArea = () => { @@ -138,11 +140,13 @@ export default function ProcessGroupList() { return ( <> - -
-
+ + +
+
+
{processModelSearchArea()}
{processGroupsDisplayArea()} diff --git a/spiffworkflow-frontend/src/routes/ProcessGroupShow.tsx b/spiffworkflow-frontend/src/routes/ProcessGroupShow.tsx index 39ae461b..932ab713 100644 --- a/spiffworkflow-frontend/src/routes/ProcessGroupShow.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessGroupShow.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'; import { Link, useSearchParams, useParams } from 'react-router-dom'; // @ts-ignore import { Button, Table, Stack } from '@carbon/react'; +import { Can } from '@casl/react'; import ProcessBreadcrumb from '../components/ProcessBreadcrumb'; import PaginationForTable from '../components/PaginationForTable'; import HttpService from '../services/HttpService'; @@ -10,7 +11,14 @@ import { modifyProcessModelPath, unModifyProcessModelPath, } from '../helpers'; -import { PaginationObject, ProcessGroup, ProcessModel } from '../interfaces'; +import { + PaginationObject, + PermissionsToCheck, + ProcessGroup, + ProcessModel, +} from '../interfaces'; +import { useUriListForPermissions } from '../hooks/UriListForPermissions'; +import { usePermissionFetcher } from '../hooks/PermissionService'; export default function ProcessGroupShow() { const params = useParams(); @@ -24,6 +32,12 @@ export default function ProcessGroupShow() { const [groupPagination, setGroupPagination] = useState(null); + const { targetUris } = useUriListForPermissions(); + const permissionRequestData: PermissionsToCheck = { + [targetUris.processGroupListPath]: ['POST'], + }; + const { ability } = usePermissionFetcher(permissionRequestData); + useEffect(() => { const { page, perPage } = getPageInfoFromSearchParams(searchParams); @@ -143,12 +157,14 @@ export default function ProcessGroupShow() {

Process Group: {processGroup.display_name}