diff --git a/src/components/settings/service_categories/ServiceCategoryTable/ServiceCategoryTable.tsx b/src/components/settings/service_categories/ServiceCategoryTable/ServiceCategoryTable.tsx index b64918d..5b0a385 100644 --- a/src/components/settings/service_categories/ServiceCategoryTable/ServiceCategoryTable.tsx +++ b/src/components/settings/service_categories/ServiceCategoryTable/ServiceCategoryTable.tsx @@ -83,9 +83,14 @@ export const ServiceCategoryTable = ({ openEditServiceCategoryModal() } - const serviceCategoriesToShow = showArchived - ? serviceCategories - : serviceCategories.filter((serviceCategory) => serviceCategory.deletedAt === null) + const serviceCategoriesToShow = serviceCategories.filter((serviceCategory) => { + // Filter by archived status + if (!showArchived && serviceCategory.deletedAt !== null) return false + + // Filter by view permission + const actions = resolvePolicy("service_category", userContext, serviceCategory) + return actions.includes("view") + }) const canCreate = actions.includes("create") diff --git a/src/components/settings/services/EditServiceModal/EditServiceModal.tsx b/src/components/settings/services/EditServiceModal/EditServiceModal.tsx index b6a984c..9a630e6 100644 --- a/src/components/settings/services/EditServiceModal/EditServiceModal.tsx +++ b/src/components/settings/services/EditServiceModal/EditServiceModal.tsx @@ -21,6 +21,8 @@ type EditServiceModalProps = { service: ServiceWithRelations | null locations: LocationWithRelations[] categories: ServiceCategoryWithRelations[] + canEdit: boolean + canArchive: boolean updateService: ( service: Partial, prevService: Partial @@ -36,6 +38,8 @@ export const EditServiceModal = ({ service, locations, categories, + canEdit, + canArchive, updateService, doesServiceCodeExist, revalidateTable, @@ -112,7 +116,7 @@ export const EditServiceModal = ({ if (!service || !formData || !previousService) return null const isArchived = service.deletedAt !== null - const isReadonly = isArchived + const isReadonly = isArchived || !canEdit const handleSave = async () => { if (formData && !isReadonly) { @@ -147,13 +151,19 @@ export const EditServiceModal = ({
- {isReadonly && ( + {!canEdit && (
- {isArchived && ( -

- This service is archived and cannot be edited. -

- )} +

+ You do not have permission to edit this service. +

+
+ )} + + {isArchived && ( +
+

+ This service is archived and cannot be edited. +

)} @@ -178,9 +188,11 @@ export const EditServiceModal = ({ - + {canArchive && ( + + )} @@ -92,6 +135,8 @@ export const ServiceTable = ({ service={selectedService} locations={locations} categories={categories} + canEdit={canEditSelectedService} + canArchive={canArchiveSelectedService} updateService={updateService} doesServiceCodeExist={doesServiceCodeExist} revalidateTable={revalidateTable} diff --git a/src/utils/policies/policies.ts b/src/utils/policies/policies.ts index 81bc9f9..3ef447d 100644 --- a/src/utils/policies/policies.ts +++ b/src/utils/policies/policies.ts @@ -1,4 +1,5 @@ import { LocationPolicy } from "./resources/location" +import { ServicePolicy } from "./resources/service" import { ServiceCategoryPolicy } from "./resources/service_category" import { StaffUserPolicy } from "./resources/staff_user" import type { Policies } from "./types" @@ -21,5 +22,6 @@ import type { Policies } from "./types" export const policies: Policies = { staff_user: StaffUserPolicy, location: LocationPolicy, + service: ServicePolicy, service_category: ServiceCategoryPolicy, } diff --git a/src/utils/policies/resources/service.ts b/src/utils/policies/resources/service.ts new file mode 100644 index 0000000..d06e22e --- /dev/null +++ b/src/utils/policies/resources/service.ts @@ -0,0 +1,20 @@ +import type { Policy } from "../types" + +export const ServicePolicy: Policy = (user_context, _data) => { + const { role } = user_context + const actions = new Set() + + // View permissions + actions.add("view") // Anyone can view services + + // Create permissions + if (role === "Administrator") actions.add("create") // Administrators can create services + + // Edit permissions + if (role === "Administrator") actions.add("edit") // Administrators can edit all records + + // Archive permissions + if (role === "Administrator") actions.add("archive") // Administrators can archive all records + + return Array.from(actions) +}