forked from tsai/budibase
8 changed files with 21 additions and 104 deletions
@ -1,80 +0,0 @@ |
|||||
<script> |
|
||||
import { createEventDispatcher } from "svelte" |
|
||||
import Picker from "./Picker.svelte" |
|
||||
|
|
||||
export let value = null |
|
||||
export let id = null |
|
||||
export let selectPlaceholder = "Choose an option" |
|
||||
export let autocompletePlaceholder = "Search an option" |
|
||||
export let disabled = false |
|
||||
export let error = null |
|
||||
export let options = [] |
|
||||
export let getOptionLabel = option => option |
|
||||
export let getOptionValue = option => option |
|
||||
export let getOptionIcon = () => null |
|
||||
export let readonly = false |
|
||||
export let quiet = false |
|
||||
export let autoWidth = false |
|
||||
|
|
||||
const dispatch = createEventDispatcher() |
|
||||
let open = false |
|
||||
$: fieldText = getFieldText(value, options, selectPlaceholder) |
|
||||
$: fieldIcon = getFieldIcon(value, options, selectPlaceholder) |
|
||||
|
|
||||
const getFieldText = (value, options, placeholder) => { |
|
||||
// Always use placeholder if no value |
|
||||
if (value == null || value === "") { |
|
||||
return placeholder || "Choose an option" |
|
||||
} |
|
||||
|
|
||||
// Wait for options to load if there is a value but no options |
|
||||
if (!options?.length) { |
|
||||
return "" |
|
||||
} |
|
||||
|
|
||||
// Render the label if the selected option is found, otherwise raw value |
|
||||
const index = options.findIndex( |
|
||||
(option, idx) => getOptionValue(option, idx) === value |
|
||||
) |
|
||||
return index !== -1 ? getOptionLabel(options[index], index) : value |
|
||||
} |
|
||||
|
|
||||
const getFieldIcon = (value, options) => { |
|
||||
// Wait for options to load if there is a value but no options |
|
||||
if (!options?.length) { |
|
||||
return "" |
|
||||
} |
|
||||
const index = options.findIndex( |
|
||||
(option, idx) => getOptionValue(option, idx) === value |
|
||||
) |
|
||||
return index !== -1 ? getOptionIcon(options[index], index) : null |
|
||||
} |
|
||||
|
|
||||
const selectOption = value => { |
|
||||
dispatch("change", value) |
|
||||
open = false |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<Picker |
|
||||
on:click |
|
||||
bind:open |
|
||||
{quiet} |
|
||||
{id} |
|
||||
{error} |
|
||||
{disabled} |
|
||||
{readonly} |
|
||||
{fieldText} |
|
||||
{options} |
|
||||
{autoWidth} |
|
||||
{getOptionLabel} |
|
||||
{getOptionValue} |
|
||||
{getOptionIcon} |
|
||||
{fieldIcon} |
|
||||
autocomplete={true} |
|
||||
isPlaceholder={value == null || value === ""} |
|
||||
{autocompletePlaceholder} |
|
||||
placeholderOption={selectPlaceholder} |
|
||||
isOptionSelected={option => option === value} |
|
||||
onSelectOption={selectOption} |
|
||||
/> |
|
||||
Loading…
Reference in new issue