@fe-free/core 1.3.4 → 1.4.0
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 +17 -0
- package/package.json +11 -4
- package/src/ahooks/use_global_infinite_scroll.tsx +21 -0
- package/src/ahooks/use_global_request.tsx +26 -0
- package/src/crud/types.tsx +5 -4
- package/src/editor/editor.stories.tsx +108 -0
- package/src/editor/index.tsx +89 -0
- package/src/editor_logs/editor_logs.stories.tsx +5 -0
- package/src/editor_logs/index.tsx +2 -9
- package/src/index.ts +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @fe-free/core
|
|
2
2
|
|
|
3
|
+
## 1.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- feat: ahooks fix
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- @fe-free/tool@1.4.0
|
|
12
|
+
|
|
13
|
+
## 1.3.5
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- feat: editor
|
|
18
|
+
- @fe-free/tool@1.3.5
|
|
19
|
+
|
|
3
20
|
## 1.3.4
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fe-free/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"author": "",
|
|
@@ -12,11 +12,18 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@ant-design/icons": "^5.2.6",
|
|
14
14
|
"@ant-design/plots": "^2.2.5",
|
|
15
|
+
"@codemirror/lang-html": "^6.4.9",
|
|
16
|
+
"@codemirror/lang-javascript": "^6.2.4",
|
|
17
|
+
"@codemirror/lang-json": "^6.0.1",
|
|
18
|
+
"@codemirror/lang-markdown": "^6.3.2",
|
|
19
|
+
"@codemirror/lang-python": "^6.2.1",
|
|
20
|
+
"@codemirror/lang-sql": "^6.8.0",
|
|
21
|
+
"@codemirror/lang-xml": "^6.1.0",
|
|
15
22
|
"@codemirror/language": "^6.10.3",
|
|
16
23
|
"@codemirror/view": "^6.33.0",
|
|
17
24
|
"@lezer/highlight": "^1.2.1",
|
|
18
|
-
"@uiw/codemirror-themes": "^4.23.
|
|
19
|
-
"@uiw/react-codemirror": "^4.23.
|
|
25
|
+
"@uiw/codemirror-themes": "^4.23.12",
|
|
26
|
+
"@uiw/react-codemirror": "^4.23.12",
|
|
20
27
|
"ace-builds": "^1.33.1",
|
|
21
28
|
"ahooks": "^3.7.8",
|
|
22
29
|
"axios": "^1.6.5",
|
|
@@ -29,7 +36,7 @@
|
|
|
29
36
|
"react-syntax-highlighter": "^15.5.0",
|
|
30
37
|
"vanilla-jsoneditor": "^0.23.1",
|
|
31
38
|
"zustand": "^4.5.4",
|
|
32
|
-
"@fe-free/tool": "1.
|
|
39
|
+
"@fe-free/tool": "1.4.0"
|
|
33
40
|
},
|
|
34
41
|
"peerDependencies": {
|
|
35
42
|
"@ant-design/pro-components": "^2.8.7",
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useInfiniteScroll } from 'ahooks';
|
|
2
|
+
import type { Data, InfiniteScrollOptions, Service } from 'ahooks/lib/useInfiniteScroll/types';
|
|
3
|
+
|
|
4
|
+
function useGlobalInfiniteScroll<TData extends Data>(
|
|
5
|
+
service: Service<TData>,
|
|
6
|
+
options?: InfiniteScrollOptions<TData>,
|
|
7
|
+
) {
|
|
8
|
+
return useInfiniteScroll(service, {
|
|
9
|
+
onError: (error) => {
|
|
10
|
+
// 全局抛出错误
|
|
11
|
+
setTimeout(() => {
|
|
12
|
+
throw error;
|
|
13
|
+
}, 0);
|
|
14
|
+
},
|
|
15
|
+
...options,
|
|
16
|
+
// @ts-ignore
|
|
17
|
+
__ignore: true,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { useGlobalInfiniteScroll };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useRequest } from 'ahooks';
|
|
2
|
+
import type { Options, Plugin, Service } from 'ahooks/es/useRequest/src/types';
|
|
3
|
+
|
|
4
|
+
function useGlobalRequest<TData, TParams extends any[]>(
|
|
5
|
+
service: Service<TData, TParams>,
|
|
6
|
+
options?: Options<TData, TParams>,
|
|
7
|
+
plugins?: Plugin<TData, TParams>[],
|
|
8
|
+
) {
|
|
9
|
+
return useRequest(
|
|
10
|
+
service,
|
|
11
|
+
{
|
|
12
|
+
onError: (error) => {
|
|
13
|
+
// 全局抛出错误
|
|
14
|
+
setTimeout(() => {
|
|
15
|
+
throw error;
|
|
16
|
+
}, 0);
|
|
17
|
+
},
|
|
18
|
+
...options,
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
__ignore: true,
|
|
21
|
+
},
|
|
22
|
+
plugins,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { useGlobalRequest };
|
package/src/crud/types.tsx
CHANGED
|
@@ -9,15 +9,16 @@ import type { TableProps } from '../table';
|
|
|
9
9
|
* update 编辑
|
|
10
10
|
* delete 删除
|
|
11
11
|
*/
|
|
12
|
-
type
|
|
12
|
+
type CRUDAction = 'create' | 'read' | 'read_detail' | 'update' | 'delete';
|
|
13
13
|
|
|
14
14
|
interface CRUDProps<DataSource = any, Key = string> {
|
|
15
|
-
|
|
15
|
+
/** 操作类型 */
|
|
16
|
+
actions: CRUDAction[];
|
|
16
17
|
|
|
17
18
|
// *** 表单 ***
|
|
18
19
|
|
|
19
|
-
/**
|
|
20
|
-
detailForm?: (formProps: { readonly: boolean }, info: { action:
|
|
20
|
+
/** 弹窗表单,action 为 read update 时需要传递 */
|
|
21
|
+
detailForm?: (formProps: { readonly: boolean }, info: { action: CRUDAction }) => ReactNode;
|
|
21
22
|
/** detailForm 的 formRef */
|
|
22
23
|
detailFormInstance?: ProFormInstance;
|
|
23
24
|
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { EditorProps } from '@fe-free/core';
|
|
2
|
+
import { Editor } from '@fe-free/core';
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof Editor> = {
|
|
7
|
+
title: '@fe-free/core/Editor',
|
|
8
|
+
component: Editor,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof Editor>;
|
|
14
|
+
|
|
15
|
+
const BasicDemo = (props: EditorProps) => {
|
|
16
|
+
const [value, setValue] = useState(props.value || '');
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<div style={{ width: '500px', height: '500px' }}>
|
|
20
|
+
<Editor {...props} value={value} onChange={setValue} />
|
|
21
|
+
</div>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// 基础用法
|
|
26
|
+
export const Basic: Story = {
|
|
27
|
+
args: {
|
|
28
|
+
value: 'hello world!',
|
|
29
|
+
},
|
|
30
|
+
render: (props) => <BasicDemo {...props} />,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// 只读模式
|
|
34
|
+
export const ReadOnly: Story = {
|
|
35
|
+
args: {
|
|
36
|
+
value: 'hello world!',
|
|
37
|
+
readOnly: true,
|
|
38
|
+
},
|
|
39
|
+
render: (props) => <BasicDemo {...props} />,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// 不可编辑模式
|
|
43
|
+
export const Editable: Story = {
|
|
44
|
+
args: {
|
|
45
|
+
value: 'hello world!',
|
|
46
|
+
editable: false,
|
|
47
|
+
},
|
|
48
|
+
render: (props) => <BasicDemo {...props} />,
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// 自动聚焦
|
|
52
|
+
export const AutoFocus: Story = {
|
|
53
|
+
args: {
|
|
54
|
+
value: '',
|
|
55
|
+
autoFocus: true,
|
|
56
|
+
},
|
|
57
|
+
render: (props) => <BasicDemo {...props} />,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export const Javascript: Story = {
|
|
61
|
+
args: {
|
|
62
|
+
language: 'javascript',
|
|
63
|
+
value: 'console.log("Hello, World!")',
|
|
64
|
+
},
|
|
65
|
+
render: (props) => <BasicDemo {...props} />,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const Python: Story = {
|
|
69
|
+
args: {
|
|
70
|
+
language: 'python',
|
|
71
|
+
value: `def fibonacci(n):
|
|
72
|
+
if n <= 1:
|
|
73
|
+
return n
|
|
74
|
+
else:
|
|
75
|
+
return fibonacci(n-1) + fibonacci(n-2)
|
|
76
|
+
|
|
77
|
+
# 测试斐波那契数列
|
|
78
|
+
for i in range(10):
|
|
79
|
+
print(f"fibonacci({i}) = {fibonacci(i)}")`,
|
|
80
|
+
},
|
|
81
|
+
render: (props) => <BasicDemo {...props} />,
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const JSON: Story = {
|
|
85
|
+
args: {
|
|
86
|
+
language: 'json',
|
|
87
|
+
value: '{"action": "hello", "data": "world"}',
|
|
88
|
+
},
|
|
89
|
+
render: (props) => <BasicDemo {...props} />,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const Markdown: Story = {
|
|
93
|
+
args: {
|
|
94
|
+
language: 'markdown',
|
|
95
|
+
value: `# Hello, World!
|
|
96
|
+
|
|
97
|
+
This is a markdown file.
|
|
98
|
+
|
|
99
|
+
## Title2
|
|
100
|
+
|
|
101
|
+
### Title 3
|
|
102
|
+
|
|
103
|
+
- Item 1
|
|
104
|
+
- Item 2
|
|
105
|
+
- Item 3`,
|
|
106
|
+
},
|
|
107
|
+
render: (props) => <BasicDemo {...props} />,
|
|
108
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { javascript } from '@codemirror/lang-javascript';
|
|
2
|
+
import { json } from '@codemirror/lang-json';
|
|
3
|
+
import { markdown } from '@codemirror/lang-markdown';
|
|
4
|
+
import { python } from '@codemirror/lang-python';
|
|
5
|
+
import type { ReactCodeMirrorProps } from '@uiw/react-codemirror';
|
|
6
|
+
import CodeMirror from '@uiw/react-codemirror';
|
|
7
|
+
import { useCallback, useMemo } from 'react';
|
|
8
|
+
|
|
9
|
+
interface EditorProps {
|
|
10
|
+
language?: 'javascript' | 'python' | 'json' | 'markdown';
|
|
11
|
+
value?: string;
|
|
12
|
+
onChange?: (value: string) => void;
|
|
13
|
+
autoFocus?: boolean;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
readOnly?: boolean;
|
|
16
|
+
editable?: boolean;
|
|
17
|
+
|
|
18
|
+
// 不对外
|
|
19
|
+
theme?: ReactCodeMirrorProps['theme'];
|
|
20
|
+
extensions?: ReactCodeMirrorProps['extensions'];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function Editor(props: EditorProps) {
|
|
24
|
+
const {
|
|
25
|
+
language,
|
|
26
|
+
value,
|
|
27
|
+
onChange,
|
|
28
|
+
readOnly,
|
|
29
|
+
editable,
|
|
30
|
+
autoFocus,
|
|
31
|
+
placeholder,
|
|
32
|
+
theme,
|
|
33
|
+
extensions: originExtensions,
|
|
34
|
+
} = props;
|
|
35
|
+
|
|
36
|
+
const extensions = useMemo(() => {
|
|
37
|
+
const result: ReactCodeMirrorProps['extensions'] = [];
|
|
38
|
+
|
|
39
|
+
if (originExtensions) {
|
|
40
|
+
result.push(...originExtensions);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
switch (language) {
|
|
44
|
+
case 'javascript':
|
|
45
|
+
result.push(javascript());
|
|
46
|
+
break;
|
|
47
|
+
case 'python':
|
|
48
|
+
result.push(python());
|
|
49
|
+
break;
|
|
50
|
+
case 'json':
|
|
51
|
+
result.push(json());
|
|
52
|
+
break;
|
|
53
|
+
case 'markdown':
|
|
54
|
+
result.push(markdown());
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return result;
|
|
61
|
+
}, [language, originExtensions]);
|
|
62
|
+
|
|
63
|
+
const handleChange = useCallback(
|
|
64
|
+
(value: string) => {
|
|
65
|
+
onChange?.(value);
|
|
66
|
+
},
|
|
67
|
+
[onChange],
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<CodeMirror
|
|
72
|
+
className="w-full h-full"
|
|
73
|
+
height="100%"
|
|
74
|
+
width="100%"
|
|
75
|
+
value={value}
|
|
76
|
+
onChange={handleChange}
|
|
77
|
+
extensions={extensions}
|
|
78
|
+
editable={editable}
|
|
79
|
+
readOnly={readOnly}
|
|
80
|
+
autoFocus={autoFocus}
|
|
81
|
+
placeholder={placeholder}
|
|
82
|
+
// 不对外
|
|
83
|
+
theme={theme}
|
|
84
|
+
/>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { Editor };
|
|
89
|
+
export type { EditorProps };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { StreamLanguage } from '@codemirror/language';
|
|
2
2
|
import { tags as t } from '@lezer/highlight';
|
|
3
3
|
import { createTheme } from '@uiw/codemirror-themes';
|
|
4
|
-
import CodeMirror from '@uiw/react-codemirror';
|
|
5
4
|
import React from 'react';
|
|
5
|
+
import { Editor } from '../editor';
|
|
6
6
|
|
|
7
7
|
interface EditorLogsProps {
|
|
8
8
|
logs: {
|
|
@@ -55,14 +55,7 @@ const EditorLogs: React.FC<EditorLogsProps> = ({ logs }) => {
|
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
return (
|
|
58
|
-
<
|
|
59
|
-
value={formattedLogs}
|
|
60
|
-
theme={myTheme}
|
|
61
|
-
extensions={logExtension}
|
|
62
|
-
editable={false}
|
|
63
|
-
height="400px"
|
|
64
|
-
style={{ overflowY: 'auto' }}
|
|
65
|
-
/>
|
|
58
|
+
<Editor value={formattedLogs} theme={myTheme} extensions={logExtension} editable={false} />
|
|
66
59
|
);
|
|
67
60
|
};
|
|
68
61
|
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
export { useGlobalInfiniteScroll } from './ahooks/use_global_infinite_scroll';
|
|
2
|
+
export { useGlobalRequest } from './ahooks/use_global_request';
|
|
3
|
+
|
|
1
4
|
export { LoadingButton } from './button';
|
|
2
5
|
|
|
3
6
|
export { CRUD, CRUDDetail, CRUDOfSimple, OperateDelete, useDelete } from './crud';
|
|
4
7
|
export type { CRUDDetailProps, CRUDMethods, CRUDOfSimpleProps, CRUDProps } from './crud';
|
|
5
8
|
|
|
9
|
+
export { Editor } from './editor';
|
|
10
|
+
export type { EditorProps } from './editor';
|
|
6
11
|
export { EditorJavascript } from './editor_javascript';
|
|
7
12
|
export type { EditorJavascriptProps } from './editor_javascript';
|
|
8
13
|
export { EditorJSON } from './editor_json';
|