+
+ {{ selectedText }}
+ {{ placeholder }}
+
+
+
+
+
+
diff --git a/src/index.js b/src/index.js
index 7d72bc7d87a2f384c21036aa5350c088ffb57e68..ba180d30ee65b92668a1846c9a284cb5b59074ae 100644
--- a/src/index.js
+++ b/src/index.js
@@ -5,6 +5,7 @@ import {
Popup,
TimePicker,
CascadePicker,
+ Select,
Dialog,
Tip,
Toast,
@@ -33,6 +34,7 @@ function install(Vue) {
Button,
TimePicker,
CascadePicker,
+ Select,
Dialog,
Tip,
Toast,
diff --git a/src/module.js b/src/module.js
index cd80f562a986fdc7342d405cbe49905d6662e3eb..7f8d60dc892bd13e5da69473d91fa7028346a6b4 100644
--- a/src/module.js
+++ b/src/module.js
@@ -9,6 +9,7 @@ import Dialog from './modules/dialog'
import Toast from './modules/toast'
import Input from './modules/input'
import Validator from './modules/validator'
+import Select from './modules/select'
import Textarea from './modules/textarea'
import Rate from './modules/rate'
@@ -39,6 +40,7 @@ export {
Picker,
TimePicker,
CascadePicker,
+ Select,
Dialog,
Tip,
Toast,
diff --git a/src/modules/select/index.js b/src/modules/select/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe0a9cd34cbd0c1d194161375dce314c54e4c173
--- /dev/null
+++ b/src/modules/select/index.js
@@ -0,0 +1,13 @@
+import Picker from '../../components/picker/picker.vue'
+import Select from '../../components/select/select.vue'
+import addPicker from '../picker/api'
+
+Select.install = function (Vue) {
+ Vue.component(Picker.name, Picker)
+ Vue.component(Select.name, Select)
+ addPicker(Vue, Picker)
+}
+
+Select.Picker = Picker
+
+export default Select
diff --git a/test/unit/index.js b/test/unit/index.js
index ee0f7ca0f82c4db29d5a6168c3f5b56c06ac07ac..92b6593199b280f3d54ba749c2885788ab95e8ba 100644
--- a/test/unit/index.js
+++ b/test/unit/index.js
@@ -1,5 +1,6 @@
import Vue from 'vue'
import 'basic-mouse-event-polyfill-phantomjs'
+import 'phantomjs-polyfill-find-index'
Vue.config.productionTip = false
diff --git a/test/unit/karma.conf.js b/test/unit/karma.conf.js
index d93b4ac541f80c5d3bfed66352efc196bc0596dd..a3440b80515f8034098ce734267a6a76d0d2083c 100644
--- a/test/unit/karma.conf.js
+++ b/test/unit/karma.conf.js
@@ -25,7 +25,9 @@ module.exports = function (config) {
},
frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'],
reporters: ['spec', 'coverage'],
- files: ['./index.js'],
+ files: [
+ './index.js'
+ ],
preprocessors: {
'./index.js': ['webpack', 'sourcemap']
},
diff --git a/test/unit/specs/select.spec.js b/test/unit/specs/select.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..f6624e4011a80bfc85f0966bd29d25500e779e97
--- /dev/null
+++ b/test/unit/specs/select.spec.js
@@ -0,0 +1,61 @@
+import Vue from 'vue2'
+import Select from '@/modules/select'
+import instantiateComponent from '@/common/helpers/instantiate-component'
+
+describe('Select.vue', () => {
+ let vm
+ afterEach(() => {
+ if (vm) {
+ vm.$parent.destroy()
+ vm = null
+ }
+ })
+
+ it('use', () => {
+ Vue.use(Select)
+ expect(Vue.component(Select.name))
+ .to.be.a('function')
+ })
+
+ it('should render correct contents', () => {
+ vm = createSelect({
+ value: 2016,
+ options: [2013, 2014, 2015, 2016, 2017, 2018]
+ })
+ const el = vm.$el
+ expect(el.querySelector('.cube-select-text').textContent.trim())
+ .to.equal('2016')
+ })
+
+ it('should trigger events', function (done) {
+ this.timeout(10000)
+
+ const changeHandle = sinon.spy()
+ vm = createSelect({
+ value: 2016,
+ options: [2013, 2014, 2015, 2016, 2017, 2018]
+ }, {
+ change: changeHandle
+ })
+ const el = vm.$el
+ el.click()
+
+ setTimeout(() => {
+ vm.picker.scrollTo(0, 1)
+ setTimeout(() => {
+ const confirmBtn = document.querySelector('.cube-picker-choose [data-action="confirm"]')
+ confirmBtn.click()
+ expect(changeHandle)
+ .to.be.callCount(1)
+ done()
+ }, 1000)
+ }, 100)
+ })
+})
+
+function createSelect (props = {}, events = {}) {
+ return instantiateComponent(Vue, Select, {
+ props: props,
+ on: events
+ })
+}