diff --git a/addon/components/inputs/autocomplete.js b/addon/components/inputs/autocomplete.js new file mode 100644 index 00000000..4dc6fa07 --- /dev/null +++ b/addon/components/inputs/autocomplete.js @@ -0,0 +1,21 @@ +import SelectInput from './select' +import layout from 'ember-frost-bunsen/templates/components/frost-bunsen-input-autocomplete' + +export default SelectInput.extend({ + // == Component Properties =================================================== + classNames: [ + 'frost-bunsen-input-autocomplete', + 'frost-field' + ], + + layout, + + /** + * This should be overriden by inherited inputs to convert the value to the appropriate format + * @param {String} data - value to parse + * @returns {String} parsed value + */ + parseValue (data) { + return data + } +}) diff --git a/addon/index.js b/addon/index.js index 04d2c38f..249f88d7 100644 --- a/addon/index.js +++ b/addon/index.js @@ -10,6 +10,7 @@ export {default as Form} from './components/form' export {default as InputWrapper} from './components/input-wrapper' export {default as Section} from './components/section' export {default as ValidationResult} from './components/validation-result' +import {default as Autocomplete} from './components/inputs/autocomplete' import {default as Boolean} from './components/inputs/boolean' import {default as ButtonGroup} from './components/inputs/button-group' import {default as CheckboxArray} from './components/inputs/checkbox-array' @@ -30,6 +31,7 @@ import {default as Url} from './components/inputs/url' import {default as When} from './components/inputs/when' export const Inputs = { + Autocomplete, Boolean, ButtonGroup, CheckboxArray, diff --git a/addon/templates/components/frost-bunsen-input-autocomplete.hbs b/addon/templates/components/frost-bunsen-input-autocomplete.hbs new file mode 100644 index 00000000..ca05cb9d --- /dev/null +++ b/addon/templates/components/frost-bunsen-input-autocomplete.hbs @@ -0,0 +1,53 @@ +{{#if readOnly}} + {{frost-bunsen-input-static + bunsenId=bunsenId + bunsenModel=bunsenModel + bunsenView=bunsenView + cellConfig=cellConfig + errorMessage=errorMessage + formDisabled=formDisabled + getRootProps=getRootProps + hook=hook + onChange=onChange + onError=onError + readOnly=readOnly + registerForFormValueChanges=registerForFormValueChanges + renderers=renderers + required=required + showAllErrors=showAllErrors + unregisterForFormValueChanges=unregisterForFormValueChanges + value=selectedItemLabel + }} +{{else}} + {{#if (not cellConfig.hideLabel)}} + + {{/if}} +
+ {{frost-autocomplete + class=valueClassName + data=options + disabled=disabled + error=(if renderErrorMessage true false) + hook=hook + onChange=(action 'handleChange') + onBlur=(action 'showErrorMessage') + options=selectSpreadProperties + placeholder=placeholder + width=width + selectedValue=value + }} + {{frost-bunsen-description-bubble + description=cellConfig.description + }} +
+ {{#if renderErrorMessage}} +
+ {{renderErrorMessage}} +
+ {{/if}} +{{/if}} diff --git a/addon/utils.js b/addon/utils.js index 6aa9c796..ff73d40b 100644 --- a/addon/utils.js +++ b/addon/utils.js @@ -14,6 +14,7 @@ const {keys} = Object */ export const builtInRenderers = { + autocomplete: 'frost-bunsen-input-autocomplete', boolean: 'frost-bunsen-input-boolean', 'button-group': 'frost-bunsen-input-button-group', 'checkbox-array': 'frost-bunsen-input-checkbox-array', diff --git a/app/components/frost-bunsen-input-autocomplete.js b/app/components/frost-bunsen-input-autocomplete.js new file mode 100644 index 00000000..2df7e0c5 --- /dev/null +++ b/app/components/frost-bunsen-input-autocomplete.js @@ -0,0 +1 @@ +export {default} from 'ember-frost-bunsen/components/inputs/autocomplete' diff --git a/package-lock.json b/package-lock.json index bad27d62..c7d778af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,6 +2,7 @@ "name": "ember-frost-bunsen", "version": "20.0.0", "lockfileVersion": 1, + "requires": true, "dependencies": { "@babel/code-frame": { "version": "7.0.0-beta.44", @@ -959,7 +960,7 @@ "caniuse-lite": "1.0.30000830", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "6.0.21", + "postcss": "6.0.22", "postcss-value-parser": "3.3.0" } }, @@ -2280,7 +2281,7 @@ "requires": { "autoprefixer": "7.2.6", "broccoli-persistent-filter": "1.4.3", - "postcss": "6.0.21" + "postcss": "6.0.22" } }, "broccoli-babel-transpiler": { @@ -3512,6 +3513,9 @@ "wordwrap": "0.0.2" } }, + "clockpicker-seconds": { + "version": "git://github.com/srowhani/clockpicker-seconds.git#c1fc13ac30f7982822da0ea5736ecc01a62eb680" + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -5872,7 +5876,15 @@ "dev": true }, "ember-cli-svgstore": { - "version": "github:ciena-blueplanet/ember-cli-svgstore#977df1cf58ae43b1d98a591573c3e06947744321" + "version": "github:ciena-blueplanet/ember-cli-svgstore#977df1cf58ae43b1d98a591573c3e06947744321", + "requires": { + "broccoli-funnel": "1.2.0", + "broccoli-merge-trees": "1.2.4", + "broccoli-source": "1.1.0", + "broccoli-svgstore": "0.4.2", + "make-array": "1.0.3", + "merge": "1.2.0" + } }, "ember-cli-test-info": { "version": "1.0.0", @@ -6233,9 +6245,9 @@ } }, "ember-frost-core": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ember-frost-core/-/ember-frost-core-8.1.1.tgz", - "integrity": "sha512-OUxHRoL8W8oESKnOWr62sZHVpScKMSp01dU2CiV52mD8JAaMuv1vvo2hPACi2eclrfAlGLVDgz4rUm8zeOSdDQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/ember-frost-core/-/ember-frost-core-8.2.2.tgz", + "integrity": "sha512-7AEIRmpg7zRPFa9RsbAlxjyZrnHhx9MFFuiSKpB1dyq7uwwACrlQz3pKVfDDZtZ/8v1hvwwmSeYEOpkWyswaXg==", "requires": { "broccoli-autoprefixer": "5.0.0", "broccoli-babel-transpiler": "5.7.4", @@ -6317,7 +6329,7 @@ "ember-cli-htmlbars": "1.3.4", "ember-cli-sass": "7.1.1", "ember-computed-decorators": "0.3.0", - "ember-frost-core": "8.1.1", + "ember-frost-core": "8.2.2", "ember-hook": "1.4.2", "ember-pikaday-shim": "1.0.1", "ember-prop-types": "7.0.2", @@ -6380,7 +6392,7 @@ "ember-cli-svgstore": "github:ciena-blueplanet/ember-cli-svgstore#977df1cf58ae43b1d98a591573c3e06947744321", "ember-cli-version-checker": "2.0.0", "ember-computed-decorators": "0.3.0", - "ember-frost-core": "8.1.1", + "ember-frost-core": "8.2.2", "ember-frost-popover": "10.0.0", "ember-hook": "1.4.2", "ember-prop-types": "7.0.2", @@ -6449,7 +6461,7 @@ "ember-cli-htmlbars": "1.3.4", "ember-cli-sass": "7.1.1", "ember-cli-svgstore": "github:ciena-blueplanet/ember-cli-svgstore#977df1cf58ae43b1d98a591573c3e06947744321", - "ember-frost-core": "8.1.1", + "ember-frost-core": "8.2.2", "ember-hook": "1.4.2", "ember-prop-types": "7.0.2" } @@ -6463,7 +6475,7 @@ "ember-cli-htmlbars": "1.3.4", "ember-cli-sass": "7.1.1", "ember-concurrency": "0.7.19", - "ember-frost-core": "8.1.1", + "ember-frost-core": "8.2.2", "ember-prop-types": "7.0.2" } }, @@ -6478,7 +6490,7 @@ "ember-cli-htmlbars": "1.3.4", "ember-cli-sass": "7.1.1", "ember-computed-decorators": "0.3.0", - "ember-frost-core": "8.1.1", + "ember-frost-core": "8.2.2", "ember-hook": "1.4.2", "ember-prop-types": "7.0.2", "ua-parser-js": "0.7.17" @@ -6536,7 +6548,7 @@ "ember-concurrency": "0.7.19", "ember-element-resize-detector": "0.1.5", "ember-elsewhere": "1.0.1", - "ember-frost-core": "8.1.1", + "ember-frost-core": "8.2.2", "ember-hook": "1.4.2", "ember-math-helpers": "2.0.6", "ember-prop-types": "7.0.2", @@ -13797,13 +13809,13 @@ "dev": true }, "postcss": { - "version": "6.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", - "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.1", "source-map": "0.6.1", - "supports-color": "5.3.0" + "supports-color": "5.4.0" }, "dependencies": { "ansi-styles": { @@ -13815,13 +13827,13 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "supports-color": "5.4.0" } }, "source-map": { @@ -13830,9 +13842,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { "has-flag": "3.0.0" } @@ -17788,4 +17800,4 @@ } } } -} \ No newline at end of file +} diff --git a/testem.js b/testem.js index 3f7838d3..35322a06 100644 --- a/testem.js +++ b/testem.js @@ -1,5 +1,4 @@ /* eslint-env node */ -const Reporter = require('ember-test-utils/reporter') module.exports = { disable_watching: true, @@ -11,6 +10,5 @@ module.exports = { launch_in_dev: [ 'Chrome' ], - reporter: new Reporter(), test_page: 'tests/index.html?hidepassed' } diff --git a/tests/dummy/app/pods/view/renderers/documentation/autocomplete.md b/tests/dummy/app/pods/view/renderers/documentation/autocomplete.md new file mode 100644 index 00000000..9518ecab --- /dev/null +++ b/tests/dummy/app/pods/view/renderers/documentation/autocomplete.md @@ -0,0 +1,41 @@ +## autocomplete + +This renderer provides an autocomplete input which suggests options to be selected. This renderer is meant to be an alternative to select. +This has a look and feel very familiar with typical autocomplete. However, like select, this requires an option to be selected. This is because both select and autocomplete require a label and value (which typically is some internal id). This isn't just a free form text input where the selections are optional, an item must be selected. + +Here is an example of what this isn't ideal for (at least the current iteration of autocomplete): + +Searching for a name for your pet. Perhaps this pet will get a name never been given before. This new never been used name most likely isn't an option in the dropdown and therefore could not be used with this renderer. + +What this is ideal for: + +Your home is incredibly sophisticated and you are trying to locate your pet. Type in the pet's name into the locator, select the pet item, and run the locate function on your pet. + +The API is identical to Select. Except for the following: + + +Please refer to +Select Renderer +for documentation + +Due to the behavior of this renderer, the label (the part the user sees) and the value (internal id) are disconnected. Like select, a selectedValue (of a string) can be configured for it's initial value. +Unlike select though, this will be internal only and will not produce a label. + +To specify a starting label, the following spread option should be used: + +```js +{ + model: 'foo', + renderer: { + name: 'autocomplete', + options: { + debounceInterval: 300, + filter: 'Gadnuk', + selectedValue: 'pet_5' + } + } +} +``` \ No newline at end of file diff --git a/tests/dummy/app/pods/view/renderers/models/autocomplete.js b/tests/dummy/app/pods/view/renderers/models/autocomplete.js new file mode 100644 index 00000000..1fcf6f73 --- /dev/null +++ b/tests/dummy/app/pods/view/renderers/models/autocomplete.js @@ -0,0 +1,14 @@ +export default { + properties: { + queryWithCountries: { + type: 'string', + modelType: 'country', + valueAttribute: 'id', + labelAttribute: 'name', + query: { + p: 'name:$filter' + } + } + }, + type: 'object' +} diff --git a/tests/dummy/app/pods/view/renderers/models/index.js b/tests/dummy/app/pods/view/renderers/models/index.js index 8cdf5469..5b493c5d 100644 --- a/tests/dummy/app/pods/view/renderers/models/index.js +++ b/tests/dummy/app/pods/view/renderers/models/index.js @@ -1,3 +1,4 @@ +import autocomplete from './autocomplete' import boolean from './boolean' import buttonGroup from './button-group' import checkboxArray from './checkbox-array' @@ -21,6 +22,7 @@ import when from './when' export default { boolean, + autocomplete, 'button-group': buttonGroup, 'checkbox-array': checkboxArray, date, diff --git a/tests/dummy/app/pods/view/renderers/views/autocomplete.js b/tests/dummy/app/pods/view/renderers/views/autocomplete.js new file mode 100644 index 00000000..cc1ac7ea --- /dev/null +++ b/tests/dummy/app/pods/view/renderers/views/autocomplete.js @@ -0,0 +1,21 @@ +export default { + cells: [ + { + children: [ + { + label: 'Country', + model: 'queryWithCountries', + renderer: { + name: 'autocomplete', + options: { + debounceInterval: 300 + } + }, + placeholder: 'Type a country name' + } + ] + } + ], + type: 'form', + version: '2.0' +} diff --git a/tests/dummy/app/pods/view/renderers/views/index.js b/tests/dummy/app/pods/view/renderers/views/index.js index 8cdf5469..5b493c5d 100644 --- a/tests/dummy/app/pods/view/renderers/views/index.js +++ b/tests/dummy/app/pods/view/renderers/views/index.js @@ -1,3 +1,4 @@ +import autocomplete from './autocomplete' import boolean from './boolean' import buttonGroup from './button-group' import checkboxArray from './checkbox-array' @@ -21,6 +22,7 @@ import when from './when' export default { boolean, + autocomplete, 'button-group': buttonGroup, 'checkbox-array': checkboxArray, date, diff --git a/tests/dummy/mirage/data/models/autocomplete.js b/tests/dummy/mirage/data/models/autocomplete.js new file mode 100644 index 00000000..0748efcf --- /dev/null +++ b/tests/dummy/mirage/data/models/autocomplete.js @@ -0,0 +1,15 @@ +export default { + type: 'object', + properties: { + queryExampleWithCountries: { + type: 'string', + modelType: 'country', + valueAttribute: 'id', + labelAttribute: 'name', + query: { + p: 'name:$filter' + } + } + }, + required: ['queryExampleWithCountries'] +} diff --git a/tests/dummy/mirage/data/models/index.js b/tests/dummy/mirage/data/models/index.js index f982545d..1f84f608 100644 --- a/tests/dummy/mirage/data/models/index.js +++ b/tests/dummy/mirage/data/models/index.js @@ -1,6 +1,7 @@ import array from './array' import array2 from './array-2' import arrayWithDefaults from './array-with-defaults' +import autocomplete from './autocomplete' import complex from './complex' import complexConditionalProperties from './complex-conditional-properties' import conditionalProperties from './conditional-properties' @@ -20,6 +21,7 @@ export default { array, array2, arrayWithDefaults, + autocomplete, complex, complexConditionalProperties, conditionalProperties, diff --git a/tests/dummy/mirage/data/views/autocomplete.js b/tests/dummy/mirage/data/views/autocomplete.js new file mode 100644 index 00000000..5a51701e --- /dev/null +++ b/tests/dummy/mirage/data/views/autocomplete.js @@ -0,0 +1,25 @@ +export default { + version: '2.0', + type: 'form', + cells: [ + { + extends: 'main' + } + ], + cellDefinitions: { + main: { + children: [ + { + label: 'Autocomplete with countries', + model: 'queryExampleWithCountries', + renderer: { + name: 'autocomplete', + options: { + debounceInterval: 300 + } + } + } + ] + } + } +} diff --git a/tests/dummy/mirage/data/views/index.js b/tests/dummy/mirage/data/views/index.js index 3b8026d8..1cd3c095 100644 --- a/tests/dummy/mirage/data/views/index.js +++ b/tests/dummy/mirage/data/views/index.js @@ -8,6 +8,7 @@ import arrayIndexed2 from './array-indexed-2' import arrayInline from './array-inline' import arraySortable from './array-sortable' import arrayTabs from './array-tabs' +import autocomplete from './autocomplete' import complex from './complex' import complexConditionalPropSelectForm from './complex-conditional-prop-select-form' import conditionalPropSelectForm from './conditional-prop-select-form' @@ -38,6 +39,7 @@ export default { arrayInline, arraySortable, arrayTabs, + autocomplete, complex, complexConditionalPropSelectForm, conditionalPropSelectForm, diff --git a/tests/dummy/mirage/fixtures/model.js b/tests/dummy/mirage/fixtures/model.js index c2255504..def52111 100644 --- a/tests/dummy/mirage/fixtures/model.js +++ b/tests/dummy/mirage/fixtures/model.js @@ -16,6 +16,11 @@ export default [ label: 'Array with Defaults', model: models.arrayWithDefaults }, + { + id: 'autocomplete', + label: 'Autocomplete', + model: models.autocomplete + }, { id: 'complex', label: 'Complex', diff --git a/tests/dummy/mirage/fixtures/view.js b/tests/dummy/mirage/fixtures/view.js index 20eeacef..ca6bf463 100644 --- a/tests/dummy/mirage/fixtures/view.js +++ b/tests/dummy/mirage/fixtures/view.js @@ -61,6 +61,12 @@ export default [ modelIds: ['array'], view: views.arrayTabs }, + { + id: 'autocomplete', + label: 'Autocomplete', + modelIds: ['autocomplete'], + view: views.autocomplete + }, { id: 'complex', label: 'Complex', diff --git a/tests/integration/components/frost-bunsen-form/renderers/autocomplete-test.js b/tests/integration/components/frost-bunsen-form/renderers/autocomplete-test.js new file mode 100644 index 00000000..90ff39d9 --- /dev/null +++ b/tests/integration/components/frost-bunsen-form/renderers/autocomplete-test.js @@ -0,0 +1,112 @@ +import {expect} from 'chai' +import {$hook} from 'ember-hook' +import {setupComponentTest} from 'ember-mocha' +import wait from 'ember-test-helpers/wait' +import hbs from 'htmlbars-inline-precompile' +import {afterEach, beforeEach, describe, it} from 'mocha' +import sinon from 'sinon' + +function getHook (hook, model) { + return `${hook}-${model}` +} + +describe('Integration: Component / frost-bunsen-form / renderer / autocomplete', function () { + setupComponentTest('frost-bunsen-form', { + integration: true + }) + + const bunsenModel = { + properties: { + cookies: { + enum: [ + 'Chocolate', + 'Peanut Butter', + 'Oatmeal', + 'Oreo' + ], + type: 'string' + } + }, + type: 'object' + } + + const bunsenView = { + cells: [ + { + children: [ + { + label: 'Cookie', + model: 'cookies', + renderer: { + name: 'autocomplete' + }, + placeholder: 'Type o' + } + ] + } + ], + type: 'form', + version: '2.0' + } + + let sandbox, onChange + const hook = 'autocompleteTest' + + beforeEach(function () { + sandbox = sinon.sandbox.create() + onChange = sandbox.spy() + + this.setProperties({ + bunsenModel, + bunsenView, + onChange, + hook + }) + + this.render(hbs` + {{frost-bunsen-form + bunsenModel=bunsenModel + bunsenView=bunsenView + hook=hook + onChange=onChange + }} + `) + return wait() + }) + + afterEach(function () { + sandbox.restore() + }) + + it('should render', function () { + expect($hook(getHook(hook, 'cookies') + '-autocompleteText-input').length).to.equal(1) + }) + + describe('enter input', function () { + const testHook = getHook(hook, 'cookies') + beforeEach(function () { + onChange.reset() + $hook(`${testHook}-autocompleteText-input`).val('O').trigger('input').trigger('keypress') + return wait() + }) + + describe('select an item', function () { + let dropdownValue + + beforeEach(function () { + const element = $hook(`${testHook}-autocompleteDropdown-item`, {index: 1}) + dropdownValue = element.text().trim() + element.trigger('mousedown') + return wait() + }) + + it('should have correct value chosen for input', function () { + expect($hook(`${testHook}-autocompleteText-input`)[0].value).to.equal(dropdownValue) + }) + it('should have received onChange', function () { + expect(onChange.callCount, 'onChange is not called').to.equal(1) + expect(onChange.args[0][0].cookies, 'onChange argument values are wrong').to.equal(dropdownValue) + }) + }) + }) +}) diff --git a/tests/unit/components/inputs/autocomplete-test.js b/tests/unit/components/inputs/autocomplete-test.js new file mode 100644 index 00000000..7298ae1c --- /dev/null +++ b/tests/unit/components/inputs/autocomplete-test.js @@ -0,0 +1,38 @@ +import {expect} from 'chai' +import Ember from 'ember' +import {setupComponentTest} from 'ember-mocha' +import {afterEach, beforeEach, describe, it} from 'mocha' +import sinon from 'sinon' + +describe('Unit: frost-bunsen-input-autocomplete', function () { + setupComponentTest('frost-bunsen-input-autocomplete', { + unit: true, + needs: ['service:ajax'] + }) + + let component, sandbox + + beforeEach(function () { + sandbox = sinon.sandbox.create() + component = this.subject({ + bunsenId: 'name', + bunsenModel: {}, + bunsenView: {}, + cellConfig: {}, + onChange () {}, + onError () {}, + registerForFormValueChanges () {}, + state: Ember.Object.create({}) + }) + }) + + afterEach(function () { + sandbox.restore() + }) + + it('should parseValue correctly', function () { + const data = 'data' + const parsedData = component.parseValue(data) + expect(parsedData).to.equal(data) + }) +}) diff --git a/tests/unit/index-test.js b/tests/unit/index-test.js index 5caaf7dd..e9ffd8e0 100644 --- a/tests/unit/index-test.js +++ b/tests/unit/index-test.js @@ -27,6 +27,7 @@ import {default as Error} from 'ember-frost-bunsen/components/error' import {default as Form} from 'ember-frost-bunsen/components/form' import {default as InputWrapper} from 'ember-frost-bunsen/components/input-wrapper' import {default as AbstractInput} from 'ember-frost-bunsen/components/inputs/abstract-input' +import {default as AutocompleteInput} from 'ember-frost-bunsen/components/inputs/autocomplete' import {default as BooleanInput} from 'ember-frost-bunsen/components/inputs/boolean' import {default as ButtonGroupInput} from 'ember-frost-bunsen/components/inputs/button-group' import {default as CheckboxArrayInput} from 'ember-frost-bunsen/components/inputs/checkbox-array' @@ -139,6 +140,10 @@ describe('Unit: ember-frost-bunsen', function () { expect(SelectInput).to.equal(Inputs.Select) }) + it('exports AutocompleteInput', function () { + expect(AutocompleteInput).to.equals(Inputs.Autocomplete) + }) + it('exports StaticInput', function () { expect(StaticInput).to.equal(Inputs.Static) })