@fe-free/core 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/package.json +42 -0
- package/src/button/index.md +46 -0
- package/src/button/index.tsx +22 -0
- package/src/crud/crud.tsx +258 -0
- package/src/crud/crud_delete.tsx +51 -0
- package/src/crud/crud_detail.tsx +193 -0
- package/src/crud/demo/data.tsx +148 -0
- package/src/crud/demo/index.tsx +342 -0
- package/src/crud/index.md +163 -0
- package/src/crud/index.tsx +2 -0
- package/src/crud/style.scss +10 -0
- package/src/editor_javascript/index.md +64 -0
- package/src/editor_javascript/index.tsx +36 -0
- package/src/editor_json/index.md +129 -0
- package/src/editor_json/index.tsx +48 -0
- package/src/editor_logs/index.md +48 -0
- package/src/editor_logs/index.tsx +69 -0
- package/src/editor_markdown/index.md +40 -0
- package/src/editor_markdown/index.tsx +39 -0
- package/src/form/index.md +96 -0
- package/src/form/index.tsx +51 -0
- package/src/index.ts +16 -0
- package/src/table/index.md +89 -0
- package/src/table/index.tsx +74 -0
- package/src/value_type_map/date.tsx +49 -0
- package/src/value_type_map/index.md +117 -0
- package/src/value_type_map/index.tsx +29 -0
- package/src/value_type_map/json.tsx +44 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { ProTable } from '@ant-design/pro-components';
|
|
2
|
+
import type { ProTableProps, ParamsType } from '@ant-design/pro-components';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
|
|
5
|
+
interface TableProps<DataSource = any, Params = any, ValueType = 'text'>
|
|
6
|
+
extends ProTableProps<DataSource, Params, ValueType> {
|
|
7
|
+
/** 区别 ProTable columns,默认 search: false */
|
|
8
|
+
columns?: ProTableProps<DataSource, Params, ValueType>['columns'];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function Table<
|
|
12
|
+
DataSource extends Record<string, any> = any,
|
|
13
|
+
Params extends ParamsType = ParamsType
|
|
14
|
+
>(props: TableProps<DataSource, Params>) {
|
|
15
|
+
const { columns, rowKey = 'id', search, ...rest } = props;
|
|
16
|
+
|
|
17
|
+
const newColumns = useMemo(() => {
|
|
18
|
+
if (columns) {
|
|
19
|
+
// 默认隐藏搜索,如果需要显示搜索,需要在 columns 中设置 search: true
|
|
20
|
+
return columns.map((column) => {
|
|
21
|
+
return {
|
|
22
|
+
search: false,
|
|
23
|
+
...column,
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return columns;
|
|
28
|
+
}, [columns]);
|
|
29
|
+
|
|
30
|
+
const newPagination = useMemo(() => {
|
|
31
|
+
return {
|
|
32
|
+
showSizeChanger: true,
|
|
33
|
+
showQuickJumper: true,
|
|
34
|
+
...rest.pagination,
|
|
35
|
+
};
|
|
36
|
+
}, [rest.pagination]);
|
|
37
|
+
|
|
38
|
+
const hasSearch = !!newColumns?.find((column) => column.search);
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<ProTable<DataSource, Params>
|
|
42
|
+
cardBordered
|
|
43
|
+
rowKey={rowKey}
|
|
44
|
+
pagination={newPagination}
|
|
45
|
+
options={false}
|
|
46
|
+
// @ts-ignore 不会处理这里的 ts,或者成本大
|
|
47
|
+
columns={newColumns}
|
|
48
|
+
scroll={getTableScroll(newColumns)}
|
|
49
|
+
search={
|
|
50
|
+
hasSearch && {
|
|
51
|
+
layout: 'vertical',
|
|
52
|
+
defaultCollapsed: false,
|
|
53
|
+
...search,
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
{...rest}
|
|
57
|
+
/>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function getTableScroll(columns: ProTableProps<any, any>['columns'], defaultWidth = 120) {
|
|
62
|
+
const scroll = { x: 0, y: undefined };
|
|
63
|
+
|
|
64
|
+
columns?.forEach((column) => {
|
|
65
|
+
if (!column.hideInTable) {
|
|
66
|
+
scroll.x += Number(column.width) || defaultWidth;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return scroll;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { Table };
|
|
74
|
+
export type { TableProps };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ProFormDateRangePicker } from '@ant-design/pro-components';
|
|
3
|
+
import dayjs from 'dayjs';
|
|
4
|
+
import { isString } from 'lodash-es';
|
|
5
|
+
|
|
6
|
+
function getDayjs(text: string | number) {
|
|
7
|
+
if (isString(text) && /^\d+$/.test(text as string)) {
|
|
8
|
+
return dayjs(parseInt(text as string));
|
|
9
|
+
}
|
|
10
|
+
// 其他都可以 dayjs
|
|
11
|
+
return dayjs(text);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const renderMap = {
|
|
15
|
+
dateTime: (text) => {
|
|
16
|
+
if (!text) return <div>-</div>;
|
|
17
|
+
|
|
18
|
+
return <div>{getDayjs(text).format('YYYY-MM-DD HH:mm:ss')}</div>;
|
|
19
|
+
},
|
|
20
|
+
date: (text) => {
|
|
21
|
+
if (!text) return <div>-</div>;
|
|
22
|
+
|
|
23
|
+
return <div>{getDayjs(text).format('YYYY-MM-DD')}</div>;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const renderFormItemMap = {
|
|
28
|
+
dateRange: (_, props) => {
|
|
29
|
+
return (
|
|
30
|
+
<ProFormDateRangePicker
|
|
31
|
+
{...props}
|
|
32
|
+
fieldProps={{
|
|
33
|
+
...props.fieldProps,
|
|
34
|
+
onChange: (value) => {
|
|
35
|
+
const newValue = value
|
|
36
|
+
? [dayjs(value[0]).startOf('day'), dayjs(value[1]).endOf('day')]
|
|
37
|
+
: value;
|
|
38
|
+
|
|
39
|
+
props.fieldProps.onChange?.(newValue);
|
|
40
|
+
},
|
|
41
|
+
}}
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const dateRender = { renderMap, renderFormItemMap };
|
|
48
|
+
|
|
49
|
+
export { dateRender };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: 'core'
|
|
3
|
+
toc: content
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# valueTypeMap
|
|
7
|
+
|
|
8
|
+
自定义 valueType
|
|
9
|
+
|
|
10
|
+
## customValueTypeMap
|
|
11
|
+
|
|
12
|
+
```tsx | pure
|
|
13
|
+
import { customValueTypeMap } from '@fe-free/core';
|
|
14
|
+
import { ProConfigProvider } from '@ant-design/pro-components';
|
|
15
|
+
|
|
16
|
+
const Demo = () => (
|
|
17
|
+
<ProConfigProvider valueTypeMap={customValueTypeMap}>
|
|
18
|
+
<div>some</div>
|
|
19
|
+
</ProConfigProvider>
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export default Demo;
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## CustomValueTypeEnum
|
|
26
|
+
|
|
27
|
+
```tsx | pure
|
|
28
|
+
enum CustomValueTypeEnum {
|
|
29
|
+
/** 渲染时间 + 搜索日期范围 */
|
|
30
|
+
CustomDateTimeAndDateRange = 'CustomDateTimeAndDateRange',
|
|
31
|
+
/** 渲染日期 + 搜索日期范围 */
|
|
32
|
+
CustomDateAndDateRange = 'CustomDateAndDateRange',
|
|
33
|
+
/** JSON */
|
|
34
|
+
CustomJSON = 'CustomJSON',
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
import { CRUD, customValueTypeMap, CustomValueTypeEnum } from '@fe-free/core';
|
|
40
|
+
import { ProConfigProvider } from '@ant-design/pro-components';
|
|
41
|
+
import { range } from 'lodash-es';
|
|
42
|
+
import dayjs from 'dayjs';
|
|
43
|
+
|
|
44
|
+
async function fakeRequest() {
|
|
45
|
+
const data = range(5).map((item) => ({
|
|
46
|
+
id: `${item}`,
|
|
47
|
+
timeStr: `2024-10-01 10:00:00`,
|
|
48
|
+
timeNumber: +dayjs('2024-10-01 10:00:00'),
|
|
49
|
+
dateStr: `2024-10-01`,
|
|
50
|
+
dateNumber: +dayjs('2024-10-01'),
|
|
51
|
+
jsonText: JSON.stringify({ name: 'hello world hello world hello world' }),
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
return Promise.resolve({
|
|
55
|
+
data,
|
|
56
|
+
success: true,
|
|
57
|
+
total: 100,
|
|
58
|
+
}) as Promise<any>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const Table = () => {
|
|
62
|
+
const columns: any[] = [
|
|
63
|
+
{
|
|
64
|
+
title: 'id',
|
|
65
|
+
dataIndex: 'id',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
title: '时间 str',
|
|
69
|
+
dataIndex: 'timeStr',
|
|
70
|
+
valueType: CustomValueTypeEnum.CustomDateTimeAndDateRange,
|
|
71
|
+
search: true,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
title: '时间 number',
|
|
75
|
+
dataIndex: 'timeNumber',
|
|
76
|
+
valueType: CustomValueTypeEnum.CustomDateTimeAndDateRange,
|
|
77
|
+
search: true,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
title: '日期 str',
|
|
81
|
+
dataIndex: 'dateStr',
|
|
82
|
+
valueType: CustomValueTypeEnum.CustomDateAndDateRange,
|
|
83
|
+
search: true,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
title: '日期 number',
|
|
87
|
+
dataIndex: 'dateNumber',
|
|
88
|
+
valueType: CustomValueTypeEnum.CustomDateAndDateRange,
|
|
89
|
+
search: true,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
title: 'json',
|
|
93
|
+
dataIndex: 'jsonText',
|
|
94
|
+
ellipsis: true,
|
|
95
|
+
valueType: CustomValueTypeEnum.CustomJSON,
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<CRUD
|
|
101
|
+
actions={[]}
|
|
102
|
+
tableProps={{
|
|
103
|
+
columns,
|
|
104
|
+
request: fakeRequest,
|
|
105
|
+
}}
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const Demo = () => (
|
|
111
|
+
<ProConfigProvider valueTypeMap={customValueTypeMap}>
|
|
112
|
+
<Table />
|
|
113
|
+
</ProConfigProvider>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
export default Demo;
|
|
117
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ProRenderFieldPropsType } from '@ant-design/pro-components';
|
|
2
|
+
import { dateRender } from './date';
|
|
3
|
+
import { jsonRender } from './json';
|
|
4
|
+
|
|
5
|
+
enum CustomValueTypeEnum {
|
|
6
|
+
/** 渲染时间 + 搜索日期范围 */
|
|
7
|
+
CustomDateTimeAndDateRange = 'CustomDateTimeAndDateRange',
|
|
8
|
+
/** 渲染日期 + 搜索日期范围 */
|
|
9
|
+
CustomDateAndDateRange = 'CustomDateAndDateRange',
|
|
10
|
+
/** JSON */
|
|
11
|
+
CustomJSON = 'CustomJSON',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const customValueTypeMap: Record<string, ProRenderFieldPropsType> = {
|
|
15
|
+
[CustomValueTypeEnum.CustomDateTimeAndDateRange]: {
|
|
16
|
+
render: dateRender.renderMap.dateTime,
|
|
17
|
+
renderFormItem: dateRender.renderFormItemMap.dateRange,
|
|
18
|
+
},
|
|
19
|
+
[CustomValueTypeEnum.CustomDateAndDateRange]: {
|
|
20
|
+
render: dateRender.renderMap.date,
|
|
21
|
+
renderFormItem: dateRender.renderFormItemMap.dateRange,
|
|
22
|
+
},
|
|
23
|
+
[CustomValueTypeEnum.CustomJSON]: {
|
|
24
|
+
render: jsonRender.render,
|
|
25
|
+
renderFormItem: jsonRender.renderFormItem,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { customValueTypeMap, CustomValueTypeEnum };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Typography } from 'antd';
|
|
2
|
+
|
|
3
|
+
function render(text) {
|
|
4
|
+
let jsonText = text;
|
|
5
|
+
|
|
6
|
+
if (!text) {
|
|
7
|
+
return <div>-</div>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
jsonText = JSON.stringify(JSON.parse(text), null, 2);
|
|
12
|
+
} catch (e) {
|
|
13
|
+
console.error(e, text);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<Typography.Text
|
|
18
|
+
className="block max-w-full overflow-hidden"
|
|
19
|
+
ellipsis={{
|
|
20
|
+
tooltip: {
|
|
21
|
+
title: (
|
|
22
|
+
<pre
|
|
23
|
+
style={{
|
|
24
|
+
whiteSpace: 'pre-wrap',
|
|
25
|
+
wordWrap: 'break-word',
|
|
26
|
+
}}
|
|
27
|
+
>
|
|
28
|
+
{jsonText}
|
|
29
|
+
</pre>
|
|
30
|
+
),
|
|
31
|
+
},
|
|
32
|
+
}}
|
|
33
|
+
>
|
|
34
|
+
{text}
|
|
35
|
+
</Typography.Text>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const jsonRender = {
|
|
40
|
+
render,
|
|
41
|
+
renderFormItem: () => <></>,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export { jsonRender };
|