From 5a2951705cf6b66224e6d877c2d9e39c39893b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Sko=C4=8D=C3=ADk?= Date: Sun, 17 Oct 2021 15:45:29 +0200 Subject: [PATCH] add option to limit fetch trigger, fix #40 --- README.md | 13 ++++++++----- component.js | 18 +++++++++++++++++- docs/index.html | 32 +++++++++++++++++++------------- docs/src/06-fetch.svelte | 14 ++++++++++++-- src/Svelecte.svelte | 12 +++++++++--- src/settings.js | 2 ++ 6 files changed, 67 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 728295e..e0f6d31 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ valueField | string | `null` | Property to be used as value labelField | string | `null` | Property shown in dropdown (if not specified, will be selected automatically) disabledField | string | `$disabled`| Property to check, whether given options should be disabled and unselectable required | bool | `false` | make sense only when `name` is defined -placeholder | string | `'Select'` | Input placeholder +placeholder | string | `Select` | Input placeholder searchable | bool | `true` | Allow search among items by typing disabled | bool | `false` | Disable component renderer | string\|function | `null` | dropdown and selection renderer function. More info in item rendering section @@ -68,14 +68,15 @@ max | number | `0` | Maximum allowed items select collapseSelection | bool | `false` | collapse selection when `multiple` and not focused name | string | `null` | create ` @@ -51,5 +54,12 @@ Reset search results on empty input -
{ JSON.stringify(selectionWork) }
- \ No newline at end of file +
{ JSON.stringify(selectionWork) }
+ + + \ No newline at end of file diff --git a/src/Svelecte.svelte b/src/Svelecte.svelte index fa7ae77..d2a7996 100644 --- a/src/Svelecte.svelte +++ b/src/Svelecte.svelte @@ -58,6 +58,7 @@ export let fetchMode = 'auto'; export let fetchCallback = defaults.fetchCallback; export let fetchResetOnBlur = true; + export let minQuery = defaults.minQuery; // performance export let lazyDropdown = defaults.lazyDropdown; // virtual list @@ -181,6 +182,7 @@ } return; } + if (value && value.length < minQuery) return; isFetchingData = true; hasDropdownOpened.set(false); debouncedFetch(value); @@ -229,11 +231,15 @@ } $: listMessage = maxReached ? _i18n.max(max) - : ($inputValue.length && availableItems.length === 0 + : ($inputValue.length && availableItems.length === 0 && minQuery <= 1 ? _i18n.nomatch - : fetch - ? _i18n.fetchBefore + : (fetch + ? (minQuery <= 1 + ? _i18n.fetchBefore + : _i18n.fetchQuery(minQuery) + ) : _i18n.empty + ) ); $: itemRenderer = typeof renderer === 'function' ? renderer : (formatterList[renderer] || formatterList.default.bind({ label: currentLabelField})); $: { diff --git a/src/settings.js b/src/settings.js index 0b1cd1c..c0c5b17 100644 --- a/src/settings.js +++ b/src/settings.js @@ -24,6 +24,7 @@ const settings = { delimiter: ',', // remote fetchCallback: null, + minQuery: 1, // performance lazyDropdown: true, // virtual list @@ -36,6 +37,7 @@ const settings = { nomatch: 'No matching options', max: num => `Maximum items ${num} selected`, fetchBefore: 'Type to search', + fetchQuery: minQuery => `Type ${minQuery > 1 ? `at least ${minQuery} characters ` : '' }to search`, fetchEmpty: 'No data related to your search', collapsedSelection: count => `${count} selected`, createRowLabel: value => `Create '${value}'`