diff --git a/frontend/src/pages/TechniqueDetailPage.tsx b/frontend/src/pages/TechniqueDetailPage.tsx index c575fb3..a3513bf 100644 --- a/frontend/src/pages/TechniqueDetailPage.tsx +++ b/frontend/src/pages/TechniqueDetailPage.tsx @@ -158,6 +158,10 @@ export default function TechniqueDetailPage() { const canReview = user?.role === "admin" || user?.role === "red_lead" || user?.role === "blue_lead"; + // Same roles that can create tests (mirrors backend POST /tests/from-template) + const canRunTemplate = + user?.role === "admin" || user?.role === "red_lead" || user?.role === "blue_lead"; + const { data: technique, isLoading, @@ -584,7 +588,7 @@ export default function TechniqueDetailPage() { View test - ) : ( + ) : canRunTemplate ? ( - )} + ) : null} ); diff --git a/frontend/src/pages/TestCatalogPage.tsx b/frontend/src/pages/TestCatalogPage.tsx index 14a3077..b82db71 100644 --- a/frontend/src/pages/TestCatalogPage.tsx +++ b/frontend/src/pages/TestCatalogPage.tsx @@ -14,6 +14,7 @@ import { import { getTemplates } from "../api/test-templates"; import TestFromTemplateForm from "../components/TestFromTemplateForm"; import type { TestTemplateSummary } from "../types/models"; +import { useAuth } from "../context/AuthContext"; // ── Constants ────────────────────────────────────────────────────── @@ -75,6 +76,13 @@ export default function TestCatalogPage() { const navigate = useNavigate(); const { templateId } = useParams<{ templateId: string }>(); const [searchParams, setSearchParams] = useSearchParams(); + const { user } = useAuth(); + + // Only leads and admins can create tests from templates + const canUseTemplate = + user?.role === "admin" || + user?.role === "red_lead" || + user?.role === "blue_lead"; const [search, setSearch] = useState(searchParams.get("search") || ""); const [source, setSource] = useState(searchParams.get("source") || ""); @@ -236,6 +244,7 @@ export default function TestCatalogPage() { navigate(`/test-catalog/${tpl.id}/use`)} /> ))} @@ -286,9 +295,11 @@ export default function TestCatalogPage() { function TemplateCard({ template, + canUse, onUse, }: { template: TestTemplateSummary; + canUse: boolean; onUse: () => void; }) { return ( @@ -341,14 +352,16 @@ function TemplateCard({ {/* Spacer */}
- {/* Action */} - + {/* Action — only visible to users who can create tests */} + {canUse && ( + + )}
); }