egroupware_official/api/js/etemplate/Et2Button/Et2Button.ts

78 lines
1.9 KiB
TypeScript
Raw Normal View History

/**
* EGroupware eTemplate2 - Button 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 {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget";
import '../Et2Image/Et2Image';
import {SlButton} from "@shoelace-style/shoelace";
2023-01-04 23:03:43 +01:00
import {ButtonMixin} from "./ButtonMixin";
import {PropertyValues} from "lit";
export class Et2Button extends ButtonMixin(Et2InputWidget(SlButton))
{
static get properties()
{
return {
...super.properties,
label: {type: String, noAccessor: true, reflect: true}
}
}
protected firstUpdated(_changedProperties : PropertyValues)
{
super.firstUpdated(_changedProperties);
// Register default keyboard shortcut, if applicable
this._register_default_keyhandler(this.id);
if(!this.label && this.__image)
{
/*
Label / no label should get special classes set, but they're missing without this extra requestUpdate()
This is a work-around for button--has-prefix & button--has-label not being set, something to do
with how we're setting them.
*/
this.updateComplete.then(() =>
{
this.requestUpdate();
});
}
}
set label(new_label : string)
{
this.updateComplete.then(() =>
{
if(!this._labelNode)
{
const textNode = document.createTextNode(new_label);
this.appendChild(textNode);
// for some reason button doesn't get resized properly without a forced rendereing therefore the
// requestUpdate is used to trigger a refresh.
this.requestUpdate();
}
else
{
this._labelNode.textContent = new_label;
// for some reason button doesn't get resized properly without a forced rendereingtherefore the
// requestUpdate is used to trigger a refresh.
this.requestUpdate();
}
});
}
get label()
{
return this._labelNode?.textContent?.trim();
}
}
customElements.define("et2-button", Et2Button);