From bb71e60fcb0555cc59d0a9b3de95775f72d59c1e Mon Sep 17 00:00:00 2001 From: Vamsi Krishna <46787868+mathalav55@users.noreply.github.com> Date: Wed, 8 Jan 2025 13:10:09 +0530 Subject: [PATCH] [WEB-2783]fix: dropdown visibility in onboarding (#6329) * fix: dropdown visibility on scroll to bottom * chore: removed unused variables --- .../components/onboarding/invite-members.tsx | 94 +++++++++---------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/web/core/components/onboarding/invite-members.tsx b/web/core/components/onboarding/invite-members.tsx index 695b6f2481..27b15610ee 100644 --- a/web/core/components/onboarding/invite-members.tsx +++ b/web/core/components/onboarding/invite-members.tsx @@ -15,8 +15,9 @@ import { useForm, } from "react-hook-form"; // icons +import { usePopper } from "react-popper"; import { Check, ChevronDown, Plus, XCircle } from "lucide-react"; -import { Listbox, Transition } from "@headlessui/react"; +import { Listbox } from "@headlessui/react"; // types import { IUser, IWorkspace } from "@plane/types"; // ui @@ -28,7 +29,6 @@ import { ROLE, ROLE_DETAILS } from "@/constants/workspace"; import { getUserRole } from "@/helpers/user.helper"; // hooks import { useEventTracker } from "@/hooks/store"; -import useDynamicDropdownPosition from "@/hooks/use-dynamic-dropdown"; // plane web constants import { EUserPermissions } from "@/plane-web/constants/user-permissions"; // services @@ -101,12 +101,8 @@ const InviteMemberInput: React.FC = (props) => { watch, } = props; - const buttonRef = useRef(null); - const dropdownRef = useRef(null); - - const [isDropdownOpen, setIsDropdownOpen] = useState(false); - - useDynamicDropdownPosition(isDropdownOpen, () => setIsDropdownOpen(false), buttonRef, dropdownRef); + const [referenceElement, setReferenceElement] = useState(null); + const [popperElement, setPopperElement] = useState(null); const email = watch(`emails.${index}.email`); @@ -134,6 +130,18 @@ const InviteMemberInput: React.FC = (props) => { } }; + const { styles, attributes } = usePopper(referenceElement, popperElement, { + placement: "bottom-end", + modifiers: [ + { + name: "preventOverflow", + options: { + padding: 12, + }, + }, + ], + }); + return (
@@ -177,15 +185,13 @@ const InviteMemberInput: React.FC = (props) => { value={value} onChange={(val) => { onChange(val); - setIsDropdownOpen(false); setValue(`emails.${index}.role_active`, true); }} className="w-full flex-shrink-0 text-left" > setIsDropdownOpen((prev) => !prev)} + ref={setReferenceElement} className="flex w-full items-center justify-between gap-1 rounded-md px-2.5 py-2 text-sm border-[0.5px] border-onboarding-border-100" > = (props) => { /> - - +
-
- {Object.entries(ROLE_DETAILS).map(([key, value]) => ( - - `cursor-pointer select-none truncate rounded px-1 py-1.5 ${ - active || selected ? "bg-onboarding-background-400/40" : "" - } ${selected ? "text-onboarding-text-100" : "text-custom-text-200"}` - } - > - {({ selected }) => ( -
-
-
{value.title}
-
{value.description}
-
- {selected && } + {Object.entries(ROLE_DETAILS).map(([key, value]) => ( + + `cursor-pointer select-none truncate rounded px-1 py-1.5 ${ + active || selected ? "bg-onboarding-background-400/40" : "" + } ${selected ? "text-onboarding-text-100" : "text-custom-text-200"}` + } + > + {({ selected }) => ( +
+
+
{value.title}
+
{value.description}
- )} - - ))} -
- - + {selected && } +
+ )} +
+ ))} +
+ )} />