From 482bfddf1226e575c742bf47493b3f84ecd02899 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Fri, 25 Sep 2015 14:46:49 -0700
Subject: [PATCH 01/14] Track changes

---
 .../show/measurements-table-row/component.js     | 16 ++++++++++++++--
 .../show/measurements-table-row/template.hbs     |  6 ++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/app/pods/protected/strains/show/measurements-table-row/component.js b/app/pods/protected/strains/show/measurements-table-row/component.js
index 252e6e3..39216ec 100644
--- a/app/pods/protected/strains/show/measurements-table-row/component.js
+++ b/app/pods/protected/strains/show/measurements-table-row/component.js
@@ -4,6 +4,16 @@ export default Ember.Component.extend({
   tagName: 'tr',
   isEditing: false,
 
+  oldCharacteristicId: function() {
+    let json = this.get('row').toJSON();
+    return json.characteristic;
+  }.property(),
+
+  rowChanged: Ember.computed('row.notes', 'row.value', 'row.characteristic.id', function() {
+    return this.get('row.hasDirtyAttributes') ||
+      this.get('oldCharacteristicId') !== this.get('row.characteristic.id');
+  }),
+
   actions: {
     edit: function() {
       // The parent table fetches all of the characteristics ahead of time
@@ -13,8 +23,10 @@ export default Ember.Component.extend({
 
     save: function() {
       this.toggleProperty('isEditing');
-      this.get('row').save();
+      if (this.get('rowChanged')) {
+        this.get('row').save();
+      }
     },
-    
+
   },
 });
diff --git a/app/pods/protected/strains/show/measurements-table-row/template.hbs b/app/pods/protected/strains/show/measurements-table-row/template.hbs
index bdf8566..fd0bf3d 100644
--- a/app/pods/protected/strains/show/measurements-table-row/template.hbs
+++ b/app/pods/protected/strains/show/measurements-table-row/template.hbs
@@ -16,9 +16,15 @@
   </td>
   {{#if canEdit}}
     <td>
+      {{#if rowChanged}}
       <button class="button-red smaller" {{action 'save'}}>
         Save
       </button>
+      {{else}}
+      <button class="button-gray smaller" {{action 'save'}}>
+        Cancel
+      </button>
+      {{/if}}
     </td>
   {{/if}}
 {{else}}

From 34aa59caf30ae7edf04186e15273841314da937a Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Fri, 25 Sep 2015 15:37:23 -0700
Subject: [PATCH 02/14] Delete measurement

---
 .../strains/show/measurements-table-row/component.js         | 4 ++++
 .../strains/show/measurements-table-row/template.hbs         | 5 ++++-
 .../protected/strains/show/measurements-table/template.hbs   | 4 ++--
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/app/pods/protected/strains/show/measurements-table-row/component.js b/app/pods/protected/strains/show/measurements-table-row/component.js
index 39216ec..a527572 100644
--- a/app/pods/protected/strains/show/measurements-table-row/component.js
+++ b/app/pods/protected/strains/show/measurements-table-row/component.js
@@ -28,5 +28,9 @@ export default Ember.Component.extend({
       }
     },
 
+    delete: function() {
+      this.get('row').destroyRecord();
+    }
+
   },
 });
diff --git a/app/pods/protected/strains/show/measurements-table-row/template.hbs b/app/pods/protected/strains/show/measurements-table-row/template.hbs
index fd0bf3d..6b99871 100644
--- a/app/pods/protected/strains/show/measurements-table-row/template.hbs
+++ b/app/pods/protected/strains/show/measurements-table-row/template.hbs
@@ -17,7 +17,7 @@
   {{#if canEdit}}
     <td>
       {{#if rowChanged}}
-      <button class="button-red smaller" {{action 'save'}}>
+      <button class="button-green smaller" {{action 'save'}}>
         Save
       </button>
       {{else}}
@@ -44,6 +44,9 @@
       <button class="button-gray smaller" {{action 'edit'}}>
         Edit
       </button>
+      <button class="button-red smaller" {{action 'delete'}}>
+        Delete
+      </button>
     </td>
   {{/if}}
 {{/if}}
diff --git a/app/pods/protected/strains/show/measurements-table/template.hbs b/app/pods/protected/strains/show/measurements-table/template.hbs
index 3f14ca7..ced8028 100644
--- a/app/pods/protected/strains/show/measurements-table/template.hbs
+++ b/app/pods/protected/strains/show/measurements-table/template.hbs
@@ -4,8 +4,8 @@
     {{#if canEdit}}
       <col span="1" style="width:40%">
       <col span="1" style="width:20%">
-      <col span="1" style="width:30%">
-      <col span="1" style="width:10%">
+      <col span="1" style="width:20%">
+      <col span="1" style="width:20%">
     {{else}}
       <col span="1" style="width:40%">
       <col span="1" style="width:30%">

From da27b42f76bf500ddcea1cb3dfd484fd111b1e72 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Tue, 29 Sep 2015 15:55:34 -0700
Subject: [PATCH 03/14] Add characteristic/measurement to strain

---
 app/pods/protected/strains/edit/route.js           |  1 +
 app/pods/protected/strains/edit/template.hbs       |  1 +
 .../strains/show/measurements-table/component.js   | 14 +++++++++++++-
 .../strains/show/measurements-table/template.hbs   |  8 ++++++++
 app/pods/protected/strains/show/template.hbs       |  1 +
 .../protected/strains/strain-form/template.hbs     |  1 +
 6 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/app/pods/protected/strains/edit/route.js b/app/pods/protected/strains/edit/route.js
index 94a7710..6bb9b2f 100644
--- a/app/pods/protected/strains/edit/route.js
+++ b/app/pods/protected/strains/edit/route.js
@@ -17,6 +17,7 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
 
   setupController: function(controller, models) {
     controller.setProperties(models);
+    controller.set('metaData', this.store.metadataFor('strain'));
   },
 
 });
diff --git a/app/pods/protected/strains/edit/template.hbs b/app/pods/protected/strains/edit/template.hbs
index d9c4d43..a4885d6 100644
--- a/app/pods/protected/strains/edit/template.hbs
+++ b/app/pods/protected/strains/edit/template.hbs
@@ -2,6 +2,7 @@
   protected/strains/strain-form
   strain=strain
   species=species
+  canAdd=metaData.canAdd
   save="save"
   cancel="cancel"
 }}
diff --git a/app/pods/protected/strains/show/measurements-table/component.js b/app/pods/protected/strains/show/measurements-table/component.js
index af846d0..3fe5de5 100644
--- a/app/pods/protected/strains/show/measurements-table/component.js
+++ b/app/pods/protected/strains/show/measurements-table/component.js
@@ -11,7 +11,19 @@ export default Ember.Component.extend({
     }
   }.on('didInsertElement'),
 
-  sortParams: ['characteristicTypeName', 'sortOrder', 'characteristicName'],
+  sortParams: ['characteristic.characteristicTypeName', 'characteristic.sortOrder', 'characteristic.characteristicName'],
   sortedMeasurements: Ember.computed.sort('model.measurements', 'sortParams'),
 
+  actions: {
+    addCharacteristic: function() {
+      const c = this.store.createRecord('characteristic', {
+        sortOrder: -999
+      })
+      const m = this.store.createRecord('measurement', {
+        characteristic: c
+      });
+      this.get('model.measurements').addObject(m);
+    },
+  },
+
 });
diff --git a/app/pods/protected/strains/show/measurements-table/template.hbs b/app/pods/protected/strains/show/measurements-table/template.hbs
index ced8028..2f30a9e 100644
--- a/app/pods/protected/strains/show/measurements-table/template.hbs
+++ b/app/pods/protected/strains/show/measurements-table/template.hbs
@@ -1,3 +1,11 @@
+{{#if canAdd}}
+<br>
+<button class="button-green smaller" {{action "addCharacteristic"}}>
+  Add characteristic
+</button>
+<br><br>
+{{/if}}
+
 {{#if measurementsPresent}}
 <table class="flakes-table">
   <colgroup>
diff --git a/app/pods/protected/strains/show/template.hbs b/app/pods/protected/strains/show/template.hbs
index dbe09fe..e16634a 100644
--- a/app/pods/protected/strains/show/template.hbs
+++ b/app/pods/protected/strains/show/template.hbs
@@ -77,6 +77,7 @@
             protected/strains/show/measurements-table
             model=model
             canEdit=false
+            canAdd=false
           }}
         </dd>
       </dl>
diff --git a/app/pods/protected/strains/strain-form/template.hbs b/app/pods/protected/strains/strain-form/template.hbs
index 8260411..cf33026 100644
--- a/app/pods/protected/strains/strain-form/template.hbs
+++ b/app/pods/protected/strains/strain-form/template.hbs
@@ -54,6 +54,7 @@
       protected/strains/show/measurements-table
       model=strain
       canEdit=strain.canEdit
+      canAdd=canAdd
     }}
   </div>
   <br>

From 69dbdcaa8941b934b37f33d4e7e312e59ecb76af Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Thu, 1 Oct 2015 06:46:51 -0700
Subject: [PATCH 04/14] Adapter error deprecated.

---
 app/pods/application/adapter.js | 18 ------------------
 1 file changed, 18 deletions(-)

diff --git a/app/pods/application/adapter.js b/app/pods/application/adapter.js
index 0a943ec..184060e 100644
--- a/app/pods/application/adapter.js
+++ b/app/pods/application/adapter.js
@@ -12,24 +12,6 @@ export default DS.RESTAdapter.extend({
 
   coalesceFindRequests: true,
 
-  ajaxError: function(jqXHR) {
-    // http://stackoverflow.com/a/24027443
-    var error = this._super(jqXHR);
-    if (jqXHR && jqXHR.status === 422) {
-      var response = Ember.$.parseJSON(jqXHR.responseText),
-        errors = {};
-      if (response.errors !== undefined) {
-        var jsonErrors = response.errors;
-        Ember.EnumerableUtils.forEach(Object.keys(jsonErrors), function(key) {
-          errors[Ember.String.camelize(key)] = jsonErrors[key];
-        });
-      }
-      return new DS.InvalidError(errors);
-    } else {
-      return error;
-    }
-  },
-
   shouldReloadAll: function() {
     return true;
   },

From f2f16e15a44782792cc63a02f9793f7672943c98 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Thu, 1 Oct 2015 07:13:36 -0700
Subject: [PATCH 05/14] Edit user

---
 app/pods/protected/users/edit/controller.js   | 32 +++++++++++++++++++
 app/pods/protected/users/edit/route.js        |  8 +++++
 app/pods/protected/users/edit/template.hbs    |  6 ++++
 .../protected/users/user-form/component.js    | 13 ++++++++
 .../protected/users/user-form/template.hbs    | 32 +++++++++++++++++++
 5 files changed, 91 insertions(+)
 create mode 100644 app/pods/protected/users/edit/controller.js
 create mode 100644 app/pods/protected/users/edit/route.js
 create mode 100644 app/pods/protected/users/edit/template.hbs
 create mode 100644 app/pods/protected/users/user-form/component.js
 create mode 100644 app/pods/protected/users/user-form/template.hbs

diff --git a/app/pods/protected/users/edit/controller.js b/app/pods/protected/users/edit/controller.js
new file mode 100644
index 0000000..903eefd
--- /dev/null
+++ b/app/pods/protected/users/edit/controller.js
@@ -0,0 +1,32 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  actions: {
+    save: function() {
+      let user = this.get('model');
+
+      if (user.get('hasDirtyAttributes')) {
+        user.save().then((user) => {
+          this.get('flashMessages').clearMessages();
+          this.transitionToRoute('protected.users.show', user);
+        }, (err) => {
+          err.errors.forEach((error) => {
+            this.get('flashMessages').error(error.detail);
+          });
+        });
+      } else {
+        this.transitionToRoute('protected.users.show', user);
+      }
+    },
+
+    cancel: function() {
+      let user = this.get('model');
+
+      user.get('errors').clear();
+      user.rollbackAttributes();
+
+      this.transitionToRoute('protected.users.show', user);
+    },
+
+  },
+});
diff --git a/app/pods/protected/users/edit/route.js b/app/pods/protected/users/edit/route.js
new file mode 100644
index 0000000..bc22dc0
--- /dev/null
+++ b/app/pods/protected/users/edit/route.js
@@ -0,0 +1,8 @@
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+  model: function(params) {
+    return this.store.findRecord('user', params.user_id, { reload: true });
+  },
+
+});
diff --git a/app/pods/protected/users/edit/template.hbs b/app/pods/protected/users/edit/template.hbs
new file mode 100644
index 0000000..68d66b4
--- /dev/null
+++ b/app/pods/protected/users/edit/template.hbs
@@ -0,0 +1,6 @@
+{{
+  protected/users/user-form
+  user=model
+  save="save"
+  cancel="cancel"
+}}
diff --git a/app/pods/protected/users/user-form/component.js b/app/pods/protected/users/user-form/component.js
new file mode 100644
index 0000000..a53a469
--- /dev/null
+++ b/app/pods/protected/users/user-form/component.js
@@ -0,0 +1,13 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  actions: {
+    save: function() {
+      this.sendAction('save');
+    },
+
+    cancel: function() {
+      this.sendAction('cancel');
+    },
+  }
+});
diff --git a/app/pods/protected/users/user-form/template.hbs b/app/pods/protected/users/user-form/template.hbs
new file mode 100644
index 0000000..60c2d77
--- /dev/null
+++ b/app/pods/protected/users/user-form/template.hbs
@@ -0,0 +1,32 @@
+<form class="grid-form" {{action 'save' on='submit'}}>
+  <fieldset>
+    <legend><em>{{user.name}}</em></legend>
+    <div data-row-span="1">
+      <div data-field-span="1">
+        <label>Name</label>
+        {{input value=user.name}}
+      </div>
+    </div>
+    <div data-row-span="1">
+      <div data-field-span="1">
+        <label>Email</label>
+        {{input value=user.email}}
+      </div>
+    </div>
+    <div data-row-span="1">
+      <div data-field-span="1">
+        <label>Role</label>
+        {{user.role}}
+      </div>
+    </div>
+  </fieldset>
+  <br>
+  <a class="button-red smaller" {{action 'cancel'}}>
+    Cancel
+  </a>
+  {{#if user.hasDirtyAttributes}}
+    <button type="submit" class="button-green smaller">
+      Save
+    </button>
+  {{/if}}
+</form>

From 33ed70caaf1ade3e8e390f7274ed178eeab1ea74 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Thu, 1 Oct 2015 07:45:08 -0700
Subject: [PATCH 06/14] ember 1.13.7 & ember-data 1.13.13

---
 bower.json   | 4 ++--
 package.json | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/bower.json b/bower.json
index 48e0366..9efca06 100644
--- a/bower.json
+++ b/bower.json
@@ -2,10 +2,10 @@
   "name": "hymenobacterdotinfo",
   "dependencies": {
     "jquery": "~2.1.1",
-    "ember": "1.13.7",
+    "ember": "1.13.10",
     "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3",
     "ember-cli-test-loader": "ember-cli-test-loader#0.1.3",
-    "ember-data": "1.13.8",
+    "ember-data": "1.13.13",
     "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.5",
     "ember-qunit": "0.4.9",
     "ember-qunit-notifications": "0.0.7",
diff --git a/package.json b/package.json
index b08c892..9bd4ccd 100644
--- a/package.json
+++ b/package.json
@@ -37,7 +37,7 @@
     "ember-cli-release": "0.2.3",
     "ember-cli-sri": "^1.0.3",
     "ember-cli-uglify": "^1.2.0",
-    "ember-data": "1.13.8",
+    "ember-data": "1.13.13",
     "ember-disable-proxy-controllers": "^1.0.0",
     "ember-export-application-global": "^1.0.3",
     "ember-select-2": "1.3.0"

From 5be2888223c0c34b11d9b77b6863d1a94668d16d Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Sun, 4 Oct 2015 15:54:02 -0700
Subject: [PATCH 07/14] minor cleanup

---
 app/models/user.js                                              | 1 +
 app/pods/application/adapter.js                                 | 1 -
 app/pods/protected/strains/show/measurements-table/component.js | 2 +-
 app/pods/protected/users/show/template.hbs                      | 2 +-
 4 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/models/user.js b/app/models/user.js
index bb7c5fd..680a9f4 100644
--- a/app/models/user.js
+++ b/app/models/user.js
@@ -5,6 +5,7 @@ export default DS.Model.extend({
   password : DS.attr('string'),
   name     : DS.attr('string'),
   role     : DS.attr('string'),
+  canEdit  : DS.attr('boolean'),
   createdAt: DS.attr('date'),
   updatedAt: DS.attr('date'),
   deletedAt: DS.attr('date'),
diff --git a/app/pods/application/adapter.js b/app/pods/application/adapter.js
index 184060e..11498d0 100644
--- a/app/pods/application/adapter.js
+++ b/app/pods/application/adapter.js
@@ -1,5 +1,4 @@
 import DS from 'ember-data';
-import Ember from 'ember';
 
 export default DS.RESTAdapter.extend({
   namespace: function() {
diff --git a/app/pods/protected/strains/show/measurements-table/component.js b/app/pods/protected/strains/show/measurements-table/component.js
index 3fe5de5..8d8e31d 100644
--- a/app/pods/protected/strains/show/measurements-table/component.js
+++ b/app/pods/protected/strains/show/measurements-table/component.js
@@ -18,7 +18,7 @@ export default Ember.Component.extend({
     addCharacteristic: function() {
       const c = this.store.createRecord('characteristic', {
         sortOrder: -999
-      })
+      });
       const m = this.store.createRecord('measurement', {
         characteristic: c
       });
diff --git a/app/pods/protected/users/show/template.hbs b/app/pods/protected/users/show/template.hbs
index 32117c9..4f7fca9 100644
--- a/app/pods/protected/users/show/template.hbs
+++ b/app/pods/protected/users/show/template.hbs
@@ -43,7 +43,7 @@
 {{/link-to}}
 {{#if model.canEdit}}
   <br>
-  {{#link-to 'protected.user.edit' model.id class="button-gray smaller"}}
+  {{#link-to 'protected.users.edit' model.id class="button-gray smaller"}}
     Edit
   {{/link-to}}
 {{/if}}

From a1e4e03b8922abef5ed9deb405db21592eb73bb8 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Mon, 12 Oct 2015 10:20:17 -0700
Subject: [PATCH 08/14] Delete characteristic

---
 app/pods/components/delete-button/component.js      | 13 +++++++++++++
 app/pods/components/delete-button/template.hbs      |  1 +
 .../protected/characteristics/show/controller.js    | 11 +++++++++++
 .../protected/characteristics/show/template.hbs     |  2 ++
 4 files changed, 27 insertions(+)
 create mode 100644 app/pods/components/delete-button/component.js
 create mode 100644 app/pods/components/delete-button/template.hbs
 create mode 100644 app/pods/protected/characteristics/show/controller.js

diff --git a/app/pods/components/delete-button/component.js b/app/pods/components/delete-button/component.js
new file mode 100644
index 0000000..2ceca5b
--- /dev/null
+++ b/app/pods/components/delete-button/component.js
@@ -0,0 +1,13 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  tagName: 'button',
+  classNames: ["button-red", "smaller"],
+
+  click: function() {
+    if (window.confirm("Do you really want to delete this?")) {
+      this.attrs.delete();
+    }
+  },
+
+});
diff --git a/app/pods/components/delete-button/template.hbs b/app/pods/components/delete-button/template.hbs
new file mode 100644
index 0000000..4b2e04f
--- /dev/null
+++ b/app/pods/components/delete-button/template.hbs
@@ -0,0 +1 @@
+Delete
diff --git a/app/pods/protected/characteristics/show/controller.js b/app/pods/protected/characteristics/show/controller.js
new file mode 100644
index 0000000..cc45d06
--- /dev/null
+++ b/app/pods/protected/characteristics/show/controller.js
@@ -0,0 +1,11 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  actions: {
+    delete: function() {
+      this.get('model').destroyRecord()
+      this.transitionToRoute('protected.characteristics.index');
+    },
+  },
+
+});
diff --git a/app/pods/protected/characteristics/show/template.hbs b/app/pods/protected/characteristics/show/template.hbs
index de81623..010a8c5 100644
--- a/app/pods/protected/characteristics/show/template.hbs
+++ b/app/pods/protected/characteristics/show/template.hbs
@@ -26,6 +26,7 @@
         <dl class="span-2">
           <dt>Measurements</dt>
           <dd>
+            <p>To add/edit/remove a measurement, please visit the strain's page (links below)</p>
             {{protected/characteristics/show/measurements-table model=model}}
           </dd>
         </dl>
@@ -54,4 +55,5 @@
   {{#link-to 'protected.characteristics.edit' model.id class="button-gray smaller"}}
     Edit
   {{/link-to}}
+  {{delete-button delete=(action 'delete')}}
 {{/if}}

From bf8289436f0bd0288ac7c5006ffd734584d4d83f Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Mon, 12 Oct 2015 10:41:07 -0700
Subject: [PATCH 09/14] Delete species

---
 app/pods/protected/species/show/controller.js | 11 +++++++++++
 app/pods/protected/species/show/template.hbs  |  1 +
 2 files changed, 12 insertions(+)
 create mode 100644 app/pods/protected/species/show/controller.js

diff --git a/app/pods/protected/species/show/controller.js b/app/pods/protected/species/show/controller.js
new file mode 100644
index 0000000..cadc1f4
--- /dev/null
+++ b/app/pods/protected/species/show/controller.js
@@ -0,0 +1,11 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  actions: {
+    delete: function() {
+      this.get('model').destroyRecord();
+      this.transitionToRoute('protected.species.index');
+    },
+  },
+
+});
diff --git a/app/pods/protected/species/show/template.hbs b/app/pods/protected/species/show/template.hbs
index 059ab04..528b969 100644
--- a/app/pods/protected/species/show/template.hbs
+++ b/app/pods/protected/species/show/template.hbs
@@ -62,4 +62,5 @@
   {{#link-to 'protected.species.edit' model class="button-gray smaller"}}
     Edit
   {{/link-to}}
+  {{delete-button delete=(action 'delete')}}
 {{/if}}

From 56e7b088acbd583de76613fb1b4e07c7fe8d98bc Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Mon, 12 Oct 2015 10:46:13 -0700
Subject: [PATCH 10/14] Delete strains

---
 app/pods/protected/strains/show/controller.js | 11 +++++++++++
 app/pods/protected/strains/show/template.hbs  |  1 +
 2 files changed, 12 insertions(+)
 create mode 100644 app/pods/protected/strains/show/controller.js

diff --git a/app/pods/protected/strains/show/controller.js b/app/pods/protected/strains/show/controller.js
new file mode 100644
index 0000000..ab4d552
--- /dev/null
+++ b/app/pods/protected/strains/show/controller.js
@@ -0,0 +1,11 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  actions: {
+    delete: function() {
+      this.get('model').destroyRecord();
+      this.transitionToRoute('protected.strains.index');
+    },
+  },
+
+});
diff --git a/app/pods/protected/strains/show/template.hbs b/app/pods/protected/strains/show/template.hbs
index e16634a..5260d43 100644
--- a/app/pods/protected/strains/show/template.hbs
+++ b/app/pods/protected/strains/show/template.hbs
@@ -105,4 +105,5 @@
   {{#link-to 'protected.strains.edit' model.id class="button-gray smaller"}}
     Edit
   {{/link-to}}
+  {{delete-button delete=(action 'delete')}}
 {{/if}}

From abb57c9ee0e2b8e1afc99b86b1fdef4a964b0044 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Mon, 12 Oct 2015 10:47:54 -0700
Subject: [PATCH 11/14] Confirm delete on meas/char

---
 .../strains/show/measurements-table-row/template.hbs          | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/app/pods/protected/strains/show/measurements-table-row/template.hbs b/app/pods/protected/strains/show/measurements-table-row/template.hbs
index 6b99871..1c6cc07 100644
--- a/app/pods/protected/strains/show/measurements-table-row/template.hbs
+++ b/app/pods/protected/strains/show/measurements-table-row/template.hbs
@@ -44,9 +44,7 @@
       <button class="button-gray smaller" {{action 'edit'}}>
         Edit
       </button>
-      <button class="button-red smaller" {{action 'delete'}}>
-        Delete
-      </button>
+      {{delete-button delete=(action 'delete')}}
     </td>
   {{/if}}
 {{/if}}

From c3e0da9cb4d9e0543f09036ba5649df357fbe845 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Mon, 12 Oct 2015 12:05:45 -0700
Subject: [PATCH 12/14] Roughing in roles selection

---
 app/helpers/equal.js                            |  7 +++++++
 app/pods/protected/users/edit/template.hbs      |  1 +
 app/pods/protected/users/user-form/component.js |  6 ++++++
 app/pods/protected/users/user-form/template.hbs | 10 +++++++++-
 4 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 app/helpers/equal.js

diff --git a/app/helpers/equal.js b/app/helpers/equal.js
new file mode 100644
index 0000000..db3e867
--- /dev/null
+++ b/app/helpers/equal.js
@@ -0,0 +1,7 @@
+import Ember from 'ember';
+
+export function equalHelper(params) {
+  return params[0] === params[1];
+}
+
+export default Ember.HTMLBars.makeBoundHelper(equalHelper);
diff --git a/app/pods/protected/users/edit/template.hbs b/app/pods/protected/users/edit/template.hbs
index 68d66b4..2f2f678 100644
--- a/app/pods/protected/users/edit/template.hbs
+++ b/app/pods/protected/users/edit/template.hbs
@@ -1,6 +1,7 @@
 {{
   protected/users/user-form
   user=model
+  currentUser=session.currentUser
   save="save"
   cancel="cancel"
 }}
diff --git a/app/pods/protected/users/user-form/component.js b/app/pods/protected/users/user-form/component.js
index a53a469..d5ce463 100644
--- a/app/pods/protected/users/user-form/component.js
+++ b/app/pods/protected/users/user-form/component.js
@@ -1,6 +1,12 @@
 import Ember from 'ember';
 
 export default Ember.Component.extend({
+  isAdmin: Ember.computed('currentUser', function() {
+    return this.get('currentUser.role') == 'A';
+  }),
+
+  roles: Ember.String.w('A R W'),
+
   actions: {
     save: function() {
       this.sendAction('save');
diff --git a/app/pods/protected/users/user-form/template.hbs b/app/pods/protected/users/user-form/template.hbs
index 60c2d77..a872aae 100644
--- a/app/pods/protected/users/user-form/template.hbs
+++ b/app/pods/protected/users/user-form/template.hbs
@@ -16,7 +16,15 @@
     <div data-row-span="1">
       <div data-field-span="1">
         <label>Role</label>
-        {{user.role}}
+        {{#if isAdmin}}
+          <select onchange={{action (mut user.role) value="target.value"}}>
+            {{#each roles as |roleChoice|}}
+              <option value={{roleChoice}} selected={{equal user.role roleChoice}}>{{roleChoice}}</option>
+            {{/each}}
+          </select>
+        {{else}}
+          {{user.role}}
+        {{/if}}
       </div>
     </div>
   </fieldset>

From d353dc6e751e69c6e5cf76958906f6409c42adf2 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Mon, 12 Oct 2015 15:05:02 -0700
Subject: [PATCH 13/14] Clear store on role change

Fixes #18.
---
 app/pods/protected/users/edit/controller.js | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/app/pods/protected/users/edit/controller.js b/app/pods/protected/users/edit/controller.js
index 903eefd..3d4940c 100644
--- a/app/pods/protected/users/edit/controller.js
+++ b/app/pods/protected/users/edit/controller.js
@@ -6,8 +6,17 @@ export default Ember.Controller.extend({
       let user = this.get('model');
 
       if (user.get('hasDirtyAttributes')) {
+        let attrs = user.changedAttributes(), roleChanged = false;
+        if (attrs.role) {
+          roleChanged = true;
+        }
         user.save().then((user) => {
           this.get('flashMessages').clearMessages();
+          if (roleChanged) {
+            // Need to clear the store so that canEdit and canAdd
+            // attributes reflect the new role.
+            this.get('store').unloadAll();
+          }
           this.transitionToRoute('protected.users.show', user);
         }, (err) => {
           err.errors.forEach((error) => {

From 4a54813440a135ccf4973aa6647ba337f03cd303 Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Mon, 12 Oct 2015 20:43:36 -0700
Subject: [PATCH 14/14] Change password

Fixes #14
---
 .../users/changepassword/controller.js        | 29 +++++++++++++++++++
 .../protected/users/changepassword/route.js   | 12 ++++++++
 .../users/changepassword/template.hbs         | 24 +++++++++++++++
 app/pods/protected/users/show/controller.js   |  7 +++++
 app/pods/protected/users/show/template.hbs    | 26 +++++++++++------
 app/router.js                                 |  1 +
 6 files changed, 90 insertions(+), 9 deletions(-)
 create mode 100644 app/pods/protected/users/changepassword/controller.js
 create mode 100644 app/pods/protected/users/changepassword/route.js
 create mode 100644 app/pods/protected/users/changepassword/template.hbs
 create mode 100644 app/pods/protected/users/show/controller.js

diff --git a/app/pods/protected/users/changepassword/controller.js b/app/pods/protected/users/changepassword/controller.js
new file mode 100644
index 0000000..a157605
--- /dev/null
+++ b/app/pods/protected/users/changepassword/controller.js
@@ -0,0 +1,29 @@
+import Ember from 'ember';
+import ajaxRequest from '../../../../utils/ajax-request';
+
+export default Ember.Controller.extend({
+  passwordConfirm: null,
+
+  actions: {
+    save: function() {
+      if (this.get('password') !== this.get('passwordConfirm')) {
+        this.get('flashMessages').clearMessages();
+        this.get('flashMessages').error("Password fields don't match");
+        return;
+      }
+
+      let url = `${this.get('globals.apiURL')}/api/${this.get('globals.genus')}/users/password`;
+      let options = {
+        method: 'POST',
+        data: {
+          password: this.get('password'),
+        },
+      };
+      ajaxRequest(url, options);
+      this.transitionTo('protected.users.index');
+      this.get('flashMessages').information('Your password has been changed.');
+    },
+
+  },
+
+});
diff --git a/app/pods/protected/users/changepassword/route.js b/app/pods/protected/users/changepassword/route.js
new file mode 100644
index 0000000..982b827
--- /dev/null
+++ b/app/pods/protected/users/changepassword/route.js
@@ -0,0 +1,12 @@
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+  beforeModel: function(transition) {
+    this._super(transition);
+
+    let user_id = transition.params['protected.users.changepassword'].user_id;
+    if (this.get('session.currentUser.id') !== user_id) {
+      this.transitionTo('protected.users.index');
+    }
+  }
+});
diff --git a/app/pods/protected/users/changepassword/template.hbs b/app/pods/protected/users/changepassword/template.hbs
new file mode 100644
index 0000000..b22db6c
--- /dev/null
+++ b/app/pods/protected/users/changepassword/template.hbs
@@ -0,0 +1,24 @@
+<div class="grid-1">
+  <div class="span-1">
+    <fieldset>
+      <legend>Change password</legend>
+      <form {{action 'save' on='submit'}}>
+        <ul>
+          <li>
+            <label>New Password</label>
+            {{input type="password" value=password}}
+          </li>
+          <li>
+            <label>New Password (confirm)</label>
+            {{input type="password" value=passwordConfirm}}
+          </li>
+          <li>
+            <button type="submit" class="button-green smaller">
+              Submit
+            </button>
+          </li>
+        </ul>
+      </form>
+    </fieldset>
+  </div>
+</div>
diff --git a/app/pods/protected/users/show/controller.js b/app/pods/protected/users/show/controller.js
new file mode 100644
index 0000000..481b126
--- /dev/null
+++ b/app/pods/protected/users/show/controller.js
@@ -0,0 +1,7 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  isUser: Ember.computed('model.id', 'session.currentUser.id', function() {
+    return this.get('model.id') === this.get('session.currentUser.id');
+  }),
+});
diff --git a/app/pods/protected/users/show/template.hbs b/app/pods/protected/users/show/template.hbs
index 4f7fca9..9d21912 100644
--- a/app/pods/protected/users/show/template.hbs
+++ b/app/pods/protected/users/show/template.hbs
@@ -38,12 +38,20 @@
   </fieldset>
 </div>
 <br>
-{{#link-to 'protected.users.show' model.id class="button-gray smaller"}}
-  Change Password (Does nothing at the moment)
-{{/link-to}}
-{{#if model.canEdit}}
-  <br>
-  {{#link-to 'protected.users.edit' model.id class="button-gray smaller"}}
-    Edit
-  {{/link-to}}
-{{/if}}
+<div class="grid-2 gutter-20">
+  {{#if isUser}}
+    <div class="span-1">
+      {{#link-to 'protected.users.changepassword' model.id class="button-gray smaller"}}
+        Change Password
+      {{/link-to}}
+    </div>
+  {{/if}}
+
+  <div class="span-1">
+    {{#if model.canEdit}}
+      {{#link-to 'protected.users.edit' model.id class="button-gray smaller"}}
+        Edit
+      {{/link-to}}
+    {{/if}}
+  </div>
+</div>
diff --git a/app/router.js b/app/router.js
index 5f48eec..3b3655a 100644
--- a/app/router.js
+++ b/app/router.js
@@ -22,6 +22,7 @@ Router.map(function() {
     this.route('users', function() {
       this.route('show', { path: ':user_id' });
       this.route('edit', { path: ':user_id/edit' });
+      this.route('changepassword', { path: ':user_id/changepassword' });
     });
 
     this.route('compare', function() {