Add change email address

Set allow email change in admin panel
This commit is contained in:
nztqa 2017-08-07 17:40:50 +09:00
parent 57219df16a
commit 6a10257fd7
9 changed files with 153 additions and 4 deletions

View file

@ -129,6 +129,7 @@
"JsonRoutes": true,
"Authentication": true,
"Integrations": true,
"HTTP": true
"HTTP": true,
"AccountSettings": true
}
}

View file

@ -12,6 +12,8 @@ template(name="setting")
a.js-setting-menu(data-id="registration-setting") {{_ 'registration'}}
li
a.js-setting-menu(data-id="email-setting") {{_ 'email'}}
li
a.js-setting-menu(data-id="account-setting") {{_ 'accounts'}}
.main-body
if loading.get
+spinner
@ -19,6 +21,8 @@ template(name="setting")
+general
else if emailSetting.get
+email
else if accountSetting.get
+accountSettings
template(name="general")
ul#registration-setting.setting-detail
@ -80,3 +84,15 @@ template(name='email')
li
button.js-save.primary {{_ 'save'}}
template(name='accountSettings')
ul#account-setting.setting-detail
li.smtp-form
.title {{_ 'accounts-allowEmailChange'}}
.form-group.flex
input.form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="true" checked="{{#if allowEmailChange}}checked{{/if}}")
span {{_ 'yes'}}
input.form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="false" checked="{{#unless allowEmailChange}}checked{{/unless}}")
span {{_ 'no'}}
li
button.js-accounts-save.primary {{_ 'save'}}

View file

@ -1,5 +1,6 @@
Meteor.subscribe('setting');
Meteor.subscribe('mailServer');
Meteor.subscribe('accountSettings');
BlazeComponent.extendComponent({
onCreated() {
@ -7,6 +8,7 @@ BlazeComponent.extendComponent({
this.loading = new ReactiveVar(false);
this.generalSetting = new ReactiveVar(true);
this.emailSetting = new ReactiveVar(false);
this.accountSetting = new ReactiveVar(false);
},
setError(error) {
@ -62,6 +64,7 @@ BlazeComponent.extendComponent({
const targetID = target.data('id');
this.generalSetting.set('registration-setting' === targetID);
this.emailSetting.set('email-setting' === targetID);
this.accountSetting.set('account-setting' === targetID);
}
},
@ -130,3 +133,22 @@ BlazeComponent.extendComponent({
}];
},
}).register('setting');
BlazeComponent.extendComponent({
saveAllowEmailChange() {
const allowEmailChange = ($('input[name=allowEmailChange]:checked').val() === 'true');
AccountSettings.update('accounts-allowEmailChange', {
$set: { 'booleanValue': allowEmailChange },
});
},
allowEmailChange() {
return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
},
events() {
return [{
'click button.js-accounts-save': this.saveAllowEmailChange,
}];
},
}).register('accountSettings');

View file

@ -36,6 +36,14 @@ template(name="editProfilePopup")
label
| {{_ 'initials'}}
input.js-profile-initials(type="text" value=profile.initials)
label
| {{_ 'email'}}
span.error.hide.email-taken
| {{_ 'error-email-taken'}}
if allowEmailChange
input.js-profile-email(type="email" value="{{emails.[0].address}}")
else
input.js-profile-email(type="email" value="{{emails.[0].address}}" readonly)
input.primary.wide(type="submit" value="{{_ 'save'}}")
template(name="editNotificationPopup")

View file

@ -20,18 +20,47 @@ Template.memberMenuPopup.events({
},
});
Template.editProfilePopup.helpers({
allowEmailChange() {
return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
},
});
Template.editProfilePopup.events({
submit(evt, tpl) {
evt.preventDefault();
const fullname = tpl.find('.js-profile-fullname').value.trim();
const username = tpl.find('.js-profile-username').value.trim();
const initials = tpl.find('.js-profile-initials').value.trim();
const email = tpl.find('.js-profile-email').value.trim();
let isChangeUserName = false;
let isChangeEmail = false;
Users.update(Meteor.userId(), {$set: {
'profile.fullname': fullname,
'profile.initials': initials,
}});
if (username !== Meteor.user().username) {
isChangeUserName = username !== Meteor.user().username;
isChangeEmail = email.toLowerCase() !== Meteor.user().emails[0].address.toLowerCase();
if (isChangeUserName && isChangeEmail) {
Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), function(error) {
const usernameMessageElement = tpl.$('.username-taken');
const emailMessageElement = tpl.$('.email-taken');
if (error) {
const errorElement = error.error;
if (errorElement === 'username-already-taken') {
usernameMessageElement.show();
emailMessageElement.hide();
} else if (errorElement === 'email-already-taken') {
usernameMessageElement.hide();
emailMessageElement.show();
}
} else {
usernameMessageElement.hide();
emailMessageElement.hide();
Popup.back();
}
});
} else if (isChangeUserName) {
Meteor.call('setUsername', username, function(error) {
const messageElement = tpl.$('.username-taken');
if (error) {
@ -41,6 +70,16 @@ Template.editProfilePopup.events({
Popup.back();
}
});
} else if (isChangeEmail) {
Meteor.call('setEmail', email.toLowerCase(), function(error) {
const messageElement = tpl.$('.email-taken');
if (error) {
messageElement.show();
} else {
messageElement.hide();
Popup.back();
}
});
} else Popup.back();
},
});

View file

@ -191,6 +191,7 @@
"error-user-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
"error-username-taken": "This username is already taken",
"error-email-taken": "Email has already been taken",
"export-board": "Export board",
"filter": "Filter",
"filter-cards": "Filter Cards",
@ -379,5 +380,9 @@
"OS_Uptime": "OS Uptime",
"hours": "hours",
"minutes": "minutes",
"seconds": "seconds"
"seconds": "seconds",
"yes": "Yes",
"no": "No",
"accounts": "accounts",
"accounts-allowEmailChange": "Allow Email Change"
}

33
models/accountSettings.js Normal file
View file

@ -0,0 +1,33 @@
AccountSettings = new Mongo.Collection('accountSettings');
AccountSettings.attachSchema(new SimpleSchema({
_id: {
type: String,
},
booleanValue: {
type: Boolean,
optional: true,
},
sort: {
type: Number,
decimal: true,
},
}));
AccountSettings.allow({
update(userId) {
const user = Users.findOne(userId);
return user && user.isAdmin;
},
});
if (Meteor.isServer) {
Meteor.startup(() => {
AccountSettings.upsert({ _id: 'accounts-allowEmailChange' }, {
$setOnInsert: {
booleanValue: false,
sort: 0,
},
});
});
}

View file

@ -334,6 +334,28 @@ Meteor.methods({
check(limit, Number);
Meteor.user().setShowCardsCountAt(limit);
},
setEmail(email) {
check(email, String);
const existingUser = Users.findOne({ 'emails.address': email }, { fields: { _id: 1 } });
if (existingUser) {
throw new Meteor.Error('email-already-taken');
} else {
Users.update(this.userId, {
$set: {
emails: [{
address: email,
verified: false,
}],
},
});
}
},
setUsernameAndEmail(username, email) {
check(username, String);
check(email, String);
Meteor.call('setUsername', username);
Meteor.call('setEmail', email);
},
});
if (Meteor.isServer) {

View file

@ -0,0 +1,3 @@
Meteor.publish('accountSettings', function() {
return AccountSettings.find();
});