From f6500f096e7044ac122812641be4e00439aaf270 Mon Sep 17 00:00:00 2001 From: Zabilsya Date: Mon, 9 Dec 2024 18:18:37 +0600 Subject: [PATCH] [DOP-22031] update transfer --- src/app/config/router/instance.tsx | 14 +++--- src/entities/transfer/api/transferService.ts | 5 +++ src/entities/transfer/api/types.ts | 2 + .../components/TransferSchedule/index.tsx | 2 +- src/features/transfer/TransferList/index.tsx | 3 +- src/features/transfer/TransferList/types.ts | 1 + .../components/UpdateGroupButton/index.tsx | 2 +- .../transfer/UpdateTransferPage/index.tsx | 33 ++++++++++++++ src/pages/transfer/index.ts | 1 + .../DeleteConnectionButton/index.tsx | 4 +- .../UpdateConnectionButton/index.tsx | 2 +- .../ConnectionListWrapper/index.tsx | 2 +- .../components/DeleteQueueButton/index.tsx | 4 +- .../components/UpdateQueueButton/index.tsx | 2 +- src/widgets/queue/QueueListWrapper/index.tsx | 2 +- .../components/DeleteTransferButton/index.tsx | 4 +- .../components/UpdateTransferButton/index.tsx | 13 ++++++ .../components/UpdateTransferButton/types.ts | 3 ++ .../TransferDetail/components/index.ts | 1 + src/widgets/transfer/TransferDetail/index.tsx | 3 +- .../transfer/TransferListWrapper/index.tsx | 13 +++++- src/widgets/transfer/UpdateTransfer/index.tsx | 43 +++++++++++++++++++ src/widgets/transfer/UpdateTransfer/types.ts | 9 ++++ src/widgets/transfer/index.ts | 1 + 24 files changed, 148 insertions(+), 21 deletions(-) create mode 100644 src/pages/transfer/UpdateTransferPage/index.tsx create mode 100644 src/widgets/transfer/TransferDetail/components/UpdateTransferButton/index.tsx create mode 100644 src/widgets/transfer/TransferDetail/components/UpdateTransferButton/types.ts create mode 100644 src/widgets/transfer/UpdateTransfer/index.tsx create mode 100644 src/widgets/transfer/UpdateTransfer/types.ts diff --git a/src/app/config/router/instance.tsx b/src/app/config/router/instance.tsx index e539f7f4..0c6dfd52 100644 --- a/src/app/config/router/instance.tsx +++ b/src/app/config/router/instance.tsx @@ -12,7 +12,7 @@ import { CreateConnectionPage, UpdateConnectionPage, } from '@pages/connection'; -import { CreateTransferPage, TransferDetailPage, TransferListPage } from '@pages/transfer'; +import { CreateTransferPage, TransferDetailPage, TransferListPage, UpdateTransferPage } from '@pages/transfer'; import { RunDetailPage } from '@pages/run'; import { ErrorBoundary, NotFoundError } from '../errorBoundary'; @@ -113,14 +113,18 @@ export const router = createBrowserRouter([ path: '/transfers/:id', element: , }, - { - path: '/transfers/runs/:id', - element: , - }, { path: '/transfers/create', element: , }, + { + path: '/transfers/:id/update', + element: , + }, + { + path: '/transfers/runs/:id', + element: , + }, ], }, { diff --git a/src/entities/transfer/api/transferService.ts b/src/entities/transfer/api/transferService.ts index 36b25143..1013beb1 100644 --- a/src/entities/transfer/api/transferService.ts +++ b/src/entities/transfer/api/transferService.ts @@ -7,6 +7,7 @@ import { GetTransferRequest, GetTransfersRequest, Transfer, + UpdateTransferRequest, } from './types'; export const transferService = { @@ -22,6 +23,10 @@ export const transferService = { return axiosInstance.post(`transfers`, data); }, + updateTransfer: ({ id, ...data }: UpdateTransferRequest): Promise => { + return axiosInstance.patch(`transfers/${id}`, data); + }, + deleteTransfer: ({ id }: DeleteTransferRequest): Promise => { return axiosInstance.delete(`transfers/${id}`); }, diff --git a/src/entities/transfer/api/types.ts b/src/entities/transfer/api/types.ts index c6610631..b0cbfb72 100644 --- a/src/entities/transfer/api/types.ts +++ b/src/entities/transfer/api/types.ts @@ -82,6 +82,8 @@ export interface GetTransferRequest { export interface CreateTransferRequest extends Omit {} +export interface UpdateTransferRequest extends Omit {} + export interface DeleteTransferRequest { id: number; } diff --git a/src/features/transfer/MutateTransferForm/components/TransferSchedule/index.tsx b/src/features/transfer/MutateTransferForm/components/TransferSchedule/index.tsx index 29c5e632..bd47215f 100644 --- a/src/features/transfer/MutateTransferForm/components/TransferSchedule/index.tsx +++ b/src/features/transfer/MutateTransferForm/components/TransferSchedule/index.tsx @@ -11,7 +11,7 @@ export const TransferSchedule = () => { return ( <> - + {isScheduled && ( diff --git a/src/features/transfer/TransferList/index.tsx b/src/features/transfer/TransferList/index.tsx index d19ac180..4a7fe353 100644 --- a/src/features/transfer/TransferList/index.tsx +++ b/src/features/transfer/TransferList/index.tsx @@ -7,7 +7,7 @@ import { TransferQueryKey, transferService } from '@entities/transfer'; import { TRANSFER_LIST_COLUMNS } from './constants'; import { TransferListProps } from './types'; -export const TransferList = memo(({ group, onDeleteRowClick }: TransferListProps) => { +export const TransferList = memo(({ group, onUpdateRowClick, onDeleteRowClick }: TransferListProps) => { return ( hasAccessByUserRole(UserRole.Developer, group.role)} isRenderDeleteRowAction={() => hasAccessByUserRole(UserRole.Maintainer, group.role)} + onUpdateRowClick={onUpdateRowClick} onDeleteRowClick={onDeleteRowClick} rowKey="id" /> diff --git a/src/features/transfer/TransferList/types.ts b/src/features/transfer/TransferList/types.ts index 5ec6e968..a0d52188 100644 --- a/src/features/transfer/TransferList/types.ts +++ b/src/features/transfer/TransferList/types.ts @@ -3,5 +3,6 @@ import { Transfer } from '@entities/transfer'; export interface TransferListProps { group: Group; + onUpdateRowClick: (transfer: Transfer) => void; onDeleteRowClick: (transfer: Transfer) => void; } diff --git a/src/pages/group/GroupDetailPage/components/UpdateGroupButton/index.tsx b/src/pages/group/GroupDetailPage/components/UpdateGroupButton/index.tsx index 0774f900..3a0e5a46 100644 --- a/src/pages/group/GroupDetailPage/components/UpdateGroupButton/index.tsx +++ b/src/pages/group/GroupDetailPage/components/UpdateGroupButton/index.tsx @@ -8,7 +8,7 @@ import { UpdateGroupButtonProps } from './types'; export const UpdateGroupButton = ({ groupId }: UpdateGroupButtonProps) => { return ( ); }; diff --git a/src/pages/transfer/UpdateTransferPage/index.tsx b/src/pages/transfer/UpdateTransferPage/index.tsx new file mode 100644 index 00000000..a419ff34 --- /dev/null +++ b/src/pages/transfer/UpdateTransferPage/index.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Typography } from 'antd'; +import { PageContentWrapper } from '@shared/ui'; +import { useParams } from 'react-router-dom'; +import { PageDetailParams, UserRole } from '@shared/types'; +import { useGetGroup } from '@entities/group'; +import { hasAccessByUserRole } from '@shared/utils'; +import { AccessError } from '@shared/config'; +import { useGetTransfer } from '@entities/transfer'; +import { UpdateTransfer } from '@widgets/transfer'; + +const { Title } = Typography; + +export const UpdateTransferPage = () => { + const params = useParams(); + const { data: transfer } = useGetTransfer({ id: Number(params.id) }); + const { data: group } = useGetGroup({ id: transfer.group_id }); + + if (!transfer || !group) { + return null; + } + + if (!hasAccessByUserRole(UserRole.Maintainer, group.role)) { + throw new AccessError(); + } + + return ( + + Update Transfer + + + ); +}; diff --git a/src/pages/transfer/index.ts b/src/pages/transfer/index.ts index 9e56c2ab..bcb07369 100644 --- a/src/pages/transfer/index.ts +++ b/src/pages/transfer/index.ts @@ -1,3 +1,4 @@ export * from './TransferListPage'; export * from './TransferDetailPage'; export * from './CreateTransferPage'; +export * from './UpdateTransferPage'; diff --git a/src/widgets/connection/ConnectionDetail/components/DeleteConnectionButton/index.tsx b/src/widgets/connection/ConnectionDetail/components/DeleteConnectionButton/index.tsx index fb500422..4da0f72e 100644 --- a/src/widgets/connection/ConnectionDetail/components/DeleteConnectionButton/index.tsx +++ b/src/widgets/connection/ConnectionDetail/components/DeleteConnectionButton/index.tsx @@ -21,10 +21,10 @@ export const DeleteConnectionButton = ({ connection }: DeleteConnectionButtonPro return ( <> { return ( ); }; diff --git a/src/widgets/connection/ConnectionListWrapper/index.tsx b/src/widgets/connection/ConnectionListWrapper/index.tsx index afa78cf5..103f042c 100644 --- a/src/widgets/connection/ConnectionListWrapper/index.tsx +++ b/src/widgets/connection/ConnectionListWrapper/index.tsx @@ -37,7 +37,7 @@ export const ConnectionListWrapper = ({ group }: ConnectionListWrapperProps) => <> {selectedConnection && ( { return ( <> { return ( ); }; diff --git a/src/widgets/queue/QueueListWrapper/index.tsx b/src/widgets/queue/QueueListWrapper/index.tsx index 9ad60a60..35031e9d 100644 --- a/src/widgets/queue/QueueListWrapper/index.tsx +++ b/src/widgets/queue/QueueListWrapper/index.tsx @@ -37,7 +37,7 @@ export const QueueListWrapper = ({ group }: QueueListWrapperProps) => { <> {selectedQueue && ( return ( <> { + return ( + + ); +}; diff --git a/src/widgets/transfer/TransferDetail/components/UpdateTransferButton/types.ts b/src/widgets/transfer/TransferDetail/components/UpdateTransferButton/types.ts new file mode 100644 index 00000000..313e0078 --- /dev/null +++ b/src/widgets/transfer/TransferDetail/components/UpdateTransferButton/types.ts @@ -0,0 +1,3 @@ +export interface UpdateTransferButtonProps { + transferId: number; +} diff --git a/src/widgets/transfer/TransferDetail/components/index.ts b/src/widgets/transfer/TransferDetail/components/index.ts index be55a2f9..0e743e90 100644 --- a/src/widgets/transfer/TransferDetail/components/index.ts +++ b/src/widgets/transfer/TransferDetail/components/index.ts @@ -1 +1,2 @@ export * from './DeleteTransferButton'; +export * from './UpdateTransferButton'; diff --git a/src/widgets/transfer/TransferDetail/index.tsx b/src/widgets/transfer/TransferDetail/index.tsx index 8303f8bb..1c94ea81 100644 --- a/src/widgets/transfer/TransferDetail/index.tsx +++ b/src/widgets/transfer/TransferDetail/index.tsx @@ -4,7 +4,7 @@ import { TransferDetailInfo } from '@features/transfer'; import { UserRole } from '@shared/types'; import { TransferDetailProps } from './types'; -import { DeleteTransferButton } from './components'; +import { DeleteTransferButton, UpdateTransferButton } from './components'; import classes from './styles.module.less'; export const TransferDetail = ({ transfer, group, connectionSource, connectionTarget, queue }: TransferDetailProps) => { @@ -19,6 +19,7 @@ export const TransferDetail = ({ transfer, group, connectionSource, connectionTa extra={
+
diff --git a/src/widgets/transfer/TransferListWrapper/index.tsx b/src/widgets/transfer/TransferListWrapper/index.tsx index d5fe0509..0a27c43e 100644 --- a/src/widgets/transfer/TransferListWrapper/index.tsx +++ b/src/widgets/transfer/TransferListWrapper/index.tsx @@ -4,10 +4,12 @@ import { Transfer } from '@entities/transfer'; import { useModalState } from '@shared/hooks'; import { ModalWrapper } from '@shared/ui'; import { DEFAULT_MODAL_DELETE_WIDTH } from '@shared/constants'; +import { useNavigate } from 'react-router-dom'; import { TransferListWrapperProps } from './types'; export const TransferListWrapper = ({ group }: TransferListWrapperProps) => { + const navigate = useNavigate(); const [selectedTransfer, setSelectedTransfer] = useState(); const { @@ -24,11 +26,18 @@ export const TransferListWrapper = ({ group }: TransferListWrapperProps) => { [handleOpenDeleteTransferModal], ); + const handleUpdateRowClick = useCallback( + (record: Transfer) => { + navigate(`/transfers/${record.id}/update`); + }, + [navigate], + ); + return ( <> {selectedTransfer && ( { /> )} - + ); }; diff --git a/src/widgets/transfer/UpdateTransfer/index.tsx b/src/widgets/transfer/UpdateTransfer/index.tsx new file mode 100644 index 00000000..43b6bbdf --- /dev/null +++ b/src/widgets/transfer/UpdateTransfer/index.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { ManagedForm } from '@shared/ui'; +import { useNavigate } from 'react-router-dom'; +import { Transfer, TransferQueryKey, transferService } from '@entities/transfer'; +import { MutateTransferForm } from '@features/transfer'; + +import { UpdateTransferForm, UpdateTransferProps } from './types'; + +export const UpdateTransfer = ({ transfer, group }: UpdateTransferProps) => { + const { id: transferId, group_id, ...transferInitialValues } = transfer; + const navigate = useNavigate(); + + const handleUpdateTransfer = (values: UpdateTransferForm) => { + return transferService.updateTransfer({ id: transferId, ...values }); + }; + + const onSuccess = (response: Transfer) => { + navigate(`/transfers/${response.id}`); + }; + + const onCancel = () => { + navigate('/transfers'); + }; + + return ( + + initialValues={transferInitialValues} + mutationFunction={handleUpdateTransfer} + onSuccess={onSuccess} + keysInvalidateQueries={[ + [{ queryKey: [TransferQueryKey.GET_TRANSFERS, group.id] }], + [{ queryKey: [TransferQueryKey.GET_TRANSFER, transfer.id] }], + ]} + > + + + ); +}; diff --git a/src/widgets/transfer/UpdateTransfer/types.ts b/src/widgets/transfer/UpdateTransfer/types.ts new file mode 100644 index 00000000..055d3079 --- /dev/null +++ b/src/widgets/transfer/UpdateTransfer/types.ts @@ -0,0 +1,9 @@ +import { GroupData } from '@entities/group'; +import { Transfer, UpdateTransferRequest } from '@entities/transfer'; + +export interface UpdateTransferForm extends Omit {} + +export interface UpdateTransferProps { + transfer: Transfer; + group: GroupData; +} diff --git a/src/widgets/transfer/index.ts b/src/widgets/transfer/index.ts index 5e2eb0af..9b4886c3 100644 --- a/src/widgets/transfer/index.ts +++ b/src/widgets/transfer/index.ts @@ -1,3 +1,4 @@ export * from './TransferListWrapper'; export * from './TransferDetail'; export * from './CreateTransfer'; +export * from './UpdateTransfer';