From e51dfaf548894c8a0bd07d91d857b62882719844 Mon Sep 17 00:00:00 2001 From: Pablo Henrique Penha Silva Date: Mon, 27 Mar 2017 20:16:39 -0300 Subject: [PATCH] correcoes --- docs/src/pages/components/Input.vue | 36 ++++++- .../mdInputContainer/mdAutocomplete.vue | 93 +++++++++++++------ 2 files changed, 99 insertions(+), 30 deletions(-) diff --git a/docs/src/pages/components/Input.vue b/docs/src/pages/components/Input.vue index adafd39..8c39e53 100644 --- a/docs/src/pages/components/Input.vue +++ b/docs/src/pages/components/Input.vue @@ -153,8 +153,13 @@ - - + + + + + + + @@ -456,8 +461,33 @@ data() { return { autocompleteValue: '', - initialValue: 'My initial value' + initialValue: 'My initial value', + listAutocomplete: [ + {name: 'oi'}, + {name: 'hello'}, + {name: 'salut'} + ] }; + }, + methods: { + fetchAutocomplete(param) { + const myInit = { + method: 'GET', + headers: new Headers(), + mode: 'cors', + cache: 'default' + }; + const url = 'https://typeahead-js-twitter-api-proxy.herokuapp.com/demo/search'; + const queryParam = Object.keys(param)[0]; + const queryValue = param[queryParam]; + const queryUrl = `${url}?${queryParam}=${queryValue}`; + + return window.fetch(queryUrl, myInit) + .then((res) => res.json()); + }, + filterList(list, query) { + return list.filter((el) => el.name.indexOf(query) !== -1); + } } }; diff --git a/src/components/mdInputContainer/mdAutocomplete.vue b/src/components/mdInputContainer/mdAutocomplete.vue index 1ae3105..1761721 100644 --- a/src/components/mdInputContainer/mdAutocomplete.vue +++ b/src/components/mdInputContainer/mdAutocomplete.vue @@ -41,25 +41,31 @@ default: 1E3 }, fetch: { - type: Function, - required: true + type: Function }, - queryParam: { - type: String, - default: 'q' - }, - printAttribute: { - type: String, - default: 'name' + filterList: Function, + list: { + type: Array, + default() { + return []; + } }, minChars: { type: Number, default: 1 + }, + prepareResponseData: Function, + printAttribute: { + type: String, + default: 'name' + }, + queryParam: { + type: String, + default: 'q' } }, data() { return { - current: -1, items: [], loading: false, query: '', @@ -67,7 +73,15 @@ timeout: 0 }; }, + computed: { + listIsEmpty() { + return this.list.length === 0; + } + }, watch: { + list(value) { + this.items = Object.assign([], value); + }, query(value) { this.$refs.input.value = value; this.setParentUpdateValue(value); @@ -78,11 +92,6 @@ } }, methods: { - activeClass(index) { - return { - active: this.current === index - }; - }, debounceUpdate() { this.onInput(); @@ -91,6 +100,10 @@ } this.timeout = window.setTimeout(() => { + if (!this.listIsEmpty) { + this.renderFilteredList(); + return; + } this.update(); }, this.debounce); }, @@ -106,14 +119,17 @@ this.$emit('input', this.$refs.input.value); this.$emit('selected', this.selected, this.$refs.input.value); }, + renderFilteredList() { + if (this.filterList) { + this.items = this.filterList(Object.assign([], this.list), this.query); + } + this.toggleMenu(); + }, reset() { this.items = []; this.query = ''; this.loading = false; }, - setActive(index) { - this.current = index; - }, setParentValue(value) { this.parentContainer.setValue(value || this.$refs.input.value); }, @@ -131,7 +147,7 @@ this.updateValues(value); }, update() { - if (!this.query) { + if (!this.query && !this.list.length) { return this.reset(); } @@ -141,10 +157,12 @@ this.loading = true; - this.fetch() + const queryObject = { [this.queryParam]: this.query }; + + this.fetch(queryObject) .then((response) => { if (this.query) { - let data = response.data; + let data = response || response.data || response.body; data = this.prepareResponseData ? this.prepareResponseData(data) : @@ -152,13 +170,33 @@ this.items = this.limit ? data.slice(0, this.limit) : data; - this.current = -1; + this.loading = false; this.toggleMenu(); } }); }, + verifyProps() { + let errorMessage = ''; + + if (!this.parentContainer) { + errorMessage = 'You should wrap the md-input in a md-input-container'; + } + + if (!this.listIsEmpty && !this.filterList) { + errorMessage = 'You should use a `filterList` function prop with the `list` prop'; + } + + if (!fetch) { + errorMessage = 'You should use a `fetch` function prop'; + } + + if (errorMessage) { + this.$destroy(); + throw new Error(errorMessage); + } + }, toggleMenu() { if (this.items.length) { this.$refs.menu.toggle(); @@ -174,13 +212,14 @@ mounted() { this.$nextTick(() => { this.parentContainer = getClosestVueParent(this.$parent, 'md-input-container'); + + if (!this.listIsEmpty) { + this.items = Object.assign([], this.list); + } + this.query = this.value; - if (!this.parentContainer) { - this.$destroy(); - - throw new Error('You should wrap the md-input in a md-input-container'); - } + this.verifyProps(); this.setParentDisabled(); this.setParentRequired();