[WEB-2580] chore: improvements for custom search select. (#5744)
* [WEB-2580] chore: improvements for custom search select. * chore: update optionTooltip prop. * chore: update option tooltip prop. * chore: minor updates.
This commit is contained in:
parent
ec22f1fc53
commit
51b01ebcac
4 changed files with 47 additions and 17 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
import React, { useRef, useState } from "react";
|
import React, { useRef, useState } from "react";
|
||||||
import { usePopper } from "react-popper";
|
import { usePopper } from "react-popper";
|
||||||
import { Combobox } from "@headlessui/react";
|
import { Combobox } from "@headlessui/react";
|
||||||
import { Check, ChevronDown, Search } from "lucide-react";
|
import { Check, ChevronDown, Info, Search } from "lucide-react";
|
||||||
import { createPortal } from "react-dom";
|
import { createPortal } from "react-dom";
|
||||||
// plane helpers
|
// plane helpers
|
||||||
import { useOutsideClickDetector } from "@plane/helpers";
|
import { useOutsideClickDetector } from "@plane/helpers";
|
||||||
|
|
@ -11,6 +11,8 @@ import { useDropdownKeyDown } from "../hooks/use-dropdown-key-down";
|
||||||
import { cn } from "../../helpers";
|
import { cn } from "../../helpers";
|
||||||
// types
|
// types
|
||||||
import { ICustomSearchSelectProps } from "./helper";
|
import { ICustomSearchSelectProps } from "./helper";
|
||||||
|
// local components
|
||||||
|
import { Tooltip } from "../tooltip";
|
||||||
|
|
||||||
export const CustomSearchSelect = (props: ICustomSearchSelectProps) => {
|
export const CustomSearchSelect = (props: ICustomSearchSelectProps) => {
|
||||||
const {
|
const {
|
||||||
|
|
@ -95,11 +97,10 @@ export const CustomSearchSelect = (props: ICustomSearchSelectProps) => {
|
||||||
<button
|
<button
|
||||||
ref={setReferenceElement}
|
ref={setReferenceElement}
|
||||||
type="button"
|
type="button"
|
||||||
className={`flex w-full items-center justify-between gap-1 text-xs ${
|
className={`flex w-full items-center justify-between gap-1 text-xs ${disabled
|
||||||
disabled
|
? "cursor-not-allowed text-custom-text-200"
|
||||||
? "cursor-not-allowed text-custom-text-200"
|
: "cursor-pointer hover:bg-custom-background-80"
|
||||||
: "cursor-pointer hover:bg-custom-background-80"
|
} ${customButtonClassName}`}
|
||||||
} ${customButtonClassName}`}
|
|
||||||
onClick={toggleDropdown}
|
onClick={toggleDropdown}
|
||||||
>
|
>
|
||||||
{customButton}
|
{customButton}
|
||||||
|
|
@ -170,17 +171,32 @@ export const CustomSearchSelect = (props: ICustomSearchSelectProps) => {
|
||||||
"w-full truncate flex items-center justify-between gap-2 rounded px-1 py-1.5 cursor-pointer select-none",
|
"w-full truncate flex items-center justify-between gap-2 rounded px-1 py-1.5 cursor-pointer select-none",
|
||||||
{
|
{
|
||||||
"bg-custom-background-80": active,
|
"bg-custom-background-80": active,
|
||||||
|
"text-custom-text-400 opacity-60 cursor-not-allowed": option.disabled,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (!multiple) closeDropdown();
|
if (!multiple) closeDropdown();
|
||||||
}}
|
}}
|
||||||
|
disabled={option.disabled}
|
||||||
>
|
>
|
||||||
{({ selected }) => (
|
{({ selected }) => (
|
||||||
<>
|
<>
|
||||||
<span className="flex-grow truncate">{option.content}</span>
|
<span className="flex-grow truncate">{option.content}</span>
|
||||||
{selected && <Check className="h-3.5 w-3.5 flex-shrink-0" />}
|
{selected && <Check className="h-3.5 w-3.5 flex-shrink-0" />}
|
||||||
|
{option.tooltip && (
|
||||||
|
<>
|
||||||
|
{
|
||||||
|
typeof option.tooltip === "string" ? (
|
||||||
|
<Tooltip tooltipContent={option.tooltip}>
|
||||||
|
<Info className="h-3.5 w-3.5 flex-shrink-0 cursor-pointer text-custom-text-200" />
|
||||||
|
</Tooltip>
|
||||||
|
) : (
|
||||||
|
option.tooltip
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Combobox.Option>
|
</Combobox.Option>
|
||||||
|
|
|
||||||
|
|
@ -44,12 +44,14 @@ interface CustomSearchSelectProps {
|
||||||
onChange: any;
|
onChange: any;
|
||||||
onClose?: () => void;
|
onClose?: () => void;
|
||||||
options:
|
options:
|
||||||
| {
|
| {
|
||||||
value: any;
|
value: any;
|
||||||
query: string;
|
query: string;
|
||||||
content: React.ReactNode;
|
content: React.ReactNode;
|
||||||
}[]
|
disabled?: boolean;
|
||||||
| undefined;
|
tooltip?: string | React.ReactNode;
|
||||||
|
}[]
|
||||||
|
| undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SingleValueProps {
|
interface SingleValueProps {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,23 @@
|
||||||
import { Control } from "react-hook-form";
|
import { Control } from "react-hook-form";
|
||||||
// types
|
// types
|
||||||
import { TIssue } from "@plane/types";
|
import { TBulkIssueProperties, TIssue } from "@plane/types";
|
||||||
|
|
||||||
type TIssueTypeSelectProps = {
|
export type TIssueFields = TIssue & TBulkIssueProperties;
|
||||||
control: Control<TIssue>;
|
|
||||||
|
export type TIssueTypeDropdownVariant = "xs" | "sm";
|
||||||
|
|
||||||
|
export type TIssueTypeSelectProps<T extends Partial<TIssueFields>> = {
|
||||||
|
control: Control<T>;
|
||||||
projectId: string | null;
|
projectId: string | null;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
handleFormChange: () => void;
|
variant?: TIssueTypeDropdownVariant;
|
||||||
|
placeholder?: string;
|
||||||
|
isRequired?: boolean;
|
||||||
|
renderChevron?: boolean;
|
||||||
|
dropDownContainerClassName?: string;
|
||||||
|
showMandatoryFieldInfo?: boolean; // Show info about mandatory fields
|
||||||
|
handleFormChange?: () => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const IssueTypeSelect: React.FC<TIssueTypeSelectProps> = () => <></>;
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export const IssueTypeSelect = <T extends Partial<TIssueFields>>(props: TIssueTypeSelectProps<T>) => <></>;
|
||||||
|
|
|
||||||
|
|
@ -280,6 +280,7 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
|
||||||
projectId={projectId}
|
projectId={projectId}
|
||||||
disabled={!!data?.sourceIssueId}
|
disabled={!!data?.sourceIssueId}
|
||||||
handleFormChange={handleFormChange}
|
handleFormChange={handleFormChange}
|
||||||
|
renderChevron
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue