diff --git a/app/components/collection/create-container.js b/app/components/collection/create-container.js index eeb6156..ca1138b 100644 --- a/app/components/collection/create-container.js +++ b/app/components/collection/create-container.js @@ -1,7 +1,11 @@ +import { getProperties, set } from '@ember/object'; import Component from '@ember/component'; import { inject as service } from '@ember/service'; +import { debounce } from '@ember/runloop'; +import RSVP from 'rsvp'; import Changeset from 'ember-changeset'; import lookupValidator from 'ember-changeset-validations'; +import config from 'ccdb-web/config/environment'; export default Component.extend({ store: service(), @@ -33,6 +37,7 @@ export default Component.extend({ }); this.set('changesets', changesets); + this.set('newStudyLocationAdmin', `${config.APP.API_HOST}/admin/locations/studylocation/add/`); }, actions: { @@ -55,8 +60,34 @@ export default Component.extend({ changesets['hasMany'][relatedName].removeObject(changesetRecord); }, + // Gross, this side-effects by saving immediately. Someday I should clean + // this up, but for now, you have been warned. + addOption(relatedModelName, optionName, collectionAttrName, relatedAttrName, term) { + const props = getProperties(this, 'store', 'options', 'changesets'); + const { store, options, changesets: { model } } = props; + let payload = {}; + payload[relatedAttrName] = term; + const record = store.createRecord(relatedModelName, payload) + record.save().then((record) => { + set(options, optionName, store.peekAll(relatedModelName)); + set(model, collectionAttrName, record); + }); + }, + updateDatasheet(changeset, event) { changeset.set('datasheet', event.target.files[0]); }, + + searchStudyLocation(term) { + return new RSVP.Promise((resolve, reject) => { + debounce(this, this._performSearch, 'study-location', { page_size: 500, code: term }, resolve, reject, 400); + }); + }, + }, + + _performSearch(model, payload, resolve, reject) { + this.get('store').query(model, payload).then((results) => { + resolve(results); + }, reject); }, }); diff --git a/app/routes/collections/create.js b/app/routes/collections/create.js index 885e042..4c0ba55 100644 --- a/app/routes/collections/create.js +++ b/app/routes/collections/create.js @@ -7,7 +7,7 @@ export default Route.extend({ return RSVP.hash({ model: store.createRecord('collection'), projectOptions: store.findAll('project'), - studyLocationOptions: store.findAll('study-location'), + studyLocationOptions: store.query('study-location', { page_size: 500 }), collectionTypeOptions: store.findAll('collection-type'), collectionMethodOptions: store.findAll('collection-method'), speciesOptions: store.query('species', { page_size: 500 }), diff --git a/app/routes/collections/detail/edit.js b/app/routes/collections/detail/edit.js index fdf00c9..21a6bd4 100644 --- a/app/routes/collections/detail/edit.js +++ b/app/routes/collections/detail/edit.js @@ -8,7 +8,7 @@ export default Route.extend({ return RSVP.hash({ model: model, projectOptions: store.findAll('project'), - studyLocationOptions: store.findAll('study-location'), + studyLocationOptions: store.query('study-location', { page_size: 500 }), collectionTypeOptions: store.findAll('collection-type'), collectionMethodOptions: store.findAll('collection-method'), speciesOptions: store.query('species', { page_size: 500 }), diff --git a/app/routes/collections/index.js b/app/routes/collections/index.js index 44c45b5..00f12e2 100644 --- a/app/routes/collections/index.js +++ b/app/routes/collections/index.js @@ -29,7 +29,7 @@ export default Route.extend({ projectOptions: store.findAll('project'), regionOptions: store.findAll('region'), siteOptions: store.findAll('site'), - studyLocationOptions: store.findAll('study-location'), + studyLocationOptions: store.query('study-location', { page_size: 500 }), collectionMethodOptions: store.findAll('collection-method'), adfgPermitOptions: store.findAll('adfg-permit'), speciesOptions: store.query('species', { page_size: 500 }), diff --git a/app/templates/components/collection/create-container.hbs b/app/templates/components/collection/create-container.hbs index 0167738..720a3d6 100644 --- a/app/templates/components/collection/create-container.hbs +++ b/app/templates/components/collection/create-container.hbs @@ -21,27 +21,33 @@ {{/validated-field}} {{#validated-field property='adfgPermit' label='ADFG Permit' changeset=changeset}} - {{#power-select + {{#power-select-with-create options=options.adfgPermits selected=changeset.adfgPermit onchange=(action (mut changeset.adfgPermit)) + oncreate=(action 'addOption' 'adfg-permit' 'adfgPermits' 'adfgPermit' 'name') searchField='name' - as |adfgPermit| + as |adfgPermit term| }} {{adfgPermit.name}} - {{/power-select}} + {{/power-select-with-create}} {{/validated-field}} - {{#validated-field property='studyLocation' label='Study location' changeset=changeset}} - {{#power-select - options=options.studyLocations - selected=changeset.studyLocation - onchange=(action (mut changeset.studyLocation)) - searchField='name' - as |studyLocation| - }} - {{studyLocation.name}} - {{/power-select}} + {{#validated-field property='studyLocation' changeset=changeset}} + + {{#power-select + search=(action 'searchStudyLocation') + options=options.studyLocations + selected=changeset.studyLocation + onchange=(action (mut changeset.studyLocation)) + searchField='code' + as |studyLocation| + }} + {{studyLocation.code}} + {{/power-select}} {{/validated-field}} {{#validated-field property='collectionType' label='Collection type' changeset=changeset}} diff --git a/package.json b/package.json index 9617213..ce59058 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "ember-moment": "7.3.1", "ember-pikaday": "^2.2.3", "ember-power-select": "^1.8.5", - "ember-power-select-with-create": "0.4.3", + "ember-power-select-with-create": "^0.4.3", "ember-resolver": "^4.0.0", "ember-responsive": "^2.0.4", "ember-simple-auth": "1.4.0",