mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-10-21 19:04:19 +00:00
Merge remote-tracking branch 'origin/master' into tmp-1454-merge
This commit is contained in:
160 files changed
+13358
-12137
No files matched your search
@@ -11,23 +11,15 @@ import { Button } from "@/components/shadcn";
|
||||
import { CustomInput } from "@/components/ui/custom";
|
||||
import { Form } from "@/components/ui/form";
|
||||
import { toast } from "@/components/ui/toast";
|
||||
import { onDemandScanFormSchema } from "@/types";
|
||||
import { onDemandScanFormSchema, ScanProviderInfo } from "@/types";
|
||||
|
||||
import { SCAN_LAUNCHED_EVENT } from "../table/scans/scans-table-with-polling";
|
||||
import { SelectScanProvider } from "./select-scan-provider";
|
||||
|
||||
type ProviderInfo = {
|
||||
providerId: string;
|
||||
alias: string;
|
||||
providerType: string;
|
||||
uid: string;
|
||||
connected: boolean;
|
||||
};
|
||||
|
||||
export const LaunchScanWorkflow = ({
|
||||
providers,
|
||||
}: {
|
||||
providers: ProviderInfo[];
|
||||
providers: ScanProviderInfo[];
|
||||
}) => {
|
||||
const formSchema = z.object({
|
||||
...onDemandScanFormSchema().shape,
|
||||
|
||||
@@ -11,18 +11,13 @@ import {
|
||||
} from "@/components/shadcn";
|
||||
import { EntityInfo } from "@/components/ui/entities";
|
||||
import { FormControl, FormField, FormMessage } from "@/components/ui/form";
|
||||
import { ScanProviderInfo } from "@/types";
|
||||
|
||||
interface SelectScanProviderProps<
|
||||
TFieldValues extends FieldValues = FieldValues,
|
||||
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
||||
> {
|
||||
providers: {
|
||||
providerId: string;
|
||||
alias: string;
|
||||
providerType: string;
|
||||
uid: string;
|
||||
connected: boolean;
|
||||
}[];
|
||||
providers: ScanProviderInfo[];
|
||||
control: Control<TFieldValues>;
|
||||
name: TName;
|
||||
}
|
||||
|
||||
@@ -1,45 +1,38 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
|
||||
import { ProviderWizardModal } from "@/components/providers/wizard";
|
||||
import { Button, Card, CardContent } from "@/components/shadcn";
|
||||
|
||||
import { InfoIcon } from "../icons/Icons";
|
||||
|
||||
export const NoProvidersAdded = () => {
|
||||
const [open, setOpen] = useState(false);
|
||||
interface NoProvidersAddedProps {
|
||||
onOpenWizard: () => void;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="flex min-h-screen items-center justify-center">
|
||||
<Card variant="base" className="mx-auto w-full max-w-3xl">
|
||||
<CardContent className="flex flex-col items-center gap-4 p-6 text-center sm:p-8">
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<InfoIcon className="h-10 w-10 text-gray-800 dark:text-white" />
|
||||
<h2 className="text-2xl font-bold text-gray-800 dark:text-white">
|
||||
No Providers Configured
|
||||
</h2>
|
||||
</div>
|
||||
<div className="flex flex-col items-center gap-3">
|
||||
<p className="text-md leading-relaxed text-gray-600 dark:text-gray-300">
|
||||
No providers have been configured. Start by setting up a
|
||||
provider.
|
||||
</p>
|
||||
</div>
|
||||
export const NoProvidersAdded = ({ onOpenWizard }: NoProvidersAddedProps) => (
|
||||
<div className="flex min-h-screen items-center justify-center">
|
||||
<Card variant="base" className="mx-auto w-full max-w-3xl">
|
||||
<CardContent className="flex flex-col items-center gap-4 p-6 text-center sm:p-8">
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<InfoIcon className="h-10 w-10 text-gray-800 dark:text-white" />
|
||||
<h2 className="text-2xl font-bold text-gray-800 dark:text-white">
|
||||
No Providers Configured
|
||||
</h2>
|
||||
</div>
|
||||
<div className="flex flex-col items-center gap-3">
|
||||
<p className="text-md leading-relaxed text-gray-600 dark:text-gray-300">
|
||||
No providers have been configured. Start by setting up a provider.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
aria-label="Open Add Provider modal"
|
||||
className="w-full max-w-xs justify-center"
|
||||
size="lg"
|
||||
onClick={() => setOpen(true)}
|
||||
>
|
||||
Get Started
|
||||
</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
<ProviderWizardModal open={open} onOpenChange={setOpen} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
<Button
|
||||
aria-label="Open Add Provider modal"
|
||||
className="w-full max-w-xs justify-center"
|
||||
size="lg"
|
||||
onClick={onOpenWizard}
|
||||
>
|
||||
Get Started
|
||||
</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
);
|
||||
@@ -0,0 +1,62 @@
|
||||
import { render, screen } from "@testing-library/react";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { ScansLaunchSection } from "./scans-launch-section";
|
||||
|
||||
vi.mock("@/components/providers/wizard", () => ({
|
||||
ProviderWizardModal: ({ open }: { open: boolean }) =>
|
||||
open ? <div role="dialog">Provider wizard</div> : null,
|
||||
}));
|
||||
|
||||
vi.mock("@/components/scans/launch-workflow", () => ({
|
||||
LaunchScanWorkflow: () => <div>Launch scan workflow</div>,
|
||||
}));
|
||||
|
||||
vi.mock("@/components/scans/no-providers-connected", () => ({
|
||||
NoProvidersConnected: () => <div>No providers connected</div>,
|
||||
}));
|
||||
|
||||
vi.mock("@/components/ui/custom/custom-banner", () => ({
|
||||
CustomBanner: ({ title }: { title: string }) => <div>{title}</div>,
|
||||
}));
|
||||
|
||||
const connectedProvider = {
|
||||
providerId: "provider-1",
|
||||
alias: "Production",
|
||||
providerType: "aws",
|
||||
uid: "123456789012",
|
||||
connected: true,
|
||||
};
|
||||
|
||||
describe("ScansLaunchSection", () => {
|
||||
it("should keep the provider wizard open when providers data refreshes after adding the first provider", async () => {
|
||||
// Given
|
||||
const user = userEvent.setup();
|
||||
const { rerender } = render(
|
||||
<ScansLaunchSection
|
||||
providers={[]}
|
||||
hasManageScansPermission
|
||||
thereIsNoProviders
|
||||
thereIsNoProvidersConnected
|
||||
/>,
|
||||
);
|
||||
|
||||
// When
|
||||
await user.click(
|
||||
screen.getByRole("button", { name: /open add provider modal/i }),
|
||||
);
|
||||
rerender(
|
||||
<ScansLaunchSection
|
||||
providers={[connectedProvider]}
|
||||
hasManageScansPermission
|
||||
thereIsNoProviders={false}
|
||||
thereIsNoProvidersConnected={false}
|
||||
/>,
|
||||
);
|
||||
|
||||
// Then
|
||||
expect(screen.getByRole("dialog")).toHaveTextContent("Provider wizard");
|
||||
expect(screen.getByText("Launch scan workflow")).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,47 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
|
||||
import { ProviderWizardModal } from "@/components/providers/wizard";
|
||||
import { LaunchScanWorkflow } from "@/components/scans/launch-workflow";
|
||||
import { NoProvidersAdded } from "@/components/scans/no-providers-added";
|
||||
import { NoProvidersConnected } from "@/components/scans/no-providers-connected";
|
||||
import { CustomBanner } from "@/components/ui/custom/custom-banner";
|
||||
import { ScanProviderInfo } from "@/types";
|
||||
|
||||
interface ScansLaunchSectionProps {
|
||||
providers: ScanProviderInfo[];
|
||||
hasManageScansPermission: boolean;
|
||||
thereIsNoProviders: boolean;
|
||||
thereIsNoProvidersConnected: boolean;
|
||||
}
|
||||
|
||||
export function ScansLaunchSection({
|
||||
providers,
|
||||
hasManageScansPermission,
|
||||
thereIsNoProviders,
|
||||
thereIsNoProvidersConnected,
|
||||
}: ScansLaunchSectionProps) {
|
||||
const [isProviderWizardOpen, setIsProviderWizardOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
{thereIsNoProviders ? (
|
||||
<NoProvidersAdded onOpenWizard={() => setIsProviderWizardOpen(true)} />
|
||||
) : !hasManageScansPermission ? (
|
||||
<CustomBanner
|
||||
title={"Access Denied"}
|
||||
message={"You don't have permission to launch the scan."}
|
||||
/>
|
||||
) : thereIsNoProvidersConnected ? (
|
||||
<NoProvidersConnected />
|
||||
) : (
|
||||
<LaunchScanWorkflow providers={providers} />
|
||||
)}
|
||||
<ProviderWizardModal
|
||||
open={isProviderWizardOpen}
|
||||
onOpenChange={setIsProviderWizardOpen}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user