diff --git a/docs_prod/cross-project-task-routing/phase-roadmap.md b/docs_prod/cross-project-task-routing/phase-roadmap.md index f78b8e3..f882539 100644 --- a/docs_prod/cross-project-task-routing/phase-roadmap.md +++ b/docs_prod/cross-project-task-routing/phase-roadmap.md @@ -102,6 +102,10 @@ - полноценная зеркальная activity/history - уведомления +Дополнительно реализовано: +- source-side detail показывает блок маршрутизации +- в карточке видны источник, цель, отправитель, дата отправки и связанная целевая задача + ## Этап 3. Source-side детальный экран и зеркалирование изменений ### Цель @@ -130,6 +134,20 @@ - если в target issue поменяли статус, это видно в source-side карточке - если в target issue написали комментарий, это видно в source-side карточке +### Статус + +Реализовано частично. + +Что уже работает: +- source-side detail использует отдельный экран `Внешних контуров` +- в карточке отображается блок маршрутизации с ключевой source-target связью +- текущий статус берется из фактического state целевой задачи + +Что остается: +- зеркалирование комментариев +- зеркалирование файлов +- зеркалирование activity stream и обновлений описания + ## Этап 4. Уведомления ### Цель diff --git a/plane-src/apps/api/plane/api/serializers/external_contours.py b/plane-src/apps/api/plane/api/serializers/external_contours.py index 7bb131b..9550cdf 100644 --- a/plane-src/apps/api/plane/api/serializers/external_contours.py +++ b/plane-src/apps/api/plane/api/serializers/external_contours.py @@ -78,6 +78,12 @@ class ExternalContourIssueSerializer(BaseSerializer): class ExternalContourRequestSerializer(BaseSerializer): issue = ExternalContourIssueSerializer(read_only=True) source_project_id = serializers.SerializerMethodField() + source_project_name = serializers.SerializerMethodField() + target_project_id = serializers.SerializerMethodField() + target_project_name = serializers.SerializerMethodField() + requested_by_id = serializers.SerializerMethodField() + requested_by_name = serializers.SerializerMethodField() + requested_at = serializers.SerializerMethodField() status = serializers.SerializerMethodField() class Meta: @@ -89,6 +95,12 @@ class ExternalContourRequestSerializer(BaseSerializer): "created_by", "issue", "source_project_id", + "source_project_name", + "target_project_id", + "target_project_name", + "requested_by_id", + "requested_by_name", + "requested_at", "status", ] read_only_fields = fields @@ -96,6 +108,44 @@ class ExternalContourRequestSerializer(BaseSerializer): def get_source_project_id(self, obj): return obj.extra.get("source_project_id") + def get_source_project_name(self, obj): + return obj.extra.get("source_project_name") + + def get_target_project_id(self, obj): + target_project_id = obj.extra.get("target_project_id") + if target_project_id: + return target_project_id + if obj.issue and obj.issue.project_id: + return str(obj.issue.project_id) + return None + + def get_target_project_name(self, obj): + target_project_name = obj.extra.get("target_project_name") + if target_project_name: + return target_project_name + if obj.issue and obj.issue.project: + return obj.issue.project.name + return None + + def get_requested_by_id(self, obj): + requested_by_id = obj.extra.get("requested_by_id") + if requested_by_id: + return requested_by_id + if obj.created_by_id: + return str(obj.created_by_id) + return None + + def get_requested_by_name(self, obj): + return obj.extra.get("requested_by_name") + + def get_requested_at(self, obj): + requested_at = obj.extra.get("requested_at") + if requested_at: + return requested_at + if obj.created_at: + return obj.created_at.isoformat() + return None + def get_status(self, obj): issue = obj.issue if issue and issue.state and issue.state.group in ["completed", "cancelled"]: diff --git a/plane-src/apps/web/ce/components/projects/external-contours/issue-root.tsx b/plane-src/apps/web/ce/components/projects/external-contours/issue-root.tsx index aa2137c..f30a7db 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/issue-root.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/issue-root.tsx @@ -29,6 +29,7 @@ import { useDebouncedDuplicateIssues } from "@/plane-web/hooks/use-debounced-dup import { IssueService } from "@/services/issue/issue.service"; import { WorkItemVersionService } from "@/services/issue/work_item_version.service"; import { ExternalContoursIssueContentProperties } from "./issue-properties"; +import { ExternalContoursRequestTraceability } from "./request-traceability"; const workItemVersionService = new WorkItemVersionService(); const issueService = new IssueService(); @@ -174,6 +175,10 @@ export const ExternalContoursIssueMainContent = observer(function ExternalContou +
{t("external_contours_page.traceability.description")}
+