diff --git a/app/controllers/me.js b/app/controllers/me.js new file mode 100644 index 0000000..eac3232 --- /dev/null +++ b/app/controllers/me.js @@ -0,0 +1,16 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + isAdmin: function() { + var level = this.get('model.adminLevel'); + return level >= 1; + }.property('model'), + + actions: { + changeUser() { + // save the changes + var user = this.get('model'); + user.save(); + } + } +}); diff --git a/app/controllers/project/delete.js b/app/controllers/project/delete.js index dbc5cc7..212648b 100644 --- a/app/controllers/project/delete.js +++ b/app/controllers/project/delete.js @@ -11,35 +11,11 @@ export default Ember.Controller.extend({ }, confirmDelete() { - // get current user object - var userId = this.get('sessionUser.user.id'); - var user = this.store.peekRecord('user', userId); - - // get the project + // delete the project var project = this.get('model'); - let projectId = project.get('id'); - - // delete the project and remove from user projects - var visualizations = project.get('visualizations'); - visualizations.forEach(function(visualization) { - // destroy all plots - var plots = visualization.get('plots'); - plots.forEach(function(plot) { - plot.destroyRecord(); - }); - - visualization.destroyRecord(); - }); - project.destroyRecord(); - // save the changes to project - var controller = this; - - user.get('projects').removeObject(projectId); - user.save().then(function() { - controller.transitionToRoute('/projects'); - }); + this.transitionToRoute('/projects'); } } }); diff --git a/app/controllers/project/index.js b/app/controllers/project/index.js index eb33367..e949d77 100644 --- a/app/controllers/project/index.js +++ b/app/controllers/project/index.js @@ -10,13 +10,10 @@ export default Ember.Controller.extend({ // create the visualization var visualization = this.store.createRecord('visualization', { name: 'Visualization', project: projectId }); - // the visualization must be added to the project before the project is saved, otherwise ember will set the projectId to null! + // this change will not be saved, but it is nessecary otherwise ember will omit the project's id in the post request project.get('visualizations').pushObject(visualization); - // save the visualization and project - visualization.save().then(function() { - project.save(); - }); + visualization.save(); } } }); diff --git a/app/controllers/project/new.js b/app/controllers/project/new.js index 1834a47..c786f7e 100644 --- a/app/controllers/project/new.js +++ b/app/controllers/project/new.js @@ -5,9 +5,8 @@ export default Ember.Controller.extend({ actions: { newProject() { - // get current user object - var userId = this.get('sessionUser.user.id'); - var user = this.store.peekRecord('user', userId); + // get current user + var user = this.get('sessionUser.user'); // create new project from properties var properties = this.getProperties('name'); @@ -16,14 +15,8 @@ export default Ember.Controller.extend({ var project = this.store.createRecord('project', properties); var controller = this; - // save the project and user project.save().then(function() { - // add the project to the user - user.get('projects').pushObject(project); - - user.save().then(function() { - controller.transitionToRoute('/projects'); - }); + controller.transitionToRoute('/projects'); }); }, diff --git a/app/controllers/user/delete.js b/app/controllers/user/delete.js new file mode 100644 index 0000000..ef1e8a0 --- /dev/null +++ b/app/controllers/user/delete.js @@ -0,0 +1,19 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + sessionUser: Ember.inject.service('session-user'), + + actions: { + cancelDelete() { + this.transitionToRoute('/user/'); + }, + + confirmDelete() { + // delete all projects + var user = this.get('model'); + user.destroyRecord(); + + this.transitionToRoute('/user/'); + } + } +}); diff --git a/app/controllers/user/edit.js b/app/controllers/user/edit.js index d66f684..e47d437 100644 --- a/app/controllers/user/edit.js +++ b/app/controllers/user/edit.js @@ -2,10 +2,18 @@ import Ember from 'ember'; export default Ember.Controller.extend({ actions: { - changeUser() { + saveEdit() { // save the changes var user = this.get('model'); - user.save(); + var controller = this; + + user.save().then(function() { + controller.transitionToRoute('/user/'); + }); + }, + + cancelEdit() { + this.transitionToRoute('/user/'); } } }); diff --git a/app/controllers/user/index.js b/app/controllers/user/index.js new file mode 100644 index 0000000..0b0c945 --- /dev/null +++ b/app/controllers/user/index.js @@ -0,0 +1,17 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + users: function() { + var filteredUsers = this.get('model'); + filteredUsers.forEach(function(user) { + // catch undefined user + if (user) { + if (user.get('id') === 'me') { + filteredUsers.removeObject(user); + } + } + }); + + return filteredUsers; + }.property('model.@each') +}); diff --git a/app/controllers/user/new.js b/app/controllers/user/new.js new file mode 100644 index 0000000..3da5896 --- /dev/null +++ b/app/controllers/user/new.js @@ -0,0 +1,21 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + actions: { + newUser() { + // create new user from properties + var properties = this.getProperties('username', 'password'); + + var user = this.store.createRecord('user', properties); + var controller = this; + + user.save().then(function() { + controller.transitionToRoute('/user'); + }); + }, + + cancelNewUser() { + this.transitionToRoute('/user'); + } + } +}); diff --git a/app/controllers/visualization/delete.js b/app/controllers/visualization/delete.js index 37c2c9b..14db97b 100644 --- a/app/controllers/visualization/delete.js +++ b/app/controllers/visualization/delete.js @@ -10,27 +10,12 @@ export default Ember.Controller.extend({ confirmDelete() { // get the objects - var visualization = this.get('model'); - let visualizationId = this.get('model.id'); - var projectId = this.get('model.project.id'); - var project = this.store.peekRecord('project', projectId); - - // destroy all plots - var plots = visualization.get('plots'); - plots.forEach(function(plot) { - plot.destroyRecord(); - }); + var visualization = this.get('model'); visualization.destroyRecord(); - // delete the visualization and remove from the project - var controller = this; - - project.get('visualizations').removeObject(visualizationId); - project.save().then(function() { - controller.transitionToRoute('/project/' + projectId); - }); + this.transitionToRoute('/project/' + projectId); } } }); diff --git a/app/models/user.js b/app/models/user.js index d343d10..bc61b02 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -4,6 +4,7 @@ import { hasMany } from 'ember-data/relationships'; export default Model.extend({ username: attr('string'), + password: attr('string'), adminLevel: attr('number'), projects: hasMany('project', { async: true }), mail: attr('string') diff --git a/app/router.js b/app/router.js index 8f2875d..03ad117 100644 --- a/app/router.js +++ b/app/router.js @@ -7,6 +7,7 @@ const Router = Ember.Router.extend({ Router.map(function() { this.route('login'); + this.route('logout'); this.route('projects'); this.route('project', function() { @@ -16,9 +17,7 @@ Router.map(function() { this.route('delete', { path: '/delete/:projectid' }); }); - this.route('user', function() { - this.route('edit'); - }); + this.route('me'); this.route('visualization', function() { this.route('index', { path: '/:visualizationid' }); @@ -27,8 +26,13 @@ Router.map(function() { this.route('delete', { path: '/delete/:visualizationid' }); }); + this.route('user', function() { + this.route('edit', { path: '/edit/:userid' }); + this.route('new'); + this.route('delete', { path: '/delete/:userid' }); + }); + this.route('404', { path: '/*path' }); - this.route('logout'); }); export default Router; diff --git a/app/routes/me.js b/app/routes/me.js new file mode 100644 index 0000000..b8e23aa --- /dev/null +++ b/app/routes/me.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model() { + // get session user + return this.store.findRecord('user', 'me'); + } +}); diff --git a/app/routes/user/delete.js b/app/routes/user/delete.js new file mode 100644 index 0000000..7fa7c6a --- /dev/null +++ b/app/routes/user/delete.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model(params) { + return this.store.findRecord('user', params.userid); + } +}); diff --git a/app/routes/user/edit.js b/app/routes/user/edit.js index 9def44d..7fa7c6a 100644 --- a/app/routes/user/edit.js +++ b/app/routes/user/edit.js @@ -2,11 +2,7 @@ import Ember from 'ember'; import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { - sessionUser: Ember.inject.service('session-user'), - - model() { - // get session user - var userId = this.get('sessionUser.user.id'); - return this.store.findRecord('user', userId); + model(params) { + return this.store.findRecord('user', params.userid); } }); diff --git a/app/routes/user/index.js b/app/routes/user/index.js new file mode 100644 index 0000000..f4885a9 --- /dev/null +++ b/app/routes/user/index.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model() { + return this.store.findAll('user'); + } +}); diff --git a/app/routes/user/new.js b/app/routes/user/new.js new file mode 100644 index 0000000..30e4e30 --- /dev/null +++ b/app/routes/user/new.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; + +export default Ember.Route.extend(AuthenticatedRouteMixin, { +}); diff --git a/app/templates/application.hbs b/app/templates/application.hbs index 4621e6e..457586e 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -9,7 +9,7 @@ diff --git a/app/templates/me.hbs b/app/templates/me.hbs new file mode 100644 index 0000000..eeb3fb9 --- /dev/null +++ b/app/templates/me.hbs @@ -0,0 +1,20 @@ +

Preferences

+ +
+

+ + {{input id='username' value=model.username readonly=true}} +

+

+ + {{input id='mail' value=model.mail placeholder='Enter e-mail'}} +

+ + +
+ +{{#if isAdmin}} +
+ {{#link-to 'user'}}Users{{/link-to}} +
+{{/if}} diff --git a/app/templates/user/delete.hbs b/app/templates/user/delete.hbs new file mode 100644 index 0000000..b8173d5 --- /dev/null +++ b/app/templates/user/delete.hbs @@ -0,0 +1,10 @@ +

Delete User

+ +

+ Are you sure you want to delete the user "{{model.username}}"? +
+ This will also delete all projects belonging to this user! +

+ + + diff --git a/app/templates/user/edit.hbs b/app/templates/user/edit.hbs index 55622f9..b44372f 100644 --- a/app/templates/user/edit.hbs +++ b/app/templates/user/edit.hbs @@ -1,14 +1,14 @@ -

Preferences

+

Edit

-
+

- {{input id='username' value=model.username readonly=true}} + {{input id='username' value=model.username}}

{{input id='mail' value=model.mail placeholder='Enter e-mail'}}

- +
diff --git a/app/templates/user/index.hbs b/app/templates/user/index.hbs new file mode 100644 index 0000000..9a7c1cb --- /dev/null +++ b/app/templates/user/index.hbs @@ -0,0 +1,11 @@ +

Users

+ +{{#link-to 'user.new'}}New user{{/link-to}} + +
+ +
diff --git a/app/templates/user/new.hbs b/app/templates/user/new.hbs new file mode 100644 index 0000000..0e8598b --- /dev/null +++ b/app/templates/user/new.hbs @@ -0,0 +1,21 @@ +

New user

+ +
+
+

+ + {{input id='username' placeholder='Enter username' value=username}} +

+

+ + {{input id='password' placeholder='Enter password' type='password' value=password}} +

+ + + + + {{#if errorMessage}} +

{{errorMessage.message}}

+ {{/if}} +
+
diff --git a/package.json b/package.json index 7c3e27c..5e45d0c 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "ember-export-application-global": "^1.0.5", "ember-load-initializers": "^0.5.1", "ember-resolver": "^2.0.3", - "loader.js": "^4.0.1", - "ember-simple-auth": "^1.1.0" + "ember-simple-auth": "^1.1.0", + "loader.js": "^4.0.1" } } diff --git a/tests/unit/controllers/users/delete-test.js b/tests/unit/controllers/users/delete-test.js new file mode 100644 index 0000000..68f802f --- /dev/null +++ b/tests/unit/controllers/users/delete-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:users/delete', 'Unit | Controller | users/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/users/edit-test.js b/tests/unit/controllers/users/edit-test.js new file mode 100644 index 0000000..debcf46 --- /dev/null +++ b/tests/unit/controllers/users/edit-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:users/edit', 'Unit | Controller | users/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/users/index-test.js b/tests/unit/controllers/users/index-test.js new file mode 100644 index 0000000..2395bc6 --- /dev/null +++ b/tests/unit/controllers/users/index-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:users/index', 'Unit | Controller | users/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/controllers/users/new-test.js b/tests/unit/controllers/users/new-test.js new file mode 100644 index 0000000..113f11e --- /dev/null +++ b/tests/unit/controllers/users/new-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:users/new', 'Unit | Controller | users/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/tests/unit/routes/me-test.js b/tests/unit/routes/me-test.js new file mode 100644 index 0000000..9719ac5 --- /dev/null +++ b/tests/unit/routes/me-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:me', 'Unit | Route | me', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/user/delete-test.js b/tests/unit/routes/user/delete-test.js new file mode 100644 index 0000000..4be7323 --- /dev/null +++ b/tests/unit/routes/user/delete-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:user/delete', 'Unit | Route | user/delete', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/user/index-test.js b/tests/unit/routes/user/index-test.js new file mode 100644 index 0000000..fe27105 --- /dev/null +++ b/tests/unit/routes/user/index-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:user/index', 'Unit | Route | user/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/tests/unit/routes/user/new-test.js b/tests/unit/routes/user/new-test.js new file mode 100644 index 0000000..5032fa8 --- /dev/null +++ b/tests/unit/routes/user/new-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:user/new', 'Unit | Route | user/new', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/todo.md b/todo.md index b83c6c3..020a1c8 100644 --- a/todo.md +++ b/todo.md @@ -2,4 +2,4 @@ - Change password - Create/register user - User management - - Rename preferences into account + - Don't log out on unauthorized access (admin level lower than required)