Create listbox component
This commit is contained in:
parent
465856e8c9
commit
7afbce696b
|
@ -0,0 +1,62 @@
|
||||||
|
<script>
|
||||||
|
import "@spectrum-css/checkbox/dist/index-vars.css"
|
||||||
|
import "@spectrum-css/fieldgroup/dist/index-vars.css"
|
||||||
|
import { createEventDispatcher } from "svelte"
|
||||||
|
|
||||||
|
export let value = false
|
||||||
|
export let text
|
||||||
|
export let disabled = false
|
||||||
|
|
||||||
|
$: indeterminate = value === "partial"
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher()
|
||||||
|
const onChange = event => {
|
||||||
|
dispatch("change", event)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<label
|
||||||
|
class="spectrum-Checkbox spectrum-Checkbox--emphasized spectrum-Checkbox--sizeM {indeterminate
|
||||||
|
? 'is-indeterminate'
|
||||||
|
: ''}"
|
||||||
|
class:checked={value}
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
checked={value}
|
||||||
|
{disabled}
|
||||||
|
on:change={onChange}
|
||||||
|
type="checkbox"
|
||||||
|
class="spectrum-Checkbox-input"
|
||||||
|
value={text}
|
||||||
|
/>
|
||||||
|
<span class="spectrum-Checkbox-box">
|
||||||
|
<svg
|
||||||
|
class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Checkbox-checkmark"
|
||||||
|
focusable="false"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<use xlink:href="#spectrum-css-icon-Checkmark100" />
|
||||||
|
</svg>
|
||||||
|
<svg
|
||||||
|
class="spectrum-Icon spectrum-UIIcon-Dash100 spectrum-Checkbox-partialCheckmark"
|
||||||
|
focusable="false"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<use xlink:href="#spectrum-css-icon-Dash100" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span class="spectrum-Checkbox-label">{text}</span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.spectrum-Checkbox {
|
||||||
|
display: flex;
|
||||||
|
flex-grow: 1;
|
||||||
|
padding: 4px 16px;
|
||||||
|
}
|
||||||
|
.spectrum-Checkbox-input {
|
||||||
|
opacity: 0;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,99 @@
|
||||||
|
<script>
|
||||||
|
import "@spectrum-css/fieldgroup/dist/index-vars.css"
|
||||||
|
import "@spectrum-css/radio/dist/index-vars.css"
|
||||||
|
import { createEventDispatcher } from "svelte"
|
||||||
|
import Checkbox from "./Checkbox.svelte"
|
||||||
|
|
||||||
|
export let value = []
|
||||||
|
export let options = []
|
||||||
|
export let disabled = false
|
||||||
|
|
||||||
|
export let showSelectAll = true
|
||||||
|
export let selectAllText = "Select all"
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher()
|
||||||
|
const onChange = e => {
|
||||||
|
const target = e.detail.target
|
||||||
|
let tempValue = value
|
||||||
|
let isChecked = target.checked
|
||||||
|
|
||||||
|
const isIncluded = tempValue.includes(target.value)
|
||||||
|
|
||||||
|
if (!isIncluded && isChecked) {
|
||||||
|
tempValue.push(target.value)
|
||||||
|
} else if (!isChecked && isIncluded) {
|
||||||
|
tempValue.splice(tempValue.indexOf(target.value), 1)
|
||||||
|
}
|
||||||
|
value = tempValue
|
||||||
|
}
|
||||||
|
|
||||||
|
$: dispatch("change", value)
|
||||||
|
|
||||||
|
let allSelected = false
|
||||||
|
$: {
|
||||||
|
if (value.length === options.length) {
|
||||||
|
allSelected = true
|
||||||
|
} else if (value.length === 0) {
|
||||||
|
allSelected = false
|
||||||
|
} else {
|
||||||
|
allSelected = "partial"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const toggleSelectAll = () => {
|
||||||
|
if (allSelected === true) {
|
||||||
|
value = []
|
||||||
|
} else {
|
||||||
|
value = [...options]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class={`spectrum-FieldGroup spectrum-FieldGroup--vertical`}>
|
||||||
|
{#if options && Array.isArray(options)}
|
||||||
|
{#if showSelectAll}
|
||||||
|
<div class="CheckBoxItem">
|
||||||
|
<Checkbox
|
||||||
|
value={allSelected}
|
||||||
|
on:change={toggleSelectAll}
|
||||||
|
{disabled}
|
||||||
|
text={selectAllText}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{#each options as option}
|
||||||
|
<div
|
||||||
|
title={option}
|
||||||
|
class={`spectrum-Checkbox spectrum-FieldGroup-item CheckBoxItem`}
|
||||||
|
>
|
||||||
|
<Checkbox
|
||||||
|
on:change={onChange}
|
||||||
|
{disabled}
|
||||||
|
value={value.includes(option)}
|
||||||
|
text={option}
|
||||||
|
dispatchFullEvent
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.spectrum-FieldGroup {
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid var(--spectrum-global-color-gray-300);
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spectrum-Checkbox-input {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CheckBoxGroup {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CheckBoxItem:hover {
|
||||||
|
background-color: rgba(255, 255, 255, 0.01);
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -78,6 +78,7 @@ export { default as IconSideNavItem } from "./IconSideNav/IconSideNavItem.svelte
|
||||||
export { default as Slider } from "./Form/Slider.svelte"
|
export { default as Slider } from "./Form/Slider.svelte"
|
||||||
export { default as Accordion } from "./Accordion/Accordion.svelte"
|
export { default as Accordion } from "./Accordion/Accordion.svelte"
|
||||||
export { default as File } from "./Form/File.svelte"
|
export { default as File } from "./Form/File.svelte"
|
||||||
|
export { default as ListBox } from "./ListBox/ListBox.svelte"
|
||||||
|
|
||||||
// Renderers
|
// Renderers
|
||||||
export { default as BoldRenderer } from "./Table/BoldRenderer.svelte"
|
export { default as BoldRenderer } from "./Table/BoldRenderer.svelte"
|
||||||
|
|
Loading…
Reference in New Issue