Skip to content

Commit 48a5a33

Browse files
ZabilsyaZabilsya
andauthored
[DOP-22299] add file name template field (#72)
* [DOP-22299] add file name template field * [DOP-22299] fix after review --------- Co-authored-by: Zabilsya <kvcherniko@mts.ru>
1 parent cea8180 commit 48a5a33

File tree

16 files changed

+122
-17
lines changed

16 files changed

+122
-17
lines changed

src/app/styles/variables.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
@input-bg: #f1f3f5;
2121
@select-background: #f1f3f5;
2222
@picker-bg: #f1f3f5;
23+
@tooltip-bg: #000000;
2324

2425
// custom constants
2526
@select-transformation-type-width: 180px;

src/entities/file/@x/transfer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
/** Cross-import entities using public API in FSD https://feature-sliced.design/ru/docs/reference/public-api#public-api-for-cross-imports */
22
export type { FileFormat, Json } from '../types';
3-
export { FileFormatParams } from '../ui';
3+
export { FileFormatParams, FileNameTemplate } from '../ui';
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React from 'react';
2+
3+
export const FileNameTemplateTooltipText = () => {
4+
return (
5+
<>
6+
You can use the following placeholders (with brackets {'{}'}): <br />
7+
<ul>
8+
<li>{`{index}`} - required</li>
9+
<li>{`{extension}`} - required</li>
10+
<li>{`{run_created_at}`}</li>
11+
<li>{`{run_id}`}</li>
12+
</ul>
13+
And letters, numbers, and symbols &quot;.&quot;, &quot;_&quot;, &quot;-&quot; <br />
14+
</>
15+
);
16+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './FileNameTemplateTooltipText';
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/** Regexp to filename template, which must include `{extension}` and `{index}` placeholder (e.g. qwerty_{index}.{extension}) */
2+
export const FILE_NAME_TEMPLATE_REGEXP =
3+
/^(?=.*\{index\})(?=.*\{extension\})([a-zA-Z0-9._\-]*\{(?:index|extension|run_created_at|run_id)\}[a-zA-Z0-9._\-]*)*$/;
4+
5+
export const fileNamePlaceholder = '{run_created_at}_{index}.{extension}';
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Form, Input } from 'antd';
2+
import React from 'react';
3+
import { validateFormFieldByPattern } from '@shared/utils';
4+
5+
import { FILE_NAME_TEMPLATE_REGEXP, fileNamePlaceholder } from './constants';
6+
import { FileNameTemplateTooltipText } from './components';
7+
8+
export const FileNameTemplate = () => {
9+
return (
10+
<Form.Item
11+
label="Filename template"
12+
normalize={(value) => (value.trim() === '' ? undefined : value)}
13+
tooltip={<FileNameTemplateTooltipText />}
14+
name={['target_params', 'file_name_template']}
15+
rules={[
16+
{
17+
pattern: FILE_NAME_TEMPLATE_REGEXP,
18+
validator: validateFormFieldByPattern,
19+
},
20+
]}
21+
>
22+
<Input className="nodrag" size="large" placeholder={fileNamePlaceholder} />
23+
</Form.Item>
24+
);
25+
};

src/entities/file/ui/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './FileFormatParams';
2+
export * from './FileNameTemplate';

src/entities/transfer/api/types.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,25 +75,27 @@ interface TransferParamsHdfs {
7575
directory_path: string;
7676
}
7777

78-
interface TransferSourceParamsHdfs extends TransferParamsHdfs {
78+
export interface TransferSourceParamsHdfs extends TransferParamsHdfs {
7979
file_format: FileFormat;
8080
}
8181

82-
interface TransferTargetParamsHdfs extends TransferParamsHdfs {
82+
export interface TransferTargetParamsHdfs extends TransferParamsHdfs {
8383
file_format: Exclude<FileFormat, Json>;
84+
file_name_template: string;
8485
}
8586

8687
interface TransferParamsS3 {
8788
type: ConnectionType.S3;
8889
directory_path: string;
8990
}
9091

91-
interface TransferSourceParamsS3 extends TransferParamsS3 {
92+
export interface TransferSourceParamsS3 extends TransferParamsS3 {
9293
file_format: FileFormat;
9394
}
9495

95-
interface TransferTargetParamsS3 extends TransferParamsS3 {
96+
export interface TransferTargetParamsS3 extends TransferParamsS3 {
9697
file_format: Exclude<FileFormat, Json>;
98+
file_name_template: string;
9799
}
98100

99101
export interface GetTransfersRequest extends PaginationRequest {

src/entities/transfer/ui/TransferConnectionHdfs/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22
import { Divider, Form, Input } from 'antd';
33
import { ABSOLUTE_PATH_REGEXP } from '@shared/constants';
4-
import { FileFormatParams } from '@entities/file/@x/transfer';
4+
import { FileFormatParams, FileNameTemplate } from '@entities/file/@x/transfer';
55

66
import { TransferConnectionHdfsProps } from './types';
77

@@ -15,6 +15,7 @@ export const TransferConnectionHdfs = ({ name }: TransferConnectionHdfsProps) =>
1515
>
1616
<Input className="nodrag" size="large" />
1717
</Form.Item>
18+
{name === 'target_params' && <FileNameTemplate />}
1819
<Divider>File format settings</Divider>
1920
<FileFormatParams name={name} />
2021
</>

src/entities/transfer/ui/TransferConnectionS3/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22
import { Divider, Form, Input } from 'antd';
33
import { ABSOLUTE_PATH_REGEXP } from '@shared/constants';
4-
import { FileFormatParams } from '@entities/file/@x/transfer';
4+
import { FileFormatParams, FileNameTemplate } from '@entities/file/@x/transfer';
55

66
import { TransferConnectionS3Props } from './types';
77

@@ -15,6 +15,7 @@ export const TransferConnectionS3 = ({ name }: TransferConnectionS3Props) => {
1515
>
1616
<Input className="nodrag" size="large" />
1717
</Form.Item>
18+
{name === 'target_params' && <FileNameTemplate />}
1819
<Divider>File format settings</Divider>
1920
<FileFormatParams name={name} />
2021
</>

0 commit comments

Comments
 (0)