egroupware_official/api/js/etemplate/Et2Checkbox/Et2Checkbox.ts
ralf ba35be1d86 Change Et2Checkbox to behave closer to legacy et2_widget_checkbox and thereby fixing all sorts of errors with it.
Fix vfsSelectUI to be able to select files again with click on the row and only submit selected files.
Also change Et2Widget.iterateOver and legacy et2_widget.interateOver to be called with new web-component classes like Et2Checkbox. Also make Et2Widget matching all widgets by default like et2_widget.
Remove legacy et2_widget_checkbox code.
2022-08-07 10:10:33 +02:00

134 lines
2.8 KiB
TypeScript

/**
* EGroupware eTemplate2 - Checkbox widget
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link https://www.egroupware.org
* @author Nathan Gray
*/
import {css} from "@lion/core";
import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget";
import '../Et2Image/Et2Image';
import {SlCheckbox} from "@shoelace-style/shoelace";
import shoelace from "../Styles/shoelace";
export class Et2Checkbox extends Et2InputWidget(SlCheckbox)
{
/**
* Value to set checkbox in (third) indeterminate state
*/
static readonly INDETERMINATE = '***undefined***';
static get styles()
{
return [
...shoelace,
...super.styles,
css`
:host {
/* Make it line up with the middle of surroundings */
margin: auto 0px;
vertical-align: -webkit-baseline-middle;
}
:host([disabled]) {
display:initial;
}
/* Extend hover highlight to label */
.checkbox:not(.checkbox--disabled):hover {
color: var(--sl-input-border-color-hover);
}
`,
];
}
static get properties()
{
return {
...super.properties,
/* Different value when checked */
selectedValue: {type: String},
/* Different value when unchecked */
unselectedValue: {type: String}
}
}
constructor()
{
super();
this.selectedValue = 'true';
this.unselectedValue = '';
}
connectedCallback()
{
super.connectedCallback();
}
get label()
{
return this._labelNode?.textContent || "";
}
set label(label_text)
{
if(this._labelNode)
{
this._labelNode.textContent = label_text;
}
else
{
this.updateComplete.then(() =>
{
this.label = label_text;
})
}
}
get value() : string | boolean
{
return this.indeterminate ? undefined :
(this.checked ? this.selectedValue : this.unselectedValue);
}
set value(new_value : string | boolean)
{
this.requestUpdate("checked");
this.indeterminate = false;
if(typeof new_value === "boolean")
{
this.checked = new_value;
}
else if(new_value == this.selectedValue)
{
this.checked = true;
}
else if(new_value == this.unselectedValue)
{
this.checked = false;
}
// concept of an indeterminate value did not exist in eT2 and set value gets called with all kind of truthy of falsy values
// therefore we can NOT set everything not matching our (un)selectedValue to indeterminate!
// For now, we only do that for an explicit Et2Checkbox.INDETERMINATE value
else if (new_value === Et2Checkbox.INDETERMINATE)
{
this.indeterminate = true;
}
else
{
this.checked = !!new_value;
}
}
private get _labelNode()
{
return this.shadowRoot?.querySelector("slot:not([name])");
}
}
customElements.define("et2-checkbox", Et2Checkbox);