Commit e78e90eb authored by maple's avatar maple

[fix]设施模块修改一

parent 0cea681a
{
"CurrentProjectSetting": "无配置"
}
\ No newline at end of file
{
"ExpandedNodes": [
""
],
"PreviewInSolutionExplorer": false
}
\ No newline at end of file
File added
...@@ -200,12 +200,12 @@ export default defineConfig({ ...@@ -200,12 +200,12 @@ export default defineConfig({
icon:'HddOutlined', icon:'HddOutlined',
routes: [ routes: [
{ {
path: '/CommunityManagement/CellList', path: './CellList',
name: 'celllist', name: 'celllist',
component:'./runTest/Template' component:'./runTest/Template'
}, },
{ {
path: '/CommunityManagement/CommunityAnnouncement', path: './CommunityAnnouncement',
name: 'communityannouncement', name: 'communityannouncement',
component:'./runTest/Template' component:'./runTest/Template'
}, },
...@@ -219,11 +219,11 @@ export default defineConfig({ ...@@ -219,11 +219,11 @@ export default defineConfig({
{ path: "./Detail", component: './CommunityManagement/FacilityBookings/Detail' }, { path: "./Detail", component: './CommunityManagement/FacilityBookings/Detail' },
{ path: "./FacilityEdit", component: './CommunityManagement/FacilityBookings/FacilityManager' }, { path: "./FacilityEdit", component: './CommunityManagement/FacilityBookings/FacilityManager' },
{ path: "./FacilityDetail", component: './CommunityManagement/FacilityBookings/FacilityManager' }, { path: "./FacilityDetail", component: './CommunityManagement/FacilityBookings/FacilityManager' },
{path:"./FacilityApply",component:'./CommunityManagement/FacilityBookings/Bookings'} { path: "./FacilityApply",component:'./CommunityManagement/FacilityBookings/Bookings'}
] ]
}, },
{ {
path: '/CommunityManagement/VisitorRecord', path: './VisitorRecord',
name: 'visitorrecord', name: 'visitorrecord',
component:'./runTest/Template' component:'./runTest/Template'
}, },
...@@ -239,16 +239,16 @@ export default defineConfig({ ...@@ -239,16 +239,16 @@ export default defineConfig({
name: 'accountmanagement1', name: 'accountmanagement1',
routes: [ routes: [
{path:'./',component: './AccountManagement/AccountManagement/Account'}, {path:'./',component: './AccountManagement/AccountManagement/Account'},
{path: './AccountManagementEdit',component:'./AccountManagement/AccountManagement/AccountManagement'}, {path: './AccountManagementEdit',component:'./AccountManagement/AccountManagement/AccountManagement'},
] ]
}, },
{ {
path: '/AccountManagement/CompanyInformation', path: './CompanyInformation',
name: 'companyinformation', name: 'companyinformation',
component:'./AccountManagement/CompanyInformation/CompanyInformation' component:'./AccountManagement/CompanyInformation/CompanyInformation'
}, },
{ {
path: '/AccountManagement/LanguageSettings', path: './LanguageSettings',
name: 'languagesettings', name: 'languagesettings',
component:'./AccountManagement/LanguageSettings/LanguageSettings' component:'./AccountManagement/LanguageSettings/LanguageSettings'
}, },
......
...@@ -21,11 +21,11 @@ export default { ...@@ -21,11 +21,11 @@ export default {
}, },
}, },
pre: { pre: {
'/api/': { // '/api/': {
target: 'http://localhost:8080', // target: 'http://localhost:8080',
changeOrigin: true, // changeOrigin: true,
pathRewrite: { '^': '' }, // pathRewrite: { '^': '' },
}, // },
'/res/': { '/res/': {
target: 'http://mapleonlyone.top', target: 'http://mapleonlyone.top',
changeOrigin: true, changeOrigin: true,
......
No preview for this file type
...@@ -2,17 +2,28 @@ import React from 'react'; ...@@ -2,17 +2,28 @@ import React from 'react';
import styles from './index.less'; import styles from './index.less';
import {Button } from 'antd'; import {Button } from 'antd';
import { Link, useIntl, connect, Dispatch, history } from 'umi';
const BackButton = () => { const BackButton = (props:any) => {
const url = props.url;
const goToReturn = () => { const goToReturn = () => {
history.back() // history.back()
history.go(-1)
}
const goToReturnByParam = () => {
console.log("跳转页面"+url)
history.push(url)
} }
return ( return (
<> <>
<Button onClick={goToReturn}>Back</Button> {
url != null ?
<Button onClick={goToReturnByParam}>Back</Button>:<Button onClick={goToReturn}>Back</Button>
}
</> </>
); )
}; };
export default BackButton; export default BackButton;
...@@ -21,6 +21,9 @@ class AvatarDropdown extends React.Component<GlobalHeaderRightProps> { ...@@ -21,6 +21,9 @@ class AvatarDropdown extends React.Component<GlobalHeaderRightProps> {
const { dispatch } = this.props; const { dispatch } = this.props;
if (dispatch) { if (dispatch) {
// dispatch({
// type: 'user/deleteCurrent',
// });
dispatch({ dispatch({
type: 'login/logout', type: 'login/logout',
}); });
......
...@@ -39,7 +39,7 @@ class SelectOptions extends React.Component { ...@@ -39,7 +39,7 @@ class SelectOptions extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
const {list, dispatch,checklist} = this.props; const {list, dispatch,checklist} = this.props;
if(list==null){ if(list==null){
//console.error("组件错误:没有数据导入") //console.error("组件错误:没有数据导入")
} }
...@@ -47,12 +47,13 @@ class SelectOptions extends React.Component { ...@@ -47,12 +47,13 @@ class SelectOptions extends React.Component {
this.state = { this.state = {
menuList:ArrayToPingYin.get(list), menuList:ArrayToPingYin.get(list),
checkedListOptions:list, checkedListOptions:list,
checkedList: list, checkedList: this.props.single!=null?[]:list,
indeterminate: false, indeterminate: false,
checkAll: true, checkAll: true,
checkNone: false, checkNone: false,
resultList:list, resultList:this.props.single!=null?[]:list,
flag:false flag:false,
lastValue:null
}; };
}else{ }else{
console.log(checklist) console.log(checklist)
...@@ -64,7 +65,8 @@ class SelectOptions extends React.Component { ...@@ -64,7 +65,8 @@ class SelectOptions extends React.Component {
checkAll: true, checkAll: true,
checkNone: false, checkNone: false,
resultList:checklist, resultList:checklist,
flag:false flag:false,
lastValue:null
}; };
} }
} }
...@@ -123,23 +125,48 @@ class SelectOptions extends React.Component { ...@@ -123,23 +125,48 @@ class SelectOptions extends React.Component {
this.setState({componetVisible:this.state.selectoptionsOpen}) this.setState({componetVisible:this.state.selectoptionsOpen})
} }
}; };
onChangeValue = (checkedList) => { onChangeValue = (checkedList) => {
let difference; if(this.props.single!=null){
var a=this.state.resultList; var tmp
var b=this.state.checkedListOptions if(checkedList.length>1){
let first = a.concat(b).filter(v => a.includes(v) && !b.includes(v)) for(var i=0;i<checkedList.length;i++){
a=first if(checkedList[i]!=(this.state.lastValue)[0]){
b=checkedList tmp=checkedList[i]
difference=a.concat(b.filter(v => !a.includes(v))) }
this.setState({ }
checkedList, this.setState({
indeterminate: !!difference.length && difference.length < this.props.list.length, lastValue:[tmp],
checkAll: difference.length === this.props.list.length, checkedList:[tmp],
checkNone:difference.length===0, resultList:[tmp]
resultList:difference });
}); }else{
this.props.onSubmit(difference) tmp=checkedList
this.setState({
lastValue:checkedList,
checkedList:checkedList,
resultList:checkedList
});
}
this.props.onSubmit(tmp[0])
}else{
let difference;
var a=this.state.resultList;
var b=this.state.checkedListOptions
let first = a.concat(b).filter(v => a.includes(v) && !b.includes(v))
a=first
b=checkedList
difference=a.concat(b.filter(v => !a.includes(v)))
this.setState({
checkedList,
indeterminate: !!difference.length && difference.length < this.props.list.length,
checkAll: difference.length === this.props.list.length,
checkNone:difference.length===0,
resultList:difference
});
this.props.onSubmit(difference)
}; };
}
onCheckAllChange = e => { onCheckAllChange = e => {
this.setState({ this.setState({
checkedList:this.props.list, checkedList:this.props.list,
...@@ -206,7 +233,7 @@ class SelectOptions extends React.Component { ...@@ -206,7 +233,7 @@ class SelectOptions extends React.Component {
this.state.componetVisible==this.state.selectoptionsOpen? this.state.componetVisible==this.state.selectoptionsOpen?
<> <>
<div style={{width:"100%",height:48, position:"relative"}}> <div style={{width:"100%",height:48, position:"relative"}}>
<div style={{ position:"absolute",left:5,top:5}}>{this.state.selectoptionsSelected}{this.state.resultList.length==this.props.list.length?this.state.selectoptionsAllCell:null}</div> <div style={{ position:"absolute",left:5,top:5}}>{this.state.resultList.length==0?this.state.selectoptionsSelectNone:this.state.selectoptionsSelected}{this.state.resultList.length==this.props.list.length?(this.state.selectoptionsAllCell):(null)}</div>
<div style={{ position:"absolute",right:16,top:5,cursor:"pointer"}} onClick={()=>this.hideAndexpand()}>{this.state.componetVisible}<DownOutlined /></div> <div style={{ position:"absolute",right:16,top:5,cursor:"pointer"}} onClick={()=>this.hideAndexpand()}>{this.state.componetVisible}<DownOutlined /></div>
</div> </div>
<div style={{paddingLeft:15,paddingRight:15,paddingBottom:20}}>{this.state.resultList.length==this.props.list.length?null:getDotText(this.state.resultList)}</div> <div style={{paddingLeft:15,paddingRight:15,paddingBottom:20}}>{this.state.resultList.length==this.props.list.length?null:getDotText(this.state.resultList)}</div>
...@@ -232,8 +259,13 @@ class SelectOptions extends React.Component { ...@@ -232,8 +259,13 @@ class SelectOptions extends React.Component {
}) })
} }
</div> </div>
<Checkbox style={{ position:"absolute",right:130}} indeterminate={this.state.indeterminate} onChange={this.onCheckAllChange} checked={this.state.checkAll}>{this.state.selectoptionsSelectAll}</Checkbox> {
<Checkbox style={{ position:"absolute",right:0}} onChange={this.onCheckAllChangeOver} checked={this.state.checkNone} >{this.state.selectoptionsSelectNone}</Checkbox> this.props.single!=null?null:
<>
<Checkbox style={{ position:"absolute",right:130}} indeterminate={this.state.indeterminate} onChange={this.onCheckAllChange} checked={this.state.checkAll}>{this.state.selectoptionsSelectAll}</Checkbox>
<Checkbox style={{ position:"absolute",right:0}} onChange={this.onCheckAllChangeOver} checked={this.state.checkNone} >{this.state.selectoptionsSelectNone}</Checkbox>
</>
}
</div> </div>
<div style={{width:"100%",paddingLeft:16,paddingRight:16}}> <div style={{width:"100%",paddingLeft:16,paddingRight:16}}>
<div style={{width:"100%",backgroundColor:"#ffffff",border:"1px solid #cfcfcf",padding:5}}> <div style={{width:"100%",backgroundColor:"#ffffff",border:"1px solid #cfcfcf",padding:5}}>
......
This diff is collapsed.
This diff is collapsed.
/* 使用说明:(传入的参数 使用sort排序 )
import SelectOptions from '../../components/SelectOptions/index';
const printContent = (comment: any)=>{
console.log(comment)
}
<SelectOptions list={["美国","美丽的","美好","加拿大","加油","XO"].sort()} onSubmit={printContent}/>
*/
\ No newline at end of file
...@@ -61,8 +61,15 @@ const TimeSelect = (props:any) => { ...@@ -61,8 +61,15 @@ const TimeSelect = (props:any) => {
} }
const timeChange = (index: any, values: any) => { const timeChange = (index: any, values: any) => {
var tmp = times; var tmp = times;
tmp[index].time =timeForm(values) console.log("Maple诊断"+index)
console.log(values)
if (values != null) {
tmp[index].time =timeForm(values)
} else {
tmp[index].time =null
}
props.putSubmit(CheckParm(tmp)) props.putSubmit(CheckParm(tmp))
} }
return ( return (
......
...@@ -20,7 +20,7 @@ const TitleBack = (props:any) => { ...@@ -20,7 +20,7 @@ const TitleBack = (props:any) => {
: :
<></> <></>
} }
<div className={styles.item2}><BackButton/></div> <div className={styles.item2}><BackButton url={props.url}/></div>
<div className={styles.clear0}></div> <div className={styles.clear0}></div>
</> </>
); );
......
import React, { useState } from 'react'; import React, { useState,useEffect} from 'react';
import { Link, useIntl, connect, Dispatch, history } from 'umi'; import { Link, useIntl, connect, Dispatch, history } from 'umi';
import styles from './index.less'; import styles from './index.less';
...@@ -14,24 +14,34 @@ import { gray } from 'chalk'; ...@@ -14,24 +14,34 @@ import { gray } from 'chalk';
const TitleSearch= (props:any) => { const TitleSearch= (props:any) => {
const { CommunityList } = props; const {dispatch, CommunityList } = props;
const tosCommunityget = (values:any) => {dispatch({type: 'Init/tosCommunityget',playload:values})};
useEffect(() => {
if (CommunityList == null) {
tosCommunityget(null)
}
}, []);
const key = props.listkey const key = props.listkey
const name = props.list; const name = props.list;
const single=props.single
const status = props.status; const status = props.status;
const time = props.time; const time = props.time;
const community = props.community; const community = props.community;
const [selectOptions, setSelectOptions] = useState(true) const [selectOptions, setSelectOptions] = useState(true)
const [communitys, setCommunitys] = useState(CommunityList) const [communitys, setCommunitys] = useState(CommunityList)
const [datePicker, setDate]=useState(null) const [datePicker, setDate] = useState(null)
const onFinish = values => { const onFinish = values => {
if (datePicker) { if (datePicker) {
values[time[0]] = datePicker; values[time[0]] = datePicker;
} }
if (community) { if (community) {
values.communitydata=communitys values[community]=communitys
} }
console.log('Success:', values); console.log('Success:', values);
props.onSubmit(values) props.onSubmit(values)
...@@ -57,7 +67,7 @@ const TitleSearch= (props:any) => { ...@@ -57,7 +67,7 @@ const TitleSearch= (props:any) => {
key!=null? key!=null?
key.map((item, index) => { key.map((item, index) => {
return ( return (
<Col key={"KeyCol_"+ index}><Form.Item name={item}><Input placeholder={name[index]} /></Form.Item></Col> <Col key={"KeyCol_"+ index}><Form.Item name={item}><Input placeholder={name[index]} /></Form.Item></Col>
) )
}) })
:null :null
...@@ -82,7 +92,7 @@ const TitleSearch= (props:any) => { ...@@ -82,7 +92,7 @@ const TitleSearch= (props:any) => {
} }
{ {
time != null ? time != null ?
<Col key={"datePicker_"} > <DatePicker placeholder={time[1]} onChange={onChange} /></Col> <Col key={"datePicker_"} > <DatePicker placeholder={time[1]} onChange={onChange} /></Col>
: null : null
} }
{ {
...@@ -94,7 +104,12 @@ const TitleSearch= (props:any) => { ...@@ -94,7 +104,12 @@ const TitleSearch= (props:any) => {
{ {
community != null ? community != null ?
<> <>
<SelectOptions list={CommunityList.sort()} show={selectOptions} onSubmit={printContent} /> {
CommunityList != null ?
<SelectOptions single={single} list={CommunityList.sort()} show={selectOptions} onSubmit={printContent} />:
null
}
<Form.Item><Button type="primary" htmlType="submit" style={{ backgroundColor: "#e7f4ff",color:"rgba(24,144,255,1)"}}>Search</Button></Form.Item> <Form.Item><Button type="primary" htmlType="submit" style={{ backgroundColor: "#e7f4ff",color:"rgba(24,144,255,1)"}}>Search</Button></Form.Item>
</> : null </> : null
} }
......
...@@ -104,6 +104,9 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => { ...@@ -104,6 +104,9 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
if (dispatch) { if (dispatch) {
dispatch({ dispatch({
type: 'user/fetchCurrent', type: 'user/fetchCurrent',
playload: {
userName: "admin",
password:"admin",}
}); });
} }
}, []); }, []);
......
import React from 'react'; import React from 'react';
import { PageLoading } from '@ant-design/pro-layout'; import { PageLoading } from '@ant-design/pro-layout';
import { Redirect, connect, ConnectProps } from 'umi'; import { Redirect, connect, ConnectProps, StateType } from 'umi';
import { stringify } from 'querystring'; import { stringify } from 'querystring';
import { ConnectState } from '@/models/connect'; import { ConnectState } from '@/models/connect';
import { CurrentUser } from '@/models/user'; import { CurrentUser } from '@/models/user';
import login from '@/pages/user/login';
interface SecurityLayoutProps extends ConnectProps { interface SecurityLayoutProps extends ConnectProps {
loading?: boolean; loading?: boolean;
currentUser?: CurrentUser; currentUser?: CurrentUser;
login?: StateType;
} }
interface SecurityLayoutState { interface SecurityLayoutState {
...@@ -23,30 +25,39 @@ class SecurityLayout extends React.Component<SecurityLayoutProps, SecurityLayout ...@@ -23,30 +25,39 @@ class SecurityLayout extends React.Component<SecurityLayoutProps, SecurityLayout
this.setState({ this.setState({
isReady: true, isReady: true,
}); });
const { dispatch } = this.props; const { dispatch ,login} = this.props;
console.log("登录中") console.log("登录中")
if (dispatch) { if (dispatch) {
dispatch({ dispatch({
type: 'user/fetchCurrent', type: 'user/fetchCurrent',
playload: {
userName: login.userName,
password: login.password
}
}); });
} }
} }
render() { render() {
const { isReady } = this.state; const { isReady } = this.state;
const { children, loading, currentUser } = this.props; const { children, loading, currentUser,login } = this.props;
// You can replace it to your authentication rule (such as check token exists) // You can replace it to your authentication rule (such as check token exists)
// 你可以把它替换成你自己的登录认证规则(比如判断 token 是否存在) // 你可以把它替换成你自己的登录认证规则(比如判断 token 是否存在)
const isLogin = currentUser && currentUser.userid;//isLogin为关键点 console.log("是否已登录")
// const isLogin = currentUser && currentUser.name;//isLogin为关键点
var isLogin = false
if (currentUser.name != null) {
isLogin=true
}
isLogin=true
const queryString = stringify({ const queryString = stringify({
redirect: window.location.href, redirect: window.location.href,
}); });
if ((!isLogin && loading) || !isReady) { if ((!isLogin && loading) || !isReady) {
// console.log("页面加载")
return <PageLoading />; return <PageLoading />;
} }
if (!isLogin && window.location.pathname !== '/user/login') { if (!isLogin && window.location.pathname !== '/user/login') {
...@@ -56,7 +67,8 @@ class SecurityLayout extends React.Component<SecurityLayoutProps, SecurityLayout ...@@ -56,7 +67,8 @@ class SecurityLayout extends React.Component<SecurityLayoutProps, SecurityLayout
} }
} }
export default connect(({ user, loading }: ConnectState) => ({ export default connect(({ user, loading,login}: ConnectState) => ({
currentUser: user.currentUser, currentUser: user.currentUser,
loading: loading.models.user, loading: loading.models.user,
login:login
}))(SecurityLayout); }))(SecurityLayout);
...@@ -19,8 +19,8 @@ export default { ...@@ -19,8 +19,8 @@ export default {
}, },
reducers: { reducers: {
returnPage(state, { Data,DataPage}) { returnPage(state, { Data,DataPage,DataSave}) {
return { ...state, Data,DataPage }; return { ...state, Data,DataPage,DataSave };
}, },
returnPage2(state, { Data2 }) { returnPage2(state, { Data2 }) {
return { ...state, Data2 }; return { ...state, Data2 };
...@@ -39,18 +39,25 @@ export default { ...@@ -39,18 +39,25 @@ export default {
}, },
returnSource(state, { sourceData }) { returnSource(state, { sourceData }) {
return { ...state, sourceData }; return { ...state, sourceData };
} },
}, },
effects: { effects: {
//预订设施查询 //预订设施查询
*RA({ playload }, { call, put }) { *RA({ playload }, { call, put }) {
console.log("发送请求")
const resp = yield call(service.RA, playload); const resp = yield call(service.RA, playload);
console.log(resp) console.log(resp)
if (resp.code == 500) { if (resp.code == 500||resp.error_code!="0000") {
//window.location.href = '/500'; // window.location.href = '/500';
} else { }
if (resp.error_code != "0000") {
console.log("请求错误码:"+resp.error_code)
console.log(playload)
}
else {
switch (playload.index) { switch (playload.index) {
case 0: case 0:
case 9: case 9:
...@@ -80,6 +87,7 @@ export default { ...@@ -80,6 +87,7 @@ export default {
case 4: case 4:
case 5: case 5:
case 6: { case 6: {
message.success("Success Operation!",3)
window.location.href = '/CommunityManagement/FacilityBookings'; window.location.href = '/CommunityManagement/FacilityBookings';
} break; } break;
case 7: { case 7: {
...@@ -118,8 +126,12 @@ export default { ...@@ -118,8 +126,12 @@ export default {
*SA({ playload }, { call, put }) { *SA({ playload }, { call, put }) {
var DataSave = playload var DataSave = playload
yield put({type: 'returnDataSave', DataSave} ) yield put({type: 'returnDataSave', DataSave} )
} },
*CA({ playload }, { call, put }) {
var sourceData = playload
yield put({type: 'returnSource',sourceData})
}
}, },
}; };
...@@ -3,12 +3,13 @@ import { message } from 'antd'; ...@@ -3,12 +3,13 @@ import { message } from 'antd';
import { routerRedux } from 'dva/router' import { routerRedux } from 'dva/router'
import { timestampToTime } from '../utils/time';
export default { export default {
namespace: 'CommunityService', namespace: 'CommunityService',
state: { state: {
Data: null, Data: null,
CurData: null, CurData: null,
CurDataDetail:{community:'',address:'',home:'',name:'',phone:'',email:'',content:''}, CurDataDetail:{},
}, },
reducers: { reducers: {
...@@ -31,9 +32,14 @@ export default { ...@@ -31,9 +32,14 @@ export default {
console.log(resp) console.log(resp)
if (resp.error_code != 0) { if (resp.error_code != 0) {
window.location.href = '/500'; window.location.href = '/500';
} else { }
console.log(resp.error_code)
if (resp.error_code == "0000") {
let Data = resp.data.rows; let Data = resp.data.rows;
yield put({ type: 'returnPage', Data, }); yield put({ type: 'returnPage', Data, });
} else {
let Data = null;
yield put({ type: 'returnPage', Data, });
} }
}, },
*TosCommuntiyServiceReply({ playload }, { call, put }) { *TosCommuntiyServiceReply({ playload }, { call, put }) {
...@@ -45,8 +51,7 @@ export default { ...@@ -45,8 +51,7 @@ export default {
//window.location.href = '/CommercialService/OwnerComplaints'; //window.location.href = '/CommercialService/OwnerComplaints';
} }
}, },
*TosCommunityServiceGetDetail({ playload }, { call, put }) { *TosCommunityServiceGetDetail({ playload }, { call, put }) {
const resp = yield call(service.TosCommunityServiceGetDetail, playload); const resp = yield call(service.TosCommunityServiceGetDetail, playload);
console.log(resp) console.log(resp)
...@@ -54,7 +59,10 @@ export default { ...@@ -54,7 +59,10 @@ export default {
window.location.href = '/500'; window.location.href = '/500';
} else { } else {
var tmp = resp.data.rows[0].tosOwerModel; var tmp = resp.data.rows[0].tosOwerModel;
var tmp2 = resp.data.rows[0].replyContent; var tmp2 = resp.data.rows[0];
console.log(tmp2.imgUrl)
// TODO:还差图片
var CurDataDetail = { var CurDataDetail = {
community: tmp.communityName, community: tmp.communityName,
address: tmp.addressAndpostalCode, address: tmp.addressAndpostalCode,
...@@ -62,9 +70,10 @@ export default { ...@@ -62,9 +70,10 @@ export default {
name: tmp.owerName, name: tmp.owerName,
phone: tmp.owerPhone, phone: tmp.owerPhone,
email: tmp.owerEmail, email: tmp.owerEmail,
content: tmp2, content: resp.data.rows[0].serviceContent,
status: tmp2.handleStatus,
time:timestampToTime(tmp2.createTime.time)
}; };
yield put({ type: 'returnCurDataDetail', CurDataDetail, }); yield put({ type: 'returnCurDataDetail', CurDataDetail, });
} }
}, },
......
...@@ -20,8 +20,6 @@ export default { ...@@ -20,8 +20,6 @@ export default {
return { ...state, CurDataFollow }; return { ...state, CurDataFollow };
}, },
returnCurDataFollowDetail(state, { CurDataFollowDetail }) { returnCurDataFollowDetail(state, { CurDataFollowDetail }) {
return { ...state, CurDataFollowDetail }; return { ...state, CurDataFollowDetail };
}, },
...@@ -38,11 +36,19 @@ export default { ...@@ -38,11 +36,19 @@ export default {
const resp = yield call(service.TosTosServiceProviderGet, playload); const resp = yield call(service.TosTosServiceProviderGet, playload);
console.log(resp) console.log(resp)
if (resp.code == 500) { if (resp.code == 500) {
window.location.href = '/500'; // window.location.href = '/500';
} else { }
if (resp.error_code == "0000") {
let Data = resp.data.rows; let Data = resp.data.rows;
yield put({ type: 'returnPage', Data, }); yield put({ type: 'returnPage', Data, });
} else {
console.log("请求错误码:"+resp.error_code)
let Data = null;
console.log(playload)
yield put({ type: 'returnPage', Data, });
} }
}, },
// 新建服务商 // 新建服务商
*TosTosServiceProviderSave({ playload }, { call, put }) { *TosTosServiceProviderSave({ playload }, { call, put }) {
......
...@@ -6,7 +6,7 @@ import { routerRedux } from 'dva/router' ...@@ -6,7 +6,7 @@ import { routerRedux } from 'dva/router'
export default { export default {
namespace: 'Init', namespace: 'Init',
state: { state: {
CommunityList: [], CommunityList: null,
}, },
reducers: { reducers: {
......
import { stringify } from 'querystring'; import { stringify } from 'querystring';
import { history, Reducer, Effect } from 'umi'; import { history, Reducer, Effect } from 'umi';
import { AccountLogin,AccountCheckLogin } from '@/services/login'; import { AccountLogin,AccountCheckLogin,AccountOut } from '@/services/login';
import { setAuthority } from '@/utils/authority'; import { setAuthority } from '@/utils/authority';
import { getPageQuery } from '@/utils/utils'; import { getPageQuery } from '@/utils/utils';
...@@ -10,6 +10,8 @@ export interface StateType { ...@@ -10,6 +10,8 @@ export interface StateType {
type?: string; type?: string;
currentAuthority?: 'user' | 'guest' | 'admin'; currentAuthority?: 'user' | 'guest' | 'admin';
token?: string; token?: string;
userName?: string;
password?: string;
} }
export interface LoginModelType { export interface LoginModelType {
...@@ -30,7 +32,9 @@ const Model: LoginModelType = { ...@@ -30,7 +32,9 @@ const Model: LoginModelType = {
state: { state: {
status: undefined, status: undefined,
token:'A', token: 'A',
userName: '',
password:'',
}, },
reducers: { reducers: {
...@@ -42,8 +46,8 @@ const Model: LoginModelType = { ...@@ -42,8 +46,8 @@ const Model: LoginModelType = {
type: payload.type, type: payload.type,
}; };
}, },
saveToken(state, { token }) { saveToken(state, { token,userName,password }) {
return{...state,token} return{...state,token,userName,password}
} }
}, },
...@@ -56,10 +60,12 @@ const Model: LoginModelType = { ...@@ -56,10 +60,12 @@ const Model: LoginModelType = {
}); });
// Login successfully // Login successfully
if (response.status === 'ok') { if (response.status === 'ok') {
console.log("登录成功") console.log("登录成功")
console.log(response)
const userMessage = yield call(AccountCheckLogin, payload);//请求时间网络 const userMessage = yield call(AccountCheckLogin, payload);//请求时间网络
console.log(userMessage)
console.log(userMessage.token) console.log(userMessage.token)
yield put({type: 'saveToken',token: userMessage.token}); yield put({type: 'saveToken',token: userMessage.token,userName:payload.userName,password:payload.password});
const urlParams = new URL(window.location.href); const urlParams = new URL(window.location.href);
const params = getPageQuery(); const params = getPageQuery();
let { redirect } = params as { redirect: string }; let { redirect } = params as { redirect: string };
...@@ -79,9 +85,10 @@ const Model: LoginModelType = { ...@@ -79,9 +85,10 @@ const Model: LoginModelType = {
} }
}, },
logout() { *logout({},{call,put}) {
const { redirect } = getPageQuery(); const { redirect } = getPageQuery();
// Note: There may be security issues, please note // Note: There may be security issues, please note
// const response = yield call(AccountOut, payload);
if (window.location.pathname !== '/user/login' && !redirect) { if (window.location.pathname !== '/user/login' && !redirect) {
history.replace({ history.replace({
pathname: '/user/login', pathname: '/user/login',
......
...@@ -4,18 +4,13 @@ import { queryCurrent, query as queryUsers } from '@/services/user'; ...@@ -4,18 +4,13 @@ import { queryCurrent, query as queryUsers } from '@/services/user';
export interface CurrentUser { export interface CurrentUser {
avatar?: string; avatar?: string;
name?: string; token?: string;
title?: string;
group?: string;
signature?: string;
tags?: {
key: string;
label: string;
}[];
userid?: string; userid?: string;
unreadCount?: number; name?: string;
permission?: [];
} }
export interface UserModelState { export interface UserModelState {
currentUser?: CurrentUser; currentUser?: CurrentUser;
} }
...@@ -26,9 +21,11 @@ export interface UserModelType { ...@@ -26,9 +21,11 @@ export interface UserModelType {
effects: { effects: {
fetch: Effect; fetch: Effect;
fetchCurrent: Effect; fetchCurrent: Effect;
deleteCurrent: Effect;
}; };
reducers: { reducers: {
saveCurrentUser: Reducer<UserModelState>; saveCurrentUser: Reducer<UserModelState>;
deleteCurrentUser:Reducer<UserModelState>;
changeNotifyCount: Reducer<UserModelState>; changeNotifyCount: Reducer<UserModelState>;
}; };
} }
...@@ -48,13 +45,19 @@ const UserModel: UserModelType = { ...@@ -48,13 +45,19 @@ const UserModel: UserModelType = {
payload: response, payload: response,
}); });
}, },
*fetchCurrent(_, { call, put }) { *fetchCurrent({playload}, { call, put }) {
const response = yield call(queryCurrent); const response = yield call(queryCurrent,playload);
console.log(response)
yield put({ yield put({
type: 'saveCurrentUser', type: 'saveCurrentUser',
payload: response, payload: response,
}); });
}, },
*deleteCurrent({playload}, { call, put }) {
yield put({
type: 'deleteCurrentUser',
});
},
}, },
reducers: { reducers: {
...@@ -64,6 +67,12 @@ const UserModel: UserModelType = { ...@@ -64,6 +67,12 @@ const UserModel: UserModelType = {
currentUser: action.payload || {}, currentUser: action.payload || {},
}; };
}, },
deleteCurrentUser(state, action) {
return {
...state,
currentUser: {},
};
},
changeNotifyCount( changeNotifyCount(
state = { state = {
currentUser: {}, currentUser: {},
......
This diff is collapsed.
...@@ -10,12 +10,6 @@ import TitleSearch from '../../components/TitleSearch/TitleSearch'; ...@@ -10,12 +10,6 @@ import TitleSearch from '../../components/TitleSearch/TitleSearch';
const PropertyServices = (props: any) => { const PropertyServices = (props: any) => {
const { formatMessage } = useIntl();
const nameofowner = formatMessage({ id: 'R.charge.input.nameofowner' })
const inputProject = formatMessage({ id: 'R.charge.input.project' })
const search = formatMessage({ id: 'R.charge.search' })
const { dispatch, location, Data } = props; const { dispatch, location, Data } = props;
const TosCommunityServiceGet = (values: any) => { dispatch({ type: 'CommunityService/TosCommunityServiceGet', playload: values }) }; const TosCommunityServiceGet = (values: any) => { dispatch({ type: 'CommunityService/TosCommunityServiceGet', playload: values }) };
const setCurData = (values: any) => { dispatch({ type: 'CommunityService/setCurData', playload: values }) }; const setCurData = (values: any) => { dispatch({ type: 'CommunityService/setCurData', playload: values }) };
...@@ -25,17 +19,13 @@ const PropertyServices = (props: any) => { ...@@ -25,17 +19,13 @@ const PropertyServices = (props: any) => {
const [loading,setLoading]=useState(false) const [loading,setLoading]=useState(false)
const goToFunction = (value, record, e) => { const goToFunction = (value, record, e) => {
console.log(record)
setCurData(record) setCurData(record)
history.push(location.pathname+(value==0?"/Edit":"/Detail")) history.push(location.pathname+(value==0?"/Edit":"/Detail"))
} }
const goToRequest = () => { const goToRequest = () => {
history.push("./AccessCardApplication/Request") history.push("./AccessCardApplication/Request")
} }
const columns = [ const columns = [
{ title: "community_name",dataIndex: 'community_name',}, { title: "community_name",dataIndex: 'community_name',},
{ title: "ower_name",dataIndex: 'ower_name',}, { title: "ower_name",dataIndex: 'ower_name',},
......
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import styles from './Bookings.less'; import styles from './css/Bookings.less';
import { Input ,DatePicker,Button,Space,Pagination,message, Radio,TimePicker,Row, Col } from 'antd'; import { Input ,DatePicker,Button,message, Radio,TimePicker,Row, Col } from 'antd';
const { RangePicker } = TimePicker; const { RangePicker } = TimePicker;
import moment from 'moment';
import { Link, useIntl, connect, Dispatch } from 'umi'; import {connect } from 'umi';
import TitleBack from '../../../components/TitleBack/TitleBack'; import TitleBack from '../../../components/TitleBack/TitleBack';
const Bookings = (props:any) => { const Bookings = (props:any) => {
const { dispatch, location, Data3,Data3Error,Data4,DataSave,token} = props; const { dispatch, Data3,Data3Error,Data4,DataSave,token} = props;
const RA = (index:any,values: any) => { dispatch({ type: 'FacilityBookings/RA', playload: { index: index, body: values } }) }; const RA = (index:any,values: any) => { dispatch({ type: 'FacilityBookings/RA', playload: { index: index, body: values } }) };
const IA = () => { dispatch({ type: 'FacilityBookings/IA' }) }; const IA = () => { dispatch({ type: 'FacilityBookings/IA' }) };
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
...@@ -35,7 +35,6 @@ const Bookings = (props:any) => { ...@@ -35,7 +35,6 @@ const Bookings = (props:any) => {
setLoading(false) setLoading(false)
}, [Data3]); }, [Data3]);
const [radioGroupValue,setRadioGroupValue]=useState(0)
const changeRadio = () => { const changeRadio = () => {
} }
...@@ -66,7 +65,7 @@ const Bookings = (props:any) => { ...@@ -66,7 +65,7 @@ const Bookings = (props:any) => {
<div className={styles.box2item2}> <div className={styles.box2item2}>
<Radio.Group onChange={changeRadio} defaultValue={1}> <Radio.Group onChange={changeRadio} defaultValue={1}>
{ {
Data3.map((item, index) => { Data3.map((item:any, index:any) => {
return ( return (
<Radio key={"Radio_" + index} value={item.categoriesId}>{item.categoriesName}</Radio> <Radio key={"Radio_" + index} value={item.categoriesId}>{item.categoriesName}</Radio>
) )
...@@ -97,8 +96,8 @@ const Bookings = (props:any) => { ...@@ -97,8 +96,8 @@ const Bookings = (props:any) => {
<div className={styles.box5item1}>Booking Schedule</div> <div className={styles.box5item1}>Booking Schedule</div>
<div className={styles.box5item2}> <div className={styles.box5item2}>
<Row gutter={8}> <Row gutter={8}>
<Col> <DatePicker /></Col> <Col><DatePicker /></Col>
<Col> <RangePicker defaultValue={moment('12:30', format)} onChange={Mitime} format={format}/></Col> <Col><RangePicker onChange={Mitime} format={format}/></Col>
</Row> </Row>
</div> </div>
</div> </div>
......
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import styles from './BookingsView.less'; import styles from './css/BookingsView.less';
import { Input ,Menu,Table,Space,Pagination,Tooltip, Button, Radio } from 'antd'; import { Input ,Menu,Table,Space,Pagination,Tooltip, Button, Radio } from 'antd';
import { Link, useIntl, connect, Dispatch } from 'umi'; import { Link, useIntl, connect, Dispatch } from 'umi';
......
import React, { useState, useEffect,useRef } from 'react'; import React, { useState, useEffect,useRef } from 'react';
import styles from './index.less'; import styles from './css/index.less';
import { Input ,Menu,Table,Space,Form,Radio, Modal,Row,Col, Button } from 'antd'; import { Input ,Menu,Table,Space,Form,Radio, Modal,Row,Col, Button } from 'antd';
import { Link, useIntl, connect, Dispatch } from 'umi'; import { Link, useIntl, connect, Dispatch } from 'umi';
...@@ -9,10 +9,11 @@ import TitleBack from '../../../components/TitleBack/TitleBack'; ...@@ -9,10 +9,11 @@ import TitleBack from '../../../components/TitleBack/TitleBack';
import Line from '../../../components/Line/Line'; import Line from '../../../components/Line/Line';
import { timestampToTime3 } from '../../../utils/time'; import { timestampToTime3 } from '../../../utils/time';
import TextArea from 'antd/lib/input/TextArea'; import TextArea from 'antd/lib/input/TextArea';
import { values } from 'lodash';
import {getUrlLast} from '../../../utils/string';
const Detail = (props:any) => { const Detail = (props:any) => {
const { dispatch, DataSave,DataSaveDetail,token} = props; const { dispatch,location, DataSave,DataSaveDetail,token} = props;
const RA = (index:any,values: any) => { dispatch({ type: 'FacilityBookings/RA', playload: { index: index, body: values } }) }; const RA = (index:any,values: any) => { dispatch({ type: 'FacilityBookings/RA', playload: { index: index, body: values } }) };
useEffect(() => { useEffect(() => {
...@@ -90,7 +91,7 @@ const Detail = (props:any) => { ...@@ -90,7 +91,7 @@ const Detail = (props:any) => {
return ( return (
<div className={styles.base}> <div className={styles.base}>
<TitleBack title={"View Facility Bookings"}/> <TitleBack title={"View Facility Bookings"} url={getUrlLast(location.pathname)+'?type=Detail'}/>
<Row gutter={8}> <Row gutter={8}>
<Col>预订状态</Col><Col span={2}>{statusDes[DataSave.status]}</Col> <Col>预订状态</Col><Col span={2}>{statusDes[DataSave.status]}</Col>
......
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import styles from './index.less'; import styles from './css/index.less';
import { Input ,Tabs,Table,Space, Button} from 'antd'; import { Input ,Tabs,Table,Space, Button} from 'antd';
const { TabPane } = Tabs; const { TabPane } = Tabs;
...@@ -12,22 +12,24 @@ import { timestampToTime } from '../../../utils/time'; ...@@ -12,22 +12,24 @@ import { timestampToTime } from '../../../utils/time';
import TitleSearch from '../../../components/TitleSearch/TitleSearch'; import TitleSearch from '../../../components/TitleSearch/TitleSearch';
const managerFeeStatusDes= ["未交", "已交", "已退"] const managerFeeStatusDes= ["未交", "已交", "已退"]
const marginFeeStatusDes = ["未交", "已交", "未退", "已退部分", "已退全部"] const marginFeeStatusDes = ["未交", "已交", "未退", "已退部分", "已退全部"]
const statusDes = ["全部", "已申请", "已预订", "已使用", "已取消", "已完成"] const statusDes = ["全部", "已申请", "已预订", "已使用", "已取消", "已完成"]
import { getUrlLastParams } from '../../../utils/string';
const FacilityBookings = (props:any) => { const FacilityBookings = (props:any) => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const { dispatch, location, Data, DataPage, Data2, token } = props; const { dispatch, location, Data, Data2, token,DataSave } = props;
const RA = (index:any,values: any) => { dispatch({ type: 'FacilityBookings/RA', playload: {index:index, body:values } }) }; const RA = (index:any,values: any) => { dispatch({ type: 'FacilityBookings/RA', playload: {index:index, body:values } }) };
const SA = (values: any) => { dispatch({ type: 'FacilityBookings/SA', playload: values }) }; const SA = (values: any) => { dispatch({ type: 'FacilityBookings/SA', playload: values }) };
const CA = () => { dispatch({ type: 'FacilityBookings/CA', playload: null }) };
const [tab, setTab] = useState(1) const [tab, setTab] = useState(location.query.Facility == "true" ? 2 : 1)
const [curPage, setCurPage] = useState(1) const [curSearchString,setCurSearchString]=useState({subscribeDate:null,status:null,curPage:null})
const [curPage2, setCurPage2] = useState(1) const [curPage2, setCurPage2] = useState(1)
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
...@@ -35,11 +37,26 @@ const FacilityBookings = (props:any) => { ...@@ -35,11 +37,26 @@ const FacilityBookings = (props:any) => {
const [columns2, setColumns2] = useState([]) const [columns2, setColumns2] = useState([])
const goToFunction = () => { const goToFunction = () => {
if(tab==2){CA()}
history.push(location.pathname + (tab==1?'/Booking':'/Adding')) history.push(location.pathname + (tab==1?'/Booking':'/Adding'))
} }
const savePageAll = (values:any) => {
var tmp = values;
tmp.curSearchString = curSearchString
return tmp
}
function doing(){
console.log(curSearchString)
}
function test(values:any) {
console.log(values)
}
const goToDetail = (values:any) => { const goToDetail = (values:any) => {
SA(values) console.log("跟踪对象")
history.push(location.pathname + '/Detail') console.log(curSearchString)
// SA(savePageAll(values))
// history.push(location.pathname + '/Detail')
} }
const makeOperator = (values: any,index:any, e: any) => { const makeOperator = (values: any,index:any, e: any) => {
...@@ -62,7 +79,7 @@ const FacilityBookings = (props:any) => { ...@@ -62,7 +79,7 @@ const FacilityBookings = (props:any) => {
["Deposit", "marginFeeStatus",(text: any) => (<div>{marginFeeStatusDes[text]}</div>)], ["Deposit", "marginFeeStatus",(text: any) => (<div>{marginFeeStatusDes[text]}</div>)],
["Status", "status",(text: any) => (<div>{statusDes[text]}</div>)], ["Status", "status",(text: any) => (<div>{statusDes[text]}</div>)],
["Actions",null, (text: any, record: any) => (<Space size="middle"> <a onClick={goToDetail.bind(this,record)}>Detail</a></Space>)], ["Actions",null, (text: any, record: any) => (<Space size="middle"> <Button onClick={test.bind(this,curSearchString)}>Detail</Button></Space>)],
] ]
const key2 = [ const key2 = [
["小区", "communityName"], ["小区", "communityName"],
...@@ -74,40 +91,75 @@ const FacilityBookings = (props:any) => { ...@@ -74,40 +91,75 @@ const FacilityBookings = (props:any) => {
<a onClick={makeOperator.bind(this,record,2)}>预约</a> <a onClick={makeOperator.bind(this,record,2)}>预约</a>
</Space>)] </Space>)]
] ]
setColumns(objectColumns(key)) setColumns(objectColumns(key))
setColumns2(objectColumns(key2)) setColumns2(objectColumns(key2))
RA(0,{ userToken: token, pageNum: 1 }) console.log("核心排查")
RA(8,{ userToken: token, pageNum: 1 }) console.log(DataSave)
},[]); },[]);
useEffect(() => { useEffect(() => {
setLoading(false) setLoading(false)
},[Data]); }, [Data]);
const TitleSearchContent = (comment: any) => {
if (tab == 1) {
console.log(comment) // useEffect(() => {
console.log("comment") // console.log(location)
if (comment.communitydata != null || comment.key != null || comment.status != null) { // if (location.query.type != null) {
// setCurSearchString(DataSave.curSearchString)
// RA(9, { userToken: token, pageNum: DataSave.curSearchString.curPage, subscribeDate: DataSave.curSearchString.subscribeDate, status: DataSave.curSearchString.status })
// }else {
// RA(0, { userToken: token, pageNum: 1 })
// }
// },[location])
const CallBackTitleSearch= (comment: any) => {
if (tab == 1) {
if (comment.communityName != null || comment.key != null || comment.status != null) {
console.log("搜索跟踪对象")
setCurSearchString({ subscribeDate: comment.key, status: comment.status,curPage:1})
RA(9, { userToken: token, pageNum: "1", subscribeDate: comment.key, status: comment.status }) RA(9, { userToken: token, pageNum: "1", subscribeDate: comment.key, status: comment.status })
} }
} else { } else {
console.log(comment) RA(8, {
// RA(8,{ userToken: token, pageNum: 1 }) "communityNameList":comment.communityName,
"facilityName":"",
"pageNum":"1"
})
}
}
function TabCallback(tab: any) {
setTab(tab)
if (tab == 1) {
if (curSearchString.subscribeDate != null || curSearchString.status != null) {
RA(9, { userToken: token, pageNum: curSearchString.curPage, subscribeDate: curSearchString.subscribeDate, status: curSearchString.status })
} else {
RA(0, { userToken: token, pageNum: "1" })
}
} else {
RA(8,{ userToken: token, pageNum: "1" })
} }
} }
function TabCallback(key: any) { setTab(key) }
function Pagechange(current: any, pageSize: any) { function Pagechange(current: any, pageSize: any) {
setLoading(true) setLoading(true)
if (tab == 1) { if (tab == 1) {
setCurPage(current) var tmp = curSearchString
RA(0, { userToken: token, pageNum: current }) console.log("页面跟踪对象")
console.log(curSearchString)
tmp.curPage = current
console.log(tmp)
// setCurSearchString(tmp)
if (curSearchString.subscribeDate != null || curSearchString.status != null) {
// SA(savePageAll({}))
// RA(9, { userToken: token, pageNum: current, subscribeDate: curSearchString.subscribeDate, status: curSearchString.status })
} else {
RA(0, { userToken: token, pageNum: current })
}
} else { } else {
setCurPage2(current) setCurPage2(current)
// RA(0, { userToken: token, pageNum: current }) RA(8, { userToken: token, pageNum: current })
} }
} }
...@@ -120,43 +172,37 @@ const FacilityBookings = (props:any) => { ...@@ -120,43 +172,37 @@ const FacilityBookings = (props:any) => {
<TitleSearch <TitleSearch
status={[{ name: ["status", "订单状态"], data: [[0, "全部"], [1, "已申请"], [2, "已预订"], [3, "已使用"], [4, "已取消"]] }]} status={[{ name: ["status", "订单状态"], data: [[0, "全部"], [1, "已申请"], [2, "已预订"], [3, "已使用"], [4, "已取消"]] }]}
time={["key", "预订时间筛选"]} time={["key", "预订时间筛选"]}
community={true} community={"communityName"}
onSubmit={TitleSearchContent} /> // single={true}
onSubmit={CallBackTitleSearch} />
<div style={{position:"relative",height:40}}> <div style={{position:"relative",height:40}}>
<Button type="primary" style={{ position: "absolute", right: 0 }} onClick={goToFunction}>{tab==1?"Booking":"Add Facility"}</Button> <Button type="primary" style={{ position: "absolute", right: 0 }} onClick={goToFunction}>{tab==1?"Booking":"Add Facility"}</Button>
</div> </div>
<Button type="primary" onClick={doing}>test</Button>
<Tabs defaultActiveKey="1" onChange={TabCallback}> <Button type="primary" onClick={test.bind(this,curSearchString)}>test2</Button>
<Tabs defaultActiveKey={tab.toString()} onChange={TabCallback}>
<TabPane tab="Facility Bookings" key="1"> <TabPane tab="Facility Bookings" key="1">
<Table loading={loading} rowKey="id" style={{ marginTop: 16 }} dataSource={Data.data } columns={columns} pagination={{ current: curPage, total: Data.total, showSizeChanger: false, onChange:Pagechange }} /> <Table loading={loading} rowKey="id" style={{ marginTop: 16 }} dataSource={Data.data } columns={columns} pagination={{ current: curSearchString.curPage, total: Data.total.totalRow, showSizeChanger: false, onChange:Pagechange }} />
</TabPane> </TabPane>
<TabPane tab="Facility Management" key="2"> <TabPane tab="Facility Management" key="2">
<Table rowKey="id" style={{ marginTop: 16 }} dataSource={Data2.data} columns={columns2} pagination={{ current: curPage2, total: Data2.total, showSizeChanger: false, onChange: Pagechange }} /> <Table rowKey="id" style={{ marginTop: 16 }} dataSource={Data2.data} columns={columns2} pagination={{ current: curPage2, total: Data2.total.totalRow, showSizeChanger: false, onChange: Pagechange }} />
</TabPane> </TabPane>
</Tabs> </Tabs>
</div> </div>
); );
}; };
function mapStateToProps(state:any) { function mapStateToProps(state:any) {
const { Data, DataPage, Data2 } = state.FacilityBookings; const { Data, DataPage, Data2,DataSave } = state.FacilityBookings;
const { token } = state.login; const { token } = state.login;
return { return {
Data, Data,
DataPage, DataPage,
Data2, Data2,
DataSave,
token token
}; };
} }
......
import React, { useState, useEffect } from 'react';
import styles from './index.less';
import { Input ,Upload,Modal,Button,Space,Pagination,Tooltip, Radio, Checkbox } from 'antd';
import { Link, useIntl, connect, Dispatch } from 'umi';
import { PlusOutlined } from '@ant-design/icons';
function getBase64(file: Blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
}
import TitleBack from '../../../components/TitleBack/TitleBack';
const FacilityBookingsSetting = () => {
const [namelist, setNamelist] = useState(['A']);
const [previewVisible, setPreviewVisible] = useState(false);
const [previewImage, setPreviewImage] = useState("");
const [previewTitle, setPreviewTitle] = useState("");
const [fileList, setFileList] = useState([]);
const uploadButton = ( <div><PlusOutlined /> <div className="ant-upload-text">Upload</div></div>);
const handleCancel = () => { setPreviewVisible(false) };
const handleChange = (Obj: any) => { setFileList(Obj.fileList) }
const handlePreview = async (file: { url: string; preview: string; originFileObj: Blob; name: any; }) => {
if (!file.url && !file.preview) {
file.preview = await getBase64(file.originFileObj);
}
setPreviewImage((file.url || file.preview));
setPreviewVisible(true);
setPreviewTitle(file.name || file.url.substring(file.url.lastIndexOf('/') + 1));
};
const onCreate = () => {
let newlist = [...namelist];
newlist.push('D')
console.log(newlist)
setNamelist(newlist)
}
const onDelete = () => {
let newlist = [...namelist];
newlist.pop();
setNamelist(newlist)
}
return (
<div className={styles.base}>
{/* 头部组件v1.2 */}
<TitleBack title="Add Facility" />
<div className={styles.box1}>
<div className={styles.box1item1}>Project</div>
<div className={styles.box1item2}><Input.Search style={{width:200}} /></div>
</div>
<div className={styles.box2}>
<div className={styles.box2item1}>Facility Name</div>
<div className={styles.box2item2}><Input style={{ width: 200 }} /></div>
<div className={styles.box2item3}>Management Expense</div>
<div className={styles.box2item4}><Input style={{ width: 80 }} /></div>
<div className={styles.box2item5}>Deposit</div>
<div className={styles.box2item6}><Input style={{width:80}} /></div>
</div>
<div style={{marginBottom:20}}>Facility Category</div>
<ul className={styles.ulist}>
{
namelist.map((item, index) => {
return (
<div key={"namelist"+index}>
<li className={styles.llist}><div className={styles.alist2}>
<div className={styles.alist1}>
<Upload action="https://www.mocky.io/v2/5cc8019d300000980a055e76" listType="picture-card" fileList={fileList} onPreview={handlePreview} onChange={handleChange}>
{fileList.length >= 1? null : uploadButton}
</Upload>
<Modal visible={previewVisible} title={previewTitle} footer={null} onCancel={handleCancel}>
<img alt="picture" style={{ width: '100%' }} src={previewImage} />
</Modal>
</div>
<div className={styles.alist2box}>
<div className={styles.alist2boxitem1}>Name</div>
<div className={styles.alist2boxitem2}><Input style={{width:120}}/></div>
<div className={styles.alist2boxitem3}><div style={{cursor:"pointer",color:"#FF5151",fontWeight:600}} onClick={onDelete}>Delete</div></div>
</div>
</div>
</li>
</div>
)})
}
<li className={styles.llist}><div className={styles.alist3} onClick={onCreate}><PlusOutlined /></div></li>
</ul>
<div><p className={styles.alist2boxNone}>none</p></div>
<div className={styles.box3}>
<div className={styles.box3item1}>Facility Detail</div>
<div className={styles.box3item2}>
<div className={styles.box3group1}>
<Upload action="https://www.mocky.io/v2/5cc8019d300000980a055e76" listType="picture-card" fileList={fileList} onPreview={handlePreview} onChange={handleChange}>
{fileList.length >= 1? null : uploadButton}
</Upload>
<Modal visible={previewVisible} title={previewTitle} footer={null} onCancel={handleCancel}>
<img alt="picture" style={{ width: '100%' }} src={previewImage} />
</Modal>
</div>
</div>
</div>
<div className={styles.line}></div>
<div className={styles.box5}>
<div className={styles.box5item1}>Opening Hours</div>
<div className={styles.box5item2}>09:00~20:00</div>
</div>
<div className={styles.box6}>
<div className={styles.box6item1}>Settings For Booking</div>
<div className={styles.box6item2}><Input style={{width:80}} /></div>
<div className={styles.box6item3}>Cancel Appointment</div>
<div className={styles.box6item4}><Input style={{width:80}}/></div>
<div className={styles.box6item5}>No deposit,cancellation</div>
<div className={styles.box6item6}><Input style={{width:80}}/></div>
<div className={styles.box6item7}>Bookable</div>
</div>
<div className={styles.box7}>
<div className={styles.box7item1}><Input style={{width:120}}/></div>
<div className={styles.box7item2}><Input style={{width:80}}/></div>
</div>
<div className={styles.box8}>
<div className={styles.box8item1}><Checkbox>Fixed Time Period For Each Appointment</Checkbox></div>
<div className={styles.box8item2}><Input style={{width:100}}/></div>
<div className={styles.box8item3}></div>
<div className={styles.box8item4}><Input style={{width:100}}/></div>
</div>
<div className={styles.line}></div>
<Button type="primary" style={{ width: 80, height: 32 }}>提交</Button>
</div>
);
};
export default FacilityBookingsSetting;
import React, { useState, useEffect,useRef } from 'react'; import React, { useState, useEffect,useRef } from 'react';
import styles from './index.less'; import styles from './css/index.less';
import { Input ,Upload,Modal,Button,Space,Pagination,Tooltip, Radio, Form,Row, Col,Select, message } from 'antd'; import { Input ,Upload,Modal,Button,Space,Pagination,Tooltip, Radio, Form,Row, Col,Select, message } from 'antd';
const { Option } = Select; const { Option } = Select;
import { Link, useIntl, connect, Dispatch } from 'umi'; import { Link, useIntl, connect, Dispatch,history } from 'umi';
import { FieldTimeOutlined } from '@ant-design/icons'; import { FieldTimeOutlined } from '@ant-design/icons';
import PictureOptions from '../../../components/PictureOptions/PictureOptions'; import PictureOptions from '../../../components/PictureOptions/PictureOptions';
...@@ -11,23 +11,14 @@ import PictureOptionsRow from '../../../components/PictureOptions/PictureOptions ...@@ -11,23 +11,14 @@ import PictureOptionsRow from '../../../components/PictureOptions/PictureOptions
import TitleBack from '../../../components/TitleBack/TitleBack'; import TitleBack from '../../../components/TitleBack/TitleBack';
import TimeSelect from '../../../components/TimeSelect/TimeSelect'; import TimeSelect from '../../../components/TimeSelect/TimeSelect';
import Line from '../../../components/Line/Line'; import Line from '../../../components/Line/Line';
import { values } from 'lodash';
// categoriesDetailsImageName: ["test.jpg"], // categoriesDetailsImageName: ["test.jpg"],
// categoriesName: ["篮球场A&test.jpg"], // categoriesName: ["篮球场A&test.jpg"],
// reservationQuantumTime: ["09:00-07:00"] // reservationQuantumTime: ["09:00-07:00"]
const Data = {
canReservationDay: "5", import { getUrlLast } from '../../../utils/string'
canReservationNum: "6",
cancelReservationDay: "3",
categoriesOpenTime: "09:00-20:00",
communityManagerFee: "18",
communityMargin: "20",
communityName: "A9",
facilityName: "篮球场",
nomarginCancelReservationDay: "4",
periodType: "2",
}
const FacilityManager = (props:any) => { const FacilityManager = (props:any) => {
const { dispatch, location, token,sourceData,DataSave} = props; const { dispatch, location, token,sourceData,DataSave} = props;
...@@ -51,10 +42,12 @@ const FacilityManager = (props:any) => { ...@@ -51,10 +42,12 @@ const FacilityManager = (props:any) => {
} }
useEffect(() => { useEffect(() => {
if (sourceData != null) { if (sourceData != null) {
console.log("当前数据不为空")
console.log(sourceData) console.log(sourceData)
formRef.current.setFieldsValue(sourceData) formRef.current.setFieldsValue(sourceData)
} }
},[sourceData]) }, [sourceData])
useEffect(() => { useEffect(() => {
console.log("init one") console.log("init one")
console.log(DataSave) console.log(DataSave)
...@@ -129,11 +122,14 @@ const FacilityManager = (props:any) => { ...@@ -129,11 +122,14 @@ const FacilityManager = (props:any) => {
const extendName = (values:any) => { const extendName = (values:any) => {
setExtend(values) setExtend(values)
} }
const Subscribe = () => {
history.push(getUrlLast(location.pathname)+ "/FacilityApply")
}
return ( return (
<div className={styles.base}> <div className={styles.base}>
{/* 头部组件v1.2 */} {/* 头部组件v1.2 */}
<TitleBack title={PATHNAME} /> <TitleBack title={PATHNAME} url={getUrlLast(location.pathname)+"?Facility=true"}/>
<Form ref={formRef} name="basic" onFinish={onFinish} onFinishFailed={onFinishFailed} > <Form ref={formRef} name="basic" onFinish={onFinish} onFinishFailed={onFinishFailed} >
<Row gutter={32}> <Row gutter={32}>
...@@ -179,13 +175,13 @@ const FacilityManager = (props:any) => { ...@@ -179,13 +175,13 @@ const FacilityManager = (props:any) => {
<Col>预约设置</Col> <Col>预约设置</Col>
<Col> <Col>
<Row gutter={100}> <Row gutter={100}>
<Col><Form.Item name="cancelReservationDay" ><Input placeholder="取消预订" style={{width:160}} disabled={facilityDetail}/></Form.Item></Col> <Col><Form.Item name="cancelReservationDay" label="提前取消预订"><Input placeholder="取消预订" style={{width:160}} disabled={facilityDetail}/></Form.Item></Col>
<Col><Form.Item name="nomarginCancelReservationDay" ><Input placeholder="不交押金,取消预订" style={{width:160}} disabled={facilityDetail}/></Form.Item></Col> <Col><Form.Item name="nomarginCancelReservationDay" label="不交押金,自动取消预订"><Input placeholder="不交押金,取消预订" style={{width:160}} disabled={facilityDetail}/></Form.Item></Col>
<Col><Form.Item name="canReservationDay" ><Input placeholder="可预订" style={{width:160}} disabled={facilityDetail}/></Form.Item></Col> <Col><Form.Item name="canReservationDay" label="可提前预订"><Input placeholder="可预订" style={{width:160}} disabled={facilityDetail}/></Form.Item></Col>
</Row> </Row>
<Row gutter={8}> <Row gutter={8}>
<Col> <Col>
<Form.Item name="periodType" > <Form.Item name="periodType" label="预约周期">
<Select placeholder="period" allowClear style={{width:120}} disabled={facilityDetail}> <Select placeholder="period" allowClear style={{width:120}} disabled={facilityDetail}>
<Option value="1">Day</Option> <Option value="1">Day</Option>
<Option value="2">Month</Option> <Option value="2">Month</Option>
...@@ -200,10 +196,10 @@ const FacilityManager = (props:any) => { ...@@ -200,10 +196,10 @@ const FacilityManager = (props:any) => {
<Row gutter={32} style={{ marginTop: 28 }}> <Row gutter={32} style={{ marginTop: 28 }}>
<Col>预约时段</Col> <Col>预约时段</Col>
<Col><TimeSelect putSubmit={TimeSelectRef} defaultValue={["10:00-12:00","13:00-14:00"]} disabled={facilityDetail}/></Col> <Col><TimeSelect putSubmit={TimeSelectRef} defaultValue={["08:00-20:00"]} disabled={facilityDetail}/></Col>
</Row> </Row>
{ {
facilityDetail ? null : facilityDetail ? <><Line /><Button type="primary" onClick={Subscribe}>Subscribe</Button></> :
<><Line /><Button type="primary" htmlType="submit">Submit</Button></> <><Line /><Button type="primary" htmlType="submit">Submit</Button></>
} }
...@@ -222,3 +218,19 @@ function mapStateToProps(state:any) { ...@@ -222,3 +218,19 @@ function mapStateToProps(state:any) {
}; };
} }
export default connect(mapStateToProps)(FacilityManager); export default connect(mapStateToProps)(FacilityManager);
// ["10:00-12:00","13:00-14:00"]
// defultValue={[{ url: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png", name: "篮球场A"},{ url: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png", name: "篮球场B" }]}
// defultValue={[{ url: "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" }]}
// const Data = {
// canReservationDay: "5",
// canReservationNum: "6",
// cancelReservationDay: "3",
// categoriesOpenTime: "09:00-20:00",
// communityManagerFee: "18",
// communityMargin: "20",
// communityName: "A9",
// facilityName: "篮球场",
// nomarginCancelReservationDay: "4",
// periodType: "2",
// }
\ No newline at end of file
...@@ -5,7 +5,7 @@ import { Input ,Menu,Table,Space} from 'antd'; ...@@ -5,7 +5,7 @@ import { Input ,Menu,Table,Space} from 'antd';
import { Link, useIntl, connect, Dispatch, history } from 'umi'; import { Link, useIntl, connect, Dispatch, history } from 'umi';
import SelectOptions from '../../../components/SelectOptions/index'; import TitleSearch from '../../../components/TitleSearch/TitleSearch';
const dataSource = [ const dataSource = [
...@@ -87,18 +87,20 @@ const Users = (props: { location: any; }) => { ...@@ -87,18 +87,20 @@ const Users = (props: { location: any; }) => {
}, },
]; ];
const printContent = (comment: any)=>{ const CallBackTitleSearch = (comment: any)=>{
console.log(comment) console.log(comment)
} }
return ( return (
<div className={styles.base}> <div className={styles.base}>
{/* 头部组件 */} {/* 头部组件 */}
<div className={styles.box}>
<input className={styles.item1} placeholder={nameofowner} /> <TitleSearch
</div> listkey={["providerName"]}
<SelectOptions list={["美国", "美丽的", "美好", "加拿大", "加油", "XO"].sort()} onSubmit={printContent} /> list={["Service Provider"]}
<button className={styles.item3}>{search}</button> community={"serviceCommunityList"}
onSubmit={CallBackTitleSearch} />
{/* 内容组件 */} {/* 内容组件 */}
<div className={styles.box2}> <div className={styles.box2}>
<button className={styles.buttonAdd2} onClick={goToAdd}>Create New Owner</button> <button className={styles.buttonAdd2} onClick={goToAdd}>Create New Owner</button>
......
...@@ -4,28 +4,33 @@ import styles from './index.less'; ...@@ -4,28 +4,33 @@ import styles from './index.less';
import {Form, Input ,Spin,Table,Space, Button} from 'antd'; import {Form, Input ,Spin,Table,Space, Button} from 'antd';
import { LoadingOutlined } from '@ant-design/icons'; import { LoadingOutlined } from '@ant-design/icons';
const antIcon = <LoadingOutlined style={{ fontSize: 24 }} spin />;
import { Link, useIntl, connect, Dispatch,history } from 'umi'; import { Link, useIntl, connect, Dispatch,history } from 'umi';
import SelectOptions from '../../../components/SelectOptions/index'; import TitleSearch from '../../../components/TitleSearch/TitleSearch';
const ServiceProviderManagement = (props: any) => { const ServiceProviderManagement = (props: any) => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const { dispatch, location,Data,CommunityList} = props; const { dispatch, location, Data, CommunityList } = props;
const RA = (index:any,values: any) => { dispatch({ type: 'ServiceProvider/RA', playload: {index:index, body:values } }) };
const TosTosServiceProviderGet = (values: any) => { dispatch({ type: 'ServiceProvider/TosTosServiceProviderGet', playload: values }) }; const TosTosServiceProviderGet = (values: any) => { dispatch({ type: 'ServiceProvider/TosTosServiceProviderGet', playload: values }) };
const SaveChooseData = (values: any) => { dispatch({ type: 'ServiceProvider/SaveChooseData', playload: values }) }; const SaveChooseData = (values: any) => { dispatch({ type: 'ServiceProvider/SaveChooseData', playload: values }) };
const GetList = () => {
if (CommunityList != null) {
TosTosServiceProviderGet({
providerName: "",
serviceCommunityList: CommunityList
})
}
}
useEffect(() => { useEffect(() => {
TosTosServiceProviderGet(null) GetList()
}, []); }, []);
useEffect(() => {
const formRef = useRef(null); GetList()
const onFinish = (values: any) => {TosTosServiceProviderGet(values)}; }, [CommunityList]);
const onFinishFailed = (errorInfo: any) => { console.log('Failed:', errorInfo) };
const goToDetail = (values: any, e: any) => { const goToDetail = (values: any, e: any) => {
SaveChooseData(values) SaveChooseData(values)
...@@ -68,7 +73,7 @@ const ServiceProviderManagement = (props: any) => { ...@@ -68,7 +73,7 @@ const ServiceProviderManagement = (props: any) => {
return tmp; return tmp;
} }
const printContent = (comment: any)=>{ const CallBackTitleSearch = (comment: any)=>{
console.log(comment) console.log(comment)
} }
...@@ -76,11 +81,13 @@ const ServiceProviderManagement = (props: any) => { ...@@ -76,11 +81,13 @@ const ServiceProviderManagement = (props: any) => {
<div className={styles.base}> <div className={styles.base}>
{/* 头部组件 */} {/* 头部组件 */}
<Form ref={formRef} name="basic" initialValues={{}} onFinish={onFinish} onFinishFailed={onFinishFailed}>
<div className={styles.box}><Form.Item name="providerName" ><Input style={{width:200}} placeholder="Service Provider" /></Form.Item></div> <TitleSearch
<SelectOptions list={CommunityList} onSubmit={printContent}/> listkey={["providerName"]}
<Form.Item><Button type="primary" htmlType="submit">Search</Button></Form.Item> list={["Service Provider"]}
</Form> community={"serviceCommunityList"}
onSubmit={CallBackTitleSearch} />
{/* 内容组件 */} {/* 内容组件 */}
<div className={styles.box2}> <div className={styles.box2}>
<button className={styles.buttonAdd2} onClick={goToServices}>Avail Services</button> <button className={styles.buttonAdd2} onClick={goToServices}>Avail Services</button>
......
...@@ -29,23 +29,11 @@ const Guard = (props:any) => { ...@@ -29,23 +29,11 @@ const Guard = (props:any) => {
<div className={styles.base}> <div className={styles.base}>
<div className={styles.item0}><TitleGet title={"Welcome"}/></div> <div className={styles.item0}><TitleGet title={"Version 1.0.1"}/></div>
<div>{token}</div> {/* <div>{token}</div>
<Line /> <Line /> */}
<Form name="basic" onFinish={onFinish}>
<Form.Item name="name" ><Upload name={'file'} listType={'picture-card'}>
<Button>
{uploadButton}
</Button>
</Upload></Form.Item>
<Form.Item ><Button type="primary" htmlType="submit">Submit</Button></Form.Item>
</Form>
</div> </div>
); );
......
...@@ -5,21 +5,25 @@ export interface LoginParamsType { ...@@ -5,21 +5,25 @@ export interface LoginParamsType {
password: string; password: string;
} }
export async function fakeAccountLogin(params: LoginParamsType) { // export async function fakeAccountLogin(params: LoginParamsType) {
return request('/api/login/account', { // return request('/api/login/account', {
method: 'POST', // method: 'POST',
data: params, // data: params,
}); // });
} // }
export async function getFakeCaptcha(mobile: string) { export async function getFakeCaptcha(mobile: string) {
return request(`/api/login/captcha?mobile=${mobile}`); return request(`/api/login/captcha?mobile=${mobile}`);
} }
export async function AccountLogin(params: LoginParamsType) { export async function AccountLogin(params: LoginParamsType) {
console.log("登录请求")
return request('/tos/user/login', { method: 'POST', data: params, }); return request('/tos/user/login', { method: 'POST', data: params, });
} }
export async function AccountOut() {
return request('/tos/user/login', { method: 'POST' });
}
export interface LoginCheckParamsType { export interface LoginCheckParamsType {
userName: string; userName: string;
password: string; password: string;
...@@ -27,5 +31,6 @@ export interface LoginCheckParamsType { ...@@ -27,5 +31,6 @@ export interface LoginCheckParamsType {
userId: string; userId: string;
} }
export async function AccountCheckLogin(params: LoginCheckParamsType) { export async function AccountCheckLogin(params: LoginCheckParamsType) {
console.log("登录确认请求")
return request('/tos/user/newCurrentUser', { method: 'POST', data: params, }); return request('/tos/user/newCurrentUser', { method: 'POST', data: params, });
} }
\ No newline at end of file
...@@ -71,13 +71,14 @@ const requestList = [ ...@@ -71,13 +71,14 @@ const requestList = [
"/tos/bookingService/lookUp",//7 查看小区设施 "/tos/bookingService/lookUp",//7 查看小区设施
"/tos/community/facilities/fuzzy/query",//8 查看设施管理模糊 "/tos/community/facilities/fuzzy/query",//8 查看设施管理模糊
"/tos/community/categories/subscribe/fuzzy/query",//9 预订列表模糊查询 "/tos/community/categories/subscribe/fuzzy/query",//9 预订列表模糊查询
"/tos/user/newCurrentUser" //10 后台用户信息
] ]
function requestAuto(url:string,values:any) { function requestAuto(url:string,values:any) {
return request(url, Body(values)) return request(url, Body(values))
} }
export function RA(playload: any) { export function RA(playload: any) {
console.log(playload) // console.log(playload)
console.log(playload.index) // console.log(playload.index)
console.log(requestList[playload.index]) // console.log(requestList[playload.index])
return requestAuto(requestList[playload.index],playload.body) return requestAuto(requestList[playload.index],playload.body)
} }
\ No newline at end of file
...@@ -4,8 +4,8 @@ export async function query(): Promise<any> { ...@@ -4,8 +4,8 @@ export async function query(): Promise<any> {
return request('/api/users'); return request('/api/users');
} }
export async function queryCurrent(): Promise<any> { export async function queryCurrent(values:any): Promise<any> {
return request('/api/currentUser'); return request('/tos/user/newCurrentUser',{method: 'POST',body: JSON.stringify(values),headers:{ 'Content-Type': 'application/json'}});
} }
export async function queryNotices(): Promise<any> { export async function queryNotices(): Promise<any> {
......
...@@ -22,4 +22,17 @@ export const getUrlPicName=(str:string)=>{ ...@@ -22,4 +22,17 @@ export const getUrlPicName=(str:string)=>{
var tmp=str.split("?") var tmp=str.split("?")
var tmp2=tmp[0].split("/") var tmp2=tmp[0].split("/")
return(tmp2[tmp2.length-1]) return(tmp2[tmp2.length-1])
}
//取url中取url最后的参数路径
export const getUrlLast = (str: string) => {
var index = str.lastIndexOf("/")
var tmp =str.substring(0,index)
return tmp
}
//取url中取url最后的参数
export const getUrlLastParams = (str: string) => {
var index = str.lastIndexOf("?")
var tmp =str.substring(0,index)
return tmp
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment