egroupware/api/js/etemplate/et2-button.ts
nathan 47e296c947 Get to the point where a button will submit. Yay.
Most other input widgets can build off this base.

It doesn't validate yet because of the server side, but the client side is working.
2021-07-15 10:08:26 -06:00

125 lines
3.1 KiB
TypeScript

/**
* 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 BXButton from "../../../node_modules/carbon-web-components/es/components/button/button"
import {css} from "../../../node_modules/lit-element/lit-element.js";
import {Et2InputWidget} from "./et2_core_inputWidget";
import {Et2Widget} from "./et2_core_inheritance";
export class Et2Button extends Et2InputWidget(Et2Widget(BXButton))
{
protected _created_icon_node: HTMLImageElement;
protected clicked: boolean = false;
static get properties() {
return {
image: {type: String},
onclick: {type: Function}
}
}
static get styles()
{
return [
super.styles,
css`
/* Custom CSS - Needs to work with the LitElement we're extending */
`
];
}
constructor()
{
super();
// Property default values
this.image = '';
// Create icon Element since BXButton puts it as child, but we put it as attribute
this._created_icon_node = document.createElement("img");
this._created_icon_node.slot="icon";
// Do not add this._icon here, no children can be added in constructor
// Define a default click handler
// If a different one gets set via attribute, it will be used instead
this.onclick = (typeof this.onclick === "function") ? this.onclick : () => {
debugger;
this.getInstanceManager().submit();
};
}
connectedCallback() {
super.connectedCallback();
this.classList.add("et2_button")
if(this.image)
{
this._created_icon_node.src = egw.image(this.image);
this.appendChild(this._created_icon_node);
}
this.addEventListener("click",this._handleClick.bind(this));
}
_handleClick(event: MouseEvent) : boolean
{
// ignore click on readonly button
if (this.disabled) return false;
this.clicked = true;
// Cancel buttons don't trigger the close confirmation prompt
if(this.classList.contains("et2_button_cancel"))
{
this.getInstanceManager()?.skip_close_prompt();
}
if (!super._handleClick(event))
{
this.clicked = false;
return false;
}
this.clicked = false;
this.getInstanceManager()?.skip_close_prompt(false);
return true;
}
/**
* Implementation of the et2_IInput interface
*/
/**
* Always return false as a button is never dirty
*/
isDirty()
{
return false;
}
resetDirty()
{
}
getValue()
{
if (this.clicked)
{
return true;
}
// If "null" is returned, the result is not added to the submitted
// array.
return null;
}
}
customElements.define("et2-button",Et2Button);