diff --git a/imports/startup/server/fixtures.js b/imports/startup/server/fixtures.js new file mode 100644 index 0000000..d809305 --- /dev/null +++ b/imports/startup/server/fixtures.js @@ -0,0 +1,33 @@ +import seeder from '@cleverbeagle/seeder'; +import { Meteor } from 'meteor/meteor'; +import Documents from '../../api/Documents/Documents'; + +seeder(Meteor.users, { + environments: ['development', 'staging'], + data: [{ + email: 'admin@admin.com', + password: 'password', + profile: { + name: { + first: 'George', + last: 'Clooney', + }, + }, + roles: ['admin'], + }], +}); + +seeder(Documents, { + environments: ['development', 'staging'], + wipe: true, + min: 10, + model(index, faker) { + const owner = Meteor.users.findOne({ 'emails.address': 'admin@admin.com' })._id; + const documentNumber = index + 1; + return { + owner, + title: `${faker.lorem.words(5)} #${documentNumber}`, + body: `This is the body of example document #${documentNumber}.`, + }; + }, +}); diff --git a/imports/startup/server/index.js b/imports/startup/server/index.js index acb0b20..b4ab10a 100644 --- a/imports/startup/server/index.js +++ b/imports/startup/server/index.js @@ -1 +1,2 @@ import './api'; +import './fixtures'; diff --git a/imports/ui/components/AccountPageFooter/AccountPageFooter.js b/imports/ui/components/AccountPageFooter/AccountPageFooter.js new file mode 100644 index 0000000..dd5a1e7 --- /dev/null +++ b/imports/ui/components/AccountPageFooter/AccountPageFooter.js @@ -0,0 +1,16 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import './AccountPageFooter.scss'; + +const AccountPageFooter = ({ children }) => ( +
+ {children} +
+); + +AccountPageFooter.propTypes = { + children: PropTypes.node.isRequired, +}; + +export default AccountPageFooter; diff --git a/imports/ui/components/AccountPageFooter/AccountPageFooter.scss b/imports/ui/components/AccountPageFooter/AccountPageFooter.scss new file mode 100644 index 0000000..1808d64 --- /dev/null +++ b/imports/ui/components/AccountPageFooter/AccountPageFooter.scss @@ -0,0 +1,7 @@ +@import '../../stylesheets/colors'; + +.AccountPageFooter { + margin-top: 25px; + padding-top: 20px; + border-top: 1px solid $gray-lighter; +} diff --git a/imports/ui/pages/Login/Login.js b/imports/ui/pages/Login/Login.js index 94ca853..c1ef3aa 100644 --- a/imports/ui/pages/Login/Login.js +++ b/imports/ui/pages/Login/Login.js @@ -5,6 +5,7 @@ import { Link } from 'react-router-dom'; import { Meteor } from 'meteor/meteor'; import { Bert } from 'meteor/themeteorchef:bert'; import OAuthLoginButton from '../../components/OAuthLoginButton/OAuthLoginButton'; +import AccountPageFooter from '../../components/AccountPageFooter/AccountPageFooter'; import validate from '../../../modules/validate'; import './Login.scss'; @@ -92,9 +93,9 @@ class Login extends React.Component { /> -

- {'Don\'t have an account?'} Sign Up. -

+ +

{'Don\'t have an account?'} Sign Up.

+
diff --git a/imports/ui/pages/Login/Login.scss b/imports/ui/pages/Login/Login.scss index 0be4233..8cbe962 100644 --- a/imports/ui/pages/Login/Login.scss +++ b/imports/ui/pages/Login/Login.scss @@ -17,11 +17,5 @@ left: 50%; margin-left: -106px; } - - .DontHaveAnAccount { - margin-top: 25px; - padding-top: 20px; - border-top: 1px solid $gray-lighter; - } } } diff --git a/imports/ui/pages/RecoverPassword/RecoverPassword.js b/imports/ui/pages/RecoverPassword/RecoverPassword.js index e69de29..b890442 100644 --- a/imports/ui/pages/RecoverPassword/RecoverPassword.js +++ b/imports/ui/pages/RecoverPassword/RecoverPassword.js @@ -0,0 +1,83 @@ +import React from 'react'; +import { Row, Col, Alert, FormGroup, ControlLabel, Button } from 'react-bootstrap'; +import PropTypes from 'prop-types'; +import { Link } from 'react-router-dom'; +import { Accounts } from 'meteor/accounts-base'; +import { Bert } from 'meteor/themeteorchef:bert'; +import AccountPageFooter from '../../components/AccountPageFooter/AccountPageFooter'; +import validate from '../../../modules/validate'; + +class RecoverPassword extends React.Component { + constructor(props) { + super(props); + this.handleSubmit = this.handleSubmit.bind(this); + } + + componentDidMount() { + const component = this; + + validate(component.form, { + rules: { + emailAddress: { + required: true, + email: true, + }, + }, + messages: { + emailAddress: { + required: 'Need an email address here.', + email: 'Is this email address correct?', + }, + }, + submitHandler() { component.handleSubmit(); }, + }); + } + + handleSubmit() { + const { history } = this.props; + const email = this.emailAddress.value; + + Accounts.forgotPassword({ email }, (error) => { + if (error) { + Bert.alert(error.reason, 'danger'); + } else { + Bert.alert(`Check ${email} for a reset link!`, 'success'); + history.push('/login'); + } + }); + } + + render() { + return (
+ + +

Recover Password

+ + Enter your email address below to receive a link to reset your password. + +
(this.form = form)} onSubmit={event => event.preventDefault()}> + + Email Address + (this.emailAddress = emailAddress)} + className="form-control" + /> + + + +

Remember your password? Log In.

+
+
+ +
+
); + } +} + +RecoverPassword.propTypes = { + history: PropTypes.object.isRequired, +}; + +export default RecoverPassword; diff --git a/imports/ui/pages/Signup/Signup.js b/imports/ui/pages/Signup/Signup.js index 615558e..42d0871 100644 --- a/imports/ui/pages/Signup/Signup.js +++ b/imports/ui/pages/Signup/Signup.js @@ -6,6 +6,7 @@ import { Accounts } from 'meteor/accounts-base'; import { Bert } from 'meteor/themeteorchef:bert'; import OAuthLoginButton from '../../components/OAuthLoginButton/OAuthLoginButton'; import InputHint from '../../components/InputHint/InputHint'; +import AccountPageFooter from '../../components/AccountPageFooter/AccountPageFooter'; import validate from '../../../modules/validate'; import './Signup.scss'; @@ -138,9 +139,9 @@ class Signup extends React.Component { Use at least six characters. -

- Already have an account? Log In. -

+ +

Already have an account? Log In.

+
diff --git a/imports/ui/pages/Signup/Signup.scss b/imports/ui/pages/Signup/Signup.scss index 88d5167..d3e9bac 100644 --- a/imports/ui/pages/Signup/Signup.scss +++ b/imports/ui/pages/Signup/Signup.scss @@ -16,11 +16,5 @@ left: 50%; margin-left: -106px; } - - .HaveAnAccount { - margin-top: 25px; - padding-top: 20px; - border-top: 1px solid $gray-lighter; - } } } diff --git a/package.json b/package.json index 0977f0b..c70c289 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ }, "dependencies": { "@cleverbeagle/dates": "^0.2.0", + "@cleverbeagle/seeder": "^0.3.0", "babel-runtime": "^6.20.0", + "bcrypt": "^1.0.2", "jquery": "^2.2.4", "jquery-validation": "^1.16.0", "meteor-node-stubs": "~0.2.4",