From e10fecff8309f835eb7e32985da45556d71f2a0c Mon Sep 17 00:00:00 2001 From: Ian Bolton Date: Thu, 2 Nov 2023 14:49:19 -0400 Subject: [PATCH] :sparkles: Add an unlink button for removing underlying tickets (#1506) https://issues.redhat.com/browse/MTA-1539 Signed-off-by: ibolton336 --- client/public/locales/en/translation.json | 1 + .../components/wave-applications-table.tsx | 106 +++++++++++------- client/src/app/queries/migration-waves.ts | 15 +++ 3 files changed, 82 insertions(+), 40 deletions(-) diff --git a/client/public/locales/en/translation.json b/client/public/locales/en/translation.json index 6f3538778..be1447e11 100644 --- a/client/public/locales/en/translation.json +++ b/client/public/locales/en/translation.json @@ -51,6 +51,7 @@ "selectNone": "Select none", "selectPage": "Select page", "submitReview": "Submit review", + "unlink": "Unlink", "view": "View", "viewErrorReport": "View error report", "viewArchetypes": "View archetypes" diff --git a/client/src/app/pages/migration-waves/components/wave-applications-table.tsx b/client/src/app/pages/migration-waves/components/wave-applications-table.tsx index 7c7270129..94b645a1f 100644 --- a/client/src/app/pages/migration-waves/components/wave-applications-table.tsx +++ b/client/src/app/pages/migration-waves/components/wave-applications-table.tsx @@ -1,13 +1,14 @@ import React from "react"; -import TrashIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon"; +import { Toolbar, ToolbarContent, ToolbarItem } from "@patternfly/react-core"; import { - Button, - Toolbar, - ToolbarContent, - ToolbarItem, -} from "@patternfly/react-core"; -import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; -import alignment from "@patternfly/react-styles/css/utilities/Alignment/alignment"; + ActionsColumn, + Table, + Tbody, + Td, + Th, + Thead, + Tr, +} from "@patternfly/react-table"; import { useLocalTableControls } from "@app/hooks/table-controls"; import { ConditionalTableBody, @@ -16,6 +17,9 @@ import { } from "@app/components/TableControls"; import { SimplePagination } from "@app/components/SimplePagination"; import { MigrationWave, WaveWithStatus } from "@app/api/models"; +import { useTranslation } from "react-i18next"; +import { useDeleteTicketMutation } from "@app/queries/migration-waves"; +import { useFetchTickets } from "@app/queries/tickets"; export interface IWaveApplicationsTableProps { migrationWave: WaveWithStatus; @@ -26,6 +30,10 @@ export const WaveApplicationsTable: React.FC = ({ migrationWave, removeApplication, }) => { + const { t } = useTranslation(); + const { mutate: deleteTicket } = useDeleteTicketMutation(); + const { tickets } = useFetchTickets(); + const tableControls = useLocalTableControls({ idProperty: "name", items: migrationWave.fullApplications, @@ -92,40 +100,58 @@ export const WaveApplicationsTable: React.FC = ({ numRenderedColumns={numRenderedColumns} > - {currentPageItems?.map((app, rowIndex) => ( - - - - {app.name} - - - {app.description} - - { + const matchingTicket = tickets.find((ticket) => { + return ticket.application && ticket.application.id === app.id; + }); + + return ( + + - {app?.businessService?.name} - - - {app?.owner?.name} - - - - - - - ))} + {app?.businessService?.name} + + + {app?.owner?.name} + + + + removeApplication(migrationWave, app.id), + }, + matchingTicket && { + title: t("actions.unlink"), + onClick: () => { + matchingTicket?.id && + deleteTicket(matchingTicket?.id); + }, + }, + ].filter(Boolean)} + /> + + + + ); + })} diff --git a/client/src/app/queries/migration-waves.ts b/client/src/app/queries/migration-waves.ts index 3e96a9315..772bb3f22 100644 --- a/client/src/app/queries/migration-waves.ts +++ b/client/src/app/queries/migration-waves.ts @@ -6,6 +6,7 @@ import { deleteMigrationWave, updateMigrationWave, deleteAllMigrationWaves, + deleteTicket, } from "@app/api/rest"; import { getWavesWithStatus } from "@app/utils/waves-selector"; import { useFetchTickets } from "./tickets"; @@ -100,3 +101,17 @@ export const useDeleteAllMigrationWavesMutation = ( onError: onError, }); }; +export const useDeleteTicketMutation = ( + onSuccess?: (res: any) => void, + onError?: (err: AxiosError) => void +) => { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: deleteTicket, + onSuccess: (res) => { + onSuccess && onSuccess(res); + queryClient.invalidateQueries([MigrationWavesQueryKey]); + }, + onError: onError, + }); +};