From ff5f5cf845d2ac8fe13b844b3234a6465110ad13 Mon Sep 17 00:00:00 2001 From: Jim O'Donnell Date: Tue, 29 Sep 2020 15:15:17 +0100 Subject: [PATCH 1/2] Add an adapter for simple dropdown tasks This adds an adapter (and tests) for the simple dropdown task, so that we can test it out in staging. Dropdown tasks are converted to simple dropdown tasks if they contain only one select menu. More complex tasks are not transformed, and should throw an error in the classifier. --- .../models/SimpleDropdownTask.js | 4 + .../models/helpers/index.js | 1 + .../models/helpers/panoptesAdapter/index.js | 1 + .../panoptesAdapter/panoptesAdapter.js | 16 ++++ .../panoptesAdapter/panoptesAdapter.spec.js | 79 +++++++++++++++++++ packages/lib-classifier/src/store/Step.js | 9 ++- 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/index.js create mode 100644 packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/index.js create mode 100644 packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.js create mode 100644 packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.spec.js diff --git a/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/SimpleDropdownTask.js b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/SimpleDropdownTask.js index 3ac0706799..416901d637 100644 --- a/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/SimpleDropdownTask.js +++ b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/SimpleDropdownTask.js @@ -1,5 +1,6 @@ import cuid from 'cuid' import { types } from 'mobx-state-tree' +import { panoptesAdapter } from './helpers' import Task from '../../models/Task' import SimpleDropdownAnnotation from './SimpleDropdownAnnotation' @@ -14,6 +15,9 @@ const SimpleDropdown = types.model('SimpleDropdown', { options: types.array(types.string), type: types.literal('dropdown-simple'), }) + .preProcessSnapshot(snapshot => { + return panoptesAdapter(snapshot) + }) .views(self => ({ get defaultAnnotation () { return SimpleDropdownAnnotation.create({ diff --git a/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/index.js b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/index.js new file mode 100644 index 0000000000..2e74b2f1d0 --- /dev/null +++ b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/index.js @@ -0,0 +1 @@ +export { panoptesAdapter } from './panoptesAdapter' diff --git a/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/index.js b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/index.js new file mode 100644 index 0000000000..2e74b2f1d0 --- /dev/null +++ b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/index.js @@ -0,0 +1 @@ +export { panoptesAdapter } from './panoptesAdapter' diff --git a/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.js b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.js new file mode 100644 index 0000000000..051530c05d --- /dev/null +++ b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.js @@ -0,0 +1,16 @@ +export function panoptesAdapter(snapshot) { + const newSnapshot = {} + const { selects } = snapshot + if (selects?.length === 1) { + const menu = selects[0] + newSnapshot.allowCreate = menu.allowCreate + newSnapshot.help = snapshot.help + newSnapshot.instruction = snapshot.instruction + newSnapshot.taskKey = snapshot.taskKey + newSnapshot.type = 'dropdown-simple' + const options = menu.options['*'] + newSnapshot.options = options.map(option => option.label) + return newSnapshot + } + return snapshot +} \ No newline at end of file diff --git a/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.spec.js b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.spec.js new file mode 100644 index 0000000000..6cb55cc420 --- /dev/null +++ b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.spec.js @@ -0,0 +1,79 @@ +import { panoptesAdapter } from './' + +describe('SimpleDropdownTask > panoptesAdapter', function () { + + describe('with a single menu', function () { + let originalTask + + before(function () { + originalTask = { + taskKey: 'T0', + type: 'dropdown', + help: 'This is some task help', + instruction: 'This is the task instruction', + selects: [ + { + allowCreate: false, + options: { + '*': [ + { label: 'One', value: 1 }, + { label: 'Two', value: 2 } + ] + }, + title: 'Test dropdown' + } + ] + } + }) + + it('should return a simple dropdown task', function () { + expect(panoptesAdapter(originalTask)).to.deep.equal({ + allowCreate: false, + taskKey: 'T0', + type: 'dropdown-simple', + help: 'This is some task help', + instruction: 'This is the task instruction', + options: [ 'One', 'Two' ] + }) + }) + }) + + describe('with a complex dropdown task', function () { + let originalTask + + before(function () { + originalTask = { + taskKey: 'T0', + type: 'dropdown', + help: 'This is some task help', + instruction: 'This is the task instruction', + selects: [ + { + allowCreate: false, + options: { + '*': [ + { label: 'One', value: 1 }, + { label: 'Two', value: 2 } + ] + }, + title: 'Numbers' + }, + { + allowCreate: false, + options: { + '*': [ + { label: 'Red', value: 1 }, + { label: 'Blue', value: 2 } + ] + }, + title: 'Colours' + } + ] + } + }) + + it('should return the original task', function () { + expect(panoptesAdapter(originalTask)).to.equal(originalTask) + }) + }) +}) \ No newline at end of file diff --git a/packages/lib-classifier/src/store/Step.js b/packages/lib-classifier/src/store/Step.js index 31982f4019..8f6c729e61 100644 --- a/packages/lib-classifier/src/store/Step.js +++ b/packages/lib-classifier/src/store/Step.js @@ -2,7 +2,14 @@ import { types } from 'mobx-state-tree' import taskRegistry, { taskModels } from '@plugins/tasks' function taskDispatcher (snapshot) { - return taskRegistry.get(snapshot.type).TaskModel + switch (snapshot.type) { + case 'dropdown': { + return taskRegistry.get('dropdown-simple').TaskModel + } + default: { + return taskRegistry.get(snapshot.type).TaskModel + } + } } const GenericTask = types.union({ dispatcher: taskDispatcher }, ...taskModels) From 2374ce67dd7f1953188533ba6a446ce377cbb96d Mon Sep 17 00:00:00 2001 From: Jim O'Donnell Date: Wed, 30 Sep 2020 17:12:02 +0100 Subject: [PATCH 2/2] Add a test for simple dropdown tasks Simple dropdowns should not be changed by the adapter. --- .../panoptesAdapter/panoptesAdapter.spec.js | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.spec.js b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.spec.js index 6cb55cc420..2f155ed49a 100644 --- a/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.spec.js +++ b/packages/lib-classifier/src/plugins/tasks/SimpleDropdownTask/models/helpers/panoptesAdapter/panoptesAdapter.spec.js @@ -2,7 +2,26 @@ import { panoptesAdapter } from './' describe('SimpleDropdownTask > panoptesAdapter', function () { - describe('with a single menu', function () { + describe('with a simple dropdown task', function () { + let originalTask + + before(function () { + originalTask = { + allowCreate: false, + taskKey: 'T0', + type: 'dropdown-simple', + help: 'This is some task help', + instruction: 'This is the task instruction', + options: [ 'One', 'Two' ] + } + }) + + it('should return the task unchanged', function () { + expect(panoptesAdapter(originalTask)).to.equal(originalTask) + }) + }) + + describe('with a single dropdown menu', function () { let originalTask before(function () {