Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion blueprints/ember-kohactivated/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,18 @@ const basePackages = [
{ name: 'ember-lodash', target: '^4.18.0' },
{ name: 'ember-moment', target: '^7.8.0' },
{ name: 'ember-simple-auth', target: '^1.7.0' },
{ name: 'ember-truth-helpers', target: '^2.1.0' }
{ name: 'ember-truth-helpers', target: '^2.1.0' },
{ name: 'ember-concurrency', target: '^1.0.0' }
];

const bootstrapPackage = {
name: 'ember-bootstrap', target: '^2.1.2'
};

const tailwindPackage = {
name: 'ember-cli-tailwind', target: '^0.7.0'
};

const cloudinaryPackage = {
name: 'ember-cli-cloudinary', target: '0.2.0'
};
Expand Down Expand Up @@ -58,13 +63,20 @@ module.exports = {
message: 'Do you want to install ember-bootstrap? (y/n)'
});

const tailwindPrompt = await this.ui.prompt({
type: 'input',
name: 'tailwind',
message: 'Do you want to install ember-cli-tailwind? (y/n)'
});

const cloudinaryPrompt = await this.ui.prompt({
type: 'input',
name: 'cloudinary',
message: 'Do you want to install ember-cli-cloudinary? (y/n)'
});

options.entity.bootstrap = promptToBool(bootstrapPrompt, 'bootstrap');
options.entity.tailwind = promptToBool(tailwindPrompt, 'tailwind');
options.entity.cloudinary = promptToBool(cloudinaryPrompt, 'cloudinary');
options.cloudinaryENV = getCloudinaryENV(options.entity.cloudinary);
options.allowedKeys = getAllowedKeys(options.entity.cloudinary);
Expand All @@ -79,6 +91,10 @@ module.exports = {
packages.push(bootstrapPackage);
}

if (options.entity.tailwind) {
packages.push(tailwindPackage);
}

if (options.entity.cloudinary) {
packages.push(cloudinaryPackage);
}
Expand Down
25 changes: 25 additions & 0 deletions blueprints/login/files/app/routes/login.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
import EmberObject from '@ember/object';
import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';

export default Route.extend(UnauthenticatedRouteMixin, {
ajax: service(),
showFlashMessages: service(),
session: service(),

model() {
return EmberObject.create({
email: null,
password: null
});
},

actions: {
authenticate(user) {
let { email, password } = user;
this.get('session').authenticate('authenticator:application', email, password)
.catch((e) => this.showFlashMessages.showErrors(e));
}
}
});
36 changes: 36 additions & 0 deletions blueprints/login/files/app/routes/password/request.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import Route from '@ember/routing/route';
import ENV from 'ember-get-config';
import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';
import { inject as service } from '@ember/service';

export default Route.extend(UnauthenticatedRouteMixin, {
ajax: service(),
showFlashMessages: service(),

actions: {
requestReset() {
let endpoint = ENV.apiPasswordEndpoint;
let redirect_url = '/password/reset';
return this.get('ajax').post(endpoint, {
data: {
user: {
email: this.get('controller.email')
},
redirect_url: redirect_url
}
})
.then(() => this.resetRequestSent())
.catch((e) => this.handleError(e));
}
},

resetRequestSent() {
let successMessage = 'Your password reset request was successful. You should receive instruction in your email shortly.';
this.showFlashMessages.showSuccess(successMessage);
this.transitionTo('index');
},

handleError(e) {
this.showFlashMessages.showErrors(e);
}
});
92 changes: 92 additions & 0 deletions blueprints/login/files/app/routes/password/reset.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import Route from '@ember/routing/route';
import ENV from 'ember-get-config';
import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';
import { inject as service } from '@ember/service';
import EmberObject from '@ember/object';
import { htmlSafe } from '@ember/template';

