forked from github/plane
804dd8300d
* fix: add multiple module in an issue * feat: implemented multiple modules select in the issue detail and issue peekoverview and resolved build errors. * feat: handled module parameters type error in the issue create and draft modal * feat: handled UI for modules select dropdown * fix: delete module activity updated * ui: module issue activity * fix: module search endpoint and issue fetch in the modules * fix: module ids optimized * fix: replaced module_id from boolean to array of module Id's in module search modal params --------- Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
115 lines
4.4 KiB
TypeScript
115 lines
4.4 KiB
TypeScript
import { FC } from "react";
|
|
import { twMerge } from "tailwind-merge";
|
|
import { observer } from "mobx-react-lite";
|
|
import { ChevronDown, X } from "lucide-react";
|
|
// hooks
|
|
import { useModule } from "hooks/store";
|
|
// ui and components
|
|
import { DiceIcon, Tooltip } from "@plane/ui";
|
|
// types
|
|
import { TModuleSelectButton } from "./types";
|
|
|
|
export const ModuleSelectButton: FC<TModuleSelectButton> = observer((props) => {
|
|
const {
|
|
value,
|
|
onChange,
|
|
placeholder,
|
|
buttonClassName,
|
|
buttonVariant,
|
|
hideIcon,
|
|
hideText,
|
|
dropdownArrow,
|
|
dropdownArrowClassName,
|
|
showTooltip,
|
|
showCount,
|
|
} = props;
|
|
// hooks
|
|
const { getModuleById } = useModule();
|
|
|
|
return (
|
|
<div
|
|
className={twMerge(
|
|
`w-full h-full relative overflow-hidden flex justify-between items-center gap-1 rounded text-sm px-2`,
|
|
buttonVariant === "border-with-text"
|
|
? `border-[0.5px] border-custom-border-300 hover:bg-custom-background-80`
|
|
: ``,
|
|
buttonVariant === "border-without-text"
|
|
? `border-[0.5px] border-custom-border-300 hover:bg-custom-background-80`
|
|
: ``,
|
|
buttonVariant === "background-with-text" ? `bg-custom-background-80` : ``,
|
|
buttonVariant === "background-without-text" ? `bg-custom-background-80` : ``,
|
|
buttonVariant === "transparent-with-text" ? `hover:bg-custom-background-80` : ``,
|
|
buttonVariant === "transparent-without-text" ? `hover:bg-custom-background-80` : ``,
|
|
buttonClassName
|
|
)}
|
|
>
|
|
<div className="relative overflow-hidden h-full flex flex-wrap items-center gap-1">
|
|
{value && typeof value === "string" ? (
|
|
<div className="relative overflow-hidden flex items-center gap-1.5">
|
|
{!hideIcon && <DiceIcon className="h-3 w-3 flex-shrink-0" />}
|
|
{!hideText && (
|
|
<span className="w-full overflow-hidden truncate inline-block line-clamp-1 capitalize">
|
|
{getModuleById(value)?.name || placeholder}
|
|
</span>
|
|
)}
|
|
</div>
|
|
) : value && Array.isArray(value) && value.length > 0 ? (
|
|
showCount ? (
|
|
<div className="relative overflow-hidden flex items-center gap-1.5">
|
|
{!hideIcon && <DiceIcon className="h-3 w-3 flex-shrink-0" />}
|
|
{!hideText && (
|
|
<span className="w-full overflow-hidden truncate inline-block line-clamp-1 capitalize">
|
|
{value.length} Modules
|
|
</span>
|
|
)}
|
|
</div>
|
|
) : (
|
|
value.map((moduleId) => {
|
|
const _module = getModuleById(moduleId);
|
|
if (!_module) return <></>;
|
|
return (
|
|
<div className="relative flex justify-between items-center gap-1 min-w-[60px] max-w-[84px] overflow-hidden bg-custom-background-80 px-1.5 py-1 rounded">
|
|
<Tooltip tooltipContent={_module?.name} disabled={!showTooltip}>
|
|
<div className="relative overflow-hidden flex items-center gap-1.5">
|
|
{!hideIcon && <DiceIcon className="h-3 w-3 flex-shrink-0" />}
|
|
{!hideText && (
|
|
<span className="w-full truncate inline-block line-clamp-1 capitalize">{_module?.name}</span>
|
|
)}
|
|
</div>
|
|
</Tooltip>
|
|
<Tooltip tooltipContent="Remove" disabled={!showTooltip}>
|
|
<span
|
|
onClick={(e) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
onChange(_module.id);
|
|
}}
|
|
>
|
|
<X className="h-2.5 w-2.5 text-custom-text-300 hover:text-red-500" />
|
|
</span>
|
|
</Tooltip>
|
|
</div>
|
|
);
|
|
})
|
|
)
|
|
) : (
|
|
!hideText && (
|
|
<div className="relative overflow-hidden flex items-center gap-1.5">
|
|
{!hideIcon && <DiceIcon className="h-3 w-3 flex-shrink-0" />}
|
|
{!hideText && (
|
|
<span className="w-full overflow-hidden truncate inline-block line-clamp-1 capitalize">
|
|
{placeholder}
|
|
</span>
|
|
)}
|
|
</div>
|
|
)
|
|
)}
|
|
</div>
|
|
|
|
{dropdownArrow && (
|
|
<ChevronDown className={twMerge("h-2.5 w-2.5 flex-shrink-0", dropdownArrowClassName)} aria-hidden="true" />
|
|
)}
|
|
</div>
|
|
);
|
|
});
|