Fix continual improvements pages permissions handling

Signed-off-by: Émile Ré <nemile.re@gmail.com>
This commit is contained in:
Émile Ré
2025-12-31 16:10:46 +01:00
committed by Bryan Frimin
parent da3f9c0692
commit 5b0627b05a
8 changed files with 247 additions and 87 deletions

View File

@@ -40,8 +40,6 @@ import {
} from "@probo/helpers";
import { SnapshotBanner } from "/components/SnapshotBanner";
import type { ContinualImprovementGraphNodeQuery } from "/__generated__/core/ContinualImprovementGraphNodeQuery.graphql";
import { use } from "react";
import { PermissionsContext } from "/providers/PermissionsContext";
const updateImprovementSchema = z.object({
referenceId: z.string().min(1, "Reference ID is required"),
@@ -58,17 +56,16 @@ type Props = {
};
export default function ContinualImprovementDetailsPage(props: Props) {
const data = usePreloadedQuery<ContinualImprovementGraphNodeQuery>(
continualImprovementNodeQuery,
props.queryRef,
);
const improvement = data.node;
const { node: improvement } =
usePreloadedQuery<ContinualImprovementGraphNodeQuery>(
continualImprovementNodeQuery,
props.queryRef,
);
const { __ } = useTranslate();
const { toast } = useToast();
const organizationId = useOrganizationId();
const { snapshotId } = useParams<{ snapshotId?: string }>();
const isSnapshotMode = Boolean(snapshotId);
const { isAuthorized } = use(PermissionsContext);
validateSnapshotConsistency(improvement, snapshotId);
@@ -163,17 +160,13 @@ export default function ContinualImprovementDetailsPage(props: Props) {
{ label: improvement.referenceId! },
]}
/>
{!isSnapshotMode &&
isAuthorized(
"ContinualImprovement",
"deleteContinualImprovement",
) && (
<ActionDropdown>
<DropdownItem onClick={deleteImprovement} variant="danger">
{__("Delete")}
</DropdownItem>
</ActionDropdown>
)}
{!isSnapshotMode && improvement.canDelete && (
<ActionDropdown>
<DropdownItem onClick={deleteImprovement} variant="danger">
{__("Delete")}
</DropdownItem>
</ActionDropdown>
)}
</div>
<Card>
@@ -315,10 +308,7 @@ export default function ContinualImprovementDetailsPage(props: Props) {
{!isSnapshotMode && (
<div className="flex justify-end pt-4">
{isAuthorized(
"ContinualImprovement",
"updateContinualImprovement",
) && (
{improvement.canUpdate && (
<Button
type="submit"
variant="primary"

View File

@@ -46,8 +46,6 @@ import type {
ContinualImprovementsPageFragment$key,
ContinualImprovementsPageFragment$data,
} from "/__generated__/core/ContinualImprovementsPageFragment.graphql";
import { use } from "react";
import { PermissionsContext } from "/providers/PermissionsContext";
import type { ContinualImprovementGraphListQuery } from "/__generated__/core/ContinualImprovementGraphListQuery.graphql";
interface ContinualImprovementsPageProps {
@@ -91,6 +89,8 @@ const continualImprovementsPageFragment = graphql`
}
createdAt
updatedAt
canUpdate: permission(action: "core:continual-improvement:update")
canDelete: permission(action: "core:continual-improvement:delete")
}
}
pageInfo {
@@ -108,7 +108,6 @@ export default function ContinualImprovementsPage({
const organizationId = useOrganizationId();
const { snapshotId } = useParams<{ snapshotId?: string }>();
const isSnapshotMode = Boolean(snapshotId);
const { isAuthorized } = use(PermissionsContext);
usePageTitle(__("Continual Improvements"));
@@ -129,8 +128,7 @@ export default function ContinualImprovementsPage({
const hasAnyAction =
!isSnapshotMode &&
(isAuthorized("ContinualImprovement", "updateContinualImprovement") ||
isAuthorized("ContinualImprovement", "deleteContinualImprovement"));
improvements.some(({ canUpdate, canDelete }) => canUpdate || canDelete);
return (
<div className="space-y-6">
@@ -141,17 +139,16 @@ export default function ContinualImprovementsPage({
title={__("Continual Improvements")}
description={__("Manage your continual improvements.")}
>
{!isSnapshotMode &&
isAuthorized("Organization", "createContinualImprovement") && (
<CreateContinualImprovementDialog
organizationId={organizationId}
connectionId={connectionId}
>
<Button icon={IconPlusLarge}>
{__("Add continual improvement")}
</Button>
</CreateContinualImprovementDialog>
)}
{!isSnapshotMode && organization.node.canCreateContinualImprovement && (
<CreateContinualImprovementDialog
organizationId={organizationId}
connectionId={connectionId}
>
<Button icon={IconPlusLarge}>
{__("Add continual improvement")}
</Button>
</CreateContinualImprovementDialog>
)}
</PageHeader>
{improvements.length > 0 ? (
@@ -227,7 +224,6 @@ function ImprovementRow({
const [deleteImprovement] = useMutation(deleteContinualImprovementMutation);
const confirm = useConfirm();
const isSnapshotMode = Boolean(snapshotId);
const { isAuthorized } = use(PermissionsContext);
const handleDelete = () => {
confirm(
@@ -296,10 +292,7 @@ function ImprovementRow({
{hasAnyAction && (
<Td noLink width={50} className="text-end">
<ActionDropdown>
{isAuthorized(
"ContinualImprovement",
"deleteContinualImprovement",
) && (
{improvement.canDelete && (
<DropdownItem
icon={IconTrashCan}
variant="danger"