zlisen 3 anos atrás
pai
commit
00539822fe

+ 46
- 0
src/components/DragableUploadImageList/Item.jsx Ver arquivo

@@ -0,0 +1,46 @@
1
+import React from 'react'
2
+import { Icon } from 'antd'
3
+
4
+export default (props) => {
5
+    const { dataset = {}, onPreview, onDelete, onClick, onSticky } = props
6
+    const { url } = dataset
7
+
8
+    const handlePreview = () => {
9
+        onPreview && onPreview(dataset)
10
+    }
11
+
12
+    const handleDelete = () => {
13
+        onDelete && onDelete(dataset)
14
+    }
15
+
16
+    const handleClick = () => {
17
+        return onClick ? onClick(dataset) : null
18
+    }
19
+
20
+    const handleSticky = () => {
21
+        onSticky && onSticky(dataset)
22
+    }
23
+
24
+    return (
25
+        <div className="ant-upload-list-picture-card-container">
26
+            <span>
27
+                <div className="ant-upload-list-item ant-upload-list-item-done ant-upload-list-item-list-type-picture-card">
28
+                    <div className="ant-upload-list-item-info">
29
+                        <span>
30
+                            <a className="ant-upload-list-item-thumbnail" href={url} target="_blank" rel="noopener noreferrer" onClick={handleClick}>
31
+                                <img className="ant-upload-list-item-image" src={url} alt="image" />
32
+                            </a>
33
+                        </span>
34
+                    </div>
35
+
36
+                    <span className="ant-upload-list-item-actions">
37
+                        <Icon type="vertical-align-top" className="anticon anticon-eye-o" onClick={handleSticky} />
38
+                        <Icon type="eye" className="anticon anticon-eye-o" onClick={handlePreview} />
39
+                        <Icon type="delete" onClick={handleDelete} />
40
+                    </span>
41
+                </div>
42
+            </span>
43
+        </div>
44
+    )
45
+}
46
+

+ 121
- 0
src/components/DragableUploadImageList/index.jsx Ver arquivo

