Skip to content

Commit a058977

Browse files
authored
Merge pull request #100 from loisolire/allow-empty-query-search
Add `fetch-on-empty` optional attribute
2 parents b2d87f2 + 5a0e443 commit a058977

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

examples/index.html

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,19 @@
101101
document.querySelector("auto-complete#custom-fetching-method").fetchResult = async (el, url) => (await fetch(url)).text();
102102
</script>
103103

104+
<form>
105+
<label id="fetch-on-empty-robots-label" for="fetch-on-empty-robot">Fetch on empty Robots</label>
106+
<!-- To enable fetch on empty use fetch-on-empty attribute -->
107+
<auto-complete src="/demo" for="fetch-on-empty-items-popup" aria-labelledby="fetch-on-empty-robots-label" fetch-on-empty>
108+
<input name="fetch-on-empty-robot" type="text" aria-labelledby="fetch-on-empty-robots-label" autofocus />
109+
<button id="fetch-on-empty-robot-clear">x</button>
110+
<ul id="fetch-on-empty-items-popup"></ul>
111+
<div id="fetch-on-empty-items-popup-feedback" class="sr-only"></div>
112+
</auto-complete>
113+
<button type="submit">Save</button>
114+
</form>
115+
104116
<!-- <script type="module" src="./dist/bundle.js"></script>-->
105-
<script type="module" src="https://unpkg.com/@github/auto-complete-element@latest/dist/bundle.js"></script>
117+
<script type="module" src="https://unpkg.com/@github/auto-complete-element@latest/dist/bundle.js"></script>
106118
</body>
107119
</html>

src/auto-complete-element.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ export default class AutocompleteElement extends HTMLElement {
5555
}
5656
}
5757

58+
get fetchOnEmpty(): boolean {
59+
return this.hasAttribute('fetch-on-empty')
60+
}
61+
62+
set fetchOnEmpty(fetchOnEmpty: boolean) {
63+
this.toggleAttribute('fetch-on-empty', fetchOnEmpty)
64+
}
65+
5866
fetchResult = fragment
5967

6068
static get observedAttributes(): string[] {

src/autocomplete.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ export default class Autocomplete {
187187

188188
fetchResults(): void {
189189
const query = this.input.value.trim()
190-
if (!query) {
190+
if (!query && !this.container.fetchOnEmpty) {
191191
this.container.open = false
192192
return
193193
}

test/test.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,51 @@ describe('auto-complete element', function () {
269269
assert.equal(`5 results. first is the top result: Press Enter to activate.`, feedback.innerHTML)
270270
})
271271
})
272+
273+
describe('fetch on empty enabled', () => {
274+
let container
275+
beforeEach(function () {
276+
document.body.innerHTML = `
277+
<div id="mocha-fixture">
278+
<auto-complete fetch-on-empty src="/moke" for="popup" data-autoselect="true">
279+
<input type="text" value="1">
280+
<ul id="popup"></ul>
281+
<div id="popup-feedback"></div>
282+
</auto-complete>
283+
</div>
284+
`
285+
container = document.querySelector('auto-complete')
286+
container.fetchResult = async () => `
287+
<li>Mock Custom Fetch Result 1</li>
288+
<li>Mock Custom Fetch Result 2</li>`
289+
})
290+
291+
it('should fetch result when value is empty', async function () {
292+
const input = container.querySelector('input')
293+
const popup = container.querySelector(`#popup`)
294+
const feedback = container.querySelector(`#popup-feedback`)
295+
296+
triggerInput(input, '')
297+
await once(container, 'loadend')
298+
299+
assert.equal(2, popup.children.length)
300+
assert.equal(popup.querySelector('li').textContent, 'Mock Custom Fetch Result 1')
301+
assert.equal(feedback.textContent, '')
302+
})
303+
304+
it('does not fetch result when value is empty, if fetch-on-empty removed', async function () {
305+
const input = container.querySelector('input')
306+
const popup = container.querySelector(`#popup`)
307+
const feedback = container.querySelector(`#popup-feedback`)
308+
container.fetchOnEmpty = false
309+
310+
triggerInput(input, '')
311+
await new Promise(resolve => setTimeout(resolve, 100))
312+
313+
assert.equal(0, popup.children.length)
314+
assert.equal(feedback.textContent, '')
315+
})
316+
})
272317
})
273318

274319
function waitForElementToChange(el) {

0 commit comments

Comments
 (0)