Fix onclick context was bound to the widget class instead of the widget instance

This caused any onclicks that used "widget" variable to fail.
This commit is contained in:
nathan 2021-08-20 10:23:39 -06:00
parent e0144fcec7
commit e6ecdd1b25

View File

@ -8,6 +8,7 @@ import {et2_cloneObject, et2_csvSplit} from "./et2_core_common";
import {IegwAppLocal} from "../jsapi/egw_global"; import {IegwAppLocal} from "../jsapi/egw_global";
import {ClassWithAttributes, ClassWithInterfaces} from "./et2_core_inheritance"; import {ClassWithAttributes, ClassWithInterfaces} from "./et2_core_inheritance";
import {LitElement} from "@lion/core"; import {LitElement} from "@lion/core";
import {et2_container} from "./et2_core_baseWidget";
/** /**
* This mixin will allow any LitElement to become an Et2Widget * This mixin will allow any LitElement to become an Et2Widget
@ -70,11 +71,7 @@ export const Et2Widget = <T extends Constructor<LitElement>>(superClass : T) =>
//label: {type: String}, //label: {type: String},
onclick: { onclick: {
type: Function, type: Function,
converter: (value) => attribute: false
{
// TODO: Check to see if this is a static converter so "this" gives the class, not the instance
return et2_compileLegacyJS(value, this, this);
}
} }
}; };
} }
@ -89,6 +86,8 @@ export const Et2Widget = <T extends Constructor<LitElement>>(superClass : T) =>
constructor(...args : any[]) constructor(...args : any[])
{ {
super(...args); super(...args);
this.addEventListener("click", this._handleClick.bind(this));
} }
connectedCallback() connectedCallback()
@ -101,10 +100,6 @@ export const Et2Widget = <T extends Constructor<LitElement>>(superClass : T) =>
{ {
this.egw().tooltipBind(this, this.statustext); this.egw().tooltipBind(this, this.statustext);
} }
if(this.onclick && !this.disabled)
{
this.addEventListener("click", this._handleClick.bind(this));
}
} }
disconnectedCallback() disconnectedCallback()
@ -710,6 +705,22 @@ export const Et2Widget = <T extends Constructor<LitElement>>(superClass : T) =>
return null; return null;
} }
/**
* Returns the base widget
* Usually this is the same as getInstanceManager().widgetContainer
*/
getRoot() : et2_container
{
if(this.getParent() != null)
{
return this.getParent().getRoot();
}
else
{
return <et2_container><unknown>this;
}
}
/** /**
* Returns the path into the data array. By default, array manager takes care of * Returns the path into the data array. By default, array manager takes care of
* this, but some extensions need to override this * this, but some extensions need to override this
@ -804,18 +815,39 @@ export function loadWebComponent(_nodeName : string, _template_node, parent : Et
// If there is not attribute set, ignore it. Widget sets its own default. // If there is not attribute set, ignore it. Widget sets its own default.
if(typeof attrValue === "undefined") return; if(typeof attrValue === "undefined") return;
const property = widget_class.getPropertyOptions(attribute);
// If the attribute is marked as boolean, parse the switch(property.type)
// expression as bool expression.
if(widget_class.getPropertyOptions(attribute).type == "Boolean")
{ {
attrValue = mgr.parseBoolExpression(attrValue); case Boolean:
// If the attribute is marked as boolean, parse the
// expression as bool expression.
attrValue = mgr.parseBoolExpression(attrValue);
break;
case Function:
// We parse it into a function here so we can pass in the widget as context.
// Leaving it to the LitElement conversion loses the widget as context
if(typeof attrValue !== "function")
{
attrValue = et2_compileLegacyJS(attrValue, widget, widget);
}
break;
default:
attrValue = mgr.expandName(attrValue);
break;
}
// Set as attribute or property, as appropriate
if(widget.getAttributeNames().indexOf(attribute) >= 0)
{
// Set as attribute (reflected in DOM)
widget.setAttribute(attribute, attrValue);
} }
else else
{ {
attrValue = mgr.expandName(attrValue); // Set as property, not attribute
widget[attribute] = attrValue;
} }
widget.setAttribute(attribute, attrValue);
}); });
if(widget_class.getPropertyOptions("value") && widget.set_value) if(widget_class.getPropertyOptions("value") && widget.set_value)