casdoor/web/src/auth/SignupPage.js

312 lines
8.0 KiB
JavaScript
Raw Normal View History

2021-03-26 21:57:41 +08:00
// 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';
2021-03-26 21:58:10 +08:00
import {Link} from "react-router-dom";
2021-03-26 21:57:41 +08:00
import {Form, Input, Select, Checkbox, Button, Row, Col} from 'antd';
import * as Setting from "../Setting";
import * as AuthBackend from "./AuthBackend";
2021-04-28 00:47:12 +08:00
import i18next from "i18next";
2021-04-28 15:54:50 +08:00
import * as Util from "./Util";
import {authConfig} from "./Auth";
import * as ApplicationBackend from "../backend/ApplicationBackend";
2021-03-26 21:57:41 +08:00
const { Option } = Select;
const formItemLayout = {
labelCol: {
xs: {
span: 24,
},
sm: {
2021-04-28 15:54:50 +08:00
span: 6,
2021-03-26 21:57:41 +08:00
},
},
wrapperCol: {
xs: {
span: 24,
},
sm: {
2021-04-28 15:54:50 +08:00
span: 18,
2021-03-26 21:57:41 +08:00
},
},
};
const tailFormItemLayout = {
wrapperCol: {
xs: {
span: 24,
offset: 0,
},
sm: {
span: 16,
offset: 8,
},
},
};
2021-04-27 22:47:44 +08:00
class SignupPage extends React.Component {
2021-03-26 21:57:41 +08:00
constructor(props) {
super(props);
this.state = {
classes: props,
2021-04-28 15:54:50 +08:00
applicationName: props.match.params.applicationName !== undefined ? props.match.params.applicationName : authConfig.appName,
application: null,
2021-03-26 21:57:41 +08:00
};
this.form = React.createRef();
}
2021-04-28 15:54:50 +08:00
UNSAFE_componentWillMount() {
if (this.state.applicationName !== undefined) {
this.getApplication();
} else {
Util.showMessage("error", `Unknown application name: ${this.state.applicationName}`);
}
}
getApplication() {
if (this.state.applicationName === undefined) {
return;
}
ApplicationBackend.getApplication("admin", this.state.applicationName)
.then((application) => {
this.setState({
application: application,
});
});
}
2021-04-28 22:40:21 +08:00
getResultPath(application) {
if (authConfig.appName === application.name) {
return "/result";
} else {
return `/result/${application.name}`;
}
}
2021-03-26 21:57:41 +08:00
onFinish(values) {
2021-04-27 22:47:44 +08:00
AuthBackend.signup(values)
2021-03-26 21:57:41 +08:00
.then((res) => {
if (res.status === 'ok') {
2021-04-28 22:40:21 +08:00
Setting.goToLinkSoft(this, this.getResultPath(this.state.application));
2021-03-26 21:57:41 +08:00
} else {
2021-04-27 22:47:44 +08:00
Setting.showMessage("error", `Failed to sign up: ${res.msg}`);
2021-03-26 21:57:41 +08:00
}
});
}
onFinishFailed(values, errorFields, outOfDate) {
this.form.current.scrollToField(errorFields[0].name);
}
2021-04-28 15:54:50 +08:00
renderForm(application) {
2021-03-26 21:57:41 +08:00
const prefixSelector = (
2021-04-28 21:25:58 +08:00
<Form.Item name="phonePrefix" noStyle>
2021-03-26 21:57:41 +08:00
<Select
style={{
width: 80,
}}
>
2021-04-27 22:35:14 +08:00
<Option value="1">+1</Option>
<Option value="86">+86</Option>
2021-03-26 21:57:41 +08:00
</Select>
</Form.Item>
);
return (
<Form
{...formItemLayout}
ref={this.form}
2021-04-27 22:47:44 +08:00
name="signup"
2021-03-26 21:57:41 +08:00
onFinish={(values) => this.onFinish(values)}
onFinishFailed={(errorInfo) => this.onFinishFailed(errorInfo.values, errorInfo.errorFields, errorInfo.outOfDate)}
initialValues={{
2021-04-28 21:25:58 +08:00
organization: application.organization,
phonePrefix: '86',
2021-03-26 21:57:41 +08:00
}}
style={{width: !Setting.isMobile() ? "400px" : "250px"}}
size="large"
>
2021-04-28 21:25:58 +08:00
<Form.Item
style={{height: 0, visibility: "hidden"}}
name="organization"
rules={[
{
required: true,
message: 'Please input your organization!',
},
]}
>
</Form.Item>
2021-03-26 21:57:41 +08:00
<Form.Item
2021-04-28 00:47:12 +08:00
name="username"
label={i18next.t("signup:Username")}
2021-03-26 21:57:41 +08:00
rules={[
{
required: true,
2021-04-28 00:47:12 +08:00
message: i18next.t("login:Please input your username!"),
2021-03-26 21:57:41 +08:00
whitespace: true,
},
]}
>
<Input />
</Form.Item>
<Form.Item
2021-04-28 21:25:58 +08:00
name="name"
2021-04-28 00:47:12 +08:00
label={i18next.t("general:Display name")}
2021-03-26 21:57:41 +08:00
rules={[
{
required: true,
2021-04-28 00:47:12 +08:00
message: i18next.t("signup:Please input your display name!"),
2021-03-26 21:57:41 +08:00
whitespace: true,
},
]}
>
<Input />
</Form.Item>
<Form.Item
2021-04-27 22:35:14 +08:00
name="affiliation"
2021-04-28 00:47:12 +08:00
label={i18next.t("user:Affiliation")}
2021-03-26 21:57:41 +08:00
rules={[
{
required: true,
2021-04-28 00:47:12 +08:00
message: i18next.t("signup:Please input your affiliation!"),
2021-03-26 21:57:41 +08:00
whitespace: true,
},
]}
>
<Input />
</Form.Item>
<Form.Item
name="email"
2021-04-28 00:47:12 +08:00
label={i18next.t("general:Email")}
2021-03-26 21:57:41 +08:00
rules={[
{
type: 'email',
2021-04-28 00:47:12 +08:00
message: i18next.t("signup:The input is not valid Email!"),
2021-03-26 21:57:41 +08:00
},
{
required: true,
2021-04-28 00:47:12 +08:00
message: i18next.t("signup:Please input your Email!"),
2021-03-26 21:57:41 +08:00
},
]}
>
<Input />
</Form.Item>
<Form.Item
name="password"
2021-04-28 00:47:12 +08:00
label={i18next.t("general:Password")}
2021-03-26 21:57:41 +08:00
rules={[
{
required: true,
2021-04-28 00:47:12 +08:00
message: i18next.t("login:Please input your password!"),
2021-03-26 21:57:41 +08:00
},
]}
hasFeedback
>
<Input.Password />
</Form.Item>
<Form.Item
name="confirm"
2021-04-28 00:47:12 +08:00
label={i18next.t("signup:Confirm password")}
2021-03-26 21:57:41 +08:00
dependencies={['password']}
hasFeedback
rules={[
{
required: true,
2021-04-28 00:47:12 +08:00
message: i18next.t("signup:Please confirm your password!"),
2021-03-26 21:57:41 +08:00
},
({ getFieldValue }) => ({
validator(rule, value) {
if (!value || getFieldValue('password') === value) {
return Promise.resolve();
}
2021-04-28 00:47:12 +08:00
return Promise.reject(i18next.t("signup:Your confirmed password is inconsistent with the password!"));
2021-03-26 21:57:41 +08:00
},
}),
]}
>
<Input.Password />
</Form.Item>
<Form.Item
2021-04-27 22:35:14 +08:00
name="phone"
2021-04-28 00:47:12 +08:00
label={i18next.t("general:Phone")}
2021-03-26 21:57:41 +08:00
rules={[
{
required: true,
2021-04-28 00:47:12 +08:00
message: i18next.t("signup:Please input your phone number!"),
2021-03-26 21:57:41 +08:00
},
]}
>
<Input
addonBefore={prefixSelector}
style={{
width: '100%',
}}
/>
</Form.Item>
<Form.Item name="agreement" valuePropName="checked" {...tailFormItemLayout}>
<Checkbox>
2021-04-28 00:47:12 +08:00
{i18next.t("signup:Accept")}&nbsp;
2021-03-26 21:58:10 +08:00
<Link to={"/agreement"}>
2021-04-28 00:47:12 +08:00
{i18next.t("signup:Terms of Use")}
2021-03-26 21:58:10 +08:00
</Link>
2021-03-26 21:57:41 +08:00
</Checkbox>
</Form.Item>
<Form.Item {...tailFormItemLayout}>
<Button type="primary" htmlType="submit">
2021-04-28 00:47:12 +08:00
{i18next.t("account:Sign Up")}
2021-03-26 21:57:41 +08:00
</Button>
2021-04-28 00:47:12 +08:00
&nbsp;&nbsp;{i18next.t("signup:Have account?")}&nbsp;
2021-04-28 22:40:21 +08:00
<Link onClick={() => {
Setting.goToLogin(this, application);
}}>
2021-04-28 00:47:12 +08:00
{i18next.t("signup:sign in now")}
2021-03-26 21:57:41 +08:00
</Link>
</Form.Item>
</Form>
)
}
render() {
2021-04-28 15:54:50 +08:00
const application = this.state.application;
if (application === null) {
return null;
}
2021-03-26 21:57:41 +08:00
return (
<div>
&nbsp;
<Row>
<Col span={24} style={{display: "flex", justifyContent: "center"}} >
2021-04-28 15:54:50 +08:00
<div style={{marginTop: "10px", textAlign: "center"}}>
{
Setting.renderLogo(application)
}
{
this.renderForm(application)
}
</div>
2021-03-26 21:57:41 +08:00
</Col>
</Row>
</div>
)
}
}
2021-04-27 22:47:44 +08:00
export default SignupPage;