Skip to content

Commit 8467b94

Browse files
author
Zabilsya
committed
[DOP-22361] add filter rows transformation
1 parent 93889b2 commit 8467b94

File tree

21 files changed

+241
-48
lines changed

21 files changed

+241
-48
lines changed

src/entities/transformation/ui/FilterRows/components/FilterRowsItem/index.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ export const FilterRowsItem = ({ onRemove, name }: FilterRowsItemProps) => {
2020
name,
2121
]);
2222

23-
if (!filterRowsItems) {
24-
return undefined;
25-
}
26-
return filterRowsItems.type;
23+
return filterRowsItems?.type;
2724
}, [formInstance, name]);
2825

2926
/** Use custom type state, because Form.useWatch doesn't support dynamic fieldname like in Form.List */

src/features/transfer/MutateTransferForm/components/FilterRowsNode/FilterRowsNode.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ export const FilterRowsNode = ({}: FilterRowsNodeProps) => {
1717
const children = useMemo(() => {
1818
return (
1919
<>
20-
<Handle type="target" position={Position.Left} id={TransferCanvasEdge.FILTER_ROWS_TARGET} />
20+
<Handle type="target" position={Position.Left} id={TransferCanvasEdge.ROWS_FILTER_TARGET} />
2121
<FilterRows />
22-
<Handle type="source" position={Position.Right} id={TransferCanvasEdge.FILTER_ROWS_SOURCE} />
22+
<Handle type="source" position={Position.Right} id={TransferCanvasEdge.ROWS_FILTER_SOURCE} />
2323
</>
2424
);
2525
}, []);

src/features/transfer/MutateTransferForm/components/FilterRowsNode/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ import { Node, NodeProps } from '@xyflow/react';
33
import { TransferCanvasTransformNodeType } from '../TransferConnectionsCanvas';
44

55
export interface FilterRowsNodeData
6-
extends Node<Record<string, unknown>, TransferCanvasTransformNodeType.FILTER_ROWS> {}
6+
extends Node<Record<string, unknown>, TransferCanvasTransformNodeType.ROWS_FILTER> {}
77

88
export interface FilterRowsNodeProps extends NodeProps<FilterRowsNodeData> {}

src/features/transfer/MutateTransferForm/components/SourceParams/SourceParams.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const SourceParams = memo(({ groupId }: SourceParamsProps) => {
1717
<>
1818
<Form.Item label="Connection" name="source_connection_id" rules={[{ required: true }]}>
1919
<ManagedSelect
20-
/** className "nodrag" for opening dropdown in select in custom node React Flow https://github.com/xyflow/xyflow/discussions/2694 */
20+
/** className "nodrag" and "nowheel" for select in custom node React Flow https://reactflow.dev/api-reference/react-flow#no-drag-class-name */
2121
className="nodrag"
2222
popupClassName="nowheel"
2323
size="large"

src/features/transfer/MutateTransferForm/components/TransferConnections/utils/getTabsItems/getTabsItems.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React from 'react';
2+
import { Fieldset } from '@shared/ui';
23

34
import { TransferConnectionsDefault } from '../../../TransferConnectionsDefault';
45
import { TransferConnectionsCanvas } from '../../../TransferConnectionsCanvas';
@@ -15,6 +16,10 @@ export const getTabsItems = (props: GetTabsItemsProps) => [
1516
{
1617
label: 'Advanced',
1718
key: TransferConnectionsTab.ADVANCED,
18-
children: <TransferConnectionsCanvas {...props} />,
19+
children: (
20+
<Fieldset title="Connections settings">
21+
<TransferConnectionsCanvas {...props} />
22+
</Fieldset>
23+
),
1924
},
2025
];

src/features/transfer/MutateTransferForm/components/TransferConnectionsCanvas/TransferConnectionsCanvas.tsx

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useMemo } from 'react';
2-
import { Canvas, Fieldset } from '@shared/ui';
2+
import { Canvas } from '@shared/ui';
33
import { ReactFlowProvider, useEdgesState, useNodesState } from '@xyflow/react';
44
import { Form } from 'antd';
55
import { TransformationsForm, TransformationType } from '@entities/transformation';
@@ -32,19 +32,17 @@ export const TransferConnectionsCanvas = (props: TransferCanvasProps) => {
3232

3333
return (
3434
<ReactFlowProvider>
35-
<Fieldset title="Connections settings">
36-
<div className={classes.root}>
37-
<Canvas
38-
nodeTypes={NODE_TYPES}
39-
nodes={nodes}
40-
edges={edges}
41-
onNodesChange={onNodesChange}
42-
onEdgesChange={onEdgesChange}
43-
>
44-
<TransformButtons />
45-
</Canvas>
46-
</div>
47-
</Fieldset>
35+
<div className={classes.root}>
36+
<Canvas
37+
nodeTypes={NODE_TYPES}
38+
nodes={nodes}
39+
edges={edges}
40+
onNodesChange={onNodesChange}
41+
onEdgesChange={onEdgesChange}
42+
>
43+
<TransformButtons />
44+
</Canvas>
45+
</div>
4846
</ReactFlowProvider>
4947
);
5048
};

src/features/transfer/MutateTransferForm/components/TransferConnectionsCanvas/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { TransferCanvasDefaultNodeType, TransferCanvasTransformNodeType } from '
99
export const NODE_TYPES: NodeTypes = {
1010
[TransferCanvasDefaultNodeType.SOURCE]: SourceParamsNode,
1111
[TransferCanvasDefaultNodeType.TARGET]: TargetParamsNode,
12-
[TransferCanvasTransformNodeType.FILTER_ROWS]: FilterRowsNode,
12+
[TransferCanvasTransformNodeType.ROWS_FILTER]: FilterRowsNode,
1313
};
1414

1515
export const NODE_POSITION_X_GAP_DEFAULT = 500;

src/features/transfer/MutateTransferForm/components/TransferConnectionsCanvas/types.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ export enum TransferCanvasDefaultNodeType {
1414
}
1515

1616
export enum TransferCanvasTransformNodeType {
17-
FILTER_ROWS = 'FILTER_ROWS',
17+
ROWS_FILTER = 'ROWS_FILTER',
1818
}
1919

20+
export const TransferCanvasTransformNodeTypeName = {
21+
[TransferCanvasTransformNodeType.ROWS_FILTER]: 'Filter rows',
22+
} as const;
23+
2024
export enum TransferCanvasEdge {
2125
SOURCE = 'SOURCE',
2226
TARGET = 'TARGET',
23-
FILTER_ROWS_SOURCE = 'FILTER_ROWS_SOURCE',
24-
FILTER_ROWS_TARGET = 'FILTER_ROWS_TARGET',
27+
ROWS_FILTER_SOURCE = 'ROWS_FILTER_SOURCE',
28+
ROWS_FILTER_TARGET = 'ROWS_FILTER_TARGET',
2529
}

src/features/transfer/MutateTransferForm/components/TransferConnectionsCanvas/utils/getInitialNodes/getInitialNodes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ export const getInitialNodes = ({ groupId, hasFilterRows }: GetInitialNodesProps
1717

1818
if (hasFilterRows) {
1919
nodes.push({
20-
id: TransferCanvasTransformNodeType.FILTER_ROWS,
21-
type: TransferCanvasTransformNodeType.FILTER_ROWS,
20+
id: TransferCanvasTransformNodeType.ROWS_FILTER,
21+
type: TransferCanvasTransformNodeType.ROWS_FILTER,
2222
data: {},
2323
position: getNodePosition(nodeIndex),
2424
});
Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,58 @@
1-
import React, { memo } from 'react';
2-
import { Button, Typography } from 'antd';
1+
import React, { memo, useState } from 'react';
2+
import { Typography } from 'antd';
3+
import { useModalState } from '@shared/hooks';
4+
import { ModalWrapper } from '@shared/ui';
5+
import { DEFAULT_MODAL_DELETE_WIDTH } from '@shared/constants';
36

4-
import { TransferCanvasTransformNodeType } from '../TransferConnectionsCanvas';
7+
import { TransferCanvasTransformNodeType, TransferCanvasTransformNodeTypeName } from '../TransferConnectionsCanvas';
58

6-
import classes from './styles.module.less';
79
import { useHandleNodes } from './hooks';
10+
import { DeleteNode, TransformButtonItem } from './components';
11+
import classes from './styles.module.less';
812

913
const { Text } = Typography;
1014

1115
export const TransformButtons = memo(() => {
12-
const { transformNodeTypes, handleAddTransformNode } = useHandleNodes();
16+
const { transformNodeTypes, handleAddTransformNode, handleDeleteTransformNode } = useHandleNodes();
17+
18+
const [nodeTypeForDeleting, setNodeTypeForDeleting] = useState<TransferCanvasTransformNodeType | null>(null);
19+
20+
const { isOpened: isOpenedModal, handleOpen: openModal, handleClose: handleCloseModal } = useModalState();
21+
22+
const handleOpenDeleteNodeModal = (nodeType: TransferCanvasTransformNodeType) => {
23+
setNodeTypeForDeleting(nodeType);
24+
openModal();
25+
};
26+
27+
const handleDeleteNode = (nodeType: TransferCanvasTransformNodeType) => {
28+
handleDeleteTransformNode(nodeType);
29+
handleCloseModal();
30+
};
1331

1432
return (
1533
<div className={classes.root}>
16-
<Text strong>You can add some data transforms:</Text>
34+
<Text strong>Transform data controls:</Text>
1735
<div className={classes.buttons}>
18-
<Button
19-
type="primary"
20-
onClick={() => handleAddTransformNode(TransferCanvasTransformNodeType.FILTER_ROWS)}
21-
disabled={transformNodeTypes ? transformNodeTypes[TransferCanvasTransformNodeType.FILTER_ROWS] : false}
22-
>
23-
Filter rows
24-
</Button>
36+
{Object.values(TransferCanvasTransformNodeType).map((item, index) => (
37+
<TransformButtonItem
38+
nodeType={item}
39+
isExist={transformNodeTypes ? transformNodeTypes[item] : false}
40+
onAddNode={handleAddTransformNode}
41+
onDeleteNode={handleOpenDeleteNodeModal}
42+
key={index}
43+
/>
44+
))}
2545
</div>
46+
{nodeTypeForDeleting && (
47+
<ModalWrapper
48+
title={`Delete ${TransferCanvasTransformNodeTypeName[nodeTypeForDeleting]}`}
49+
width={DEFAULT_MODAL_DELETE_WIDTH}
50+
open={isOpenedModal}
51+
onCancel={handleCloseModal}
52+
>
53+
<DeleteNode nodeType={nodeTypeForDeleting} onConfirm={handleDeleteNode} onCancel={handleCloseModal} />
54+
</ModalWrapper>
55+
)}
2656
</div>
2757
);
2858
});

0 commit comments

Comments
 (0)