diff --git a/README.md b/README.md
index a36d533..daf584c 100644
--- a/README.md
+++ b/README.md
@@ -13,3 +13,10 @@ mongodump -h localhost --port 3001 -d meteor
mongorestore -h localhost --port 3001 -d meteor dump/meteor
````
+## FAQ
+### Set user as admin
+````
+$ meteor shell
+Roles.addUsersToRoles(Meteor.users.findOne({username: "myusername"}),"admin")
+````
+
diff --git a/client/templates/header.html b/client/templates/header.html
index 43a5ccd..d5576f4 100644
--- a/client/templates/header.html
+++ b/client/templates/header.html
@@ -29,9 +29,6 @@
Transport
-
- Teams
-
Map
@@ -71,3 +68,12 @@
+
+
+ teams
+ transports
+
+ {{#if isInRole 'admin'}}
+ Settings
+ {{/if}}
+
diff --git a/client/templates/helpers/contains.js b/client/templates/helpers/contains.js
new file mode 100644
index 0000000..2e3d287
--- /dev/null
+++ b/client/templates/helpers/contains.js
@@ -0,0 +1,7 @@
+UI.registerHelper('contains', function(value,list,options) {
+ if(_.contains(list, value)) {
+ return this;
+ } else {
+ return null;
+ }
+});
diff --git a/client/templates/pages/settings/index.html b/client/templates/pages/settings/index.html
new file mode 100644
index 0000000..b69a8a1
--- /dev/null
+++ b/client/templates/pages/settings/index.html
@@ -0,0 +1,30 @@
+
+ Settings
+ {{#if isInRole 'admin'}}
+ Permissions
+
+ {{/if}}
+
+
+
diff --git a/client/templates/pages/settings/index.js b/client/templates/pages/settings/index.js
new file mode 100644
index 0000000..07ffe04
--- /dev/null
+++ b/client/templates/pages/settings/index.js
@@ -0,0 +1,27 @@
+Template.settingsPage.helpers({
+ "roles": function () {
+ return Roles.getAllRoles();
+ },
+ "users": function() {
+ return Meteor.users.find({}, {fields: {_id: 1, username: 1, roles:1}});
+ }
+})
+Template.settingsPage.events({
+ "change .permission-toggle": function (event, template) {
+ if(event.target.checked) {
+ Meteor.call("addUserToRole", $(event.target).attr("userId"), $(event.target).attr("role"), function(error,data) {
+ if(error) {
+ Flash.danger(error);
+ event.target.checked = !event.target.checked;
+ }
+ });
+ } else {
+ Meteor.call("remUserFromRole", $(event.target).attr("userId"), $(event.target).attr("role"), function(error,data) {
+ if(error) {
+ Flash.danger(error);
+ event.target.checked = !event.target.checked;
+ }
+ });
+ }
+ }
+})
diff --git a/lib/collections/roles.js b/lib/collections/roles.js
new file mode 100644
index 0000000..cafe47f
--- /dev/null
+++ b/lib/collections/roles.js
@@ -0,0 +1,23 @@
+if(Meteor.isServer && (Roles.getAllRoles().fetch().length !== Meteor.settings.roles.length)) {
+ Meteor.startup(function () {
+ Meteor.roles.remove({});
+ _.each(Meteor.settings.roles,
+ function(role) {
+ Roles.createRole(role);
+ }
+ );
+ });
+}
+
+Meteor.methods({
+ "addUserToRole": function (user_id, role) {
+ validate.authorized(Meteor.user(), "admin");
+ var user = Meteor.users.findOne(user_id);
+ Roles.addUsersToRoles(user, role)
+ },
+ "remUserFromRole": function (user_id, role) {
+ validate.authorized(Meteor.user(), "admin");
+ var user = Meteor.users.findOne(user_id);
+ Roles.removeUsersFromRoles(user,role)
+ }
+})
diff --git a/lib/helpers/validate.js b/lib/helpers/validate.js
index aa0e257..e875b67 100644
--- a/lib/helpers/validate.js
+++ b/lib/helpers/validate.js
@@ -66,5 +66,11 @@ validate = {
if ( Object.prototype.toString.call(d) !== "[object Date]" )
return false;
return !isNaN(d.getTime());
+ },
+ authorized: function(user,required_permission) {
+ if (Roles.userIsInRole(user, required_permission)) {
+ return true;
+ }
+ throw new Meteor.Error(403, "Not authorized!");
}
}
diff --git a/lib/router.js b/lib/router.js
index 8ab5a1e..6b5c908 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -27,19 +27,11 @@ Router.route('/scan/bulk', {name: 'bulkPage'});
Router.route('/scan', {name: 'scanPage'});
Router.route('/transports/add', {name: 'addTransportPage'})
-Router.route('/transports', {
- name: 'transportsPage',
- waitOn: function () {
- return Meteor.subscribe('transports');
- }
-});
+Router.route('/transports', {name: 'transportsPage'});
Router.route('/map', {name: 'mapPage'});
Router.route('/generate', {name: 'generatePage'});
Router.route('/teams/add', {name: 'addTeamPage'})
-Router.route('/teams', {
- name: 'teamsPage',
- waitOn: function () {
- return Meteor.subscribe('teams');
- }
-});
+Router.route('/teams', {name: 'teamsPage'});
+
+Router.route('/settings', {name: 'settingsPage'});
diff --git a/private/settings.json b/private/settings.json
index 3289fa3..c829ad4 100644
--- a/private/settings.json
+++ b/private/settings.json
@@ -4,6 +4,7 @@
"map_file": "lagerplan.png",
"ean_prefix": "202"
},
+ "roles": ["admin","item-add","item-remove","item-relocate","transport-add","transport-remove","team-add","team-remove"],
"preseed": {
"items": {
"amount": 0
diff --git a/server/publications.js b/server/publications.js
index 9a93a8e..e7cf10e 100644
--- a/server/publications.js
+++ b/server/publications.js
@@ -11,10 +11,12 @@ Meteor.publish('teams', function() {
return Teams.find();
});
Meteor.publish("userData", function () {
- if (this.userId) {
- return Meteor.users.find({_id: this.userId},
- {fields: {'scans': 1}});
+ if (Roles.userIsInRole(this.userId, "admin")) {
+ return Meteor.users.find({},{fields: {_id:1, username: 1, roles: 1}});
} else {
this.ready();
}
});
+Meteor.publish(null, function (){
+ return Meteor.roles.find({})
+});