form.stories.tsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import React, { FunctionComponent } from 'react';
  2. import { storiesOf } from '@storybook/react';
  3. import { Form, useFormState, useFormApi, withField, Input, Button, Upload, withFormApi, withFormState } from '../../index';
  4. import { values } from 'lodash';
  5. import { Modal } from '../../modal';
  6. const stories = storiesOf('Form', module);
  7. import { FormApiContext } from '../context';
  8. import type { FormApi, FormFCChild, FormState } from '../interface';
  9. const ModalForm = <Values extends Record<string, any> = any> (props) => {
  10. return <div>
  11. <Form<Values>>
  12. </Form>
  13. </div>
  14. };
  15. const treeData = [
  16. {
  17. label: '浙江省',
  18. value: 'zhejiang',
  19. key: '0',
  20. children: [
  21. {
  22. label: '杭州市',
  23. value: 'hangzhou',
  24. key: '0-0',
  25. children: [
  26. {
  27. label: '西湖区',
  28. value: 'xihu',
  29. key: '0-0-0',
  30. },
  31. {
  32. label: '萧山区',
  33. value: 'xiaoshan',
  34. key: '0-0-1',
  35. },
  36. {
  37. label: '临安区',
  38. value: 'linan',
  39. key: '0-0-2',
  40. },
  41. ],
  42. },
  43. {
  44. label: '宁波市',
  45. value: 'ningbo',
  46. key: '0-1',
  47. children: [
  48. {
  49. label: '海曙区',
  50. value: 'haishu',
  51. key: '0-1-0',
  52. },
  53. {
  54. label: '江北区',
  55. value: 'jiangbei',
  56. key: '0-1-1',
  57. },
  58. ],
  59. },
  60. ],
  61. },
  62. ];
  63. const htmlInput = (props: any) => {
  64. let value = props.value || '';
  65. delete props.validateStatus; // prevent props being transparently transmitted to DOM
  66. return <input {...props} value={value} />;
  67. };
  68. const FieldB = withField(Input);
  69. const FieldA = withField(htmlInput, { valueKey: 'value', onKeyChangeFnName: 'onChange', valuePath: 'target.value' });
  70. const Fields: FunctionComponent<FormFCChild> = ({ formState, values, formApi }) => {
  71. const ref = React.useRef();
  72. return (
  73. <>
  74. <Form.Rating field='test' className='fe' count={2} ref={ref} />
  75. <Form.Input field='test' ref={ref} />
  76. <Input size='default' showClear insetLabel />
  77. <FieldB insetLabel placeholder='fe' fieldClassName='fefe' field='custom' />
  78. <Button onClick={() => formApi.setValue('fieldA', 'fe')}>set</Button>
  79. <Form.Select field='test' ref={ref}>
  80. <Form.Select.Option value="f1"></Form.Select.Option>
  81. <Form.Select.Option value="f2"></Form.Select.Option>
  82. </Form.Select>
  83. <Form.Input field="UserName" label="用户名" ref={ref} />
  84. <Form.TextArea field="textarea" onKeyDown={(v: any) => console.log(v)} ref={ref} />
  85. <Form.Input field="Password" label="密码" />
  86. <Form.InputNumber field="number" ref={ref} />
  87. <Form.Rating field="rating" />
  88. <Form.Switch field="switch" checkedText="on" uncheckedText="off" ref={ref} />
  89. <Form.Cascader
  90. placeholder="请选择所在地区"
  91. field="area"
  92. ref={ref}
  93. label={{ text: '123', required: true, extra: 123 }}
  94. treeData={treeData}
  95. ></Form.Cascader>
  96. <Form.TimePicker field="time" minuteStep={2} ref={ref} />
  97. <Form.AutoComplete field="fe" />
  98. <Form.TreeSelect field="treeSelect" treeData={treeData} ref={ref} />
  99. <Form.Slider field="slider" ref={ref} />
  100. <Form.DatePicker field="datepicker" ref={ref} />
  101. <Form.CheckboxGroup
  102. field="type"
  103. ref={ref}
  104. label="申请类型(CheckboxGroup)"
  105. initValue={['user', 'admin']}
  106. rules={[{ required: true }]}
  107. >
  108. <Form.Checkbox value="admin">admin</Form.Checkbox>
  109. <Form.Checkbox value="user">user</Form.Checkbox>
  110. <Form.Checkbox value="guest">guest</Form.Checkbox>
  111. <Form.Checkbox value="root">root</Form.Checkbox>
  112. </Form.CheckboxGroup>
  113. <Form.RadioGroup
  114. field="radio"
  115. ref={ref}
  116. label="是否独占资源(Radio)"
  117. rules={[{ type: 'boolean' }, { required: true, message: '必须选择是否独占 ' }]}
  118. >
  119. <Form.Radio value={1}>是</Form.Radio>
  120. <Form.Radio value={0}>否</Form.Radio>
  121. </Form.RadioGroup>
  122. <Form.Checkbox field='abc' noLabel>
  123. 我已阅读并清楚相关规定(Checkbox)
  124. </Form.Checkbox>
  125. <Form.Label text="fe" required />
  126. <Form.ErrorMessage error="errorText" />
  127. <FieldB field="custom" />
  128. <FieldA field="cuB" />
  129. <Form.TagInput field='tagInput' ref={ref} ></Form.TagInput>
  130. <Form.Upload ref={ref} fileName='semi' action='https://test.com' field='file' />
  131. <Form.Slot />
  132. <code style={{ marginTop: 30 }}>{JSON.stringify(formState)}</code>
  133. </>
  134. )
  135. };
  136. stories.add('Form', () => <Form>{Fields}</Form>);
  137. interface IProps {
  138. [x:string]: any;
  139. }
  140. interface IState {
  141. visible: boolean;
  142. }
  143. interface FData {
  144. test: boolean;
  145. test2: boolean;
  146. test3: string;
  147. test4: {
  148. event: string,
  149. },
  150. testK: boolean;
  151. // [x: string]: any;
  152. }
  153. class Demo extends React.Component<IProps, IState> {
  154. constructor(props:any) {
  155. super(props);
  156. this.state = { visible: false};
  157. }
  158. getFormApi(formApi: FormApi<FData>) {
  159. formApi.getValue()
  160. }
  161. render() {
  162. const { visible } = this.state;
  163. return (
  164. <>
  165. <Form<FData>
  166. getFormApi={this.getFormApi}
  167. onSubmit={values => console.log(values.test2)}
  168. onChange={formState => formState.values.test}
  169. validateFields={values => ({ test4: 'test4 empty', test2: '' }) }
  170. >
  171. </Form>
  172. </>
  173. );
  174. }
  175. }
  176. stories.add('Form render', () => <Form render={({values, formApi, formState}) => <div></div>}></Form>);
  177. interface CodeProps {
  178. type?: 'email' | 'phone';
  179. test?: 'a' | 'b' | 'c';
  180. onSend?: () => Promise<void>
  181. }
  182. class CodeC extends React.Component<CodeProps & { formState?: FormState, formApi?: FormApi }, IState> {
  183. state: IState = {
  184. visible: false,
  185. };
  186. render() {
  187. const { formState } = this.props;
  188. return <div>
  189. t
  190. </div>;
  191. }
  192. }
  193. const t = () => (<CodeC type='email'></CodeC>);
  194. const DoubleWrap = withFormState(withFormApi(CodeC));
  195. const OneWrap = withFormApi(CodeC);
  196. stories.add('Form children', () => <Form>
  197. {({ formState, formApi, values }) => (
  198. <>
  199. <Form.Input field='fe'>
  200. </Form.Input>
  201. <DoubleWrap type='email' test='c'></DoubleWrap>
  202. <OneWrap type='email'></OneWrap>
  203. <CodeC type='email'></CodeC>
  204. <Form.DatePicker field='role'/>
  205. </>
  206. )
  207. }
  208. </Form>);