@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.
@@ -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 };