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';