Skip to content

Commit

Permalink
[DOP-22031] update transfer
Browse files Browse the repository at this point in the history
  • Loading branch information
Zabilsya committed Dec 9, 2024
1 parent 4cbe3c2 commit f6500f0
Show file tree
Hide file tree
Showing 24 changed files with 148 additions and 21 deletions.
14 changes: 9 additions & 5 deletions src/app/config/router/instance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -113,14 +113,18 @@ export const router = createBrowserRouter([
path: '/transfers/:id',
element: <TransferDetailPage />,
},
{
path: '/transfers/runs/:id',
element: <RunDetailPage />,
},
{
path: '/transfers/create',
element: <CreateTransferPage />,
},
{
path: '/transfers/:id/update',
element: <UpdateTransferPage />,
},
{
path: '/transfers/runs/:id',
element: <RunDetailPage />,
},
],
},
{
Expand Down
5 changes: 5 additions & 0 deletions src/entities/transfer/api/transferService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
GetTransferRequest,
GetTransfersRequest,
Transfer,
UpdateTransferRequest,
} from './types';

export const transferService = {
Expand All @@ -22,6 +23,10 @@ export const transferService = {
return axiosInstance.post(`transfers`, data);
},

updateTransfer: ({ id, ...data }: UpdateTransferRequest): Promise<Transfer> => {
return axiosInstance.patch(`transfers/${id}`, data);
},

deleteTransfer: ({ id }: DeleteTransferRequest): Promise<null> => {
return axiosInstance.delete(`transfers/${id}`);
},
Expand Down
2 changes: 2 additions & 0 deletions src/entities/transfer/api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ export interface GetTransferRequest {

export interface CreateTransferRequest extends Omit<Transfer, 'id'> {}

export interface UpdateTransferRequest extends Omit<Transfer, 'group_id'> {}

export interface DeleteTransferRequest {
id: number;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export const TransferSchedule = () => {

return (
<>
<Form.Item label="Is scheduled" name="is_scheduled">
<Form.Item label="Is scheduled" name="is_scheduled" valuePropName="checked">
<Switch onChange={handleChangeScheduled} />
</Form.Item>
{isScheduled && (
Expand Down
3 changes: 2 additions & 1 deletion src/features/transfer/TransferList/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ 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 (
<ManagedTable
queryKey={[TransferQueryKey.GET_TRANSFERS, group.data.id]}
queryFunction={(params) => transferService.getTransfers({ ...params, group_id: group.data.id })}
columns={TRANSFER_LIST_COLUMNS}
isRenderUpdateRowAction={() => hasAccessByUserRole(UserRole.Developer, group.role)}
isRenderDeleteRowAction={() => hasAccessByUserRole(UserRole.Maintainer, group.role)}
onUpdateRowClick={onUpdateRowClick}
onDeleteRowClick={onDeleteRowClick}
rowKey="id"
/>
Expand Down
1 change: 1 addition & 0 deletions src/features/transfer/TransferList/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ import { Transfer } from '@entities/transfer';

export interface TransferListProps {
group: Group;
onUpdateRowClick: (transfer: Transfer) => void;
onDeleteRowClick: (transfer: Transfer) => void;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { UpdateGroupButtonProps } from './types';
export const UpdateGroupButton = ({ groupId }: UpdateGroupButtonProps) => {
return (
<Button className={classes.button} type="primary" size="large">
<Link to={`/groups/${groupId}/update`}>Update group</Link>
<Link to={`/groups/${groupId}/update`}>Update Group</Link>
</Button>
);
};
33 changes: 33 additions & 0 deletions src/pages/transfer/UpdateTransferPage/index.tsx
Original file line number Diff line number Diff line change
@@ -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<PageDetailParams>();
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 (
<PageContentWrapper width="small">
<Title>Update Transfer</Title>
<UpdateTransfer transfer={transfer} group={group.data} />
</PageContentWrapper>
);
};
1 change: 1 addition & 0 deletions src/pages/transfer/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './TransferListPage';
export * from './TransferDetailPage';
export * from './CreateTransferPage';
export * from './UpdateTransferPage';
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ export const DeleteConnectionButton = ({ connection }: DeleteConnectionButtonPro
return (
<>
<Button type="primary" size="large" danger onClick={handleOpenModal}>
Delete connection
Delete Connection
</Button>
<ModalWrapper
title="Delete connection"
title="Delete Connection"
width={DEFAULT_MODAL_DELETE_WIDTH}
open={isOpenedModal}
onCancel={handleCloseModal}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { UpdateConnectionButtonProps } from './types';
export const UpdateConnectionButton = ({ connectionId }: UpdateConnectionButtonProps) => {
return (
<Button type="primary" size="large">
<Link to={`/connections/${connectionId}/update`}>Update connection</Link>
<Link to={`/connections/${connectionId}/update`}>Update Connection</Link>
</Button>
);
};
2 changes: 1 addition & 1 deletion src/widgets/connection/ConnectionListWrapper/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export const ConnectionListWrapper = ({ group }: ConnectionListWrapperProps) =>
<>
{selectedConnection && (
<ModalWrapper
title="Delete connection"
title="Delete Connection"
width={DEFAULT_MODAL_DELETE_WIDTH}
open={isOpenedDeleteConnectionModal}
onCancel={handleCloseDeleteConnectionModal}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ export const DeleteQueueButton = ({ queue }: DeleteQueueButtonProps) => {
return (
<>
<Button type="primary" size="large" danger onClick={handleOpenDeleteQueueModal}>
Delete queue
Delete Queue
</Button>
<ModalWrapper
title="Delete queue"
title="Delete Queue"
width={DEFAULT_MODAL_DELETE_WIDTH}
open={isOpenedDeleteQueueModal}
onCancel={handleCloseDeleteQueueModal}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { UpdateQueueButtonProps } from './types';
export const UpdateQueueButton = ({ queueId }: UpdateQueueButtonProps) => {
return (
<Button type="primary" size="large">
<Link to={`/queues/${queueId}/update`}>Update queue</Link>
<Link to={`/queues/${queueId}/update`}>Update Queue</Link>
</Button>
);
};
2 changes: 1 addition & 1 deletion src/widgets/queue/QueueListWrapper/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export const QueueListWrapper = ({ group }: QueueListWrapperProps) => {
<>
{selectedQueue && (
<ModalWrapper
title="Delete queue"
title="Delete Queue"
width={DEFAULT_MODAL_DELETE_WIDTH}
open={isOpenedDeleteQueueModal}
onCancel={handleCloseDeleteQueueModal}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ export const DeleteTransferButton = ({ transfer }: DeleteTransferButtonProps) =>
return (
<>
<Button type="primary" size="large" danger onClick={handleOpenModal}>
Delete transfer
Delete Transfer
</Button>
<ModalWrapper
title="Delete transfer"
title="Delete Transfer"
width={DEFAULT_MODAL_DELETE_WIDTH}
open={isOpenedModal}
onCancel={handleCloseModal}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import React from 'react';
import { Button } from 'antd';
import { Link } from 'react-router-dom';

import { UpdateTransferButtonProps } from './types';

export const UpdateTransferButton = ({ transferId }: UpdateTransferButtonProps) => {
return (
<Button type="primary" size="large">
<Link to={`/transfers/${transferId}/update`}>Update Transfer</Link>
</Button>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export interface UpdateTransferButtonProps {
transferId: number;
}
1 change: 1 addition & 0 deletions src/widgets/transfer/TransferDetail/components/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './DeleteTransferButton';
export * from './UpdateTransferButton';
3 changes: 2 additions & 1 deletion src/widgets/transfer/TransferDetail/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand All @@ -19,6 +19,7 @@ export const TransferDetail = ({ transfer, group, connectionSource, connectionTa
extra={
<AccessWrapper accessRole={UserRole.Maintainer} currentRole={group.role}>
<div className={classes.actions}>
<UpdateTransferButton transferId={transfer.id} />
<DeleteTransferButton transfer={transfer} />
</div>
</AccessWrapper>
Expand Down
13 changes: 11 additions & 2 deletions src/widgets/transfer/TransferListWrapper/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<Transfer>();

const {
Expand All @@ -24,11 +26,18 @@ export const TransferListWrapper = ({ group }: TransferListWrapperProps) => {
[handleOpenDeleteTransferModal],
);

const handleUpdateRowClick = useCallback(
(record: Transfer) => {
navigate(`/transfers/${record.id}/update`);
},
[navigate],
);

return (
<>
{selectedTransfer && (
<ModalWrapper
title="Delete transfer"
title="Delete Transfer"
width={DEFAULT_MODAL_DELETE_WIDTH}
open={isOpenedDeleteTransferModal}
onCancel={handleCloseDeleteTransferModal}
Expand All @@ -40,7 +49,7 @@ export const TransferListWrapper = ({ group }: TransferListWrapperProps) => {
/>
</ModalWrapper>
)}
<TransferList group={group} onDeleteRowClick={handleDeleteUserClick} />
<TransferList group={group} onUpdateRowClick={handleUpdateRowClick} onDeleteRowClick={handleDeleteUserClick} />
</>
);
};
43 changes: 43 additions & 0 deletions src/widgets/transfer/UpdateTransfer/index.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<ManagedForm<UpdateTransferForm, Transfer>
initialValues={transferInitialValues}
mutationFunction={handleUpdateTransfer}
onSuccess={onSuccess}
keysInvalidateQueries={[
[{ queryKey: [TransferQueryKey.GET_TRANSFERS, group.id] }],
[{ queryKey: [TransferQueryKey.GET_TRANSFER, transfer.id] }],
]}
>
<MutateTransferForm
initialSourceConnectionType={transferInitialValues.source_params.type}
initialTargetConnectionType={transferInitialValues.target_params.type}
group={group}
onCancel={onCancel}
/>
</ManagedForm>
);
};
9 changes: 9 additions & 0 deletions src/widgets/transfer/UpdateTransfer/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { GroupData } from '@entities/group';
import { Transfer, UpdateTransferRequest } from '@entities/transfer';

export interface UpdateTransferForm extends Omit<UpdateTransferRequest, 'id'> {}

export interface UpdateTransferProps {
transfer: Transfer;
group: GroupData;
}
1 change: 1 addition & 0 deletions src/widgets/transfer/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './TransferListWrapper';
export * from './TransferDetail';
export * from './CreateTransfer';
export * from './UpdateTransfer';

0 comments on commit f6500f0

Please sign in to comment.