diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/FeedRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/FeedRepository.java index 6b975f7f1cd..56a16a14a17 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/FeedRepository.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/FeedRepository.java @@ -23,6 +23,7 @@ import static org.openmetadata.catalog.type.Relationship.CREATED; import static org.openmetadata.catalog.type.Relationship.IS_ABOUT; import static org.openmetadata.catalog.type.Relationship.REPLIED_TO; import static org.openmetadata.catalog.util.ChangeEventParser.getPlaintextDiff; +import static org.openmetadata.catalog.util.EntityUtil.compareEntityReference; import static org.openmetadata.catalog.util.EntityUtil.populateEntityReferences; import com.fasterxml.jackson.core.JsonProcessingException; @@ -705,6 +706,11 @@ public class FeedRepository { throws IOException { // Get all the fields in the original thread that can be updated during PATCH operation Thread original = get(id.toString()); + if (original.getTask() != null) { + List assignees = original.getTask().getAssignees(); + populateAssignees(original); + assignees.sort(compareEntityReference); + } // Apply JSON patch to the original thread to get the updated thread Thread updated = JsonUtils.applyPatch(original, patch, Thread.class); @@ -722,6 +728,11 @@ public class FeedRepository { }); } + if (updated.getTask() != null) { + populateAssignees(updated); + updated.getTask().getAssignees().sort(compareEntityReference); + } + // Update the attributes String change = patchUpdate(original, updated) ? RestUtil.ENTITY_UPDATED : RestUtil.ENTITY_NO_CHANGE; sortPosts(updated); diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/TaskDetailPage/TaskDetailPage.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/TaskDetailPage/TaskDetailPage.tsx index c064ac18ede..0dc97072592 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/TaskDetailPage/TaskDetailPage.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/TaskDetailPage/TaskDetailPage.tsx @@ -19,7 +19,7 @@ import classNames from 'classnames'; import { compare, Operation } from 'fast-json-patch'; import { isEmpty, isEqual, isUndefined, toLower } from 'lodash'; import { observer } from 'mobx-react'; -import { EditorContentRef, EntityTags } from 'Models'; +import { EditorContentRef, EntityReference, EntityTags } from 'Models'; import React, { Fragment, useEffect, useMemo, useRef, useState } from 'react'; import { useHistory, useParams } from 'react-router-dom'; import AppState from '../../../AppState'; @@ -49,6 +49,7 @@ import { EntityType } from '../../../enums/entity.enum'; import { CreateThread } from '../../../generated/api/feed/createThread'; import { Column } from '../../../generated/entity/data/table'; import { + TaskDetails, TaskType, Thread, ThreadTaskStatus, @@ -256,7 +257,10 @@ const TaskDetailPage = () => { ); if (existingAssignee) { - return existingAssignee; + return { + id: existingAssignee.id, + type: existingAssignee.type, + }; } else { return { id: assignee.value, @@ -270,7 +274,28 @@ const TaskDetailPage = () => { task: { ...(taskDetail.task || {}), assignees: newAssignees }, }; - const patch = compare(taskDetail, updatedTask); + // existing task assignees should only have id and type for the patch to work + const existingAssignees = taskDetail.task?.assignees; + let oldTask: Thread = taskDetail; + if (existingAssignees) { + const formattedAssignees: EntityReference[] = existingAssignees.map( + (assignee: EntityReference) => { + return { + id: assignee.id, + type: assignee.type, + }; + } + ); + oldTask = { + ...taskDetail, + task: { + ...(taskDetail.task as TaskDetails), + assignees: formattedAssignees, + }, + }; + } + + const patch = compare(oldTask, updatedTask); updateThread(taskDetail.id, patch) .then(() => { fetchTaskDetail();