diff --git a/ui/jstests/test-learning-resource.jsx b/ui/jstests/test-learning-resource.jsx index 888c1ee1..e43bf956 100644 --- a/ui/jstests/test-learning-resource.jsx +++ b/ui/jstests/test-learning-resource.jsx @@ -123,13 +123,11 @@ define(['QUnit', 'jquery', 'learning_resources', 'reactaddons', // two terms var $termsSelect = $vocabSelect.find("option"); - assert.equal($termsSelect.size(), 3); - assert.equal($termsSelect[0].text, ""); - assert.equal($termsSelect[0].value, ""); - assert.equal($termsSelect[1].text, "easy"); - assert.equal($termsSelect[1].value, "easy"); - assert.equal($termsSelect[2].text, "hard"); - assert.equal($termsSelect[2].value, "hard"); + assert.equal($termsSelect.size(), 2); + assert.equal($termsSelect[0].text, "easy"); + assert.equal($termsSelect[0].value, "easy"); + assert.equal($termsSelect[1].text, "hard"); + assert.equal($termsSelect[1].value, "hard"); done(); }; @@ -158,10 +156,9 @@ define(['QUnit', 'jquery', 'learning_resources', 'reactaddons', // two terms, first vocab var $terms1Select = $($vocabSelect[0]).find("option"); - assert.equal($terms1Select.size(), 3); - assert.equal($terms1Select[0].selected, true); - assert.equal($terms1Select[1].selected, false); - assert.equal($terms1Select[2].selected, false); + assert.equal($terms1Select.size(), 2); + assert.equal($terms1Select[0].selected, false); + assert.equal($terms1Select[0].selected, false); // TestUtils.Simulate.change only simulates a change event, // we need to update the value first ourselves @@ -169,14 +166,12 @@ define(['QUnit', 'jquery', 'learning_resources', 'reactaddons', React.addons.TestUtils.Simulate.change($vocabSelect[0]); component.forceUpdate(function() { assert.equal($terms1Select[0].selected, false); - assert.equal($terms1Select[1].selected, false); - assert.equal($terms1Select[2].selected, true); + assert.equal($terms1Select[1].selected, true); // make sure second vocab (which has a default value) is set properly var $terms2Select = $($vocabSelect[1]).find("option"); - assert.equal($terms2Select.size(), 2); - assert.equal($terms2Select[0].selected, false); - assert.equal($terms2Select[1].selected, true); + assert.equal($terms2Select.size(), 1); + assert.equal($terms2Select[0].selected, true); done(); }); diff --git a/ui/static/ui/js/learning_resources.jsx b/ui/static/ui/js/learning_resources.jsx index 73b6aa7c..25b2003e 100644 --- a/ui/static/ui/js/learning_resources.jsx +++ b/ui/static/ui/js/learning_resources.jsx @@ -1,34 +1,63 @@ define('learning_resources', [ - 'reactaddons', 'jquery', 'lodash', 'utils'], function ( + 'reactaddons', 'jquery', 'lodash', 'utils', 'select2'], function ( React, $, _, Utils) { 'use strict'; var StatusBox = Utils.StatusBox; var VocabularyOption = React.createClass({ - render: function () { + applySelect2: function () { + //this function can be used only if the component has been mounted var options = _.map(this.props.terms, function (term) { - return ; + return { + id: term.slug, + text: term.label + }; }); - + var thiz = this; + var isMultiTerms = this.props.vocabulary.multi_terms; + //not allowing the clear for the multi terms dropdown + var allowClear = !isMultiTerms; + //apply select2 to the right elements + $(React.findDOMNode(this)).find('select').select2({ + multiple: isMultiTerms, + data: options, + placeholder: "Select a value for " + this.props.vocabulary.name, + allowClear: allowClear, + theme: "bootstrap", + }) + .val(this.props.selectedTerms) + .trigger('change') + .on('change', function () { + var selectValues = [].concat($(this).val()); + //if there are single select dropdowns, .val() can return null + selectValues = _.filter(selectValues, function(value) { + return value !== null; + }); + thiz.props.updateTerms(thiz.props.vocabulary.slug, selectValues); + }); + }, + render: function () { return