UI - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: актуализация списка внешних контуров по исполнителям и обновлениям

This commit is contained in:
DCCONSTRUCTIONS 2026-04-18 22:17:31 +03:00
parent da7351d19a
commit 6d67571b27
5 changed files with 44 additions and 7 deletions

View File

@ -95,6 +95,8 @@
- source-side список `Открытые / Завершенные` - source-side список `Открытые / Завершенные`
- status pill по фактическому state целевой задачи - status pill по фактическому state целевой задачи
- отображение целевого проекта - отображение целевого проекта
- отображение исполнителей целевого контура
- отображение фактической даты последнего изменения
- открытие source-side detail экрана - открытие source-side detail экрана
Что еще остается на следующие этапы: Что еще остается на следующие этапы:

View File

@ -41,8 +41,9 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt
if (!request || !issue) return <></>; if (!request || !issue) return <></>;
const createdByDetails = issue.created_by_detail; const assigneeDetails = issue.assignee_details?.slice(0, 2) ?? [];
const visibleLabels = issue.label_details?.slice(0, 3) ?? []; const visibleLabels = issue.label_details?.slice(0, 3) ?? [];
const lastUpdatedAt = issue.updated_at || request.updated_at;
return ( return (
<Link <Link
@ -73,11 +74,11 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt
<div className="flex items-center justify-between gap-2"> <div className="flex items-center justify-between gap-2">
<div className="flex flex-wrap items-center gap-2"> <div className="flex flex-wrap items-center gap-2">
<Tooltip <Tooltip
tooltipHeading={t("issues.properties.created_on")} tooltipHeading={t("external_contours_page.list.last_updated")}
tooltipContent={`${renderFormattedDate(issue.created_at ?? "")}`} tooltipContent={`${renderFormattedDate(lastUpdatedAt ?? "")}`}
isMobile={isMobile} isMobile={isMobile}
> >
<div className="text-11 text-secondary">{renderFormattedDate(issue.created_at ?? "")}</div> <div className="text-11 text-secondary">{renderFormattedDate(lastUpdatedAt ?? "")}</div>
</Tooltip> </Tooltip>
{issue.priority && issue.priority !== "none" && ( {issue.priority && issue.priority !== "none" && (
@ -93,9 +94,25 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt
</div> </div>
))} ))}
</div> </div>
{createdByDetails ? ( <div className="flex items-center gap-1">
<Avatar src={createdByDetails.avatar_url || ""} name={createdByDetails.display_name || "NODE.DC"} size="md" showTooltip /> {assigneeDetails.length > 0 ? (
) : null} <>
{assigneeDetails.map((assignee) => (
<Avatar
key={assignee.id}
src={assignee.avatar_url || ""}
name={assignee.display_name || "NODE.DC"}
size="md"
showTooltip
/>
))}
</>
) : (
<Tooltip tooltipHeading={t("assignee")} tooltipContent={t("external_contours_page.list.unassigned")} isMobile={isMobile}>
<div className="text-11 text-placeholder">{t("external_contours_page.list.unassigned")}</div>
</Tooltip>
)}
</div>
</div> </div>
</Row> </Row>
</Link> </Link>

View File

@ -23,6 +23,7 @@ export const ExternalContoursRequestTraceability = observer(function ExternalCon
const issue = contourRequest.issue; const issue = contourRequest.issue;
const requestedByName = contourRequest.requested_by_name || issue.created_by_detail?.display_name || t("common.none"); const requestedByName = contourRequest.requested_by_name || issue.created_by_detail?.display_name || t("common.none");
const requestedAt = contourRequest.requested_at || contourRequest.created_at; 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 targetProjectName = contourRequest.target_project_name || issue.project_detail?.name || t("common.none");
const targetIssueKey = const targetIssueKey =
issue.project_detail?.identifier && issue.sequence_id issue.project_detail?.identifier && issue.sequence_id
@ -80,6 +81,13 @@ export const ExternalContoursRequestTraceability = observer(function ExternalCon
</div> </div>
</div> </div>
<div className="rounded-md border border-subtle bg-surface-1 p-3">
<div className="text-11 font-medium text-tertiary">{t("external_contours_page.traceability.last_updated")}</div>
<div className="mt-1 text-13 font-medium text-secondary">
{lastUpdatedAt ? renderFormattedDate(lastUpdatedAt) : t("common.none")}
</div>
</div>
<div className="rounded-md border border-subtle bg-surface-1 p-3"> <div className="rounded-md border border-subtle bg-surface-1 p-3">
<div className="text-11 font-medium text-tertiary">{t("external_contours_page.traceability.linked_item")}</div> <div className="text-11 font-medium text-tertiary">{t("external_contours_page.traceability.linked_item")}</div>
<div className="mt-1 flex items-center gap-2"> <div className="mt-1 flex items-center gap-2">

View File

@ -296,6 +296,10 @@ export default {
open: "Open", open: "Open",
closed: "Closed", closed: "Closed",
}, },
list: {
last_updated: "Last updated",
unassigned: "Unassigned",
},
empty_state: { empty_state: {
title: "External contours module is ready for the next stage", title: "External contours module is ready for the next stage",
description: description:
@ -340,6 +344,7 @@ export default {
status: "Current status", status: "Current status",
requested_by: "Requested by", requested_by: "Requested by",
requested_at: "Sent at", requested_at: "Sent at",
last_updated: "Last updated",
linked_item: "Linked work item", linked_item: "Linked work item",
}, },
actions: { actions: {

View File

@ -453,6 +453,10 @@ export default {
open: "Открытые", open: "Открытые",
closed: "Закрытые", closed: "Закрытые",
}, },
list: {
last_updated: "Последнее изменение",
unassigned: "Не назначено",
},
empty_state: { empty_state: {
title: "Модуль внешних контуров подготовлен", title: "Модуль внешних контуров подготовлен",
description: description:
@ -496,6 +500,7 @@ export default {
status: "Текущий статус", status: "Текущий статус",
requested_by: "Отправитель", requested_by: "Отправитель",
requested_at: "Отправлено", requested_at: "Отправлено",
last_updated: "Последнее изменение",
linked_item: "Связанная задача", linked_item: "Связанная задача",
}, },
actions: { actions: {