import { MutableRefObject, memo } from "react"; import { Draggable, DraggableProvided, DraggableStateSnapshot } from "@hello-pangea/dnd"; import { observer } from "mobx-react-lite"; import { TIssue, IIssueDisplayProperties, IIssueMap } from "@plane/types"; // hooks import { Tooltip } from "@plane/ui"; import RenderIfVisible from "@/components/core/render-if-visible-HOC"; import { cn } from "@/helpers/common.helper"; import { useApplication, useIssueDetail, useProject } from "@/hooks/store"; import { usePlatformOS } from "@/hooks/use-platform-os"; // components import { IssueProperties } from "../properties/all-properties"; import { WithDisplayPropertiesHOC } from "../properties/with-display-properties-HOC"; interface IssueBlockProps { peekIssueId?: string; issueId: string; issuesMap: IIssueMap; displayProperties: IIssueDisplayProperties | undefined; isDragDisabled: boolean; draggableId: string; index: number; updateIssue: ((projectId: string, issueId: string, data: Partial) => Promise) | undefined; quickActions: (issue: TIssue) => React.ReactNode; canEditProperties: (projectId: string | undefined) => boolean; scrollableContainerRef?: MutableRefObject; isDragStarted?: boolean; issueIds: string[]; //DO NOT REMOVE< needed to force render for virtualization } interface IssueDetailsBlockProps { issue: TIssue; displayProperties: IIssueDisplayProperties | undefined; updateIssue: ((projectId: string, issueId: string, data: Partial) => Promise) | undefined; quickActions: (issue: TIssue) => React.ReactNode; isReadOnly: boolean; } const KanbanIssueDetailsBlock: React.FC = observer((props: IssueDetailsBlockProps) => { const { issue, updateIssue, quickActions, isReadOnly, displayProperties } = props; // hooks const { isMobile } = usePlatformOS(); const { getProjectIdentifierById } = useProject(); return ( <>
{getProjectIdentifierById(issue.project_id)}-{issue.sequence_id}
{quickActions(issue)}
{issue?.is_draft ? ( {issue.name} ) : ( {issue.name} )} ); }); export const KanbanIssueBlock: React.FC = memo((props) => { const { peekIssueId, issueId, issuesMap, displayProperties, isDragDisabled, draggableId, index, updateIssue, quickActions, canEditProperties, scrollableContainerRef, isDragStarted, issueIds, } = props; const { router: { workspaceSlug }, } = useApplication(); const { setPeekIssue } = useIssueDetail(); const issue = issuesMap[issueId]; const handleIssuePeekOverview = (issue: TIssue) => workspaceSlug && issue && issue.project_id && issue.id && setPeekIssue({ workspaceSlug, projectId: issue.project_id, issueId: issue.id }); const handleControlLinkClick = () => { window.open( `/${workspaceSlug}/projects/${issue.project_id}/${issue.archived_at ? "archives/" : ""}issues/${issue.id}` ); }; if (!issue) return null; const canEditIssueProperties = canEditProperties(issue.project_id); return ( {(provided: DraggableProvided, snapshot: DraggableStateSnapshot) => (
{ if (e.ctrlKey || e.metaKey) { handleControlLinkClick(); } else { const target = e.target as Element; if (!target.closest("[role='listbox']")) { handleIssuePeekOverview(issue); } } }} >
)}
); }); KanbanIssueBlock.displayName = "KanbanIssueBlock"; // href={`/${workspaceSlug}/projects/${issue.project_id}/${issue.archived_at ? "archives/" : ""}issues/${ // issue.id // }`} // target="_blank" // onClick={() => handleIssuePeekOverview(issue)} // disabled={!!issue?.tempId}