diff --git a/app/controllers/providers/show/repositories/new.js b/app/controllers/providers/show/repositories/new.js index 12512df3d..feab8ca5d 100644 --- a/app/controllers/providers/show/repositories/new.js +++ b/app/controllers/providers/show/repositories/new.js @@ -66,6 +66,27 @@ export default class NewController extends Controller { this.set('softwares', softwareList); } + + @action + createSoftwareOnEnter(select, e) { + if ( + e.keyCode === 13 && + select.isOpen && + !select.highlighted && + !isBlank(select.searchText) + ) { + e.preventDefault(); + const software = select.searchText; + if (!this.softwares.includes(software)) { + this.set('softwares', [...this.softwares, software]); + } + select.actions.choose(software); + this.model.repository.set('software', software); + this.set('softwares', softwareList); + return false; + } + } + @action addLanguageAction() { this.model.repository.get('language').pushObject(null); diff --git a/app/controllers/repositories/show/edit.js b/app/controllers/repositories/show/edit.js index 27ef59275..ee2a58e9c 100644 --- a/app/controllers/repositories/show/edit.js +++ b/app/controllers/repositories/show/edit.js @@ -5,6 +5,7 @@ import Controller from '@ember/controller'; import { A } from '@ember/array'; import { capitalize } from '@ember/string'; import langs from 'langs'; +import { isBlank } from '@ember/utils'; import { clientTypeList, softwareList } from 'bracco/models/repository'; @classic @@ -73,6 +74,26 @@ export default class EditController extends Controller { this.set('softwares', softwareList); } + @action + createSoftwareOnEnter(select, e) { + if ( + e.keyCode === 13 && + select.isOpen && + !select.highlighted && + !isBlank(select.searchText) + ) { + e.preventDefault(); + const software = select.searchText; + if (!this.softwares.includes(software)) { + this.set('softwares', [...this.softwares, software]); + } + select.actions.choose(software); + this.model.set('software', software); + this.set('softwares', softwareList); + return false; + } + } + @action addLanguageAction() { this.model.get('language').pushObject(null); diff --git a/app/models/repository.js b/app/models/repository.js index 7f717d164..4e533b842 100644 --- a/app/models/repository.js +++ b/app/models/repository.js @@ -33,31 +33,24 @@ export const clientTypeList = [ export const softwareList = [ 'Archipelago', - 'Cayuse', 'CKAN', + 'CSTR & DOI Registration API', 'Dataverse', 'dLibra', 'DSpace', 'EPrints', 'Ex Libris Esploro', - 'Fedora', 'Figshare', 'Invenio', - 'Islandora', - 'MyCoRe', - 'Nesstar', + 'Medad', 'Omega-PSIR', 'Omeka S', 'Open Journal Systems (OJS)', - 'OPUS', - 'Pubman', 'Pure', 'Redivis', 'RSpace', - 'Samvera', - 'SESAR', - 'Ubiquity', - 'Other' + 'Samvera Hyrax', + 'SESAR' ]; const Validations = buildValidations({ diff --git a/app/templates/providers/show/repositories/new.hbs b/app/templates/providers/show/repositories/new.hbs index 9b72a9348..217ba58e7 100644 --- a/app/templates/providers/show/repositories/new.hbs +++ b/app/templates/providers/show/repositories/new.hbs @@ -72,8 +72,8 @@ {{/if}} - - + + {{item}} diff --git a/app/templates/repositories/show/edit.hbs b/app/templates/repositories/show/edit.hbs index f4143bd61..4234b1027 100644 --- a/app/templates/repositories/show/edit.hbs +++ b/app/templates/repositories/show/edit.hbs @@ -72,8 +72,8 @@ - - + + {{item}} diff --git a/tests/unit/controllers/providers-test.js b/tests/unit/controllers/providers-test.js index a54435191..76aa6504f 100644 --- a/tests/unit/controllers/providers-test.js +++ b/tests/unit/controllers/providers-test.js @@ -12,6 +12,34 @@ module('Unit | Controller | providers', function (hooks) { assert.ok(controller); }); + test('createSoftwareOnEnter sets a custom software name', function (assert) { + let controller = this.owner.lookup( + 'controller:providers.show.repositories.new' + ); + let model = { + repository: make('repository') + }; + controller.set('model', model); + + let chosen = null; + controller.send('createSoftwareOnEnter', { + isOpen: true, + highlighted: null, + searchText: 'NADA', + actions: { + choose(value) { + chosen = value; + } + } + }, { + keyCode: 13, + preventDefault() {} + }); + + assert.equal(controller.model.repository.get('software'), 'NADA'); + assert.equal(chosen, 'NADA'); + }); + test('should list countries', function (assert) { let controller = this.owner.lookup( 'controller:providers.show.organizations.new' diff --git a/tests/unit/controllers/repositories-test.js b/tests/unit/controllers/repositories-test.js index 3e8f7b996..f05115fdd 100644 --- a/tests/unit/controllers/repositories-test.js +++ b/tests/unit/controllers/repositories-test.js @@ -16,4 +16,34 @@ module('Unit | Controller | repositories', function (hooks) { ); assert.ok(controller); }); + + test('createSoftwareOnEnter sets a custom software name', function (assert) { + let controller = this.owner.lookup('controller:repositories.show.edit'); + let model = this.owner + .lookup('service:store') + .createRecord('repository'); + controller.set('model', model); + + let chosen = null; + let preventDefaultCalled = false; + controller.send('createSoftwareOnEnter', { + isOpen: true, + highlighted: null, + searchText: 'NADA', + actions: { + choose(value) { + chosen = value; + } + } + }, { + keyCode: 13, + preventDefault() { + preventDefaultCalled = true; + } + }); + + assert.equal(model.get('software'), 'NADA'); + assert.equal(chosen, 'NADA'); + assert.true(preventDefaultCalled); + }); }); diff --git a/tests/unit/models/repository-test.js b/tests/unit/models/repository-test.js index 03c21cd5b..0b1c35dbd 100644 --- a/tests/unit/models/repository-test.js +++ b/tests/unit/models/repository-test.js @@ -2,6 +2,7 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; import { get } from '@ember/object'; import { run } from '@ember/runloop'; +import { softwareList } from 'bracco/models/repository'; module('Unit | Model | repository', function (hooks) { setupTest(hooks); @@ -13,6 +14,34 @@ module('Unit | Model | repository', function (hooks) { assert.ok(!!model); }); + test('softwareList matches supported RSP software', function (assert) { + assert.deepEqual(softwareList, [ + 'Archipelago', + 'CKAN', + 'CSTR & DOI Registration API', + 'Dataverse', + 'dLibra', + 'DSpace', + 'EPrints', + 'Ex Libris Esploro', + 'Figshare', + 'Invenio', + 'Medad', + 'Omega-PSIR', + 'Omeka S', + 'Open Journal Systems (OJS)', + 'Pure', + 'Redivis', + 'RSpace', + 'Samvera Hyrax', + 'SESAR' + ]); + assert.notOk( + softwareList.includes('Other'), + 'Other is not a suggested option' + ); + }); + test('should belong to a provider', function (assert) { const Repository = this.owner .lookup('service:store')