From 33e4bfb861570886a5eee7b366bc9c873a25c0a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiho=20=C2=B7=20Cham?= Date: Tue, 6 Aug 2019 12:55:52 +0800 Subject: [PATCH] refactor: next in TypeScript (#206) --- packages/antd/package.json | 3 +- packages/antd/src/components/button.tsx | 2 +- packages/antd/src/components/grid.tsx | 1 + packages/antd/src/components/layout.tsx | 17 +-- packages/antd/src/fields/array.tsx | 4 +- packages/antd/src/fields/table.tsx | 21 +-- packages/antd/src/form.tsx | 5 +- packages/antd/src/type.tsx | 123 ++++++------------ .../antd/src/types/components/button.d.ts | 5 - .../antd/src/types/components/layout.d.ts | 16 --- packages/next/package.json | 3 +- .../src/components/{button.js => button.tsx} | 11 +- ...formButtonGroup.js => formButtonGroup.tsx} | 55 ++++++-- .../src/components/{layout.js => layout.tsx} | 48 ++++--- .../next/src/fields/{array.js => array.tsx} | 4 +- .../src/fields/{boolean.js => boolean.ts} | 0 .../next/src/fields/{cards.js => cards.tsx} | 11 +- .../src/fields/{checkbox.js => checkbox.ts} | 0 .../next/src/fields/{date.js => date.tsx} | 0 .../next/src/fields/{number.js => number.ts} | 0 .../src/fields/{password.js => password.tsx} | 14 +- .../next/src/fields/{radio.js => radio.ts} | 0 .../next/src/fields/{range.js => range.ts} | 0 .../next/src/fields/{rating.js => rating.ts} | 0 .../next/src/fields/{string.js => string.ts} | 0 .../next/src/fields/{table.js => table.tsx} | 63 +++++---- .../src/fields/{textarea.js => textarea.ts} | 0 packages/next/src/fields/{time.js => time.ts} | 0 .../src/fields/{transfer.js => transfer.ts} | 0 .../next/src/fields/{upload.js => upload.tsx} | 13 +- packages/next/src/{form.js => form.tsx} | 41 +++--- packages/next/src/{index.js => index.ts} | 1 + packages/next/src/{locale.js => locale.ts} | 0 packages/next/src/type.tsx | 23 ++++ packages/next/src/{utils.js => utils.tsx} | 16 ++- packages/react/src/decorators/connect.ts | 2 +- packages/types/src/form.ts | 62 +++++++++ 37 files changed, 341 insertions(+), 223 deletions(-) delete mode 100644 packages/antd/src/types/components/button.d.ts delete mode 100644 packages/antd/src/types/components/layout.d.ts rename packages/next/src/components/{button.js => button.tsx} (73%) rename packages/next/src/components/{formButtonGroup.js => formButtonGroup.tsx} (74%) rename packages/next/src/components/{layout.js => layout.tsx} (84%) rename packages/next/src/fields/{array.js => array.tsx} (97%) rename packages/next/src/fields/{boolean.js => boolean.ts} (100%) rename packages/next/src/fields/{cards.js => cards.tsx} (95%) rename packages/next/src/fields/{checkbox.js => checkbox.ts} (100%) rename packages/next/src/fields/{date.js => date.tsx} (100%) rename packages/next/src/fields/{number.js => number.ts} (100%) rename packages/next/src/fields/{password.js => password.tsx} (95%) rename packages/next/src/fields/{radio.js => radio.ts} (100%) rename packages/next/src/fields/{range.js => range.ts} (100%) rename packages/next/src/fields/{rating.js => rating.ts} (100%) rename packages/next/src/fields/{string.js => string.ts} (100%) rename packages/next/src/fields/{table.js => table.tsx} (88%) rename packages/next/src/fields/{textarea.js => textarea.ts} (100%) rename packages/next/src/fields/{time.js => time.ts} (100%) rename packages/next/src/fields/{transfer.js => transfer.ts} (100%) rename packages/next/src/fields/{upload.js => upload.tsx} (92%) rename packages/next/src/{form.js => form.tsx} (94%) rename packages/next/src/{index.js => index.ts} (99%) rename packages/next/src/{locale.js => locale.ts} (100%) create mode 100644 packages/next/src/type.tsx rename packages/next/src/{utils.js => utils.tsx} (86%) diff --git a/packages/antd/package.json b/packages/antd/package.json index 4b4c1e8d9eb..2ed50f087cf 100644 --- a/packages/antd/package.json +++ b/packages/antd/package.json @@ -29,6 +29,7 @@ "react-dom": ">=16.8.0" }, "dependencies": { + "@uform/types": "^0.3.7", "@uform/react": "^0.3.7", "@uform/utils": "^0.3.7", "classnames": "^2.2.6", @@ -40,4 +41,4 @@ "access": "public" }, "gitHead": "4d068dad6183e8da294a4c899a158326c0b0b050" -} \ No newline at end of file +} diff --git a/packages/antd/src/components/button.tsx b/packages/antd/src/components/button.tsx index 6320f5f231b..55ed720516c 100644 --- a/packages/antd/src/components/button.tsx +++ b/packages/antd/src/components/button.tsx @@ -1,7 +1,7 @@ import React from 'react' import { FormConsumer } from '@uform/react' import { Button } from 'antd' -import { ISubmitProps } from '../types/components/button' +import { ISubmitProps } from '../type' export const Submit = ({ showLoading, ...props }: ISubmitProps) => { return ( diff --git a/packages/antd/src/components/grid.tsx b/packages/antd/src/components/grid.tsx index 6c95a4b8e2d..e9773c591a1 100644 --- a/packages/antd/src/components/grid.tsx +++ b/packages/antd/src/components/grid.tsx @@ -57,6 +57,7 @@ export class Row extends Component { let newChildren = toArr(children) const gutterNumber = parseInt(gutter, 10) + if (gutterNumber !== 0) { const halfGutterString = `${gutterNumber / 2}px` others.style = { diff --git a/packages/antd/src/components/layout.tsx b/packages/antd/src/components/layout.tsx index b299f3c28fd..40e922ff245 100644 --- a/packages/antd/src/components/layout.tsx +++ b/packages/antd/src/components/layout.tsx @@ -1,25 +1,14 @@ import React, { Component, useEffect, useRef } from 'react' import { createVirtualBox } from '@uform/react' import { toArr } from '@uform/utils' +import { IFormItemGridProps } from '@uform/types' import { Card, Row, Col } from 'antd' import styled from 'styled-components' import cls from 'classnames' import { FormLayoutConsumer, FormItem, FormLayoutProvider } from '../form' -import { IFormItemGridProps, IFormCardProps, IFormBlockProps } from '../type' -import { TFormLayout } from '../types/components/layout' - -export interface IFormLayoutProps { - className?: string - inline?: boolean - labelAlign?: 'left' | 'top' | 'inset' - wrapperCol?: number - labelCol?: number - labelTextAlign?: 'left' | 'right' - size?: 'small' | 'medium' | 'large' - style?: React.CSSProperties - children: React.ReactNode -} +import { IFormCardProps, IFormBlockProps } from '../type' +import { TFormLayout } from '../type' const normalizeCol = ( col: { span: number; offset?: number } | number, diff --git a/packages/antd/src/fields/array.tsx b/packages/antd/src/fields/array.tsx index ba8f5c23771..66a9a96b388 100644 --- a/packages/antd/src/fields/array.tsx +++ b/packages/antd/src/fields/array.tsx @@ -3,7 +3,7 @@ import { registerFormField, createArrayField } from '@uform/react' import { Icon } from 'antd' import styled, { css } from 'styled-components' -export const CircleButton = styled.div.attrs({ className: 'cricle-btn' })` +export const CircleButton = styled['div'].attrs({ className: 'cricle-btn' })` ${props => (!props.hasText ? 'width:30px; height:30px;' : '')} margin-right:10px; border-radius: ${props => (!props.hasText ? '100px' : 'none')}; @@ -25,7 +25,7 @@ export const CircleButton = styled.div.attrs({ className: 'cricle-btn' })` } ` -export const TextButton = styled.div.attrs({ +export const TextButton = styled['div'].attrs({ className: 'ant-btn-text' })` display: inline-block; diff --git a/packages/antd/src/fields/table.tsx b/packages/antd/src/fields/table.tsx index d6c7f97e154..0f5e7950ed2 100644 --- a/packages/antd/src/fields/table.tsx +++ b/packages/antd/src/fields/table.tsx @@ -228,17 +228,20 @@ const Table = styled( } public getColumns(children) { - const columns = [] - React.Children.forEach(children, child => { - if (React.isValidElement(child as React.ReactElement)) { - if ( - child.type === Column || - child.type.displayName === '@schema-table-column' - ) { - columns.push(child.props) + const columns: IColumnProps[] = [] + React.Children.forEach>( + children, + child => { + if (React.isValidElement(child)) { + if ( + child.type === Column || + child.type.displayName === '@schema-table-column' + ) { + columns.push(child.props) + } } } - }) + ) return columns } diff --git a/packages/antd/src/form.tsx b/packages/antd/src/form.tsx index 5933d6dff41..8ca9ab8b6b9 100644 --- a/packages/antd/src/form.tsx +++ b/packages/antd/src/form.tsx @@ -1,16 +1,15 @@ import React from 'react' -import { registerFormWrapper, registerFieldMiddleware } from '@uform/react' import classNames from 'classnames' import { Row, Col, Popover, Icon } from 'antd' import styled from 'styled-components' +import { registerFormWrapper, registerFieldMiddleware } from '@uform/react' +import { IFormItemProps, IFormProps } from '@uform/types' import LOCALE from './locale' import { isFn, moveTo, isStr, stringLength } from './utils' -import { IFormItemProps, IFormProps } from './type' /** * 轻量级 Form,不包含任何数据管理能力 - * */ export const { diff --git a/packages/antd/src/type.tsx b/packages/antd/src/type.tsx index 540b39e6290..c3e57c2496a 100644 --- a/packages/antd/src/type.tsx +++ b/packages/antd/src/type.tsx @@ -1,119 +1,72 @@ -import { ISchema } from '@uform/utils' -// import { ColProps } from 'antd/lib/grid/col' +import { IFieldProps } from '@uform/react' +import { ColProps } from 'antd/es/col' +import { CardProps } from 'antd/es/card' +import { BaseButtonProps } from 'antd/es/button/button' -export enum LabelAlign { - TOP = 'top', - INSET = 'inset', - LEFT = 'left' +export interface ISubmitProps extends Omit { + showLoading?: boolean } -export enum LabelTextAlign { - LEFT = 'left', - RIGHT = 'right' -} - -export enum Size { - LARGE = 'large', - MEDIUM = 'medium', - SMALL = 'small' -} - -export interface IFormConsumerProps { - // labelCol: ColProps | number - labelCol: object | number - wrapperCol: object | number - autoAddColon: boolean - size: Size +export interface IFormLayoutProps { + className: string inline: boolean - labelAlign: LabelAlign - labelTextAlign: LabelTextAlign + labelAlign: 'left' | 'top' | 'inset' + wrapperCol: number + labelCol: number + labelTextAlign: 'left' | 'right' + size: 'small' | 'medium' | 'large' + style: React.CSSProperties + name: string + render: (fieldProps: IFieldProps) => string | JSX.Element | null } +export type TFormLayout = React.FunctionComponent> + export interface IRowProps { prefix?: string pure?: boolean wrap?: boolean fixed?: boolean hidden?: boolean - gutter?: string className?: string - - // TODO fixedWidth?: string | number - style?: object + style?: React.CSSProperties + component?: keyof JSX.IntrinsicElements | React.ComponentType + gutter?: string align?: string | number justify?: string | number - component?: any children: React.ReactNode } -export interface IColProps { +type ColSpanType = number | string + +export interface ColSize { + span?: ColSpanType + offset?: ColSpanType +} + +export interface IColProps extends ColProps { prefix: string pure?: boolean className?: string - span?: string | number - offset?: string | number fixedSpan?: string | number fixedOffset?: string | number hidden?: boolean - - // TODO align?: any - xxs?: any - xs?: any - s?: any - m?: any - l?: any - xl?: any - component?: any + component?: keyof JSX.IntrinsicElements | React.ComponentType children?: React.ReactNode + xxs?: ColSpanType | ColSize + xs?: ColSpanType | ColSize + s?: ColSpanType | ColSize + m?: ColSpanType | ColSize + l?: ColSpanType | ColSize + xl?: ColSpanType | ColSize } -export interface IFormItemGridProps { - name?: string - help?: React.ReactNode - extra?: React.ReactNode - description?: string - title?: string - cols?: any -} - -export interface IFormCardProps { +export interface IFormCardProps extends CardProps { className?: string } -export interface IFormBlockProps { +export interface IFormBlockProps extends CardProps { className?: string } - -export interface IFormProps extends IFormConsumerProps { - className: string - style: object - layout: string - children: React.ReactNode - component: string - prefix: string - maxTipsNum: number - onValidateFailed: () => void -} - -export interface IFormItemProps extends IFormConsumerProps { - id: string - required: boolean - label: React.ReactNode - prefix: string - extra: object - maxTipsNum: number - - // TODO - validateState: any - - isTableColItem: boolean - help: React.ReactNode - noMinHeight: boolean - children: React.ReactElement - className: string - style: object - type: string - schema: ISchema -} diff --git a/packages/antd/src/types/components/button.d.ts b/packages/antd/src/types/components/button.d.ts deleted file mode 100644 index 0160a267b58..00000000000 --- a/packages/antd/src/types/components/button.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { BaseButtonProps } from 'antd/lib/button/button' - -export interface ISubmitProps extends Omit { - showLoading?: boolean -} diff --git a/packages/antd/src/types/components/layout.d.ts b/packages/antd/src/types/components/layout.d.ts deleted file mode 100644 index 87365b2e433..00000000000 --- a/packages/antd/src/types/components/layout.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IFieldProps } from '@uform/react' - -export interface IFormLayoutProps { - className: string - inline: boolean - labelAlign: 'left' | 'top' | 'inset' - wrapperCol: number - labelCol: number - labelTextAlign: 'left' | 'right' - size: 'small' | 'medium' | 'large' - style: React.CSSProperties - name: string - render: (fieldProps: IFieldProps) => string | JSX.Element | null -} - -export type TFormLayout = React.FunctionComponent> diff --git a/packages/next/package.json b/packages/next/package.json index 5745f4de90f..33511524cfc 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -25,6 +25,7 @@ "react-dom": ">=16.8.0" }, "dependencies": { + "@uform/types": "^0.3.7", "@uform/react": "^0.3.7", "@uform/utils": "^0.3.7", "classnames": "^2.2.6", @@ -40,4 +41,4 @@ "access": "public" }, "gitHead": "4d068dad6183e8da294a4c899a158326c0b0b050" -} \ No newline at end of file +} diff --git a/packages/next/src/components/button.js b/packages/next/src/components/button.tsx similarity index 73% rename from packages/next/src/components/button.js rename to packages/next/src/components/button.tsx index 77c45ab5b7a..8bd75f4d1ac 100644 --- a/packages/next/src/components/button.js +++ b/packages/next/src/components/button.tsx @@ -1,8 +1,13 @@ import React from 'react' import { FormConsumer } from '@uform/react' import { Button } from '@alifd/next' +import { ButtonProps } from '@alifd/next/types/button' -export const Submit = ({ showLoading, ...props }) => { +export interface ISubmitProps extends Omit { + showLoading?: boolean +} + +export const Submit = ({ showLoading, ...props }: ISubmitProps) => { return ( {({ status }) => { @@ -26,10 +31,10 @@ Submit.defaultProps = { showLoading: true } -export const Reset = props => { +export const Reset = (props: ButtonProps) => { return ( - {({ status, reset }) => { + {({ reset }) => { return (