mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-23 12:31:54 +00:00
Merge pull request #68 from prowler-cloud/PRWLR-4823-remove-menu-items
Remove menu items
This commit is contained in:
@@ -2,7 +2,7 @@ import { Spacer } from "@nextui-org/react";
|
||||
import { Suspense } from "react";
|
||||
|
||||
import { getProviders } from "@/actions/providers";
|
||||
import { FilterControls, filtersProviders } from "@/components/filters";
|
||||
import { FilterControls, filterProviders } from "@/components/filters";
|
||||
import { AddProvider } from "@/components/providers";
|
||||
import {
|
||||
ColumnsProvider,
|
||||
@@ -24,7 +24,7 @@ export default async function Providers({
|
||||
<Header title="Providers" icon="fluent:cloud-sync-24-regular" />
|
||||
|
||||
<Spacer y={4} />
|
||||
<FilterControls search providers customFilters={filtersProviders} />
|
||||
<FilterControls search providers customFilters={filterProviders} />
|
||||
<Spacer y={4} />
|
||||
|
||||
<AddProvider />
|
||||
@@ -43,7 +43,7 @@ const SSRDataTable = async ({
|
||||
searchParams: SearchParamsProps;
|
||||
}) => {
|
||||
const page = parseInt(searchParams.page?.toString() || "1", 10);
|
||||
const sort = searchParams.sort?.toString() || "-inserted_at";
|
||||
const sort = searchParams.sort?.toString();
|
||||
|
||||
// Extract all filter parameters
|
||||
const filters = Object.fromEntries(
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
import { Spacer } from "@nextui-org/react";
|
||||
import { Suspense } from "react";
|
||||
|
||||
// import { getProviders } from "@/actions/providers";
|
||||
import { FilterControls, filterScans } from "@/components/filters";
|
||||
import {
|
||||
// ColumnsProvider,
|
||||
// DataTableProvider,
|
||||
SkeletonTableProvider,
|
||||
} from "@/components/providers/table";
|
||||
import { Header } from "@/components/ui";
|
||||
import { SearchParamsProps } from "@/types";
|
||||
|
||||
export default async function Scan({
|
||||
searchParams,
|
||||
}: {
|
||||
searchParams: SearchParamsProps;
|
||||
}) {
|
||||
const searchParamsKey = JSON.stringify(searchParams || {});
|
||||
|
||||
return (
|
||||
<>
|
||||
<Header title="Scanners" icon="lucide:scan-search" />
|
||||
|
||||
<Spacer y={4} />
|
||||
<FilterControls search date providers customFilters={filterScans} />
|
||||
<Spacer y={4} />
|
||||
|
||||
<Suspense key={searchParamsKey} fallback={<SkeletonTableProvider />}>
|
||||
{/* <SSRDataTable searchParams={searchParams} /> */}
|
||||
</Suspense>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
// const SSRDataTable = async ({
|
||||
// searchParams,
|
||||
// }: {
|
||||
// searchParams: SearchParamsProps;
|
||||
// }) => {
|
||||
// const page = parseInt(searchParams.page?.toString() || "1", 10);
|
||||
// const sort = searchParams.sort?.toString();
|
||||
|
||||
// // Extract all filter parameters
|
||||
// const filters = Object.fromEntries(
|
||||
// Object.entries(searchParams).filter(([key]) => key.startsWith("filter[")),
|
||||
// );
|
||||
|
||||
// // Extract query from filters
|
||||
// const query = (filters["filter[search]"] as string) || "";
|
||||
|
||||
// const providersData = await getProviders({ query, page, sort, filters });
|
||||
|
||||
// return (
|
||||
// <DataTableProvider
|
||||
// columns={ColumnsProvider}
|
||||
// data={providersData?.data || []}
|
||||
// metadata={providersData?.meta}
|
||||
// />
|
||||
// );
|
||||
// };
|
||||
@@ -116,7 +116,7 @@ export const AuthForm = ({ type }: { type: string }) => {
|
||||
{/* Background Pattern */}
|
||||
<div className="absolute h-full w-full bg-[radial-gradient(#94a3b8_1px,transparent_1px)] [background-size:16px_16px] [mask-image:radial-gradient(ellipse_50%_50%_at_50%_50%,#000_10%,transparent_80%)]"></div>
|
||||
|
||||
<div className="dark:bg-prowler-black-900/90 relative z-10 flex w-full max-w-sm flex-col gap-4 rounded-large bg-white/90 px-8 py-10 shadow-small md:max-w-md">
|
||||
<div className="relative z-10 flex w-full max-w-sm flex-col gap-4 rounded-large bg-white/90 px-8 py-10 shadow-small dark:bg-prowler-black-900/90 md:max-w-md">
|
||||
{/* Prowler Logo */}
|
||||
<div className="absolute -top-[100px] left-1/2 z-10 flex h-fit w-fit -translate-x-1/2">
|
||||
<ProwlerExtended width={300} />
|
||||
|
||||
@@ -1,4 +1,13 @@
|
||||
export const filtersProviders = [
|
||||
export const filterProviders = [
|
||||
{
|
||||
key: "connected",
|
||||
labelCheckboxGroup: "Connection",
|
||||
values: ["false", "true"],
|
||||
},
|
||||
// Add more filter categories as needed
|
||||
];
|
||||
|
||||
export const filterScans = [
|
||||
{
|
||||
key: "connected",
|
||||
labelCheckboxGroup: "Connection",
|
||||
|
||||
@@ -4,7 +4,7 @@ import { IconSvgProps } from "../../../types/index";
|
||||
|
||||
export const ProwlerExtended: React.FC<IconSvgProps> = ({
|
||||
size,
|
||||
width = 164,
|
||||
width = 216,
|
||||
height,
|
||||
...props
|
||||
}) => {
|
||||
|
||||
@@ -67,7 +67,10 @@ export const AddForm = ({
|
||||
onSubmit={form.handleSubmit(onSubmitClient)}
|
||||
className="flex flex-col space-y-4"
|
||||
>
|
||||
<RadioGroupProvider control={form.control} />
|
||||
<RadioGroupProvider
|
||||
control={form.control}
|
||||
isInvalid={!!form.formState.errors.providerType}
|
||||
/>
|
||||
<CustomInput
|
||||
control={form.control}
|
||||
name="providerId"
|
||||
|
||||
@@ -22,7 +22,7 @@ export const CustomRadio: React.FC<CustomRadioProps> = (props) => {
|
||||
const {
|
||||
Component,
|
||||
children,
|
||||
description,
|
||||
// description,
|
||||
getBaseProps,
|
||||
getWrapperProps,
|
||||
getInputProps,
|
||||
@@ -37,7 +37,7 @@ export const CustomRadio: React.FC<CustomRadioProps> = (props) => {
|
||||
className={cn(
|
||||
"group inline-flex flex-row-reverse items-center justify-between tap-highlight-transparent hover:opacity-70 active:opacity-50",
|
||||
"max-w-full cursor-pointer gap-4 rounded-lg border-2 border-default p-4",
|
||||
"data-[selected=true]:border-primary",
|
||||
"data-[selected=true]:border-primar w-full",
|
||||
)}
|
||||
>
|
||||
<VisuallyHidden>
|
||||
@@ -48,11 +48,11 @@ export const CustomRadio: React.FC<CustomRadioProps> = (props) => {
|
||||
</span>
|
||||
<div {...getLabelWrapperProps()}>
|
||||
{children && <span {...getLabelProps()}>{children}</span>}
|
||||
{description && (
|
||||
{/* {description && (
|
||||
<span className="text-small text-foreground opacity-70">
|
||||
{description}
|
||||
</span>
|
||||
)}
|
||||
)} */}
|
||||
</div>
|
||||
</Component>
|
||||
);
|
||||
@@ -60,10 +60,12 @@ export const CustomRadio: React.FC<CustomRadioProps> = (props) => {
|
||||
|
||||
interface RadioGroupProviderProps {
|
||||
control: Control<z.infer<typeof addProviderFormSchema>>;
|
||||
isInvalid: boolean;
|
||||
}
|
||||
|
||||
export const RadioGroupProvider: React.FC<RadioGroupProviderProps> = ({
|
||||
control,
|
||||
isInvalid,
|
||||
}) => {
|
||||
return (
|
||||
<Controller
|
||||
@@ -71,31 +73,38 @@ export const RadioGroupProvider: React.FC<RadioGroupProviderProps> = ({
|
||||
control={control}
|
||||
render={({ field }) => (
|
||||
<>
|
||||
<RadioGroup label="Select one provider" {...field}>
|
||||
<CustomRadio description="Amazon Web Services" value="aws">
|
||||
<div className="flex items-center">
|
||||
<AWSProviderBadge size={26} />
|
||||
<span className="ml-2">AWS</span>
|
||||
</div>
|
||||
</CustomRadio>
|
||||
<CustomRadio description="Google Cloud Platform" value="gcp">
|
||||
<div className="flex items-center">
|
||||
<GCPProviderBadge size={26} />
|
||||
<span className="ml-2">GCP</span>
|
||||
</div>
|
||||
</CustomRadio>
|
||||
<CustomRadio description="Microsoft Azure" value="azure">
|
||||
<div className="flex items-center">
|
||||
<AzureProviderBadge size={26} />
|
||||
<span className="ml-2">Azure</span>
|
||||
</div>
|
||||
</CustomRadio>
|
||||
<CustomRadio description="Kubernetes" value="kubernetes">
|
||||
<div className="flex items-center">
|
||||
<KS8ProviderBadge size={26} />
|
||||
<span className="ml-2">Kubernetes</span>
|
||||
</div>
|
||||
</CustomRadio>
|
||||
<RadioGroup
|
||||
className="flex flex-wrap"
|
||||
label="Select one provider"
|
||||
isInvalid={isInvalid}
|
||||
{...field}
|
||||
>
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<CustomRadio description="Amazon Web Services" value="aws">
|
||||
<div className="flex items-center">
|
||||
<AWSProviderBadge size={26} />
|
||||
<span className="ml-2">AWS</span>
|
||||
</div>
|
||||
</CustomRadio>
|
||||
<CustomRadio description="Google Cloud Platform" value="gcp">
|
||||
<div className="flex items-center">
|
||||
<GCPProviderBadge size={26} />
|
||||
<span className="ml-2">GCP</span>
|
||||
</div>
|
||||
</CustomRadio>
|
||||
<CustomRadio description="Microsoft Azure" value="azure">
|
||||
<div className="flex items-center">
|
||||
<AzureProviderBadge size={26} />
|
||||
<span className="ml-2">Azure</span>
|
||||
</div>
|
||||
</CustomRadio>
|
||||
<CustomRadio description="Kubernetes" value="kubernetes">
|
||||
<div className="flex items-center">
|
||||
<KS8ProviderBadge size={26} />
|
||||
<span className="ml-2">Kubernetes</span>
|
||||
</div>
|
||||
</CustomRadio>
|
||||
</div>
|
||||
</RadioGroup>
|
||||
<FormMessage className="text-system-error dark:text-system-error" />
|
||||
</>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export * from "./Sidebar";
|
||||
export * from "./SidebarItems";
|
||||
export * from "./SidebarWrap";
|
||||
export * from "./TeamAvatar";
|
||||
export * from "./UserAvatar";
|
||||
export * from "./sidebar";
|
||||
export * from "./sidebar-items";
|
||||
export * from "./sidebar-wrap";
|
||||
export * from "./team-avatar";
|
||||
export * from "./user-avatar";
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Icon } from "@iconify/react";
|
||||
import { Chip } from "@nextui-org/react";
|
||||
|
||||
import { SidebarItem, SidebarItemType } from "./Sidebar";
|
||||
import { TeamAvatar } from "./TeamAvatar";
|
||||
import { SidebarItem, SidebarItemType } from "./sidebar";
|
||||
import { TeamAvatar } from "./team-avatar";
|
||||
|
||||
/**
|
||||
* Please check the https://nextui.org/docs/guide/routing to have a seamless router integration
|
||||
@@ -119,34 +119,17 @@ export const sectionItems: SidebarItem[] = [
|
||||
key: "scan",
|
||||
title: "Scan",
|
||||
items: [
|
||||
{
|
||||
key: "scan",
|
||||
href: "/scan",
|
||||
icon: "lucide:scan-search",
|
||||
title: "Scanners",
|
||||
},
|
||||
{
|
||||
key: "findings",
|
||||
href: "/findings",
|
||||
title: "Findings",
|
||||
icon: "ph:list-checks-duotone",
|
||||
items: [
|
||||
{
|
||||
key: "shareholders",
|
||||
href: "#",
|
||||
title: "Shareholders",
|
||||
},
|
||||
{
|
||||
key: "note_holders",
|
||||
href: "#",
|
||||
title: "Note Holders",
|
||||
},
|
||||
{
|
||||
key: "transactions_log",
|
||||
href: "#",
|
||||
title: "Transactions Log",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
key: "tasks",
|
||||
href: "#",
|
||||
icon: "solar:checklist-minimalistic-outline",
|
||||
title: "Tasks",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -206,6 +189,12 @@ export const sectionItemsWithTeams: SidebarItem[] = [
|
||||
title: "Users",
|
||||
icon: "ci:users",
|
||||
},
|
||||
{
|
||||
key: "tasks",
|
||||
href: "#",
|
||||
icon: "solar:checklist-minimalistic-outline",
|
||||
title: "Tasks",
|
||||
},
|
||||
// {
|
||||
// key: "memberships",
|
||||
// href: "#",
|
||||
@@ -10,6 +10,7 @@ import React, { Suspense, useCallback } from "react";
|
||||
import { useMediaQuery } from "usehooks-ts";
|
||||
|
||||
import { logOut } from "@/actions/auth";
|
||||
import { AddIcon } from "@/components/icons";
|
||||
import { useUIStore } from "@/store";
|
||||
|
||||
import {
|
||||
@@ -17,9 +18,10 @@ import {
|
||||
ProwlerShort,
|
||||
} from "../../icons/prowler/ProwlerIcons";
|
||||
import { ThemeSwitch } from "../../ThemeSwitch";
|
||||
import Sidebar from "./Sidebar";
|
||||
import { sectionItemsWithTeams } from "./SidebarItems";
|
||||
import { UserAvatar } from "./UserAvatar";
|
||||
import { CustomButton } from "../custom";
|
||||
import Sidebar from "./sidebar";
|
||||
import { sectionItemsWithTeams } from "./sidebar-items";
|
||||
import { UserAvatar } from "./user-avatar";
|
||||
|
||||
export const SidebarWrap = () => {
|
||||
const pathname = usePathname();
|
||||
@@ -50,9 +52,12 @@ export const SidebarWrap = () => {
|
||||
)}
|
||||
>
|
||||
<div
|
||||
className={clsx("flex items-center justify-center gap-3 px-3", {
|
||||
"gap-0": isCompact,
|
||||
})}
|
||||
className={clsx(
|
||||
"flex w-full flex-col items-center justify-center gap-y-4 px-3",
|
||||
{
|
||||
"gap-0": isCompact,
|
||||
},
|
||||
)}
|
||||
>
|
||||
<div
|
||||
className={clsx({
|
||||
@@ -64,24 +69,43 @@ export const SidebarWrap = () => {
|
||||
<div
|
||||
className={clsx({
|
||||
hidden: isCompact,
|
||||
"!mt-0": !isCompact,
|
||||
})}
|
||||
>
|
||||
<ProwlerExtended />
|
||||
</div>
|
||||
<Link href={"/profile"}>
|
||||
<Suspense fallback={<p>Loading...</p>}>
|
||||
<UserAvatar
|
||||
userName={session?.user.name ?? "Guest"}
|
||||
position={session?.user.companyName ?? "Company Name"}
|
||||
isCompact={isCompact}
|
||||
/>
|
||||
</Suspense>
|
||||
</Link>
|
||||
|
||||
<div
|
||||
className={clsx({
|
||||
hidden: isCompact,
|
||||
"w-full": !isCompact,
|
||||
})}
|
||||
>
|
||||
<Link href={"/scan"}>
|
||||
<CustomButton
|
||||
className="w-full"
|
||||
ariaLabel="Launch Scan"
|
||||
variant="solid"
|
||||
color="action"
|
||||
size="md"
|
||||
endContent={<AddIcon size={20} />}
|
||||
>
|
||||
Launch Scan
|
||||
</CustomButton>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
<Spacer y={8} />
|
||||
|
||||
<Link href={"/profile"}>
|
||||
<Suspense fallback={<p>Loading...</p>}>
|
||||
<UserAvatar
|
||||
userName={session?.user.name ?? "Guest"}
|
||||
position={session?.user.companyName ?? "Company Name"}
|
||||
isCompact={isCompact}
|
||||
/>
|
||||
</Suspense>
|
||||
</Link>
|
||||
|
||||
<ScrollShadow hideScrollBar className="-mr-6 h-full max-h-full py-6 pr-6">
|
||||
<ScrollShadow hideScrollBar className="-mr-6 h-full max-h-full py-4 pr-6">
|
||||
<Sidebar
|
||||
defaultSelectedKey="overview"
|
||||
isCompact={isCompact}
|
||||
Reference in New Issue
Block a user