diff --git a/dev.html b/dev.html index 5e9f51d..8425919 100644 --- a/dev.html +++ b/dev.html @@ -31,6 +31,7 @@
+ diff --git a/src/components/Select.vue b/src/components/Select.vue index 4d7ed22..c9d304b 100644 --- a/src/components/Select.vue +++ b/src/components/Select.vue @@ -115,6 +115,18 @@ float: left; line-height: 24px; } + .v-select.single .selected-tag { + background-color: transparent; + border-color: transparent; + } + .v-select.single.open .selected-tag { + position: absolute; + opacity: .5; + } + .v-select.single.open.searching .selected-tag, + .v-select.single.loading .selected-tag { + display: none; + } .v-select .selected-tag .close { float: none; margin-right: 0; @@ -131,6 +143,9 @@ filter: alpha(opacity=20); opacity: .2; } + .v-select.single.searching:not(.open):not(.loading) input[type="search"] { + opacity: .2; + } /* Search Input */ .v-select input[type="search"]::-webkit-search-decoration, .v-select input[type="search"]::-webkit-search-cancel-button, @@ -704,6 +719,9 @@ * @return {void} */ onSearchBlur() { + if (this.clearSearchOnBlur) { + this.search = '' + } this.open = false this.$emit('search:blur') }, @@ -773,12 +791,31 @@ dropdownClasses() { return { open: this.dropdownOpen, + single: !this.multiple, + searching: this.searching, searchable: this.searchable, unsearchable: !this.searchable, loading: this.mutableLoading } }, + /** + * If search text should clear on blur + * @return {Boolean} True when single and clearSearchOnSelect + */ + clearSearchOnBlur() { + return this.clearSearchOnSelect && !this.multiple + }, + + /** + * Return the current state of the + * search input + * @return {Boolean} True if non empty value + */ + searching() { + return !!this.search + }, + /** * Return the current state of the * dropdown menu. diff --git a/test/unit/specs/Select.spec.js b/test/unit/specs/Select.spec.js index ba98bf5..7457d21 100644 --- a/test/unit/specs/Select.spec.js +++ b/test/unit/specs/Select.spec.js @@ -1144,4 +1144,47 @@ describe('Select.vue', () => { }) }) }) + + describe('Single value options', () => { + it('should reset the search input on focus lost', (done) => { + const vm = new Vue({ + template: '
', + data: { + value: 'one', + options: ['one', 'two', 'three'] + } + }).$mount() + + vm.$children[0].open = true + vm.$refs.select.search = "t" + expect(vm.$refs.select.search).toEqual('t') + + vm.$children[0].onSearchBlur() + Vue.nextTick(() => { + expect(vm.$refs.select.search).toEqual('') + done() + }) + }) + + it ('should not reset the search input on focus lost when clearSearchOnSelect is false', (done) => { + const vm = new Vue({ + template: '
', + data: { + value: 'one', + options: ['one', 'two', 'three'] + } + }).$mount() + expect(vm.$refs.select.clearSearchOnSelect).toEqual(false) + + vm.$children[0].open = true + vm.$refs.select.search = "t" + expect(vm.$refs.select.search).toEqual('t') + + vm.$children[0].onSearchBlur() + Vue.nextTick(() => { + expect(vm.$refs.select.search).toEqual('t') + done() + }) + }) + }) })