From 634739c04587ad8de486bc2109f826132f8f721f Mon Sep 17 00:00:00 2001 From: David Corbitt Date: Mon, 14 Aug 2023 23:02:08 -0700 Subject: [PATCH] Add InputDropdown --- app/src/components/InputDropdown.tsx | 89 +++++++++++++++++++ .../requestLogs/LogFilters/LogFilter.tsx | 38 ++------ .../LogFilters/SelectComparatorDropdown.tsx | 20 +++++ .../LogFilters/SelectFieldDropdown.tsx | 22 +++++ 4 files changed, 137 insertions(+), 32 deletions(-) create mode 100644 app/src/components/InputDropdown.tsx create mode 100644 app/src/components/requestLogs/LogFilters/SelectComparatorDropdown.tsx create mode 100644 app/src/components/requestLogs/LogFilters/SelectFieldDropdown.tsx diff --git a/app/src/components/InputDropdown.tsx b/app/src/components/InputDropdown.tsx new file mode 100644 index 0000000..8798156 --- /dev/null +++ b/app/src/components/InputDropdown.tsx @@ -0,0 +1,89 @@ +import { + Input, + InputGroup, + InputRightElement, + Icon, + Popover, + PopoverTrigger, + PopoverContent, + VStack, + HStack, + Button, + Text, + useDisclosure, + type PopoverContentProps, + type InputGroupProps, +} from "@chakra-ui/react"; + +import { FiChevronDown } from "react-icons/fi"; +import { BiCheck } from "react-icons/bi"; + +type InputDropdownProps = { + options: ReadonlyArray; + selectedOption: T; + onSelect: (option: T) => void; + inputGroupProps?: InputGroupProps; + popoverContentProps?: PopoverContentProps; +}; + +const InputDropdown = ({ + options, + selectedOption, + onSelect, + inputGroupProps, + popoverContentProps, +}: InputDropdownProps) => { + const popover = useDisclosure(); + + return ( + + + + { + e.target.blur(); + }} + /> + + + + + + + + {options?.map((option, index) => ( + { + onSelect(option); + popover.onClose(); + }} + w="full" + variant="ghost" + justifyContent="space-between" + fontWeight="semibold" + borderRadius={0} + colorScheme="blue" + color="black" + fontSize="sm" + borderBottomWidth={1} + > + {option as string} + {option === selectedOption && } + + ))} + + + + ); +}; + +export default InputDropdown; diff --git a/app/src/components/requestLogs/LogFilters/LogFilter.tsx b/app/src/components/requestLogs/LogFilters/LogFilter.tsx index 5deafb9..65f9fd0 100644 --- a/app/src/components/requestLogs/LogFilters/LogFilter.tsx +++ b/app/src/components/requestLogs/LogFilters/LogFilter.tsx @@ -1,20 +1,17 @@ import { useCallback, useState } from "react"; -import { HStack, IconButton, Input, Select } from "@chakra-ui/react"; +import { HStack, IconButton, Input } from "@chakra-ui/react"; import { BsTrash } from "react-icons/bs"; -import { type LogFilter, comparators } from "~/state/logFiltersSlice"; +import { type LogFilter } from "~/state/logFiltersSlice"; import { useAppStore } from "~/state/store"; -import { useFilterableFields } from "~/utils/hooks"; import { debounce } from "lodash-es"; +import SelectFieldDropdown from "./SelectFieldDropdown"; +import SelectComparatorDropdown from "./SelectComparatorDropdown"; const LogFilter = ({ filter, index }: { filter: LogFilter; index: number }) => { - const filterableFields = useFilterableFields(); - const updateFilter = useAppStore((s) => s.logFilters.updateFilter); const deleteFilter = useAppStore((s) => s.logFilters.deleteFilter); - const { field, comparator, value } = filter; - const [editedValue, setEditedValue] = useState(""); const debouncedUpdateFilter = useCallback( @@ -31,31 +28,8 @@ const LogFilter = ({ filter, index }: { filter: LogFilter; index: number }) => { return ( - - + + { diff --git a/app/src/components/requestLogs/LogFilters/SelectComparatorDropdown.tsx b/app/src/components/requestLogs/LogFilters/SelectComparatorDropdown.tsx new file mode 100644 index 0000000..ea7bb55 --- /dev/null +++ b/app/src/components/requestLogs/LogFilters/SelectComparatorDropdown.tsx @@ -0,0 +1,20 @@ +import { comparators, type LogFilter } from "~/state/logFiltersSlice"; +import { useAppStore } from "~/state/store"; +import InputDropdown from "~/components/InputDropdown"; + +const SelectComparatorDropdown = ({ filter, index }: { filter: LogFilter; index: number }) => { + const updateFilter = useAppStore((s) => s.logFilters.updateFilter); + + const { comparator } = filter; + + return ( + updateFilter(index, { ...filter, comparator: option })} + inputGroupProps={{ w: 300 }} + /> + ); +}; + +export default SelectComparatorDropdown; diff --git a/app/src/components/requestLogs/LogFilters/SelectFieldDropdown.tsx b/app/src/components/requestLogs/LogFilters/SelectFieldDropdown.tsx new file mode 100644 index 0000000..0d286e0 --- /dev/null +++ b/app/src/components/requestLogs/LogFilters/SelectFieldDropdown.tsx @@ -0,0 +1,22 @@ +import { type LogFilter } from "~/state/logFiltersSlice"; +import { useAppStore } from "~/state/store"; +import { useFilterableFields } from "~/utils/hooks"; +import InputDropdown from "~/components/InputDropdown"; + +const SelectFieldDropdown = ({ filter, index }: { filter: LogFilter; index: number }) => { + const filterableFields = useFilterableFields().data; + + const updateFilter = useAppStore((s) => s.logFilters.updateFilter); + + const { field } = filter; + + return ( + updateFilter(index, { ...filter, field: option })} + /> + ); +}; + +export default SelectFieldDropdown;