added logout status 404 page and registraiton pages

This commit is contained in:
2021-07-27 16:50:57 +01:00
parent 6520b761bd
commit 3a88b18f85
16 changed files with 1133 additions and 566 deletions
+56 -68
View File
@@ -1,3 +1,4 @@
import Link from "next/link";
import _ from "lodash";
import React, { useState } from "react";
import { useRouter } from "next/router";
@@ -9,17 +10,6 @@ import {
getFormSubmitErrors,
} from "redux-form";
import { useDispatch, useSelector, shallowEqual, connect } from "react-redux";
import {
Textfield,
DateField,
DateFieldPicker,
YesNofield,
PickList,
MultiLinefield,
NumericField,
ReadOnlyfield,
DecimalField,
} from "../elements";
const RenderTextfield = ({
id,
@@ -69,7 +59,14 @@ const RenderTextfield = ({
};
const ChangePassword = (props) => {
const { footerLinks, pages, handleSubmit, value } = props;
const {
footerLinks,
pages,
handleSubmit,
value,
setPasswordUpdated,
passwordUpdated,
} = props;
let { t, lang } = useTranslation();
const router = useRouter();
@@ -78,74 +75,65 @@ const ChangePassword = (props) => {
let errorsobj = {};
const onHandleSubmit = (values) => {
console.log(values);
setPasswordUpdated(true);
};
const required = (value) => (value ? undefined : "Is required");
const matchInput = (input, allInputs) => {
return input === allInputs.password
? undefined
: "Passwords do not match";
};
const passwordsMustMatch = (value, allValues) =>
value !== allValues.newpassword ? "Passwords do not match" : undefined;
const email = (value) =>
value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)
? "Invalid email address"
: undefined;
const phoneNumber = (value) =>
value &&
!/^(?:(?:\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?(?:\(?0\)?[\s-]?)?)|(?:\(?0))(?:(?:\d{5}\)?[\s-]?\d{4,5})|(?:\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3}))|(?:\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4})|(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}))(?:[\s-]?(?:x|ext\.?|\#)\d{3,4})?$/i.test(
value
)
? "Invalid phone number"
const minLength = (min) => (value) =>
value && value.length < min
? `Must be at least ${min} characters`
: undefined;
const [hasErrors, setHasErrors] = useState("");
return (
<>
{/* {hasErrors == true ? (
<ShowErrorHeader
hasErrors={hasErrors}
props={props.props.form}
formXML={formXML}
/>
) : (
""
)} */}
<form onSubmit={handleSubmit(onHandleSubmit)}>
<fieldset className="govuk-fieldset">
<Field
name="newpassword"
id="newpassword"
component={RenderTextfield}
type="password"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="New password"
/>
<Field
name="confirmpassword"
id="confirmpassword"
component={RenderTextfield}
type="password"
className="govuk-input govuk-input--width-20"
validate={[matchInput]}
label="Confirm new password"
/>
</fieldset>
{passwordUpdated != true ? (
<form onSubmit={handleSubmit(onHandleSubmit)}>
<fieldset className="govuk-fieldset">
<Field
name="newpassword"
id="newpassword"
component={RenderTextfield}
type="password"
className="govuk-input govuk-input--width-20"
validate={[required, minLength(6)]}
label="New password"
/>
<Field
name="confirmpassword"
id="confirmpassword"
component={RenderTextfield}
type="password"
className="govuk-input govuk-input--width-20"
validate={[required, passwordsMustMatch]}
label="Confirm new password"
/>
</fieldset>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
>
Continue
</button>
</div>
</form>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
>
Continue
</button>
</div>
</form>
) : (
<>
<p className="govuk-body">
<Link href="/myportal">
<a className="govuk-link">Go to My Portal</a>
</Link>
</p>
</>
)}
</>
);
};
+162 -189
View File
@@ -10,18 +10,9 @@ import {
getFormSubmitErrors,
} from "redux-form";
import { useDispatch, useSelector, shallowEqual, connect } from "react-redux";
import {
Textfield,
DateField,
DateFieldPicker,
YesNofield,
PickList,
MultiLinefield,
NumericField,
ReadOnlyfield,
DecimalField,
} from "../elements";
import BuildCheckPersonalDetails from "./personaldetailsCheck";
import PersonalDetailsComplete from "./personaldetailsComplete";
const RenderTextfield = ({
id,
@@ -71,7 +62,12 @@ const RenderTextfield = ({
};
const PersonalDetails = (props) => {
const { footerLinks, pages, handleSubmit, value } = props;
const {
handleSubmit,
value,
setPersonalDetailsComplete,
setAccountUpdatedComplete,
} = props;
let { t, lang } = useTranslation();
const router = useRouter();
@@ -79,10 +75,6 @@ const PersonalDetails = (props) => {
let errorsobj = {};
const onHandleSubmit = (values) => {
console.log(values);
};
const required = (value) => (value ? undefined : "Is required");
const email = (value) =>
value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)
@@ -98,178 +90,155 @@ const PersonalDetails = (props) => {
const [hasErrors, setHasErrors] = useState("");
const [personalDetailsComplete, setPersonalDetailsComplete] =
useState(false);
const onHandleSubmit = (values) => {
setPersonalDetailsComplete(true);
};
return (
<>
{/* {hasErrors == true ? (
<ShowErrorHeader
hasErrors={hasErrors}
props={props.props.form}
formXML={formXML}
/>
) : (
""
)} */}
{props.accountUpdatedComplete != true ? (
props.personalDetailsComplete == false ? (
<form onSubmit={handleSubmit(onHandleSubmit)}>
<fieldset className="govuk-fieldset">
<legend className="govuk-fieldset__legend govuk-fieldset__legend--m">
<h2 className="govuk-fieldset__heading">
About you
</h2>
</legend>
<Field
name="firstname"
id="firstname"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="First name"
errorMsg="Is required"
/>
<Field
name="lastname"
id="lastname"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="Last name"
errorMsg="Is required"
/>
<Field
name="email"
id="email"
component={RenderTextfield}
type="email"
className="govuk-input govuk-input--width-20"
validate={[required, email]}
label="Email address"
/>
<Field
name="telephone"
id="telephone"
component={RenderTextfield}
type="number"
className="govuk-input govuk-input--width-20"
validate={[required, phoneNumber]}
label="Telephone"
/>
{personalDetailsComplete == false ? (
<form onSubmit={handleSubmit(onHandleSubmit)}>
<fieldset className="govuk-fieldset">
<legend className="govuk-fieldset__legend govuk-fieldset__legend--m">
<h2 className="govuk-fieldset__heading">
About you
</h2>
</legend>
<Field
name="firstname"
id="firstname"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="First name"
errorMsg="Is required"
/>
<Field
name="lastname"
id="lastname"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="Last name"
errorMsg="Is required"
/>
<Field
name="email"
id="email"
component={RenderTextfield}
type="email"
className="govuk-input govuk-input--width-20"
validate={[required, email]}
label="Email address"
/>
<Field
name="telephone"
id="telephone"
component={RenderTextfield}
type="number"
className="govuk-input govuk-input--width-20"
validate={[required, phoneNumber]}
label="Telephone"
/>
<Field
name="companygroup"
id="companygroup"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Company/Group"
errorMsg="Is required"
/>
</fieldset>
<fieldset className="govuk-fieldset">
<legend className="govuk-fieldset__legend govuk-fieldset__legend--m">
<h2 className="govuk-fieldset__heading">
What is your address?
</h2>
</legend>
<Field
name="companygroup"
id="companygroup"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Company/Group"
errorMsg="Is required"
/>
</fieldset>
<fieldset className="govuk-fieldset">
<legend className="govuk-fieldset__legend govuk-fieldset__legend--m">
<h2 className="govuk-fieldset__heading">
What is your address?
</h2>
</legend>
<Field
name="addressline1"
id="addressline1"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Address line 1"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="addressline2"
id="addressline2"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Address line 2"
errorMsg="Is required"
/>
<Field
name="towncity"
id="towncity"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-10"
label="Town/City"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="county"
id="county"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-10"
label="County"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="postcode"
id="postcode"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-5"
label="Postcode"
validate={[required]}
errorMsg="Is required"
/>
</fieldset>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
onClick={() => {
setPersonalDetailsComplete(true);
}}
>
Continue
</button>
</div>
</form>
) : (
<>
<BuildCheckPersonalDetails
props={props}
setPersonalDetailsComplete={setPersonalDetailsComplete}
/>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
onClick={() => {
setPersonalDetailsComplete(false);
}}
>
Continue
</button>
<Link href="">
<a
<Field
name="addressline1"
id="addressline1"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Address line 1"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="addressline2"
id="addressline2"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Address line 2"
errorMsg="Is required"
/>
<Field
name="towncity"
id="towncity"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-10"
label="Town/City"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="county"
id="county"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-10"
label="County"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="postcode"
id="postcode"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-5"
label="Postcode"
validate={[required]}
errorMsg="Is required"
/>
</fieldset>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
onClick={() => {
setPersonalDetailsComplete(false);
setPersonalDetailsComplete(true);
}}
className="govuk-link"
>
Go back
</a>
</Link>
</div>
</>
Continue
</button>
</div>
</form>
) : (
<>
<BuildCheckPersonalDetails
props={props}
setPersonalDetailsComplete={
setPersonalDetailsComplete
}
setAccountUpdatedComplete={
setAccountUpdatedComplete
}
/>
</>
)
) : (
<PersonalDetailsComplete />
)}
</>
);
@@ -296,16 +265,20 @@ const mapDispatchToProps = (dispatch) => {
const selector = formValueSelector("personalDetailsForm"); // <-- same as form name
export default connect(mapStateToProps, mapDispatchToProps, (state) => ({
initialValues: state.accountDetails.accountDetails.data,
search: state.search,
searchResultsObj: state.searchResultsObj,
formData: state.formData,
appealType: state.appealType,
accountDetails: state.accountDetails,
form: state.form,
export default connect(
mapStateToProps,
mapDispatchToProps
//, (state) => ({
// initialValues: state.accountDetails.accountDetails.data,
// // search: state.search,
// searchResultsObj: state.searchResultsObj,
// formData: state.formData,
// appealType: state.appealType,
// accountDetails: state.accountDetails,
// form: state.form,
// pull initial values from account reducer
}))(
//})
)(
reduxForm({
form: "personalDetailsForm",
enableReinitialize: true, // this is needed!!
+53 -52
View File
@@ -17,6 +17,7 @@ const BuildCheckPersonalDetails = (props) => {
handleSubmit,
value,
setPersonalDetailsComplete,
setAccountUpdatedComplete,
} = props;
let { t, lang } = useTranslation();
@@ -30,11 +31,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">First name</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.firstname
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -54,11 +54,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Last name</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.lastname
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -79,11 +78,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Email address</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.email
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -104,11 +102,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Telephone</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.telephone
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -128,11 +125,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Company/Group</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.companygroup
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -157,11 +153,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Address Line 1</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.addressline1
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -182,11 +177,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Address line 2</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.addressline2
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -207,11 +201,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Town/City</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.towncity
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -232,11 +225,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">County</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.county
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -257,11 +249,10 @@ const BuildCheckPersonalDetails = (props) => {
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Postcode</dt>
<dd className="govuk-summary-list__value">
{/* {console.log(
props.props.form["personalDetailsForm"].values[
"firstname"
]
)} */}
{
props.props.props.form.personalDetailsForm.values
.postcode
}
</dd>
<dd className="govuk-summary-list__actions">
<a
@@ -280,6 +271,18 @@ const BuildCheckPersonalDetails = (props) => {
</dd>
</div>
</dl>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
onClick={() => {
setAccountUpdatedComplete(true);
}}
>
Continue
</button>
</div>
</>
);
};
@@ -303,8 +306,6 @@ const mapDispatchToProps = (dispatch) => {
};
};
const selector = formValueSelector("personalDetailsForm"); // <-- same as form name
export default connect(
mapStateToProps,
mapDispatchToProps
@@ -0,0 +1,74 @@
import _ from "lodash";
import Link from "next/link";
import React, { useState } from "react";
import { useRouter } from "next/router";
import useTranslation from "next-translate/useTranslation";
import {
Field,
reduxForm,
formValueSelector,
getFormSubmitErrors,
} from "redux-form";
import {
useDispatch,
useSelector,
shallowEqual,
connect,
setRegisterFormComplete,
setAccountCreatedComplete,
} from "react-redux";
const PersonalDetailsComplete = (props) => {
const {
handleSubmit,
value,
setRegisterFormComplete,
setAccountCreatedComplete,
} = props;
let { t, lang } = useTranslation();
const router = useRouter();
const { locale } = router;
return (
<>
<p className="govuk-body">Your details have been updated</p>
<p className="govuk-body">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi a
metus non quam mollis egestas. Integer ac leo cursus, laoreet
nulla sed, tempus tellus. Mauris condimentum erat arcu.
</p>
<p className="govuk-body">
<Link href="/myportal">
<a className="govuk-link">Return to My Portal</a>
</Link>
</p>
</>
);
};
const mapStateToProps = (state) => {
return {
search: state.search,
searchResultsObj: state.searchResultsObj,
formData: state.formData,
appealType: state.appealType,
accountDetails: state.accountDetails,
//form: state.form,
};
};
const mapDispatchToProps = (dispatch) => {
return {
setCurrentSection: (currentSection) => {
dispatch(setCurrentSection(currentSection));
},
};
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(PersonalDetailsComplete);
+310
View File
@@ -0,0 +1,310 @@
import _ from "lodash";
import React, { useState } from "react";
import { useRouter } from "next/router";
import useTranslation from "next-translate/useTranslation";
import {
Field,
reduxForm,
formValueSelector,
getFormSubmitErrors,
} from "redux-form";
import { useDispatch, useSelector, shallowEqual, connect } from "react-redux";
const RegisterFormCheck = (props) => {
const {
footerLinks,
pages,
handleSubmit,
value,
setRegisterFormComplete,
setAccountCreatedComplete,
} = props;
let { t, lang } = useTranslation();
const router = useRouter();
const { locale } = router;
return (
<>
<p>Check that the details you entered are correct.</p>
<h2 className="govuk-heading-m">About you</h2>
<dl className="govuk-summary-list govuk-!-margin-bottom-9">
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">First name</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.firstname
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
first name
</span>
</a>
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Last name</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.lastname
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
{" "}
last name
</span>
</a>
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Email address</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.email
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
{" "}
email address
</span>
</a>
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Telephone</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.telephone
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
telephone
</span>
</a>
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Company/Group</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.companygroup
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
{" "}
company/group
</span>
</a>
</dd>
</div>
</dl>
<dl className="govuk-summary-list govuk-!-margin-bottom-9">
<h2 className="govuk-heading-m">Your address</h2>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Address Line 1</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.addressline1
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
{" "}
address line 1
</span>
</a>
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Address line 2</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.addressline2
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
{" "}
address line 2
</span>
</a>
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Town/City</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.towncity
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
{" "}
town/city
</span>
</a>
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">County</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.county
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
{" "}
county
</span>
</a>
</dd>
</div>
<div className="govuk-summary-list__row">
<dt className="govuk-summary-list__key">Postcode</dt>
<dd className="govuk-summary-list__value">
{
props.props.props.form.accountRegisterForm.values
.postcode
}
</dd>
<dd className="govuk-summary-list__actions">
<a
className="govuk-link"
href="#"
onClick={() => {
setRegisterFormComplete(false);
}}
>
Change
<span className="govuk-visually-hidden">
{" "}
postcode
</span>
</a>
</dd>
</div>
</dl>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
onClick={() => {
setAccountCreatedComplete(true);
}}
>
Continue
</button>
</div>
</>
);
};
const mapStateToProps = (state) => {
return {
search: state.search,
searchResultsObj: state.searchResultsObj,
formData: state.formData,
appealType: state.appealType,
accountDetails: state.accountDetails,
//form: state.form,
};
};
const mapDispatchToProps = (dispatch) => {
return {
setCurrentSection: (currentSection) => {
dispatch(setCurrentSection(currentSection));
},
};
};
export default connect(mapStateToProps, mapDispatchToProps)(RegisterFormCheck);
+82
View File
@@ -0,0 +1,82 @@
import _ from "lodash";
import Link from "next/link";
import React, { useState } from "react";
import { useRouter } from "next/router";
import useTranslation from "next-translate/useTranslation";
import {
Field,
reduxForm,
formValueSelector,
getFormSubmitErrors,
} from "redux-form";
import {
useDispatch,
useSelector,
shallowEqual,
connect,
setRegisterFormComplete,
setAccountCreatedComplete,
} from "react-redux";
const RegisterComplete = (props) => {
const {
footerLinks,
pages,
handleSubmit,
value,
setRegisterFormComplete,
setAccountCreatedComplete,
} = props;
let { t, lang } = useTranslation();
const router = useRouter();
const { locale } = router;
return (
<>
<p className="govuk-body">We have sent you a confirmation email.</p>
<h2 className="govuk-heading-m">What happens next</h2>
<p className="govuk-body">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi a
metus non quam mollis egestas. Integer ac leo cursus, laoreet
nulla sed, tempus tellus. Mauris condimentum erat arcu.
</p>
<p className="govuk-body">
Sed imperdiet dignissim ipsum. Orci varius natoque penatibus et
magnis dis parturient montes, nascetur ridiculus mus. In id leo
in turpis aliquam venenatis ut non erat. Ut est arcu, luctus sit
amet pretium sed, iaculis non purus. Etiam dictum tortor commodo
luctus rhoncus.
</p>
<p className="govuk-body">
<Link href="/">
<a className="govuk-link">Login to My Portal</a>
</Link>
</p>
</>
);
};
const mapStateToProps = (state) => {
return {
search: state.search,
searchResultsObj: state.searchResultsObj,
formData: state.formData,
appealType: state.appealType,
accountDetails: state.accountDetails,
//form: state.form,
};
};
const mapDispatchToProps = (dispatch) => {
return {
setCurrentSection: (currentSection) => {
dispatch(setCurrentSection(currentSection));
},
};
};
export default connect(mapStateToProps, mapDispatchToProps)(RegisterComplete);
+148 -146
View File
@@ -9,17 +9,9 @@ import {
getFormSubmitErrors,
} from "redux-form";
import { useDispatch, useSelector, shallowEqual, connect } from "react-redux";
import {
Textfield,
DateField,
DateFieldPicker,
YesNofield,
PickList,
MultiLinefield,
NumericField,
ReadOnlyfield,
DecimalField,
} from "../elements";
import RegisterFormCheck from "./registerCheck";
import RegisterComplete from "./registerComplete";
const RenderTextfield = ({
id,
@@ -69,7 +61,12 @@ const RenderTextfield = ({
};
const RegisterForm = (props) => {
const { footerLinks, pages, handleSubmit, value } = props;
const {
handleSubmit,
value,
setRegisterFormComplete,
setAccountCreatedComplete,
} = props;
let { t, lang } = useTranslation();
const router = useRouter();
@@ -77,10 +74,6 @@ const RegisterForm = (props) => {
let errorsobj = {};
const onHandleSubmit = (values) => {
console.log(values);
};
const required = (value) => (value ? undefined : "Is required");
const email = (value) =>
value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)
@@ -96,139 +89,148 @@ const RegisterForm = (props) => {
const [hasErrors, setHasErrors] = useState("");
const onHandleSubmit = (values) => {
setRegisterFormComplete(true);
};
return (
<>
{/* {hasErrors == true ? (
<ShowErrorHeader
hasErrors={hasErrors}
props={props.props.form}
formXML={formXML}
/>
{props.accountCreatedComplete != true ? (
props.registerFormComplete == false ? (
<form onSubmit={handleSubmit(onHandleSubmit)}>
<fieldset className="govuk-fieldset">
<legend className="govuk-fieldset__legend govuk-fieldset__legend--m">
<h2 className="govuk-fieldset__heading">
About you
</h2>
</legend>
<Field
name="firstname"
id="firstname"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="First name"
errorMsg="Is required"
/>
<Field
name="lastname"
id="lastname"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="Last name"
errorMsg="Is required"
/>
<Field
name="email"
id="email"
component={RenderTextfield}
type="email"
className="govuk-input govuk-input--width-20"
validate={[required, email]}
label="Email address"
/>
<Field
name="telephone"
id="telephone"
component={RenderTextfield}
type="number"
className="govuk-input govuk-input--width-20"
validate={[required, phoneNumber]}
label="Telephone"
/>
<Field
name="companygroup"
id="companygroup"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Company/Group"
errorMsg="Is required"
/>
</fieldset>
<fieldset className="govuk-fieldset">
<legend className="govuk-fieldset__legend govuk-fieldset__legend--m">
<h2 className="govuk-fieldset__heading">
What is your address?
</h2>
</legend>
<Field
name="addressline1"
id="addressline1"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Address line 1"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="addressline2"
id="addressline2"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Address line 2"
errorMsg="Is required"
/>
<Field
name="towncity"
id="towncity"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-10"
label="Town/City"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="county"
id="county"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-10"
label="County"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="postcode"
id="postcode"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-5"
label="Postcode"
validate={[required]}
errorMsg="Is required"
/>
</fieldset>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
>
Continue
</button>
</div>
</form>
) : (
<RegisterFormCheck
props={props}
setRegisterFormComplete={setRegisterFormComplete}
setAccountCreatedComplete={setAccountCreatedComplete}
/>
)
) : (
""
)} */}
<form onSubmit={handleSubmit(onHandleSubmit)}>
<fieldset className="govuk-fieldset">
<legend className="govuk-fieldset__legend govuk-fieldset__legend--m">
<h2 className="govuk-fieldset__heading">About you</h2>
</legend>
<Field
name="firstname"
id="firstname"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="First name"
errorMsg="Is required"
/>
<Field
name="lastname"
id="lastname"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={[required]}
label="Last name"
errorMsg="Is required"
/>
<Field
name="email"
id="email"
component={RenderTextfield}
type="email"
className="govuk-input govuk-input--width-20"
validate={[required, email]}
label="Email address"
/>
<Field
name="telephone"
id="telephone"
component={RenderTextfield}
type="number"
className="govuk-input govuk-input--width-20"
validate={[required, phoneNumber]}
label="Telephone"
/>
<Field
name="companygroup"
id="companygroup"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Company/Group"
errorMsg="Is required"
/>
</fieldset>
<fieldset className="govuk-fieldset">
<legend className="govuk-fieldset__legend govuk-fieldset__legend--m">
<h2 className="govuk-fieldset__heading">
What is your address?
</h2>
</legend>
<Field
name="addressline1"
id="addressline1"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Address line 1"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="addressline2"
id="addressline2"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
label="Address line 2"
errorMsg="Is required"
/>
<Field
name="towncity"
id="towncity"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-10"
label="Town/City"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="county"
id="county"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-10"
label="County"
validate={[required]}
errorMsg="Is required"
/>
<Field
name="postcode"
id="postcode"
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-5"
label="Postcode"
validate={[required]}
errorMsg="Is required"
/>
</fieldset>
<div className="govuk-button-group">
<button
type="submit"
className="govuk-button"
data-module="govuk-button"
>
Continue
</button>
</div>
</form>
<RegisterComplete />
)}
</>
);
};
+9
View File
@@ -182,6 +182,15 @@ const Breadcrumbs = (props) => {
) : (
""
)}
{router.pathname == "/account/register" ? (
<>
<li className="govuk-breadcrumbs__list-item">
Register your account
</li>
</>
) : (
""
)}
{router.pathname == "/account/changepassword" ? (
<>
<li className="govuk-breadcrumbs__list-item">
+26 -25
View File
@@ -1,12 +1,14 @@
import Link from "next/link";
import { useRouter } from "next/router";
import useTranslation from "next-translate/useTranslation";
export default function Header({ courseName }) {
import { useDispatch, useSelector, shallowEqual, connect } from "react-redux";
import { setLogout } from "../store/accountDetails/action";
const Header = (props) => {
let { t, lang } = useTranslation();
const router = useRouter();
const { locale } = router;
const { setLogout } = props;
return (
<header
@@ -61,11 +63,8 @@ export default function Header({ courseName }) {
</div>
<div className="govuk-header__content govuk-!-width-one-half govuk-!-margin-top-3">
<Link href="/">
<Link href="/logout">
<a
onClick={() => {
window.localStorage.clear();
}}
className="govuk-header__link
govuk-header__link--service-name"
>
@@ -96,21 +95,18 @@ export default function Header({ courseName }) {
</div>
<div className="content">
<ul>
{router.pathname != "/" ? (
{router.pathname == "/logout" ? (
""
) : router.pathname == "/" ? (
""
) : (
<li>
<Link href="/">
<a
onClick={() => {
window.localStorage.clear();
}}
className="govuk-header__link "
>
<Link href="/logout">
<a className="govuk-header__link ">
{t("common:signout-label")}
</a>
</Link>
</li>
) : (
""
)}
<li>
@@ -153,14 +149,10 @@ export default function Header({ courseName }) {
</div>
</div>
<div className="fullNav">
{router.pathname != "/" ? (
<Link href="/">
<a
onClick={() => {
window.localStorage.clear();
}}
className="govuk-header__link govuk-!-margin-right-3"
>
{router.pathname != "/" ||
router.pathname != "/logout" ? (
<Link href="/logout">
<a className="govuk-header__link govuk-!-margin-right-3">
{t("common:signout-label")}
</a>
</Link>
@@ -200,4 +192,13 @@ export default function Header({ courseName }) {
</div>
</header>
);
}
};
const mapDispatchToProps = (dispatch) => {
return {
setLogout: () => {
dispatch(setLogout());
},
};
};
export default connect(null, mapDispatchToProps)(Header);
+13
View File
@@ -0,0 +1,13 @@
// 404.js
import Link from "next/link";
export default function FourOhFour() {
return (
<>
<h1>404 - Page Not Found</h1>
<Link href="/">
<a>Go back home</a>
</Link>
</>
);
}
+15 -2
View File
@@ -37,6 +37,7 @@ const Home = (props) => {
const { appealtypes } = router.query;
const { appealType, LPAData } = props;
const [passwordUpdated, setPasswordUpdated] = useState(false);
return (
<div>
@@ -61,8 +62,20 @@ const Home = (props) => {
>
<div className="govuk-grid-row">
<div className="govuk-grid-column-two-thirds">
<h1>Change password</h1>
<ChangePassword props={props} />
{passwordUpdated == true ? (
<h1>
Your password has been changed
</h1>
) : (
<h1>Change password</h1>
)}
<ChangePassword
props={props}
setPasswordUpdated={
setPasswordUpdated
}
passwordUpdated={passwordUpdated}
/>
</div>
</div>
</main>
+26 -12
View File
@@ -17,10 +17,8 @@ import jsonpath from "jsonpath";
import { reduxForm, formValueSelector } from "redux-form";
import PersonalDetails from "../../components/account/personaldetails";
import xpath from "xpath";
import { setAccountDetails } from "../../store/accountDetails/action";
import { getPersonalAccount } from "../../actions";
import { setLPA } from "../../store/lpa/action";
const Home = (props) => {
const { footerLinks, formData } = props;
@@ -30,7 +28,9 @@ const Home = (props) => {
const { locale } = router;
const { appealtypes } = router.query;
const { appealType, LPAData } = props;
const [personalDetailsComplete, setPersonalDetailsComplete] =
useState(false);
const [accountUpdatedComplete, setAccountUpdatedComplete] = useState(false);
return (
<div>
@@ -56,7 +56,21 @@ const Home = (props) => {
<div className="govuk-grid-row">
<div className="govuk-grid-column-two-thirds">
<h1>Your account</h1>
<PersonalDetails props={props} />
<PersonalDetails
props={props}
accountUpdatedComplete={
accountUpdatedComplete
}
personalDetailsComplete={
personalDetailsComplete
}
setPersonalDetailsComplete={
setPersonalDetailsComplete
}
setAccountUpdatedComplete={
setAccountUpdatedComplete
}
/>
</div>
</div>
</main>
@@ -70,14 +84,14 @@ const Home = (props) => {
);
};
export const getServerSideProps = wrapper.getServerSideProps(
(store) =>
async ({ query, req, res }) => {
const accountDetails = await getPersonalAccount();
console.log("perosnal: ", accountDetails);
store.dispatch(setAccountDetails(accountDetails));
}
);
// export const getServerSideProps = wrapper.getServerSideProps(
// (store) =>
// async ({ query, req, res }) => {
// const accountDetails = await getPersonalAccount();
// console.log("perosnal: ", accountDetails);
// store.dispatch(setAccountDetails(accountDetails));
// }
// );
const mapStateToProps = (state) => {
return {
+89 -69
View File
@@ -17,26 +17,17 @@ import jsonpath from "jsonpath";
import { reduxForm, formValueSelector } from "redux-form";
import RegisterForm from "../../components/account/registerform";
import xpath from "xpath";
import {
setAppealType,
setAppealTypeTitle,
setAppealTypeID,
setAppealLPA,
getAppealTypeObj,
} from "../../store/appealType/action";
import { getAppealsTypes, getLPA } from "../../actions";
import { setLPA } from "../../store/lpa/action";
const Home = (props) => {
const { footerLinks, pages, formData } = props;
const { footerLinks, formData } = props;
let { t, lang } = useTranslation();
const router = useRouter();
const { locale } = router;
const { appealtypes } = router.query;
const { appealType, LPAData } = props;
const [registerFormComplete, setRegisterFormComplete] = useState(false);
const [accountCreatedComplete, setAccountCreatedComplete] = useState(false);
return (
<div>
@@ -61,59 +52,87 @@ const Home = (props) => {
>
<div className="govuk-grid-row">
<div className="govuk-grid-column-two-thirds">
<h1>Create a new account</h1>
<RegisterForm props={props} />
{registerFormComplete != true ||
accountCreatedComplete != true ? (
<h1>Create a new account</h1>
) : (
<h1>
Your account has been created
</h1>
)}
<RegisterForm
props={props}
accountCreatedComplete={
accountCreatedComplete
}
registerFormComplete={
registerFormComplete
}
setRegisterFormComplete={
setRegisterFormComplete
}
setAccountCreatedComplete={
setAccountCreatedComplete
}
/>
</div>
{registerFormComplete != true ||
accountCreatedComplete != true ? (
<div className="govuk-grid-column-one-third">
<h2 className="govuk-heading-m">
Help
</h2>
<div className="govuk-grid-column-one-third">
<h2 className="govuk-heading-m">
Help
</h2>
<h3>
Companies or submissions by more
than one individual (groups)
</h3>
<h3>
Companies or submissions by more
than one individual (groups)
</h3>
<p className="govuk-body">
If you are submitting an appeal
or representation from a company
e.g. &quot;Acme Inc&quot; or a
group of people e.g.
&quot;Residents of 1-10 High
street&quot;, you should enter
the name of the company or group
in the Company/Group field. You
will be deemed as acting as
their representative.
</p>
<p className="govuk-body">
If you are submitting an appeal or
representation from a company e.g.
&quot;Acme Inc&quot; or a group of
people e.g. &quot;Residents of 1-10
High street&quot;, you should enter
the name of the company or group in
the Company/Group field. You will be
deemed as acting as their
representative.
</p>
<h3>
Enforcement appeals by
married/civil partnership
couples
</h3>
<h3>
Enforcement appeals by married/civil
partnership couples
</h3>
<p className="govuk-body">
You should not enter a group
name. You need only enter your
partner&apos;s name on the
appeal form itself as an
additional appellant.
</p>
<p className="govuk-body">
You should not enter a group name.
You need only enter your
partner&apos;s name on the appeal
form itself as an additional
appellant.
</p>
<h3>
Other appeals by married/civil
partnership couples
</h3>
<h3>
Other appeals by married/civil
partnership couples
</h3>
<p className="govuk-body">
For any other type of appeal, for
example a planning appeal, you
should enter a group name when
creating your account e.g. &quot;Mr
and Mrs Smith&quot;, if that is the
name on the application.
</p>
</div>
<p className="govuk-body">
For any other type of appeal,
for example a planning appeal,
you should enter a group name
when creating your account e.g.
&quot;Mr and Mrs Smith&quot;, if
that is the name on the
application.
</p>
</div>
) : (
""
)}
</div>
</main>
</div>
@@ -126,17 +145,17 @@ const Home = (props) => {
);
};
export const getServerSideProps = wrapper.getServerSideProps(
(store) =>
async ({ query, req, res }) => {
const appealTypeData = await getAppealsTypes();
const lpaData = await getLPA();
console.log("appeal types", appealTypeData);
console.log("lpa typeswwwww", lpaData);
store.dispatch(setAppealType(appealTypeData));
store.dispatch(setLPA(lpaData));
}
);
// export const getServerSideProps = wrapper.getServerSideProps(
// (store) =>
// async ({ query, req, res }) => {
// const appealTypeData = await getAppealsTypes();
// const lpaData = await getLPA();
// console.log("appeal types", appealTypeData);
// console.log("lpa typeswwwww", lpaData);
// store.dispatch(setAppealType(appealTypeData));
// store.dispatch(setLPA(lpaData));
// }
// );
const mapStateToProps = (state) => {
return {
@@ -146,6 +165,7 @@ const mapStateToProps = (state) => {
appealType: state.appealType,
LPAData: state.LPAData,
form: state.form,
accountDetails: state.accountDetails,
};
};
+50
View File
@@ -0,0 +1,50 @@
import _ from "lodash";
import Link from "next/link";
import Head from "next/head";
import Header from "../components/header";
import Banner from "../components/banner";
import CookieBanner from "../components/cookieBanner";
import Footer from "../components/footer";
import { useSelector, shallowEqual, connect } from "react-redux";
import { useRouter } from "next/router";
import useTranslation from "next-translate/useTranslation";
import { setLogout } from "../store/accountDetails/action";
const LogOut = (props) => {
const { footerLinks, pages, setLogout } = props;
let { t, lang } = useTranslation();
const router = useRouter();
const { locale } = router;
setLogout();
return (
<div>
<Head>
<title>{t("common:service-name")}</title>
</Head>
<div id="page_wrapper">
<CookieBanner />
<Header courseName="Appeals Casework Portal" />
<div className="govuk-width-container">
<Banner />
<h2>You have been logged out</h2>
<div className="govuk-!-margin-top-9 govuk-!-margin-bottom-9">
<Link href="/">Return to Planning Casework portal</Link>
</div>
</div>
<Footer footerLinks={footerLinks} />
</div>
</div>
);
};
const mapDispatchToProps = (dispatch) => {
return {
setLogout: () => {
dispatch(setLogout());
},
};
};
export default connect(null, mapDispatchToProps)(LogOut);
+6
View File
@@ -15,3 +15,9 @@ export const setAccountDetails = (accountDetails) => (dispatch) => {
accountDetails: accountDetails,
});
};
export const setLogout = () => (dispatch) => {
return dispatch({
type: "USER_LOGOUT",
});
};
+14 -3
View File
@@ -9,9 +9,10 @@ import LPAData from "./lpa/reducer";
import accountDetails from "./accountDetails/reducer";
import { reducer as formReducer } from "redux-form";
import autoMergeLevel2 from "redux-persist/lib/stateReconciler/autoMergeLevel2";
import storage from "redux-persist/lib/storage";
//COMBINING ALL REDUCERS
const combinedReducer = combineReducers({
const appReducer = combineReducers({
search,
searchResultsObj,
formData,
@@ -21,6 +22,16 @@ const combinedReducer = combineReducers({
form: formReducer,
});
const combinedReducer = (state, action) => {
if (action.type === "USER_LOGOUT") {
// for all keys defined in your persistConfig(s)
storage.removeItem("persist:acp");
// storage.removeItem('persist:otherKey')
return appReducer(undefined, action);
}
return appReducer(state, action);
};
const reducer = (state = {}, action) => {
switch (action.type) {
case HYDRATE:
@@ -77,7 +88,7 @@ const makeStore = ({ isServer }) => {
const storage = require("redux-persist/lib/storage").default;
const persistConfig = {
key: "nextjs",
key: "acp",
whitelist: [
"search",
"searchResults",
@@ -87,7 +98,7 @@ const makeStore = ({ isServer }) => {
"accountDetails",
"form",
],
storage,
storage: storage,
stateReconciler: autoMergeLevel2, // if needed, use a safer storage
};