arrayField.test.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import { Form, ArrayField, Button } from '../../index';
  2. import { IconPlusCircle } from '@douyinfe/semi-icons';
  3. const data = [
  4. {
  5. name: 'hzj',
  6. type: 'rd',
  7. }, // line 1
  8. {
  9. name: 'dc',
  10. type: 'ued',
  11. }, // line 2
  12. ];
  13. const newLine = {
  14. name: 'yx',
  15. type: 'rd',
  16. }; // line 3
  17. function getForm(props) {
  18. let { formProps = {}, arrayFieldProps = {}, fieldProps = {} } = props;
  19. const component = (
  20. <Form
  21. style={{
  22. width: 500,
  23. }}
  24. {...formProps}
  25. >
  26. <ArrayField field="data" {...arrayFieldProps}>
  27. {({ add, arrayFields, addWithInitValue }) => (
  28. <React.Fragment>
  29. <Button className="addEmptyLine" onClick={add} icon={<IconPlusCircle />} theme="light">
  30. Add Empty Line
  31. </Button>
  32. <Button
  33. className="addLine"
  34. onClick={() => {
  35. addWithInitValue(newLine);
  36. }}
  37. >
  38. Add line with setting value
  39. </Button>
  40. {arrayFields.map(({ field, key, remove }, i) => (
  41. <div key={key}>
  42. <Form.Input field={`${field}[name]`} {...fieldProps} />
  43. <Form.Input field={`${field}[type]`} {...fieldProps} />
  44. <Button type="danger" onClick={remove} />
  45. </div>
  46. ))}
  47. </React.Fragment>
  48. )}
  49. </ArrayField>
  50. </Form>
  51. );
  52. return mount(component);
  53. }
  54. function getNestedArrayFieldDemo() {}
  55. function getFormState(form) {
  56. return form.instance().formApi.getFormState();
  57. }
  58. function getFieldDom(form, fieldPath) {
  59. let dom = form.find(`.semi-form-field[x-field-id="${fieldPath}"]`);
  60. try {
  61. dom = dom.find('.semi-input');
  62. return dom.instance().value;
  63. } catch (error) {
  64. console.log(error);
  65. }
  66. }
  67. describe('Form.ArrayField', () => {
  68. it('declare initValue via ArrayField props', () => {
  69. let props = {
  70. formProps: {},
  71. arrayFieldProps: {
  72. initValue: data,
  73. },
  74. fieldProps: {},
  75. };
  76. let form = getForm(props); // check line 1
  77. let line1Name = getFieldDom(form, 'data[0][name]');
  78. let line1Type = getFieldDom(form, 'data[0][type]');
  79. expect(line1Name).toEqual(data[0].name);
  80. expect(line1Type).toEqual(data[0].type); // check line 2
  81. let line2Name = getFieldDom(form, 'data[1][name]');
  82. let line2Type = getFieldDom(form, 'data[1][type]');
  83. expect(line2Name).toEqual(data[1].name);
  84. expect(line2Type).toEqual(data[1].type);
  85. form.unmount();
  86. });
  87. it('declare initValue via Form initValues', () => {
  88. let props = {
  89. formProps: {
  90. initValues: {
  91. data: data,
  92. },
  93. },
  94. arrayFieldProps: {},
  95. fieldProps: {},
  96. };
  97. let form = getForm(props); // check line 1
  98. let line1Name = getFieldDom(form, 'data[0][name]');
  99. let line1Type = getFieldDom(form, 'data[0][type]');
  100. expect(line1Name).toEqual(data[0].name);
  101. expect(line1Type).toEqual(data[0].type); // check line 2
  102. let line2Name = getFieldDom(form, 'data[1][name]');
  103. let line2Type = getFieldDom(form, 'data[1][type]');
  104. expect(line2Name).toEqual(data[1].name);
  105. expect(line2Type).toEqual(data[1].type);
  106. });
  107. it('declare initValue via Field props / add line when field props set initValue', () => {
  108. let props = {
  109. formProps: {
  110. initValues: {
  111. data: [{}],
  112. },
  113. },
  114. fieldProps: {
  115. initValue: 'semi',
  116. },
  117. };
  118. let form = getForm(props); // check line 1
  119. let line1Name = getFieldDom(form, 'data[0][name]');
  120. let line1Type = getFieldDom(form, 'data[0][type]');
  121. expect(line1Name).toEqual('semi');
  122. expect(line1Type).toEqual('semi'); // check line 2 which add by click add button
  123. let addButton = form.find('.semi-button.addEmptyLine');
  124. addButton.simulate('click', {});
  125. let line2Name = getFieldDom(form, 'data[1][name]');
  126. let line2Type = getFieldDom(form, 'data[1][type]');
  127. expect(line1Name).toEqual('semi');
  128. expect(line1Type).toEqual('semi');
  129. });
  130. it('ArrayField-basic usage', () => {
  131. let props = {
  132. formProps: {
  133. initValues: {
  134. data,
  135. },
  136. },
  137. };
  138. let form = getForm(props); // Add line 3
  139. let addButton = form.find('.semi-button.addEmptyLine');
  140. addButton.simulate('click', {}); // check line 3
  141. let line3Name = getFieldDom(form, 'data[2][name]');
  142. let line3Type = getFieldDom(form, 'data[2][type]');
  143. expect(line3Name).toEqual('');
  144. expect(line3Type).toEqual(''); // Add line 4
  145. addButton.simulate('click', {}); // check line 4
  146. let line4Name = getFieldDom(form, 'data[3][name]');
  147. let line4Type = getFieldDom(form, 'data[3][type]');
  148. expect(line4Name).toEqual('');
  149. expect(line4Name).toEqual(''); // change line 2
  150. // test current state
  151. // Remove line 3
  152. // test current state
  153. // remove line 1
  154. });
  155. // it('formApi-reset, when include ArrayField', () => {
  156. // });
  157. it('addWithInitValue', () => {
  158. // let props = {
  159. // formProps: {
  160. // initValues: {
  161. // data,
  162. // },
  163. // }
  164. // };
  165. // let form = getForm(props);
  166. // // Add line 3
  167. // let addButton = form.find('.semi-button.addLine');
  168. // addButton.simulate('click', {});
  169. // // check line 3
  170. // form.update();
  171. // setTimeout(() => {
  172. // let line3Name = getFieldDom(form, 'data[2][name]');
  173. // let line3Type = getFieldDom(form, 'data[2][type]');
  174. // debugger
  175. // expect(line3Name).toEqual(newLine.name);
  176. // expect(line3Type).toEqual(newLine.type);
  177. // done();
  178. // }, 1000);
  179. });
  180. // it('ArrayField-form allowEmpty', () => {
  181. // });
  182. // it('formApi setValues rewrite ArrayField', () => {
  183. // });
  184. // it('Nested ArrayField', () => {
  185. // });
  186. });