mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 02:35:49 +08:00
250 lines
5.8 KiB
JavaScript
250 lines
5.8 KiB
JavaScript
![]() |
// Copyright 2021 The casbin Authors. All Rights Reserved.
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
import React from 'react';
|
||
|
import {Form, Input, Select, Checkbox, Button, Row, Col} from 'antd';
|
||
|
import * as Setting from "../Setting";
|
||
|
import * as AuthBackend from "./AuthBackend";
|
||
|
import i18next from "i18next";
|
||
|
import {Link} from "react-router-dom";
|
||
|
|
||
|
const { Option } = Select;
|
||
|
|
||
|
const formItemLayout = {
|
||
|
labelCol: {
|
||
|
xs: {
|
||
|
span: 24,
|
||
|
},
|
||
|
sm: {
|
||
|
span: 8,
|
||
|
},
|
||
|
},
|
||
|
wrapperCol: {
|
||
|
xs: {
|
||
|
span: 24,
|
||
|
},
|
||
|
sm: {
|
||
|
span: 16,
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
|
||
|
const tailFormItemLayout = {
|
||
|
wrapperCol: {
|
||
|
xs: {
|
||
|
span: 24,
|
||
|
offset: 0,
|
||
|
},
|
||
|
sm: {
|
||
|
span: 16,
|
||
|
offset: 8,
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
|
||
|
class RegisterPage extends React.Component {
|
||
|
constructor(props) {
|
||
|
super(props);
|
||
|
this.state = {
|
||
|
classes: props,
|
||
|
};
|
||
|
|
||
|
this.form = React.createRef();
|
||
|
}
|
||
|
|
||
|
onFinish(values) {
|
||
|
AuthBackend.register(values)
|
||
|
.then((res) => {
|
||
|
if (res.status === 'ok') {
|
||
|
this.props.history.push('/result');
|
||
|
} else {
|
||
|
Setting.showMessage("error", `Failed to register: ${res.msg}`);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
onFinishFailed(values, errorFields, outOfDate) {
|
||
|
this.form.current.scrollToField(errorFields[0].name);
|
||
|
}
|
||
|
|
||
|
renderForm() {
|
||
|
const prefixSelector = (
|
||
|
<Form.Item name="prefix" noStyle>
|
||
|
<Select
|
||
|
style={{
|
||
|
width: 80,
|
||
|
}}
|
||
|
>
|
||
|
<Option value="001">+001</Option>
|
||
|
</Select>
|
||
|
</Form.Item>
|
||
|
);
|
||
|
|
||
|
return (
|
||
|
<Form
|
||
|
{...formItemLayout}
|
||
|
ref={this.form}
|
||
|
name="register"
|
||
|
onFinish={(values) => this.onFinish(values)}
|
||
|
onFinishFailed={(errorInfo) => this.onFinishFailed(errorInfo.values, errorInfo.errorFields, errorInfo.outOfDate)}
|
||
|
initialValues={{
|
||
|
prefix: '001',
|
||
|
}}
|
||
|
style={{width: !Setting.isMobile() ? "400px" : "250px"}}
|
||
|
size="large"
|
||
|
>
|
||
|
<Form.Item
|
||
|
name="username"
|
||
|
label="Username"
|
||
|
rules={[
|
||
|
{
|
||
|
required: true,
|
||
|
message: 'Please input your username',
|
||
|
whitespace: true,
|
||
|
},
|
||
|
]}
|
||
|
>
|
||
|
<Input />
|
||
|
</Form.Item>
|
||
|
<Form.Item
|
||
|
name="name"
|
||
|
label="Real Name"
|
||
|
rules={[
|
||
|
{
|
||
|
required: true,
|
||
|
message: 'Please input your real name',
|
||
|
whitespace: true,
|
||
|
},
|
||
|
]}
|
||
|
>
|
||
|
<Input />
|
||
|
</Form.Item>
|
||
|
<Form.Item
|
||
|
name="Affiliation"
|
||
|
label="affiliation"
|
||
|
rules={[
|
||
|
{
|
||
|
required: true,
|
||
|
message: 'Please input your affiliation',
|
||
|
whitespace: true,
|
||
|
},
|
||
|
]}
|
||
|
>
|
||
|
<Input />
|
||
|
</Form.Item>
|
||
|
<Form.Item
|
||
|
name="email"
|
||
|
label="Email"
|
||
|
rules={[
|
||
|
{
|
||
|
type: 'email',
|
||
|
message: 'The input is not valid Email!',
|
||
|
},
|
||
|
{
|
||
|
required: true,
|
||
|
message: 'Please input your Email',
|
||
|
},
|
||
|
]}
|
||
|
>
|
||
|
<Input />
|
||
|
</Form.Item>
|
||
|
<Form.Item
|
||
|
name="password"
|
||
|
label="Password"
|
||
|
rules={[
|
||
|
{
|
||
|
required: true,
|
||
|
message: 'Please input your password',
|
||
|
},
|
||
|
]}
|
||
|
hasFeedback
|
||
|
>
|
||
|
<Input.Password />
|
||
|
</Form.Item>
|
||
|
<Form.Item
|
||
|
name="confirm"
|
||
|
label="Confirm"
|
||
|
dependencies={['password']}
|
||
|
hasFeedback
|
||
|
rules={[
|
||
|
{
|
||
|
required: true,
|
||
|
message: 'Please confirm your password',
|
||
|
},
|
||
|
({ getFieldValue }) => ({
|
||
|
validator(rule, value) {
|
||
|
if (!value || getFieldValue('password') === value) {
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
|
||
|
return Promise.reject('Your confirmed password is inconsistent with the password');
|
||
|
},
|
||
|
}),
|
||
|
]}
|
||
|
>
|
||
|
<Input.Password />
|
||
|
</Form.Item>
|
||
|
<Form.Item
|
||
|
name="cellphone"
|
||
|
label="Cellphone"
|
||
|
rules={[
|
||
|
{
|
||
|
required: true,
|
||
|
message: 'Please confirm your cellphone',
|
||
|
},
|
||
|
]}
|
||
|
>
|
||
|
<Input
|
||
|
addonBefore={prefixSelector}
|
||
|
style={{
|
||
|
width: '100%',
|
||
|
}}
|
||
|
/>
|
||
|
</Form.Item>
|
||
|
<Form.Item name="agreement" valuePropName="checked" {...tailFormItemLayout}>
|
||
|
<Checkbox>
|
||
|
Accept <a href="/agreement">Terms of Use</a>
|
||
|
</Checkbox>
|
||
|
</Form.Item>
|
||
|
<Form.Item {...tailFormItemLayout}>
|
||
|
<Button type="primary" htmlType="submit">
|
||
|
Register
|
||
|
</Button>
|
||
|
Have account?
|
||
|
<Link to="/login">
|
||
|
<a href="/login">sign in now</a>
|
||
|
</Link>
|
||
|
</Form.Item>
|
||
|
</Form>
|
||
|
)
|
||
|
}
|
||
|
|
||
|
render() {
|
||
|
return (
|
||
|
<div>
|
||
|
|
||
|
<Row>
|
||
|
<Col span={24} style={{display: "flex", justifyContent: "center"}} >
|
||
|
{
|
||
|
this.renderForm()
|
||
|
}
|
||
|
</Col>
|
||
|
</Row>
|
||
|
</div>
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default RegisterPage;
|