正在显示
77 个修改的文件
包含
362 行增加
和
310 行删除
.fatherrc.ts
0 → 100644
1 | +import { defineConfig } from 'father'; | ||
2 | + | ||
3 | +export default defineConfig({ | ||
4 | + umd: { output: 'dist/lib' }, | ||
5 | + esm: { | ||
6 | + output: 'dist', | ||
7 | + input: 'src', // 默认编译目录 | ||
8 | + platform: 'browser', // 默认构建为 Browser 环境的产物 | ||
9 | + transformer: 'babel', // 默认使用 babel 以提供更好的兼容性 | ||
10 | + }, | ||
11 | + // 或者 | ||
12 | + cjs: { | ||
13 | + output: 'dist/cjs', | ||
14 | + input: 'src', // 默认编译目录 | ||
15 | + platform: 'node', // 默认构建为 Node.js 环境的产物 | ||
16 | + transformer: 'esbuild', // 默认使用 esbuild 以获得更快的构建速度 | ||
17 | + }, | ||
18 | +}); |
@@ -4,8 +4,10 @@ | @@ -4,8 +4,10 @@ | ||
4 | "description": "", | 4 | "description": "", |
5 | "main": "index.js", | 5 | "main": "index.js", |
6 | "scripts": { | 6 | "scripts": { |
7 | + "father:dev": "father dev", | ||
8 | + "father:build": "father build", | ||
7 | "dev": "vite", | 9 | "dev": "vite", |
8 | - "build": "vite build && tsc --declaration --emitDeclarationOnly --noEmitOnError false", | 10 | + "build": "vite build&&tsc", |
9 | "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'", | 11 | "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'", |
10 | "lint-staged": "lint-staged", | 12 | "lint-staged": "lint-staged", |
11 | "test": "echo \"Error: no test specified\" && exit 1" | 13 | "test": "echo \"Error: no test specified\" && exit 1" |
@@ -25,11 +27,6 @@ | @@ -25,11 +27,6 @@ | ||
25 | "author": "juvenile <juvenile.business01@gmail.com>", | 27 | "author": "juvenile <juvenile.business01@gmail.com>", |
26 | "license": "MIT", | 28 | "license": "MIT", |
27 | "devDependencies": { | 29 | "devDependencies": { |
28 | - "@amap/amap-jsapi-loader": "^1.0.1", | ||
29 | - "@ant-design/icons": "^5.1.2", | ||
30 | - "@formily/antd-v5": "1.1.0-beta.3", | ||
31 | - "@formily/core": "^2.2.24", | ||
32 | - "@formily/react": "^2.2.24", | ||
33 | "@types/jquery": "^3.5.16", | 30 | "@types/jquery": "^3.5.16", |
34 | "@types/node": "^20.2.5", | 31 | "@types/node": "^20.2.5", |
35 | "@types/react": "^18.2.7", | 32 | "@types/react": "^18.2.7", |
@@ -37,7 +34,6 @@ | @@ -37,7 +34,6 @@ | ||
37 | "@typescript-eslint/eslint-plugin": "^5.59.7", | 34 | "@typescript-eslint/eslint-plugin": "^5.59.7", |
38 | "@typescript-eslint/parser": "^5.59.7", | 35 | "@typescript-eslint/parser": "^5.59.7", |
39 | "@vitejs/plugin-react": "^4.0.0", | 36 | "@vitejs/plugin-react": "^4.0.0", |
40 | - "antd": "^5.5.1", | ||
41 | "braft-editor": "^2.3.9", | 37 | "braft-editor": "^2.3.9", |
42 | "classnames": "^2.3.2", | 38 | "classnames": "^2.3.2", |
43 | "eslint": "^8.41.0", | 39 | "eslint": "^8.41.0", |
@@ -50,7 +46,7 @@ | @@ -50,7 +46,7 @@ | ||
50 | "lint-staged": "^13.2.2", | 46 | "lint-staged": "^13.2.2", |
51 | "moment": "^2.29.4", | 47 | "moment": "^2.29.4", |
52 | "prettier": "^2.8.8", | 48 | "prettier": "^2.8.8", |
53 | - "react-router-dom": "^6.11.2", | 49 | + "styled-components": "^5.3.11", |
54 | "stylelint": "^15.6.2", | 50 | "stylelint": "^15.6.2", |
55 | "stylelint-config-rational-order": "^0.1.2", | 51 | "stylelint-config-rational-order": "^0.1.2", |
56 | "stylelint-config-standard": "^33.0.0", | 52 | "stylelint-config-standard": "^33.0.0", |
@@ -61,8 +57,16 @@ | @@ -61,8 +57,16 @@ | ||
61 | "vite": "^4.3.9" | 57 | "vite": "^4.3.9" |
62 | }, | 58 | }, |
63 | "dependencies": { | 59 | "dependencies": { |
64 | - "react": "^18.2.0", | ||
65 | - "react-dom": "^18.2.0", | ||
66 | - "react-is": "^18.2.0" | 60 | + "@amap/amap-jsapi-loader": "^1.0.1", |
61 | + "@ant-design/icons": "^5.1.4", | ||
62 | + "@formily/antd-v5": "1.1.0-beta.3", | ||
63 | + "@formily/core": "^2.2.24", | ||
64 | + "@formily/react": "^2.2.24", | ||
65 | + "antd": "5.3.2", | ||
66 | + "father": "^4.2.2", | ||
67 | + "react": "^18.0.0", | ||
68 | + "react-dom": "^18.0.0", | ||
69 | + "react-is": "^18.2.0", | ||
70 | + "react-router-dom": "^6.0.2" | ||
67 | } | 71 | } |
68 | } | 72 | } |
packages/hr/bread_crumb/index.d.ts
已删除
100644 → 0
packages/hr/button_radio/index.d.ts
已删除
100644 → 0
1 | -import React from 'react'; | ||
2 | -import { ButtonProps } from 'antd'; | ||
3 | -import type { SpaceProps } from 'antd'; | ||
4 | -export interface ButtonRadioProps extends SpaceProps { | ||
5 | - className?: string; | ||
6 | - prefixCls?: string; | ||
7 | - buttonProps?: ButtonProps; | ||
8 | - onChange?: (value: any) => void; | ||
9 | - value?: any; | ||
10 | - [props: string]: any; | ||
11 | -} | ||
12 | -declare const ButtonRadio: React.FC<ButtonRadioProps>; | ||
13 | -export default ButtonRadio; |
packages/hr/form_modal/index.d.ts
已删除
100644 → 0
1 | -import React from 'react'; | ||
2 | -import { ModalProps } from 'antd'; | ||
3 | -interface Props extends ModalProps { | ||
4 | - handleOk?: (values: { | ||
5 | - [props: string]: string; | ||
6 | - }, e: React.MouseEvent<HTMLButtonElement>) => void; | ||
7 | - handleCancel?: (e: React.MouseEvent<HTMLButtonElement>) => void; | ||
8 | - initialValues?: { | ||
9 | - props?: string; | ||
10 | - }; | ||
11 | - open: boolean; | ||
12 | -} | ||
13 | -declare const FormModal: React.FC<Props>; | ||
14 | -export default FormModal; |
packages/hr/image/index.d.ts
已删除
100644 → 0
packages/hr/image/index.tsx
已删除
100644 → 0
1 | -import { ImageProps, Image as MyImage } from 'antd'; | ||
2 | - | ||
3 | -interface Props extends ImageProps { | ||
4 | - imgValues?: string[]; | ||
5 | - show_image?: boolean; | ||
6 | - setShowImage?: (value: any) => void; | ||
7 | -} | ||
8 | - | ||
9 | -const Image: React.FC<Props> = (props) => { | ||
10 | - const { src, style, preview, imgValues = [], show_image, setShowImage, ...args } = props; | ||
11 | - let my_preview = preview | ||
12 | - ? preview | ||
13 | - : { | ||
14 | - visible: show_image, | ||
15 | - src: src, | ||
16 | - }; | ||
17 | - | ||
18 | - return ( | ||
19 | - <> | ||
20 | - <MyImage | ||
21 | - width={200} | ||
22 | - style={style} | ||
23 | - src={src} | ||
24 | - preview={my_preview} | ||
25 | - {...args} | ||
26 | - onClick={() => setShowImage && setShowImage(!show_image)} | ||
27 | - /> | ||
28 | - <div style={{ display: 'none' }}> | ||
29 | - <MyImage.PreviewGroup | ||
30 | - preview={{ | ||
31 | - visible: show_image, | ||
32 | - onVisibleChange: (vis) => setShowImage && setShowImage(vis), | ||
33 | - }} | ||
34 | - > | ||
35 | - {imgValues.map((data: string, index: number) => ( | ||
36 | - <MyImage src={data} key={index} /> | ||
37 | - ))} | ||
38 | - </MyImage.PreviewGroup> | ||
39 | - </div> | ||
40 | - </> | ||
41 | - ); | ||
42 | -}; | ||
43 | - | ||
44 | -export default Image; |
packages/hr/map_select/index.d.ts
已删除
100644 → 0
packages/hr/modal_confirm/index.d.ts
已删除
100644 → 0
src/hr/App.d.ts
0 → 100644
@@ -2,7 +2,7 @@ import { useMemo } from 'react'; | @@ -2,7 +2,7 @@ import { useMemo } from 'react'; | ||
2 | import AddTags from '@/hr/add_tags'; | 2 | import AddTags from '@/hr/add_tags'; |
3 | import { FormProvider } from '@formily/react'; | 3 | import { FormProvider } from '@formily/react'; |
4 | import { createForm } from '@formily/core'; | 4 | import { createForm } from '@formily/core'; |
5 | -import SearchWrap from '@/hr/search/search'; | 5 | +import SearchWrap from '@/hr/search'; |
6 | import InputField from '@/hr/antd_input'; | 6 | import InputField from '@/hr/antd_input'; |
7 | 7 | ||
8 | const App = () => { | 8 | const App = () => { |
@@ -7,18 +7,19 @@ import { Field } from '@formily/react'; | @@ -7,18 +7,19 @@ import { Field } from '@formily/react'; | ||
7 | import { FieldProps } from '../typings'; | 7 | import { FieldProps } from '../typings'; |
8 | import { FormItem } from '@formily/antd-v5'; | 8 | import { FormItem } from '@formily/antd-v5'; |
9 | 9 | ||
10 | -interface Props { | 10 | +export interface TagProps extends FieldProps { |
11 | + name: string; | ||
12 | + title?: string; | ||
11 | initValues?: string[]; | 13 | initValues?: string[]; |
12 | - tag_text?: string; | ||
13 | - showValues?: boolean; | ||
14 | - onChange?: (value: string[]) => void; | ||
15 | - value?: string[]; | ||
16 | - maxLength?: number; | ||
17 | } | 14 | } |
18 | 15 | ||
19 | -export const AddTag = (props: Props) => { | ||
20 | - const { onChange, tag_text, showValues = true, value = [], maxLength = 0 } = props; | ||
21 | - | 16 | +export const TagComponent: React.FC<TagProps> = ({ |
17 | + onChange, | ||
18 | + tag_text, | ||
19 | + showValues = true, | ||
20 | + value = [], | ||
21 | + maxLength = 0, | ||
22 | +}) => { | ||
22 | const [inputVisible, setInputVisible] = useState(false); | 23 | const [inputVisible, setInputVisible] = useState(false); |
23 | const [inputValue, setInputValue] = useState(''); | 24 | const [inputValue, setInputValue] = useState(''); |
24 | const inputRef = useRef<InputRef>(null); | 25 | const inputRef = useRef<InputRef>(null); |
@@ -30,7 +31,7 @@ export const AddTag = (props: Props) => { | @@ -30,7 +31,7 @@ export const AddTag = (props: Props) => { | ||
30 | }, [inputVisible]); | 31 | }, [inputVisible]); |
31 | 32 | ||
32 | const handleClose = (removedTag: string) => { | 33 | const handleClose = (removedTag: string) => { |
33 | - const newTags = value?.filter((tag) => tag !== removedTag) || []; | 34 | + const newTags = value?.filter((tag: string) => tag !== removedTag) || []; |
34 | 35 | ||
35 | onChange && onChange([...newTags]); | 36 | onChange && onChange([...newTags]); |
36 | }; | 37 | }; |
@@ -56,7 +57,7 @@ export const AddTag = (props: Props) => { | @@ -56,7 +57,7 @@ export const AddTag = (props: Props) => { | ||
56 | {showValues && ( | 57 | {showValues && ( |
57 | <Space size={10} wrap> | 58 | <Space size={10} wrap> |
58 | {value && | 59 | {value && |
59 | - value.map((tag, index) => { | 60 | + value.map((tag: string, index: number) => { |
60 | const isLongTag = tag.length > 20; | 61 | const isLongTag = tag.length > 20; |
61 | const tagElem = ( | 62 | const tagElem = ( |
62 | <Tag | 63 | <Tag |
@@ -115,21 +116,20 @@ export const AddTag = (props: Props) => { | @@ -115,21 +116,20 @@ export const AddTag = (props: Props) => { | ||
115 | ); | 116 | ); |
116 | }; | 117 | }; |
117 | 118 | ||
118 | -interface AddTagsProps extends FieldProps { | ||
119 | - name: string; | ||
120 | - title?: string; | ||
121 | - initValues?: string[]; | ||
122 | -} | ||
123 | -const AddTags: React.FC<AddTagsProps> = (props) => { | ||
124 | - const { name, title, decoratorProps, componentProps, validator } = props; | ||
125 | - | 119 | +const AddTags: React.FC<TagProps> = ({ |
120 | + name, | ||
121 | + title, | ||
122 | + decoratorProps, | ||
123 | + componentProps, | ||
124 | + validator, | ||
125 | +}) => { | ||
126 | return ( | 126 | return ( |
127 | <Field | 127 | <Field |
128 | name={name} | 128 | name={name} |
129 | title={title} | 129 | title={title} |
130 | decorator={[FormItem, { ...decoratorProps }]} | 130 | decorator={[FormItem, { ...decoratorProps }]} |
131 | component={[ | 131 | component={[ |
132 | - AddTag, | 132 | + TagComponent, |
133 | { | 133 | { |
134 | ...componentProps, | 134 | ...componentProps, |
135 | }, | 135 | }, |
@@ -10,12 +10,11 @@ import { FormItem } from '@formily/antd-v5'; | @@ -10,12 +10,11 @@ import { FormItem } from '@formily/antd-v5'; | ||
10 | import { Field } from '@formily/react'; | 10 | import { Field } from '@formily/react'; |
11 | import { IFieldProps } from '@formily/core'; | 11 | import { IFieldProps } from '@formily/core'; |
12 | 12 | ||
13 | -interface Props extends BraftEditorProps { | 13 | +interface EditorProps extends BraftEditorProps { |
14 | contentStyle?: { [props: string]: string | number }; | 14 | contentStyle?: { [props: string]: string | number }; |
15 | changeEditor?: (editorState: EditorState) => void; | 15 | changeEditor?: (editorState: EditorState) => void; |
16 | } | 16 | } |
17 | - | ||
18 | -const Editor: React.FC<Props> = (props) => { | 17 | +const Editor: React.FC<EditorProps> = (props) => { |
19 | const { | 18 | const { |
20 | value = null, | 19 | value = null, |
21 | changeEditor, | 20 | changeEditor, |
@@ -60,7 +59,7 @@ const Editor: React.FC<Props> = (props) => { | @@ -60,7 +59,7 @@ const Editor: React.FC<Props> = (props) => { | ||
60 | ); | 59 | ); |
61 | }; | 60 | }; |
62 | 61 | ||
63 | -interface P extends IFieldProps { | 62 | +export interface BraftDeitorProps extends IFieldProps { |
64 | name: string | [string, string]; | 63 | name: string | [string, string]; |
65 | title?: string | ReactElement; | 64 | title?: string | ReactElement; |
66 | validator?: any; | 65 | validator?: any; |
@@ -73,7 +72,7 @@ interface P extends IFieldProps { | @@ -73,7 +72,7 @@ interface P extends IFieldProps { | ||
73 | }; | 72 | }; |
74 | } | 73 | } |
75 | 74 | ||
76 | -const BraftDeitor: React.FC<P> = (props) => { | 75 | +const BraftDeitor: React.FC<BraftDeitorProps> = (props) => { |
77 | const { name, title, validator, decoratorProps, componentProps } = props; | 76 | const { name, title, validator, decoratorProps, componentProps } = props; |
78 | 77 | ||
79 | return ( | 78 | return ( |
@@ -3,16 +3,14 @@ import { Breadcrumb as MyBreadcrumb } from 'antd'; | @@ -3,16 +3,14 @@ import { Breadcrumb as MyBreadcrumb } from 'antd'; | ||
3 | import { ItemType } from 'antd/lib/breadcrumb/Breadcrumb'; | 3 | import { ItemType } from 'antd/lib/breadcrumb/Breadcrumb'; |
4 | import './bread.less'; | 4 | import './bread.less'; |
5 | 5 | ||
6 | -interface P { | 6 | +export interface BreadcrumbProps { |
7 | separator?: string; | 7 | separator?: string; |
8 | items: ItemType[]; | 8 | items: ItemType[]; |
9 | } | 9 | } |
10 | 10 | ||
11 | -const Breadcrumb: React.FC<P> = (props) => { | ||
12 | - const { separator = '>', items = [] } = props; | ||
13 | - | 11 | +const Breadcrumb: React.FC<BreadcrumbProps> = ({ separator = '>', items = [] }) => { |
14 | return ( | 12 | return ( |
15 | - <div className={'bread_warp'}> | 13 | + <div className="breadcrumb-wrapper"> |
16 | <MyBreadcrumb separator={separator} items={items} /> | 14 | <MyBreadcrumb separator={separator} items={items} /> |
17 | </div> | 15 | </div> |
18 | ); | 16 | ); |
1 | import React from 'react'; | 1 | import React from 'react'; |
2 | import { Button, Space, ButtonProps } from 'antd'; | 2 | import { Button, Space, ButtonProps } from 'antd'; |
3 | import type { SpaceProps } from 'antd'; | 3 | import type { SpaceProps } from 'antd'; |
4 | + | ||
5 | +interface OptionType { | ||
6 | + value: any; | ||
7 | + label: | ||
8 | + | string | ||
9 | + | number | ||
10 | + | boolean | ||
11 | + | React.ReactElement | ||
12 | + | React.ReactFragment | ||
13 | + | React.ReactPortal | ||
14 | + | null | ||
15 | + | undefined; | ||
16 | +} | ||
17 | + | ||
4 | export interface ButtonRadioProps extends SpaceProps { | 18 | export interface ButtonRadioProps extends SpaceProps { |
5 | className?: string; | 19 | className?: string; |
6 | prefixCls?: string; | 20 | prefixCls?: string; |
7 | buttonProps?: ButtonProps; | 21 | buttonProps?: ButtonProps; |
8 | onChange?: (value: any) => void; | 22 | onChange?: (value: any) => void; |
9 | value?: any; | 23 | value?: any; |
10 | - [props: string]: any; | 24 | + options?: OptionType[]; |
11 | } | 25 | } |
12 | 26 | ||
13 | -const ButtonRadio: React.FC<ButtonRadioProps> = (props) => { | ||
14 | - const { options = [], buttonProps = {}, value, onChange } = props; | ||
15 | - | 27 | +const ButtonRadio: React.FC<ButtonRadioProps> = ({ |
28 | + options = [], | ||
29 | + buttonProps = {}, | ||
30 | + value, | ||
31 | + onChange, | ||
32 | + ...restProps | ||
33 | +}) => { | ||
16 | return ( | 34 | return ( |
17 | - <Space {...props}> | ||
18 | - {options.map( | ||
19 | - ( | ||
20 | - option: { | ||
21 | - value: any; | ||
22 | - label: | ||
23 | - | string | ||
24 | - | number | ||
25 | - | boolean | ||
26 | - | React.ReactElement<any, string | React.JSXElementConstructor<any>> | ||
27 | - | React.ReactFragment | ||
28 | - | React.ReactPortal | ||
29 | - | null | ||
30 | - | undefined; | ||
31 | - }, | ||
32 | - i: React.Key | null | undefined, | ||
33 | - ) => { | ||
34 | - const type = option.value === value ? 'primary' : 'default'; | ||
35 | - return ( | ||
36 | - <Button | ||
37 | - key={i} | ||
38 | - {...buttonProps} | ||
39 | - type={type} | ||
40 | - onClick={() => { | ||
41 | - onChange && onChange(option.value); | ||
42 | - }} | ||
43 | - > | ||
44 | - {option.label} | ||
45 | - </Button> | ||
46 | - ); | ||
47 | - }, | ||
48 | - )} | 35 | + <Space {...restProps}> |
36 | + {options.map((option, i) => { | ||
37 | + const type = option.value === value ? 'primary' : 'default'; | ||
38 | + return ( | ||
39 | + <Button | ||
40 | + key={i} | ||
41 | + {...buttonProps} | ||
42 | + type={type} | ||
43 | + onClick={() => { | ||
44 | + onChange && onChange(option.value); | ||
45 | + }} | ||
46 | + > | ||
47 | + {option.label} | ||
48 | + </Button> | ||
49 | + ); | ||
50 | + })} | ||
49 | </Space> | 51 | </Space> |
50 | ); | 52 | ); |
51 | }; | 53 | }; |
@@ -3,46 +3,36 @@ import { Modal, ModalProps } from 'antd'; | @@ -3,46 +3,36 @@ import { Modal, ModalProps } from 'antd'; | ||
3 | import { FormProvider } from '@formily/react'; | 3 | import { FormProvider } from '@formily/react'; |
4 | import { createForm } from '@formily/core'; | 4 | import { createForm } from '@formily/core'; |
5 | 5 | ||
6 | -interface Props extends ModalProps { | 6 | +export interface FormModalProps extends ModalProps { |
7 | handleOk?: (values: { [props: string]: string }, e: React.MouseEvent<HTMLButtonElement>) => void; | 7 | handleOk?: (values: { [props: string]: string }, e: React.MouseEvent<HTMLButtonElement>) => void; |
8 | handleCancel?: (e: React.MouseEvent<HTMLButtonElement>) => void; | 8 | handleCancel?: (e: React.MouseEvent<HTMLButtonElement>) => void; |
9 | initialValues?: { props?: string }; | 9 | initialValues?: { props?: string }; |
10 | open: boolean; | 10 | open: boolean; |
11 | } | 11 | } |
12 | 12 | ||
13 | -const FormModal: React.FC<Props> = (props) => { | 13 | +const FormModal: React.FC<FormModalProps> = ({ |
14 | + initialValues, | ||
15 | + title = '我是弹框标题', | ||
16 | + handleOk, | ||
17 | + handleCancel, | ||
18 | + children, | ||
19 | + open, | ||
20 | + ...args | ||
21 | +}) => { | ||
14 | const form = createForm(); | 22 | const form = createForm(); |
15 | - const { | ||
16 | - initialValues, | ||
17 | - title = '我是弹框标题', | ||
18 | - handleOk, | ||
19 | - handleCancel, | ||
20 | - children = [], | ||
21 | - open, | ||
22 | - ...args | ||
23 | - } = props; | ||
24 | - const items = React.Children.toArray(children); | ||
25 | 23 | ||
26 | useEffect(() => { | 24 | useEffect(() => { |
27 | form.setInitialValues(initialValues); | 25 | form.setInitialValues(initialValues); |
28 | - }); | 26 | + }, [initialValues]); |
29 | 27 | ||
30 | const onOK = (e: React.MouseEvent<HTMLButtonElement>) => { | 28 | const onOK = (e: React.MouseEvent<HTMLButtonElement>) => { |
31 | - if (handleOk) { | ||
32 | - form.submit().then((values: any) => { | ||
33 | - handleOk(values, e); | ||
34 | - }); | ||
35 | - | ||
36 | - return; | ||
37 | - } | 29 | + form.submit().then((values: any) => { |
30 | + handleOk && handleOk(values, e); | ||
31 | + }); | ||
38 | }; | 32 | }; |
39 | 33 | ||
40 | const onCancel = (e: React.MouseEvent<HTMLButtonElement>) => { | 34 | const onCancel = (e: React.MouseEvent<HTMLButtonElement>) => { |
41 | - if (handleCancel) { | ||
42 | - handleCancel(e); | ||
43 | - | ||
44 | - return; | ||
45 | - } | 35 | + handleCancel && handleCancel(e); |
46 | }; | 36 | }; |
47 | 37 | ||
48 | return ( | 38 | return ( |
@@ -56,7 +46,7 @@ const FormModal: React.FC<Props> = (props) => { | @@ -56,7 +46,7 @@ const FormModal: React.FC<Props> = (props) => { | ||
56 | {...args} | 46 | {...args} |
57 | getContainer={false} | 47 | getContainer={false} |
58 | > | 48 | > |
59 | - <FormProvider form={form}>{React.Children.map(items, (item: any) => item)}</FormProvider> | 49 | + <FormProvider form={form}>{React.Children.map(children, (item) => item)}</FormProvider> |
60 | </Modal> | 50 | </Modal> |
61 | ); | 51 | ); |
62 | }; | 52 | }; |
src/hr/image/index.tsx
0 → 100644
1 | +import { ImageProps, Image as AntdImage } from 'antd'; | ||
2 | + | ||
3 | +export interface ImageComponentProps extends ImageProps { | ||
4 | + imageSources?: string[]; | ||
5 | + showImage?: boolean; | ||
6 | + toggleImageVisibility?: (value: any) => void; | ||
7 | +} | ||
8 | + | ||
9 | +const ImageComponent: React.FC<ImageComponentProps> = ({ | ||
10 | + src, | ||
11 | + style, | ||
12 | + preview, | ||
13 | + imageSources = [], | ||
14 | + showImage, | ||
15 | + toggleImageVisibility, | ||
16 | + ...args | ||
17 | +}) => { | ||
18 | + let myPreview = preview | ||
19 | + ? preview | ||
20 | + : { | ||
21 | + visible: showImage, | ||
22 | + src: src, | ||
23 | + }; | ||
24 | + | ||
25 | + return ( | ||
26 | + <> | ||
27 | + <AntdImage | ||
28 | + width={200} | ||
29 | + style={style} | ||
30 | + src={src} | ||
31 | + preview={myPreview} | ||
32 | + {...args} | ||
33 | + onClick={() => toggleImageVisibility && toggleImageVisibility(!showImage)} | ||
34 | + /> | ||
35 | + <div style={{ display: 'none' }}> | ||
36 | + <AntdImage.PreviewGroup | ||
37 | + preview={{ | ||
38 | + visible: showImage, | ||
39 | + onVisibleChange: (vis) => toggleImageVisibility && toggleImageVisibility(vis), | ||
40 | + }} | ||
41 | + > | ||
42 | + {imageSources.map((data: string, index: number) => ( | ||
43 | + <AntdImage src={data} key={index} /> | ||
44 | + ))} | ||
45 | + </AntdImage.PreviewGroup> | ||
46 | + </div> | ||
47 | + </> | ||
48 | + ); | ||
49 | +}; | ||
50 | + | ||
51 | +export default ImageComponent; |
1 | import { Modal, ModalFuncProps } from 'antd'; | 1 | import { Modal, ModalFuncProps } from 'antd'; |
2 | import { ExclamationCircleFilled } from '@ant-design/icons'; | 2 | import { ExclamationCircleFilled } from '@ant-design/icons'; |
3 | -const { confirm } = Modal; | ||
4 | 3 | ||
5 | -const showPropsConfirm = (props: ModalFuncProps) => { | ||
6 | - const { title, icon, content, okText, okType, okButtonProps, cancelText, onOk, onCancel } = props; | 4 | +const { confirm } = Modal; |
7 | 5 | ||
6 | +const showPropsConfirm = ({ | ||
7 | + title, | ||
8 | + icon, | ||
9 | + content, | ||
10 | + okText, | ||
11 | + okType, | ||
12 | + okButtonProps, | ||
13 | + cancelText, | ||
14 | + onOk, | ||
15 | + onCancel, | ||
16 | +}: ModalFuncProps) => { | ||
8 | confirm({ | 17 | confirm({ |
9 | title: title, | 18 | title: title, |
10 | icon: icon || <ExclamationCircleFilled />, | 19 | icon: icon || <ExclamationCircleFilled />, |
1 | import { Pagination } from 'antd'; | 1 | import { Pagination } from 'antd'; |
2 | 2 | ||
3 | -interface paginationProps { | ||
4 | - [props: string]: any; | ||
5 | - onChange: Function; | 3 | +interface PaginationValues { |
4 | + offset: number; | ||
5 | + limit: number; | ||
6 | + total_count: number; | ||
6 | } | 7 | } |
7 | 8 | ||
8 | -const PaginationWrap = (props: paginationProps) => { | 9 | +export interface PaginationProps { |
10 | + pagination: PaginationValues; | ||
11 | + changePagination: (pagination: PaginationValues) => void; | ||
12 | + onChange: (pagination: PaginationValues) => void; | ||
13 | +} | ||
14 | + | ||
15 | +const PaginationWrap = (props: PaginationProps) => { | ||
9 | const { pagination, changePagination, onChange, ...rest } = props; | 16 | const { pagination, changePagination, onChange, ...rest } = props; |
10 | 17 | ||
11 | const { offset, limit = 10, total_count } = pagination; | 18 | const { offset, limit = 10, total_count } = pagination; |
12 | 19 | ||
13 | // 分页改变 | 20 | // 分页改变 |
14 | const onPaginationChange = (page: number, limit: number) => { | 21 | const onPaginationChange = (page: number, limit: number) => { |
15 | - changePagination({ | 22 | + const newPagination = { |
16 | ...pagination, | 23 | ...pagination, |
17 | offset: (page - 1) * (limit || 10), | 24 | offset: (page - 1) * (limit || 10), |
18 | limit: limit, | 25 | limit: limit, |
19 | - }); | ||
20 | - onChange({ | ||
21 | - offset: (page - 1) * (limit || 10), | ||
22 | - limit: limit, | ||
23 | - }); | 26 | + }; |
27 | + | ||
28 | + changePagination(newPagination); | ||
29 | + onChange(newPagination); | ||
24 | }; | 30 | }; |
25 | 31 | ||
26 | return ( | 32 | return ( |
@@ -35,7 +41,6 @@ const PaginationWrap = (props: paginationProps) => { | @@ -35,7 +41,6 @@ const PaginationWrap = (props: paginationProps) => { | ||
35 | onPaginationChange(page, pageSize); | 41 | onPaginationChange(page, pageSize); |
36 | }} | 42 | }} |
37 | {...rest} | 43 | {...rest} |
38 | - // pageSizeOptions={['10', '25', '50', '100']} | ||
39 | /> | 44 | /> |
40 | ); | 45 | ); |
41 | }; | 46 | }; |
1 | -import { ReactElement, useEffect, useMemo, useState } from 'react'; | 1 | +import { ReactElement, useCallback, useEffect, useMemo, useState } from 'react'; |
2 | import { Space, Button, Tooltip, Tag } from 'antd'; | 2 | import { Space, Button, Tooltip, Tag } from 'antd'; |
3 | import './index.less'; | 3 | import './index.less'; |
4 | import { FormProvider, VoidField } from '@formily/react'; | 4 | import { FormProvider, VoidField } from '@formily/react'; |
5 | -import { createForm, onFieldValueChange, Field } from '@formily/core'; | 5 | +import { createForm, onFieldValueChange, Field, FormPath } from '@formily/core'; |
6 | import { ossAddress } from '@/utils/ossAddress'; | 6 | import { ossAddress } from '@/utils/ossAddress'; |
7 | import { useDebounce } from '@/utils/format'; | 7 | import { useDebounce } from '@/utils/format'; |
8 | import moment from 'moment'; | 8 | import moment from 'moment'; |
9 | + | ||
10 | +// Avoid magic numbers | ||
11 | +const MAX_COMPONENTS = 6; | ||
12 | +const DEBOUNCE_DELAY = 800; | ||
13 | + | ||
9 | export interface SearchWrapProps { | 14 | export interface SearchWrapProps { |
10 | leftSectionComponents?: ReactElement[]; | 15 | leftSectionComponents?: ReactElement[]; |
11 | searchInput?: ReactElement; | 16 | searchInput?: ReactElement; |
@@ -15,17 +20,32 @@ export interface SearchWrapProps { | @@ -15,17 +20,32 @@ export interface SearchWrapProps { | ||
15 | moreCategories?: Boolean; | 20 | moreCategories?: Boolean; |
16 | ProForm?: any; | 21 | ProForm?: any; |
17 | } | 22 | } |
18 | - | 23 | +type FormPathPattern = |
24 | + | string | ||
25 | + | number | ||
26 | + | Array<string | number> | ||
27 | + | FormPath | ||
28 | + | RegExp | ||
29 | + | (((address: Array<string | number>) => boolean) & { | ||
30 | + path: FormPath; | ||
31 | + }); | ||
19 | interface SearchChooseProps { | 32 | interface SearchChooseProps { |
20 | name: string; | 33 | name: string; |
21 | title: string; | 34 | title: string; |
22 | value: string; | 35 | value: string; |
23 | - path: any; | 36 | + path: FormPathPattern; |
24 | address: any; | 37 | address: any; |
25 | } | 38 | } |
26 | 39 | ||
27 | -const _getValueLable = (field: Field) => { | ||
28 | - const { title, value, dataSource, props, path, address, componentProps } = field; | 40 | +const getValueLable = ({ |
41 | + title, | ||
42 | + value, | ||
43 | + dataSource, | ||
44 | + props, | ||
45 | + path, | ||
46 | + address, | ||
47 | + componentProps, | ||
48 | +}: Field) => { | ||
29 | const { name } = props; | 49 | const { name } = props; |
30 | 50 | ||
31 | const { componenttypename, format } = componentProps; | 51 | const { componenttypename, format } = componentProps; |
@@ -35,6 +55,7 @@ const _getValueLable = (field: Field) => { | @@ -35,6 +55,7 @@ const _getValueLable = (field: Field) => { | ||
35 | address, | 55 | address, |
36 | title: title ? title : '', | 56 | title: title ? title : '', |
37 | }; | 57 | }; |
58 | + | ||
38 | const getValue = (key: any) => { | 59 | const getValue = (key: any) => { |
39 | const dataSourceMap: Record<string, string> = {}; | 60 | const dataSourceMap: Record<string, string> = {}; |
40 | dataSource.map((item) => { | 61 | dataSource.map((item) => { |
@@ -44,6 +65,7 @@ const _getValueLable = (field: Field) => { | @@ -44,6 +65,7 @@ const _getValueLable = (field: Field) => { | ||
44 | }); | 65 | }); |
45 | return dataSourceMap[key]; | 66 | return dataSourceMap[key]; |
46 | }; | 67 | }; |
68 | + | ||
47 | switch (componenttypename) { | 69 | switch (componenttypename) { |
48 | case 'Radio.Group': | 70 | case 'Radio.Group': |
49 | labelMap.value = getValue(value); | 71 | labelMap.value = getValue(value); |
@@ -87,12 +109,12 @@ const _getValueLable = (field: Field) => { | @@ -87,12 +109,12 @@ const _getValueLable = (field: Field) => { | ||
87 | return labelMap; | 109 | return labelMap; |
88 | }; | 110 | }; |
89 | 111 | ||
90 | -const _getPopupValuesLabel = (field: any, searchLabels: SearchChooseProps[]) => { | 112 | +const getPopupValuesLabel = (field: any, searchLabels: SearchChooseProps[]) => { |
91 | const { props } = field; | 113 | const { props } = field; |
92 | const { name } = props; | 114 | const { name } = props; |
93 | 115 | ||
94 | const searchLableMap: any = {}; | 116 | const searchLableMap: any = {}; |
95 | - const changeLabel = _getValueLable(field); | 117 | + const changeLabel = getValueLable(field); |
96 | if (searchLabels.length > 0) { | 118 | if (searchLabels.length > 0) { |
97 | searchLabels.map((label) => { | 119 | searchLabels.map((label) => { |
98 | if (name == label.name) { | 120 | if (name == label.name) { |
@@ -110,7 +132,7 @@ const _getPopupValuesLabel = (field: any, searchLabels: SearchChooseProps[]) => | @@ -110,7 +132,7 @@ const _getPopupValuesLabel = (field: any, searchLabels: SearchChooseProps[]) => | ||
110 | searchLableMap[name] = changeLabel; | 132 | searchLableMap[name] = changeLabel; |
111 | } | 133 | } |
112 | return searchLableMap; | 134 | return searchLableMap; |
113 | -}; | 135 | +} |
114 | 136 | ||
115 | const SearchWrap: React.FC<SearchWrapProps> = (props) => { | 137 | const SearchWrap: React.FC<SearchWrapProps> = (props) => { |
116 | const { | 138 | const { |
@@ -129,7 +151,7 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | @@ -129,7 +151,7 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | ||
129 | const [centerWidth, setCenterWidth] = useState<number>(0); | 151 | const [centerWidth, setCenterWidth] = useState<number>(0); |
130 | const valueChange = useDebounce((value: any) => { | 152 | const valueChange = useDebounce((value: any) => { |
131 | searchChange && searchChange(value); | 153 | searchChange && searchChange(value); |
132 | - }, 800); | 154 | + }, DEBOUNCE_DELAY); |
133 | 155 | ||
134 | const form = ProForm ? ProForm : useMemo(() => createForm(), []); | 156 | const form = ProForm ? ProForm : useMemo(() => createForm(), []); |
135 | 157 | ||
@@ -140,7 +162,7 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | @@ -140,7 +162,7 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | ||
140 | }, [searchLabels]); | 162 | }, [searchLabels]); |
141 | 163 | ||
142 | useEffect(() => { | 164 | useEffect(() => { |
143 | - form.addEffects('popup_search', () => { | 165 | + const removeEffects = form.addEffects('popup_search', () => { |
144 | onFieldValueChange('*', (field) => { | 166 | onFieldValueChange('*', (field) => { |
145 | const { | 167 | const { |
146 | address: { entire = '' }, | 168 | address: { entire = '' }, |
@@ -150,13 +172,16 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | @@ -150,13 +172,16 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | ||
150 | } | 172 | } |
151 | if ((entire as string).indexOf('popup') > -1) { | 173 | if ((entire as string).indexOf('popup') > -1) { |
152 | setSearchLabels((searchLabels) => { | 174 | setSearchLabels((searchLabels) => { |
153 | - const labelValues = _getPopupValuesLabel(field, searchLabels); | 175 | + const labelValues = getPopupValuesLabel(field, searchLabels); |
154 | 176 | ||
155 | return Object.values(labelValues); | 177 | return Object.values(labelValues); |
156 | }); | 178 | }); |
157 | } | 179 | } |
158 | }); | 180 | }); |
159 | }); | 181 | }); |
182 | + return () => { | ||
183 | + form.removeEffects(removeEffects); | ||
184 | + }; | ||
160 | }, [ProForm]); | 185 | }, [ProForm]); |
161 | 186 | ||
162 | useEffect(() => { | 187 | useEffect(() => { |
@@ -176,14 +201,14 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | @@ -176,14 +201,14 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | ||
176 | setOpen(!open); | 201 | setOpen(!open); |
177 | }; | 202 | }; |
178 | 203 | ||
179 | - const submit = () => { | 204 | + const submit = useCallback(() => { |
180 | const { values: allValue } = form; | 205 | const { values: allValue } = form; |
181 | searchChange && searchChange(allValue); | 206 | searchChange && searchChange(allValue); |
182 | togglePopup(); | 207 | togglePopup(); |
183 | setShowPopupValue(true); | 208 | setShowPopupValue(true); |
184 | - }; | 209 | + }, []); |
185 | 210 | ||
186 | - const closeLabel = (label: SearchChooseProps) => { | 211 | + const closeLabel = useCallback((label: SearchChooseProps) => { |
187 | const { path } = label; | 212 | const { path } = label; |
188 | const field = form.query(path).take(); | 213 | const field = form.query(path).take(); |
189 | if (field && field.setValue) { | 214 | if (field && field.setValue) { |
@@ -191,16 +216,16 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | @@ -191,16 +216,16 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | ||
191 | } | 216 | } |
192 | const { values: allValue } = form; | 217 | const { values: allValue } = form; |
193 | searchChange && searchChange(allValue); | 218 | searchChange && searchChange(allValue); |
194 | - }; | 219 | + }, []); |
195 | 220 | ||
196 | - const handleCancle = () => { | 221 | + const handleCancle = useCallback(() => { |
197 | form.reset('popup.*'); | 222 | form.reset('popup.*'); |
198 | const { values: allValue } = form; | 223 | const { values: allValue } = form; |
199 | searchChange && searchChange(allValue); | 224 | searchChange && searchChange(allValue); |
200 | togglePopup(); | 225 | togglePopup(); |
201 | - }; | 226 | + }, []); |
202 | 227 | ||
203 | - const text = () => { | 228 | + const text = useCallback(() => { |
204 | return ( | 229 | return ( |
205 | <div> | 230 | <div> |
206 | <VoidField name="popup"> | 231 | <VoidField name="popup"> |
@@ -217,16 +242,16 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | @@ -217,16 +242,16 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | ||
217 | </div> | 242 | </div> |
218 | </div> | 243 | </div> |
219 | ); | 244 | ); |
220 | - }; | 245 | + }, [popupContent]); |
221 | 246 | ||
222 | - const labels = () => { | 247 | + const labels = useCallback(() => { |
223 | // 左边显示操作6个搜索条件 | 248 | // 左边显示操作6个搜索条件 |
224 | const len = (leftSectionComponents && leftSectionComponents.length - 1) || 0; | 249 | const len = (leftSectionComponents && leftSectionComponents.length - 1) || 0; |
225 | return ( | 250 | return ( |
226 | <div style={{ width: centerWidth, overflow: 'hidden' }}> | 251 | <div style={{ width: centerWidth, overflow: 'hidden' }}> |
227 | {showPopupValue && | 252 | {showPopupValue && |
228 | searchLabels && | 253 | searchLabels && |
229 | - searchLabels.slice(0, 6 - len).map((item, index) => { | 254 | + searchLabels.slice(0, MAX_COMPONENTS - len).map((item) => { |
230 | return ( | 255 | return ( |
231 | <Tag key={item.name} closable onClose={() => closeLabel(item)}> | 256 | <Tag key={item.name} closable onClose={() => closeLabel(item)}> |
232 | {item.value} | 257 | {item.value} |
@@ -235,14 +260,14 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | @@ -235,14 +260,14 @@ const SearchWrap: React.FC<SearchWrapProps> = (props) => { | ||
235 | })} | 260 | })} |
236 | </div> | 261 | </div> |
237 | ); | 262 | ); |
238 | - }; | 263 | + }, [showPopupValue, centerWidth]); |
239 | 264 | ||
240 | return ( | 265 | return ( |
241 | <FormProvider form={form}> | 266 | <FormProvider form={form}> |
242 | <div className="search-component"> | 267 | <div className="search-component"> |
243 | <Space className="left-section"> | 268 | <Space className="left-section"> |
244 | - {leftSectionComponents.slice(0, 6).map((component, index) => ( | ||
245 | - <div key={index} className="left-section-component"> | 269 | + {leftSectionComponents.slice(0, MAX_COMPONENTS).map((component) => ( |
270 | + <div key={component.key || component.props.id} className="left-section-component"> | ||
246 | {component} | 271 | {component} |
247 | </div> | 272 | </div> |
248 | ))} | 273 | ))} |
@@ -10,7 +10,7 @@ export interface tableProps extends TableProps<Record<string, number>> { | @@ -10,7 +10,7 @@ export interface tableProps extends TableProps<Record<string, number>> { | ||
10 | } | 10 | } |
11 | 11 | ||
12 | export const dealNumber = (val: number) => { | 12 | export const dealNumber = (val: number) => { |
13 | - if (val && val != null) { | 13 | + if (val || val === 0) { |
14 | let money = String(val); | 14 | let money = String(val); |
15 | let left = money.split('.')[0], | 15 | let left = money.split('.')[0], |
16 | right = money.split('.')[1]; | 16 | right = money.split('.')[1]; |
@@ -19,10 +19,8 @@ export const dealNumber = (val: number) => { | @@ -19,10 +19,8 @@ export const dealNumber = (val: number) => { | ||
19 | .split('') | 19 | .split('') |
20 | .reverse() | 20 | .reverse() |
21 | .join('') | 21 | .join('') |
22 | - .match(/(\d{1,3})/g); // 将字符串顺序反转 :字符串-->数组 --> 顺序反转-->字符串 | ||
23 | - return (Number(money) < 0 ? '-' : '') + temp.join(',').split('').reverse().join('') + right; | ||
24 | - } else if (val === 0) { | ||
25 | - return '0.00'; | 22 | + .match(/(\d{1,3})/g); |
23 | + return `${Number(money) < 0 ? '-' : ''}${temp.join(',').split('').reverse().join('')}${right}`; | ||
26 | } else { | 24 | } else { |
27 | return ''; | 25 | return ''; |
28 | } | 26 | } |
@@ -31,9 +29,11 @@ export const dealNumber = (val: number) => { | @@ -31,9 +29,11 @@ export const dealNumber = (val: number) => { | ||
31 | const TableWrap: React.FC<tableProps> = (props) => { | 29 | const TableWrap: React.FC<tableProps> = (props) => { |
32 | const { tableHeader, columns, scroll } = props; | 30 | const { tableHeader, columns, scroll } = props; |
33 | const [newScroll, setNewScroll] = useState<any>(0); | 31 | const [newScroll, setNewScroll] = useState<any>(0); |
34 | - const [tableColumns, setTableColumns] = useState<any>([]); | 32 | + const [tableColumns, setTableColumns] = useState<TableProps<Record<string, number>>['columns']>( |
33 | + [], | ||
34 | + ); | ||
35 | 35 | ||
36 | - const sex = { | 36 | + const sex: Record<string, string> = { |
37 | '1': '男', | 37 | '1': '男', |
38 | '2': '女', | 38 | '2': '女', |
39 | }; | 39 | }; |
@@ -52,7 +52,7 @@ const TableWrap: React.FC<tableProps> = (props) => { | @@ -52,7 +52,7 @@ const TableWrap: React.FC<tableProps> = (props) => { | ||
52 | 52 | ||
53 | useEffect(() => { | 53 | useEffect(() => { |
54 | let calculateScroll = 0; | 54 | let calculateScroll = 0; |
55 | - columns?.map((item: any) => { | 55 | + const newColumns = columns?.map((item: any) => { |
56 | // 处理attr | 56 | // 处理attr |
57 | if (item.attr) { | 57 | if (item.attr) { |
58 | handleAttr(item); | 58 | handleAttr(item); |
@@ -61,9 +61,11 @@ const TableWrap: React.FC<tableProps> = (props) => { | @@ -61,9 +61,11 @@ const TableWrap: React.FC<tableProps> = (props) => { | ||
61 | item.ellipsis = true; | 61 | item.ellipsis = true; |
62 | // 计算scroll | 62 | // 计算scroll |
63 | if (item.width) calculateScroll += item.width; | 63 | if (item.width) calculateScroll += item.width; |
64 | + | ||
65 | + return item; | ||
64 | }); | 66 | }); |
65 | 67 | ||
66 | - setTableColumns(columns); | 68 | + setTableColumns(newColumns); |
67 | setNewScroll(calculateScroll); | 69 | setNewScroll(calculateScroll); |
68 | }, [columns]); | 70 | }, [columns]); |
69 | 71 |
1 | - | ||
2 | -import { Tabs as MyTabs } from 'antd'; | 1 | +import { Tabs as MyTabs, TabPaneProps } from 'antd'; |
3 | import { TabsProps } from 'antd/lib/Tabs'; | 2 | import { TabsProps } from 'antd/lib/Tabs'; |
4 | import './tabs.less'; | 3 | import './tabs.less'; |
5 | 4 | ||
6 | -const Tabs: React.FC<TabsProps> = (props) => { | 5 | +export interface Tab extends Omit<TabPaneProps, 'tab'> { |
6 | + key: string; | ||
7 | + label: React.ReactNode; | ||
8 | +} | ||
9 | + | ||
10 | +export interface MyTabsProps extends TabsProps { | ||
11 | + items?: Tab[]; | ||
12 | +} | ||
13 | + | ||
14 | +const Tabs: React.FC<MyTabsProps> = (props) => { | ||
7 | const { defaultActiveKey, items = [], ...other } = props; | 15 | const { defaultActiveKey, items = [], ...other } = props; |
8 | - const defaultKey = defaultActiveKey || items[0].key; | 16 | + const defaultKey = items.length > 0 ? defaultActiveKey || items[0].key : undefined; |
9 | 17 | ||
10 | return ( | 18 | return ( |
11 | <div className={'tabs_warp'}> | 19 | <div className={'tabs_warp'}> |
12 | - <MyTabs defaultActiveKey={defaultKey} items={items} {...other} /> | 20 | + <MyTabs defaultActiveKey={defaultKey} {...other} /> |
13 | </div> | 21 | </div> |
14 | ); | 22 | ); |
15 | }; | 23 | }; |
1 | import { ReactElement } from 'react'; | 1 | import { ReactElement } from 'react'; |
2 | - | ||
3 | export interface FieldProps { | 2 | export interface FieldProps { |
4 | - name: string | [string, string]; | ||
5 | - title?: string | ReactElement; | ||
6 | - validator?: any; | ||
7 | - [props: string]: any; | ||
8 | - decoratorProps?: { | 3 | + name: string | [string, string]; |
4 | + title?: string | ReactElement; | ||
5 | + validator?: any; | ||
9 | [props: string]: any; | 6 | [props: string]: any; |
10 | - }; | ||
11 | - componentProps?: { | ||
12 | - [props: string]: any; | ||
13 | - }; | 7 | + decoratorProps?: { |
8 | + [props: string]: any; | ||
9 | + }; | ||
10 | + componentProps?: { | ||
11 | + [props: string]: any; | ||
12 | + }; | ||
14 | } | 13 | } |
1 | -import React, { ReactElement } from 'react'; | ||
2 | -import 'braft-editor/dist/index.css'; | ||
3 | -import './index.less'; | ||
4 | -import { IFieldProps } from '@formily/core'; | ||
5 | -interface P extends IFieldProps { | ||
6 | - name: string | [string, string]; | ||
7 | - title?: string | ReactElement; | ||
8 | - validator?: any; | 1 | +import { ReactElement } from 'react'; |
2 | + | ||
3 | +export interface FieldProps { | ||
4 | + name: string | [string, string]; | ||
5 | + title?: string | ReactElement; | ||
6 | + validator?: any; | ||
7 | + [props: string]: any; | ||
8 | + decoratorProps?: { | ||
9 | [props: string]: any; | 9 | [props: string]: any; |
10 | - decoratorProps?: { | ||
11 | - [props: string]: any; | ||
12 | - }; | ||
13 | - componentProps?: { | ||
14 | - [props: string]: any; | ||
15 | - }; | 10 | + }; |
11 | + componentProps?: { | ||
12 | + [props: string]: any; | ||
13 | + }; | ||
16 | } | 14 | } |
17 | -declare const BraftDeitor: React.FC<P>; | ||
18 | -export default BraftDeitor; |
@@ -5,7 +5,7 @@ import { UploadFile, UploadListType, UploadProps } from 'antd/lib/upload/interfa | @@ -5,7 +5,7 @@ import { UploadFile, UploadListType, UploadProps } from 'antd/lib/upload/interfa | ||
5 | import { UploadOutlined } from '@ant-design/icons'; | 5 | import { UploadOutlined } from '@ant-design/icons'; |
6 | import cx from 'classnames'; | 6 | import cx from 'classnames'; |
7 | 7 | ||
8 | -interface UploadFileProps { | 8 | +export interface UploadFileProps { |
9 | accept?: string; | 9 | accept?: string; |
10 | listType?: UploadListType; | 10 | listType?: UploadListType; |
11 | Callback?: (e: any) => void; | 11 | Callback?: (e: any) => void; |
@@ -26,12 +26,11 @@ type Config = Record< | @@ -26,12 +26,11 @@ type Config = Record< | ||
26 | | 'signature' | 26 | | 'signature' |
27 | | 'callback' | 27 | | 'callback' |
28 | | 'x:access_token' | 28 | | 'x:access_token' |
29 | - // | 'x-oss-security-token' | ||
30 | | 'success_action_status', | 29 | | 'success_action_status', |
31 | string | 30 | string |
32 | >; | 31 | >; |
33 | 32 | ||
34 | -// picture-card | 33 | + |
35 | const UploadFiles: React.FC<UploadFileProps> = (props) => { | 34 | const UploadFiles: React.FC<UploadFileProps> = (props) => { |
36 | const { | 35 | const { |
37 | value, | 36 | value, |
@@ -85,22 +84,29 @@ const UploadFiles: React.FC<UploadFileProps> = (props) => { | @@ -85,22 +84,29 @@ const UploadFiles: React.FC<UploadFileProps> = (props) => { | ||
85 | 84 | ||
86 | const onchange = ({ fileList }: { fileList: any }) => { | 85 | const onchange = ({ fileList }: { fileList: any }) => { |
87 | if (fileList[fileList.length - 1].status === 'done') { | 86 | if (fileList[fileList.length - 1].status === 'done') { |
88 | - // setFileList([...fileLists, fileList[fileList.length - 1]]); | 87 | + setFileList([...fileLists, fileList[fileList.length - 1]]); |
89 | 88 | ||
90 | - if (onChange) { | ||
91 | - onChange([...fileLists, fileList[fileList.length - 1]]); | ||
92 | - } | ||
93 | - if (Callback) Callback([...fileLists, fileList[fileList.length - 1]]); | 89 | + // if (onChange) { |
90 | + // onChange([...fileLists, fileList[fileList.length - 1]]); | ||
91 | + // } | ||
92 | + // if (Callback) Callback([...fileLists, fileList[fileList.length - 1]]); | ||
94 | } | 93 | } |
95 | }; | 94 | }; |
96 | 95 | ||
96 | + useEffect(() => { | ||
97 | + if (onChange) { | ||
98 | + onChange(fileLists); | ||
99 | + } | ||
100 | + if (Callback) Callback(fileLists); | ||
101 | + }, [fileLists]); | ||
102 | + | ||
97 | const onRemove = (file: UploadFile) => { | 103 | const onRemove = (file: UploadFile) => { |
98 | const files = value.filter((v: { uid: string }) => v.uid !== file.uid); | 104 | const files = value.filter((v: { uid: string }) => v.uid !== file.uid); |
99 | setFileList(files); | 105 | setFileList(files); |
100 | - if (onChange) { | ||
101 | - onChange(files); | ||
102 | - } | ||
103 | - if (Callback) Callback([...files]); | 106 | + // if (onChange) { |
107 | + // onChange(files); | ||
108 | + // } | ||
109 | + // if (Callback) Callback([...files]); | ||
104 | }; | 110 | }; |
105 | 111 | ||
106 | const onPreview = async (file: any) => { | 112 | const onPreview = async (file: any) => { |
src/index.tsx
0 → 100644
1 | +export { default as AddTags } from './hr/add_tags'; | ||
2 | +export type { TagProps } from './hr/add_tags'; | ||
3 | + | ||
4 | +export { default as InputItem } from './hr/antd_input'; | ||
5 | + | ||
6 | +export { default as BraftEditor } from './hr/braft_editor'; | ||
7 | +export type { BraftDeitorProps } from './hr/braft_editor'; | ||
8 | + | ||
9 | +export { default as Breadcrumb } from './hr/bread_crumb'; | ||
10 | +export type { BreadcrumbProps } from './hr/bread_crumb'; | ||
11 | + | ||
12 | +export { default as ButtonRadio } from './hr/button_radio'; | ||
13 | +export type { ButtonRadioProps } from './hr/button_radio'; | ||
14 | + | ||
15 | +export { default as FormModal } from './hr/form_modal'; | ||
16 | +export type { FormModalProps } from './hr/form_modal'; | ||
17 | + | ||
18 | +export { default as Image } from './hr/image'; | ||
19 | +export type { ImageComponentProps } from './hr/image'; | ||
20 | + | ||
21 | +export { default as ModalConfirm } from './hr/modal_confirm'; | ||
22 | + | ||
23 | +export { default as Pagination } from './hr/pagination'; | ||
24 | +export type { PaginationProps } from './hr/pagination'; | ||
25 | + | ||
26 | +export { default as SearchWrap } from './hr/search'; | ||
27 | +export type { SearchWrapProps } from './hr/search'; | ||
28 | + | ||
29 | +export { default as TableWrap } from './hr/table'; | ||
30 | +export type { tableProps } from './hr/table'; | ||
31 | + | ||
32 | +export { default as Tabs } from './hr/tabs'; | ||
33 | +export type { MyTabsProps } from './hr/tabs'; | ||
34 | + | ||
35 | +export { default as UploadFiles } from './hr/upload_file'; | ||
36 | +export type { UploadFileProps } from './hr/upload_file'; | ||
37 | + | ||
38 | +export { default as NoData } from './hr/nodata'; | ||
39 | + |
@@ -15,16 +15,16 @@ | @@ -15,16 +15,16 @@ | ||
15 | "jsx": "react-jsx", | 15 | "jsx": "react-jsx", |
16 | "allowSyntheticDefaultImports": true, | 16 | "allowSyntheticDefaultImports": true, |
17 | "paths": { | 17 | "paths": { |
18 | - "@/hr/*": ["./packages/hr/*"], | ||
19 | - "@/hro/*": ["./packages/hro/*"], | ||
20 | - "@/utils/*": ["./utils/*"], | ||
21 | - "@/services/*": ["./services/*"] | 18 | + "@/hr/*": ["./src/hr/*"], |
19 | + "@/hro/*": ["./src/hro/*"], | ||
20 | + "@/utils/*": ["./src/utils/*"], | ||
21 | + "@/services/*": ["./src/services/*"] | ||
22 | }, | 22 | }, |
23 | "declaration": true, // 自动生成声明文件 | 23 | "declaration": true, // 自动生成声明文件 |
24 | - "declarationDir": "./", // 声明文件生成的目录 | 24 | + // "declarationDir": "./", // 声明文件生成的目录 |
25 | "noEmitOnError": false | 25 | "noEmitOnError": false |
26 | }, | 26 | }, |
27 | - "include": ["packages", "index.tsx", "typings.d.ts"], | 27 | + "include": ["src/*", "src/*.d.ts", "src/utils/*"], |
28 | "exclude": ["node_modules"], | 28 | "exclude": ["node_modules"], |
29 | "references": [{ "path": "./tsconfig.node.json" }] | 29 | "references": [{ "path": "./tsconfig.node.json" }] |
30 | } | 30 | } |
@@ -18,10 +18,10 @@ export default defineConfig({ | @@ -18,10 +18,10 @@ export default defineConfig({ | ||
18 | }, | 18 | }, |
19 | resolve: { | 19 | resolve: { |
20 | alias: { | 20 | alias: { |
21 | - '@/hr': resolve(__dirname, 'packages/hr'), | ||
22 | - '@/hro': resolve(__dirname, 'packages/hro'), | ||
23 | - '@/utils': resolve(__dirname, 'utils'), | ||
24 | - '@/services': resolve(__dirname, 'services'), | 21 | + '@/hr': resolve(__dirname, 'src/hr'), |
22 | + '@/hro': resolve(__dirname, 'src/hro'), | ||
23 | + '@/utils': resolve(__dirname, 'src/utils'), | ||
24 | + '@/services': resolve(__dirname, 'src/services'), | ||
25 | }, | 25 | }, |
26 | }, | 26 | }, |
27 | }); | 27 | }); |
请
注册
或
登录
后发表评论