Sorting Selected Items
Frontend Lib Picker
The first picker sorts selected libs by label with sort_selected, the second passes a comparator that sorts by programming language first.
selected = []
svelte<script lang="ts">
import { MultiSelect } from 'svelte-widgets'
type FrontendLib = { label: string; lang: string }
const frontend_libs: FrontendLib[] = [
[`Svelte`, `JavaScript`],
[`React`, `JavaScript`],
[`Vue`, `JavaScript`],
[`Angular`, `JavaScript`],
[`Polymer`, `JavaScript`],
[`Ruby on Rails`, `Ruby`],
[`ASP.net`, `C#`],
[`Laravel`, `PHP`],
[`Django`, `Python`],
[`Express`, `JavaScript`],
[`Spring`, `Java`],
[`jQuery`, `JavaScript`],
[`Flask`, `Python`],
[`Flutter`, `Dart`],
[`Bootstrap`, `JavaScript`],
[`Sinatra`, `Ruby`],
[`Solid`, `JavaScript`],
[`Ember JS`, `JavaScript`],
[`Backbone`, `JavaScript`],
[`Preact`, `JavaScript`],
].map(([label, lang]) => ({ label, lang }))
const sort_by_lang = (op1: FrontendLib, op2: FrontendLib): number =>
op1.lang.localeCompare(op2.lang) || op1.label.localeCompare(op2.label)
let selected: FrontendLib[] = $state([])
</script>
selected = {selected.map((itm, idx) => `${idx + 1}. ${itm.label}`).join(`, `) || `[]`}
<MultiSelect
options={frontend_libs}
placeholder="Default sorting by label"
sort_selected
bind:value={selected}
style="margin-bottom: 1em"
/>
<MultiSelect
options={frontend_libs}
placeholder="Custom sorting by language, then label"
sort_selected={sort_by_lang}
/>MultiSelect by default renders selected items in the order they were chosen. Enabling sort_selected implicitly disables drag reordering because selected_options_draggable defaults to !sort_selected. Explicitly combining sorting with selected_options_draggable={true} throws because the two ordering contracts conflict. The prop
sort_selected: boolean | ((op1: Option, op2: Option) => number) = false
can be set to true to sort selected options by label with localeCompare. Provide your own comparator function to define a custom sort order.