Fixed all known bugs; Modified the menu to hide; Fixed the tables to scroll with a fixed header.
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
import './UserManagement.html';
|
||||
import '/imports/util/selectize/selectize.js'
|
||||
|
||||
let QUERY_LIMIT = 100;
|
||||
let QUERY_LIMIT_INCREMENT = 100;
|
||||
let PREFIX = "UserManagement";
|
||||
|
||||
Tracker.autorun(function() {
|
||||
@@ -9,9 +11,71 @@ Tracker.autorun(function() {
|
||||
Meteor.subscribe("roles");
|
||||
});
|
||||
|
||||
Template.UserManagement.onCreated(function() {
|
||||
Session.set(PREFIX + "displayNewUser", false);
|
||||
Session.set(PREFIX + "queryLimit", QUERY_LIMIT);
|
||||
});
|
||||
Template.UserManagement.onRendered(function() {
|
||||
$(".tableContainer").mCustomScrollbar({
|
||||
scrollButtons: {enable:true},
|
||||
theme: "light-thick",
|
||||
scrollbarPosition: "outside",
|
||||
scrollEasing: "linear"
|
||||
});
|
||||
});
|
||||
Template.UserManagement.helpers({
|
||||
displayNewUser: function() {
|
||||
return Session.get(PREFIX + "displayNewUser");
|
||||
},
|
||||
users: function() {
|
||||
return Meteor.collections.Users.find({}, {sort: {username: 1}});
|
||||
let skipCount = Session.get(PREFIX + 'skipCount') || 0;
|
||||
let query = Session.get(PREFIX + 'searchQuery');
|
||||
let dbQuery = [];
|
||||
|
||||
if(query) {
|
||||
_.each(_.keys(query), function(key) {
|
||||
if(_.isFunction(query[key])) dbQuery.push({[key]: query[key]}); //dbQuery[key] = query[key]();
|
||||
else if(_.isObject(query[key])) dbQuery.push({[key]: query[key]}); //dbQuery[key] = query[key]; //Will look something like: {$in: [xxx,xxx,xxx]}
|
||||
else if(_.isNumber(query[key])) dbQuery.push({[key]: query[key]}); //dbQuery[key] = query[key];
|
||||
else {
|
||||
//dbQuery[key] = {$regex: query[key], $options: 'i'};
|
||||
let searchValue = query[key];
|
||||
let searches = searchValue && searchValue.length > 0 ? searchValue.split(/\s+/) : undefined;
|
||||
|
||||
for(let search of searches) {
|
||||
dbQuery.push({[key]: {$regex: '\\b' + search, $options: 'i'}});
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if(!Session.get(PREFIX + "showHidden")) {
|
||||
//Ignore any hidden elements by showing those not hidden, or those without the hidden field.
|
||||
dbQuery.push({$or: [{hidden: false}, {hidden: {$exists:false}}]});
|
||||
}
|
||||
|
||||
dbQuery = dbQuery.length > 0 ? {$and: dbQuery} : {};
|
||||
Session.set(PREFIX + 'userCount', Meteor.collections.Users.find(dbQuery).count()); //Always get a full count.
|
||||
return Meteor.collections.Users.find(dbQuery, {limit: Session.get(PREFIX + "queryLimit"), skip: skipCount, sort: {username: 1}});
|
||||
},
|
||||
disableLoadMore: function() {
|
||||
return Session.get(PREFIX + 'userCount') - (Session.get(PREFIX + 'skipCount') || 0) - Session.get(PREFIX + "queryLimit") <= 0;
|
||||
}
|
||||
});
|
||||
Template.UserManagement.events({
|
||||
'click .loadMoreLink': function(event, template) {
|
||||
event.preventDefault();
|
||||
Session.set(PREFIX + 'queryLimit', Session.get(PREFIX + "queryLimit") + QUERY_LIMIT_INCREMENT);
|
||||
},
|
||||
'click .newUserButton': function(event, template) {
|
||||
if(template.$('.newUserButton').hasClass('active')) {
|
||||
Session.set(PREFIX + 'displayNewUser', false);
|
||||
}
|
||||
else {
|
||||
Session.set(PREFIX + 'displayNewUser', true);
|
||||
Session.set(PREFIX + "editedUser", undefined); //Clear the edited user so that only one editor is open at a time.
|
||||
}
|
||||
template.$('.newUserButton').toggleClass('active');
|
||||
}
|
||||
});
|
||||
|
||||
@@ -20,7 +84,10 @@ Template.User.onCreated(function() {
|
||||
});
|
||||
Template.User.events({
|
||||
"click .userEdit": function(event, template) {
|
||||
template.edited.set(this);
|
||||
//template.edited.set(this);
|
||||
Session.set(PREFIX + "editedUser", this._id);
|
||||
Session.set(PREFIX + 'displayNewUser', false); //Ensure the new measure editor is closed.
|
||||
template.parentTemplate().$('.newUserButton').removeClass('active');
|
||||
},
|
||||
"click .userRemove": function(event, template) {
|
||||
let _this = this;
|
||||
@@ -40,48 +107,6 @@ Template.User.events({
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
"click .editorCancel": function(event, template) {
|
||||
template.edited.set(undefined);
|
||||
},
|
||||
"click .editorApply": function(event, template) {
|
||||
let username = template.$("input[name='username']").val().trim();
|
||||
let email = template.$("input[name='email']").val().trim();
|
||||
let roleSpans = template.$(".roles > span");
|
||||
let roles = [];
|
||||
|
||||
for(let i = 0; i < roleSpans.length; i++) {
|
||||
if($(roleSpans[i]).hasClass("selected")) {
|
||||
roles.push($(roleSpans[i]).text());
|
||||
}
|
||||
}
|
||||
|
||||
//Basic validation.
|
||||
if(username && username.length > 0 && email && email.length > 0) {
|
||||
let emails = _.clone(this.emails);
|
||||
|
||||
if(!emails || emails.length == 0) {
|
||||
emails = [{address: email, verified: true}];
|
||||
}
|
||||
else {
|
||||
emails[0].address = email;
|
||||
emails[0].verified = true;
|
||||
}
|
||||
|
||||
Meteor.call("updateUser", {_id: this._id, username: username, emails: emails, roles: roles}, function(error, result) {
|
||||
if(error) {
|
||||
sAlert.error(error);
|
||||
}
|
||||
else {
|
||||
sAlert.success("User updated.");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
template.edited.set(undefined);
|
||||
},
|
||||
"click .role": function(event, template) {
|
||||
$(event.target).toggleClass("selected");
|
||||
}
|
||||
});
|
||||
Template.User.helpers({
|
||||
@@ -89,7 +114,15 @@ Template.User.helpers({
|
||||
return this.emails && this.emails.length > 0 ? this.emails[0].address : "";
|
||||
},
|
||||
editing: function() {
|
||||
return Template.instance().edited.get() == this;
|
||||
let editedUser = Session.get(PREFIX + "editedUser");
|
||||
|
||||
return editedUser == this._id;
|
||||
}
|
||||
});
|
||||
|
||||
Template.UserEditor.helpers({
|
||||
email: function() {
|
||||
return this.emails && this.emails.length > 0 ? this.emails[0].address : "";
|
||||
},
|
||||
allRoles: function() {
|
||||
return Meteor.collections.UserRoles.find();
|
||||
@@ -97,7 +130,56 @@ Template.User.helpers({
|
||||
getRoleState: function(role) {
|
||||
let user = Template.parentData(1);
|
||||
|
||||
return user.roles.includes(role.name) ? "selected" : "";
|
||||
return !user.isNew && user.roles.includes(role.name) ? "selected" : "";
|
||||
}
|
||||
});
|
||||
Template.UserEditor.events({
|
||||
"click .editorCancel": function(event, template) {
|
||||
Session.set(PREFIX + "editedUser", undefined);
|
||||
Session.set(PREFIX + 'displayNewUser', false);
|
||||
template.parentTemplate().$('.newUserButton').removeClass('active');
|
||||
},
|
||||
"click .editorApply": function(event, template) {
|
||||
let user = {};
|
||||
let roles = [];
|
||||
|
||||
user.username = template.$('input[name="username"]').val();
|
||||
user.email = template.$('input[name="email"]').val();
|
||||
|
||||
let roleSpans = template.$('.role.selected');
|
||||
for(let i = 0; i < roleSpans.length; i++) {
|
||||
roles.push($(roleSpans[i]).text());
|
||||
}
|
||||
|
||||
user.roles = roles;
|
||||
|
||||
if(Session.get(PREFIX + 'displayNewUser')) {
|
||||
Meteor.call('insertUser', user, function(error, result) {
|
||||
if(error) {
|
||||
sAlert.error(error);
|
||||
}
|
||||
else {
|
||||
sAlert.success("User created.");
|
||||
Session.set(PREFIX + 'displayNewUser', false);
|
||||
template.parentTemplate().$('.newUserButton').removeClass('active');
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
user._id = this._id;
|
||||
Meteor.call("updateUser", user, function(error, result) {
|
||||
if(error) sAlert.error(error);
|
||||
else {
|
||||
sAlert.success("User updated.");
|
||||
Session.set(PREFIX + "editedUser", undefined);
|
||||
template.parentTemplate().$('.newUserButton').removeClass('active');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
},
|
||||
"click .role": function(event, template) {
|
||||
$(event.target).toggleClass("selected");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -138,44 +220,4 @@ Template.UserSearch.helpers({
|
||||
|
||||
return (searchFields && searchFields[this.columnName]) ? searchFields[this.columnName] : '';
|
||||
}
|
||||
});
|
||||
|
||||
Template.UserInsert.onRendered(function() {
|
||||
this.$('form[name="insert"]').validator();
|
||||
});
|
||||
Template.UserInsert.events({
|
||||
'click input[type="submit"]': function(event, template) {
|
||||
event.preventDefault();
|
||||
template.$('form[name="insert"]').data('bs.validator').validate(function(isValid) {
|
||||
if(isValid) {
|
||||
let user = {};
|
||||
let roles = [];
|
||||
|
||||
user.username = template.$('input[name="username"]').val();
|
||||
user.email = template.$('input[name="email"]').val();
|
||||
|
||||
let roleSpans = template.$('.role.selected');
|
||||
for(let i = 0; i < roleSpans.length; i++) {
|
||||
roles.push($(roleSpans[i]).text());
|
||||
}
|
||||
|
||||
Meteor.call('insertUser', user, roles, function(error, result) {
|
||||
if(error) {
|
||||
sAlert.error(error);
|
||||
}
|
||||
else {
|
||||
sAlert.success("User created.");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
"click .role": function(event, template) {
|
||||
$(event.target).toggleClass("selected");
|
||||
}
|
||||
});
|
||||
Template.UserInsert.helpers({
|
||||
allRoles: function() {
|
||||
return Meteor.collections.UserRoles.find();
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user