forked from extern/egroupware
47e296c947
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.
125 lines
3.1 KiB
TypeScript
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);
|