Skip to content

Commit

Permalink
Merge branch 'thuanpq-devel' into devel
Browse files Browse the repository at this point in the history
User Admin to Admin Panel: List users.
Change: is user admin, name, fullname, email address, is user active.
Not changing password yet. Thanks to thuanpq and xet7 ! Related #802
  • Loading branch information
xet7 committed Nov 18, 2017
2 parents 13d8e75 + 75c5eeb commit 0ea96fc
Show file tree
Hide file tree
Showing 46 changed files with 831 additions and 419 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -5,6 +5,7 @@
tmp/
node_modules/
.vscode/
.idea/
.build/*
packages/kadira-flow-router/
packages/meteor-useraccounts-core/
Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.md
Expand Up @@ -3,14 +3,15 @@
This release adds the following new features:

* [Markdown in card/minicard/checlist titles and checklist items. Next line: Shift+Enter. Submit: Enter.](https://github.com/wekan/wekan/pull/1334);
* [User Admin to Admin Panel: List users. Change: is user admin, name, fullname, email address, is user active. Not changing password yet.](https://github.com/wekan/wekan/pull/1325).

and fixes the following bugs:

* [Fix: Emoji detection breaks MAC addresses](https://github.com/wekan/wekan/issues/1248);
* [Fix: Codeblocks should not be scanned for emoji](https://github.com/wekan/wekan/issues/643);
* [Fix: Whitespace trimming breaks Markdown code block indentation](https://github.com/wekan/wekan/issues/1288).

Thanks to Github user brooksbecton for contributions.
Thanks to Github users brooksbecton, thuanpq and xet7 for their contributions.

# v0.54 2017-11-02 Wekan release

Expand Down
89 changes: 89 additions & 0 deletions client/components/settings/peopleBody.jade
@@ -0,0 +1,89 @@
template(name="people")
.setting-content
unless currentUser.isAdmin
| {{_ 'error-notAuthorized'}}
else
.content-title
span {{_ 'people'}}
.content-body
.side-menu
ul
li.active
a.js-setting-menu(data-id="people-setting") {{_ 'people'}}
.main-body
if loading.get
+spinner
else if people.get
+peopleGeneral

template(name="peopleGeneral")
table
tbody
tr
th {{_ 'username'}}
th {{_ 'fullname'}}
th {{_ 'admin'}}
th {{_ 'email'}}
th {{_ 'verified'}}
th {{_ 'createdAt'}}
th {{_ 'active'}}
th
each user in peopleList
+peopleRow(userId=user._id)

template(name="peopleRow")
tr
td.username {{ userData.username }}
td {{ userData.profile.fullname }}
td
if userData.isAdmin
| {{_ 'yes'}}
else
| {{_ 'no'}}
td {{ userData.emails.[0].address }}
td
if userData.emails.[0].verified
| {{_ 'yes'}}
else
| {{_ 'no'}}
td {{ moment userData.createdAt 'LLL' }}
td
if userData.loginDisabled
| {{_ 'no'}}
else
| {{_ 'yes'}}
td
a.edit-user
| {{_ 'edit'}}

template(name="editUserPopup")
form
label.hide.userId(type="text" value=user._id)
label
| {{_ 'fullname'}}
input.js-profile-fullname(type="text" value=user.profile.fullname autofocus)
label
| {{_ 'username'}}
span.error.hide.username-taken
| {{_ 'error-username-taken'}}
input.js-profile-username(type="text" value=user.username)
label
| {{_ 'initials'}}
input.js-profile-initials(type="text" value=user.profile.initials)
label
| {{_ 'email'}}
span.error.hide.email-taken
| {{_ 'error-email-taken'}}
input.js-profile-email(type="email" value="{{user.emails.[0].address}}")
label
| {{_ 'admin'}}
select.select-role.js-profile-isadmin
option(value="false") {{_ 'no'}}
option(value="true" selected="{{user.isAdmin}}") {{_ 'yes'}}
label
| {{_ 'active'}}
select.select-active.js-profile-isactive
option(value="false") {{_ 'yes'}}
option(value="true" selected="{{user.loginDisabled}}") {{_ 'no'}}

input.primary.wide(type="submit" value="{{_ 'save'}}")
156 changes: 156 additions & 0 deletions client/components/settings/peopleBody.js
@@ -0,0 +1,156 @@
const usersPerPage = 25;

BlazeComponent.extendComponent({
mixins() {
return [Mixins.InfiniteScrolling];
},
onCreated() {
this.error = new ReactiveVar('');
this.loading = new ReactiveVar(false);
this.people = new ReactiveVar(true);

this.page = new ReactiveVar(1);
this.loadNextPageLocked = false;
this.callFirstWith(null, 'resetNextPeak');
this.autorun(() => {
const limit = this.page.get() * usersPerPage;

this.subscribe('people', limit, () => {
this.loadNextPageLocked = false;
const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
this.calculateNextPeak();
const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
if (nextPeakBefore === nextPeakAfter) {
this.callFirstWith(null, 'resetNextPeak');
}
});
});
},
loadNextPage() {
if (this.loadNextPageLocked === false) {
this.page.set(this.page.get() + 1);
this.loadNextPageLocked = true;
}
},
calculateNextPeak() {
const element = this.find('.main-body');
if (element) {
const altitude = element.scrollHeight;
this.callFirstWith(this, 'setNextPeak', altitude);
}
},
reachNextPeak() {
this.loadNextPage();
},
setError(error) {
this.error.set(error);
},
setLoading(w) {
this.loading.set(w);
},
peopleList() {
return Users.find({}, {
fields: {_id: true},
});
},
}).register('people');

Template.peopleRow.helpers({
userData() {
const userCollection = this.esSearch ? ESSearchResults : Users;
return userCollection.findOne(this.userId);
},
});

Template.editUserPopup.helpers({
user() {
return Users.findOne(this.userId);
},
});

BlazeComponent.extendComponent({
onCreated() {
},
user() {
return Users.findOne(this.userId);
},
events() {
return [{
'click a.edit-user': Popup.open('editUser'),
}];
},
}).register('peopleRow');

Template.editUserPopup.events({
submit(evt, tpl) {
evt.preventDefault();
const user = Users.findOne(this.userId);
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 isAdmin = tpl.find('.js-profile-isadmin').value.trim();
const isActive = tpl.find('.js-profile-isactive').value.trim();
const email = tpl.find('.js-profile-email').value.trim();
let isChangeUserName = false;
let isChangeEmail = false;

Users.update(this.userId, {
$set: {
'profile.fullname': fullname,
'profile.initials': initials,
'isAdmin': isAdmin === 'true',
'loginDisabled': isActive === 'true',
},
});

isChangeUserName = username !== user.username;
isChangeEmail = email.toLowerCase() !== user.emails[0].address.toLowerCase();

if (isChangeUserName && isChangeEmail) {
Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), this.userId, 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.close();
}
});
} else if (isChangeUserName) {
Meteor.call('setUsername', username, this.userId, function (error) {
const usernameMessageElement = tpl.$('.username-taken');
if (error) {
const errorElement = error.error;
if (errorElement === 'username-already-taken') {
usernameMessageElement.show();
}
} else {
usernameMessageElement.hide();
Popup.close();
}
});
} else if (isChangeEmail) {
Meteor.call('setEmail', email.toLowerCase(), this.userId, function (error) {
const emailMessageElement = tpl.$('.email-taken');
if (error) {
const errorElement = error.error;
if (errorElement === 'email-already-taken') {
emailMessageElement.show();
}
} else {
emailMessageElement.hide();
Popup.close();
}
});
} else Popup.close();
},
});
15 changes: 15 additions & 0 deletions client/components/settings/peopleBody.styl
@@ -0,0 +1,15 @@
.main-body
overflow: scroll;

table
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;

td, th
border: 1px solid #d2d0d0;
text-align: left;
padding: 8px;

tr:nth-child(even)
background-color: #dddddd;
9 changes: 5 additions & 4 deletions client/components/settings/settingHeader.jade
Expand Up @@ -9,13 +9,14 @@ template(name="settingHeaderBar")
a.setting-header-btn.settings(href="{{pathFor 'setting'}}")
i.fa(class="fa-cog")
span {{_ 'settings'}}

a.setting-header-btn.people(href="{{pathFor 'people'}}")
i.fa(class="fa-users")
span {{_ 'people'}}

a.setting-header-btn.informations(href="{{pathFor 'information'}}")
i.fa(class="fa-info-circle")
span {{_ 'info'}}
//TODO
// a.setting-header-btn.people
// i.fa(class="fa-users")
// span {{_ 'people'}}

else
a.setting-header-btn.js-log-in(
Expand Down
10 changes: 5 additions & 5 deletions client/components/users/userHeader.js
Expand Up @@ -42,7 +42,7 @@ Template.editProfilePopup.events({
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) {
Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), Meteor.userId(), function (error) {
const usernameMessageElement = tpl.$('.username-taken');
const emailMessageElement = tpl.$('.email-taken');
if (error) {
Expand All @@ -61,7 +61,7 @@ Template.editProfilePopup.events({
}
});
} else if (isChangeUserName) {
Meteor.call('setUsername', username, function(error) {
Meteor.call('setUsername', username, Meteor.userId(), function (error) {
const messageElement = tpl.$('.username-taken');
if (error) {
messageElement.show();
Expand All @@ -71,7 +71,7 @@ Template.editProfilePopup.events({
}
});
} else if (isChangeEmail) {
Meteor.call('setEmail', email.toLowerCase(), function(error) {
Meteor.call('setEmail', email.toLowerCase(), Meteor.userId(), function (error) {
const messageElement = tpl.$('.email-taken');
if (error) {
messageElement.show();
Expand Down Expand Up @@ -105,7 +105,7 @@ Template.editNotificationPopup.events({

// XXX For some reason the useraccounts autofocus isnt working in this case.
// See https://github.com/meteor-useraccounts/core/issues/384
Template.changePasswordPopup.onRendered(function() {
Template.changePasswordPopup.onRendered(function () {
this.find('#at-field-current_password').focus();
});

Expand All @@ -116,7 +116,7 @@ Template.changeLanguagePopup.helpers({
tag: code,
name: lang.name === 'br' ? 'Brezhoneg' : lang.name,
};
}).sort(function(a, b) {
}).sort(function (a, b) {
if (a.name === b.name) {
return 0;
} else {
Expand Down
20 changes: 20 additions & 0 deletions config/router.js
Expand Up @@ -140,6 +140,26 @@ FlowRouter.route('/information', {
},
});

FlowRouter.route('/people', {
name: 'people',
triggersEnter: [
AccountsTemplates.ensureSignedIn,
() => {
Session.set('currentBoard', null);
Session.set('currentCard', null);

Filter.reset();
EscapeActions.executeAll();
},
],
action() {
BlazeLayout.render('defaultLayout', {
headerBar: 'settingHeaderBar',
content: 'people',
});
},
});

FlowRouter.notFound = {
action() {
BlazeLayout.render('defaultLayout', { content: 'notFound' });
Expand Down
5 changes: 4 additions & 1 deletion i18n/ar.i18n.json
Expand Up @@ -404,5 +404,8 @@
"yes": "نعم",
"no": "لا",
"accounts": "الحسابات",
"accounts-allowEmailChange": "السماح بتغيير البريد الإلكتروني"
"accounts-allowEmailChange": "السماح بتغيير البريد الإلكتروني",
"createdAt": "Created at",
"verified": "Verified",
"active": "Active"
}

0 comments on commit 0ea96fc

Please sign in to comment.