@@ -0,0 +1,121 @@
1
+import React from 'react';
2
+import { Upload, Icon, Modal } from 'antd';
3
+import './style.less';
4
+import { uploaderProps } from '../../utils/upload';
5
+import Item from './Item'
6
+import { getImgURL } from '@/utils/image';
7
+/**
8
+ * unlimited  属性表示上传图片无限制
9
+ * 例子: <ImageListUpload unlimited/>
10
+ */
11
+class ImageListUpload extends React.Component {
12
+  state = {
13
+    previewVisible: false,
14
+    previewImage: '',
15
+    loadding: false,
16
+  };
17
+
18
+  getFileList = () => {
19
+    return (this.props.value || []).map((img, inx) => ({ uid: inx, url: getImgURL(img), status: 'done' }))
20
+  }
21
+
22
+  handleCancel = () => this.setState({ previewVisible: false });
23
+
24
+  handlePreview = async file => {
25
+    this.setState({
26
+      previewImage: file.url ,
27
+      previewVisible: true,
28
+    });
29
+  };
30
+
31
+  handleSticky = ({ url }) => {
32
+    const fileList = this.props.value || [];
33
+    this.props.onChange([url].concat(fileList.filter(x => x != url)))
34
+  }
35
+
36
+  handleDelete = ({ url }) => {
37
+    const fileList = this.props.value || [];
38
+    this.props.onChange(fileList.filter(x => x != url))
39
+  }
40
+
41
+  handleChange = (e) => {
42
+    if (e.file.status === "uploading") {
43
+      this.setState({ loading: true });
44
+      return;
45
+    }
46
+
47
+    const fileList = (this.props.value || []).filter(x => getImgURL(x) != e.file.url);
48
+    this.props.onChange(fileList);
49
+
50
+    // console.log('删除图片触发了', e.file)
51
+    // if (e.file.state === 'removed') {
52
+    //   const fileList = (this.props.value || []).filter(x => x != e.file.url);
53
+    //   this.props.onChange(fileList);
54
+    // }
55
+
56
+    // if (e.file.status === "done") {
57
+    //   this.setState({
58
+    //     loading: false,
59
+    //   })
60
+
61
+    //   if (e.file.response && e.file.response.url) {
62
+    //     if (typeof this.props.onChange === 'function') {
63
+    //       const fileList = this.getFileList()
64
+    //       this.props.onChange([...fileList || [], e.file.response.url]);
65
+    //     }
66
+    //   }
67
+    // }
68
+  };
69
+
70
+  handleUploadSucess = (url) => {
71
+    this.setState({ loading: false });
72
+    if (typeof this.props.onChange === 'function') {
73
+      const fileList = this.props.value || [];
74
+      this.props.onChange([...fileList, url]);
75
+    }
76
+  }
77
+
78
+  render() {
79
+    const { previewVisible, previewImage } = this.state;
80
+    const { multiple = false } = this.props;
81
+    const fileList = this.getFileList();
82
+
83
+    const uploadButton = (
84
+      <div>
85
+        <Icon style={{ fontSize: '2em', color: '#aaa' }} type={this.state.loading ? "loading" : "plus"}  />
86
+      </div>
87
+    );
88
+    return (
89
+      <div className="clearfix x-dargable-image-upload-list" style={{display:'flex'}}> 
90
+        <div className="ant-upload-list ant-upload-list-picture-card" style={{display:'flex'}}>
91
+            {fileList.map(img => <Item key={img.url} dataset={img} onPreview={this.handlePreview} onSticky={this.handleSticky} onDelete={this.handleDelete}/>)}
92
+        </div>
93
+          {/*  */}
94
+        <Upload
95
+          listType="picture-card"
96
+          showUploadList={false}
97
+          multiple={multiple}
98
+          onPreview={this.handlePreview}
99
+          onChange={this.handleChange}
100
+          { ...uploaderProps }
101
+          onSuccess={this.handleUploadSucess}
102
+        >
103
+         {/* listType="picture-card"
104
+          multiple={true}
105
+          fileList={fileList}
106
+          onPreview={this.handlePreview}
107
+          onChange={this.handleChange}
108
+          { ...uploaderProps }
109
+          onSuccess={this.handleUploadSucess} */}
110
+          {/* unlimited 表示上传无限制数量 */}
111
+          {(this.props.unlimited && uploadButton) || ((fileList || images).length >= 8 ? null : uploadButton)}
112
+        </Upload>
113
+        <Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
114
+          <img alt="example" style={{ width: '100%' }} src={getImgURL(previewImage)} />
115
+        </Modal>
116
+      </div>
117
+    );
118
+  }
119
+}
120
+
121
+export default ImageListUpload;

+ 23
- 0
src/components/DragableUploadImageList/style.less Ver arquivo

@@ -0,0 +1,23 @@
1
+:global {
2
+  .x-dargable-image-upload-list {
3
+    display: flex;
4
+  }
5
+
6
+  
7
+  .x-dargable-image-upload-list  .ant-upload-picture-card-wrapper {
8
+    width: auto !important;
9
+  }
10
+
11
+}
12
+
13
+
14
+/* you can make up upload button and sample style by using stylesheets */
15
+.ant-upload-select-picture-card i {
16
+  font-size: 32px;
17
+  color: #999;
18
+}
19
+
20
+.ant-upload-select-picture-card .ant-upload-text {
21
+  margin-top: 8px;
22
+  color: #666;
23
+}

+ 10
- 4
src/components/SelectButton/AreaSelect.jsx Ver arquivo

@@ -17,8 +17,14 @@ const CitySelect = (props) => {
17 17
 
18 18
   useEffect(() => {
19 19
     getCityAreaList();
20
-    getValue();
21
-  },[cityId])
20
+    // getValue();
21
+  },[cityId,props.value])
22
+
23
+  // useEffect(() => {
24
+   
25
+  //   getValue();
26
+  // },[props.value,cityId])
27
+
22 28
 
