Svelecte provide basically every (hopefully) common functionality, you would expect from autocomplete/select/multiselect component. It's main inspiration was selectize.js.
Version 4 has been release and since then documentation has moved to https://svelecte.vercel.app.
Current version
You are currenlty browsing documentation for:
svelte-dnd-action. See example.svelte-use-form. See example.Svelecte can be used in your Svelte app or used as a standalone custom element. MDN link about custom elements.
Check playground example for all options
npm install svelecte --save
arrayoptions property. By
default
it converts plain string items to object with value and label
properties.string|nullvalue. If not
specified, property will be resolved automatically.
string|nullstring<select> is created. So it can be used in forms automatically.
boolarray|mixed|nullvalueField property / array like in normal selects or object / object array
depending whether valueAsObject property is set.
multiple is set to true.
array|object|nullExample of plain array options and variable value output:
boolvalue or
label property
by setting labelAsValue property to true.
Optgroups are defined as objects with label and options properties. These properties are customizable.
stringstring
Optgroup labels are customizable by styling .optgroup-header class.
You can define custom renderer function, which takes current option and return HTML string. Your renderer can display selected items differently due second function argument.
string | fn(item : object|string, isSelected: bool, inputValue: string) -> string
string is passed, context renderer with given name is being used. You can add new
renderers
through context function addFormatter(name: string, formatFn: function).
formatFn function can expect
arguments specified above.
By default labelField is used to render visible text.
bool
renderer function
that includes additional text or does its own highlighting.
If renderer property is not enough for you or you prefer Component syntax to HTML strings,
you can use your own Components. Keep in mind that default highlighting when searching, but the rest of features
like styling should be inherited if you use proper css classes (the same as Item component).
To make it easier to use your own Components, there are available actions, highlighting function and close button icon for you to use.
The simplest example can be found in this REPL.
Control component provides 4 slots.
icon - This allows to insert custom code like e.g. an icon at the start/left of the Control.svelte (as shown in the example above)control-end - This allows to insert custom code at the end/right of the Control.svelte. It is positioned AFTER the indicator icons.indicator-icon - This allows to customize the indicator icon in the Control.svelte. Slot has hasDropdownOpened property that helps customizing different control states.clear-icon - This allows to customize the clear icon in the Control.svelte. Slot has selectedOptions and inputValue properties for fine-grained customizationstring|nullhttps://example.com/url?search=[query]stringinit - remote dataset is fetched immediately upon
setting, searching is conducted only among available items. Fetch fallbacks to init
also
when fetch is string and [query] placeholder is not specified.auto - remote search query is triggered when typing, but it expects
[query] placeholder in fetch property. This is default value.
?fn(jsonResponse: object): arraydata,
items,
options or response JSON itself as a fallback.
boolnumberboolWhen including Svelecte in your app, you can import what parts do you need...
import { registerSvelecte, addFormatter, config } from 'svelecte/component';
... or download the latest version manually from GitHub.
<link rel="stylesheet" href="https://unpkg.com/svelecte-element/dist/svelecte.css">
<script src="https://unpkg.com/svelecte/dist/svelecte-element.js">/script>
Standalone version offer same properties as module version:
const { registerSvelecte, addFormatter, config } = window.Svelecte;
Registering custom element is mandatory step. Use registerSvelecte function for that. Also when using CE version, you can define additional
renderer functions by calling addFormatter function (check Custom
item rendering section) or update global config.
// You can use your own component name. If not specified, `el-svelecte` will be used.
registerSvelecte();
// after registering, given HTML tag will render as Svelecte component
<el-svelecte ...properties></el-svelecte>
// add additional renderers
addFormatter('caps', item => item.text.toUpperCase());
// additionally change global config defaults
config.clearable = true;
By reactive API I mean properties that dynamically changes Svelecte inner logic. Not all attributes are
reactive. For example parent prop is not reactive and is not even accessible programmatically.
Reactive API for custom element is accessible programmatically or directly through element's attributes. Almost
all Option props are mirrored.
const OPTION_LIST = [
'options', 'value',
// form-related
'name', 'required', 'disabled',
// basic
'value-field', 'label-field', 'disabled-field', 'placeholder',
// UI, UX
'searchable', 'clearable', 'renderer', 'disable-highlight', 'select-on-tab', 'reset-on-blur',
// multiple
'multiple', 'max', 'collapse-selection',
// creating
'creatable', 'creatablePrefix', 'allow-editing', 'keepCreated', 'delimiter',
// remote
'fetch', 'fetch-reset-on-blur', 'min-query',
// perf & virtual list
'lazy-dropdown', 'virtual-list', 'vl-height', 'vl-item-size',
// sifter
'search-field', 'sort-field', 'disable-sifter',
// others
'label-as-value'
];
• renderer property supports only string values.
• lazy-dropdown is settable only during component initialization
Simple example that enables you to insert multiple el-svelecte DOM
elements.
Check onSubmit function in example code.
Custom-element version has one specific feature. You can decide if you want to trigger change
event when programmatically setting value:
element.value = 'changedValue'; // doesn't trigger change event
When you want to trigger change event, you need to use emitChange modifier before setting new value:
element.emitChange.value = 'changedValue'; // DOES trigger change event
Quite common scenario when one select (child) depends on another (parent) and when parent is selected, you need to fetch data child dataset. Svelecte supports this use-case directly.
stringid property of parent select. This attribute should be defined on
child svelecte element.
stringfetch property on child select, specify [parent]
placeholder, which will contain value from parent select when selected.
[parent] and [query] placeholder.
It is very easy to use Svelecte with Vue.js. You only need to add Svelecte element to
ignoredElements for Vue 2 or handle in in isCustomElement in Vue 3.
The only thing you need to handle is listening to change as you would with native inputs.
Options |
|||
| Property | Type | Default | Description |
|---|---|---|---|
| name | string | null |
Create <select>, usable for normal forms.IMPORTANT: Take into account, that without this property, internal <select> is NOT created. |
| options | array | [] |
Data array |
| valueAsObject | bool | false |
Switch whether Svelecte should expects from and return to bind:value objects or primitive value (usually string, number) |
| valueField | string | null |
Property to be used as value (if not specified, will be selected automatically) |
| labelField | string | null |
Property shown in dropdown (if not specified, will be selected automatically) |
| groupLabelField | string | label |
Property defining optgroup header |
| groupItemsField | string | options |
Property holding optgroup option list |
| disabledField | string | $disabled |
Property upon which is determined, whether given option is selectable or not |
| inputId | string | null |
id attribute of input element. Useful, when you want to have input selectable by clicking on the label |
| required | bool | false |
This property is passed to generated <select> element. Make sense only when name is defined |
| 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 |
| controlItem | Component | Item |
Item component when item is selected. See README section on GitHub for more details |
| dropdownItem | Component | Item |
Item component when item is selected. See README section on GitHub for more details |
| highlightFirstItem | boolean | true |
Automatically highlight the first item in the list when the dropdown opens |
| selectOnTab | bool|string|null | null |
Based on value provided, it allows selecting currently active item by Tab AND (if value is 'select-navigate') also focus next input. The constant TAB_SELECT_NAVIGATE is exported from svelecte. |
| resetOnBlur | bool | true |
Control if input value should be cleared on blur |
| resetOnSelect | bool | true |
Control if input value should be cleared on item selection. Note: Applicable only with multiple |
| clearable | bool | false |
Display ✖ icon to clear whole selection |
| multiple | bool | false |
allow multiselection. Will be set automatically to true, if name property
ends with [], like tags[] |
| closeAfterSelect | bool | false |
closes dropdown after selection. Setting this to true is useful for multiple select only. For single select dropdown is always closed no matter the value this property has |
| max | number | 0 |
Maximum allowed items selected, applicable only for multiselect |
| collapseSelection | bool | false |
collapse selection when multiple and not focused |
| alwaysCollapsed | bool | false |
works only when collapseSelection is true. It shows only collapsed selection in input line. Options themselves are shown in dropdown. |
| anchor | string | null |
existing select (for CE) |
| creatable | bool | false |
Allow creating new item(s) |
| creatablePrefix | string | * |
Prefix marking new item |
| allowEditing | bool | false |
When pressing Backspace switch to edit mode instead of removing newly created item. NOTE: intended to be used with creatable property. |
| keepCreated | bool | true |
Switch whether to add newly created option to option list or not |
| delimiter | string | , |
Split inserted text when pasting to create multiple items |
| createFilter | function | null |
Function, that transform input string to custom value. It can serve as a filter, if value is valid or not.
If you want to dismiss entered value, function should return '' (empty string). By default
all input string is trimmed and all multiple spaces are removed. Function notation:
createFilter(inputValue: string, dropdownOptions: array): string
|
| createTransform | function | null |
Custom function transforming input string to option object. By default it just sets value as output from createFilter
and label as output from createFilter prefixed with creatablePrefix property.
Function notation:
createTransform(inputValue: string, creatablePrefix: string, valueField: string, labelField: string): object
|
| fetch | string|function | null |
Check "remote datasource" section for more details |
| fetchMode | string | auto |
When set to init options are fetched only when mounted, when searching it search in
downloaded dataset |
| fetchCallback | function | null |
Optional fetch callback |
| fetchResetOnBlur | bool | true |
Reset previous search results on empty input, related to resetOnBlur |
| fetchDebounceTime | number | 500 |
Change default debounce time for fetch request |
| minQuery | number | 1 |
Minimal amount of characters required to perform remote request. Valid only in combination with fetch defined |
| disableSifter | bool | false |
Can be disabled (especially with fetch) when further filtering or sorting may be
undesired (due to server-side sorting & and filtering based on user input). |
| lazyDropdown | bool | true |
Dropdown is rendered only after first focus, not by default |
| virtualList | bool | false |
Whether use virtual list for dropdown items (useful for large datasets) |
| vlHeight | number | null |
Height of virtual list dropdown (if not specified, computed automatically) |
| vlItemSize | number | null |
Height of one row (if not specified, computed automatically) |
| searchField | string|array | null |
Specify item property that will be used to search by (if not specified all props except
value prop will be used)
|
| sortField | string | null |
Specify sort property. If not specified, first after value field will be used |
| class | string | 'svelecte-control' |
Default css class |
| style | string | null |
Inline style |
| i18n | object | null |
Overriding object for i18n properties |
| dndzone | function | empty function |
If you pass dndzone from svelte-dnd-action, reordering of selected items will be possible. See example REPL how to set it up. |
| validatorAction | array | null |
Designed to be used with svelte-use-form. Pass validators function as a first item, and validators as the rest. See example REPL. Don't forget to set also name property. |
Events |
|||
| Event | parameter | description | |
| fetch | array |
newly fetched remote options | |
| change | object|array|null |
selected objects. If anchor <select> is defined, change event is called also on it
|
|
| createoption | object |
newly created option object | |
| blur | - |
normal blur event | |
| invalidValue | mixed (invalid value) |
triggered when passed value is out of provided options items. Internal value is always set to null.
|
|
| enterKey | underlying keyDown event |
triggered when natively it would cause form submit (dropdown is closed). This gives you ability to prevent it by calling event.detail.preventDefault().
|
|
API |
|||
| Name | type | arguments | description |
| focus | function | - | focus input |
| getSelection | function | bool | return selection, if true is passed, only values are returns, whole objects otherwise
|
| setSelection | function | array, bool | set selection programmatically, toggle for emitting change event. (Can be desirable for custom-element) |
| config | property | - | context property: global common config for all instances, you can override most properties here and also some additional, mainly i18n |
| addFormatter | function | - | context function: with signature (name, formatFn) you can add
additional item renderers (formatters). More details in Custom rendering example |
Localization can be overridden globally and on component level.
/** default values */
{
/** rest omitted for brevity */
i18n: {
empty: 'No options',
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}'`
},
collapseSelectionFn: function(selectionCount, selection) {
return settings.i18n.collapsedSelection(selectionCount);
}
}
For global override, import config and update according to your needs. Don't forget that
max, collapsedSelection and createRowLabel are functions. You can also override only
specific keys if you need to.
import Svelecte, { config } from 'svelecte';
// global override
config.i18n = {
/** here replace all keys.*/
}
// local override (component-level)
const myI18n = {
empty: `Empty list, can't you see?`
}
<Svelecte i18n={myI18n}></Svelecte>
Example for custom element:
Svelecte.config.i18n = {
/** here replace all keys.*/
}
// local override
document.querySelector('el-svelecte').svelecte.$set({
i18n: {
// props to be overridden
}
})
svelecte
property and use component API ($set method) to update it programmatically.