diff --git a/ui/app/(prowler)/providers/page.tsx b/ui/app/(prowler)/providers/page.tsx index 435b8d73b3..f04b38e4c5 100644 --- a/ui/app/(prowler)/providers/page.tsx +++ b/ui/app/(prowler)/providers/page.tsx @@ -1,4 +1,5 @@ import { Spacer } from "@nextui-org/react"; +import { redirect } from "next/navigation"; import { Suspense } from "react"; import { getProviders } from "@/actions/providers"; @@ -23,19 +24,27 @@ export default async function Providers({ }) { const searchParamsKey = JSON.stringify(searchParams || {}); + const providersData = await getProviders({}); + const hasProviders = providersData?.data && providersData.data.length > 0; + + // If modal=mutelist is present but no providers, redirect + if (searchParams.modal === "mutelist" && !hasProviders) { + redirect("/providers"); + } + return ( +
+ + + +
-
- - - -
@@ -76,8 +85,6 @@ const ProvidersContent = async ({ pageSize, }); - const hasProviders = providersData?.data && providersData.data.length > 0; - const providerGroupDict = providersData?.included ?.filter((item: any) => item.type === "provider-groups") @@ -98,11 +105,6 @@ const ProvidersContent = async ({ return ( <> -
- - - -
diff --git a/ui/components/providers/forms/muted-findings-config-form.tsx b/ui/components/providers/forms/muted-findings-config-form.tsx index 1a5241b330..0be12e3120 100644 --- a/ui/components/providers/forms/muted-findings-config-form.tsx +++ b/ui/components/providers/forms/muted-findings-config-form.tsx @@ -1,7 +1,7 @@ "use client"; import { Textarea } from "@nextui-org/react"; -import { Dispatch, SetStateAction, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useFormState } from "react-dom"; import { @@ -23,11 +23,11 @@ import { } from "@/types/processors"; interface MutedFindingsConfigFormProps { - setIsOpen: Dispatch>; + onCancel: () => void; } export const MutedFindingsConfigForm = ({ - setIsOpen, + onCancel, }: MutedFindingsConfigFormProps) => { const [config, setConfig] = useState(null); const [configText, setConfigText] = useState(""); @@ -64,7 +64,7 @@ export const MutedFindingsConfigForm = ({ title: "Configuration saved successfully", description: state.success, }); - setIsOpen(false); + onCancel(); } else if (state?.errors?.general) { toast({ variant: "destructive", @@ -75,7 +75,7 @@ export const MutedFindingsConfigForm = ({ // Reset typing state when there are new server errors setHasUserStartedTyping(false); } - }, [state, toast, setIsOpen]); + }, [state, toast, onCancel]); const handleConfigChange = (value: string) => { setConfigText(value); @@ -100,7 +100,7 @@ export const MutedFindingsConfigForm = ({ title: "Configuration deleted successfully", description: result.success, }); - setIsOpen(false); + onCancel(); } else if (result?.errors?.general) { toast({ variant: "destructive", @@ -232,7 +232,8 @@ export const MutedFindingsConfigForm = ({
{}} + onCancel={onCancel} submitText={config ? "Update" : "Save"} isDisabled={!yamlValidation.isValid || !configText.trim()} /> diff --git a/ui/components/providers/muted-findings-config-button.tsx b/ui/components/providers/muted-findings-config-button.tsx index e2d895fb76..07ecf708e1 100644 --- a/ui/components/providers/muted-findings-config-button.tsx +++ b/ui/components/providers/muted-findings-config-button.tsx @@ -1,7 +1,7 @@ "use client"; import { SettingsIcon } from "lucide-react"; -import { useState } from "react"; +import { useSearchParams } from "next/navigation"; import { CustomAlertModal, CustomButton } from "@/components/ui/custom"; @@ -14,23 +14,33 @@ interface MutedFindingsConfigButtonProps { export const MutedFindingsConfigButton = ({ isDisabled = false, }: MutedFindingsConfigButtonProps) => { - const [isOpen, setIsOpen] = useState(false); + const searchParams = useSearchParams(); + + const isOpen = searchParams.get("modal") === "mutelist"; const handleOpenModal = () => { if (!isDisabled) { - setIsOpen(true); + const params = new URLSearchParams(window.location.search); + params.set("modal", "mutelist"); + window.history.pushState({}, "", `?${params.toString()}`); } }; + const handleModalClose = () => { + const params = new URLSearchParams(window.location.search); + params.delete("modal"); + window.history.pushState({}, "", `?${params.toString()}`); + }; + return ( <> - + { { href: "/integrations", label: "Integrations", icon: Puzzle }, { href: "/roles", label: "Roles", icon: UserCog }, { href: "/lighthouse/config", label: "Lighthouse AI", icon: Cog }, + { + href: "/providers?modal=mutelist", + label: "Mutelist", + icon: MutedIcon, + }, ], defaultOpen: true, },