ModalForm.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import React, { useState, useEffect } from 'react';
  2. import { Form, Input, Button, Select, Modal, Upload } from 'antd';
  3. import type { ModalFormType } from './data';
  4. import PicturesWall from '@/components/upload';
  5. import { getClassify } from '@/services/tieba';
  6. const { Option } = Select;
  7. const layout = {
  8. labelCol: { span: 4 },
  9. wrapperCol: { span: 16 },
  10. };
  11. const normFile = (e: any) => {
  12. if (Array.isArray(e)) {
  13. return e;
  14. }
  15. return e && e.fileList;
  16. };
  17. const ModalForm: React.FC<ModalFormType> = ({
  18. visible,
  19. changeForm,
  20. closeModal,
  21. type,
  22. formData,
  23. roleList,
  24. }) => {
  25. const [form] = Form.useForm();
  26. const [avatarUrl, setAvatarUrl] = useState<string>('');
  27. const [cover, setCover] = useState<string>('');
  28. const [classifyList, setClassifyList] = useState<Record<string, any>[]>([]);
  29. const [state, setState] = useState<number>(0);
  30. // 反填表单
  31. const onFill = (): void => {
  32. console.log(formData, 'formData');
  33. form.setFieldsValue(formData);
  34. setAvatarUrl(formData.avatarUrl);
  35. setCover(formData.cover);
  36. };
  37. useEffect(() => {
  38. // GetClassify();
  39. if (type === 1) {
  40. onFill();
  41. }
  42. // eslint-disable-next-line react-hooks/exhaustive-deps
  43. }, []);
  44. const onFinish = (values: any) => {
  45. const $par = {
  46. ...values,
  47. avatarUrl,
  48. cover,
  49. state,
  50. };
  51. changeForm($par);
  52. };
  53. // 获取ava
  54. const setAvaFn = (url: string) => setAvatarUrl(url);
  55. // 获取cover
  56. const setCoverFn = (url: string) => setCover(url);
  57. // 提交表单
  58. const onsubmit = (value: number): void => {
  59. setState(value);
  60. form.submit();
  61. };
  62. // 选择roleList
  63. const changeRoleList = async (_roleId: string) => {
  64. console.log(_roleId);
  65. form.setFieldsValue({
  66. categoryId: '',
  67. });
  68. const { code, data } = await getClassify({ curPage: 1, label: '', roleId: _roleId });
  69. if (code === 0) {
  70. console.log(data);
  71. const { records } = data;
  72. setClassifyList(records);
  73. }
  74. };
  75. return (
  76. <Modal
  77. visible={visible}
  78. onCancel={closeModal}
  79. width={800}
  80. footer={[
  81. <Button key="back" onClick={closeModal}>
  82. 取消
  83. </Button>,
  84. <Button key="back" onClick={() => onsubmit(0)}>
  85. 保存
  86. </Button>,
  87. <Button key="submit" type="primary" onClick={() => onsubmit(1)}>
  88. 保存并发布
  89. </Button>,
  90. ]}
  91. >
  92. <Form {...layout} form={form} name="control-hooks" onFinish={onFinish}>
  93. <Form.Item name="roleIds" label="展示可见范围" rules={[{ required: true }]}>
  94. <Select
  95. allowClear
  96. style={{ width: '100%' }}
  97. placeholder="请选择可见范围"
  98. onChange={changeRoleList}
  99. >
  100. {roleList.length &&
  101. roleList.map((item) => (
  102. <Option key={item.id} value={item.id}>
  103. {item.label}
  104. </Option>
  105. ))}
  106. </Select>
  107. </Form.Item>
  108. <Form.Item name="categoryId" label="分类" rules={[{ required: true }]}>
  109. <Select placeholder="请选择分类(根据可见范围)" allowClear>
  110. {classifyList.length &&
  111. classifyList.map((item) => (
  112. <Option key={item.id} value={item.id}>
  113. {item.label}
  114. </Option>
  115. ))}
  116. </Select>
  117. </Form.Item>
  118. <Form.Item name="label" label="贴吧板块标题" rules={[{ required: true }]}>
  119. <Input maxLength={50} />
  120. </Form.Item>
  121. <Form.Item name="cover" label="图标">
  122. <PicturesWall
  123. key="1"
  124. imgUrl={formData.avatarUrl}
  125. setCoverFn={setAvaFn}
  126. maxCount={1}
  127. desc="上传贴吧图标"
  128. />
  129. </Form.Item>
  130. <Form.Item name="description" label="板块介绍" rules={[{ required: true }]}>
  131. <Input.TextArea maxLength={50}></Input.TextArea>
  132. </Form.Item>
  133. {/* <Form.Item label="封面">
  134. <Form.Item name="cover" valuePropName="fileList" getValueFromEvent={normFile} noStyle>
  135. <PicturesWall imgUrl={formData.cover} key="2" setCoverFn={setCoverFn} maxCount={1} />
  136. </Form.Item>
  137. </Form.Item> */}
  138. </Form>
  139. </Modal>
  140. );
  141. };
  142. export default ModalForm;