diff --git a/addon/components/hyper-search.js b/addon/components/hyper-search.js index 528e0a1..ed39e6c 100644 --- a/addon/components/hyper-search.js +++ b/addon/components/hyper-search.js @@ -46,12 +46,15 @@ export default Component.extend({ debounceRate: 0, endpoint: null, resultKey: null, + resultsArray: null, placeholder: null, + resultsAreVisible: false, init() { this._super(...arguments); this._cache = {}; this.results = emberArray(); + this.set('register-as', this); }, willDestroyElement() { @@ -86,6 +89,7 @@ export default Component.extend({ fetch(query) { if (isBlank(query) || (query.length < get(this, 'minQueryLength'))) { + this.set('results', []); return reject(); } @@ -117,6 +121,12 @@ export default Component.extend({ url: get(this, 'endpoint'), data: { q: query } }) + .then(results => { + if (get(this, 'resultsArray')) { + results = results[get(this, 'resultsArray')]; + } + return results; + }) .then(resolve, reject); }); }, @@ -146,13 +156,29 @@ export default Component.extend({ } }, + resultsAreAvailable : Ember.computed('results', function () { + return get(this, 'results').length > 0; + }), + actions: { + + clear () { + this.set('results', emberArray()); + }, + search(_event, query) { debounce(this, '_search', query, get(this, 'debounceRate'), true); }, selectResult(result) { this._handleAction('selectResult', result); + if (this.get('clearOnSelect')) { + this.set('results', emberArray()); + } + }, + + toggleResults () { + this.toggleProperty('resultsAreVisible'); } } }); diff --git a/addon/helpers/format-result.js b/addon/helpers/format-result.js new file mode 100644 index 0000000..88b002a --- /dev/null +++ b/addon/helpers/format-result.js @@ -0,0 +1,21 @@ +import Ember from 'ember'; +const { + get, + isPresent +} = Ember; + +export function formatResult(params) { + let [keys, result] = params; + if (isPresent(keys) && isPresent(result)) { + keys = keys.split(/([^a-z0-9_$])/gi).filter(x => x).map(key => { + return (key && !/([^a-z0-9_$])/gi.test(key) && get(result, key.trim())) || key + }); + return keys.join(''); + } else { + let error = [[keys,'Keys'],[result, 'Result']].filter(x => x[0]).map(x => x[1]).join(', and '); + console.warn(`HYPER-SEARCH::Missing ${error}`); + return ""; + } +} + +export default Ember.Helper.helper(formatResult); diff --git a/addon/templates/components/hyper-search.hbs b/addon/templates/components/hyper-search.hbs index 4ffd668..000f999 100644 --- a/addon/templates/components/hyper-search.hbs +++ b/addon/templates/components/hyper-search.hbs @@ -8,19 +8,27 @@ type="text" placeholder=placeholder update=(action "search") + autocomplete="off" + onblur=(action 'clear') }} - + {{#if resultsAreAvailable}} + + {{/if}} -{{/if}} \ No newline at end of file +{{/if}} diff --git a/app/helpers/format-result.js b/app/helpers/format-result.js new file mode 100644 index 0000000..50fe99e --- /dev/null +++ b/app/helpers/format-result.js @@ -0,0 +1 @@ +export { default } from 'ember-hypersearch/helpers/format-result'; diff --git a/package.json b/package.json index 375c1f2..783fff5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-hypersearch", - "version": "0.2.0", + "version": "0.2.2", "description": "Hyperspeed real-time search with caching", "directories": { "doc": "doc", @@ -46,9 +46,9 @@ "ember-addon" ], "dependencies": { - "ember-cli-babel": "^5.1.5", + "ember-cli-babel": "^6.11.0", "ember-cli-htmlbars": "^1.0.1", - "ember-one-way-controls": "^1.1.2" + "ember-one-way-controls": "3.1.0" }, "ember-addon": { "configPath": "tests/dummy/config"