yee 7 년 전
부모
커밋
e2e62f55e7

+ 3 - 1
js/component/account/index/normal.jsx

@@ -68,7 +68,9 @@ const Content = React.createClass({
                     <div className="index-userdata clearfix">
                         <p className="acc-title">欢迎, No.<span>{this.state.number}</span>     </p>
                         <div className="userdata-img">
-                            <img src={globalConfig.avatarHost + "/upload" + (this.state.type == 0 ? this.state.personPortraitUrl : this.state.logoUrl)} alt="" />
+                            {this.state.personPortraitUrl || this.state.logoUrl ?
+                                <img src={globalConfig.avatarHost + "/upload" + (this.state.type == 0 ? this.state.personPortraitUrl : this.state.logoUrl)} alt="" />
+                                : <img src="" alt="" />}
                         </div>
                         <div className="userdata-content">
                             {(() => {

+ 1 - 1
js/component/account/services/activity.jsx

@@ -174,7 +174,7 @@ const ActivityForm = Form.create()(React.createClass({
                                 label="技术领域"
                             >
                                 {getFieldDecorator('techField', {
-                                    initialValue: this.state.techField
+                                    initialValue: this.state.techField || []
                                 })(
                                     <Cascader
                                         style={{ width: 500 }}

+ 8 - 2
js/component/account/services/contract/contractAdd.jsx

@@ -85,6 +85,10 @@ const ContractAddFrom = Form.create()(React.createClass({
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if (!err) {
+                if (!values.patentNum && !values.copyrightNum && !values.cognizanceYear && !values.techProjectNum) {
+                    message.warning('请至少选择一个申报项目!');
+                    return;
+                };
                 this.props.spinState(true);
                 $.ajax({
                     method: "POST",
@@ -133,7 +137,8 @@ const ContractAddFrom = Form.create()(React.createClass({
                         {...formItemLayout}
                         label="联系人" >
                         {getFieldDecorator('contacts', {
-                            initialValue: theData.contacts
+                            initialValue: theData.contacts,
+                            rules: [{ required: true, message: '请选择联系人!' }],
                         })(
                             <Select placeholder="请选择联系人"
                                 style={{ width: 260 }}
@@ -146,7 +151,8 @@ const ContractAddFrom = Form.create()(React.createClass({
                         {...formItemLayout}
                         label="合同类型" >
                         {getFieldDecorator('type', {
-                            initialValue: theData.type
+                            initialValue: theData.type,
+                            rules: [{ required: true, message: '请选择合同类型!' }],
                         })(
                             <Select placeholder="请选择合同类型"
                                 style={{ width: 260 }}>

+ 7 - 0
js/component/account/services/standard.jsx

@@ -16,6 +16,13 @@ const StandardDesc = React.createClass({
         this.setState({
             loading: true,
         });
+        if (!this.state.standardName || !this.state.standardNumber || !this.state.year) {
+            message.warning('请输入正确信息!');
+            this.setState({
+                loading: false
+            });
+            return;
+        };
         $.ajax({
             method: "POST",
             dataType: "json",

+ 4 - 7
js/component/account/set/company.jsx

@@ -229,29 +229,26 @@ const PersonFrom = Form.create()(React.createClass({
         });
     },
     idttTypeChange(e) {
+        debugger
         if (e === '企业') {
-            this.props.form.setFieldsValue({ 'indentityType': e });
             this.setState({
                 companyDis: 'block',
                 schoolDis: 'none',
                 resDis: 'none'
             });
         } else if (e === '院校') {
-            this.props.form.setFieldsValue({ 'indentityType': e });
             this.setState({
                 companyDis: 'none',
                 schoolDis: 'block',
                 resDis: 'none'
             });
         } else if (e === '研究机构') {
-            this.props.form.setFieldsValue({ 'indentityType': e });
             this.setState({
                 companyDis: 'none',
                 schoolDis: 'none',
                 resDis: 'block'
             });
         } else {
-            this.props.form.setFieldsValue({ 'indentityType': e });
             this.setState({
                 companyDis: 'none',
                 schoolDis: 'none',
@@ -292,8 +289,8 @@ const PersonFrom = Form.create()(React.createClass({
                     })(
                         <Select className="acc-edu-lvl" onChange={this.idttTypeChange}>
                             {
-                                eduLevelList.map(function (item, i) {
-                                    return <Option key={i} value={item.value} >{item.key}</Option>
+                                eduLevelList.map(function (item) {
+                                    return <Option key={item.key} >{item.key}</Option>
                                 })
                             }
                         </Select>
@@ -314,7 +311,7 @@ const PersonFrom = Form.create()(React.createClass({
                     label="所在地"
                 >
                     {getFieldDecorator('province', {
-                        initialValue: this.state.province
+                        initialValue: this.state.province || []
                     })(
                         <Cascader options={areaSelect()} placeholder="请选择所在地" />
                         )}

+ 3 - 3
js/component/manageCenter/achievement/achievementOrder.jsx

@@ -536,11 +536,11 @@ const AchievementOrderList = React.createClass({
                     <AutoComplete
                         dataSource={this.state.searchData}
                         style={{ width: 200 }}
+                        value={this.state.searchName}
                         onSearch={this.state.therottleSearch}
                         placeholder="输入成果所有人"
-                        onSelect={(e) => {
-                            //this.setState({ searchName: e });
-                            this.state.searchName = e;
+                        onChange={(e) => {
+                            this.setState({ searchName: e });
                         }} />
                     <Button type="primary" onClick={this.search}>搜索</Button>
                     <Button onClick={this.reset}>重置</Button>

+ 4 - 2
js/component/manageCenter/demand/demandOrder.jsx

@@ -556,6 +556,7 @@ const DemandOrderList = React.createClass({
     reset() {
         this.state.searchName = undefined;
         this.state.status = undefined;
+        this.state.sert
         this.loadData();
     },
     render() {
@@ -582,11 +583,12 @@ const DemandOrderList = React.createClass({
                     </Select>
                     <AutoComplete
                         dataSource={this.state.searchData}
+                        value={this.state.searchName}
                         style={{ width: 200 }}
                         onSearch={this.state.therottleSearch}
                         placeholder="输入雇主名称"
-                        onSelect={(e) => {
-                            this.state.searchName = e;
+                        onChange={(e) => {
+                            this.setState({searchName : e});
                         }} />
                     <Button type="primary" onClick={this.search}>搜索</Button>
                     <Button onClick={this.reset}>重置</Button>

+ 1 - 9
js/component/manageCenter/demand/techDemand.jsx

@@ -182,18 +182,10 @@ const DemandList = React.createClass({
                     title: '发布时间',
                     dataIndex: 'releaseDateFormattedDate',
                     key: 'releaseDateFormattedDate',
-                }, {
-                    title: '管理员',
-                    dataIndex: 'principalId',
-                    key: 'principalId',
-                }, {
-                    title: '技术经纪人',
-                    dataIndex: 'techBrokerId',
-                    key: 'techBrokerId',
                 }
             ],
             dataSource: [],
-            searchTime: [,]
+            searchTime: []
         };
     },
     getCompanyList() {

+ 1 - 1
js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx

@@ -171,7 +171,7 @@ const ActivityForm = Form.create()(React.createClass({
                                 label="技术领域"
                             >
                                 {getFieldDecorator('techField', {
-                                    initialValue: this.state.techField
+                                    initialValue: this.state.techField || []
                                 })(
                                     <Cascader
                                         style={{ width: 500 }}

+ 7 - 0
js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.jsx

@@ -15,6 +15,13 @@ const StandardDesc = React.createClass({
         this.setState({
             loading: true,
         });
+        if (!this.state.standardName || !this.state.standardNumber || !this.state.year) {
+            message.warning('请输入正确信息!');
+            this.setState({
+                loading: false
+            });
+            return;
+        };
         $.ajax({
             method: "POST",
             dataType: "json",

+ 37 - 28
js/component/manageCenter/userManage/customerList.jsx

@@ -177,11 +177,13 @@ const CustomerList = React.createClass({
             data: {
                 pageNo: pageNo || 1,
                 pageSize: this.state.pagination.pageSize,
+                type: this.state.type,
                 mobile: this.state.searchLoginId, //登录名
                 email: this.state.searchEmail,
-                createTime: this.state.searchTime,
+                startCreateTime: this.state.searchTime[0],
+                endCreateTime: this.state.searchTime[1],
                 number: this.state.searchAftId, //阿凡提号
-                unitName: this.state.searchUnitName,
+                auditName: this.state.searchName,
                 auditStatus: this.state.searchAuditStatus
             },
             success: function (data) {
@@ -189,24 +191,24 @@ const CustomerList = React.createClass({
                     if (data.error && data.error.length) {
                         message.warning(data.error[0].message);
                     }
-                    return;
-                };
-                for (let i = 0; i < data.data.length; i++) {
-                    let thisdata = data.data[i];
-                    this.state.data.push({
-                        key: i,
-                        id: thisdata.id,
-                        type: thisdata.type,
-                        mobile: thisdata.mobile,
-                        email: thisdata.email,
-                        createTime: thisdata.createTime,
-                        aftUsername: thisdata.aftUsername,
-                        number: thisdata.number,
-                        auditStatus: thisdata.type == 0 ? thisdata.userAuditStatus : thisdata.orgAuditStatus,
-                        createTimeFormattedDate: thisdata.createTimeFormattedDate,
-                        adminName: thisdata.adminName,
-                        theName: thisdata.type == 0 ? thisdata.username : thisdata.unitName
-                    });
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        this.state.data.push({
+                            key: i,
+                            id: thisdata.id,
+                            type: thisdata.type,
+                            mobile: thisdata.mobile,
+                            email: thisdata.email,
+                            createTime: thisdata.createTime,
+                            aftUsername: thisdata.aftUsername,
+                            number: thisdata.number,
+                            auditStatus: thisdata.type == 0 ? thisdata.userAuditStatus : thisdata.orgAuditStatus,
+                            createTimeFormattedDate: thisdata.createTimeFormattedDate,
+                            adminName: thisdata.adminName,
+                            theName: thisdata.type == 0 ? thisdata.username : thisdata.unitName
+                        });
+                    };
                 };
                 this.state.pagination.current = data.data.pageNo;
                 this.state.pagination.total = data.data.totalCount;
@@ -226,7 +228,8 @@ const CustomerList = React.createClass({
             searchMore: true,
             data: [],
             loading: false,
-            searchTime: [,],
+            type: "1",
+            searchTime: [],
             pagination: {
                 defaultCurrent: 1,
                 defaultPageSize: 10,
@@ -250,8 +253,8 @@ const CustomerList = React.createClass({
                     key: 'mobile',
                 }, {
                     title: '用户名称',
-                    dataIndex: 'theName',
-                    key: 'theName',
+                    dataIndex: 'aftUsername',
+                    key: 'aftUsername',
                 }, {
                     title: '认证状态',
                     dataIndex: 'auditStatus',
@@ -263,8 +266,8 @@ const CustomerList = React.createClass({
                     key: 'createTimeFormattedDate',
                 }, {
                     title: '认证名称',
-                    dataIndex: 'aftUsername',
-                    key: 'aftUsername',
+                    dataIndex: 'theName',
+                    key: 'theName',
                 }, {
                     title: '联系方式',
                     dataIndex: 'email',
@@ -321,7 +324,7 @@ const CustomerList = React.createClass({
         this.state.searchAftId = undefined;
         this.state.searchLoginId = undefined;
         this.state.searchAuditStatus = undefined;
-        this.state.searchUnitName = undefined;
+        this.state.searchName = undefined;
         this.state.searchEmail = undefined;
         this.state.searchTime = [];
         this.loadData();
@@ -344,6 +347,12 @@ const CustomerList = React.createClass({
                     <UserAdd closeDesc={this.closeDesc} />
                 </div>
                 <div className="user-search">
+                    <Select placeholder="选择用户类型" style={{ width: 100 }}
+                        value={this.state.type}
+                        onChange={(e) => { this.setState({ type: e }) }}>
+                        <Select.Option value="1" >组织用户</Select.Option>
+                        <Select.Option value="0" >个人用户</Select.Option>
+                    </Select>
                     <Input placeholder="阿凡提号" value={this.state.searchAftId}
                         onChange={(e) => { this.setState({ searchAftId: e.target.value }); }} />
                     <Input placeholder="登录号" value={this.state.searchLoginId}
@@ -357,8 +366,8 @@ const CustomerList = React.createClass({
                             })
                         }
                     </Select>
-                    <Input placeholder="公司名称" value={this.state.searchUnitName}
-                        onChange={(e) => { this.setState({ searchUnitName: e.target.value }); }} />
+                    <Input placeholder="客户名称" value={this.state.searchName}
+                        onChange={(e) => { this.setState({ searchName: e.target.value }); }} />
                     <Input placeholder="联系方式" value={this.state.searchEmail}
                         onChange={(e) => { this.setState({ searchEmail: e.target.value }); }} />
                     <Button type="primary" onClick={this.search}>搜索</Button>

+ 2 - 1
js/component/manageCenter/userManage/customerSearch.jsx

@@ -25,7 +25,8 @@ const CustomerSearch = React.createClass({
                     message.warning(data.error[0].message);
                 }
                 this.setState({
-                    searchResult: data.data ? <span>名称为 {data.data} 的 {Number(this.state.searchType) ? '团体' : '个人'} 用户存在</span> : <span>未查找到该用户!</span>
+                    searchResult: data.data ? <span><Icon type="check-circle" style={{ color: '#58a3ff' }} /> 名称为[ {data.data} ]的 {Number(this.state.searchType) ? '[团体]' : '[个人]'} 用户存在</span>
+                        : <span> <Icon type="close-circle" style={{ color: '#ea0862' }} /> 未查找到该用户!</span>
                 })
             }.bind(this),
         }).always(function () {

+ 26 - 37
js/component/manageCenter/userManage/orgDesc.jsx

@@ -21,9 +21,7 @@ const OrgShow = Form.create()(React.createClass({
     },
     loadData(uid) {
         this.state.data = [];
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -93,15 +91,11 @@ const OrgShow = Form.create()(React.createClass({
                 this.props.form.resetFields();
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     getAccountManagerList() {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -126,15 +120,11 @@ const OrgShow = Form.create()(React.createClass({
                 });
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     getTechnicianList() {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -159,18 +149,14 @@ const OrgShow = Form.create()(React.createClass({
                 });
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     handleSubmit(e) {
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if (!err) {
-                this.setState({
-                    loading: true
-                });
+                this.props.spinState(true);
                 $.ajax({
                     method: "POST",
                     dataType: "json",
@@ -191,9 +177,7 @@ const OrgShow = Form.create()(React.createClass({
                         message.warning(data.error[0].message);
                     }
                 }.bind(this)).always(function () {
-                    this.setState({
-                        loading: false
-                    });
+                    this.props.spinState(false);
                     this.props.handleOk();
                 }.bind(this));
             }
@@ -471,7 +455,7 @@ const OrgShow = Form.create()(React.createClass({
                 </Tabs>
                 <FormItem wrapperCol={{ span: 12, offset: 4 }}>
                     <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
-                    <Button className="set-submit" type="ghost" onClick={() => { this.props.closeDesc }} >取消</Button>
+                    <Button className="set-submit" type="ghost" onClick={this.handleCancel} >取消</Button>
                 </FormItem>
             </Form >
         );
@@ -571,9 +555,7 @@ const OrgCertify = Form.create()(React.createClass({
         };
         this.props.form.validateFields((err, values) => {
             if (!err) {
-                this.setState({
-                    loading: true
-                });
+                this.props.spinState(true);
                 // //金额判断
                 // if (values.amountMoney && values.amountMoney < 0 && values.amountMoney > 100 && /^\d+(\.\d{2})?$/.test(values.amountMoney)) {
                 //     message.warning('请输入0-100以内的金额');
@@ -647,9 +629,9 @@ const OrgCertify = Form.create()(React.createClass({
                     }
                 }.bind(this)).always(function () {
                     this.setState({
-                        loading: false,
                         saveSign: "save"
                     });
+                    this.props.spinState(false);
                     this.props.handleOk();
                 }.bind(this));
             }
@@ -1068,30 +1050,37 @@ const OrgDesc = React.createClass({
     componentWillReceiveProps(nextProps) {
         this.state.visible = nextProps.showDesc;
     },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
     render() {
         if (this.props.data) {
             return (
                 <div className="patent-desc">
-                    <Spin spinning={this.state.loading} className='spin-box'>
-                        <Modal maskClosable={false} title="用户详情" visible={this.state.visible}
-                            onCancel={this.handleCancel}
-                            width='600px'
-                            footer=''
-                            className="admin-desc-content">
+                    <Modal maskClosable={false} title="用户详情" visible={this.state.visible}
+                        onCancel={this.handleCancel}
+                        width='600px'
+                        footer=''
+                        className="admin-desc-content">
+                        <Spin spinning={this.state.loading} className='spin-box'>
                             {window.showAuditStatus ? <OrgShow
                                 uid={this.props.data.id}
                                 data={this.props.data}
                                 closeDesc={this.handleCancel}
+                                spinState={this.spinChange}
                                 visible={this.state.visible}
                                 handleOk={this.handleOk} />
                                 : <OrgCertify
                                     uid={this.props.data.id}
                                     data={this.props.data}
                                     closeDesc={this.handleCancel}
+                                    spinState={this.spinChange}
                                     visible={this.state.visible}
                                     handleOk={this.handleOk} />}
-                        </Modal>
-                    </Spin>
+                        </Spin>
+                    </Modal>
                 </div>
             );
         } else {

+ 19 - 34
js/component/manageCenter/userManage/userDesc.jsx

@@ -16,9 +16,7 @@ const UserShow = Form.create()(React.createClass({
         };
     },
     loadData(uid) {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -65,15 +63,11 @@ const UserShow = Form.create()(React.createClass({
                 this.props.form.resetFields();
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     getAccountManagerList() {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -98,15 +92,11 @@ const UserShow = Form.create()(React.createClass({
                 });
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     getTechnicianList() {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "get",
             dataType: "json",
@@ -131,18 +121,14 @@ const UserShow = Form.create()(React.createClass({
                 });
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     handleSubmit(e) {
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
             if (!err) {
-                this.setState({
-                    loading: true
-                });
+                this.props.spinState(true);
                 $.ajax({
                     method: "POST",
                     dataType: "json",
@@ -163,9 +149,7 @@ const UserShow = Form.create()(React.createClass({
                         message.warning(data.error[0].message);
                     }
                 }.bind(this)).always(function () {
-                    this.setState({
-                        visible: false
-                    });
+                    this.props.spinState(false);
                     this.props.handleOk();
                 }.bind(this));
             }
@@ -349,9 +333,7 @@ const UserForm = Form.create()(React.createClass({
         };
     },
     loadData(uid) {
-        this.setState({
-            loading: true
-        });
+        this.props.spinState(true);
         $.ajax({
             method: "post",
             dataType: "json",
@@ -401,9 +383,7 @@ const UserForm = Form.create()(React.createClass({
                 this.props.form.resetFields();
             }.bind(this),
         }).always(function () {
-            this.setState({
-                loading: false
-            });
+            this.props.spinState(false);
         }.bind(this));
     },
     handleSubmit(e) {
@@ -421,9 +401,7 @@ const UserForm = Form.create()(React.createClass({
                 return;
             };
             if (!err) {
-                this.setState({
-                    loading: true
-                });
+                this.props.spinState(true);
                 $.ajax({
                     method: "POST",
                     dataType: "json",
@@ -463,9 +441,9 @@ const UserForm = Form.create()(React.createClass({
                     }
                 }.bind(this)).always(function () {
                     this.setState({
-                        visible: false,
                         saveSign: "save"
                     });
+                    this.props.spinState(false);
                     this.props.handleOk();
                 }.bind(this));
             }
@@ -693,6 +671,11 @@ const PatentDesc = React.createClass({
     componentWillReceiveProps(nextProps) {
         this.state.visible = nextProps.showDesc;
     },
+    spinChange(e) {
+        this.setState({
+            loading: e
+        });
+    },
     render() {
         if (this.props.data) {
             return (
@@ -708,12 +691,14 @@ const PatentDesc = React.createClass({
                                 data={this.props.data}
                                 closeDesc={this.handleCancel}
                                 visible={this.state.visible}
+                                spinState={this.spinChange}
                                 handleOk={this.handleOk} />
                                 : <UserForm
                                     uid={this.props.data.id}
                                     data={this.props.data}
                                     closeDesc={this.handleCancel}
                                     visible={this.state.visible}
+                                    spinState={this.spinChange}
                                     handleOk={this.handleOk} />}
                         </Modal>
                     </Spin>

+ 8 - 3
js/component/manageCenter/userManage/userList.jsx

@@ -37,7 +37,7 @@ const OrgAdd = React.createClass({
             url: globalConfig.context + "/api/admin/addNewUser",
             data: {
                 mobile: this.state.mobile,
-                username:this.state.username,
+                username: this.state.username,
                 type: 0
             }
         }).done(function (data) {
@@ -107,7 +107,7 @@ const UserList = React.createClass({
                 auditStatus: this.state.searchAuditStatus
             },
             success: function (data) {
-                if ( !data.data || !data.data.list) {
+                if (!data.data || !data.data.list) {
                     if (data.error && data.error.length) {
                         message.warning(data.error[0].message);
                     };
@@ -121,6 +121,7 @@ const UserList = React.createClass({
                             email: thisdata.email,
                             createTime: thisdata.createTime,
                             aftUsername: thisdata.aftUsername,
+                            username: thisdata.username,
                             number: thisdata.number,
                             auditStatus: thisdata.auditStatus,
                             createTimeFormattedDate: thisdata.createTimeFormattedDate,
@@ -168,6 +169,10 @@ const UserList = React.createClass({
                     dataIndex: 'mobile',
                     key: 'mobile',
                 }, {
+                    title: '用户名',
+                    dataIndex: 'username',
+                    key: 'username',
+                }, {
                     title: '认证状态',
                     dataIndex: 'auditStatus',
                     key: 'auditStatus',
@@ -221,7 +226,7 @@ const UserList = React.createClass({
     reset() {
         this.state.searchAftId = null;
         this.state.searchLoginId = null;
-        this.state.searchAuditStatus = null;
+        this.state.searchAuditStatus = undefined;
         this.state.searchAftUsername = null;
         this.state.searchEmail = null;
         this.state.searchTime = [];

+ 1 - 1
js/component/portal/search/subscriber.jsx

@@ -80,7 +80,7 @@ const SubContent = React.createClass({
             type: 0,
             pagination: {
                 pageNo: 1,
-                pageSize: 15,
+                pageSize: 12,
                 total: 0
             },
             dataSource: []