Add clear button when not required
This commit is contained in:
parent
cada3646d3
commit
03d321fbe8
2 changed files with 47 additions and 2 deletions
|
@ -87,4 +87,13 @@ better-select {
|
||||||
&:state(open)::part(display)::after {
|
&:state(open)::part(display)::after {
|
||||||
transform: rotate(180deg);
|
transform: rotate(180deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&:not([required]):state(value)::part(display)::after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::part(clear) {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,10 @@ export class BetterSelect extends HTMLElement {
|
||||||
[part="display-text"]:empty {
|
[part="display-text"]:empty {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
:not(:empty + *)[name="placeholder"] {
|
:not(#text:empty + *)[name="placeholder"] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#text:empty ~ *[name="clear"] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
[part="drop-down"], [part="item"] {
|
[part="drop-down"], [part="item"] {
|
||||||
|
@ -205,6 +208,13 @@ export class BetterSelect extends HTMLElement {
|
||||||
[part="list"] { display: none; }
|
[part="list"] { display: none; }
|
||||||
slot[name="loading"] { display: block; }
|
slot[name="loading"] { display: block; }
|
||||||
}
|
}
|
||||||
|
slot[name="clear"] > button {
|
||||||
|
all: unset;
|
||||||
|
transform: rotate(45deg);
|
||||||
|
&::after {
|
||||||
|
content: "+";
|
||||||
|
}
|
||||||
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
/** @type {HTMLElement} */
|
/** @type {HTMLElement} */
|
||||||
|
@ -232,6 +242,11 @@ export class BetterSelect extends HTMLElement {
|
||||||
<slot name="placeholder" aria-hidden="true">
|
<slot name="placeholder" aria-hidden="true">
|
||||||
<span part="placeholder" id="placeholder" aria-hidden="true"></span>
|
<span part="placeholder" id="placeholder" aria-hidden="true"></span>
|
||||||
</slot>
|
</slot>
|
||||||
|
<template id="clear-template">
|
||||||
|
<slot name="clear" part="clear">
|
||||||
|
<button></button>
|
||||||
|
</slot>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<dialog id="dialog" part="drop-down">
|
<dialog id="dialog" part="drop-down">
|
||||||
<slot name="top"></slot>
|
<slot name="top"></slot>
|
||||||
|
@ -456,9 +471,27 @@ export class BetterSelect extends HTMLElement {
|
||||||
this.#internals.setFormValue(value, state)
|
this.#internals.setFormValue(value, state)
|
||||||
this.text.innerText = state
|
this.text.innerText = state
|
||||||
|
|
||||||
|
this.#states.toggle("value", value)
|
||||||
|
|
||||||
|
this.updateClearButton()
|
||||||
this.setValidity()
|
this.setValidity()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateClearButton() {
|
||||||
|
const template = /** @type {HTMLTemplateElement} */(this.shadowRoot.getElementById("clear-template"))
|
||||||
|
const clearButton = template.nextElementSibling
|
||||||
|
if (this.required || this.#value.value === undefined) {
|
||||||
|
clearButton?.remove()
|
||||||
|
} else if (!clearButton && !this.required) {
|
||||||
|
const button = template.content.cloneNode(true)
|
||||||
|
template.after(button)
|
||||||
|
template.nextElementSibling.addEventListener("click", event => {
|
||||||
|
event.stopPropagation()
|
||||||
|
this.clear()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
get value() { return this.#value.value }
|
get value() { return this.#value.value }
|
||||||
set value(value) {
|
set value(value) {
|
||||||
if (value === undefined) {
|
if (value === undefined) {
|
||||||
|
@ -569,7 +602,10 @@ export class BetterSelect extends HTMLElement {
|
||||||
|
|
||||||
reportValidity() { return this.#internals.reportValidity() }
|
reportValidity() { return this.#internals.reportValidity() }
|
||||||
|
|
||||||
requiredChanged() { this.setValidity() }
|
requiredChanged() {
|
||||||
|
this.updateClearButton()
|
||||||
|
this.setValidity()
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String} name
|
* @param {String} name
|
||||||
|
|
Loading…
Reference in a new issue