Fix nonconformity pages permission handling

Signed-off-by: Émile Ré <nemile.re@gmail.com>
This commit is contained in:
Émile Ré
2025-12-31 18:57:44 +01:00
committed by Bryan Frimin
parent 65d3267ab8
commit 04aecdd7e5
8 changed files with 238 additions and 73 deletions

View File

@@ -45,8 +45,6 @@ import type {
NonconformitiesPageFragment$key,
NonconformitiesPageFragment$data,
} from "/__generated__/core/NonconformitiesPageFragment.graphql";
import { use } from "react";
import { PermissionsContext } from "/providers/PermissionsContext";
import type { NonconformityGraphListQuery } from "/__generated__/core/NonconformityGraphListQuery.graphql";
type Nonconformity =
@@ -102,6 +100,8 @@ const nonconformitiesPageFragment = graphql`
}
createdAt
updatedAt
canUpdate: permission(action: "core:nonconformity:update")
canDelete: permission(action: "core:nonconformity:delete")
}
}
pageInfo {
@@ -119,7 +119,6 @@ export default function NonconformitiesPage({
const organizationId = useOrganizationId();
const { snapshotId } = useParams<{ snapshotId?: string }>();
const isSnapshotMode = Boolean(snapshotId);
const { isAuthorized } = use(PermissionsContext);
usePageTitle(__("Nonconformities"));
@@ -144,8 +143,7 @@ export default function NonconformitiesPage({
const hasAnyAction =
!isSnapshotMode &&
(isAuthorized("Nonconformity", "updateNonconformity") ||
isAuthorized("Nonconformity", "deleteNonconformity"));
nonconformities.some(({ canDelete, canUpdate }) => canDelete || canUpdate);
return (
<div className="space-y-6">
@@ -154,15 +152,14 @@ export default function NonconformitiesPage({
title={__("Nonconformities")}
description={__("Manage your organization's non conformities.")}
>
{!isSnapshotMode &&
isAuthorized("Organization", "createNonconformity") && (
<CreateNonconformityDialog
organizationId={organizationId}
connection={connectionId}
>
<Button icon={IconPlusLarge}>{__("Add nonconformity")}</Button>
</CreateNonconformityDialog>
)}
{!isSnapshotMode && organization.node.canCreateNonconformity && (
<CreateNonconformityDialog
organizationId={organizationId}
connection={connectionId}
>
<Button icon={IconPlusLarge}>{__("Add nonconformity")}</Button>
</CreateNonconformityDialog>
)}
</PageHeader>
{nonconformities.length === 0 ? (
@@ -238,7 +235,6 @@ function NonconformityRow({
const { __ } = useTranslate();
const confirm = useConfirm();
const [deleteNonconformity] = useMutation(deleteNonconformityMutation);
const { isAuthorized } = use(PermissionsContext);
const nonconformityDetailUrl = isSnapshotMode
? `/organizations/${organizationId}/snapshots/${snapshotId}/nonconformities/${nonconformity.id}`
@@ -310,7 +306,7 @@ function NonconformityRow({
{hasAnyAction && (
<Td noLink width={50} className="text-end">
<ActionDropdown>
{isAuthorized("Nonconformity", "deleteNonconformity") && (
{nonconformity.canDelete && (
<DropdownItem
icon={IconTrashCan}
variant="danger"

View File

@@ -42,8 +42,6 @@ import {
type GraphQLError,
} from "@probo/helpers";
import type { NonconformityGraphNodeQuery } from "/__generated__/core/NonconformityGraphNodeQuery.graphql";
import { PermissionsContext } from "/providers/PermissionsContext";
import { use } from "react";
const updateNonconformitySchema = z.object({
referenceId: z.string().min(1, "Reference ID is required"),
@@ -63,16 +61,15 @@ type Props = {
};
export default function NonconformityDetailsPage(props: Props) {
const data = usePreloadedQuery<NonconformityGraphNodeQuery>(
nonconformityNodeQuery,
props.queryRef,
);
const nonconformity = data.node;
const { node: nonconformity } =
usePreloadedQuery<NonconformityGraphNodeQuery>(
nonconformityNodeQuery,
props.queryRef,
);
const { __ } = useTranslate();
const organizationId = useOrganizationId();
const { snapshotId } = useParams<{ snapshotId?: string }>();
const isSnapshotMode = Boolean(snapshotId);
const { isAuthorized } = use(PermissionsContext);
validateSnapshotConsistency(nonconformity, snapshotId);
@@ -171,7 +168,7 @@ export default function NonconformityDetailsPage(props: Props) {
</div>
{!isSnapshotMode && (
<ActionDropdown variant="secondary">
{isAuthorized("Nonconformity", "deleteNonconformity") && (
{nonconformity.canDelete && (
<DropdownItem
variant="danger"
icon={IconTrashCan}
@@ -296,7 +293,7 @@ export default function NonconformityDetailsPage(props: Props) {
<div className="flex justify-end">
{formState.isDirty &&
!isSnapshotMode &&
isAuthorized("Nonconformity", "updateNonconformity") && (
nonconformity.canUpdate && (
<Button type="submit" disabled={formState.isSubmitting}>
{formState.isSubmitting ? __("Updating...") : __("Update")}
</Button>