/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import type { ReactNode } from "react"; import { observer } from "mobx-react"; import { useTranslation } from "@plane/i18n"; import type { TExternalContourRequest } from "@plane/types"; import { Avatar } from "@plane/ui"; import { renderFormattedDate } from "@plane/utils"; import { ExternalContourStatePill } from "./state-pill"; type Props = { contourRequest: TExternalContourRequest; }; const TraceabilityCell = ({ label, children }: { label: string; children: ReactNode }) => (
{label}
{children}
); export const ExternalContoursRequestTraceability = observer(function ExternalContoursRequestTraceability(props: Props) { const { contourRequest } = props; const { t } = useTranslation(); const issue = contourRequest.issue; const requestedByName = contourRequest.requested_by_name || issue.created_by_detail?.display_name || t("common.none"); const requestedAt = contourRequest.requested_at || contourRequest.created_at; const lastUpdatedAt = issue.updated_at || contourRequest.updated_at; const targetProjectName = contourRequest.target_project_name || issue.project_detail?.name || t("common.none"); const sourceProjectName = contourRequest.source_project_name || t("common.none"); const sourceDecision = contourRequest.source_decision === "accepted" ? t("external_contours_page.traceability.source_decision_accepted") : t("external_contours_page.traceability.source_decision_pending"); const dueDate = issue.target_date ? renderFormattedDate(issue.target_date) : t("common.none"); const assigneeDetails = issue.assignee_details ?? []; return (
{t("external_contours_page.traceability.title")}

{t("external_contours_page.traceability.description")}

{sourceProjectName} {targetProjectName}
{requestedByName}
{assigneeDetails.length > 0 ? (
{assigneeDetails.map((assignee) => (
{assignee.display_name}
))}
) : ( t("external_contours_page.list.unassigned") )}
{sourceDecision} {requestedAt ? renderFormattedDate(requestedAt) : t("common.none")} {dueDate} {lastUpdatedAt ? renderFormattedDate(lastUpdatedAt) : t("common.none")}
); });