Merge pull request #68 from prowler-cloud/PRWLR-4823-remove-menu-items

Remove menu items
This commit is contained in:
Pablo Lara
2024-10-08 12:07:55 +02:00
committed by GitHub
13 changed files with 179 additions and 84 deletions
+3 -3
View File
@@ -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(
+61
View File
@@ -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}
// />
// );
// };
+1 -1
View File
@@ -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} />
+10 -1
View File
@@ -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",
+1 -1
View File
@@ -4,7 +4,7 @@ import { IconSvgProps } from "../../../types/index";
export const ProwlerExtended: React.FC<IconSvgProps> = ({
size,
width = 164,
width = 216,
height,
...props
}) => {
+4 -1
View File
@@ -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"
+38 -29
View File
@@ -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" />
</>
+5 -5
View File
@@ -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}