23 29
   const getCityAreaList = (e) => {
24 30
     request({
@@ -38,7 +44,7 @@ const CitySelect = (props) => {
38 44
     if (props.value) {
39 45
       const tempData = data.filter(f => f.id == props.value)
40 46
       const va = (tempData.length > 0) ? props.value : undefined
41
-      props.onChange(va)
47
+      // props.onChange(va)
42 48
     }
43 49
   }
44 50
 
@@ -60,7 +66,7 @@ const CitySelect = (props) => {
60 66
       }
61 67
       >
62 68
           {data.map(city => (
63
-            <Option key={city.id} value={city.name}>{city.name}</Option>
69
+            <Option key={city.id} value={`${city.id}`}>{city.name}</Option>
64 70
           ))}
65 71
       </Select>
66 72
   )

+ 20
- 19
src/components/XForm/ImageListUpload.jsx Ver arquivo

@@ -11,7 +11,7 @@ class ImageListUpload extends React.Component {
11 11
   state = {
12 12
     previewVisible: false,
13 13
     previewImage: '',
14
-    loadding: false,
14
+    loading: false,
15 15
   };
16 16
 
17 17
   getFileList = () => {
@@ -32,28 +32,29 @@ class ImageListUpload extends React.Component {
32 32
       this.setState({ loading: true });
33 33
       return;
34 34
     }
35
-
36
-    const fileList = (this.props.value || []).filter(x => x != e.file.url);
37
-    this.props.onChange(fileList);
35
+console.log(e,'handleChange')
36
+    // const fileList = (this.props.value || []).filter(x => x != e.file.url);
37
+    // this.props.onChange(fileList);
38 38
 
39 39
     // console.log('删除图片触发了', e.file)
40
-    // if (e.file.state === 'removed') {
41
-    //   const fileList = (this.props.value || []).filter(x => x != e.file.url);
42
-    //   this.props.onChange(fileList);
43
-    // }
40
+    if (e.file.status === 'removed') {
41
+      console.log(e,'handleChange22')
42
+      const fileList = (this.props.value || []).filter(x => getImgURL(x) != e.file.url);
43
+      this.props.onChange(fileList);
44
+    }
44 45
 
45
-    // if (e.file.status === "done") {
46
-    //   this.setState({
47
-    //     loading: false,
48
-    //   })
46
+    if (e.file.status === "done") {
47
+      this.setState({
48
+        loading: false,
49
+      })
49 50
 
50
-    //   if (e.file.response && e.file.response.url) {
51
-    //     if (typeof this.props.onChange === 'function') {
52
-    //       const fileList = this.getFileList()
53
-    //       this.props.onChange([...fileList || [], e.file.response.url]);
54
-    //     }
55
-    //   }
56
-    // }
51
+      if (e.file.response && e.file.response.url) {
52
+        if (typeof this.props.onChange === 'function') {
53
+          const fileList = this.getFileList()
54
+          this.props.onChange([...fileList || [], e.file.response.url]);
55
+        }
56
+      }
57
+    }
57 58
   };
58 59
 
59 60
   handleUploadSucess = (url) => {

+ 15
- 4
src/pages/building/Edit/AlbumList/List.jsx Ver arquivo

@@ -5,18 +5,29 @@ import ImageListUpload from '@/components/XForm/ImageListUpload';
5 5
 const { Panel } = Collapse;
6 6
 
7 7
 const ImageList = props => {
8
-  const { data } = props;
8
+  const { data,updateImg } = props;
9 9
   const [imageList, setImageList] = useState([]);
10 10
 
11 11
   function getImgUrl() {
12 12
     return (data.buildingImgList || []).map(item => item.url);
13 13
   }
14 14
 
15
+  function onImageChange(e) {
16
+    setImageList(e)
17
+    console.log(e,'onImageChange')
18
+       
19
+    // 新增加图片后,更新后端数据
20
+    const img = e.map((item, index) => ({ imgType: 'aparment', url: item, orderNo: index }))
21
+    updateImg({ ...data, img }).then(res=>{
22
+
23
+    })
24
+  }
25
+
15 26
   useEffect(() => {
16 27
     setImageList(getImgUrl());
17 28
   }, [data]);
18 29
 
19
-  return <ImageListUpload value={imageList} onChange={e => console.log(e, 'onChange')} unlimited />;
30
+  return <ImageListUpload value={imageList} disabled onChange={onImageChange} unlimited={false} />;
20 31
 };
21 32
 
22 33
 export default props => {
@@ -24,7 +35,7 @@ export default props => {
24 35
 
25 36
   const Extra = item => (
26 37
     <>
27
-      <Button type="link" size="small" onClick={props.onRename}>
38
+      <Button type="link" size="small" onClick={(e)=>{e.stopPropagation(),props.onRename(item)}}>
28 39
         重命名
29 40
       </Button>
30 41
       {/* <Popconfirm title="Are you sure delete this task?" onConfirm={props.onDelete}> */}
@@ -45,7 +56,7 @@ export default props => {
45 56
       {dataList.map((row, index) => {
46 57
         return (
47 58
           <Panel header={row.apartmentName} key={index} extra={Extra(row)}>
48
-            <ImageList data={row}></ImageList>
59
+            <ImageList data={row} updateImg={props.updateImg}></ImageList>
49 60
           </Panel>
50 61
         );
51 62
       })}

+ 88
- 21
src/pages/building/Edit/AlbumList/index.jsx Ver arquivo

@@ -1,8 +1,9 @@
1 1
 import React, { useState, useEffect, useRef } from 'react';
2
-import { Button, Modal,message } from 'antd';
2
+import { Button, Modal, message, Input } from 'antd';
3 3
 import request, { apis } from '@/utils/request';
4 4
 import Form from './Form';
5 5
 import List from './List';
6
+import ModalForm from '../components/ModalForm';
6 7
 
7 8
 export default props => {
8 9
   const [visible, setVisible] = useState(false);
@@ -11,7 +12,10 @@ export default props => {
11 12
   const { id } = query;
12 13
 
13 14
   const [loading, setLoading] = useState(false);
15
+  const [reNameData, setReNameData] = useState({ visible: false, data: {} });
14 16
   const [list, setList] = useState([]);
17
+  const [value, setValue] = useState('');
18
+  const [confirmLoading, setConfirmLoading] = useState(false);
15 19
   const albumRef = useRef();
16 20
 
17 21
   const getList = () => {
@@ -49,46 +53,85 @@ export default props => {
49 53
       onOk: () => {
50 54
         request({ ...apis.building.buildingApartmentDelete, urlData: { id: record.apartmentId } })
51 55
           .then(() => {
52
-            console.log('删除成功')
56
+            console.log('删除成功');
53 57
             message.success('删除成功');
54 58
             getList();
55 59
           })
56 60
           .catch(err => {
57
-            console.log('删除失败')
61
+            console.log('删除失败');
58 62
           });
59 63
       },
60 64
     });
61 65
   }
62 66
 
63
-  // const handleDelete = record => {
64
-  //   const urlData = { id: record.apartmentId };
65
-
66
-  //   setLoading(true);
67
-  //   deleteData({ urlData })
68
-  //     .then(() => {
69
-  //       getList();
70
-  //       message.success('删除成功');
71
-  //       setLoading(false);
72
-  //     })
73
-  //     .catch(err => {
74
-  //       console.error(err.message || err);
75
-  //       setLoading(false);
76
-  //     });
77
-  // };
67
+  const updateApartment = data => {
68
+  // const values= {}
69
+
70
+    // setLoading(true);
71
+
72
+    return request({
73
+      ...apis.building.buildingApartmentUpdate,
74
+      // urlData: { id: data.apartmentId },
75
+      data
76
+
77
+    })
78
+    //   .then(() => {
79
+    //     console.log('删除成功');
80
+    //     message.success('删除成功');
81
+    //     getList();
82
+    //   })
83
+    //   .catch(err => {
84
+    //     console.log('删除失败');
85
+    //   });
86
+    // deleteData({ urlData })
87
+    //   .then(() => {
88
+    //     getList();
89
+    //     message.success('删除成功');
90
+    //     setLoading(false);
91
+    //   })
92
+    //   .catch(err => {
93
+    //     console.error(err.message || err);
94
+    //     setLoading(false);
95
+    //   });
96
+  };
78 97
 
79 98
   const handleSuccess = () => {
80 99
     getList();
81 100
     setVisible(false);
82 101
   };
83 102
 
84
-  const onRename = () => {
85
-    getList();
86
-    setVisible(false);
103
+  const onRename = record => {
104
+    // getList();
105
+    setValue(record.apartmentName);
106
+    setReNameData({ visible: true, data: record });
87 107
   };
88 108
 
89 109
   useEffect(() => {
90 110
     getList();
91 111
   }, [id]);
112
+
113
+  const handleOk = () => {
114
+    // getList();
115
+    const { data } = reNameData;
116
+    setConfirmLoading(true);
117
+    const values={}
118
+    // // values.buildingId=data.buildingId
119
+    // values.apartmentType = 'photo'
120
+    // values.apartmentName = value
121
+    // values.img = data.img.map((item, index) => ({ imgType: 'aparment', url: item, orderNo: index }))
122
+    values.img = data.buildingImgList
123
+    values.apartmentId=data.apartmentId
124
+    values.buildingId = data.buildingId;
125
+    values.apartmentName = value
126
+    values.apartmentType = 'photo'
127
+    console.log(values,'values')
128
+    updateApartment({ ...values }).then(res => {
129
+      setReNameData({ visible: false, data: {} });
130
+      setConfirmLoading(false);
131
+      getList()
132
+    });
133
+  };
134
+
92 135
   return (
93 136
     <div>
94 137
       <div>
@@ -108,7 +151,31 @@ export default props => {
108 151
         onEdit={handleEdit}
109 152
         onRename={onRename}
110 153
         onDelete={handleDelete}
154
+        updateImg={updateApartment}
111 155
       />
156
+      <Modal
157
+        title="相册名称"
158
+        visible={reNameData.visible}
159
+        onCancel={() => {
160
+          setReNameData({ visible: false });
161
+        }}
162
+        // onOk={this.handleOk}
163
+        // confirmLoading={confirmLoading}
164
+        // onCancel={this.handleCancel}
165
+        // footer={true}
166
+        destroyOnClose={true}
167
+        onOk={handleOk}
168
+        confirmLoading={confirmLoading}
169
+        // onSubmit={handleSubmit}
170
+      >
171
+        <Input
172
+          value={value}
173
+          onChange={e => {
174
+            setValue(e.target.value);
175
+            // reNameData.data.apartmentName = e.target.value;
176
+          }}
177
+        ></Input>
178
+      </Modal>
112 179
     </div>
113 180
   );
114 181
 };

+ 4
- 2
src/pages/building/Edit/Basic/index.jsx Ver arquivo

@@ -28,6 +28,7 @@ const BuildingBasic = React.forwardRef((props, ref) => {
28 28
   const { query } = history.location;
29 29
   const { id } = query;
30 30
 
31
+  const [cityId,setCityId] = useState()
31 32
   const [ loading, setLoading ] = useState({ form: false, arround: false })
32 33
   const [brands] = useBrands()
33 34
   const [
@@ -50,6 +51,7 @@ const BuildingBasic = React.forwardRef((props, ref) => {
50 51
     initArrounds(res)
51 52
     initForm(form, res)
52 53
     setMarketingCode(res.marketingCode)
54
+    setCityId(res.cityId)
53 55
   })
54 56
   
55 57
   // 视频文件上传前 回调
@@ -233,13 +235,13 @@ const BuildingBasic = React.forwardRef((props, ref) => {
233 235
             {getFieldDecorator('cityId', {
234 236
               rules: [{ required: true, message: '请选择城市' }],
235 237
             })(
236
-              <SelectCity style={fullWidth} />,
238
+              <SelectCity style={fullWidth} onChange={e=>{setCityId(e)}} />,
237 239
             )}
238 240
           </Form.Item>
239 241
           <Form.Item label="楼盘区域" {...gourpItemLayout.ab.b } >
240 242
             {getFieldDecorator('buildingArea', {
241 243
               rules: [{ required: true, message: '请输入楼盘区域' }],
242
-            })(<AreaSelect style={fullWidth} />)}
244
+            })(<AreaSelect cityId={cityId} style={fullWidth} />)}
243 245
           </Form.Item>
244 246
         </FormGroupItem>
245 247
         <Form.Item label="项目地址" >

+ 22
- 1
src/pages/building/Edit/OnSiteService.jsx Ver arquivo

@@ -42,7 +42,28 @@ export default props => {
42 42
   // const getList=()=>{
43 43
   //   getMarketing
44 44
   // }
45
-  const handleCancel = row => {};
45
+  const handleCancel = row => {
46
+    request({
47
+      ...apis.building.deleteMarketing,
48
+      urlData:{id:row.id},
49
+      // params: { id },
50
+    })
51
+      .then(res => {
52
+        notification.error({
53
+          message: '成功取消绑定',
54
+          description: '',
55
+        });
56
+        getList()
57
+      })
58
+      .catch(err => {
59
+       
60
+        notification.error({
61
+          message: err.message,
62
+          description: '',
63
+        });
64
+      });
65
+
66
+  };
46 67
 
47 68
   const columns = [
48 69
     {

+ 2
- 2
src/pages/building/Edit/components/ModalForm/index.jsx Ver arquivo

@@ -5,7 +5,7 @@ import { formItemLayout } from '../../utils'
5 5
 const noop = () => undefined
6 6
 
7 7
 export default (props) => {
8
-  const { title, visible, onCancel = noop, modalProps = {}, children, ...leftProps } = props
8
+  const { title, visible, onCancel = noop, modalProps = {}, children, footer=null,...leftProps } = props
9 9
 
10 10
   return (
11 11
     <Modal
@@ -13,7 +13,7 @@ export default (props) => {
13 13
       width={800}
14 14
       visible={visible}
15 15
       onCancel={onCancel}
16
-      footer={null}
16
+      footer={footer}
17 17
       {...modalProps}
18 18
     >
19 19
       <Form {...formItemLayout} {...leftProps} >

+ 2
- 1
src/pages/building/List/tableColumns.js Ver arquivo

@@ -4,6 +4,7 @@ import moment from 'moment'
4 4
 import OperButton from '@/components/OperButton'
5 5
 import AuthButton from '@/components/AuthButton'
6 6
 import withActions from '@/components/ActionList'
7
+import { getImgURL } from '@/utils/image'
7 8
 
8 9
 export default ({page, onPublish, onDelete}) => [
9 10
   {
@@ -19,7 +20,7 @@ export default ({page, onPublish, onDelete}) => [
19 20
     align: 'center',
20 21
     render: (_, row) => {
21 22
       if (row.buildingListImg && row.buildingListImg[0]) {
22
-        return <img src={row.buildingListImg[0].url} width={128} height={72} style={{borderRadius: '4px'}} alt="" />
23
+        return <img src={getImgURL(row.buildingListImg[0].url)} width={128} height={72} style={{borderRadius: '4px'}} alt="" />
23 24
       }
24 25
       return null
25 26
     }

+ 7
- 3
src/services/apis.js Ver arquivo

@@ -194,10 +194,14 @@ export default {
194 194
     getMarketing: {
195 195
       url: `${prefix}/building/marketing`,
196 196
       method: 'GET',
197
-      action: 'admin.building.marketing,get',
197
+      action: 'admin.building.marketing.get',
198 198
     },
199
- 
200
-    // GET /api/admin/trend/{id}
199
+    deleteMarketing: {
200
+      url: `${prefix}/marketing/:id`,
201
+      method: 'DELETE',
202
+      action: 'admin.marketing.id.delete',
203
+    },
204
+
201 205
   },
202 206
   buildingType: {
203 207
     getList: {