/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import { useMemo } from "react"; import { observer } from "mobx-react"; import { useTranslation } from "@plane/i18n"; import { Badge } from "@plane/propel/badge"; import { MembersPropertyIcon } from "@plane/propel/icons"; import type { TIssue, TIssuePriorities } from "@plane/types"; import { renderFormattedPayloadDate } from "@plane/utils"; import { DateDropdown } from "@/components/dropdowns/date"; import { ButtonAvatars } from "@/components/dropdowns/member/avatar"; import { MemberDropdownBase } from "@/components/dropdowns/member/base"; import { PriorityDropdown } from "@/components/dropdowns/priority"; import { ProjectDropdownBase } from "@/components/dropdowns/project/base"; import { WorkItemLabelSelectBase } from "@/components/issues/select/base"; import { useMember } from "@/hooks/store/use-member"; import { useProjectExternalContours } from "@/hooks/store/use-project-external-contours"; type Props = { currentProjectName?: string; data: Partial & { target_project_id?: string | null; priority?: TIssuePriorities }; handleData: (issueKey: keyof Props["data"], issueValue: Props["data"][keyof Props["data"]]) => void; }; export const ExternalContoursCreateProperties = observer(function ExternalContoursCreateProperties(props: Props) { const { currentProjectName, data, handleData } = props; const { t } = useTranslation(); const { getUserDetails } = useMember(); const { targetProjectIds, getTargetOptionsByProjectId, getTargetProjectById } = useProjectExternalContours(); const selectedTargetProject = data.target_project_id ? getTargetProjectById(data.target_project_id) : undefined; const selectedTargetOptions = getTargetOptionsByProjectId(data.target_project_id); const targetLabelIds = useMemo( () => selectedTargetOptions?.labels?.map((label) => label.id) ?? [], [selectedTargetOptions?.labels] ); const assigneeLabel = useMemo(() => { const assigneeIds = data.assignee_ids || []; if (!assigneeIds.length) return t("external_contours_page.form.assignee"); if (assigneeIds.length === 1) return getUserDetails(assigneeIds[0])?.display_name || t("external_contours_page.form.assignee"); return `${assigneeIds.length} ${t("assignees").toLocaleLowerCase()}`; }, [data.assignee_ids, getUserDetails, t]); const getTargetLabelById = (labelId: string) => selectedTargetOptions?.labels?.find((label) => label.id === labelId) ?? null; return (
{t("external_contours_page.form.source_project")} {currentProjectName || "NODE.DC"}
{ if (!Array.isArray(value)) { handleData("target_project_id", value); handleData("assignee_ids", []); handleData("label_ids", []); } }} multiple={false} projectIds={targetProjectIds} getProjectById={getTargetProjectById} buttonVariant="border-with-text" placeholder={t("external_contours_page.form.target_project")} disabled={targetProjectIds.length === 0} />
{selectedTargetProject && (
{t("external_contours_page.form.selected_target")} {selectedTargetProject.name}
)}
handleData("priority", priority)} buttonVariant="border-with-text" />
handleData("assignee_ids", assigneeIds)} getUserDetails={getUserDetails} memberIds={selectedTargetOptions?.member_ids ?? []} button={
{assigneeLabel}
} buttonVariant={(data.assignee_ids || []).length > 0 ? "transparent-without-text" : "border-with-text"} buttonClassName={(data.assignee_ids || []).length > 0 ? "hover:bg-transparent" : ""} optionsClassName="z-[60]" placeholder={t("external_contours_page.form.assignee")} disabled={!data.target_project_id || !selectedTargetOptions} multiple />
handleData("label_ids", labelIds)} getLabelById={getTargetLabelById} labelIds={targetLabelIds} disabled={!data.target_project_id || !selectedTargetOptions} />
handleData("target_date", date ? renderFormattedPayloadDate(date) : "")} buttonVariant="border-with-text" placeholder={t("external_contours_page.form.due_date")} />
); });