diff --git a/app/(prowler)/providers/page.tsx b/app/(prowler)/providers/page.tsx index 7dcc5524aa..a10cd9a618 100644 --- a/app/(prowler)/providers/page.tsx +++ b/app/(prowler)/providers/page.tsx @@ -2,7 +2,7 @@ import { Spacer } from "@nextui-org/react"; import { Suspense } from "react"; import { getProviders } from "@/actions"; -import { FilterControls } from "@/components/filters"; +import { FilterControls, filtersProviders } from "@/components/filters"; import { AddProvider } from "@/components/providers"; import { ColumnsProvider, @@ -24,7 +24,7 @@ export default async function Providers({
- + @@ -33,7 +33,6 @@ export default async function Providers({ }> - {/* */} ); } diff --git a/components/filters/CustomCheckboxMutedFindings.tsx b/components/filters/custo-checkbox-muted-findings.tsx similarity index 100% rename from components/filters/CustomCheckboxMutedFindings.tsx rename to components/filters/custo-checkbox-muted-findings.tsx diff --git a/components/filters/CustomAccountSelection.tsx b/components/filters/custom-account-selection.tsx similarity index 100% rename from components/filters/CustomAccountSelection.tsx rename to components/filters/custom-account-selection.tsx diff --git a/components/filters/CustomDatePicker.tsx b/components/filters/custom-date-picker.tsx similarity index 96% rename from components/filters/CustomDatePicker.tsx rename to components/filters/custom-date-picker.tsx index 1fb89aa3e2..615acc5dd4 100644 --- a/components/filters/CustomDatePicker.tsx +++ b/components/filters/custom-date-picker.tsx @@ -59,7 +59,6 @@ export const CustomDatePicker = () => { return (
} CalendarTopContent={ { }} value={value} onChange={handleDateChange} - label="Scan date" size="sm" variant="flat" /> diff --git a/components/filters/CustomProviderInputs.tsx b/components/filters/custom-provider-inputs.tsx similarity index 100% rename from components/filters/CustomProviderInputs.tsx rename to components/filters/custom-provider-inputs.tsx diff --git a/components/filters/CustomRegionSelection.tsx b/components/filters/custom-region-selection.tsx similarity index 100% rename from components/filters/CustomRegionSelection.tsx rename to components/filters/custom-region-selection.tsx diff --git a/components/filters/CustomSearchInput.tsx b/components/filters/custom-search-input.tsx similarity index 96% rename from components/filters/CustomSearchInput.tsx rename to components/filters/custom-search-input.tsx index 09fb786e39..f958c9d6bd 100644 --- a/components/filters/CustomSearchInput.tsx +++ b/components/filters/custom-search-input.tsx @@ -37,7 +37,7 @@ export const CustomSearchInput: React.FC = () => { return ( { ) } - radius="full" - size="lg" + radius="sm" + size="sm" /> ); }; diff --git a/components/filters/CustomSelectProvider.tsx b/components/filters/custom-select-provider.tsx similarity index 86% rename from components/filters/CustomSelectProvider.tsx rename to components/filters/custom-select-provider.tsx index dd4254fdd3..ef65220660 100644 --- a/components/filters/CustomSelectProvider.tsx +++ b/components/filters/custom-select-provider.tsx @@ -9,7 +9,7 @@ import { CustomProviderInputAzure, CustomProviderInputGCP, CustomProviderInputKubernetes, -} from "./CustomProviderInputs"; +} from "./custom-provider-inputs"; const dataInputsProvider = [ { @@ -43,9 +43,9 @@ export const CustomSelectProvider = () => { (value: string) => { const params = new URLSearchParams(searchParams.toString()); if (value) { - params.set("filter[provider]", value); + params.set("filter[provider__in]", value); } else { - params.delete("filter[provider]"); + params.delete("filter[provider__in]"); } router.push(`?${params.toString()}`, { scroll: false }); }, @@ -53,21 +53,18 @@ export const CustomSelectProvider = () => { ); useEffect(() => { - const providerFromUrl = searchParams.get("filter[provider]") || ""; + const providerFromUrl = searchParams.get("filter[provider__in]") || ""; setSelectedProvider(providerFromUrl); }, [searchParams]); return ( - } - placeholder="Search" - size="sm" - // value={filterValue} - // onValueChange={onSearchChange} +
+ } + onPress={() => setShowFilters(!showFilters)} + > + {showFilters ? "Hide Filters" : "Show Filters"} + + +
+
+ {filters.map((filter) => ( + -
-
- - - - - -
- - Buenos Aires - Sydney - San Francisco - London - Tokyo - -
-
-
+ ))} +
+ + Selected
- -
- } - > - Show Filters - - {filters.flatMap(({ key, values }) => - values.map((value) => ( - - )), - )} -
- +
); -} +}; diff --git a/components/ui/custom/custom-dropdown-filter.tsx b/components/ui/custom/custom-dropdown-filter.tsx index 972ed5b4b6..f8d9d82b96 100644 --- a/components/ui/custom/custom-dropdown-filter.tsx +++ b/components/ui/custom/custom-dropdown-filter.tsx @@ -1,40 +1,56 @@ "use client"; import { + Badge, Button, Checkbox, CheckboxGroup, + Divider, Popover, PopoverContent, PopoverTrigger, } from "@nextui-org/react"; -import React, { useCallback, useState } from "react"; +import { useSearchParams } from "next/navigation"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import { PlusCircleIcon } from "@/components/icons"; - -interface FilterOption { - key: string; - labelCheckboxGroup: string; - values: string[]; -} - -interface CustomDropdownFilterProps { - filter?: FilterOption; - onFilterChange?: (key: string, values: string[]) => void; -} +import { CustomDropdownFilterProps } from "@/types"; export const CustomDropdownFilter: React.FC = ({ filter, onFilterChange, }) => { - // Early return if filter is undefined - if (!filter) { - return null; - } - + const searchParams = useSearchParams(); const [groupSelected, setGroupSelected] = useState(new Set()); - const allFilterKeys = filter.values || []; + const allFilterKeys = filter?.values || []; + + const getActiveFilter = useMemo(() => { + const currentFilters: Record = {}; + Array.from(searchParams.entries()).forEach(([key, value]) => { + if (key.startsWith("filter[") && key.endsWith("]")) { + const filterKey = key.slice(7, -1); + if (filter && filter.key === filterKey) { + // eslint-disable-next-line security/detect-object-injection + currentFilters[filterKey] = value; + } + } + }); + return currentFilters; + }, [searchParams, filter]); + + useEffect(() => { + if (filter && getActiveFilter[filter.key]) { + const activeValues = getActiveFilter[filter.key].split(","); + const newSelection = new Set(activeValues); + if (newSelection.size === allFilterKeys.length) { + newSelection.add("all"); + } + setGroupSelected(newSelection); + } else { + setGroupSelected(new Set()); + } + }, [getActiveFilter, filter, allFilterKeys]); const onSelectionChange = useCallback( (keys: string[]) => { @@ -72,7 +88,6 @@ export const CustomDropdownFilter: React.FC = ({ setGroupSelected(new Set(["all", ...allFilterKeys])); } }, [groupSelected, allFilterKeys]); - return (
@@ -84,13 +99,46 @@ export const CustomDropdownFilter: React.FC = ({ } size="sm" > - {filter.key} + {filter?.labelCheckboxGroup} + {groupSelected.size > 0 && ( + <> + + + {groupSelected.size} + +
+ {groupSelected.size > 2 ? ( + + {groupSelected.size} selected + + ) : ( + Array.from(groupSelected) + .filter((value) => value !== "all") + .map((value) => ( + + {value} + + )) + )} +
+ + )}
@@ -106,12 +154,14 @@ export const CustomDropdownFilter: React.FC = ({
-

- Selected:{" "} - {Array.from(groupSelected) - .filter((item) => item !== "all") - .join(", ")} -

+ {groupSelected?.size > 0 && ( +

+ Selected:{" "} + {Array.from(groupSelected) + .filter((item) => item !== "all") + .join(", ")} +

+ )}
); }; diff --git a/components/ui/dialog/Dialog.tsx b/components/ui/dialog/dialogg.tsx similarity index 76% rename from components/ui/dialog/Dialog.tsx rename to components/ui/dialog/dialogg.tsx index a25a3caebc..93542df32f 100644 --- a/components/ui/dialog/Dialog.tsx +++ b/components/ui/dialog/dialogg.tsx @@ -1,7 +1,7 @@ "use client"; import * as DialogPrimitive from "@radix-ui/react-dialog"; -import { X } from "lucide-react"; +import { Cross2Icon } from "@radix-ui/react-icons"; import * as React from "react"; import { cn } from "@/lib/utils"; @@ -38,14 +38,14 @@ const DialogContent = React.forwardRef< {children} - - + + Close @@ -102,7 +102,7 @@ const DialogDescription = React.forwardRef< >(({ className, ...props }, ref) => ( )); diff --git a/components/ui/index.ts b/components/ui/index.ts index 4f54c7d5b1..dc72c678bd 100644 --- a/components/ui/index.ts +++ b/components/ui/index.ts @@ -2,7 +2,7 @@ export * from "./action-card/ActionCard"; export * from "./alert/Alert"; export * from "./alert-dialog/AlertDialog"; export * from "./chart/Chart"; -export * from "./dialog/Dialog"; +export * from "./dialog/dialogg"; export * from "./dropdown/Dropdown"; export * from "./header/Header"; export * from "./label/Label"; diff --git a/components/ui/table/index.ts b/components/ui/table/index.ts index 36437ee01e..27387081e2 100644 --- a/components/ui/table/index.ts +++ b/components/ui/table/index.ts @@ -1,4 +1,3 @@ -// export * from "./data-table-toolbar"; export * from "./severity-badge"; export * from "./status-badge"; export * from "./table"; diff --git a/package-lock.json b/package-lock.json index 11d2ea0433..a9c0840142 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "bcryptjs": "^2.4.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "cmdk": "^1.0.0", "date-fns": "^3.6.0", "framer-motion": "~11.1.1", "intl-messageformat": "^10.5.0", @@ -6308,6 +6309,384 @@ "node": ">=6" } }, + "node_modules/cmdk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz", + "integrity": "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/code-block-writer": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", diff --git a/package.json b/package.json index 9a84242353..5e68426395 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "bcryptjs": "^2.4.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "cmdk": "^1.0.0", "date-fns": "^3.6.0", "framer-motion": "~11.1.1", "intl-messageformat": "^10.5.0", diff --git a/types/filters.ts b/types/filters.ts new file mode 100644 index 0000000000..944706f7aa --- /dev/null +++ b/types/filters.ts @@ -0,0 +1,20 @@ +export interface FilterOption { + key: string; + labelCheckboxGroup: string; + values: string[]; +} + +export interface CustomDropdownFilterProps { + filter: FilterOption; + onFilterChange: (key: string, values: string[]) => void; +} + +export interface FilterControlsProps { + search?: boolean; + providers?: boolean; + date?: boolean; + regions?: boolean; + accounts?: boolean; + mutedFindings?: boolean; + customFilters?: FilterOption[]; +} diff --git a/types/index.ts b/types/index.ts index 955dd0d6f8..c247bc2080 100644 --- a/types/index.ts +++ b/types/index.ts @@ -1,3 +1,4 @@ export * from "./authFormSchema"; export * from "./components"; +export * from "./filters"; export * from "./formSchemas";