export default Route.extend(UnauthenticatedRouteMixin, {
ajax: service(),
session: service(),
showFlashMessages: service(),

queryParams: {
token: {
refreshModel: false
},
email: {
refreshModel: false
}
},

model(params) {
let { token } = params;

return EmberObject.create({
email: null,
password: null,
password_confirmation: null,
reset_password_token: token
});
},

afterModel(model) {
this._super(...arguments);

// Kick people back to the reset password page if they don't have a token
if (!model.get('reset_password_token')) {
this.transitionTo('password.request');
}
},

actions: {
resetPassword(model) {
let errors = this.validateNewPassword(model);
if (errors.length) {
let errorText = htmlSafe(errors.join('<br />'));
return this.showFlashMessages.showErrors(errorText);
}

let params = model.getProperties('reset_password_token', 'password', 'password_confirmation', 'email');

let endpoint = ENV.apiPasswordEndpoint;
return this.get('ajax').put(endpoint, {
data: {
user: params
}
})
.then(() => this.handlePasswordReset())
.catch((e) => this.handleError(e));
}
},

validateNewPassword(model) {
let errors = [];
let { password, password_confirmation } = model.getProperties('password', 'password_confirmation');

if (!password) {
errors.push('Password cannot be blank');
return errors;
}

if (password.length < 6) {
errors.push('Password must be at least 6 characters long');
}

if (password !== password_confirmation) {
errors.push('Password and password confirmation must match');
}

return errors;
},

handlePasswordReset() {
let successMessage = 'Your password has been reset. Please login to continue.';
this.showFlashMessages.showSuccess(successMessage);
this.transitionTo('index');
},

handleError(e) {
this.showFlashMessages.showErrors(e);
}
});
31 changes: 31 additions & 0 deletions blueprints/login/files/app/templates/login.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<h1>Login</h1>

<form {{action "authenticate" model on="submit"}}>
<label>
Username
{{input
data-test-login-email
type="text"
value=model.email
}}
</label>
<label>
Password
{{input
data-test-login-password
type="password"
value=model.password
}}
</label>
{{input
data-test-login-submit
type="submit"
value="Login"
}}
<p>
{{link-to
"Forgot your password?"
"password.request"
}}
</p>
</form>
19 changes: 19 additions & 0 deletions blueprints/login/files/app/templates/password/request.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<h1>Forgot your password?</h1>
<p>Enter your email address below and we'll get you back on track.</p>

<form {{action "requestReset" model on="submit"}}>
<label>
E-mail Address
{{input
data-test-request-email
type="text"
value=email
}}
</label>

{{input
data-test-request-submit
type="submit"
value="Submit"
}}
</form>
33 changes: 33 additions & 0 deletions blueprints/login/files/app/templates/password/reset.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<h1>Change your password</h1>
<form {{action "resetPassword" model on="submit"}}>
<label>
E-mail Address
{{input
data-test-reset-email
type="text"
value=model.email
}}
</label>
<label>
New Password
{{input
data-test-reset-password
type="password"
value=model.password
}}
</label>
<label>
Confirm Password
{{input
data-test-reset-password
type="password"
value=model.password_confirmation
}}
</label>

{{input
data-test-request-submit
type="submit"
value="Reset Password"
}}
</form>
15 changes: 15 additions & 0 deletions blueprints/login/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/* eslint-env node */
module.exports = {
description: ''

// locals(options) {
// // Return custom template variables here.
// return {
// foo: options.entity.options.foo
// };
// }

// afterInstall(options) {
// // Perform extra work here.
// }
};
71 changes: 71 additions & 0 deletions blueprints/register/files/app/routes/register.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import Route from '@ember/routing/route';
import EmberObject from '@ember/object';
import { inject as service } from '@ember/service';
import ENV from 'ember-get-config';
import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';

export default Route.extend(UnauthenticatedRouteMixin, {
ajax: service(),
flashMessages: service(),
session: service(),
store: service(),

model() {
return EmberObject.create({
email: null,
password: null,
passwordConfirmation: null,
termsAccepted: false
});
},

actions: {
signUp(user) {
if (!this._validRegistration(user)) {
this.get('flashMessages').add({
message: 'Unable to register. Please check your email address and make sure your password confirmation is correct and you accepted the terms and conditions.',
type: 'warning'
});

return false;
}

const endpoint = `${ENV.apiFullPath}/auth`;

return this.get('ajax').post(endpoint, {
data: {
user: {
email: user.email,
password: user.password
}
} })
.then(() => this._authenticate(user))
.catch(e => this._showErrors(e.payload));
}
},

_validRegistration(user) {
const emailPresent = user.email && user.email.length > 7;
const passwordConfirmed = user.password === user.passwordConfirmation;
const { termsAccepted } = user;
return emailPresent && passwordConfirmed && termsAccepted;
},

_authenticate(user) {
let { email, password } = user;
this.get('session').authenticate('authenticator:application', email, password)
.then(() => this.handleEventTransition())
.catch((e) => this._showErrors(e));
},

handleEventTransition() {
// this.transitionTo('dashboard');
},

_showErrors(e) {
console.log(e); // eslint-disable-line
const { errors } = e;
const type = 'danger';
errors.messages.forEach(message => this.get('flashMessages').add({ message, type }));
}
});
Loading