Fix action bugs where actions were not properly linking

This commit is contained in:
nathangray 2020-02-27 11:54:55 -07:00
parent 251f09d28b
commit 0f898acbb2
11 changed files with 183 additions and 160 deletions

View File

@ -31,7 +31,7 @@ var et2_core_inheritance_1 = require("./et2_core_inheritance");
require("./et2_core_interfaces"); require("./et2_core_interfaces");
require("./et2_core_common"); require("./et2_core_common");
var et2_core_widget_1 = require("./et2_core_widget"); var et2_core_widget_1 = require("./et2_core_widget");
var egw_action_js_1 = require("../egw_action/egw_action.js"); require("../egw_action/egw_action.js");
require("./et2_types"); require("./et2_types");
/** /**
* Abstract widget class which can be inserted into the DOM. All widget classes * Abstract widget class which can be inserted into the DOM. All widget classes
@ -70,7 +70,7 @@ var et2_DOMWidget = /** @class */ (function (_super) {
this.parentNode = null; this.parentNode = null;
this._attachSet = {}; this._attachSet = {};
if (this._actionManager) { if (this._actionManager) {
var app_om = egw_action_js_1.egw_getObjectManager(this.egw().getAppName(), false, 1); var app_om = egw_getObjectManager(this.egw().getAppName(), false, 1);
if (app_om) { if (app_om) {
var om = app_om.getObjectById(this.id); var om = app_om.getObjectById(this.id);
if (om) if (om)
@ -448,12 +448,12 @@ var et2_DOMWidget = /** @class */ (function (_super) {
*/ */
et2_DOMWidget.prototype._link_actions = function (actions) { et2_DOMWidget.prototype._link_actions = function (actions) {
// Get the top level element for the tree // Get the top level element for the tree
var objectManager = egw_action_js_1.egw_getAppObjectManager(true); var objectManager = egw_getAppObjectManager(true);
var widget_object = objectManager.getObjectById(this.id); var widget_object = objectManager.getObjectById(this.id);
if (widget_object == null) { if (widget_object == null) {
// Add a new container to the object manager which will hold the widget // Add a new container to the object manager which will hold the widget
// objects // objects
widget_object = objectManager.insertObject(false, new egw_action_js_1.egwActionObject(this.id, objectManager, (new et2_action_object_impl(this)).getAOI(), this._actionManager || objectManager.manager.getActionById(this.id) || objectManager.manager)); widget_object = objectManager.insertObject(false, new egwActionObject(this.id, objectManager, (new et2_action_object_impl(this)).getAOI(), this._actionManager || objectManager.manager.getActionById(this.id) || objectManager.manager));
} }
else { else {
widget_object.setAOI((new et2_action_object_impl(this, this.getDOMNode())).getAOI()); widget_object.setAOI((new et2_action_object_impl(this, this.getDOMNode())).getAOI());
@ -717,7 +717,7 @@ var et2_action_object_impl = /** @class */ (function () {
function et2_action_object_impl(_widget, _node) { function et2_action_object_impl(_widget, _node) {
var widget = _widget; var widget = _widget;
var objectNode = _node; var objectNode = _node;
this.aoi = new egw_action_js_1.egwActionObjectInterface(); this.aoi = new egwActionObjectInterface();
this.aoi.getWidget = function () { this.aoi.getWidget = function () {
return widget; return widget;
}; };
@ -734,10 +734,10 @@ var et2_action_object_impl = /** @class */ (function () {
// or EGW_AI_DRAG_OUT // or EGW_AI_DRAG_OUT
this.aoi.doTriggerEvent = function (_event, _data) { this.aoi.doTriggerEvent = function (_event, _data) {
switch (_event) { switch (_event) {
case egw_action_js_1.EGW_AI_DRAG_OVER: case EGW_AI_DRAG_OVER:
jQuery(this.node).addClass("ui-state-active"); jQuery(this.node).addClass("ui-state-active");
break; break;
case egw_action_js_1.EGW_AI_DRAG_OUT: case EGW_AI_DRAG_OUT:
jQuery(this.node).removeClass("ui-state-active"); jQuery(this.node).removeClass("ui-state-active");
break; break;
} }

View File

@ -18,15 +18,7 @@ import {ClassWithAttributes} from './et2_core_inheritance';
import './et2_core_interfaces'; import './et2_core_interfaces';
import './et2_core_common'; import './et2_core_common';
import {et2_widget, WidgetConfig} from "./et2_core_widget"; import {et2_widget, WidgetConfig} from "./et2_core_widget";
import { import '../egw_action/egw_action.js';
EGW_AI_DRAG_OUT,
EGW_AI_DRAG_OVER,
egw_getActionManager,
egw_getAppObjectManager,
egw_getObjectManager,
egwActionObject,
egwActionObjectInterface
} from '../egw_action/egw_action.js';
import './et2_types'; import './et2_types';
/** /**

View File

@ -5,6 +5,7 @@ declare module eT2
declare var etemplate2 : any; declare var etemplate2 : any;
declare class et2_widget{ declare class et2_widget{
destroy() destroy()
getWidgetById(string) : et2_widget;
} }
declare class et2_DOMWidget extends et2_widget{} declare class et2_DOMWidget extends et2_widget{}
declare class et2_baseWidget extends et2_DOMWidget{} declare class et2_baseWidget extends et2_DOMWidget{}
@ -19,8 +20,9 @@ declare class et2_tabbox extends et2_valueWidget {
activateTab(et2_widget); activateTab(et2_widget);
} }
declare class et2_button extends et2_DOMWidget { declare class et2_button extends et2_DOMWidget {
click() : boolean click() : boolean;
onclick: Function onclick: Function;
set_disabled(b: boolean) : void;
} }
declare var et2_surroundingsMgr : any; declare var et2_surroundingsMgr : any;
declare var et2_arrayMgr : any; declare var et2_arrayMgr : any;
@ -62,7 +64,9 @@ declare class et2_customfields_list extends et2_valueWidget {
public customfields : any; public customfields : any;
set_visible(visible : boolean); set_visible(visible : boolean);
} }
declare var et2_nextmatch : any; declare class et2_nextmatch extends et2_DOMWidget {
}
declare var et2_nextmatch_header_bar : any; declare var et2_nextmatch_header_bar : any;
declare var et2_nextmatch_header : any; declare var et2_nextmatch_header : any;
declare var et2_nextmatch_customfields : any; declare var et2_nextmatch_customfields : any;
@ -105,7 +109,9 @@ declare var et2_historylog : any;
declare var et2_hrule : any; declare var et2_hrule : any;
declare var et2_html : any; declare var et2_html : any;
declare var et2_htmlarea : any; declare var et2_htmlarea : any;
declare var et2_iframe : any; declare class et2_iframe extends et2_valueWidget {
public set_src(string);
}
declare var et2_image : any; declare var et2_image : any;
declare var et2_appicon : any; declare var et2_appicon : any;
declare var et2_avatar : any; declare var et2_avatar : any;
@ -177,7 +183,7 @@ declare class et2_nextmatch_taglistheader extends et2_nextmatch_header {}
declare class et2_nextmatch_entryheader extends et2_nextmatch_header {} declare class et2_nextmatch_entryheader extends et2_nextmatch_header {}
declare class et2_nextmatch_customfilter extends et2_nextmatch_filterheader {} declare class et2_nextmatch_customfilter extends et2_nextmatch_filterheader {}
declare function et2_createWidget(type : string, params? : {}, parent? : any) : any; declare function et2_createWidget(type : string, params? : {}, parent? : any) : any;
declare function nm_action(_action : {}, _senders : [], _target : any, _ids? : any) : void; declare function nm_action(_action : {}, _senders : [], _target? : any, _ids? : any) : void;
declare function et2_compileLegacyJS(_code : string, _widget : et2_widget, _context? : HTMLElement) : Function; declare function et2_compileLegacyJS(_code : string, _widget : et2_widget, _context? : HTMLElement) : Function;
// et2_core_xml.js // et2_core_xml.js
declare function et2_loadXMLFromURL(_url : string, _callback : Function, _context? : object, _fail_callback? : Function) : void; declare function et2_loadXMLFromURL(_url : string, _callback : Function, _context? : object, _fail_callback? : Function) : void;

View File

@ -34,7 +34,7 @@ require("./et2_core_interfaces");
var et2_core_widget_1 = require("./et2_core_widget"); var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inheritance_1 = require("./et2_core_inheritance"); var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_DOMWidget_1 = require("./et2_core_DOMWidget"); var et2_core_DOMWidget_1 = require("./et2_core_DOMWidget");
var egw_action_js_1 = require("../egw_action/egw_action.js"); require("../egw_action/egw_action.js");
/** /**
* Class which implements the "grid" XET-Tag * Class which implements the "grid" XET-Tag
* *
@ -733,8 +733,6 @@ var et2_grid = /** @class */ (function (_super) {
* @param {array} actions [ {ID: attributes..}+] as for set_actions * @param {array} actions [ {ID: attributes..}+] as for set_actions
*/ */
et2_grid.prototype._link_actions = function (actions) { et2_grid.prototype._link_actions = function (actions) {
// TODO
return;
// Get the top level element for the tree // Get the top level element for the tree
// @ts-ignore // @ts-ignore
var objectManager = window.egw_getAppObjectManager(true); var objectManager = window.egw_getAppObjectManager(true);
@ -743,7 +741,7 @@ var et2_grid = /** @class */ (function (_super) {
if (widget_object == null) { if (widget_object == null) {
// Add a new container to the object manager which will hold the widget // Add a new container to the object manager which will hold the widget
// objects // objects
widget_object = objectManager.insertObject(false, new egw_action_js_1.egwActionObject(this.id, objectManager, new et2_core_DOMWidget_1.et2_action_object_impl(this), this._actionManager || objectManager.manager.getActionById(this.id) || objectManager.manager)); widget_object = objectManager.insertObject(false, new egwActionObject(this.id, objectManager, new et2_core_DOMWidget_1.et2_action_object_impl(this).getAOI(), this._actionManager || objectManager.manager.getActionById(this.id) || objectManager.manager));
} }
// Delete all old objects // Delete all old objects
widget_object.clear(); widget_object.clear();
@ -759,7 +757,7 @@ var et2_grid = /** @class */ (function (_super) {
if (content) { if (content) {
// Add a new action object to the object manager // Add a new action object to the object manager
var row = jQuery('tr', this.tbody)[r]; var row = jQuery('tr', this.tbody)[r];
var aoi = new et2_core_DOMWidget_1.et2_action_object_impl(this, row); var aoi = new et2_core_DOMWidget_1.et2_action_object_impl(this, row).getAOI();
var obj = widget_object.addObject(content.id || "row_" + r, aoi); var obj = widget_object.addObject(content.id || "row_" + r, aoi);
// Set the data to the content so it's available for the action // Set the data to the content so it's available for the action
obj.data = content; obj.data = content;

View File

@ -18,13 +18,10 @@
import './et2_core_common'; import './et2_core_common';
import './et2_core_interfaces'; import './et2_core_interfaces';
import {et2_register_widget, WidgetConfig, et2_widget} from "./et2_core_widget"; import {et2_register_widget, et2_widget, WidgetConfig} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance"; import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_DOMWidget, et2_action_object_impl} from "./et2_core_DOMWidget"; import {et2_action_object_impl, et2_DOMWidget} from "./et2_core_DOMWidget";
import { import '../egw_action/egw_action.js';
egw_getAppObjectManager,
egwActionObject
} from '../egw_action/egw_action.js';
/** /**
@ -1000,8 +997,6 @@ export class et2_grid extends et2_DOMWidget implements et2_IDetachedDOM, et2_IAl
*/ */
_link_actions(actions : object[]) _link_actions(actions : object[])
{ {
// TODO
return;
// Get the top level element for the tree // Get the top level element for the tree
// @ts-ignore // @ts-ignore
let objectManager = window.egw_getAppObjectManager(true); let objectManager = window.egw_getAppObjectManager(true);
@ -1011,7 +1006,7 @@ export class et2_grid extends et2_DOMWidget implements et2_IDetachedDOM, et2_IAl
// Add a new container to the object manager which will hold the widget // Add a new container to the object manager which will hold the widget
// objects // objects
widget_object = objectManager.insertObject(false, new egwActionObject( widget_object = objectManager.insertObject(false, new egwActionObject(
this.id, objectManager, new et2_action_object_impl(this), this.id, objectManager, new et2_action_object_impl(this).getAOI(),
this._actionManager || objectManager.manager.getActionById(this.id) || objectManager.manager this._actionManager || objectManager.manager.getActionById(this.id) || objectManager.manager
)); ));
} }
@ -1033,7 +1028,7 @@ export class et2_grid extends et2_DOMWidget implements et2_IDetachedDOM, et2_IAl
{ {
// Add a new action object to the object manager // Add a new action object to the object manager
const row = jQuery('tr', this.tbody)[r]; const row = jQuery('tr', this.tbody)[r];
const aoi = new et2_action_object_impl(this, row); const aoi = new et2_action_object_impl(this, row).getAOI();
const obj = widget_object.addObject(content.id || "row_" + r, aoi); const obj = widget_object.addObject(content.id || "row_" + r, aoi);
// Set the data to the content so it's available for the action // Set the data to the content so it's available for the action

View File

@ -164,7 +164,7 @@ var et2_portlet = /** @class */ (function (_super) {
if (widget_object == null) { if (widget_object == null) {
// Add a new container to the object manager which will hold the widget // Add a new container to the object manager which will hold the widget
// objects // objects
widget_object = objectManager.insertObject(false, new egwActionObject(this.id, objectManager, new et2_core_DOMWidget_1.et2_action_object_impl(this), this._actionManager || objectManager.manager.getActionById(this.id) || objectManager.manager)); widget_object = objectManager.insertObject(false, new egwActionObject(this.id, objectManager, new et2_core_DOMWidget_1.et2_action_object_impl(this).getAOI(), this._actionManager || objectManager.manager.getActionById(this.id) || objectManager.manager));
} }
// Delete all old objects // Delete all old objects
widget_object.clear(); widget_object.clear();

View File

@ -226,7 +226,7 @@ class et2_portlet extends et2_valueWidget
// Add a new container to the object manager which will hold the widget // Add a new container to the object manager which will hold the widget
// objects // objects
widget_object = objectManager.insertObject(false, new egwActionObject( widget_object = objectManager.insertObject(false, new egwActionObject(
this.id, objectManager, <egwActionObjectInterface><unknown>new et2_action_object_impl(<et2_DOMWidget><unknown>this), this.id, objectManager, <egwActionObjectInterface><unknown>new et2_action_object_impl(<et2_DOMWidget><unknown>this).getAOI(),
this._actionManager || (<egwAction><unknown>objectManager.manager).getActionById(this.id) || objectManager.manager this._actionManager || (<egwAction><unknown>objectManager.manager).getActionById(this.id) || objectManager.manager
)); ));
} }

View File

@ -32,7 +32,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
var et2_core_DOMWidget_1 = require("./et2_core_DOMWidget"); var et2_core_DOMWidget_1 = require("./et2_core_DOMWidget");
var et2_core_widget_1 = require("./et2_core_widget"); var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inheritance_1 = require("./et2_core_inheritance"); var et2_core_inheritance_1 = require("./et2_core_inheritance");
var egw_action_js_1 = require("../egw_action/egw_action.js"); require("../egw_action/egw_action.js");
require("./et2_types"); require("./et2_types");
/** /**
* This toolbar gets its contents from its actions * This toolbar gets its contents from its actions
@ -79,7 +79,7 @@ var et2_toolbar = /** @class */ (function (_super) {
_this._build_menu(et2_toolbar.default_toolbar, true); _this._build_menu(et2_toolbar.default_toolbar, true);
return _this; return _this;
} }
;
et2_toolbar.prototype.destroy = function () { et2_toolbar.prototype.destroy = function () {
// Destroy widget // Destroy widget
if (this.div && this.div.data('ui-menu')) if (this.div && this.div.data('ui-menu'))
@ -498,9 +498,9 @@ var et2_toolbar = /** @class */ (function (_super) {
et2_toolbar.prototype._link_actions = function (actions) { et2_toolbar.prototype._link_actions = function (actions) {
this._build_menu(actions); this._build_menu(actions);
var self = this; var self = this;
var gom = egw_action_js_1.egw_getObjectManager(this.egw().appName, true, 1); var gom = egw_getObjectManager(this.egw().appName, true, 1);
if (this._objectManager == null) { if (this._objectManager == null) {
this._objectManager = gom.addObject(new egw_action_js_1.egwActionObjectManager(this.id, this._actionManager)); this._objectManager = gom.addObject(new egwActionObjectManager(this.id, this._actionManager));
this._objectManager.handleKeyPress = function (_keyCode, _shift, _ctrl, _alt) { this._objectManager.handleKeyPress = function (_keyCode, _shift, _ctrl, _alt) {
for (var i = 0; i < self._actionManager.children.length; i++) { for (var i = 0; i < self._actionManager.children.length; i++) {
var action = self._actionManager.children[i]; var action = self._actionManager.children[i];
@ -515,7 +515,7 @@ var et2_toolbar = /** @class */ (function (_super) {
return true; return true;
} }
} }
return egw_action_js_1.egwActionObject.prototype.handleKeyPress.call(this, _keyCode, _shift, _ctrl, _alt); return egwActionObject.prototype.handleKeyPress.call(this, _keyCode, _shift, _ctrl, _alt);
}; };
this._objectManager.parent.updateFocusedChild(this._objectManager, true); this._objectManager.parent.updateFocusedChild(this._objectManager, true);
} }

View File

@ -19,11 +19,7 @@
import {et2_DOMWidget} from "./et2_core_DOMWidget"; import {et2_DOMWidget} from "./et2_core_DOMWidget";
import {et2_register_widget, WidgetConfig} from "./et2_core_widget"; import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance"; import {ClassWithAttributes} from "./et2_core_inheritance";
import { import '../egw_action/egw_action.js';
egw_getObjectManager,
egwActionObject,
egwActionObjectManager
} from '../egw_action/egw_action.js';
import './et2_types'; import './et2_types';
/** /**
@ -631,7 +627,7 @@ class et2_toolbar extends et2_DOMWidget implements et2_IInput
} }
} }
return egwActionObject.prototype.handleKeyPress.call(this, _keyCode,_shift,_ctrl,_alt); return egwActionObject.prototype.handleKeyPress.call(this, _keyCode,_shift,_ctrl,_alt);
} };
this._objectManager.parent.updateFocusedChild(this._objectManager, true); this._objectManager.parent.updateFocusedChild(this._objectManager, true);
} }
} }

View File

@ -87,7 +87,7 @@ var etemplate2 = /** @class */ (function () {
_menuaction = "EGroupware\\Api\\Etemplate::ajax_process_content"; _menuaction = "EGroupware\\Api\\Etemplate::ajax_process_content";
} }
// Copy the given parameters // Copy the given parameters
this.DOMContainer = _container; this._DOMContainer = _container;
this.menuaction = _menuaction; this.menuaction = _menuaction;
// Unique ID to prevent DOM collisions across multiple templates // Unique ID to prevent DOM collisions across multiple templates
this.uniqueId = _container.getAttribute("id") ? _container.getAttribute("id").replace('.', '-') : ''; this.uniqueId = _container.getAttribute("id") ? _container.getAttribute("id").replace('.', '-') : '';
@ -95,7 +95,7 @@ var etemplate2 = /** @class */ (function () {
* Preset the object variable * Preset the object variable
* @type {et2_container} * @type {et2_container}
*/ */
this.widgetContainer = null; this._widgetContainer = null;
// List of templates (XML) that are known, not always used. Indexed by id. // List of templates (XML) that are known, not always used. Indexed by id.
// We share list of templates with iframes and popups // We share list of templates with iframes and popups
try { try {
@ -136,30 +136,30 @@ var etemplate2 = /** @class */ (function () {
} }
this.resize_timeout = setTimeout(function () { this.resize_timeout = setTimeout(function () {
self.resize_timeout = false; self.resize_timeout = false;
if (self.widgetContainer) { if (self._widgetContainer) {
var appHeader = jQuery('#divAppboxHeader'); var appHeader = jQuery('#divAppboxHeader');
//Calculate the excess height //Calculate the excess height
excess_height = egw(window).is_popup() ? jQuery(window).height() - jQuery(self.DOMContainer).height() - appHeader.outerHeight() + 11 : 0; excess_height = egw(window).is_popup() ? jQuery(window).height() - jQuery(self._DOMContainer).height() - appHeader.outerHeight() + 11 : 0;
// Recalculate excess height if the appheader is shown // Recalculate excess height if the appheader is shown
if (appHeader.length > 0 && appHeader.is(':visible')) if (appHeader.length > 0 && appHeader.is(':visible'))
excess_height -= appHeader.outerHeight() - 9; excess_height -= appHeader.outerHeight() - 9;
// Do not resize if the template height is bigger than screen available height // Do not resize if the template height is bigger than screen available height
// For templates which have sub templates and they are bigger than screenHeight // For templates which have sub templates and they are bigger than screenHeight
if (screen.availHeight < jQuery(self.DOMContainer).height()) if (screen.availHeight < jQuery(self._DOMContainer).height())
excess_height = 0; excess_height = 0;
// Call the "resize" event of all functions which implement the // Call the "resize" event of all functions which implement the
// "IResizeable" interface // "IResizeable" interface
self.widgetContainer.iterateOver(function (_widget) { self._widgetContainer.iterateOver(function (_widget) {
_widget.resize(excess_height); _widget.resize(excess_height);
}, self, et2_IResizeable); }, self, et2_IResizeable);
} }
}, 100); }, 100);
} }
// Initial resize needs to be resized immediately (for instance for nextmatch resize) // Initial resize needs to be resized immediately (for instance for nextmatch resize)
else if (this.widgetContainer) { else if (this._widgetContainer) {
// Call the "resize" event of all functions which implement the // Call the "resize" event of all functions which implement the
// "IResizeable" interface // "IResizeable" interface
this.widgetContainer.iterateOver(function (_widget) { this._widgetContainer.iterateOver(function (_widget) {
_widget.resize(excess_height); _widget.resize(excess_height);
}, this, et2_IResizeable); }, this, et2_IResizeable);
} }
@ -169,7 +169,7 @@ var etemplate2 = /** @class */ (function () {
* Clears the current instance. * Clears the current instance.
*/ */
etemplate2.prototype.clear = function () { etemplate2.prototype.clear = function () {
jQuery(this.DOMContainer).trigger('clear'); jQuery(this._DOMContainer).trigger('clear');
// Remove any handlers on window (resize) // Remove any handlers on window (resize)
if (this.uniqueId) { if (this.uniqueId) {
jQuery(window).off("." + this.uniqueId); jQuery(window).off("." + this.uniqueId);
@ -179,13 +179,13 @@ var etemplate2 = /** @class */ (function () {
this.destroy_session(); this.destroy_session();
this.unbind_unload(); this.unbind_unload();
} }
if (this.widgetContainer != null) { if (this._widgetContainer != null) {
// Un-register handler // Un-register handler
this.widgetContainer.egw().unregisterJSONPlugin(this.handle_assign, this, 'assign'); this._widgetContainer.egw().unregisterJSONPlugin(this.handle_assign, this, 'assign');
this.widgetContainer.destroy(); this._widgetContainer.destroy();
this.widgetContainer = null; this._widgetContainer = null;
} }
jQuery(this.DOMContainer).empty(); jQuery(this._DOMContainer).empty();
// Remove self from the index // Remove self from the index
for (var name_1 in etemplate2.templates) { for (var name_1 in etemplate2.templates) {
if (typeof etemplate2._byTemplate[name_1] == "undefined") if (typeof etemplate2._byTemplate[name_1] == "undefined")
@ -197,6 +197,27 @@ var etemplate2 = /** @class */ (function () {
} }
} }
}; };
Object.defineProperty(etemplate2.prototype, "widgetContainer", {
get: function () {
return this._widgetContainer;
},
enumerable: true,
configurable: true
});
Object.defineProperty(etemplate2.prototype, "DOMContainer", {
get: function () {
return this._DOMContainer;
},
enumerable: true,
configurable: true
});
Object.defineProperty(etemplate2.prototype, "etemplate_exec_id", {
get: function () {
return this._etemplate_exec_id;
},
enumerable: true,
configurable: true
});
/** /**
* Creates an associative array containing the data array managers for each part * Creates an associative array containing the data array managers for each part
* of the associative data array. A part is something like "content", "readonlys" * of the associative data array. A part is something like "content", "readonlys"
@ -227,11 +248,11 @@ var etemplate2 = /** @class */ (function () {
break; break;
case "readonlys": case "readonlys":
result[key] = new et2_readonlysArrayMgr(_data[key]); result[key] = new et2_readonlysArrayMgr(_data[key]);
result[key].perspectiveData.owner = this.widgetContainer; result[key].perspectiveData.owner = this._widgetContainer;
break; break;
default: default:
result[key] = new et2_arrayMgr(_data[key]); result[key] = new et2_arrayMgr(_data[key]);
result[key].perspectiveData.owner = this.widgetContainer; result[key].perspectiveData.owner = this._widgetContainer;
} }
} }
return result; return result;
@ -243,9 +264,9 @@ var etemplate2 = /** @class */ (function () {
* calls, eg. via et2_dialog. * calls, eg. via et2_dialog.
*/ */
etemplate2.prototype.bind_unload = function () { etemplate2.prototype.bind_unload = function () {
if (this.etemplate_exec_id) { if (this._etemplate_exec_id) {
this.destroy_session = jQuery.proxy(function (ev) { this.destroy_session = jQuery.proxy(function (ev) {
var request = egw.json("EGroupware\\Api\\Etemplate::ajax_destroy_session", [this.etemplate_exec_id], null, null, false); var request = egw.json("EGroupware\\Api\\Etemplate::ajax_destroy_session", [this._etemplate_exec_id], null, null, false);
request.sendRequest(); request.sendRequest();
}, this); }, this);
if (!window.onbeforeunload) { if (!window.onbeforeunload) {
@ -325,7 +346,7 @@ var etemplate2 = /** @class */ (function () {
egw(currentapp, window).registerJSONPlugin(this.handle_assign, this, 'assign'); egw(currentapp, window).registerJSONPlugin(this.handle_assign, this, 'assign');
if (egw.debug_level() >= 3) { if (egw.debug_level() >= 3) {
if (console.groupCollapsed) { if (console.groupCollapsed) {
egw.window.console.groupCollapsed("Loading %s into ", _name, '#' + this.DOMContainer.id); egw.window.console.groupCollapsed("Loading %s into ", _name, '#' + this._DOMContainer.id);
} }
} }
// Timing & profiling on debug level 'log' (4) // Timing & profiling on debug level 'log' (4)
@ -365,13 +386,13 @@ var etemplate2 = /** @class */ (function () {
// Clear any existing instance // Clear any existing instance
this.clear(); this.clear();
// Create the basic widget container and attach it to the DOM // Create the basic widget container and attach it to the DOM
this.widgetContainer = new et2_core_baseWidget_1.et2_container(null); this._widgetContainer = new et2_core_baseWidget_1.et2_container(null);
this.widgetContainer.setApiInstance(egw(currentapp, egw.elemWindow(this.DOMContainer))); this._widgetContainer.setApiInstance(egw(currentapp, egw.elemWindow(this._DOMContainer)));
this.widgetContainer.setInstanceManager(this); this._widgetContainer.setInstanceManager(this);
this.widgetContainer.setParentDOMNode(this.DOMContainer); this._widgetContainer.setParentDOMNode(this._DOMContainer);
// store the id to submit it back to server // store the id to submit it back to server
if (_data) { if (_data) {
this.etemplate_exec_id = _data.etemplate_exec_id; this._etemplate_exec_id = _data.etemplate_exec_id;
// set app_header // set app_header
if (typeof _data.app_header == 'string') { if (typeof _data.app_header == 'string') {
// @ts-ignore // @ts-ignore
@ -392,11 +413,11 @@ var etemplate2 = /** @class */ (function () {
} }
etemplate2._byTemplate[_name].push(this); etemplate2._byTemplate[_name].push(this);
// Read the XML structure of the requested template // Read the XML structure of the requested template
this.widgetContainer.loadFromXML(etemplate2.templates[this.name]); this._widgetContainer.loadFromXML(etemplate2.templates[this.name]);
// List of Promises from widgets that are not quite fully loaded // List of Promises from widgets that are not quite fully loaded
var deferred = []; var deferred = [];
// Inform the widget tree that it has been successfully loaded. // Inform the widget tree that it has been successfully loaded.
this.widgetContainer.loadingFinished(deferred); this._widgetContainer.loadingFinished(deferred);
// Connect to the window resize event // Connect to the window resize event
jQuery(window).on("resize." + this.uniqueId, this, function (e) { jQuery(window).on("resize." + this.uniqueId, this, function (e) {
e.data.resize(e); e.data.resize(e);
@ -424,8 +445,8 @@ var etemplate2 = /** @class */ (function () {
// Trigger the "resize" event // Trigger the "resize" event
this.resize(); this.resize();
// Automatically set focus to first visible input for popups // Automatically set focus to first visible input for popups
if (this.widgetContainer._egw.is_popup() && jQuery('[autofocus]', this.DOMContainer).focus().length == 0) { if (this._widgetContainer._egw.is_popup() && jQuery('[autofocus]', this._DOMContainer).focus().length == 0) {
var $input = jQuery('input:visible', this.DOMContainer) var $input = jQuery('input:visible', this._DOMContainer)
// Date fields open the calendar popup on focus // Date fields open the calendar popup on focus
.not('.et2_date') .not('.et2_date')
.filter(function () { .filter(function () {
@ -450,13 +471,13 @@ var etemplate2 = /** @class */ (function () {
// Let the application that loaded it know too // Let the application that loaded it know too
app[this.app].et2_ready(this, this.name); app[this.app].et2_ready(this, this.name);
} }
jQuery(this.DOMContainer).trigger('load', this); jQuery(this._DOMContainer).trigger('load', this);
if (etemplate2.templates[this.name].attributes.onload) { if (etemplate2.templates[this.name].attributes.onload) {
var onload_1 = et2_checkType(etemplate2.templates[this.name].attributes.onload.value, 'js', 'onload', {}); var onload_1 = et2_checkType(etemplate2.templates[this.name].attributes.onload.value, 'js', 'onload', {});
if (typeof onload_1 === 'string') { if (typeof onload_1 === 'string') {
onload_1 = et2_compileLegacyJS(onload_1, this, this.widgetContainer); onload_1 = et2_compileLegacyJS(onload_1, this, this._widgetContainer);
} }
onload_1.call(this.widgetContainer); onload_1.call(this._widgetContainer);
} }
// Profiling // Profiling
if (egw.debug_level() >= 4) { if (egw.debug_level() >= 4) {
@ -479,7 +500,7 @@ var etemplate2 = /** @class */ (function () {
try { try {
if (etemplate2.templates[_name]) { if (etemplate2.templates[_name]) {
// Set array managers first, or errors will happen // Set array managers first, or errors will happen
this.widgetContainer.setArrayMgrs(this._createArrayManagers(_data)); this._widgetContainer.setArrayMgrs(this._createArrayManagers(_data));
// Already have it // Already have it
_load.apply(this, []); _load.apply(this, []);
return; return;
@ -510,7 +531,7 @@ var etemplate2 = /** @class */ (function () {
}, this); }, this);
// Split the given data into array manager objects and pass those to the // Split the given data into array manager objects and pass those to the
// widget container - do this here because file is loaded async // widget container - do this here because file is loaded async
this.widgetContainer.setArrayMgrs(this._createArrayManagers(_data)); this._widgetContainer.setArrayMgrs(this._createArrayManagers(_data));
}, this); }, this);
}; };
/** /**
@ -520,7 +541,7 @@ var etemplate2 = /** @class */ (function () {
*/ */
etemplate2.prototype.isDirty = function () { etemplate2.prototype.isDirty = function () {
var dirty = false; var dirty = false;
this.widgetContainer.iterateOver(function (_widget) { this._widgetContainer.iterateOver(function (_widget) {
if (_widget.isDirty && _widget.isDirty()) { if (_widget.isDirty && _widget.isDirty()) {
dirty = true; dirty = true;
} }
@ -532,7 +553,7 @@ var etemplate2 = /** @class */ (function () {
*/ */
etemplate2.prototype.autocomplete_fixer = function () { etemplate2.prototype.autocomplete_fixer = function () {
var self = this; var self = this;
var form = self.DOMContainer; var form = self._DOMContainer;
// Safari always do the autofill for password field regardless of autocomplete = off // Safari always do the autofill for password field regardless of autocomplete = off
// and since there's no other way to switch the autocomplete of, we should switch the // and since there's no other way to switch the autocomplete of, we should switch the
// form autocomplete off (e.g. compose dialog, attachment password field) // form autocomplete off (e.g. compose dialog, attachment password field)
@ -558,7 +579,7 @@ var etemplate2 = /** @class */ (function () {
}; };
etemplate2.prototype._set_button = function (button, values) { etemplate2.prototype._set_button = function (button, values) {
if (typeof button == 'string') { if (typeof button == 'string') {
button = this.widgetContainer.getWidgetById(button); button = this._widgetContainer.getWidgetById(button);
} }
// Button parameter used for submit buttons in datagrid // Button parameter used for submit buttons in datagrid
// TODO: This should probably go in nextmatch's getValues(), along with selected rows somehow. // TODO: This should probably go in nextmatch's getValues(), along with selected rows somehow.
@ -608,11 +629,11 @@ var etemplate2 = /** @class */ (function () {
* @return {boolean} true if submit was send, false if eg. validation stoped submit * @return {boolean} true if submit was send, false if eg. validation stoped submit
*/ */
etemplate2.prototype.submit = function (button, async, no_validation, _container) { etemplate2.prototype.submit = function (button, async, no_validation, _container) {
var api = this.widgetContainer.egw(); var api = this._widgetContainer.egw();
if (typeof no_validation == 'undefined') { if (typeof no_validation == 'undefined') {
no_validation = false; no_validation = false;
} }
var container = _container || this.widgetContainer; var container = _container || this._widgetContainer;
// Get the form values // Get the form values
var values = this.getValues(container); var values = this.getValues(container);
// Trigger the submit event // Trigger the submit event
@ -637,13 +658,13 @@ var etemplate2 = /** @class */ (function () {
this.autocomplete_fixer(); this.autocomplete_fixer();
// unbind our session-destroy handler, as we are submitting // unbind our session-destroy handler, as we are submitting
this.unbind_unload(); this.unbind_unload();
var request = api.json(this.menuaction, [this.etemplate_exec_id, values, no_validation], function () { var request = api.json(this.menuaction, [this._etemplate_exec_id, values, no_validation], function () {
api.loading_prompt('et2_submit_spinner', false); api.loading_prompt('et2_submit_spinner', false);
}, this, async); }, this, async);
request.sendRequest(); request.sendRequest();
} }
else { else {
this.widgetContainer.egw().debug("warn", "Missing menuaction for submit. Values: ", values); this._widgetContainer.egw().debug("warn", "Missing menuaction for submit. Values: ", values);
} }
} }
return canSubmit; return canSubmit;
@ -658,10 +679,10 @@ var etemplate2 = /** @class */ (function () {
*/ */
etemplate2.prototype.postSubmit = function (button) { etemplate2.prototype.postSubmit = function (button) {
// Get the form values // Get the form values
var values = this.getValues(this.widgetContainer); var values = this.getValues(this._widgetContainer);
// Trigger the submit event // Trigger the submit event
var canSubmit = true; var canSubmit = true;
this.widgetContainer.iterateOver(function (_widget) { this._widgetContainer.iterateOver(function (_widget) {
if (_widget.submit(values) === false) { if (_widget.submit(values) === false) {
canSubmit = false; canSubmit = false;
} }
@ -672,11 +693,11 @@ var etemplate2 = /** @class */ (function () {
// unbind our session-destroy handler, as we are submitting // unbind our session-destroy handler, as we are submitting
this.unbind_unload(); this.unbind_unload();
var form = jQuery("<form id='form' action='" + egw().webserverUrl + var form = jQuery("<form id='form' action='" + egw().webserverUrl +
"/index.php?menuaction=" + this.widgetContainer.egw().getAppName() + ".EGroupware\\Api\\Etemplate.process_exec&ajax=true' method='POST'>"); "/index.php?menuaction=" + this._widgetContainer.egw().getAppName() + ".EGroupware\\Api\\Etemplate.process_exec&ajax=true' method='POST'>");
var etemplate_id = jQuery(document.createElement("input")) var etemplate_id = jQuery(document.createElement("input"))
.attr("name", 'etemplate_exec_id') .attr("name", 'etemplate_exec_id')
.attr("type", 'hidden') .attr("type", 'hidden')
.val(this.etemplate_exec_id) .val(this._etemplate_exec_id)
.appendTo(form); .appendTo(form);
var input = document.createElement("input"); var input = document.createElement("input");
input.type = "hidden"; input.type = "hidden";
@ -790,7 +811,7 @@ var etemplate2 = /** @class */ (function () {
// msg, app; // unused but required by function signature // msg, app; // unused but required by function signature
var refresh_done = false; var refresh_done = false;
// Refresh nextmatches // Refresh nextmatches
this.widgetContainer.iterateOver(function (_widget) { this._widgetContainer.iterateOver(function (_widget) {
// Trigger refresh // Trigger refresh
_widget.refresh(id, type); _widget.refresh(id, type);
refresh_done = true; refresh_done = true;
@ -829,11 +850,11 @@ var etemplate2 = /** @class */ (function () {
// Sometimes changes take time // Sometimes changes take time
var deferred = []; var deferred = [];
// Skip hidden etemplates // Skip hidden etemplates
if (jQuery(this.DOMContainer).filter(':visible').length === 0) { if (jQuery(this._DOMContainer).filter(':visible').length === 0) {
return []; return [];
} }
// Allow any widget to change for printing // Allow any widget to change for printing
this.widgetContainer.iterateOver(function (_widget) { this._widgetContainer.iterateOver(function (_widget) {
// Skip widgets from a different etemplate (home) // Skip widgets from a different etemplate (home)
if (_widget.getInstanceManager() != this) if (_widget.getInstanceManager() != this)
return; return;
@ -891,7 +912,7 @@ var etemplate2 = /** @class */ (function () {
for (var name_3 in etemplate2._byTemplate) { for (var name_3 in etemplate2._byTemplate) {
for (var i = 0; i < etemplate2._byTemplate[name_3].length; i++) { for (var i = 0; i < etemplate2._byTemplate[name_3].length; i++) {
var et = etemplate2._byTemplate[name_3][i]; var et = etemplate2._byTemplate[name_3][i];
if (et.DOMContainer.getAttribute("id") == id) { if (et._DOMContainer.getAttribute("id") == id) {
return et; return et;
} }
} }
@ -945,7 +966,7 @@ var etemplate2 = /** @class */ (function () {
// regular et2 re-load // regular et2 re-load
if (typeof data.url == "string" && typeof data.data === 'object') { if (typeof data.url == "string" && typeof data.data === 'object') {
// @ts-ignore // @ts-ignore
if (typeof this.load == 'function') { if (this && typeof this.load == 'function') {
// Called from etemplate // Called from etemplate
// @ts-ignore // @ts-ignore
this.load(data.name, data.url, data.data); this.load(data.name, data.url, data.data);
@ -983,7 +1004,7 @@ var etemplate2 = /** @class */ (function () {
// Display validation errors // Display validation errors
for (var id in _response.data) { for (var id in _response.data) {
// @ts-ignore // @ts-ignore
var widget = this.widgetContainer.getWidgetById(id); var widget = this._widgetContainer.getWidgetById(id);
if (widget && widget.instanceOf(et2_core_baseWidget_1.et2_baseWidget)) { if (widget && widget.instanceOf(et2_core_baseWidget_1.et2_baseWidget)) {
widget.showMessage(_response.data[id], 'validation_error'); widget.showMessage(_response.data[id], 'validation_error');
// Handle validation_error (messages coming back from server as a response) if widget is children of a tabbox // Handle validation_error (messages coming back from server as a response) if widget is children of a tabbox
@ -1018,20 +1039,20 @@ var etemplate2 = /** @class */ (function () {
(typeof res.data.key != 'undefined') && (typeof res.data.key != 'undefined') &&
(typeof res.data.value != 'undefined')) { (typeof res.data.value != 'undefined')) {
if (typeof res.data.etemplate_exec_id == 'undefined' || if (typeof res.data.etemplate_exec_id == 'undefined' ||
res.data.etemplate_exec_id != this.etemplate_exec_id) { res.data.etemplate_exec_id != this._etemplate_exec_id) {
// Not for this etemplate, but not an error // Not for this etemplate, but not an error
return false; return false;
} }
if (res.data.key == 'etemplate_exec_id') { if (res.data.key == 'etemplate_exec_id') {
this.etemplate_exec_id = res.data.value; this._etemplate_exec_id = res.data.value;
return true; return true;
} }
if (this.widgetContainer == null) { if (this._widgetContainer == null) {
// Right etemplate, but it's already been cleared. // Right etemplate, but it's already been cleared.
egw.debug('warn', "Tried to call assign on an un-loaded etemplate", res.data); egw.debug('warn', "Tried to call assign on an un-loaded etemplate", res.data);
return false; return false;
} }
var widget = this.widgetContainer.getWidgetById(res.data.id); var widget = this._widgetContainer.getWidgetById(res.data.id);
if (widget) { if (widget) {
if (typeof widget['set_' + res.data.key] != 'function') { if (typeof widget['set_' + res.data.key] != 'function') {
egw.debug('warn', "Cannot set %s attribute %s via JSON assign, no set_%s()", res.data.id, res.data.key, res.data.key); egw.debug('warn', "Cannot set %s attribute %s via JSON assign, no set_%s()", res.data.id, res.data.key, res.data.key);

View File

@ -95,14 +95,14 @@ export class etemplate2
private static _byTemplate = {}; private static _byTemplate = {};
private etemplate_exec_id: string; private _etemplate_exec_id: string;
private readonly menuaction: string; private readonly menuaction: string;
name: string; name: string;
private uniqueId: void | string; private uniqueId: void | string;
private template_base_url: string; private template_base_url: string;
private widgetContainer: et2_container; private _widgetContainer: et2_container;
private DOMContainer: HTMLElement; private _DOMContainer: HTMLElement;
private resize_timeout: number | boolean; private resize_timeout: number | boolean;
private destroy_session: any; private destroy_session: any;
@ -117,7 +117,7 @@ export class etemplate2
} }
// Copy the given parameters // Copy the given parameters
this.DOMContainer = _container; this._DOMContainer = _container;
this.menuaction = _menuaction; this.menuaction = _menuaction;
// Unique ID to prevent DOM collisions across multiple templates // Unique ID to prevent DOM collisions across multiple templates
@ -127,7 +127,7 @@ export class etemplate2
* Preset the object variable * Preset the object variable
* @type {et2_container} * @type {et2_container}
*/ */
this.widgetContainer = null; this._widgetContainer = null;
// List of templates (XML) that are known, not always used. Indexed by id. // List of templates (XML) that are known, not always used. Indexed by id.
@ -181,22 +181,22 @@ export class etemplate2
this.resize_timeout = setTimeout(function () this.resize_timeout = setTimeout(function ()
{ {
self.resize_timeout = false; self.resize_timeout = false;
if (self.widgetContainer) if (self._widgetContainer)
{ {
const appHeader = jQuery('#divAppboxHeader'); const appHeader = jQuery('#divAppboxHeader');
//Calculate the excess height //Calculate the excess height
excess_height = egw(window).is_popup() ? jQuery(window).height() - jQuery(self.DOMContainer).height() - appHeader.outerHeight() + 11 : 0; excess_height = egw(window).is_popup() ? jQuery(window).height() - jQuery(self._DOMContainer).height() - appHeader.outerHeight() + 11 : 0;
// Recalculate excess height if the appheader is shown // Recalculate excess height if the appheader is shown
if (appHeader.length > 0 && appHeader.is(':visible')) excess_height -= appHeader.outerHeight() - 9; if (appHeader.length > 0 && appHeader.is(':visible')) excess_height -= appHeader.outerHeight() - 9;
// Do not resize if the template height is bigger than screen available height // Do not resize if the template height is bigger than screen available height
// For templates which have sub templates and they are bigger than screenHeight // For templates which have sub templates and they are bigger than screenHeight
if (screen.availHeight < jQuery(self.DOMContainer).height()) excess_height = 0; if (screen.availHeight < jQuery(self._DOMContainer).height()) excess_height = 0;
// Call the "resize" event of all functions which implement the // Call the "resize" event of all functions which implement the
// "IResizeable" interface // "IResizeable" interface
self.widgetContainer.iterateOver(function (_widget) self._widgetContainer.iterateOver(function (_widget)
{ {
_widget.resize(excess_height); _widget.resize(excess_height);
}, self, et2_IResizeable); }, self, et2_IResizeable);
@ -204,11 +204,11 @@ export class etemplate2
}, 100); }, 100);
} }
// Initial resize needs to be resized immediately (for instance for nextmatch resize) // Initial resize needs to be resized immediately (for instance for nextmatch resize)
else if (this.widgetContainer) else if (this._widgetContainer)
{ {
// Call the "resize" event of all functions which implement the // Call the "resize" event of all functions which implement the
// "IResizeable" interface // "IResizeable" interface
this.widgetContainer.iterateOver(function (_widget) this._widgetContainer.iterateOver(function (_widget)
{ {
_widget.resize(excess_height); _widget.resize(excess_height);
}, this, et2_IResizeable); }, this, et2_IResizeable);
@ -220,7 +220,7 @@ export class etemplate2
*/ */
public clear() public clear()
{ {
jQuery(this.DOMContainer).trigger('clear'); jQuery(this._DOMContainer).trigger('clear');
// Remove any handlers on window (resize) // Remove any handlers on window (resize)
if (this.uniqueId) if (this.uniqueId)
@ -234,15 +234,15 @@ export class etemplate2
this.destroy_session(); this.destroy_session();
this.unbind_unload(); this.unbind_unload();
} }
if (this.widgetContainer != null) if (this._widgetContainer != null)
{ {
// Un-register handler // Un-register handler
this.widgetContainer.egw().unregisterJSONPlugin(this.handle_assign, this, 'assign'); this._widgetContainer.egw().unregisterJSONPlugin(this.handle_assign, this, 'assign');
this.widgetContainer.destroy(); this._widgetContainer.destroy();
this.widgetContainer = null; this._widgetContainer = null;
} }
jQuery(this.DOMContainer).empty(); jQuery(this._DOMContainer).empty();
// Remove self from the index // Remove self from the index
for (const name in etemplate2.templates) for (const name in etemplate2.templates)
@ -258,6 +258,21 @@ export class etemplate2
} }
} }
get widgetContainer(): et2_container
{
return this._widgetContainer;
}
get DOMContainer(): HTMLElement
{
return this._DOMContainer;
}
get etemplate_exec_id(): string
{
return this._etemplate_exec_id;
}
/** /**
* Creates an associative array containing the data array managers for each part * Creates an associative array containing the data array managers for each part
* of the associative data array. A part is something like "content", "readonlys" * of the associative data array. A part is something like "content", "readonlys"
@ -297,11 +312,11 @@ export class etemplate2
break; break;
case "readonlys": case "readonlys":
result[key] = new et2_readonlysArrayMgr(_data[key]); result[key] = new et2_readonlysArrayMgr(_data[key]);
result[key].perspectiveData.owner = this.widgetContainer; result[key].perspectiveData.owner = this._widgetContainer;
break; break;
default: default:
result[key] = new et2_arrayMgr(_data[key]); result[key] = new et2_arrayMgr(_data[key]);
result[key].perspectiveData.owner = this.widgetContainer; result[key].perspectiveData.owner = this._widgetContainer;
} }
} }
@ -316,12 +331,12 @@ export class etemplate2
*/ */
bind_unload() bind_unload()
{ {
if (this.etemplate_exec_id) if (this._etemplate_exec_id)
{ {
this.destroy_session = jQuery.proxy(function (ev) this.destroy_session = jQuery.proxy(function (ev)
{ {
const request = egw.json("EGroupware\\Api\\Etemplate::ajax_destroy_session", const request = egw.json("EGroupware\\Api\\Etemplate::ajax_destroy_session",
[this.etemplate_exec_id], null, null, false); [this._etemplate_exec_id], null, null, false);
request.sendRequest(); request.sendRequest();
}, this); }, this);
@ -424,7 +439,7 @@ export class etemplate2
{ {
if (console.groupCollapsed) if (console.groupCollapsed)
{ {
egw.window.console.groupCollapsed("Loading %s into ", _name, '#' + this.DOMContainer.id); egw.window.console.groupCollapsed("Loading %s into ", _name, '#' + this._DOMContainer.id);
} }
} }
// Timing & profiling on debug level 'log' (4) // Timing & profiling on debug level 'log' (4)
@ -475,15 +490,15 @@ export class etemplate2
this.clear(); this.clear();
// Create the basic widget container and attach it to the DOM // Create the basic widget container and attach it to the DOM
this.widgetContainer = new et2_container(null); this._widgetContainer = new et2_container(null);
this.widgetContainer.setApiInstance(egw(currentapp, egw.elemWindow(this.DOMContainer))); this._widgetContainer.setApiInstance(egw(currentapp, egw.elemWindow(this._DOMContainer)));
this.widgetContainer.setInstanceManager(this); this._widgetContainer.setInstanceManager(this);
this.widgetContainer.setParentDOMNode(this.DOMContainer); this._widgetContainer.setParentDOMNode(this._DOMContainer);
// store the id to submit it back to server // store the id to submit it back to server
if (_data) if (_data)
{ {
this.etemplate_exec_id = _data.etemplate_exec_id; this._etemplate_exec_id = _data.etemplate_exec_id;
// set app_header // set app_header
if (typeof _data.app_header == 'string') if (typeof _data.app_header == 'string')
{ {
@ -510,13 +525,13 @@ export class etemplate2
etemplate2._byTemplate[_name].push(this); etemplate2._byTemplate[_name].push(this);
// Read the XML structure of the requested template // Read the XML structure of the requested template
this.widgetContainer.loadFromXML(etemplate2.templates[this.name]); this._widgetContainer.loadFromXML(etemplate2.templates[this.name]);
// List of Promises from widgets that are not quite fully loaded // List of Promises from widgets that are not quite fully loaded
const deferred = []; const deferred = [];
// Inform the widget tree that it has been successfully loaded. // Inform the widget tree that it has been successfully loaded.
this.widgetContainer.loadingFinished(deferred); this._widgetContainer.loadingFinished(deferred);
// Connect to the window resize event // Connect to the window resize event
jQuery(window).on("resize." + this.uniqueId, this, function (e) jQuery(window).on("resize." + this.uniqueId, this, function (e)
@ -555,9 +570,9 @@ export class etemplate2
this.resize(); this.resize();
// Automatically set focus to first visible input for popups // Automatically set focus to first visible input for popups
if (this.widgetContainer._egw.is_popup() && jQuery('[autofocus]', this.DOMContainer).focus().length == 0) if (this._widgetContainer._egw.is_popup() && jQuery('[autofocus]', this._DOMContainer).focus().length == 0)
{ {
const $input = jQuery('input:visible', this.DOMContainer) const $input = jQuery('input:visible', this._DOMContainer)
// Date fields open the calendar popup on focus // Date fields open the calendar popup on focus
.not('.et2_date') .not('.et2_date')
.filter(function () .filter(function ()
@ -588,16 +603,16 @@ export class etemplate2
app[this.app].et2_ready(this, this.name); app[this.app].et2_ready(this, this.name);
} }
jQuery(this.DOMContainer).trigger('load', this); jQuery(this._DOMContainer).trigger('load', this);
if (etemplate2.templates[this.name].attributes.onload) if (etemplate2.templates[this.name].attributes.onload)
{ {
let onload = et2_checkType(etemplate2.templates[this.name].attributes.onload.value, 'js', 'onload', {}); let onload = et2_checkType(etemplate2.templates[this.name].attributes.onload.value, 'js', 'onload', {});
if (typeof onload === 'string') if (typeof onload === 'string')
{ {
onload = et2_compileLegacyJS(onload, this, this.widgetContainer); onload = et2_compileLegacyJS(onload, this, this._widgetContainer);
} }
onload.call(this.widgetContainer); onload.call(this._widgetContainer);
} }
// Profiling // Profiling
@ -625,7 +640,7 @@ export class etemplate2
if (etemplate2.templates[_name]) if (etemplate2.templates[_name])
{ {
// Set array managers first, or errors will happen // Set array managers first, or errors will happen
this.widgetContainer.setArrayMgrs(this._createArrayManagers(_data)); this._widgetContainer.setArrayMgrs(this._createArrayManagers(_data));
// Already have it // Already have it
_load.apply(this, []); _load.apply(this, []);
@ -662,7 +677,7 @@ export class etemplate2
// Split the given data into array manager objects and pass those to the // Split the given data into array manager objects and pass those to the
// widget container - do this here because file is loaded async // widget container - do this here because file is loaded async
this.widgetContainer.setArrayMgrs(this._createArrayManagers(_data)); this._widgetContainer.setArrayMgrs(this._createArrayManagers(_data));
}, this); }, this);
} }
@ -674,7 +689,7 @@ export class etemplate2
public isDirty() public isDirty()
{ {
let dirty = false; let dirty = false;
this.widgetContainer.iterateOver(function (_widget) this._widgetContainer.iterateOver(function (_widget)
{ {
if (_widget.isDirty && _widget.isDirty()) if (_widget.isDirty && _widget.isDirty())
{ {
@ -691,7 +706,7 @@ export class etemplate2
autocomplete_fixer() autocomplete_fixer()
{ {
const self = this; const self = this;
const form = self.DOMContainer; const form = self._DOMContainer;
// Safari always do the autofill for password field regardless of autocomplete = off // Safari always do the autofill for password field regardless of autocomplete = off
// and since there's no other way to switch the autocomplete of, we should switch the // and since there's no other way to switch the autocomplete of, we should switch the
@ -727,7 +742,7 @@ export class etemplate2
{ {
if (typeof button == 'string') if (typeof button == 'string')
{ {
button = this.widgetContainer.getWidgetById(button); button = this._widgetContainer.getWidgetById(button);
} }
// Button parameter used for submit buttons in datagrid // Button parameter used for submit buttons in datagrid
// TODO: This should probably go in nextmatch's getValues(), along with selected rows somehow. // TODO: This should probably go in nextmatch's getValues(), along with selected rows somehow.
@ -783,13 +798,13 @@ export class etemplate2
*/ */
submit(button, async, no_validation, _container) submit(button, async, no_validation, _container)
{ {
const api = this.widgetContainer.egw(); const api = this._widgetContainer.egw();
if (typeof no_validation == 'undefined') if (typeof no_validation == 'undefined')
{ {
no_validation = false; no_validation = false;
} }
const container = _container || this.widgetContainer; const container = _container || this._widgetContainer;
// Get the form values // Get the form values
const values = this.getValues(container); const values = this.getValues(container);
@ -827,7 +842,7 @@ export class etemplate2
this.unbind_unload(); this.unbind_unload();
const request = api.json(this.menuaction, [this.etemplate_exec_id, values, no_validation], function () const request = api.json(this.menuaction, [this._etemplate_exec_id, values, no_validation], function ()
{ {
api.loading_prompt('et2_submit_spinner', false); api.loading_prompt('et2_submit_spinner', false);
}, this, async); }, this, async);
@ -835,7 +850,7 @@ export class etemplate2
} }
else else
{ {
this.widgetContainer.egw().debug("warn", "Missing menuaction for submit. Values: ", values); this._widgetContainer.egw().debug("warn", "Missing menuaction for submit. Values: ", values);
} }
} }
return canSubmit; return canSubmit;
@ -852,11 +867,11 @@ export class etemplate2
postSubmit(button) postSubmit(button)
{ {
// Get the form values // Get the form values
const values = this.getValues(this.widgetContainer); const values = this.getValues(this._widgetContainer);
// Trigger the submit event // Trigger the submit event
let canSubmit = true; let canSubmit = true;
this.widgetContainer.iterateOver(function (_widget) this._widgetContainer.iterateOver(function (_widget)
{ {
if (_widget.submit(values) === false) if (_widget.submit(values) === false)
{ {
@ -872,12 +887,12 @@ export class etemplate2
this.unbind_unload(); this.unbind_unload();
const form = jQuery("<form id='form' action='" + egw().webserverUrl + const form = jQuery("<form id='form' action='" + egw().webserverUrl +
"/index.php?menuaction=" + this.widgetContainer.egw().getAppName() + ".EGroupware\\Api\\Etemplate.process_exec&ajax=true' method='POST'>"); "/index.php?menuaction=" + this._widgetContainer.egw().getAppName() + ".EGroupware\\Api\\Etemplate.process_exec&ajax=true' method='POST'>");
const etemplate_id = jQuery(document.createElement("input")) const etemplate_id = jQuery(document.createElement("input"))
.attr("name", 'etemplate_exec_id') .attr("name", 'etemplate_exec_id')
.attr("type", 'hidden') .attr("type", 'hidden')
.val(this.etemplate_exec_id) .val(this._etemplate_exec_id)
.appendTo(form); .appendTo(form);
const input = document.createElement("input"); const input = document.createElement("input");
@ -1024,7 +1039,7 @@ export class etemplate2
let refresh_done = false; let refresh_done = false;
// Refresh nextmatches // Refresh nextmatches
this.widgetContainer.iterateOver(function (_widget) this._widgetContainer.iterateOver(function (_widget)
{ {
// Trigger refresh // Trigger refresh
_widget.refresh(id, type); _widget.refresh(id, type);
@ -1071,13 +1086,13 @@ export class etemplate2
const deferred = []; const deferred = [];
// Skip hidden etemplates // Skip hidden etemplates
if (jQuery(this.DOMContainer).filter(':visible').length === 0) if (jQuery(this._DOMContainer).filter(':visible').length === 0)
{ {
return []; return [];
} }
// Allow any widget to change for printing // Allow any widget to change for printing
this.widgetContainer.iterateOver(function (_widget) this._widgetContainer.iterateOver(function (_widget)
{ {
// Skip widgets from a different etemplate (home) // Skip widgets from a different etemplate (home)
if (_widget.getInstanceManager() != this) return; if (_widget.getInstanceManager() != this) return;
@ -1155,7 +1170,7 @@ export class etemplate2
{ {
const et = etemplate2._byTemplate[name][i]; const et = etemplate2._byTemplate[name][i];
if (et.DOMContainer.getAttribute("id") == id) if (et._DOMContainer.getAttribute("id") == id)
{ {
return et; return et;
} }
@ -1227,7 +1242,7 @@ export class etemplate2
if (typeof data.url == "string" && typeof data.data === 'object') if (typeof data.url == "string" && typeof data.data === 'object')
{ {
// @ts-ignore // @ts-ignore
if (typeof this.load == 'function') if (this && typeof this.load == 'function')
{ {
// Called from etemplate // Called from etemplate
// @ts-ignore // @ts-ignore
@ -1273,7 +1288,7 @@ export class etemplate2
for (let id in _response.data) for (let id in _response.data)
{ {
// @ts-ignore // @ts-ignore
const widget = this.widgetContainer.getWidgetById(id); const widget = this._widgetContainer.getWidgetById(id);
if (widget && widget.instanceOf(et2_baseWidget)) if (widget && widget.instanceOf(et2_baseWidget))
{ {
(<et2_baseWidget>widget).showMessage(_response.data[id], 'validation_error'); (<et2_baseWidget>widget).showMessage(_response.data[id], 'validation_error');
@ -1314,20 +1329,20 @@ export class etemplate2
(typeof res.data.value != 'undefined') (typeof res.data.value != 'undefined')
) { ) {
if (typeof res.data.etemplate_exec_id == 'undefined' || if (typeof res.data.etemplate_exec_id == 'undefined' ||
res.data.etemplate_exec_id != this.etemplate_exec_id) { res.data.etemplate_exec_id != this._etemplate_exec_id) {
// Not for this etemplate, but not an error // Not for this etemplate, but not an error
return false; return false;
} }
if (res.data.key == 'etemplate_exec_id') { if (res.data.key == 'etemplate_exec_id') {
this.etemplate_exec_id = res.data.value; this._etemplate_exec_id = res.data.value;
return true; return true;
} }
if (this.widgetContainer == null) { if (this._widgetContainer == null) {
// Right etemplate, but it's already been cleared. // Right etemplate, but it's already been cleared.
egw.debug('warn', "Tried to call assign on an un-loaded etemplate", res.data); egw.debug('warn', "Tried to call assign on an un-loaded etemplate", res.data);
return false; return false;
} }
const widget = this.widgetContainer.getWidgetById(res.data.id); const widget = this._widgetContainer.getWidgetById(res.data.id);
if (widget) { if (widget) {
if (typeof widget['set_' + res.data.key] != 'function') { if (typeof widget['set_' + res.data.key] != 'function') {
egw.debug('warn', "Cannot set %s attribute %s via JSON assign, no set_%s()", res.data.id, res.data.key, res.data.key); egw.debug('warn', "Cannot set %s attribute %s via JSON assign, no set_%s()", res.data.id, res.data.key, res.data.key);