From 6d04a8a6c88d309b6dd1fa1233437cd64b312acd Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Wed, 17 Jun 2015 14:47:40 -0800
Subject: [PATCH 01/27] init clostridium
---
README.md | 2 +-
app/index.html | 6 +++---
app/pods/about/template.hbs | 2 +-
bower.json | 2 +-
config/environment.js | 6 +++---
divshot.json | 2 +-
package.json | 4 ++--
server/mocks/characteristic-types.js | 2 +-
server/mocks/characteristics.js | 2 +-
server/mocks/measurements.js | 2 +-
server/mocks/species.js | 10 +++++-----
server/mocks/strains.js | 2 +-
tests/index.html | 6 +++---
13 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/README.md b/README.md
index 16e11f0..b56745d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# hymenobacterdotinfo
+# clostridiumdotinfo
Detailed information to come --- for now see the ember-cli boilerplate below.
diff --git a/app/index.html b/app/index.html
index f75c736..a35ee85 100644
--- a/app/index.html
+++ b/app/index.html
@@ -3,7 +3,7 @@
- Hymenobacterdotinfo
+ clostridiumdotinfo
@@ -12,7 +12,7 @@
{{content-for 'head'}}
-
+
{{content-for 'head-footer'}}
@@ -20,7 +20,7 @@
{{content-for 'body'}}
-
+
{{content-for 'body-footer'}}
diff --git a/app/pods/about/template.hbs b/app/pods/about/template.hbs
index 2b95e93..b583288 100644
--- a/app/pods/about/template.hbs
+++ b/app/pods/about/template.hbs
@@ -1,3 +1,3 @@
-
This is some information about hymenobacter.info
+
This is some information about clostridium.info
diff --git a/bower.json b/bower.json
index 6aa21fe..7eac921 100644
--- a/bower.json
+++ b/bower.json
@@ -1,5 +1,5 @@
{
- "name": "hymenobacterdotinfo",
+ "name": "clostridiumdotinfo",
"dependencies": {
"jquery": "~2.1.1",
"ember": "1.12.0",
diff --git a/config/environment.js b/config/environment.js
index e71d629..78196ba 100644
--- a/config/environment.js
+++ b/config/environment.js
@@ -2,7 +2,7 @@
module.exports = function(environment) {
var ENV = {
- modulePrefix: 'hymenobacterdotinfo',
+ modulePrefix: 'clostridiumdotinfo',
environment: environment,
baseURL: '/',
locationType: 'auto',
@@ -12,9 +12,9 @@ module.exports = function(environment) {
}
},
APP: {
- genus: 'hymenobacter',
+ genus: 'clostridium',
},
- podModulePrefix: 'hymenobacterdotinfo/pods',
+ podModulePrefix: 'clostridiumdotinfo/pods',
'simple-auth': {
session: 'session:custom',
authorizer: 'simple-auth-authorizer:token',
diff --git a/divshot.json b/divshot.json
index f879f3c..97f0047 100644
--- a/divshot.json
+++ b/divshot.json
@@ -1,5 +1,5 @@
{
- "name": "hymenobacterdotinfo",
+ "name": "clostridiumdotinfo",
"root": "./dist",
"routes": {
"/tests": "tests/index.html",
diff --git a/package.json b/package.json
index f39391f..edb726a 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
- "name": "hymenobacterdotinfo",
+ "name": "clostridiumdotinfo",
"version": "0.0.0",
- "description": "Small description for hymenobacterdotinfo goes here",
+ "description": "Small description for clostridiumdotinfo goes here",
"private": true,
"directories": {
"doc": "doc",
diff --git a/server/mocks/characteristic-types.js b/server/mocks/characteristic-types.js
index 906a454..15405ef 100644
--- a/server/mocks/characteristic-types.js
+++ b/server/mocks/characteristic-types.js
@@ -77,5 +77,5 @@ module.exports = function(app) {
res.status(204).end();
});
- app.use('/api/hymenobacter/characteristicTypes', characteristicTypesRouter);
+ app.use('/api/clostridium/characteristicTypes', characteristicTypesRouter);
};
diff --git a/server/mocks/characteristics.js b/server/mocks/characteristics.js
index 3be513c..170e6b9 100644
--- a/server/mocks/characteristics.js
+++ b/server/mocks/characteristics.js
@@ -109,5 +109,5 @@ module.exports = function(app) {
res.status(204).end();
});
- app.use('/api/hymenobacter/characteristics', characteristicsRouter);
+ app.use('/api/clostridium/characteristics', characteristicsRouter);
};
diff --git a/server/mocks/measurements.js b/server/mocks/measurements.js
index e4e7fdc..64d4428 100644
--- a/server/mocks/measurements.js
+++ b/server/mocks/measurements.js
@@ -205,5 +205,5 @@ module.exports = function(app) {
res.status(204).end();
});
- app.use('/api/hymenobacter/measurements', measurementsRouter);
+ app.use('/api/clostridium/measurements', measurementsRouter);
};
diff --git a/server/mocks/species.js b/server/mocks/species.js
index f3b0430..59ff57b 100644
--- a/server/mocks/species.js
+++ b/server/mocks/species.js
@@ -5,7 +5,7 @@ module.exports = function(app) {
var SPECIES = [
{
id: 1,
- genusName: "Hymenobacter",
+ genusName: "Clostridium",
speciesName: "One",
typeSpecies: true,
etymology: "Test Etymology",
@@ -20,7 +20,7 @@ module.exports = function(app) {
},
{
id: 2,
- genusName: "Hymenobacter",
+ genusName: "Clostridium",
speciesName: "Two",
typeSpecies: true,
etymology: "Test Etymology",
@@ -35,7 +35,7 @@ module.exports = function(app) {
},
{
id: 3,
- genusName: "Hymenobacter",
+ genusName: "Clostridium",
speciesName: "Three",
typeSpecies: true,
etymology: "Test Etymology",
@@ -50,7 +50,7 @@ module.exports = function(app) {
},
{
id: 4,
- genusName: "Hymenobacter",
+ genusName: "Clostridium",
speciesName: "Four",
typeSpecies: true,
etymology: "Test Etymology",
@@ -101,5 +101,5 @@ module.exports = function(app) {
res.status(204).end();
});
- app.use('/api/hymenobacter/species', speciesRouter);
+ app.use('/api/clostridium/species', speciesRouter);
};
diff --git a/server/mocks/strains.js b/server/mocks/strains.js
index d6bfccf..0349cc3 100644
--- a/server/mocks/strains.js
+++ b/server/mocks/strains.js
@@ -126,5 +126,5 @@ module.exports = function(app) {
res.status(204).end();
});
- app.use('/api/hymenobacter/strains', strainsRouter);
+ app.use('/api/clostridium/strains', strainsRouter);
};
diff --git a/tests/index.html b/tests/index.html
index 648f884..e32fd45 100644
--- a/tests/index.html
+++ b/tests/index.html
@@ -3,7 +3,7 @@
-
Hymenobacterdotinfo Tests
+
clostridiumdotinfo Tests
@@ -11,7 +11,7 @@
{{content-for 'test-head'}}
-
+
{{content-for 'head-footer'}}
@@ -23,7 +23,7 @@
{{content-for 'test-body'}}
-
+
From 622cd0faaf69098fc5448f599193865c4326975d Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Mon, 6 Jul 2015 11:02:41 -0800
Subject: [PATCH 02/27] Species edit refactor (wip)
---
app/pods/application/adapter.js | 10 ++-
.../components/species-details/component.js | 20 -----
.../components/species-details/template.hbs | 89 -------------------
app/pods/species/edit/controller.js | 18 ++++
app/pods/species/edit/route.js | 14 +++
app/pods/species/edit/template.hbs | 37 ++++++++
app/pods/species/index/route.js | 5 +-
app/pods/species/index/template.hbs | 9 +-
app/pods/species/show/route.js | 12 ++-
app/pods/species/show/template.hbs | 64 +++++++++++--
app/router.js | 1 +
11 files changed, 155 insertions(+), 124 deletions(-)
delete mode 100644 app/pods/components/species-details/component.js
delete mode 100644 app/pods/components/species-details/template.hbs
create mode 100644 app/pods/species/edit/controller.js
create mode 100644 app/pods/species/edit/route.js
create mode 100644 app/pods/species/edit/template.hbs
diff --git a/app/pods/application/adapter.js b/app/pods/application/adapter.js
index e979dec..c4b405b 100644
--- a/app/pods/application/adapter.js
+++ b/app/pods/application/adapter.js
@@ -5,10 +5,13 @@ export default DS.RESTAdapter.extend({
namespace: function() {
return 'api/' + this.get('globals.genus');
}.property(),
+
host: function() {
return this.get('globals.apiURL');
}.property(),
+
coalesceFindRequests: true,
+
ajaxError: function(jqXHR) {
// http://stackoverflow.com/a/24027443
var error = this._super(jqXHR);
@@ -22,8 +25,13 @@ export default DS.RESTAdapter.extend({
});
}
return new DS.InvalidError(errors);
+ } else if (jqXHR && jqXHR.status === 500) {
+ var response = Ember.$.parseJSON(jqXHR.responseText);
+ if (response.error !== undefined) {
+ return new DS.InvalidError(response.error);
+ }
} else {
return error;
}
- }
+ },
});
diff --git a/app/pods/components/species-details/component.js b/app/pods/components/species-details/component.js
deleted file mode 100644
index 6070141..0000000
--- a/app/pods/components/species-details/component.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import Ember from 'ember';
-import userCanEdit from '../../../utils/user-can-edit';
-
-export default Ember.Component.extend({
- classNames: ['grid-1'],
- isEditing: false,
-
- canEdit: function() {
- return userCanEdit(this.get('session.currentUser'), this.get('species.createdBy'));
- }.property('session.currentUser', 'species.createdBy').readOnly(),
-
- actions: {
- save: function() {
- this.sendAction('save');
- },
- cancel: function() {
- this.sendAction('cancel');
- },
- }
-});
diff --git a/app/pods/components/species-details/template.hbs b/app/pods/components/species-details/template.hbs
deleted file mode 100644
index 813ada2..0000000
--- a/app/pods/components/species-details/template.hbs
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
diff --git a/app/pods/species/edit/controller.js b/app/pods/species/edit/controller.js
new file mode 100644
index 0000000..d0925e2
--- /dev/null
+++ b/app/pods/species/edit/controller.js
@@ -0,0 +1,18 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+ actions: {
+ save: function() {
+ let species = this.get('species');
+ if (species.get('isDirty')) {
+ species.save().then((species) => {
+ this.transitionToRoute('species.show', species.get('id'));
+ }, (err) => {
+ this.get('flashMessages').error(err.message);
+ });
+ } else {
+ this.transitionToRoute('species.show', species.get('id'));
+ }
+ },
+ }
+});
diff --git a/app/pods/species/edit/route.js b/app/pods/species/edit/route.js
new file mode 100644
index 0000000..b73792b
--- /dev/null
+++ b/app/pods/species/edit/route.js
@@ -0,0 +1,14 @@
+import Ember from 'ember';
+import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';
+
+export default Ember.Route.extend(AuthenticatedRouteMixin, {
+ model: function(params) {
+ return Ember.RSVP.hash({
+ species: this.store.find('species', params.species_id),
+ });
+ },
+
+ setupController: function(controller, model) {
+ controller.setProperties(model);
+ },
+});
diff --git a/app/pods/species/edit/template.hbs b/app/pods/species/edit/template.hbs
new file mode 100644
index 0000000..39d135d
--- /dev/null
+++ b/app/pods/species/edit/template.hbs
@@ -0,0 +1,37 @@
+
+
+
+ Save
+
diff --git a/app/pods/species/index/route.js b/app/pods/species/index/route.js
index d2ab490..b0968ba 100644
--- a/app/pods/species/index/route.js
+++ b/app/pods/species/index/route.js
@@ -5,10 +5,11 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, {
model: function() {
return Ember.RSVP.hash({
species: this.store.findAll('species'),
+ strains: this.store.findAll('strain'),
});
},
- setupController: function(controller, model) {
- controller.setProperties(model);
+ setupController: function(controller, models) {
+ controller.setProperties(models);
},
});
diff --git a/app/pods/species/index/template.hbs b/app/pods/species/index/template.hbs
index 00454fb..225fa79 100644
--- a/app/pods/species/index/template.hbs
+++ b/app/pods/species/index/template.hbs
@@ -11,17 +11,18 @@
- {{#each sortedSpecies as |row|}}
+ {{#each sortedSpecies as |species|}}
- {{#link-to 'species.show' row}}
- {{row.speciesName}}
+ {{!-- use species.id to call show model hook --}}
+ {{#link-to 'species.show' species.id}}
+ {{species.speciesName}}
{{/link-to}}
|
- {{#each row.strains as |strain index|}}
+ {{#each species.strains as |strain index|}}
{{if index ","}}
{{#link-to 'strains.show' strain.id}}
{{{strain.strainNameMU}}}
diff --git a/app/pods/species/show/route.js b/app/pods/species/show/route.js
index b3f843f..b73792b 100644
--- a/app/pods/species/show/route.js
+++ b/app/pods/species/show/route.js
@@ -1,4 +1,14 @@
import Ember from 'ember';
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';
-export default Ember.Route.extend(AuthenticatedRouteMixin, {});
+export default Ember.Route.extend(AuthenticatedRouteMixin, {
+ model: function(params) {
+ return Ember.RSVP.hash({
+ species: this.store.find('species', params.species_id),
+ });
+ },
+
+ setupController: function(controller, model) {
+ controller.setProperties(model);
+ },
+});
diff --git a/app/pods/species/show/template.hbs b/app/pods/species/show/template.hbs
index b242fc5..0d1c47a 100644
--- a/app/pods/species/show/template.hbs
+++ b/app/pods/species/show/template.hbs
@@ -1,7 +1,57 @@
-{{
- species-details
- species=model
- isEditing=isEditing
- save="save"
- cancel="cancel"
-}}
+
+
+
+
+
diff --git a/app/router.js b/app/router.js
index 27112b6..6f43b21 100644
--- a/app/router.js
+++ b/app/router.js
@@ -15,6 +15,7 @@ Router.map(function() {
this.route('species', function() {
this.route('new');
this.route('show', { path: ':species_id' });
+ this.route('edit', { path: ':species_id/edit' });
});
this.route('strains', function() {
this.route('new');
From 9aed8589825f2b8f24a0a7542a16478cf9f62fce Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 7 Jul 2015 07:30:48 -0800
Subject: [PATCH 03/27] Continuing with species refactor
---
app/pods/application/adapter.js | 5 ---
.../forms/species-form/component.js | 12 ++++++
.../forms/species-form/template.hbs | 42 ++++++++++++++++++
app/pods/species/edit/controller.js | 15 ++++++-
app/pods/species/edit/template.hbs | 43 +++----------------
app/pods/species/new/controller.js | 23 +++++++---
app/pods/species/new/route.js | 14 +++---
app/pods/species/new/template.hbs | 5 +--
8 files changed, 99 insertions(+), 60 deletions(-)
create mode 100644 app/pods/components/forms/species-form/component.js
create mode 100644 app/pods/components/forms/species-form/template.hbs
diff --git a/app/pods/application/adapter.js b/app/pods/application/adapter.js
index c4b405b..bb89c25 100644
--- a/app/pods/application/adapter.js
+++ b/app/pods/application/adapter.js
@@ -25,11 +25,6 @@ export default DS.RESTAdapter.extend({
});
}
return new DS.InvalidError(errors);
- } else if (jqXHR && jqXHR.status === 500) {
- var response = Ember.$.parseJSON(jqXHR.responseText);
- if (response.error !== undefined) {
- return new DS.InvalidError(response.error);
- }
} else {
return error;
}
diff --git a/app/pods/components/forms/species-form/component.js b/app/pods/components/forms/species-form/component.js
new file mode 100644
index 0000000..0e5912c
--- /dev/null
+++ b/app/pods/components/forms/species-form/component.js
@@ -0,0 +1,12 @@
+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/components/forms/species-form/template.hbs b/app/pods/components/forms/species-form/template.hbs
new file mode 100644
index 0000000..fda54bc
--- /dev/null
+++ b/app/pods/components/forms/species-form/template.hbs
@@ -0,0 +1,42 @@
+
+
+{{#if species.isDirty}}
+
+ Save
+
+{{/if}}
+
+ Cancel
+
diff --git a/app/pods/species/edit/controller.js b/app/pods/species/edit/controller.js
index d0925e2..ca6b05f 100644
--- a/app/pods/species/edit/controller.js
+++ b/app/pods/species/edit/controller.js
@@ -4,15 +4,26 @@ export default Ember.Controller.extend({
actions: {
save: function() {
let species = this.get('species');
+
if (species.get('isDirty')) {
species.save().then((species) => {
this.transitionToRoute('species.show', species.get('id'));
}, (err) => {
- this.get('flashMessages').error(err.message);
+ this.get('flashMessages').error(err.responseJSON.error);
});
} else {
this.transitionToRoute('species.show', species.get('id'));
}
},
- }
+
+ cancel: function() {
+ let species = this.get('species');
+
+ species.get('errors').clear();
+ species.rollback();
+
+ this.transitionToRoute('species.show', species.get('id'));
+ },
+
+ },
});
diff --git a/app/pods/species/edit/template.hbs b/app/pods/species/edit/template.hbs
index 39d135d..6a8db9b 100644
--- a/app/pods/species/edit/template.hbs
+++ b/app/pods/species/edit/template.hbs
@@ -1,37 +1,6 @@
-
-
-
- Save
-
+{{
+ forms/species-form
+ species=species
+ save="save"
+ cancel="cancel"
+}}
diff --git a/app/pods/species/new/controller.js b/app/pods/species/new/controller.js
index a289976..2781a83 100644
--- a/app/pods/species/new/controller.js
+++ b/app/pods/species/new/controller.js
@@ -1,21 +1,30 @@
import Ember from 'ember';
export default Ember.Controller.extend({
- isEditing: true,
actions: {
save: function() {
- var species = this.get('model');
+ let species = this.get('species');
+
if (species.get('isDirty')) {
- species.save();
+ species.save().then((species) => {
+ this.transitionToRoute('species.show', species.get('id'));
+ }, (err) => {
+ this.get('flashMessages').error(err.responseJSON.error);
+ });
+ } else {
+ this.transitionToRoute('species.index');
}
- this.transitionToRoute('species.index');
},
+
cancel: function() {
- var species = this.get('model');
+ let species = this.get('species');
+
if (species.get('isNew')) {
species.deleteRecord();
}
+
this.transitionToRoute('species.index');
- }
- }
+ },
+
+ },
});
diff --git a/app/pods/species/new/route.js b/app/pods/species/new/route.js
index b9f79eb..e816ab5 100644
--- a/app/pods/species/new/route.js
+++ b/app/pods/species/new/route.js
@@ -3,11 +3,13 @@ import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixi
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model: function() {
- return this.store.createRecord('species');
+ return Ember.RSVP.hash({
+ species: this.store.createRecord('species'),
+ });
},
- actions: {
- cancelSpecies: function() {
- this.transitionTo('species.index');
- }
- }
+
+ setupController: function(controller, model) {
+ controller.setProperties(model);
+ },
+
});
diff --git a/app/pods/species/new/template.hbs b/app/pods/species/new/template.hbs
index f38417f..6a8db9b 100644
--- a/app/pods/species/new/template.hbs
+++ b/app/pods/species/new/template.hbs
@@ -1,7 +1,6 @@
{{
- species-details
- species=model
- isEditing=true
+ forms/species-form
+ species=species
save="save"
cancel="cancel"
}}
From 4bbf9318533cee95ac94964e4428b7945f0b8b78 Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 7 Jul 2015 08:38:05 -0800
Subject: [PATCH 04/27] Going back to model reference
---
app/pods/species/edit/controller.js | 4 ++--
app/pods/species/edit/route.js | 12 +-----------
app/pods/species/edit/template.hbs | 2 +-
app/pods/species/index/template.hbs | 3 +--
app/pods/species/new/controller.js | 4 ++--
app/pods/species/new/route.js | 8 +-------
app/pods/species/new/template.hbs | 2 +-
app/pods/species/show/controller.js | 22 ----------------------
app/pods/species/show/route.js | 12 +-----------
app/pods/species/show/template.hbs | 14 +++++++-------
10 files changed, 17 insertions(+), 66 deletions(-)
delete mode 100644 app/pods/species/show/controller.js
diff --git a/app/pods/species/edit/controller.js b/app/pods/species/edit/controller.js
index ca6b05f..463392e 100644
--- a/app/pods/species/edit/controller.js
+++ b/app/pods/species/edit/controller.js
@@ -3,7 +3,7 @@ import Ember from 'ember';
export default Ember.Controller.extend({
actions: {
save: function() {
- let species = this.get('species');
+ let species = this.get('model');
if (species.get('isDirty')) {
species.save().then((species) => {
@@ -17,7 +17,7 @@ export default Ember.Controller.extend({
},
cancel: function() {
- let species = this.get('species');
+ let species = this.get('model');
species.get('errors').clear();
species.rollback();
diff --git a/app/pods/species/edit/route.js b/app/pods/species/edit/route.js
index b73792b..b3f843f 100644
--- a/app/pods/species/edit/route.js
+++ b/app/pods/species/edit/route.js
@@ -1,14 +1,4 @@
import Ember from 'ember';
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';
-export default Ember.Route.extend(AuthenticatedRouteMixin, {
- model: function(params) {
- return Ember.RSVP.hash({
- species: this.store.find('species', params.species_id),
- });
- },
-
- setupController: function(controller, model) {
- controller.setProperties(model);
- },
-});
+export default Ember.Route.extend(AuthenticatedRouteMixin, {});
diff --git a/app/pods/species/edit/template.hbs b/app/pods/species/edit/template.hbs
index 6a8db9b..5c6c82f 100644
--- a/app/pods/species/edit/template.hbs
+++ b/app/pods/species/edit/template.hbs
@@ -1,6 +1,6 @@
{{
forms/species-form
- species=species
+ species=model
save="save"
cancel="cancel"
}}
diff --git a/app/pods/species/index/template.hbs b/app/pods/species/index/template.hbs
index 225fa79..12cd6d8 100644
--- a/app/pods/species/index/template.hbs
+++ b/app/pods/species/index/template.hbs
@@ -15,8 +15,7 @@
- {{!-- use species.id to call show model hook --}}
- {{#link-to 'species.show' species.id}}
+ {{#link-to 'species.show' species}}
{{species.speciesName}}
{{/link-to}}
diff --git a/app/pods/species/new/controller.js b/app/pods/species/new/controller.js
index 2781a83..568648f 100644
--- a/app/pods/species/new/controller.js
+++ b/app/pods/species/new/controller.js
@@ -3,7 +3,7 @@ import Ember from 'ember';
export default Ember.Controller.extend({
actions: {
save: function() {
- let species = this.get('species');
+ let species = this.get('model');
if (species.get('isDirty')) {
species.save().then((species) => {
@@ -17,7 +17,7 @@ export default Ember.Controller.extend({
},
cancel: function() {
- let species = this.get('species');
+ let species = this.get('model');
if (species.get('isNew')) {
species.deleteRecord();
diff --git a/app/pods/species/new/route.js b/app/pods/species/new/route.js
index e816ab5..98741c6 100644
--- a/app/pods/species/new/route.js
+++ b/app/pods/species/new/route.js
@@ -3,13 +3,7 @@ import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixi
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model: function() {
- return Ember.RSVP.hash({
- species: this.store.createRecord('species'),
- });
- },
-
- setupController: function(controller, model) {
- controller.setProperties(model);
+ return this.store.createRecord('species');
},
});
diff --git a/app/pods/species/new/template.hbs b/app/pods/species/new/template.hbs
index 6a8db9b..5c6c82f 100644
--- a/app/pods/species/new/template.hbs
+++ b/app/pods/species/new/template.hbs
@@ -1,6 +1,6 @@
{{
forms/species-form
- species=species
+ species=model
save="save"
cancel="cancel"
}}
diff --git a/app/pods/species/show/controller.js b/app/pods/species/show/controller.js
deleted file mode 100644
index 2d5a523..0000000
--- a/app/pods/species/show/controller.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Controller.extend({
- isEditing: false,
- actions: {
- save: function() {
- var species = this.get('model');
- if (species.get('isDirty')) {
- species.save();
- }
- this.toggleProperty('isEditing');
- },
- cancel: function() {
- if (this.get('isEditing')) {
- var species = this.get('model');
- species.get('errors').clear();
- species.rollback();
- }
- this.toggleProperty('isEditing');
- }
- }
-});
diff --git a/app/pods/species/show/route.js b/app/pods/species/show/route.js
index b73792b..b3f843f 100644
--- a/app/pods/species/show/route.js
+++ b/app/pods/species/show/route.js
@@ -1,14 +1,4 @@
import Ember from 'ember';
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';
-export default Ember.Route.extend(AuthenticatedRouteMixin, {
- model: function(params) {
- return Ember.RSVP.hash({
- species: this.store.find('species', params.species_id),
- });
- },
-
- setupController: function(controller, model) {
- controller.setProperties(model);
- },
-});
+export default Ember.Route.extend(AuthenticatedRouteMixin, {});
diff --git a/app/pods/species/show/template.hbs b/app/pods/species/show/template.hbs
index 0d1c47a..11b72ba 100644
--- a/app/pods/species/show/template.hbs
+++ b/app/pods/species/show/template.hbs
@@ -2,7 +2,7 @@
@@ -31,7 +31,7 @@
- Etymology
-
- {{species.etymology}}
+ {{model.etymology}}
@@ -40,15 +40,15 @@
- Record Created
- - {{null-time species.createdAt 'LL'}}
+ - {{null-time model.createdAt 'LL'}}
- Record Updated
- - {{null-time species.updatedAt 'LL'}}
+ - {{null-time model.updatedAt 'LL'}}
- Record Deleted
- - {{null-time species.deletedAt 'LL'}}
+ - {{null-time model.deletedAt 'LL'}}
From ae7f3bdafaa01c5492ee51fc22729d397d531b67 Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 7 Jul 2015 09:56:49 -0800
Subject: [PATCH 05/27] Test-drive metadata
---
app/pods/components/add-button/component.js | 9 ---------
app/pods/species/index/controller.js | 5 +++++
app/pods/species/index/template.hbs | 2 +-
3 files changed, 6 insertions(+), 10 deletions(-)
delete mode 100644 app/pods/components/add-button/component.js
diff --git a/app/pods/components/add-button/component.js b/app/pods/components/add-button/component.js
deleted file mode 100644
index 8075297..0000000
--- a/app/pods/components/add-button/component.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import Ember from 'ember';
-import userCanAdd from '../../../utils/user-can-add';
-
-export default Ember.Component.extend({
- canAdd: function() {
- let user_role = this.get('session.currentUser.role');
- return userCanAdd(user_role);
- }.property('session.currentUser.role').readOnly(),
-});
diff --git a/app/pods/species/index/controller.js b/app/pods/species/index/controller.js
index a28a11f..82a022e 100644
--- a/app/pods/species/index/controller.js
+++ b/app/pods/species/index/controller.js
@@ -3,4 +3,9 @@ import Ember from 'ember';
export default Ember.Controller.extend({
sortParams: ['speciesName', 'strainCount'],
sortedSpecies: Ember.computed.sort('species', 'sortParams'),
+
+ metaData: function() {
+ return this.store.metadataFor('species');
+ }.property('model.isLoaded').readOnly(),
+
});
diff --git a/app/pods/species/index/template.hbs b/app/pods/species/index/template.hbs
index 12cd6d8..4f34a27 100644
--- a/app/pods/species/index/template.hbs
+++ b/app/pods/species/index/template.hbs
@@ -1,7 +1,7 @@
{{genus-name}} Species
Total species: {{species.length}}
-{{add-button label="Add Species" link="species.new"}}
+{{add-button label="Add Species" link="species.new" canAdd=metaData.canAdd}}
From 38894d94e797dadcf43f23862e7da6b2675c6cef Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 7 Jul 2015 11:09:41 -0800
Subject: [PATCH 06/27] Sideload strains in species list
---
app/models/species.js | 2 +-
app/models/strain.js | 2 +-
app/pods/species/index/controller.js | 2 +-
app/pods/species/index/route.js | 11 ++---------
4 files changed, 5 insertions(+), 12 deletions(-)
diff --git a/app/models/species.js b/app/models/species.js
index fee135a..b6d509a 100644
--- a/app/models/species.js
+++ b/app/models/species.js
@@ -7,7 +7,7 @@ export default DS.Model.extend({
typeSpecies : DS.attr('boolean'),
etymology : DS.attr('string'),
genusName : DS.attr('string', { defaultValue: config.APP.genus }),
- strains : DS.hasMany('strain', { async: true }),
+ strains : DS.hasMany('strain', { async: false }),
totalStrains: DS.attr('number'),
createdAt : DS.attr('date'),
updatedAt : DS.attr('date'),
diff --git a/app/models/strain.js b/app/models/strain.js
index 7f69f45..49344cf 100644
--- a/app/models/strain.js
+++ b/app/models/strain.js
@@ -3,7 +3,7 @@ import Ember from 'ember';
export default DS.Model.extend({
measurements : DS.hasMany('measurements', { async: true }),
- species : DS.belongsTo('species', { async: true }),
+ species : DS.belongsTo('species', { async: false }),
strainName : DS.attr('string'),
typeStrain : DS.attr('boolean'),
accessionNumbers : DS.attr('string'),
diff --git a/app/pods/species/index/controller.js b/app/pods/species/index/controller.js
index 82a022e..2714e73 100644
--- a/app/pods/species/index/controller.js
+++ b/app/pods/species/index/controller.js
@@ -2,7 +2,7 @@ import Ember from 'ember';
export default Ember.Controller.extend({
sortParams: ['speciesName', 'strainCount'],
- sortedSpecies: Ember.computed.sort('species', 'sortParams'),
+ sortedSpecies: Ember.computed.sort('model', 'sortParams'),
metaData: function() {
return this.store.metadataFor('species');
diff --git a/app/pods/species/index/route.js b/app/pods/species/index/route.js
index b0968ba..6b02e0e 100644
--- a/app/pods/species/index/route.js
+++ b/app/pods/species/index/route.js
@@ -3,13 +3,6 @@ import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixi
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model: function() {
- return Ember.RSVP.hash({
- species: this.store.findAll('species'),
- strains: this.store.findAll('strain'),
- });
- },
-
- setupController: function(controller, models) {
- controller.setProperties(models);
- },
+ return this.store.findAll('species');
+ }
});
From 583d7ca0dbd4cd8e446d8f09fee7389b1ba2365c Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 7 Jul 2015 14:28:06 -0800
Subject: [PATCH 07/27] SQUASH
---
app/pods/species/index/template.hbs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/pods/species/index/template.hbs b/app/pods/species/index/template.hbs
index 4f34a27..6fc2993 100644
--- a/app/pods/species/index/template.hbs
+++ b/app/pods/species/index/template.hbs
@@ -1,5 +1,5 @@
{{genus-name}} Species
-Total species: {{species.length}}
+Total species: {{model.length}}
{{add-button label="Add Species" link="species.new" canAdd=metaData.canAdd}}
From 3436989a89e5aa76d298a4fae97c54e768f9f210 Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 7 Jul 2015 14:28:16 -0800
Subject: [PATCH 08/27] Edit species
---
app/pods/species/show/controller.js | 14 ++++++++++++++
app/pods/species/show/template.hbs | 6 ++++++
2 files changed, 20 insertions(+)
create mode 100644 app/pods/species/show/controller.js
diff --git a/app/pods/species/show/controller.js b/app/pods/species/show/controller.js
new file mode 100644
index 0000000..d9625f4
--- /dev/null
+++ b/app/pods/species/show/controller.js
@@ -0,0 +1,14 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+ userCanEdit: function() {
+ let meta = this.store.metadataFor('species');
+ let id = this.get('model.id');
+
+ if (meta.canEdit.indexOf( +id ) === -1) {
+ return false
+ }
+ return true;
+ }.property('model.isLoaded').readOnly(),
+
+});
diff --git a/app/pods/species/show/template.hbs b/app/pods/species/show/template.hbs
index 11b72ba..e892234 100644
--- a/app/pods/species/show/template.hbs
+++ b/app/pods/species/show/template.hbs
@@ -55,3 +55,9 @@
+{{#if userCanEdit}}
+
+ {{#link-to 'species.edit' model class="button-gray smaller"}}
+ Edit
+ {{/link-to}}
+{{/if}}
From 9e8b02ac90f2ab86af5e6caaba107c426b1f8d4d Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 7 Jul 2015 14:38:36 -0800
Subject: [PATCH 09/27] Overflow table
---
app/pods/compare/template.hbs | 2 +-
app/styles/app.css | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/app/pods/compare/template.hbs b/app/pods/compare/template.hbs
index 8724242..a4466f4 100644
--- a/app/pods/compare/template.hbs
+++ b/app/pods/compare/template.hbs
@@ -12,7 +12,7 @@
Please select one or more strains and one or more characteristics.
{{else}}
-
+
diff --git a/app/styles/app.css b/app/styles/app.css
index ff245dd..2a02ea6 100644
--- a/app/styles/app.css
+++ b/app/styles/app.css
@@ -1,3 +1,8 @@
+.overflow-div {
+ white-space: nowrap;
+ overflow: auto;
+}
+
.measurements-container {
padding: 2em 0em 0em 0em;
}
From 14a678092e6974547edc8e440461699e29d071a4 Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 14 Jul 2015 08:05:01 -0800
Subject: [PATCH 10/27] Missed in merge
---
app/pods/species/edit/controller.js | 29 ---------------------------
app/pods/species/edit/route.js | 4 ----
app/pods/species/edit/template.hbs | 6 ------
app/pods/species/index/controller.js | 11 ----------
app/pods/species/index/route.js | 8 --------
app/pods/species/new/controller.js | 30 ----------------------------
app/pods/species/show/controller.js | 14 -------------
7 files changed, 102 deletions(-)
delete mode 100644 app/pods/species/edit/controller.js
delete mode 100644 app/pods/species/edit/route.js
delete mode 100644 app/pods/species/edit/template.hbs
delete mode 100644 app/pods/species/index/controller.js
delete mode 100644 app/pods/species/index/route.js
delete mode 100644 app/pods/species/new/controller.js
delete mode 100644 app/pods/species/show/controller.js
diff --git a/app/pods/species/edit/controller.js b/app/pods/species/edit/controller.js
deleted file mode 100644
index 463392e..0000000
--- a/app/pods/species/edit/controller.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Controller.extend({
- actions: {
- save: function() {
- let species = this.get('model');
-
- if (species.get('isDirty')) {
- species.save().then((species) => {
- this.transitionToRoute('species.show', species.get('id'));
- }, (err) => {
- this.get('flashMessages').error(err.responseJSON.error);
- });
- } else {
- this.transitionToRoute('species.show', species.get('id'));
- }
- },
-
- cancel: function() {
- let species = this.get('model');
-
- species.get('errors').clear();
- species.rollback();
-
- this.transitionToRoute('species.show', species.get('id'));
- },
-
- },
-});
diff --git a/app/pods/species/edit/route.js b/app/pods/species/edit/route.js
deleted file mode 100644
index b3f843f..0000000
--- a/app/pods/species/edit/route.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import Ember from 'ember';
-import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';
-
-export default Ember.Route.extend(AuthenticatedRouteMixin, {});
diff --git a/app/pods/species/edit/template.hbs b/app/pods/species/edit/template.hbs
deleted file mode 100644
index 5c6c82f..0000000
--- a/app/pods/species/edit/template.hbs
+++ /dev/null
@@ -1,6 +0,0 @@
-{{
- forms/species-form
- species=model
- save="save"
- cancel="cancel"
-}}
diff --git a/app/pods/species/index/controller.js b/app/pods/species/index/controller.js
deleted file mode 100644
index 2714e73..0000000
--- a/app/pods/species/index/controller.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Controller.extend({
- sortParams: ['speciesName', 'strainCount'],
- sortedSpecies: Ember.computed.sort('model', 'sortParams'),
-
- metaData: function() {
- return this.store.metadataFor('species');
- }.property('model.isLoaded').readOnly(),
-
-});
diff --git a/app/pods/species/index/route.js b/app/pods/species/index/route.js
deleted file mode 100644
index 6b02e0e..0000000
--- a/app/pods/species/index/route.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import Ember from 'ember';
-import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';
-
-export default Ember.Route.extend(AuthenticatedRouteMixin, {
- model: function() {
- return this.store.findAll('species');
- }
-});
diff --git a/app/pods/species/new/controller.js b/app/pods/species/new/controller.js
deleted file mode 100644
index 568648f..0000000
--- a/app/pods/species/new/controller.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Controller.extend({
- actions: {
- save: function() {
- let species = this.get('model');
-
- if (species.get('isDirty')) {
- species.save().then((species) => {
- this.transitionToRoute('species.show', species.get('id'));
- }, (err) => {
- this.get('flashMessages').error(err.responseJSON.error);
- });
- } else {
- this.transitionToRoute('species.index');
- }
- },
-
- cancel: function() {
- let species = this.get('model');
-
- if (species.get('isNew')) {
- species.deleteRecord();
- }
-
- this.transitionToRoute('species.index');
- },
-
- },
-});
diff --git a/app/pods/species/show/controller.js b/app/pods/species/show/controller.js
deleted file mode 100644
index d9625f4..0000000
--- a/app/pods/species/show/controller.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Controller.extend({
- userCanEdit: function() {
- let meta = this.store.metadataFor('species');
- let id = this.get('model.id');
-
- if (meta.canEdit.indexOf( +id ) === -1) {
- return false
- }
- return true;
- }.property('model.isLoaded').readOnly(),
-
-});
From c17abc68294b33ffbd37e8d6baaff89ed75f7ac8 Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 20 Oct 2015 18:16:41 -0700
Subject: [PATCH 11/27] Missing pod prefix
---
config/environment.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/config/environment.js b/config/environment.js
index a6f5a79..2a35933 100644
--- a/config/environment.js
+++ b/config/environment.js
@@ -14,6 +14,7 @@ module.exports = function(environment) {
APP: {
genus: 'clostridium',
},
+ podModulePrefix: 'clostridiumdotinfo/pods',
flashMessageDefaults: {
sticky: true,
type: 'error',
From 6bdbacf978c47381113c1e5b34874adca2fb43ec Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Wed, 4 Nov 2015 20:32:22 -0700
Subject: [PATCH 12/27] Tweak mirage for clostridium
---
app/mirage/config.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/mirage/config.js b/app/mirage/config.js
index 79cee5e..c479b89 100644
--- a/app/mirage/config.js
+++ b/app/mirage/config.js
@@ -7,7 +7,7 @@ export default function() {
export function testConfig() {
this.urlPrefix = 'https://bactdb-test.herokuapp.com';
- this.namespace = '/api/hymenobacter';
+ this.namespace = '/api/clostridium';
this.timing = 0;
this.get('/users/:id');
From a4dbb4a94d08462e4f38f60ff1a65f87703906df Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Mon, 30 Nov 2015 17:31:12 -0700
Subject: [PATCH 13/27] Add measurement table cancel
---
app/pods/protected/strains/edit/controller.js | 2 +-
.../measurements-table-row/component.js | 29 ++++++++++++++++---
.../loading/template.hbs | 1 +
.../measurements-table-row/template.hbs | 11 ++++---
4 files changed, 32 insertions(+), 11 deletions(-)
create mode 100644 app/pods/protected/strains/measurements-table-row/loading/template.hbs
diff --git a/app/pods/protected/strains/edit/controller.js b/app/pods/protected/strains/edit/controller.js
index 4d68665..b3bf9b8 100644
--- a/app/pods/protected/strains/edit/controller.js
+++ b/app/pods/protected/strains/edit/controller.js
@@ -18,7 +18,7 @@ export default Controller.extend(SaveModel, {
saveMeasurement: function(measurement, properties) {
measurement.setProperties(properties);
- measurement.save().then(() => {
+ return measurement.save().then(() => {
this.get('flashMessages').clearMessages();
}, () => {
ajaxError(measurement.get('errors'), this.get('flashMessages'));
diff --git a/app/pods/protected/strains/measurements-table-row/component.js b/app/pods/protected/strains/measurements-table-row/component.js
index ad63dc9..61a60fb 100644
--- a/app/pods/protected/strains/measurements-table-row/component.js
+++ b/app/pods/protected/strains/measurements-table-row/component.js
@@ -10,6 +10,7 @@ export default Component.extend({
allCharacteristics: null,
measurement: null,
isDirty: null,
+ isNew: false,
// Actions
"save-measurement": null,
@@ -22,11 +23,20 @@ export default Component.extend({
notes: null,
resetOnInit: Ember.on('init', function() {
+ this._resetProperties();
+ }),
+
+ _resetProperties: function() {
this.get('propertiesList').forEach((field) => {
const valueInMeasurement = this.get('measurement').get(field);
this.set(field, valueInMeasurement);
});
- }),
+ // Read-only attributes
+ this.set('isNew', this.get('measurement.isNew'));
+ if (this.get('isNew')) {
+ this.set('isEditing', true);
+ }
+ },
updateField: function(property, value) {
this.set(property, value);
@@ -40,12 +50,23 @@ export default Component.extend({
actions: {
edit: function() {
- this.toggleProperty('isEditing');
+ this.set('isEditing', true);
},
save: function() {
- this.attrs['save-measurement'](this.get('measurement'), this.getProperties(this.get('propertiesList')));
- this.toggleProperty('isEditing');
+ this.attrs['save-measurement'](this.get('measurement'), this.getProperties(this.get('propertiesList'))).then(() => {
+ this._resetProperties();
+ this.set('isEditing', false);
+ });
+ },
+
+ cancel: function() {
+ if (this.get('isNew')) {
+ this.attrs['delete-measurement'](this.get('measurement'));
+ } else {
+ this._resetProperties();
+ this.set('isEditing', false);
+ }
},
delete: function() {
diff --git a/app/pods/protected/strains/measurements-table-row/loading/template.hbs b/app/pods/protected/strains/measurements-table-row/loading/template.hbs
new file mode 100644
index 0000000..e5a3e05
--- /dev/null
+++ b/app/pods/protected/strains/measurements-table-row/loading/template.hbs
@@ -0,0 +1 @@
+{{loading-panel}}
diff --git a/app/pods/protected/strains/measurements-table-row/template.hbs b/app/pods/protected/strains/measurements-table-row/template.hbs
index 0dc03b7..3e3fd4d 100644
--- a/app/pods/protected/strains/measurements-table-row/template.hbs
+++ b/app/pods/protected/strains/measurements-table-row/template.hbs
@@ -15,14 +15,13 @@
{{#if canEdit}}
- {{#if isDirty}}
-
- {{else}}
- |
{{/if}}
From 233a2d09a16bf79bb8f0c88da8e45b3f881da754 Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 1 Dec 2015 07:03:43 -0700
Subject: [PATCH 14/27] Refactoring delete measurement
---
app/pods/protected/strains/edit/controller.js | 16 ++++++++--------
app/pods/protected/strains/edit/template.hbs | 1 -
.../strains/strain-form/component.js | 19 ++++++++++++++-----
3 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/app/pods/protected/strains/edit/controller.js b/app/pods/protected/strains/edit/controller.js
index b3bf9b8..2591853 100644
--- a/app/pods/protected/strains/edit/controller.js
+++ b/app/pods/protected/strains/edit/controller.js
@@ -10,6 +10,14 @@ export default Controller.extend(SaveModel, {
fallbackRouteCancel: 'protected.strains.show',
actions: {
+ save: function(properties, deleteQueue) {
+ deleteQueue.forEach((val) => {
+ val.destroyRecord();
+ });
+
+ this._super(properties);
+ },
+
addCharacteristic: function() {
return this.store.createRecord('measurement', {
characteristic: this.store.createRecord('characteristic', { sortOrder: -999 }),
@@ -25,13 +33,5 @@ export default Controller.extend(SaveModel, {
});
},
- deleteMeasurement: function(measurement) {
- const characteristic = measurement.get('characteristic');
- if (characteristic.get('isNew')) {
- characteristic.destroyRecord();
- }
- measurement.destroyRecord();
- },
-
},
});
diff --git a/app/pods/protected/strains/edit/template.hbs b/app/pods/protected/strains/edit/template.hbs
index 59d1633..f252090 100644
--- a/app/pods/protected/strains/edit/template.hbs
+++ b/app/pods/protected/strains/edit/template.hbs
@@ -5,7 +5,6 @@
add-characteristic=(action "addCharacteristic")
allCharacteristics=allCharacteristics
save-measurement=(action "saveMeasurement")
- delete-measurement=(action "deleteMeasurement")
on-save=(action "save")
on-cancel=(action "cancel")
}}
diff --git a/app/pods/protected/strains/strain-form/component.js b/app/pods/protected/strains/strain-form/component.js
index ebb157c..4b1518c 100644
--- a/app/pods/protected/strains/strain-form/component.js
+++ b/app/pods/protected/strains/strain-form/component.js
@@ -10,6 +10,7 @@ export default Component.extend(SetupMetaData, {
isDirty: false,
speciesList: null,
allCharacteristics: null,
+ deleteQueue: [],
// Actions
"on-save": null,
@@ -17,14 +18,13 @@ export default Component.extend(SetupMetaData, {
"on-update": null,
"add-characteristic": null,
"save-measurement": null,
- "delete-measurement": null,
// CPs
sortParams: ['sortOrder'],
sortedSpeciesList: sort('speciesList', 'sortParams'),
// Property mapping
- propertiesList: ['strainName', 'typeStrain', 'species', 'isolatedFrom', 'accessionNumbers', 'genbank', 'wholeGenomeSequence', 'notes'],
+ propertiesList: ['strainName', 'typeStrain', 'species', 'isolatedFrom', 'accessionNumbers', 'genbank', 'wholeGenomeSequence', 'notes', 'measurements'],
strainName: null,
typeStrain: null,
species: null,
@@ -33,6 +33,7 @@ export default Component.extend(SetupMetaData, {
genbank: null,
wholeGenomeSequence: null,
notes: null,
+ measurements: [],
resetOnInit: Ember.on('init', function() {
this.get('propertiesList').forEach((field) => {
@@ -55,7 +56,7 @@ export default Component.extend(SetupMetaData, {
actions: {
save: function() {
- return this.attrs['on-save'](this.getProperties(this.get('propertiesList')));
+ return this.attrs['on-save'](this.getProperties(this.get('propertiesList')), this.get('deleteQueue'));
},
cancel: function() {
@@ -70,8 +71,16 @@ export default Component.extend(SetupMetaData, {
return this.attrs['save-measurement'](measurement, properties);
},
- deleteMeasurement: function(measurement) {
- return this.attrs['delete-measurement'](measurement);
+ deleteMeasurement: function(value) {
+ const characteristic = value.get('characteristic');
+ if (characteristic.get('isNew')) {
+ this.get('deleteQueue').pushObject(characteristic);
+ }
+ this.get('deleteQueue').pushObject(value);
+
+ let measurements = this.get('measurements');
+ measurements.removeObject(value);
+ this.set('isDirty', true);
},
strainNameDidChange: function(value) {
From 14698d0394492c7ace0e21440c5a6e5c5284fa30 Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 1 Dec 2015 13:11:42 -0700
Subject: [PATCH 15/27] Fix up serializer for ember-data 2
---
app/serializers/application.js | 45 +++++++++++++++++++++++-----------
1 file changed, 31 insertions(+), 14 deletions(-)
diff --git a/app/serializers/application.js b/app/serializers/application.js
index d40a2bf..4a316f0 100644
--- a/app/serializers/application.js
+++ b/app/serializers/application.js
@@ -5,24 +5,41 @@ const { RESTSerializer } = DS;
const { isNone } = Ember;
export default RESTSerializer.extend({
- isNewSerializerAPI: true,
-
serializeBelongsTo: function(snapshot, json, relationship) {
- let key = relationship.key;
- const belongsTo = snapshot.belongsTo(key);
- key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo", "serialize") : key;
- json[key] = isNone(belongsTo) ? belongsTo : +belongsTo.record.id;
+ const key = relationship.key;
+ if (this._canSerialize(key)) {
+ const belongsToId = snapshot.belongsTo(key, { id: true });
+ let payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key && this.keyForRelationship) {
+ payloadKey = this.keyForRelationship(key, "belongsTo", "serialize");
+ }
+ if (isNone(belongsToId)) {
+ json[payloadKey] = null;
+ } else {
+ json[payloadKey] = +belongsToId;
+ }
+
+ if (relationship.options.polymorphic) {
+ this.serializePolymorphicType(snapshot, json, relationship);
+ }
+ }
},
serializeHasMany: function(snapshot, json, relationship) {
- let key = relationship.key;
- const hasMany = snapshot.hasMany(key);
- key = this.keyForRelationship ? this.keyForRelationship(key, "hasMany", "serialize") : key;
-
- json[key] = [];
- hasMany.forEach((item) => {
- json[key].push(+item.id);
- });
+ const key = relationship.key;
+ if (this._shouldSerializeHasMany(snapshot, key, relationship)) {
+ const hasMany = snapshot.hasMany(key, { ids: true });
+ if (hasMany !== undefined) {
+ let payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key && this.keyForRelationship) {
+ payloadKey = this.keyForRelationship(key, "hasMany", "serialize");
+ }
+ json[payloadKey] = [];
+ hasMany.forEach((item) => {
+ json[payloadKey].push(+item);
+ });
+ }
+ }
},
});
From 28111430663c157f7e253c49a0ee4f7ff247787c Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 1 Dec 2015 13:13:24 -0700
Subject: [PATCH 16/27] Queue new measurements
Still some bound attributes / coupling, but getting better
---
app/pods/protected/strains/edit/controller.js | 65 ++++++++++++++-----
app/pods/protected/strains/edit/template.hbs | 1 -
.../measurements-table-row/component.js | 13 ++--
.../strains/measurements-table/component.js | 12 ++--
.../strains/show/strain-card/template.hbs | 2 +-
.../strains/strain-form/component.js | 45 ++++++++++---
.../strains/strain-form/template.hbs | 2 +-
7 files changed, 101 insertions(+), 39 deletions(-)
diff --git a/app/pods/protected/strains/edit/controller.js b/app/pods/protected/strains/edit/controller.js
index 2591853..9685884 100644
--- a/app/pods/protected/strains/edit/controller.js
+++ b/app/pods/protected/strains/edit/controller.js
@@ -1,21 +1,61 @@
import Ember from 'ember';
-import SaveModel from '../../../../mixins/save-model';
import ajaxError from '../../../../utils/ajax-error';
-const { Controller } = Ember;
+const { Controller, RSVP } = Ember;
-export default Controller.extend(SaveModel, {
- // Required for SaveModel mixin
+export default Controller.extend({
fallbackRouteSave: 'protected.strains.show',
fallbackRouteCancel: 'protected.strains.show',
actions: {
- save: function(properties, deleteQueue) {
- deleteQueue.forEach((val) => {
- val.destroyRecord();
+ save: function(properties, deleteQueue, updateQueue) {
+ let promises = [];
+ properties.measurements.forEach((measurement) => {
+ if (measurement.get('isNew')) {
+ promises.push(measurement.save().catch(() => {
+ ajaxError(measurement.get('errors'), this.get('flashMessages'));
+ }));
+ }
});
- this._super(properties);
+ updateQueue.forEach((measurement) => {
+ promises.push(measurement.save().catch(() => {
+ ajaxError(measurement.get('errors'), this.get('flashMessages'));
+ }));
+ });
+
+ deleteQueue.forEach((measurement) => {
+ promises.push(measurement.destroyRecord().catch(() => {
+ ajaxError(measurement.get('errors'), this.get('flashMessages'));
+ }));
+ });
+
+ const model = this.get('model');
+ const fallbackRoute = this.get('fallbackRouteSave');
+
+ RSVP.all(promises).then(() => {
+ // Can't call _super inside promise :-(
+ model.setProperties(properties);
+ model.save().then((model) => {
+ this.get('flashMessages').clearMessages();
+ this.transitionToRoute(fallbackRoute, model);
+ }, () => {
+ ajaxError(model.get('errors'), this.get('flashMessages'));
+ });
+ });
+ },
+
+ cancel: function() {
+ const model = this.get('model');
+
+ model.get('errors').clear();
+ model.rollbackAttributes();
+
+ if (model.get('isNew')) {
+ this.transitionToRoute(this.get('fallbackRouteCancel'));
+ } else {
+ this.transitionToRoute(this.get('fallbackRouteCancel'), model);
+ }
},
addCharacteristic: function() {
@@ -24,14 +64,5 @@ export default Controller.extend(SaveModel, {
});
},
- saveMeasurement: function(measurement, properties) {
- measurement.setProperties(properties);
- return measurement.save().then(() => {
- this.get('flashMessages').clearMessages();
- }, () => {
- ajaxError(measurement.get('errors'), this.get('flashMessages'));
- });
- },
-
},
});
diff --git a/app/pods/protected/strains/edit/template.hbs b/app/pods/protected/strains/edit/template.hbs
index f252090..727510c 100644
--- a/app/pods/protected/strains/edit/template.hbs
+++ b/app/pods/protected/strains/edit/template.hbs
@@ -4,7 +4,6 @@
speciesList=speciesList
add-characteristic=(action "addCharacteristic")
allCharacteristics=allCharacteristics
- save-measurement=(action "saveMeasurement")
on-save=(action "save")
on-cancel=(action "cancel")
}}
diff --git a/app/pods/protected/strains/measurements-table-row/component.js b/app/pods/protected/strains/measurements-table-row/component.js
index 61a60fb..6b67968 100644
--- a/app/pods/protected/strains/measurements-table-row/component.js
+++ b/app/pods/protected/strains/measurements-table-row/component.js
@@ -11,6 +11,7 @@ export default Component.extend({
measurement: null,
isDirty: null,
isNew: false,
+ isQueued: false,
// Actions
"save-measurement": null,
@@ -33,9 +34,12 @@ export default Component.extend({
});
// Read-only attributes
this.set('isNew', this.get('measurement.isNew'));
- if (this.get('isNew')) {
+ if (this.get('isNew') && !this.get('isQueued')) {
this.set('isEditing', true);
+ } else {
+ this.set('isEditing', false);
}
+ this.set('isDirty', false);
},
updateField: function(property, value) {
@@ -54,10 +58,9 @@ export default Component.extend({
},
save: function() {
- this.attrs['save-measurement'](this.get('measurement'), this.getProperties(this.get('propertiesList'))).then(() => {
- this._resetProperties();
- this.set('isEditing', false);
- });
+ this.attrs['save-measurement'](this.get('measurement'), this.getProperties(this.get('propertiesList')));
+ this.set('isQueued', true);
+ this._resetProperties();
},
cancel: function() {
diff --git a/app/pods/protected/strains/measurements-table/component.js b/app/pods/protected/strains/measurements-table/component.js
index e4fd3a1..49734f3 100644
--- a/app/pods/protected/strains/measurements-table/component.js
+++ b/app/pods/protected/strains/measurements-table/component.js
@@ -5,7 +5,7 @@ const { sort } = computed;
export default Component.extend({
// Passed in
- strain: null,
+ measurements: null,
allCharacteristics: null,
canEdit: false,
canAdd: false,
@@ -19,15 +19,15 @@ export default Component.extend({
sortParams: ['characteristic.characteristicTypeName', 'characteristic.sortOrder', 'characteristic.characteristicName'],
sortAsc: true,
paramsChanged: false,
- sortedMeasurements: sort('strain.measurements', 'sortParams'),
- measurementsPresent: computed('strain.measurements', function() {
- return this.get('strain.measurements.length') > 0;
+ sortedMeasurements: sort('measurements', 'sortParams'),
+ measurementsPresent: computed('measurements', function() {
+ return this.get('measurements.length') > 0;
}),
actions: {
addCharacteristic: function() {
- const newChar = this.attrs['add-characteristic']();
- this.get('strain.measurements').addObject(newChar);
+ const measurement = this.attrs['add-characteristic']();
+ this.get('measurements').addObject(measurement);
},
changeSortParam: function(col) {
diff --git a/app/pods/protected/strains/show/strain-card/template.hbs b/app/pods/protected/strains/show/strain-card/template.hbs
index 517256d..968e89d 100644
--- a/app/pods/protected/strains/show/strain-card/template.hbs
+++ b/app/pods/protected/strains/show/strain-card/template.hbs
@@ -75,7 +75,7 @@
{{
protected/strains/measurements-table
- strain=strain
+ measurements=strain.measurements
canEdit=false
canAdd=false
}}
diff --git a/app/pods/protected/strains/strain-form/component.js b/app/pods/protected/strains/strain-form/component.js
index 4b1518c..006a62b 100644
--- a/app/pods/protected/strains/strain-form/component.js
+++ b/app/pods/protected/strains/strain-form/component.js
@@ -10,6 +10,7 @@ export default Component.extend(SetupMetaData, {
isDirty: false,
speciesList: null,
allCharacteristics: null,
+ updateQueue: [],
deleteQueue: [],
// Actions
@@ -17,7 +18,6 @@ export default Component.extend(SetupMetaData, {
"on-cancel": null,
"on-update": null,
"add-characteristic": null,
- "save-measurement": null,
// CPs
sortParams: ['sortOrder'],
@@ -36,13 +36,38 @@ export default Component.extend(SetupMetaData, {
measurements: [],
resetOnInit: Ember.on('init', function() {
+ this._resetProperties();
+ }),
+
+ _resetProperties: function() {
+ // Still some coupling going on here because of adding strain to measurement
+ this.get('measurements').forEach((val) => {
+ if (val.get('hasDirtyAttributes')) {
+ val.rollbackAttributes();
+ }
+ if (val.get('isNew')) {
+ this.get('strain.measurements').removeObject(val);
+ }
+ });
this.get('propertiesList').forEach((field) => {
const valueInStrain = this.get('strain').get(field);
- this.set(field, valueInStrain);
+ if (field === 'measurements') {
+ let tempArray = [];
+ valueInStrain.forEach((val) => {
+ if (!val.get('isNew')) {
+ tempArray.push(val);
+ }
+ });
+ this.set(field, tempArray);
+ } else {
+ this.set(field, valueInStrain);
+ }
});
+ this.set('updateQueue', []);
+ this.set('deleteQueue', []);
// Read-only attributes
this.set('isNew', this.get('strain.isNew'));
- }),
+ },
updateField: function(property, value) {
this.set(property, value);
@@ -56,10 +81,11 @@ export default Component.extend(SetupMetaData, {
actions: {
save: function() {
- return this.attrs['on-save'](this.getProperties(this.get('propertiesList')), this.get('deleteQueue'));
+ return this.attrs['on-save'](this.getProperties(this.get('propertiesList')), this.get('deleteQueue'), this.get('updateQueue'));
},
cancel: function() {
+ this._resetProperties();
return this.attrs['on-cancel']();
},
@@ -68,7 +94,12 @@ export default Component.extend(SetupMetaData, {
},
saveMeasurement: function(measurement, properties) {
- return this.attrs['save-measurement'](measurement, properties);
+ measurement.setProperties(properties);
+ measurement.set('strain', this.get('strain'));
+ if (!measurement.get('isNew')) {
+ this.get('updateQueue').pushObject(measurement);
+ }
+ this.set('isDirty', true);
},
deleteMeasurement: function(value) {
@@ -77,9 +108,7 @@ export default Component.extend(SetupMetaData, {
this.get('deleteQueue').pushObject(characteristic);
}
this.get('deleteQueue').pushObject(value);
-
- let measurements = this.get('measurements');
- measurements.removeObject(value);
+ this.get('measurements').removeObject(value);
this.set('isDirty', true);
},
diff --git a/app/pods/protected/strains/strain-form/template.hbs b/app/pods/protected/strains/strain-form/template.hbs
index e44096f..d1b1fb8 100644
--- a/app/pods/protected/strains/strain-form/template.hbs
+++ b/app/pods/protected/strains/strain-form/template.hbs
@@ -61,7 +61,7 @@
{{
protected/strains/measurements-table
- strain=strain
+ measurements=measurements
add-characteristic=(action "addCharacteristic")
allCharacteristics=allCharacteristics
save-measurement=(action "saveMeasurement")
From 9496de21d9accf6e7beb6bfbf6338d3d034ea510 Mon Sep 17 00:00:00 2001
From: Matthew Dillon
Date: Tue, 1 Dec 2015 19:25:29 -0700
Subject: [PATCH 17/27] Clean up characteristics dropdown
---
.../measurements-table-row/template.hbs | 4 ++-
.../strains/strain-form/component.js | 26 ++++++++++++++-----
.../strains/strain-form/template.hbs | 2 +-
3 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/app/pods/protected/strains/measurements-table-row/template.hbs b/app/pods/protected/strains/measurements-table-row/template.hbs
index 3e3fd4d..7a51e78 100644
--- a/app/pods/protected/strains/measurements-table-row/template.hbs
+++ b/app/pods/protected/strains/measurements-table-row/template.hbs
@@ -1,5 +1,7 @@
{{#if isEditing}}
- |
+
+ {{{characteristic.characteristicTypeName}}}
+ |
| | |