import { observer } from "mobx-react-lite"; import { CalendarCheck2, CalendarClock, Layers, Link, Paperclip } from "lucide-react"; // hooks import { useEstimate, useLabel } from "hooks/store"; // components import { IssuePropertyLabels } from "../properties/labels"; import { Tooltip } from "@plane/ui"; import { WithDisplayPropertiesHOC } from "../properties/with-display-properties-HOC"; import { DateDropdown, EstimateDropdown, PriorityDropdown, ProjectMemberDropdown, StateDropdown, } from "components/dropdowns"; // helpers import { renderFormattedPayloadDate } from "helpers/date-time.helper"; // types import { TIssue, IIssueDisplayProperties, TIssuePriorities } from "@plane/types"; export interface IIssueProperties { issue: TIssue; handleIssues: (issue: TIssue) => void; displayProperties: IIssueDisplayProperties | undefined; isReadOnly: boolean; className: string; } export const IssueProperties: React.FC = observer((props) => { const { issue, handleIssues, displayProperties, isReadOnly, className } = props; const { labelMap } = useLabel(); const { areEstimatesEnabledForCurrentProject } = useEstimate(); const handleState = (stateId: string) => { handleIssues({ ...issue, state_id: stateId }); }; const handlePriority = (value: TIssuePriorities) => { handleIssues({ ...issue, priority: value }); }; const handleLabel = (ids: string[]) => { handleIssues({ ...issue, label_ids: ids }); }; const handleAssignee = (ids: string[]) => { handleIssues({ ...issue, assignee_ids: ids }); }; const handleStartDate = (date: Date | null) => { handleIssues({ ...issue, start_date: date ? renderFormattedPayloadDate(date) : null }); }; const handleTargetDate = (date: Date | null) => { handleIssues({ ...issue, target_date: date ? renderFormattedPayloadDate(date) : null }); }; const handleEstimate = (value: number | null) => { handleIssues({ ...issue, estimate_point: value }); }; if (!displayProperties) return null; const defaultLabelOptions = issue?.label_ids?.map((id) => labelMap[id]) || []; const minDate = issue.start_date ? new Date(issue.start_date) : null; minDate?.setDate(minDate.getDate()); const maxDate = issue.target_date ? new Date(issue.target_date) : null; maxDate?.setDate(maxDate.getDate()); return (
{/* basic properties */} {/* state */}
{/* priority */}
{/* label */} {/* start date */}
} maxDate={maxDate ?? undefined} placeholder="Start date" buttonVariant={issue.start_date ? "border-with-text" : "border-without-text"} disabled={isReadOnly} showTooltip />
{/* target/due date */}
} minDate={minDate ?? undefined} placeholder="Due date" buttonVariant={issue.target_date ? "border-with-text" : "border-without-text"} disabled={isReadOnly} showTooltip />
{/* assignee */}
0 ? "transparent-without-text" : "border-without-text"} buttonClassName={issue.assignee_ids?.length > 0 ? "hover:bg-transparent px-0" : ""} />
{/* estimates */} {areEstimatesEnabledForCurrentProject && (
)} {/* extra render properties */} {/* sub-issues */}
{issue.sub_issues_count}
{/* attachments */}
{issue.attachment_count}
{/* link */}
{issue.link_count}
); });