got et2 mostly working: timesheet.edit renders

This commit is contained in:
Ralf Becker 2021-06-07 17:33:53 +02:00
parent 592b7fb97d
commit f91bca83e1
183 changed files with 11759 additions and 12588 deletions

View File

@ -45,8 +45,8 @@ if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $
$content = "import './js/jsapi/egw_config.js';\n";
$content .= "import './js/jsapi/egw_links.js';\n\n";
$content .= 'window.egw.set_configs('.$config.", window.egw && window.egw.window !== window);\n";
$content .= 'window.egw.set_link_registry('.$link_registry.", undefined, window.egw && window.egw.window !== window);\n";
$content .= 'egw.set_configs('.$config.", window.egw && window.egw.window !== window);\n";
$content .= 'egw.set_link_registry('.$link_registry.", undefined, window.egw && window.egw.window !== window);\n";
// we run our own gzip compression, to set a correct Content-Length of the encoded content
if (in_array('gzip', explode(',',$_SERVER['HTTP_ACCEPT_ENCODING'])) && function_exists('gzencode'))

View File

@ -48,7 +48,7 @@ if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $
exit;
}
if (empty($_GET['debug'])) $content = "import './js/jsapi/egw_images.js';\n\nwindow.egw.set_images(".$content.", window.egw && window.egw.window !== window);\n";
if (empty($_GET['debug'])) $content = "import './js/jsapi/egw_images.js';\n\negw.set_images(".$content.", egw && egw.window !== window);\n";
// we run our own gzip compression, to set a correct Content-Length of the encoded content
if (in_array('gzip', explode(',',$_SERVER['HTTP_ACCEPT_ENCODING'])) && function_exists('gzencode'))

View File

@ -6,7 +6,8 @@
* @copyright 2011 by Andreas Stöckel
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package egw_action
* @version $Id$
*
* @Todo: @new-js-loader port to TypeScript
*/
//Global variable which is used to store the currently active menu so that it
@ -125,7 +126,7 @@ function _egwSetMenuOnClick(_elements, _onClick)
* The currently available implementation is the "egwDhtmlxMenu.js" which is based
* upon the dhtmlxmenu component.
*/
function egwMenu()
export function egwMenu()
{
//The "items" variable contains all menu items of the menu
this.children = [];
@ -373,7 +374,7 @@ egwMenu.prototype.setGlobalOnClick = function(_onClick)
* Constructor for the egwMenuItem. Each entry in a menu (including seperators)
* is represented by a menu item.
*/
function egwMenuItem(_parent, _id)
export function egwMenuItem(_parent, _id)
{
this.id = _id;
this.caption = "";

View File

@ -1,38 +1,23 @@
"use strict";
/**
* EGroupware eTemplate2 - JS DOM Widget class
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_action_object_impl = exports.et2_DOMWidget = void 0;
/*egw:uses
et2_core_interfaces;
et2_core_widget;
/api/js/egw_action/egw_action.js;
*/
var et2_core_inheritance_1 = require("./et2_core_inheritance");
require("./et2_core_interfaces");
require("./et2_core_common");
var et2_core_widget_1 = require("./et2_core_widget");
require("../egw_action/egw_action.js");
import { ClassWithAttributes } from './et2_core_inheritance';
import { et2_IDOMNode } from "./et2_core_interfaces";
import { et2_hasChild, et2_no_init } from "./et2_core_common";
import { et2_widget } from "./et2_core_widget";
import '../egw_action/egw_action.js';
import { egw } from "../jsapi/egw_global";
/**
* Abstract widget class which can be inserted into the DOM. All widget classes
* deriving from this class have to care about implementing the "getDOMNode"
@ -40,32 +25,29 @@ require("../egw_action/egw_action.js");
*
* @augments et2_widget
*/
var et2_DOMWidget = /** @class */ (function (_super) {
__extends(et2_DOMWidget, _super);
export class et2_DOMWidget extends et2_widget {
/**
* When the DOMWidget is initialized, it grabs the DOM-Node of the parent
* object (if available) and passes it to its own "createDOMNode" function
*
* @memberOf et2_DOMWidget
*/
function et2_DOMWidget(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_DOMWidget._attributes, _child || {})) || this;
_this.parentNode = null;
_this.disabled = false;
_this._attachSet = {
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_DOMWidget._attributes, _child || {}));
this.parentNode = null;
this.disabled = false;
this._attachSet = {
"node": null,
"parent": null
};
_this._surroundingsMgr = null;
return _this;
this._surroundingsMgr = null;
}
/**
* Detatches the node from the DOM and clears all references to the parent
* node or the dom node of this widget.
*/
et2_DOMWidget.prototype.destroy = function () {
destroy() {
this.detachFromDOM();
this.parentNode = null;
this._attachSet = {};
@ -83,12 +65,12 @@ var et2_DOMWidget = /** @class */ (function (_super) {
this._surroundingsMgr.destroy();
this._surroundingsMgr = null;
}
_super.prototype.destroy.call(this);
};
super.destroy();
}
/**
* Attaches the container node of this widget to the DOM-Tree
*/
et2_DOMWidget.prototype.doLoadingFinished = function () {
doLoadingFinished() {
// Check whether the parent implements the et2_IDOMNode interface. If
// yes, grab the DOM node and create our own.
if (this.getParent() && this.getParent().implements(et2_IDOMNode)) {
@ -100,12 +82,12 @@ var et2_DOMWidget = /** @class */ (function (_super) {
}
}
return true;
};
}
/**
* Detaches the widget from the DOM tree, if it had been attached to the
* DOM-Tree using the attachToDOM method.
*/
et2_DOMWidget.prototype.detachFromDOM = function () {
detachFromDOM() {
if (this._attachSet && this._attachSet.node && this._attachSet.parent) {
// Remove the current node from the parent node
try {
@ -122,13 +104,13 @@ var et2_DOMWidget = /** @class */ (function (_super) {
return true;
}
return false;
};
}
/**
* Attaches the widget to the DOM tree. Fails if the widget is already
* attached to the tree or no parent node or no node for this widget is
* defined.
*/
et2_DOMWidget.prototype.attachToDOM = function () {
attachToDOM() {
// Attach the DOM node of this widget (if existing) to the new parent
var node = this.getDOMNode(this);
if (node && this.parentNode &&
@ -155,7 +137,7 @@ var et2_DOMWidget = /** @class */ (function (_super) {
return true;
}
return false;
};
}
/**
* Inserts a child at the given index.
*
@ -163,8 +145,8 @@ var et2_DOMWidget = /** @class */ (function (_super) {
* of et2_widget
* @param _idx is the position at which the element should be added.
*/
et2_DOMWidget.prototype.insertChild = function (_node, _idx) {
_super.prototype.insertChild.call(this, _node, _idx);
insertChild(_node, _idx) {
super.insertChild(_node, _idx);
if (_node.instanceOf(et2_DOMWidget) && typeof _node.hasOwnProperty('parentNode') && this.getDOMNode(this)) {
try {
_node.setParentDOMNode(this.getDOMNode(_node));
@ -174,16 +156,16 @@ var et2_DOMWidget = /** @class */ (function (_super) {
// will probably try again in doLoadingFinished()
}
}
};
et2_DOMWidget.prototype.isAttached = function () {
}
isAttached() {
return this.parentNode != null;
};
et2_DOMWidget.prototype.getSurroundings = function () {
}
getSurroundings() {
if (!this._surroundingsMgr) {
this._surroundingsMgr = new et2_surroundingsMgr(this);
}
return this._surroundingsMgr;
};
}
/**
* Get data for the tab this widget is on.
*
@ -195,7 +177,7 @@ var et2_DOMWidget = /** @class */ (function (_super) {
*
* @returns {Object|null} Data for tab the widget is on
*/
et2_DOMWidget.prototype.get_tab_info = function () {
get_tab_info() {
var parent = this;
do {
parent = parent.getParent();
@ -204,7 +186,7 @@ var et2_DOMWidget = /** @class */ (function (_super) {
if (parent === this.getRoot()) {
return null;
}
var tabbox = parent;
let tabbox = parent;
// Find the tab index
for (var i = 0; i < tabbox.tabData.length; i++) {
// Find the tab by DOM heritage
@ -226,19 +208,19 @@ var et2_DOMWidget = /** @class */ (function (_super) {
}
}
// Fallback
var fallback = this.getParent();
let fallback = this.getParent();
if (typeof fallback.get_tab_info === 'function') {
return fallback.get_tab_info();
}
return null;
};
}
/**
* Set the parent DOM node of this element. Takes a wider variety of types
* than setParentDOMNode(), and matches the set_<attribute> naming convention.
*
* @param _node String|DOMNode DOM node to contain the widget, or the ID of the DOM node.
*/
et2_DOMWidget.prototype.set_parent_node = function (_node) {
set_parent_node(_node) {
if (typeof _node == "string") {
var parent = jQuery('#' + _node);
if (parent.length === 0 && window.parent) {
@ -256,14 +238,14 @@ var et2_DOMWidget = /** @class */ (function (_super) {
else {
this.setParentDOMNode(_node);
}
};
}
/**
* Set the parent DOM node of this element. If another parent node is already
* set, this widget removes itself from the DOM tree
*
* @param _node
*/
et2_DOMWidget.prototype.setParentDOMNode = function (_node) {
setParentDOMNode(_node) {
if (_node != this.parentNode) {
// Detatch this element from the DOM tree
this.detachFromDOM();
@ -271,17 +253,17 @@ var et2_DOMWidget = /** @class */ (function (_super) {
// And attatch the element to the DOM tree
this.attachToDOM();
}
};
}
/**
* Returns the parent node.
*/
et2_DOMWidget.prototype.getParentDOMNode = function () {
getParentDOMNode() {
return this.parentNode;
};
}
/**
* Returns the index of this element in the DOM tree
*/
et2_DOMWidget.prototype.getDOMIndex = function () {
getDOMIndex() {
if (this.getParent()) {
var idx = 0;
var children = this.getParent().getChildren();
@ -298,7 +280,7 @@ var et2_DOMWidget = /** @class */ (function (_super) {
}
}
return -1;
};
}
/**
* Sets the id of the DOM-Node.
*
@ -306,7 +288,7 @@ var et2_DOMWidget = /** @class */ (function (_super) {
*
* @param {string} _value id to set
*/
et2_DOMWidget.prototype.set_id = function (_value) {
set_id(_value) {
this.id = _value;
this.dom_id = _value ? this.getInstanceManager().uniqueId + '_' + _value.replace(/\./g, '-') : _value;
var node = this.getDOMNode(this);
@ -318,8 +300,8 @@ var et2_DOMWidget = /** @class */ (function (_super) {
node.removeAttribute("id");
}
}
};
et2_DOMWidget.prototype.set_disabled = function (_value) {
}
set_disabled(_value) {
var node = this._surroundingsMgr != null ? this._surroundingsMgr.getDOMNode(this.getDOMNode(this)) : this.getDOMNode(this);
if (node && this.disabled != _value) {
this.disabled = _value;
@ -330,22 +312,22 @@ var et2_DOMWidget = /** @class */ (function (_super) {
jQuery(node).show();
}
}
};
et2_DOMWidget.prototype.set_width = function (_value) {
}
set_width(_value) {
this.width = _value;
var node = this.getDOMNode(this);
if (node) {
jQuery(node).css("width", _value);
}
};
et2_DOMWidget.prototype.set_height = function (_value) {
}
set_height(_value) {
this.height = _value;
var node = this.getDOMNode(this);
if (node) {
jQuery(node).css("height", _value);
}
};
et2_DOMWidget.prototype.set_class = function (_value) {
}
set_class(_value) {
var node = this.getDOMNode(this);
if (node) {
if (this["class"]) {
@ -354,15 +336,15 @@ var et2_DOMWidget = /** @class */ (function (_super) {
jQuery(node).addClass(_value);
}
this["class"] = _value;
};
et2_DOMWidget.prototype.set_overflow = function (_value) {
}
set_overflow(_value) {
this.overflow = _value;
var node = this.getDOMNode(this);
if (node) {
jQuery(node).css("overflow", _value);
}
};
et2_DOMWidget.prototype.set_data = function (_value) {
}
set_data(_value) {
var node = this.getDOMNode(this);
if (node && _value) {
var pairs = _value.split(/,/g);
@ -371,8 +353,8 @@ var et2_DOMWidget = /** @class */ (function (_super) {
jQuery(node).attr('data-' + name_value[0], name_value[1]);
}
}
};
et2_DOMWidget.prototype.set_background = function (_value) {
}
set_background(_value) {
var node = this.getDOMNode(this);
var values = '';
if (_value && node) {
@ -384,7 +366,7 @@ var et2_DOMWidget = /** @class */ (function (_super) {
"background-scale": values[3]
});
}
};
}
/**
* Set Actions on the widget
*
@ -411,7 +393,7 @@ var et2_DOMWidget = /** @class */ (function (_super) {
* @param {object} actions {ID: {attributes..}+} map of egw action information
* @see api/src/Etemplate/Widget/Nextmatch.php egw_actions() method
*/
et2_DOMWidget.prototype.set_actions = function (actions) {
set_actions(actions) {
if (this.id == "" || typeof this.id == "undefined") {
this.egw().debug("warn", "Widget should have an ID if you want actions", this);
return;
@ -438,12 +420,12 @@ var et2_DOMWidget = /** @class */ (function (_super) {
this._actionManager.data = { widget: this };
// Link the actions to the DOM
this._link_actions(actions);
};
et2_DOMWidget.prototype.set_default_execute = function (_default_execute) {
}
set_default_execute(_default_execute) {
this.options.default_execute = _default_execute;
if (this._actionManager)
this._actionManager.setDefaultExecute(null, _default_execute);
};
}
/**
* Get all action-links / id's of 1.-level actions from a given action object
*
@ -452,20 +434,20 @@ var et2_DOMWidget = /** @class */ (function (_super) {
* @param actions
* @returns {Array}
*/
et2_DOMWidget.prototype._get_action_links = function (actions) {
_get_action_links(actions) {
var action_links = [];
for (var i in actions) {
var action = actions[i];
action_links.push(typeof action.id != 'undefined' ? action.id : i);
}
return action_links;
};
}
/**
* Link the actions to the DOM nodes / widget bits.
*
* @param {object} actions {ID: {attributes..}+} map of egw action information
*/
et2_DOMWidget.prototype._link_actions = function (actions) {
_link_actions(actions) {
// Get the top level element for the tree
var objectManager = egw_getAppObjectManager(true);
var widget_object = objectManager.getObjectById(this.id);
@ -484,112 +466,108 @@ var et2_DOMWidget = /** @class */ (function (_super) {
// 'allowed' for this widget at this time
var action_links = this._get_action_links(actions);
widget_object.updateActionLinks(action_links);
};
et2_DOMWidget._attributes = {
"disabled": {
"name": "Disabled",
"type": "boolean",
"description": "Defines whether this widget is visible. Not to be confused with an input widget's HTML attribute 'disabled'.",
"default": false
},
"width": {
"name": "Width",
"type": "dimension",
"default": et2_no_init,
"description": "Width of the element in pixels, percentage or 'auto'"
},
"height": {
"name": "Height",
"type": "dimension",
"default": et2_no_init,
"description": "Height of the element in pixels, percentage or 'auto'"
},
"class": {
"name": "CSS Class",
"type": "string",
"default": et2_no_init,
"description": "CSS Class which is applied to the dom element of this node"
},
"overflow": {
"name": "Overflow",
"type": "string",
"default": et2_no_init,
"description": "If set, the css-overflow attribute is set to that value"
},
"parent_node": {
"name": "DOM parent",
"type": "string",
"default": et2_no_init,
"description": "Insert into the target DOM node instead of the normal location"
},
"actions": {
"name": "Actions list",
"type": "any",
"default": et2_no_init,
"description": "List of egw actions that can be done on the widget. This includes context menu, drag and drop. TODO: Link to action documentation"
},
default_execute: {
name: "Default onExecute for actions",
type: "js",
default: et2_no_init,
description: "Set default onExecute javascript method for action not specifying their own"
},
resize_ratio: {
name: "Resize height of the widget on callback resize",
type: "string",
default: '',
description: "Allow Resize height of the widget based on exess height and given ratio"
},
data: {
name: "comma-separated name:value pairs set as data attributes on DOM node",
type: "string",
default: '',
description: 'data="mime:${row}[mime]" would generate data-mime="..." in DOM, eg. to use it in CSS on a parent'
},
background: {
name: "Add background image",
type: "string",
default: '',
description: "Sets background image, left, right and scale on DOM",
}
};
return et2_DOMWidget;
}(et2_core_widget_1.et2_widget));
exports.et2_DOMWidget = et2_DOMWidget;
}
}
et2_DOMWidget._attributes = {
"disabled": {
"name": "Disabled",
"type": "boolean",
"description": "Defines whether this widget is visible. Not to be confused with an input widget's HTML attribute 'disabled'.",
"default": false
},
"width": {
"name": "Width",
"type": "dimension",
"default": et2_no_init,
"description": "Width of the element in pixels, percentage or 'auto'"
},
"height": {
"name": "Height",
"type": "dimension",
"default": et2_no_init,
"description": "Height of the element in pixels, percentage or 'auto'"
},
"class": {
"name": "CSS Class",
"type": "string",
"default": et2_no_init,
"description": "CSS Class which is applied to the dom element of this node"
},
"overflow": {
"name": "Overflow",
"type": "string",
"default": et2_no_init,
"description": "If set, the css-overflow attribute is set to that value"
},
"parent_node": {
"name": "DOM parent",
"type": "string",
"default": et2_no_init,
"description": "Insert into the target DOM node instead of the normal location"
},
"actions": {
"name": "Actions list",
"type": "any",
"default": et2_no_init,
"description": "List of egw actions that can be done on the widget. This includes context menu, drag and drop. TODO: Link to action documentation"
},
default_execute: {
name: "Default onExecute for actions",
type: "js",
default: et2_no_init,
description: "Set default onExecute javascript method for action not specifying their own"
},
resize_ratio: {
name: "Resize height of the widget on callback resize",
type: "string",
default: '',
description: "Allow Resize height of the widget based on exess height and given ratio"
},
data: {
name: "comma-separated name:value pairs set as data attributes on DOM node",
type: "string",
default: '',
description: 'data="mime:${row}[mime]" would generate data-mime="..." in DOM, eg. to use it in CSS on a parent'
},
background: {
name: "Add background image",
type: "string",
default: '',
description: "Sets background image, left, right and scale on DOM",
}
};
/**
* The surroundings manager class allows to append or prepend elements around
* an widget node.
*/
var et2_surroundingsMgr = /** @class */ (function (_super) {
__extends(et2_surroundingsMgr, _super);
export class et2_surroundingsMgr extends ClassWithAttributes {
/**
* Constructor
*
* @memberOf et2_surroundingsMgr
* @param _widget
*/
function et2_surroundingsMgr(_widget) {
var _this = _super.call(this) || this;
_this._widgetContainer = null;
_this._widgetSurroundings = [];
_this._widgetPlaceholder = null;
_this._widgetNode = null;
_this._ownPlaceholder = true;
_this._surroundingsUpdated = false;
_this.widget = _widget;
return _this;
constructor(_widget) {
super();
this._widgetContainer = null;
this._widgetSurroundings = [];
this._widgetPlaceholder = null;
this._widgetNode = null;
this._ownPlaceholder = true;
this._surroundingsUpdated = false;
this.widget = _widget;
}
et2_surroundingsMgr.prototype.destroy = function () {
destroy() {
this._widgetContainer = null;
this._widgetSurroundings = null;
this._widgetPlaceholder = null;
this._widgetNode = null;
};
et2_surroundingsMgr.prototype.prependDOMNode = function (_node) {
}
prependDOMNode(_node) {
this._widgetSurroundings.unshift(_node);
this._surroundingsUpdated = true;
};
et2_surroundingsMgr.prototype.appendDOMNode = function (_node) {
}
appendDOMNode(_node) {
// Append an placeholder first if none is existing yet
if (this._ownPlaceholder && this._widgetPlaceholder == null) {
this._widgetPlaceholder = document.createElement("span");
@ -598,8 +576,8 @@ var et2_surroundingsMgr = /** @class */ (function (_super) {
// Append the given node
this._widgetSurroundings.push(_node);
this._surroundingsUpdated = true;
};
et2_surroundingsMgr.prototype.insertDOMNode = function (_node) {
}
insertDOMNode(_node) {
if (!this._ownPlaceholder || this._widgetPlaceholder == null) {
this.appendDOMNode(_node);
return;
@ -611,8 +589,8 @@ var et2_surroundingsMgr = /** @class */ (function (_super) {
// Delete the reference to the own placeholder
this._widgetPlaceholder = null;
this._ownPlaceholder = false;
};
et2_surroundingsMgr.prototype.removeDOMNode = function (_node) {
}
removeDOMNode(_node) {
for (var i = 0; this._widgetSurroundings && i < this._widgetSurroundings.length; i++) {
if (this._widgetSurroundings[i] == _node) {
this._widgetSurroundings.splice(i, 1);
@ -620,8 +598,8 @@ var et2_surroundingsMgr = /** @class */ (function (_super) {
break;
}
}
};
et2_surroundingsMgr.prototype.setWidgetPlaceholder = function (_node) {
}
setWidgetPlaceholder(_node) {
if (_node != this._widgetPlaceholder) {
if (_node != null && this._ownPlaceholder && this._widgetPlaceholder != null) {
// Delete the current placeholder which was created by the
@ -637,8 +615,8 @@ var et2_surroundingsMgr = /** @class */ (function (_super) {
this._widgetPlaceholder = _node;
this._surroundingsUpdated = true;
}
};
et2_surroundingsMgr.prototype._rebuildContainer = function () {
}
_rebuildContainer() {
// Return if there has been no change in the "surroundings-data"
if (!this._surroundingsUpdated) {
return false;
@ -679,8 +657,8 @@ var et2_surroundingsMgr = /** @class */ (function (_super) {
}
this._surroundingsUpdated = false;
return true;
};
et2_surroundingsMgr.prototype.update = function () {
}
update() {
if (this._surroundingsUpdated) {
var attached = this.widget ? this.widget.isAttached() : false;
// Reattach the widget - this will call the "getDOMNode" function
@ -690,8 +668,8 @@ var et2_surroundingsMgr = /** @class */ (function (_super) {
this.widget.attachToDOM();
}
}
};
et2_surroundingsMgr.prototype.getDOMNode = function (_widgetNode) {
}
getDOMNode(_widgetNode) {
// Update the whole widgetContainer if this is not the first time this
// function has been called but the widget node has changed.
if (this._widgetNode != null && this._widgetNode != _widgetNode) {
@ -716,12 +694,11 @@ var et2_surroundingsMgr = /** @class */ (function (_super) {
}
// Return the widget container
return this._widgetContainer;
};
et2_surroundingsMgr.prototype.getWidgetSurroundings = function () {
}
getWidgetSurroundings() {
return this._widgetSurroundings;
};
return et2_surroundingsMgr;
}(et2_core_inheritance_1.ClassWithAttributes));
}
}
/**
* The egw_action system requires an egwActionObjectInterface Interface implementation
* to tie actions to DOM nodes. This one can be used by any widget.
@ -732,8 +709,8 @@ var et2_surroundingsMgr = /** @class */ (function (_super) {
* @param {Object} node
*
*/
var et2_action_object_impl = /** @class */ (function () {
function et2_action_object_impl(_widget, _node) {
export class et2_action_object_impl {
constructor(_widget, _node) {
var widget = _widget;
var objectNode = _node;
this.aoi = new egwActionObjectInterface();
@ -762,10 +739,8 @@ var et2_action_object_impl = /** @class */ (function () {
}
};
}
et2_action_object_impl.prototype.getAOI = function () {
getAOI() {
return this.aoi;
};
return et2_action_object_impl;
}());
exports.et2_action_object_impl = et2_action_object_impl;
}
}
//# sourceMappingURL=et2_core_DOMWidget.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
@ -15,11 +15,13 @@
*/
import {ClassWithAttributes} from './et2_core_inheritance';
import './et2_core_interfaces';
import './et2_core_common';
import {et2_IDOMNode} from "./et2_core_interfaces";
import {et2_hasChild, et2_no_init} from "./et2_core_common";
import {et2_widget, WidgetConfig} from "./et2_core_widget";
import '../egw_action/egw_action.js';
import {egw} from "../jsapi/egw_global";
// fixing circular dependencies by only importing type
import type {et2_tabbox} from "./et2_widget_tabs";
/**
* Abstract widget class which can be inserted into the DOM. All widget classes
@ -683,7 +685,7 @@ export abstract class et2_DOMWidget extends et2_widget implements et2_IDOMNode
* The surroundings manager class allows to append or prepend elements around
* an widget node.
*/
class et2_surroundingsMgr extends ClassWithAttributes
export class et2_surroundingsMgr extends ClassWithAttributes
{
widget: et2_DOMWidget;
private _widgetContainer: any = null;

View File

@ -1,40 +1,25 @@
"use strict";
/**
* EGroupware eTemplate2 - JS content array manager
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*
*/
/*egw:uses
et2_core_common;
egw_inheritance;
et2_core_phpExpressionCompiler;
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_arrayMgrs_expand = exports.et2_readonlysArrayMgr = exports.et2_arrayMgr = void 0;
import { et2_evalBool } from "./et2_core_common";
import { egw } from "../jsapi/egw_global";
/**
* Manage access to various template customisation arrays passed to etemplate->exec().
*
* This manages access to content, modifications and readonlys arrays
*/
var et2_arrayMgr = /** @class */ (function () {
export class et2_arrayMgr {
/**
* Constructor
*
@ -42,8 +27,7 @@ var et2_arrayMgr = /** @class */ (function () {
* @param _data
* @param _parentMgr
*/
function et2_arrayMgr(_data, _parentMgr) {
if (_data === void 0) { _data = {}; }
constructor(_data = {}, _parentMgr) {
this.splitIds = true;
// Holds information about the current perspective
this.perspectiveData = {
@ -68,14 +52,14 @@ var et2_arrayMgr = /** @class */ (function () {
// Expanded: ${row}: Object{info_cat: ..value}
if (this.splitIds) {
// For each index, we need a key: {..} sub array
for (var key in _data) {
for (let key in _data) {
// Split up indexes
var indexes = key.replace(/&#x5B;/g, "[").split('[');
const indexes = key.replace(/&#x5B;/g, "[").split('[');
// Put data in the proper place
if (indexes.length > 1) {
var value = _data[key];
var target = _data;
for (var i = 0; i < indexes.length; i++) {
const value = _data[key];
let target = _data;
for (let i = 0; i < indexes.length; i++) {
indexes[i] = indexes[i].replace(/&#x5D;/g, '').replace(']', '');
if (typeof target[indexes[i]] == "undefined" || target[indexes[i]] === null) {
target[indexes[i]] = i == indexes.length - 1 ? value : {};
@ -91,24 +75,24 @@ var et2_arrayMgr = /** @class */ (function () {
/**
* Returns the root content array manager object
*/
et2_arrayMgr.prototype.getRoot = function () {
getRoot() {
if (this._parentMgr != null) {
return this._parentMgr.getRoot();
}
return this;
};
et2_arrayMgr.prototype.getParentMgr = function () {
}
getParentMgr() {
return this._parentMgr;
};
et2_arrayMgr.prototype.getPerspectiveData = function () {
}
getPerspectiveData() {
return this.perspectiveData;
};
et2_arrayMgr.prototype.setPerspectiveData = function (new_perspective) {
}
setPerspectiveData(new_perspective) {
this.perspectiveData = new_perspective;
};
et2_arrayMgr.prototype.setRow = function (new_row) {
}
setRow(new_row) {
this.perspectiveData.row = new_row;
};
}
/**
* Explodes compound keys (eg IDs) into a list of namespaces
* This uses no internal values, just expands
@ -121,11 +105,11 @@ var et2_arrayMgr = /** @class */ (function () {
*
* @return {string[]}
*/
et2_arrayMgr.prototype.explodeKey = function (_key) {
explodeKey(_key) {
if (!_key || typeof _key == 'string' && _key.trim() === "")
return [];
// Parse the given key by removing the "]"-chars and splitting at "["
var indexes = [_key];
let indexes = [_key];
if (typeof _key === "string") {
_key = _key.replace(/&#x5B;/g, "[").replace(/&#x5D;/g, "]");
indexes = _key.split('[');
@ -133,20 +117,20 @@ var et2_arrayMgr = /** @class */ (function () {
if (indexes.length > 1) {
indexes = [indexes.shift(), indexes.join('[')];
indexes[1] = indexes[1].substring(0, indexes[1].length - 1);
var children = indexes[1].split('][');
const children = indexes[1].split('][');
if (children.length) {
indexes = jQuery.merge([indexes[0]], children);
}
}
return indexes;
};
}
/**
* Returns the path to this content array manager perspective as an array
* containing the key values
*
* @param _path is used internally, do not supply it manually.
*/
et2_arrayMgr.prototype.getPath = function (_path) {
getPath(_path) {
if (typeof _path == "undefined") {
_path = [];
}
@ -158,7 +142,7 @@ var et2_arrayMgr = /** @class */ (function () {
_path = this._parentMgr.getPath(_path);
}
return _path;
};
}
/**
* Get array entry is the equivalent to the boetemplate get_array function.
* It returns a reference to the (sub) array with the given key. This also works
@ -170,7 +154,7 @@ var et2_arrayMgr = /** @class */ (function () {
* @param _skipEmpty returns null if _key is not present in this content array.
* Defaults to false.
*/
et2_arrayMgr.prototype.getEntry = function (_key, _referenceInto, _skipEmpty) {
getEntry(_key, _referenceInto, _skipEmpty) {
if (typeof _referenceInto == "undefined") {
_referenceInto = false;
}
@ -178,26 +162,26 @@ var et2_arrayMgr = /** @class */ (function () {
_skipEmpty = false;
}
// Parse the given key by removing the "]"-chars and splitting at "["
var indexes = this.explodeKey(_key);
const indexes = this.explodeKey(_key);
if (indexes.length == 0 && _skipEmpty)
return null;
var entry = this.data;
for (var i = 0; i < indexes.length; i++) {
let entry = this.data;
for (let i = 0; i < indexes.length; i++) {
// Abort if the current entry is not an object (associative array) and
// we should descend further into it.
var isObject = typeof entry === 'object';
const isObject = typeof entry === 'object';
if (!isObject && !_referenceInto || entry == null || jQuery.isEmptyObject(entry)) {
return null;
}
// Check whether the entry actually exists
var idx = indexes[i];
const idx = indexes[i];
if (_skipEmpty && (!isObject || typeof entry[idx] == "undefined")) {
return null;
}
entry = entry[idx];
}
return entry;
};
}
/**
* Equivalent to the boetemplate::expand_name function.
*
@ -207,20 +191,20 @@ var et2_arrayMgr = /** @class */ (function () {
* @param {string} _ident Key used to reference into managed array
* @return {*}
*/
et2_arrayMgr.prototype.expandName = function (_ident) {
expandName(_ident) {
// Check whether the identifier refers to an index in the content array
var is_index_in_content = _ident.charAt(0) == '@';
const is_index_in_content = _ident.charAt(0) == '@';
// Check whether "$" occurs in the given identifier
var pos_var = _ident.indexOf('$');
const pos_var = _ident.indexOf('$');
if (pos_var >= 0 && (this.perspectiveData.row != null || !_ident.match(/\$\{?row\}?/))
// Avoid messing with regex in validators
&& pos_var !== _ident.indexOf("$/")) {
// Get the content array for the current row
var row = typeof this.perspectiveData.row == 'number' ? this.perspectiveData.row : '';
var row_cont = this.data[row] || {};
const row = typeof this.perspectiveData.row == 'number' ? this.perspectiveData.row : '';
const row_cont = this.data[row] || {};
// $cont is NOT root but current name-space in old eTemplate
var cont = this.data; //getRoot().data;
var _cont = this.data; // according to a grep only used in ImportExport just twice
const cont = this.data; //getRoot().data;
const _cont = this.data; // according to a grep only used in ImportExport just twice
// Check whether the expression has already been compiled - if not,
// try to compile it first. If an error occurs, the identifier
// function is set to null
@ -272,22 +256,22 @@ var et2_arrayMgr = /** @class */ (function () {
}
}
return _ident;
};
et2_arrayMgr.prototype.parseBoolExpression = function (_expression) {
}
parseBoolExpression(_expression) {
// If the first char of the expression is a '!' this means, that the value
// is to be negated.
if (_expression.charAt(0) == '!') {
return !this.parseBoolExpression(_expression.substr(1));
}
// Split the expression at a possible "="
var parts = _expression.split('=');
const parts = _expression.split('=');
// Expand the first value
var val = this.expandName(parts[0]);
let val = this.expandName(parts[0]);
val = (typeof val == "undefined" || val === null) ? '' : '' + val;
// If a second expression existed, test that one
if (typeof parts[1] != "undefined") {
// Expand the second value
var checkVal = '' + this.expandName(parts[1]);
const checkVal = '' + this.expandName(parts[1]);
// Values starting with / are treated as regular expression. It is
// checked whether the first value matches the regular expression
if (checkVal.charAt(0) == '/') {
@ -298,7 +282,7 @@ var et2_arrayMgr = /** @class */ (function () {
return val == checkVal;
}
return et2_evalBool(val);
};
}
/**
* ?
*
@ -306,15 +290,15 @@ var et2_arrayMgr = /** @class */ (function () {
* @param {(string|null|object)} _root string with key, null for whole data or object with data
* @param {number?} _row key for into the _root for the desired row
*/
et2_arrayMgr.prototype.openPerspective = function (_owner, _root, _row) {
openPerspective(_owner, _root, _row) {
// Get the root node
var root = typeof _root == "string" ? this.data[_root] :
let root = typeof _root == "string" ? this.data[_root] :
(_root == null ? this.data : _root);
if (typeof root == "undefined" && typeof _root == "string")
root = this.getEntry(_root);
// Create a new content array manager with the given root
var constructor = this.readOnly ? et2_readonlysArrayMgr : et2_arrayMgr;
var mgr = new constructor(root, this);
const constructor = this.readOnly ? et2_readonlysArrayMgr : et2_arrayMgr;
const mgr = new constructor(root, this);
// Set the owner
mgr.perspectiveData.owner = _owner;
// Set the root key
@ -326,20 +310,16 @@ var et2_arrayMgr = /** @class */ (function () {
mgr.perspectiveData.row = _row;
}
return mgr;
};
et2_arrayMgr.compiledExpressions = {};
return et2_arrayMgr;
}());
exports.et2_arrayMgr = et2_arrayMgr;
}
}
et2_arrayMgr.compiledExpressions = {};
/**
* @augments et2_arrayMgr
*/
var et2_readonlysArrayMgr = /** @class */ (function (_super) {
__extends(et2_readonlysArrayMgr, _super);
function et2_readonlysArrayMgr() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.readOnly = true;
return _this;
export class et2_readonlysArrayMgr extends et2_arrayMgr {
constructor() {
super(...arguments);
this.readOnly = true;
}
/**
* Find out if the given ID is readonly, according to the array data
@ -350,8 +330,8 @@ var et2_readonlysArrayMgr = /** @class */ (function (_super) {
* @param _parent
* @returns
*/
et2_readonlysArrayMgr.prototype.isReadOnly = function (_id, _attr, _parent) {
var entry = null;
isReadOnly(_id, _attr, _parent) {
let entry = null;
if (_id != null) {
if (_id.indexOf('$') >= 0 || _id.indexOf('@') >= 0) {
_id = this.expandName(_id);
@ -359,7 +339,7 @@ var et2_readonlysArrayMgr = /** @class */ (function (_super) {
// readonlys was not namespaced in old eTemplate, therefore if we dont find data
// under current namespace, we look into parent
// (if there is anything namespaced, we will NOT look for parent!)
var mgr = this;
let mgr = this;
while (mgr.getParentMgr() && jQuery.isEmptyObject(mgr.data)) {
mgr = mgr.getParentMgr();
}
@ -381,7 +361,7 @@ var et2_readonlysArrayMgr = /** @class */ (function (_super) {
// Otherwise return the default value
entry = this.getEntry("__ALL__");
return entry !== null && (typeof entry != "undefined");
};
}
/**
* Override parent to handle cont and row_cont.
*
@ -391,12 +371,10 @@ var et2_readonlysArrayMgr = /** @class */ (function (_super) {
* @param {string} ident Key for searching into the array.
* @returns {*}
*/
et2_readonlysArrayMgr.prototype.expandName = function (ident) {
expandName(ident) {
return this.perspectiveData.owner.getArrayMgr('content').expandName(ident);
};
return et2_readonlysArrayMgr;
}(et2_arrayMgr));
exports.et2_readonlysArrayMgr = et2_readonlysArrayMgr;
}
}
/**
* Creates a new set of array managers
*
@ -408,15 +386,15 @@ exports.et2_readonlysArrayMgr = et2_readonlysArrayMgr;
* existing array managers.
* @param _row is the row for which the array managers will be opened.
*/
function et2_arrayMgrs_expand(_owner, _mgrs, _data, _row) {
export function et2_arrayMgrs_expand(_owner, _mgrs, _data, _row) {
// Create a copy of the given _mgrs associative array
var result = {};
let result = {};
// Merge the given data associative array into the existing array managers
for (var key in _mgrs) {
for (let key in _mgrs) {
result[key] = _mgrs[key];
if (typeof _data[key] != "undefined") {
// Open a perspective for the given data row
var rowData = {};
let rowData = {};
rowData[_row] = _data[key];
result[key] = _mgrs[key].openPerspective(_owner, rowData, _row);
}
@ -424,5 +402,4 @@ function et2_arrayMgrs_expand(_owner, _mgrs, _data, _row) {
// Return the resulting managers object
return result;
}
exports.et2_arrayMgrs_expand = et2_arrayMgrs_expand;
//# sourceMappingURL=et2_core_arrayMgr.js.map

View File

@ -4,9 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*
*/
/*egw:uses
et2_core_common;
@ -14,7 +14,9 @@
et2_core_phpExpressionCompiler;
*/
import {et2_widget} from "./et2_core_widget";
import {et2_evalBool} from "./et2_core_common";
import type {et2_widget} from "./et2_core_widget";
import {egw} from "../jsapi/egw_global";
/**
* Manage access to various template customisation arrays passed to etemplate->exec().

View File

@ -1,38 +1,16 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Widget base class
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_container = exports.et2_baseWidget = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
lib/tooltip;
et2_core_DOMWidget;
*/
require("./et2_core_interfaces");
require("./et2_core_common");
var et2_core_DOMWidget_1 = require("./et2_core_DOMWidget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_widget_1 = require("./et2_core_widget");
import { et2_DOMWidget } from './et2_core_DOMWidget';
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_register_widget } from "./et2_core_widget";
import { et2_no_init } from "./et2_core_common";
/**
* Class which manages the DOM node itself. The simpleWidget class is derrived
* from et2_DOMWidget and implements the getDOMNode function. A setDOMNode
@ -40,27 +18,24 @@ var et2_core_widget_1 = require("./et2_core_widget");
*
* @augments et2_DOMWidget
*/
var et2_baseWidget = /** @class */ (function (_super) {
__extends(et2_baseWidget, _super);
export class et2_baseWidget extends et2_DOMWidget {
/**
* Constructor
*/
function et2_baseWidget(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_baseWidget._attributes, _child || {})) || this;
_this.align = 'left';
_this.node = null;
_this.statustext = '';
_this._messageDiv = null;
_this._tooltipElem = null;
return _this;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_baseWidget._attributes, _child || {}));
this.align = 'left';
this.node = null;
this.statustext = '';
this._messageDiv = null;
this._tooltipElem = null;
}
et2_baseWidget.prototype.destroy = function () {
_super.prototype.destroy.call(this);
destroy() {
super.destroy();
this.node = null;
this._messageDiv = null;
};
}
/**
* The setMessage function can be used to attach a small message box to the
* widget. This is e.g. used to display validation errors or success messages
@ -74,7 +49,7 @@ var et2_baseWidget = /** @class */ (function (_super) {
* @param _prepend if set, the message is displayed behind the widget node
* instead of before. Defaults to false.
*/
et2_baseWidget.prototype.showMessage = function (_text, _type, _floating, _prepend) {
showMessage(_text, _type, _floating, _prepend) {
// Preset the parameters
if (typeof _type == "undefined") {
_type = "hint";
@ -103,7 +78,7 @@ var et2_baseWidget = /** @class */ (function (_super) {
surr.appendDOMNode(this._messageDiv[0]);
}
surr.update();
};
}
/**
* The hideMessage function can be used to hide a previously shown message.
*
@ -112,7 +87,7 @@ var et2_baseWidget = /** @class */ (function (_super) {
* @param _noUpdate is used internally to prevent an update of the surroundings
* manager.
*/
et2_baseWidget.prototype.hideMessage = function (_fade, _noUpdate) {
hideMessage(_fade, _noUpdate) {
if (typeof _fade == "undefined") {
_fade = true;
}
@ -141,8 +116,8 @@ var et2_baseWidget = /** @class */ (function (_super) {
_done();
}
}
};
et2_baseWidget.prototype.detachFromDOM = function () {
}
detachFromDOM() {
// Detach this node from the tooltip node
if (this._tooltipElem) {
this.egw().tooltipUnbind(this._tooltipElem);
@ -152,10 +127,10 @@ var et2_baseWidget = /** @class */ (function (_super) {
if (this.node) {
jQuery(this.node).unbind("click.et2_baseWidget");
}
return _super.prototype.detachFromDOM.call(this);
};
et2_baseWidget.prototype.attachToDOM = function () {
var ret = _super.prototype.attachToDOM.call(this);
return super.detachFromDOM();
}
attachToDOM() {
let ret = super.attachToDOM();
// Add the binding for the click handler
if (this.node) {
jQuery(this.node).bind("click.et2_baseWidget", this, function (e) {
@ -167,8 +142,8 @@ var et2_baseWidget = /** @class */ (function (_super) {
// Update the statustext
this.set_statustext(this.statustext);
return ret;
};
et2_baseWidget.prototype.setDOMNode = function (_node) {
}
setDOMNode(_node) {
if (_node != this.node) {
// Deatch the old node from the DOM
this.detachFromDOM();
@ -178,20 +153,20 @@ var et2_baseWidget = /** @class */ (function (_super) {
return this.attachToDOM();
}
return false;
};
et2_baseWidget.prototype.getDOMNode = function (_sender) {
}
getDOMNode(_sender) {
return this.node;
};
et2_baseWidget.prototype.getTooltipElement = function () {
}
getTooltipElement() {
return this.getDOMNode(this);
};
}
/**
* Click handler calling custom handler set via onclick attribute to this.onclick
*
* @param _ev
* @returns
*/
et2_baseWidget.prototype.click = function (_ev) {
click(_ev) {
if (typeof this.onclick == 'function') {
// Make sure function gets a reference to the widget, splice it in as 2. argument if not
var args = Array.prototype.slice.call(arguments);
@ -200,8 +175,8 @@ var et2_baseWidget = /** @class */ (function (_super) {
return this.onclick.apply(this, args);
}
return true;
};
et2_baseWidget.prototype.set_statustext = function (_value) {
}
set_statustext(_value) {
// Tooltip should not be shown in mobile view
if (egwIsMobile())
return;
@ -223,66 +198,61 @@ var et2_baseWidget = /** @class */ (function (_super) {
this._tooltipElem = elem;
}
}
};
et2_baseWidget.prototype.set_align = function (_value) {
}
set_align(_value) {
this.align = _value;
};
et2_baseWidget.prototype.get_align = function () {
}
get_align() {
return this.align;
};
et2_baseWidget._attributes = {
"statustext": {
"name": "Tooltip",
"type": "string",
"description": "Tooltip which is shown for this element",
"translate": true
},
"statustext_html": {
"name": "Tooltip is html",
"type": "boolean",
"description": "Flag to allow html content in tooltip",
"default": false
},
"align": {
"name": "Align",
"type": "string",
"default": "left",
"description": "Position of this element in the parent hbox"
},
"onclick": {
"name": "onclick",
"type": "js",
"default": et2_no_init,
"description": "JS code which is executed when the element is clicked."
}
};
return et2_baseWidget;
}(et2_core_DOMWidget_1.et2_DOMWidget));
exports.et2_baseWidget = et2_baseWidget;
}
}
et2_baseWidget._attributes = {
"statustext": {
"name": "Tooltip",
"type": "string",
"description": "Tooltip which is shown for this element",
"translate": true
},
"statustext_html": {
"name": "Tooltip is html",
"type": "boolean",
"description": "Flag to allow html content in tooltip",
"default": false
},
"align": {
"name": "Align",
"type": "string",
"default": "left",
"description": "Position of this element in the parent hbox"
},
"onclick": {
"name": "onclick",
"type": "js",
"default": et2_no_init,
"description": "JS code which is executed when the element is clicked."
}
};
/**
* Simple container object
*
* There is no tag to put this in a template. By convention we only make one of these per etemplate,
* and it's the top level object.
*/
var et2_container = /** @class */ (function (_super) {
__extends(et2_container, _super);
export class et2_container extends et2_baseWidget {
/**
* Constructor
*/
function et2_container(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_container._attributes, _child || {})) || this;
_this.setDOMNode(document.createElement("div"));
return _this;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_container._attributes, _child || {}));
this.setDOMNode(document.createElement("div"));
}
/**
* The destroy function destroys all children of the widget, removes itself
* from the parents children list.
* Overriden to not try to remove self from parent, as that's not possible.
*/
et2_container.prototype.destroy = function () {
destroy() {
// Call the destructor of all children
for (var i = this._children.length - 1; i >= 0; i--) {
this._children[i].destroy();
@ -293,31 +263,31 @@ var et2_container = /** @class */ (function (_super) {
this._mgrs[key].destroy();
}
}
};
}
/**
* Searches for a DOM widget by id in the tree, descending into the child levels.
*
* @param _id is the id you're searching for
*/
et2_container.prototype.getDOMWidgetById = function (_id) {
var widget = this.getWidgetById(_id);
if (widget && widget.instanceOf(et2_core_DOMWidget_1.et2_DOMWidget)) {
getDOMWidgetById(_id) {
let widget = this.getWidgetById(_id);
if (widget && widget.instanceOf(et2_DOMWidget)) {
return widget;
}
return null;
};
}
/**
* Searches for a Value widget by id in the tree, descending into the child levels.
*
* @param _id is the id you're searching for
*/
et2_container.prototype.getInputWidgetById = function (_id) {
var widget = this.getWidgetById(_id);
getInputWidgetById(_id) {
let widget = this.getWidgetById(_id);
if (widget && widget.instanceOf(et2_valueWidget)) {
return widget;
}
return null;
};
}
/**
* Set the value for a child widget, specified by the given ID
*
@ -328,8 +298,8 @@ var et2_container = /** @class */ (function (_super) {
*
* @throws Error If the widget cannot be found or it does not have a set_value() function
*/
et2_container.prototype.setValueById = function (id, value) {
var widget = this.getWidgetById(id);
setValueById(id, value) {
let widget = this.getWidgetById(id);
if (!widget)
throw 'Could not find widget ' + id;
// Don't care about what class it is, just that it has the function
@ -339,7 +309,7 @@ var et2_container = /** @class */ (function (_super) {
}
// @ts-ignore
return widget.set_value(value);
};
}
/**
* Get the current value of a child widget, specified by the given ID
*
@ -348,8 +318,8 @@ var et2_container = /** @class */ (function (_super) {
* @param id string The ID you're searching for
* @throws Error If the widget cannot be found or it does not have a set_value() function
*/
et2_container.prototype.getValueById = function (id) {
var widget = this.getWidgetById(id);
getValueById(id) {
let widget = this.getWidgetById(id);
if (!widget)
throw 'Could not find widget ' + id;
// Don't care about what class it is, just that it has the function
@ -359,15 +329,15 @@ var et2_container = /** @class */ (function (_super) {
}
// @ts-ignore
return widget.get_value();
};
}
/**
* Set the value for a child widget, specified by the given ID
*
* @param id string The ID you're searching for
* @throws Error If the widget cannot be found or it does not have a set_value() function
*/
et2_container.prototype.setDisabledById = function (id, value) {
var widget = this.getWidgetById(id);
setDisabledById(id, value) {
let widget = this.getWidgetById(id);
if (!widget)
throw 'Could not find widget ' + id;
// Don't care about what class it is, just that it has the function
@ -377,39 +347,35 @@ var et2_container = /** @class */ (function (_super) {
}
// @ts-ignore
return widget.set_disabled(value);
};
return et2_container;
}(et2_baseWidget));
exports.et2_container = et2_container;
}
}
// Register widget for attributes, but not for any xml tags
et2_core_widget_1.et2_register_widget(et2_container, []);
et2_register_widget(et2_container, []);
/**
* Container object for not-yet supported widgets
*
* @augments et2_baseWidget
*/
var et2_placeholder = /** @class */ (function (_super) {
__extends(et2_placeholder, _super);
export class et2_placeholder extends et2_baseWidget {
/**
* Constructor
*/
function et2_placeholder(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_placeholder._attributes, _child || {})) || this;
_this.visible = false;
_this.attrNodes = {};
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_placeholder._attributes, _child || {}));
this.visible = false;
this.attrNodes = {};
// Create the placeholder div
_this.placeDiv = jQuery(document.createElement("span"))
this.placeDiv = jQuery(document.createElement("span"))
.addClass("et2_placeholder");
var headerNode = jQuery(document.createElement("span"))
.text(_this.getType() || "")
.text(this.getType() || "")
.addClass("et2_caption")
.appendTo(_this.placeDiv);
.appendTo(this.placeDiv);
var attrsCntr = jQuery(document.createElement("span"))
.appendTo(_this.placeDiv)
.appendTo(this.placeDiv)
.hide();
headerNode.click(_this, function (e) {
headerNode.click(this, function (e) {
e.data.visible = !e.data.visible;
if (e.data.visible) {
attrsCntr.show();
@ -418,30 +384,28 @@ var et2_placeholder = /** @class */ (function (_super) {
attrsCntr.hide();
}
});
for (var key in _this.options) {
if (typeof _this.options[key] != "undefined") {
if (typeof _this.attrNodes[key] == "undefined") {
_this.attrNodes[key] = jQuery(document.createElement("span"))
for (var key in this.options) {
if (typeof this.options[key] != "undefined") {
if (typeof this.attrNodes[key] == "undefined") {
this.attrNodes[key] = jQuery(document.createElement("span"))
.addClass("et2_attr");
attrsCntr.append(_this.attrNodes[key]);
attrsCntr.append(this.attrNodes[key]);
}
_this.attrNodes[key].text(key + "=" + _this.options[key]);
this.attrNodes[key].text(key + "=" + this.options[key]);
}
}
_this.setDOMNode(_this.placeDiv[0]);
return _this;
this.setDOMNode(this.placeDiv[0]);
}
et2_placeholder.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push("value");
};
et2_placeholder.prototype.getDetachedNodes = function () {
}
getDetachedNodes() {
return [this.placeDiv[0]];
};
et2_placeholder.prototype.setDetachedAttributes = function (_nodes, _values) {
}
setDetachedAttributes(_nodes, _values) {
this.placeDiv = jQuery(_nodes[0]);
};
return et2_placeholder;
}(et2_baseWidget));
}
}
// Register widget, but no tags
et2_core_widget_1.et2_register_widget(et2_placeholder, []);
et2_register_widget(et2_placeholder, ['placeholder', 'placeholder_ro']);
//# sourceMappingURL=et2_core_baseWidget.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
@ -14,11 +14,14 @@
et2_core_DOMWidget;
*/
import './et2_core_interfaces';
import './et2_core_common';
import {et2_IAligned, et2_IDetachedDOM} from "./et2_core_interfaces";
import {et2_DOMWidget} from './et2_core_DOMWidget';
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_register_widget, et2_widget, WidgetConfig} from "./et2_core_widget";
import {et2_no_init} from "./et2_core_common";
// fixing circular dependencies by only importing type
import type {et2_inputWidget} from "./et2_core_inputWidget";
import type {et2_valueWidget} from "./et2_core_valueWidget";
/**
* Class which manages the DOM node itself. The simpleWidget class is derrived
@ -467,7 +470,7 @@ et2_register_widget(et2_container, []);
*
* @augments et2_baseWidget
*/
class et2_placeholder extends et2_baseWidget implements et2_IDetachedDOM
export class et2_placeholder extends et2_baseWidget implements et2_IDetachedDOM
{
/**
* he attrNodes object will hold the DOM nodes which represent the
@ -546,4 +549,4 @@ class et2_placeholder extends et2_baseWidget implements et2_IDetachedDOM
}
}
// Register widget, but no tags
et2_register_widget(et2_placeholder, []);
et2_register_widget(et2_placeholder, ['placeholder', 'placeholder_ro']);

View File

@ -4,10 +4,11 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @copyright EGroupware GmbH 2011-2021
*/
import { app, egw } from "../jsapi/egw_global";
/**
* IE Fix for array.indexOf
*/
@ -23,13 +24,13 @@ if (typeof Array.prototype.indexOf == "undefined") {
/**
* Array with all types supported by the et2_checkType function.
*/
var et2_validTypes = ["boolean", "string", "rawstring", "html", "float", "integer", "any", "js", "dimension"];
export var et2_validTypes = ["boolean", "string", "rawstring", "html", "float", "integer", "any", "js", "dimension"];
/**
* Object whith default values for the above types. Do not specify array or
* objects inside the et2_typeDefaults object, as this instance will be shared
* between all users of it.
*/
var et2_typeDefaults = {
export var et2_typeDefaults = {
"boolean": false,
"string": "",
"rawstring": "",
@ -40,7 +41,7 @@ var et2_typeDefaults = {
"any": null,
"dimension": "auto"
};
function et2_evalBool(_val) {
export function et2_evalBool(_val) {
if (typeof _val == "string") {
if (_val == "false" || _val == "0") {
return false;
@ -53,7 +54,7 @@ function et2_evalBool(_val) {
* @param variable number of arguments to contact
* @returns string
*/
function et2_form_name(_cname, _name) {
export function et2_form_name(_cname, _name) {
var parts = [];
for (var i = 0; i < arguments.length; ++i) {
var name = arguments[i];
@ -75,7 +76,7 @@ function et2_form_name(_cname, _name) {
* @param string _attr attribute name
* @param object _widget
*/
function et2_checkType(_val, _type, _attr, _widget) {
export function et2_checkType(_val, _type, _attr, _widget) {
if (typeof _attr == "undefined") {
_attr = null;
}
@ -206,7 +207,7 @@ function et2_checkType(_val, _type, _attr, _widget) {
* If et2_no_init is set as default value, the initAttributes function will not
* try to initialize the attribute with the default value.
*/
var et2_no_init = new Object();
export const et2_no_init = new Object();
/**
* Validates the given attribute with the given id. The validation checks for
* the existance of a human name, a description, a type and a default value.
@ -214,7 +215,7 @@ var et2_no_init = new Object();
* empty string, the type defaults to any and the default to the corresponding
* type default.
*/
function et2_validateAttrib(_id, _attrib) {
export function et2_validateAttrib(_id, _attrib) {
// Default ignore to false.
if (typeof _attrib["ignore"] == "undefined") {
_attrib["ignore"] = false;
@ -250,7 +251,7 @@ function et2_validateAttrib(_id, _attrib) {
/**
* Equivalent to the PHP array_values function
*/
function et2_arrayValues(_arr) {
export function et2_arrayValues(_arr) {
var result = [];
for (var key in _arr) {
// @ts-ignore we check key is an integer
@ -263,14 +264,14 @@ function et2_arrayValues(_arr) {
/**
* Equivalent to the PHP array_keys function
*/
function et2_arrayKeys(_arr) {
export function et2_arrayKeys(_arr) {
var result = [];
for (var key in _arr) {
result.push(key);
}
return result;
}
function et2_arrayIntKeys(_arr) {
export function et2_arrayIntKeys(_arr) {
var result = [];
for (var key in _arr) {
result.push(parseInt(key));
@ -281,7 +282,7 @@ function et2_arrayIntKeys(_arr) {
* Equivalent to the PHP substr function, partly take from phpjs, licensed under
* the GPL.
*/
function et2_substr(str, start, len) {
export function et2_substr(str, start, len) {
var end = str.length;
if (start < 0) {
start += end;
@ -306,7 +307,7 @@ function et2_substr(str, start, len) {
* @param string _enclosure='"'
* @return array
*/
function et2_csvSplit(_str, _num, _delimiter, _enclosure) {
export function et2_csvSplit(_str, _num, _delimiter, _enclosure) {
// Default the parameters
if (typeof _str == "undefined" || _str == null) {
_str = "";
@ -353,7 +354,7 @@ function et2_csvSplit(_str, _num, _delimiter, _enclosure) {
/**
* Parses the given string and returns an array marking parts which are URLs
*/
function et2_activateLinks(_content) {
export function et2_activateLinks(_content) {
var _match = false;
var arr = [];
function _splitPush(_matches, _proc) {
@ -427,7 +428,7 @@ function et2_activateLinks(_content) {
/**
* Inserts the structure generated by et2_activateLinks into the given DOM-Node
*/
function et2_insertLinkText(_text, _node, _target) {
export function et2_insertLinkText(_text, _node, _target) {
if (!_node) {
egw.debug("warn", "et2_insertLinkText called without node", _text, _node, _target);
return;
@ -476,7 +477,7 @@ function et2_insertLinkText(_text, _node, _target) {
/**
* Creates a copy of the given object (non recursive)
*/
function et2_cloneObject(_obj) {
export function et2_cloneObject(_obj) {
var result = {};
for (var key in _obj) {
result[key] = _obj[key];
@ -487,7 +488,7 @@ function et2_cloneObject(_obj) {
* Returns true if the given array of nodes or their children contains the given
* child node.
*/
function et2_hasChild(_nodes, _child) {
export function et2_hasChild(_nodes, _child) {
for (var i = 0; i < _nodes.length; i++) {
if (_nodes[i] == _child) {
return true;
@ -510,7 +511,7 @@ function et2_hasChild(_nodes, _child) {
/**
* Returns an "range" object with the given top position and height
*/
function et2_range(_top, _height) {
export function et2_range(_top, _height) {
return {
"top": _top,
"bottom": _top + _height
@ -519,7 +520,7 @@ function et2_range(_top, _height) {
/**
* Returns an "area" object with the given top- and bottom position
*/
function et2_bounds(_top, _bottom) {
export function et2_bounds(_top, _bottom) {
return {
"top": _top,
"bottom": _bottom
@ -528,14 +529,14 @@ function et2_bounds(_top, _bottom) {
/**
* Returns whether two range objects intersect each other
*/
function et2_rangeIntersect(_ar1, _ar2) {
export function et2_rangeIntersect(_ar1, _ar2) {
return !(_ar1.bottom < _ar2.top || _ar1.top > _ar2.bottom);
}
/**
* Returns whether two ranges intersect (result = 0) or their relative position
* to each other (used to do a binary search inside a list of sorted range objects).
*/
function et2_rangeIntersectDir(_ar1, _ar2) {
export function et2_rangeIntersectDir(_ar1, _ar2) {
if (_ar1.bottom < _ar2.top) {
return -1;
}
@ -547,13 +548,13 @@ function et2_rangeIntersectDir(_ar1, _ar2) {
/**
* Returns whether two ranges are equal.
*/
function et2_rangeEqual(_ar1, _ar2) {
export function et2_rangeEqual(_ar1, _ar2) {
return _ar1.top === _ar2.top && _ar1.bottom === _ar2.bottom;
}
/**
* Substracts _ar2 from _ar1, returns an array of new ranges.
*/
function et2_rangeSubstract(_ar1, _ar2) {
export function et2_rangeSubstract(_ar1, _ar2) {
// Per default return the complete _ar1 range
var res = [_ar1];
// Check whether there is an intersection between the given ranges
@ -575,7 +576,7 @@ function et2_rangeSubstract(_ar1, _ar2) {
* @param {string} _str
* @returns {string}
*/
function html_entity_decode(_str) {
export function html_entity_decode(_str) {
return _str && _str.indexOf('&') != -1 ? jQuery('<span>' + _str + '</span>').text() : _str;
}
//# sourceMappingURL=et2_core_common.js.map

View File

@ -4,11 +4,13 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @copyright EGroupware GmbH 2011-2021
*/
import {app, egw} from "../jsapi/egw_global";
/**
* IE Fix for array.indexOf
*/
@ -27,14 +29,14 @@ if (typeof Array.prototype.indexOf == "undefined")
/**
* Array with all types supported by the et2_checkType function.
*/
var et2_validTypes = ["boolean", "string", "rawstring", "html", "float", "integer", "any", "js", "dimension"];
export var et2_validTypes = ["boolean", "string", "rawstring", "html", "float", "integer", "any", "js", "dimension"];
/**
* Object whith default values for the above types. Do not specify array or
* objects inside the et2_typeDefaults object, as this instance will be shared
* between all users of it.
*/
var et2_typeDefaults : object = {
export var et2_typeDefaults : object = {
"boolean": false,
"string": "",
"rawstring": "", // no html-entity decoding
@ -46,7 +48,7 @@ var et2_typeDefaults : object = {
"dimension": "auto"
};
function et2_evalBool(_val)
export function et2_evalBool(_val)
{
if (typeof _val == "string")
{
@ -64,7 +66,7 @@ function et2_evalBool(_val)
* @param variable number of arguments to contact
* @returns string
*/
function et2_form_name(_cname,_name)
export function et2_form_name(_cname,_name)
{
var parts = [];
for(var i=0; i < arguments.length; ++i)
@ -89,7 +91,7 @@ function et2_form_name(_cname,_name)
* @param string _attr attribute name
* @param object _widget
*/
function et2_checkType(_val, _type, _attr, _widget)
export function et2_checkType(_val, _type, _attr, _widget)
{
if (typeof _attr == "undefined")
{
@ -273,7 +275,7 @@ function et2_checkType(_val, _type, _attr, _widget)
* If et2_no_init is set as default value, the initAttributes function will not
* try to initialize the attribute with the default value.
*/
const et2_no_init = new Object();
export const et2_no_init = new Object();
/**
* Validates the given attribute with the given id. The validation checks for
@ -282,7 +284,7 @@ const et2_no_init = new Object();
* empty string, the type defaults to any and the default to the corresponding
* type default.
*/
function et2_validateAttrib(_id, _attrib)
export function et2_validateAttrib(_id, _attrib)
{
// Default ignore to false.
if (typeof _attrib["ignore"] == "undefined")
@ -333,7 +335,7 @@ function et2_validateAttrib(_id, _attrib)
/**
* Equivalent to the PHP array_values function
*/
function et2_arrayValues(_arr)
export function et2_arrayValues(_arr)
{
var result = [];
for (var key in _arr)
@ -351,7 +353,7 @@ function et2_arrayValues(_arr)
/**
* Equivalent to the PHP array_keys function
*/
function et2_arrayKeys(_arr)
export function et2_arrayKeys(_arr)
{
var result = [];
for (var key in _arr)
@ -362,7 +364,7 @@ function et2_arrayKeys(_arr)
return result;
}
function et2_arrayIntKeys(_arr)
export function et2_arrayIntKeys(_arr)
{
var result = [];
for (var key in _arr)
@ -378,7 +380,7 @@ function et2_arrayIntKeys(_arr)
* Equivalent to the PHP substr function, partly take from phpjs, licensed under
* the GPL.
*/
function et2_substr (str, start, len) {
export function et2_substr (str, start, len) {
var end = str.length;
if (start < 0)
@ -407,7 +409,7 @@ function et2_substr (str, start, len) {
* @param string _enclosure='"'
* @return array
*/
function et2_csvSplit(_str : string, _num? : number, _delimiter? : string, _enclosure? : string)
export function et2_csvSplit(_str : string, _num? : number, _delimiter? : string, _enclosure? : string)
{
// Default the parameters
if (typeof _str == "undefined" || _str == null)
@ -474,7 +476,7 @@ function et2_csvSplit(_str : string, _num? : number, _delimiter? : string, _encl
/**
* Parses the given string and returns an array marking parts which are URLs
*/
function et2_activateLinks(_content)
export function et2_activateLinks(_content)
{
var _match = false;
var arr = [];
@ -572,7 +574,7 @@ function et2_activateLinks(_content)
/**
* Inserts the structure generated by et2_activateLinks into the given DOM-Node
*/
function et2_insertLinkText(_text, _node, _target)
export function et2_insertLinkText(_text, _node, _target)
{
if(!_node)
{
@ -640,7 +642,7 @@ function et2_insertLinkText(_text, _node, _target)
/**
* Creates a copy of the given object (non recursive)
*/
function et2_cloneObject(_obj)
export function et2_cloneObject(_obj)
{
var result = {};
@ -656,7 +658,7 @@ function et2_cloneObject(_obj)
* Returns true if the given array of nodes or their children contains the given
* child node.
*/
function et2_hasChild(_nodes, _child)
export function et2_hasChild(_nodes, _child)
{
for (var i = 0; i < _nodes.length; i++)
{
@ -689,7 +691,7 @@ function et2_hasChild(_nodes, _child)
/**
* Returns an "range" object with the given top position and height
*/
function et2_range(_top, _height)
export function et2_range(_top, _height)
{
return {
"top": _top,
@ -700,7 +702,7 @@ function et2_range(_top, _height)
/**
* Returns an "area" object with the given top- and bottom position
*/
function et2_bounds(_top, _bottom)
export function et2_bounds(_top, _bottom)
{
return {
"top": _top,
@ -711,7 +713,7 @@ function et2_bounds(_top, _bottom)
/**
* Returns whether two range objects intersect each other
*/
function et2_rangeIntersect(_ar1, _ar2)
export function et2_rangeIntersect(_ar1, _ar2)
{
return ! (_ar1.bottom < _ar2.top || _ar1.top > _ar2.bottom);
}
@ -720,7 +722,7 @@ function et2_rangeIntersect(_ar1, _ar2)
* Returns whether two ranges intersect (result = 0) or their relative position
* to each other (used to do a binary search inside a list of sorted range objects).
*/
function et2_rangeIntersectDir(_ar1, _ar2)
export function et2_rangeIntersectDir(_ar1, _ar2)
{
if (_ar1.bottom < _ar2.top)
{
@ -736,7 +738,7 @@ function et2_rangeIntersectDir(_ar1, _ar2)
/**
* Returns whether two ranges are equal.
*/
function et2_rangeEqual(_ar1, _ar2)
export function et2_rangeEqual(_ar1, _ar2)
{
return _ar1.top === _ar2.top && _ar1.bottom === _ar2.bottom;
}
@ -744,7 +746,7 @@ function et2_rangeEqual(_ar1, _ar2)
/**
* Substracts _ar2 from _ar1, returns an array of new ranges.
*/
function et2_rangeSubstract(_ar1, _ar2)
export function et2_rangeSubstract(_ar1, _ar2)
{
// Per default return the complete _ar1 range
var res = [_ar1];
@ -774,7 +776,7 @@ function et2_rangeSubstract(_ar1, _ar2)
* @param {string} _str
* @returns {string}
*/
function html_entity_decode(_str)
export function html_entity_decode(_str)
{
return _str && _str.indexOf('&') != -1 ? jQuery('<span>'+_str+'</span>').text() : _str;
}

View File

@ -1,33 +1,19 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Widget base class
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_editableWidget = void 0;
/*egw:uses
et2_core_inputWidget;
*/
var et2_core_inputWidget_1 = require("./et2_core_inputWidget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
import { et2_inputWidget } from "./et2_core_inputWidget";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_no_init } from "./et2_core_common";
import { egw } from "../jsapi/egw_global";
/**
* et2_editableWidget derives from et2_inputWidget and adds the ability to start
* readonly, then turn editable on double-click. If we decide to do this with
@ -35,42 +21,39 @@ var et2_core_inheritance_1 = require("./et2_core_inheritance");
*
* @augments et2_inputWidget
*/
var et2_editableWidget = /** @class */ (function (_super) {
__extends(et2_editableWidget, _super);
export class et2_editableWidget extends et2_inputWidget {
/**
* Constructor
*/
function et2_editableWidget(_parent, _attrs, _child) {
var _this = this;
constructor(_parent, _attrs, _child) {
// 'Editable' really should be boolean for everything else to work
if (_attrs.readonly && typeof _attrs.readonly === 'string') {
_attrs.readonly = true;
var toggle_readonly = _attrs.toggle_readonly;
}
// Call the inherited constructor
_this = _super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_editableWidget._attributes, _child || {})) || this;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_editableWidget._attributes, _child || {}));
if (typeof toggle_readonly != 'undefined')
_this._toggle_readonly = toggle_readonly;
return _this;
this._toggle_readonly = toggle_readonly;
}
et2_editableWidget.prototype.destroy = function () {
var node = this.getInputNode();
destroy() {
let node = this.getInputNode();
if (node) {
jQuery(node).off('.et2_editableWidget');
}
_super.prototype.destroy.call(this);
};
super.destroy();
}
/**
* Load the validation errors from the server
*
* @param {object} _attrs
*/
et2_editableWidget.prototype.transformAttributes = function (_attrs) {
_super.prototype.transformAttributes.call(this, _attrs);
};
et2_editableWidget.prototype.attachToDOM = function () {
var res = _super.prototype.attachToDOM.call(this);
var node = this.getDOMNode();
transformAttributes(_attrs) {
super.transformAttributes(_attrs);
}
attachToDOM() {
let res = super.attachToDOM();
let node = this.getDOMNode();
if (node && this._toggle_readonly) {
jQuery(node)
.off('.et2_editableWidget')
@ -83,10 +66,10 @@ var et2_editableWidget = /** @class */ (function (_super) {
jQuery(node).addClass('et2_editable_readonly');
}
return res;
};
et2_editableWidget.prototype.detatchFromDOM = function () {
_super.prototype.detatchFromDOM.call(this);
};
}
detatchFromDOM() {
super.detatchFromDOM();
}
/**
* Handle double click
*
@ -94,7 +77,7 @@ var et2_editableWidget = /** @class */ (function (_super) {
*
* @param {DOMNode} _node
*/
et2_editableWidget.prototype.dblclick = function (_node) {
dblclick(_node) {
// Turn off readonly
this.set_readonly(false);
jQuery('body').on("click.et2_editableWidget", this, function (e) {
@ -104,14 +87,14 @@ var et2_editableWidget = /** @class */ (function (_super) {
e.data.focusout.call(e.data, this);
}
});
};
}
/**
* User clicked somewhere else, save and turn back to readonly
*
* @param {DOMNode} _node Body node
* @returns {et2_core_editableWidgetet2_editableWidget.et2_core_editableWidgetAnonym$0@call;getInstanceManager@call;submit}
*/
et2_editableWidget.prototype.focusout = function (_node) {
focusout(_node) {
var value = this.get_value();
var oldValue = this._oldValue;
// Change back to readonly
@ -132,7 +115,7 @@ var et2_editableWidget = /** @class */ (function (_super) {
this.set_value(value);
return this.getInstanceManager().submit();
}
};
}
/**
* Called whenever the template gets submitted.
* If we have a save_callback, we call that before the submit (no check on
@ -141,7 +124,7 @@ var et2_editableWidget = /** @class */ (function (_super) {
* @param _values contains the values which will be sent to the server.
* Listeners may change these values before they get submitted.
*/
et2_editableWidget.prototype.submit = function (_values) {
submit(_values) {
if (this.options.readonly) {
// Not currently editing, just continue on
return true;
@ -157,40 +140,38 @@ var et2_editableWidget = /** @class */ (function (_super) {
}, this, true, this).sendRequest();
}
return true;
};
et2_editableWidget._attributes = {
readonly: {
name: "readonly",
type: "string",
default: false,
description: "If set to 'editable' will start readonly, double clicking will make it editable and clicking out will save",
ignore: true // todo: not sure why this used to be ignored before migration by default but not anymore
},
toggle_readonly: {
name: "toggle_readonly",
type: "boolean",
default: true,
description: "Double clicking makes widget editable. If off, must be made editable in some other way."
},
save_callback: {
name: "save_callback",
type: "string",
default: et2_no_init,
description: "Ajax callback to save changed value when readonly is 'editable'. If not provided, a regular submit is done."
},
save_callback_params: {
name: "readonly",
type: "string",
default: et2_no_init,
description: "Additional parameters passed to save_callback"
},
editable_height: {
name: "Editable height",
description: "Set height for widget while in edit mode",
type: "string"
}
};
return et2_editableWidget;
}(et2_core_inputWidget_1.et2_inputWidget));
exports.et2_editableWidget = et2_editableWidget;
}
}
et2_editableWidget._attributes = {
readonly: {
name: "readonly",
type: "string",
default: false,
description: "If set to 'editable' will start readonly, double clicking will make it editable and clicking out will save",
ignore: true // todo: not sure why this used to be ignored before migration by default but not anymore
},
toggle_readonly: {
name: "toggle_readonly",
type: "boolean",
default: true,
description: "Double clicking makes widget editable. If off, must be made editable in some other way."
},
save_callback: {
name: "save_callback",
type: "string",
default: et2_no_init,
description: "Ajax callback to save changed value when readonly is 'editable'. If not provided, a regular submit is done."
},
save_callback_params: {
name: "readonly",
type: "string",
default: et2_no_init,
description: "Additional parameters passed to save_callback"
},
editable_height: {
name: "Editable height",
description: "Set height for widget while in edit mode",
type: "string"
}
};
//# sourceMappingURL=et2_core_editableWidget.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
*/
@ -15,6 +15,9 @@
import {et2_inputWidget} from "./et2_core_inputWidget";
import {WidgetConfig} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_no_init} from "./et2_core_common";
import {egw} from "../jsapi/egw_global";
import {et2_ISubmitListener} from "./et2_core_interfaces";
/**
* et2_editableWidget derives from et2_inputWidget and adds the ability to start

View File

@ -1,4 +1,3 @@
"use strict";
/**
* EGroupware eTemplate2 - JS code for implementing inheritance with attributes
*
@ -8,16 +7,13 @@
* @link: https://www.egroupware.org
* @author Andreas Stöckel
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ClassWithAttributes = void 0;
/*egw:uses
et2_core_common;
*/
require("../jsapi/egw_global");
require("et2_core_common");
var ClassWithAttributes = /** @class */ (function () {
function ClassWithAttributes() {
}
import { egw } from "../jsapi/egw_global";
import { et2_checkType, et2_no_init, et2_validateAttrib } from "./et2_core_common";
import { et2_implements_registry } from "./et2_core_interfaces";
export class ClassWithAttributes {
/**
* Returns the value of the given attribute. If the property does not
* exist, an error message is issued.
@ -25,7 +21,7 @@ var ClassWithAttributes = /** @class */ (function () {
* @param {string} _name
* @return {*}
*/
ClassWithAttributes.prototype.getAttribute = function (_name) {
getAttribute(_name) {
if (typeof this.attributes[_name] != "undefined" &&
!this.attributes[_name].ignore) {
if (typeof this["get_" + _name] == "function") {
@ -38,7 +34,7 @@ var ClassWithAttributes = /** @class */ (function () {
else {
egw.debug("error", this, "Attribute '" + _name + "' does not exist!");
}
};
}
/**
* The setAttribute function sets the attribute with the given name to
* the given value. _override defines, whether this[_name] will be set,
@ -49,7 +45,7 @@ var ClassWithAttributes = /** @class */ (function () {
* @param {*} _value
* @param {boolean} _override
*/
ClassWithAttributes.prototype.setAttribute = function (_name, _value, _override) {
setAttribute(_name, _value, _override) {
if (typeof this.attributes[_name] != "undefined") {
if (!this.attributes[_name].ignore) {
if (typeof _override == "undefined") {
@ -67,7 +63,7 @@ var ClassWithAttributes = /** @class */ (function () {
else {
egw.debug("warn", this, "Attribute '" + _name + "' does not exist!");
}
};
}
/**
* generateAttributeSet sanitizes the given associative array of attributes
* (by passing each entry to "et2_checkType" and checking for existance of
@ -75,7 +71,7 @@ var ClassWithAttributes = /** @class */ (function () {
*
* @param {object} _attrs is the associative array containing the attributes.
*/
ClassWithAttributes.generateAttributeSet = function (widget, _attrs) {
static generateAttributeSet(widget, _attrs) {
// Sanity check and validation
for (var key in _attrs) {
if (typeof widget[key] != "undefined") {
@ -101,7 +97,7 @@ var ClassWithAttributes = /** @class */ (function () {
}
}
return _attrs;
};
}
/**
* The initAttributes function sets the attributes to their default
* values. The attributes are not overwritten, which means, that the
@ -110,27 +106,27 @@ var ClassWithAttributes = /** @class */ (function () {
*
* @param {object} _attrs is the associative array containing the attributes.
*/
ClassWithAttributes.prototype.initAttributes = function (_attrs) {
initAttributes(_attrs) {
for (var key in _attrs) {
if (typeof this.attributes[key] != "undefined" && !this.attributes[key].ignore && !(_attrs[key] == undefined)) {
this.setAttribute(key, _attrs[key], false);
}
}
};
ClassWithAttributes.buildAttributes = function (class_prototype) {
var class_tree = [];
var attributes = {};
var n = 0;
}
static buildAttributes(class_prototype) {
let class_tree = [];
let attributes = {};
let n = 0;
do {
n++;
class_tree.push(class_prototype);
class_prototype = Object.getPrototypeOf(class_prototype);
} while (class_prototype !== ClassWithAttributes && n < 50);
for (var i = class_tree.length - 1; i >= 0; i--) {
for (let i = class_tree.length - 1; i >= 0; i--) {
attributes = ClassWithAttributes.extendAttributes(attributes, class_tree[i]._attributes);
}
return attributes;
};
}
/**
* Extend current _attributes with the one from the parent class
*
@ -139,7 +135,7 @@ var ClassWithAttributes = /** @class */ (function () {
* @param _attributes
* @param _parent
*/
ClassWithAttributes.extendAttributes = function (_parent, _attributes) {
static extendAttributes(_parent, _attributes) {
function _copyMerge(_new, _old) {
var result = {};
// Copy the new object
@ -172,7 +168,7 @@ var ClassWithAttributes = /** @class */ (function () {
et2_validateAttrib(key, attributes[key]);
}
return attributes;
};
}
/**
* The implements function can be used to check whether the object
* implements the given interface.
@ -183,25 +179,23 @@ var ClassWithAttributes = /** @class */ (function () {
*
* @param _iface name of interface to check
*/
ClassWithAttributes.prototype.implements = function (_iface_name) {
if (typeof window['implements_' + _iface_name] === 'function' &&
window['implements_' + _iface_name](this)) {
implements(_iface_name) {
if (typeof et2_implements_registry[_iface_name] === 'function' &&
et2_implements_registry[_iface_name](this)) {
return true;
}
return false;
};
}
/**
* Check if object is an instance of a class or implements an interface (specified by the interfaces name)
*
* @param _class_or_interfacename class(-name) or string with name of interface
*/
ClassWithAttributes.prototype.instanceOf = function (_class_or_interfacename) {
instanceOf(_class_or_interfacename) {
if (typeof _class_or_interfacename === 'string') {
return this.implements(_class_or_interfacename);
}
return this instanceof _class_or_interfacename;
};
return ClassWithAttributes;
}());
exports.ClassWithAttributes = ClassWithAttributes;
}
}
//# sourceMappingURL=et2_core_inheritance.js.map

View File

@ -12,8 +12,9 @@
et2_core_common;
*/
import '../jsapi/egw_global';
import 'et2_core_common';
import {egw} from "../jsapi/egw_global";
import {et2_checkType, et2_no_init, et2_validateAttrib} from "./et2_core_common";
import {et2_implements_registry} from "./et2_core_interfaces";
export class ClassWithAttributes
{
@ -245,8 +246,8 @@ export class ClassWithAttributes
*/
implements (_iface_name : string)
{
if (typeof window['implements_'+_iface_name] === 'function' &&
window['implements_'+_iface_name](this))
if (typeof et2_implements_registry[_iface_name] === 'function' &&
et2_implements_registry[_iface_name](this))
{
return true
}

View File

@ -1,79 +1,61 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Widget base class
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_inputWidget = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_interfaces;
et2_core_valueWidget;
*/
require("./et2_core_common");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
import { et2_no_init } from "./et2_core_common";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_valueWidget } from './et2_core_valueWidget';
import { et2_compileLegacyJS } from "./et2_core_legacyJSFunctions";
/**
* et2_inputWidget derrives from et2_simpleWidget and implements the IInput
* interface. When derriving from this class, call setDOMNode with an input
* DOMNode.
*/
var et2_inputWidget = /** @class */ (function (_super) {
__extends(et2_inputWidget, _super);
export class et2_inputWidget extends et2_valueWidget {
/**
* Constructor
*/
function et2_inputWidget(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_inputWidget._attributes, _child || {})) || this;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_inputWidget._attributes, _child || {}));
// mark value as not initialised, so set_value can determine if it is necessary to trigger change event
_this._oldValue = et2_no_init;
_this._labelContainer = null;
return _this;
this._oldValue = et2_no_init;
this._labelContainer = null;
}
et2_inputWidget.prototype.destroy = function () {
destroy() {
var node = this.getInputNode();
if (node) {
jQuery(node).unbind("change.et2_inputWidget");
jQuery(node).unbind("focus");
}
_super.prototype.destroy.call(this);
super.destroy();
this._labelContainer = null;
};
}
/**
* Make sure dirty flag is properly set
*/
et2_inputWidget.prototype.doLoadingFinished = function () {
var result = _super.prototype.doLoadingFinished.call(this);
doLoadingFinished() {
let result = super.doLoadingFinished();
this.resetDirty();
return result;
};
}
/**
* Load the validation errors from the server
*
* @param {object} _attrs
*/
et2_inputWidget.prototype.transformAttributes = function (_attrs) {
_super.prototype.transformAttributes.call(this, _attrs);
transformAttributes(_attrs) {
super.transformAttributes(_attrs);
// Check whether an validation error entry exists
if (this.id && this.getArrayMgr("validation_errors")) {
var val = this.getArrayMgr("validation_errors").getEntry(this.id);
@ -81,8 +63,8 @@ var et2_inputWidget = /** @class */ (function (_super) {
_attrs["validation_error"] = val;
}
}
};
et2_inputWidget.prototype.attachToDOM = function () {
}
attachToDOM() {
var node = this.getInputNode();
if (node) {
jQuery(node)
@ -94,17 +76,17 @@ var et2_inputWidget = /** @class */ (function (_super) {
e.data.focus.call(e.data, this);
});
}
return _super.prototype.attachToDOM.call(this);
return super.attachToDOM();
// jQuery(this.getInputNode()).attr("novalidate","novalidate"); // Stop browser from getting involved
// jQuery(this.getInputNode()).validator();
};
et2_inputWidget.prototype.detatchFromDOM = function () {
}
detatchFromDOM() {
// if(this.getInputNode()) {
// jQuery(this.getInputNode()).data("validator").destroy();
// }
_super.prototype.detachFromDOM.call(this);
};
et2_inputWidget.prototype.change = function (_node, _widget, _value) {
super.detachFromDOM();
}
change(_node, _widget, _value) {
var messages = [];
var valid = this.isValid(messages);
// Passing false will clear any set messages
@ -122,8 +104,8 @@ var et2_inputWidget = /** @class */ (function (_super) {
}
}
return valid;
};
et2_inputWidget.prototype.focus = function (_node) {
}
focus(_node) {
if (typeof this.options.onfocus == 'function') {
// Make sure function gets a reference to the widget
var args = Array.prototype.slice.call(arguments);
@ -131,7 +113,7 @@ var et2_inputWidget = /** @class */ (function (_super) {
args.push(this);
return this.options.onfocus.apply(this, args);
}
};
}
/**
* Set value of widget and trigger for real changes a change event
*
@ -139,7 +121,7 @@ var et2_inputWidget = /** @class */ (function (_super) {
*
* @param {string} _value value to set
*/
et2_inputWidget.prototype.set_value = function (_value) {
set_value(_value) {
var node = this.getInputNode();
if (node) {
jQuery(node).val(_value);
@ -148,8 +130,8 @@ var et2_inputWidget = /** @class */ (function (_super) {
}
}
this._oldValue = _value;
};
et2_inputWidget.prototype.set_id = function (_value) {
}
set_id(_value) {
this.id = _value;
this.dom_id = _value && this.getInstanceManager() ? this.getInstanceManager().uniqueId + '_' + this.id : _value;
// Set the id of the _input_ node (in contrast to the default
@ -166,8 +148,8 @@ var et2_inputWidget = /** @class */ (function (_super) {
node.removeAttribute("name");
}
}
};
et2_inputWidget.prototype.set_needed = function (_value) {
}
set_needed(_value) {
var node = this.getInputNode();
if (node) {
if (_value && !this.options.readonly) {
@ -177,8 +159,8 @@ var et2_inputWidget = /** @class */ (function (_super) {
node.removeAttribute("required");
}
}
};
et2_inputWidget.prototype.set_validation_error = function (_value) {
}
set_validation_error(_value) {
var node = this.getInputNode();
if (node) {
if (_value === false) {
@ -189,7 +171,7 @@ var et2_inputWidget = /** @class */ (function (_super) {
this.showMessage(_value, "validation_error");
jQuery(node).addClass("invalid");
// If on a tab, switch to that tab so user can see it
var widget = this;
let widget = this;
while (widget.getParent() && widget.getType() != 'tabbox') {
widget = widget.getParent();
}
@ -197,31 +179,31 @@ var et2_inputWidget = /** @class */ (function (_super) {
widget.activateTab(this);
}
}
};
}
/**
* Set tab index
*
* @param {number} index
*/
et2_inputWidget.prototype.set_tabindex = function (index) {
set_tabindex(index) {
jQuery(this.getInputNode()).attr("tabindex", index);
};
et2_inputWidget.prototype.getInputNode = function () {
}
getInputNode() {
return this.node;
};
et2_inputWidget.prototype.get_value = function () {
}
get_value() {
return this.getValue();
};
et2_inputWidget.prototype.getValue = function () {
}
getValue() {
var node = this.getInputNode();
if (node) {
var val = jQuery(node).val();
return val;
}
return this._oldValue;
};
et2_inputWidget.prototype.isDirty = function () {
var value = this.getValue();
}
isDirty() {
let value = this.getValue();
if (typeof value !== typeof this._oldValue) {
return true;
}
@ -234,7 +216,7 @@ var et2_inputWidget = /** @class */ (function (_super) {
this._oldValue.length !== value.length) {
return true;
}
for (var key in this._oldValue) {
for (let key in this._oldValue) {
if (this._oldValue[key] !== value[key])
return true;
}
@ -242,11 +224,11 @@ var et2_inputWidget = /** @class */ (function (_super) {
default:
return this._oldValue != value;
}
};
et2_inputWidget.prototype.resetDirty = function () {
}
resetDirty() {
this._oldValue = this.getValue();
};
et2_inputWidget.prototype.isValid = function (messages) {
}
isValid(messages) {
var ok = true;
// Check for required
if (this.options && this.options.needed && !this.options.readonly && !this.disabled &&
@ -255,7 +237,7 @@ var et2_inputWidget = /** @class */ (function (_super) {
ok = false;
}
return ok;
};
}
/**
* Called whenever the template gets submitted. We return false if the widget
* is not valid, which cancels the submission.
@ -263,52 +245,50 @@ var et2_inputWidget = /** @class */ (function (_super) {
* @param _values contains the values which will be sent to the server.
* Listeners may change these values before they get submitted.
*/
et2_inputWidget.prototype.submit = function (_values) {
submit(_values) {
var messages = [];
var valid = this.isValid(messages);
// Passing false will clear any set messages
this.set_validation_error(valid ? false : messages);
return valid;
};
et2_inputWidget._attributes = {
"needed": {
"name": "Required",
"default": false,
"type": "boolean",
"description": "If required, the user must enter a value before the form can be submitted"
},
"onchange": {
"name": "onchange",
"type": "js",
"default": et2_no_init,
"description": "JS code which is executed when the value changes."
},
"onfocus": {
"name": "onfocus",
"type": "js",
"default": et2_no_init,
"description": "JS code which get executed when wiget receives focus."
},
"validation_error": {
"name": "Validation Error",
"type": "string",
"default": et2_no_init,
"description": "Used internally to store the validation error that came from the server."
},
"tabindex": {
"name": "Tab index",
"type": "integer",
"default": et2_no_init,
"description": "Specifies the tab order of a widget when the 'tab' button is used for navigating."
},
readonly: {
name: "readonly",
type: "boolean",
"default": false,
description: "Does NOT allow user to enter data, just displays existing data"
}
};
return et2_inputWidget;
}(et2_core_valueWidget_1.et2_valueWidget));
exports.et2_inputWidget = et2_inputWidget;
}
}
et2_inputWidget._attributes = {
"needed": {
"name": "Required",
"default": false,
"type": "boolean",
"description": "If required, the user must enter a value before the form can be submitted"
},
"onchange": {
"name": "onchange",
"type": "js",
"default": et2_no_init,
"description": "JS code which is executed when the value changes."
},
"onfocus": {
"name": "onfocus",
"type": "js",
"default": et2_no_init,
"description": "JS code which get executed when wiget receives focus."
},
"validation_error": {
"name": "Validation Error",
"type": "string",
"default": et2_no_init,
"description": "Used internally to store the validation error that came from the server."
},
"tabindex": {
"name": "Tab index",
"type": "integer",
"default": et2_no_init,
"description": "Specifies the tab order of a widget when the 'tab' button is used for navigating."
},
readonly: {
name: "readonly",
type: "boolean",
"default": false,
description: "Does NOT allow user to enter data, just displays existing data"
}
};
//# sourceMappingURL=et2_core_inputWidget.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
@ -14,18 +14,24 @@
et2_core_valueWidget;
*/
import './et2_core_common';
import {et2_no_init} from "./et2_core_common";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_widget, et2_createWidget, et2_register_widget, WidgetConfig } from "./et2_core_widget";
import { et2_DOMWidget } from './et2_core_DOMWidget'
import { et2_widget, WidgetConfig } from "./et2_core_widget";
import { et2_valueWidget } from './et2_core_valueWidget'
import {et2_IInput, et2_ISubmitListener} from "./et2_core_interfaces";
import {et2_compileLegacyJS} from "./et2_core_legacyJSFunctions";
// fixing circular dependencies by only importing the type (not in compiled .js)
import type {et2_tabbox} from "./et2_widget_tabs";
export interface et2_input {
getInputNode() : HTMLInputElement|HTMLElement;
}
/**
* et2_inputWidget derrives from et2_simpleWidget and implements the IInput
* interface. When derriving from this class, call setDOMNode with an input
* DOMNode.
*/
export class et2_inputWidget extends et2_valueWidget implements et2_IInput, et2_ISubmitListener
export class et2_inputWidget extends et2_valueWidget implements et2_IInput, et2_ISubmitListener, et2_input
{
static readonly _attributes : any = {
"needed": {

View File

@ -4,53 +4,58 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
export var et2_implements_registry = {};
/**
* Checks if an object / et2_widget implements given methods
*
* @param obj
* @param methods
*/
function implements_methods(obj, methods) {
for (var i = 0; i < methods.length; ++i) {
export function implements_methods(obj, methods) {
for (let i = 0; i < methods.length; ++i) {
if (typeof obj[methods[i]] !== 'function') {
return false;
}
}
return true;
}
var et2_IDOMNode = "et2_IDOMNode";
function implements_et2_IDOMNode(obj) {
export const et2_IDOMNode = "et2_IDOMNode";
et2_implements_registry.et2_IDOMNode = function (obj) {
return implements_methods(obj, ["getDOMNode"]);
}
var et2_IInput = "et2_IInput";
function implements_et2_IInput(obj) {
};
export const et2_IInputNode = "et2_IInputNode";
et2_implements_registry.et2_IInputNode = function (obj) {
return implements_methods(obj, ["getInputNode"]);
};
export const et2_IInput = "et2_IInput";
et2_implements_registry.et2_IInput = function (obj) {
return implements_methods(obj, ["getValue", "isDirty", "resetDirty", "isValid"]);
}
var et2_IResizeable = "et2_IResizeable";
function implements_et2_IResizeable(obj) {
};
export const et2_IResizeable = "et2_IResizeable";
et2_implements_registry.et2_IResizeable = function (obj) {
return implements_methods(obj, ["resize"]);
}
var et2_IAligned = "et2_IAligned";
function implements_et2_IAligned(obj) {
};
export const et2_IAligned = "et2_IAligned";
et2_implements_registry.et2_IAligned = function (obj) {
return implements_methods(obj, ["get_align"]);
}
var et2_ISubmitListener = "et2_ISubmitListener";
function implements_et2_ISubmitListener(obj) {
};
export const et2_ISubmitListener = "et2_ISubmitListener";
et2_implements_registry.et2_ISubmitListener = function (obj) {
return implements_methods(obj, ["submit"]);
}
var et2_IDetachedDOM = "et2_IDetachedDOM";
function implements_et2_IDetachedDOM(obj) {
};
export const et2_IDetachedDOM = "et2_IDetachedDOM";
et2_implements_registry.et2_IDetachedDOM = function (obj) {
return implements_methods(obj, ["getDetachedAttributes", "getDetachedNodes", "setDetachedAttributes"]);
}
var et2_IPrint = "et2_IPrint";
function implements_et2_IPrint(obj) {
};
export const et2_IPrint = "et2_IPrint";
et2_implements_registry.et2_IPrint = function (obj) {
return implements_methods(obj, ["beforePrint", "afterPrint"]);
}
var et2_IExposable = "et2_IExposable";
function implements_et2_IExposable(obj) {
};
export const et2_IExposable = "et2_IExposable";
et2_implements_registry.et2_IExposable = function (obj) {
return implements_methods(obj, ["getMedia"]);
}
};
//# sourceMappingURL=et2_core_interfaces.js.map

View File

@ -4,17 +4,22 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
// fixing circular dependencies
import type {et2_widget} from "./et2_core_widget";
export var et2_implements_registry : any = {};
/**
* Checks if an object / et2_widget implements given methods
*
* @param obj
* @param methods
*/
function implements_methods(obj : et2_widget, methods : string[]) : boolean
export function implements_methods(obj : et2_widget, methods : string[]) : boolean
{
for(let i=0; i < methods.length; ++i)
{
@ -29,7 +34,7 @@ function implements_methods(obj : et2_widget, methods : string[]) : boolean
/**
* Interface for all widget classes, which are based on a DOM node.
*/
interface et2_IDOMNode
export interface et2_IDOMNode
{
/**
* Returns the DOM-Node of the current widget. The return value has to be
@ -49,16 +54,29 @@ interface et2_IDOMNode
*/
getDOMNode(_sender? : et2_widget) : HTMLElement
}
var et2_IDOMNode = "et2_IDOMNode";
function implements_et2_IDOMNode(obj : et2_widget)
export const et2_IDOMNode = "et2_IDOMNode";
et2_implements_registry.et2_IDOMNode = function(obj : et2_widget)
{
return implements_methods(obj, ["getDOMNode"]);
}
/**
* Interface for all et2_inputWidgets
*/
export interface et2_IInputNode
{
getInputNode(_sender? : et2_widget) : HTMLInputElement|HTMLElement
}
export const et2_IInputNode = "et2_IInputNode";
et2_implements_registry.et2_IInputNode = function(obj : et2_widget)
{
return implements_methods(obj, ["getInputNode"]);
}
/**
* Interface for all widgets which support returning a value
*/
interface et2_IInput
export interface et2_IInput
{
/**
* getValue has to return the value of the input widget
@ -92,8 +110,8 @@ interface et2_IInput
*/
isValid(messages) : boolean
}
var et2_IInput = "et2_IInput";
function implements_et2_IInput(obj : et2_widget)
export const et2_IInput = "et2_IInput";
et2_implements_registry.et2_IInput = function(obj : et2_widget)
{
return implements_methods(obj, ["getValue", "isDirty", "resetDirty", "isValid"]);
}
@ -101,15 +119,15 @@ function implements_et2_IInput(obj : et2_widget)
/**
* Interface for widgets which should be automatically resized
*/
interface et2_IResizeable
export interface et2_IResizeable
{
/**
* Called whenever the window is resized
*/
resize(number) : void
}
var et2_IResizeable = "et2_IResizeable";
function implements_et2_IResizeable(obj : et2_widget)
export const et2_IResizeable = "et2_IResizeable";
et2_implements_registry.et2_IResizeable = function(obj : et2_widget)
{
return implements_methods(obj, ["resize"]);
}
@ -117,12 +135,12 @@ function implements_et2_IResizeable(obj : et2_widget)
/**
* Interface for widgets which have the align attribute
*/
interface et2_IAligned
export interface et2_IAligned
{
get_align() : string
}
var et2_IAligned = "et2_IAligned";
function implements_et2_IAligned(obj : et2_widget)
export const et2_IAligned = "et2_IAligned";
et2_implements_registry.et2_IAligned = function(obj : et2_widget)
{
return implements_methods(obj, ["get_align"]);
}
@ -131,7 +149,7 @@ function implements_et2_IAligned(obj : et2_widget)
* Interface for widgets which want to e.g. perform clientside validation before
* the form is submitted.
*/
interface et2_ISubmitListener
export interface et2_ISubmitListener
{
/**
* Called whenever the template gets submitted. Return false if you want to
@ -142,8 +160,8 @@ interface et2_ISubmitListener
*/
submit(_values) : void
}
var et2_ISubmitListener = "et2_ISubmitListener";
function implements_et2_ISubmitListener(obj : et2_widget)
export const et2_ISubmitListener = "et2_ISubmitListener";
et2_implements_registry.et2_ISubmitListener = function(obj : et2_widget)
{
return implements_methods(obj, ["submit"]);
}
@ -153,7 +171,7 @@ function implements_et2_ISubmitListener(obj : et2_widget)
* is used in grid lists, when only a single row gets really stored in the widget
* tree and this instance has to work on multiple copies of the DOM-Tree elements.
*/
interface et2_IDetachedDOM
export interface et2_IDetachedDOM
{
/**
* Creates a list of attributes which can be set when working in the
@ -182,8 +200,8 @@ interface et2_IDetachedDOM
*/
setDetachedAttributes(_nodes : HTMLElement[], _values : object, _data?) : void
}
var et2_IDetachedDOM = "et2_IDetachedDOM";
function implements_et2_IDetachedDOM(obj : et2_widget)
export const et2_IDetachedDOM = "et2_IDetachedDOM";
et2_implements_registry.et2_IDetachedDOM = function(obj : et2_widget)
{
return implements_methods(obj, ["getDetachedAttributes", "getDetachedNodes", "setDetachedAttributes"]);
}
@ -191,7 +209,7 @@ function implements_et2_IDetachedDOM(obj : et2_widget)
/**
* Interface for widgets that need to do something special before printing
*/
interface et2_IPrint
export interface et2_IPrint
{
/**
* Set up for printing
@ -206,8 +224,8 @@ interface et2_IPrint
*/
afterPrint() : void
}
var et2_IPrint = "et2_IPrint";
function implements_et2_IPrint(obj : et2_widget)
export const et2_IPrint = "et2_IPrint";
et2_implements_registry.et2_IPrint = function(obj : et2_widget)
{
return implements_methods(obj, ["beforePrint", "afterPrint"]);
}
@ -215,7 +233,7 @@ function implements_et2_IPrint(obj : et2_widget)
/**
* Interface all exposed widget must support in order to getMedia for the blueimp Gallery.
*/
interface et2_IExposable
export interface et2_IExposable
{
/**
* get media an array of media objects to pass to blueimp Gallery
@ -223,8 +241,8 @@ interface et2_IExposable
*/
getMedia(_attrs) : void;
}
var et2_IExposable = "et2_IExposable";
function implements_et2_IExposable(obj : et2_widget)
export const et2_IExposable = "et2_IExposable";
et2_implements_registry.et2_IExposable = function(obj : et2_widget)
{
return implements_methods(obj, ["getMedia"]);
}

View File

@ -4,188 +4,146 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-13
* @version $Id: et2_core_phpExpressionCompiler.js 38256 2012-03-05 13:07:38Z igel457 $
* @copyright EGroupware GmbH 2011-21
*/
/*egw:uses
et2_interfaces;
et2_core_common;
et2_interfaces;
et2_core_common;
*/
(function()
{
"use strict";
/**
* Resolve javascript pseudo functions in onclick or onchange:
* - egw::link('$l','$p') calls egw.link($l,$p)
* - form::name('name') returns expanded name/id taking into account the name at that point of the template hierarchy
* - egw::lang('Message ...') translate the message, calls egw.lang()
* - confirm('message') translates 'message' and adds a '?' if not present
* - window.open() replaces it with egw_openWindowCentered2()
* - xajax_doXMLHTTP('etemplate. replace ajax calls in widgets with special handler not requiring etemplate run rights
*
* @param {string} _val onclick, onchange, ... action
* @param {et2_widget} widget
* @ToDo replace xajax_doXMLHTTP with egw.json()
* @ToDo replace (common) cases of confirm with new dialog, idea: calling function supplys function to call after confirm
* @ToDo template::styles(name) inserts the styles of a named template
* @return string
*/
function js_pseudo_funcs(_val,widget)
{
if (_val.indexOf('egw::link(') != -1)
{
_val = _val.replace(/egw::link\(/g,'egw.link(');
}
if (_val.indexOf('form::name(') != -1)
{
// et2_form_name doesn't care about ][, just [
var _cname = widget.getPath() ? widget.getPath().join("[") : false;
_val = _val.replace(/form::name\(/g, "'"+widget.getRoot()._inst.uniqueId+"_'+"+(_cname ? "et2_form_name('"+_cname+"'," : '('));
}
if (_val.indexOf('egw::lang(') != -1)
{
_val = _val.replace(/egw::lang\(/g,'egw.lang(');
}
// ToDo: inserts the styles of a named template
/*if (preg_match('/template::styles\(["\']{1}(.*)["\']{1}\)/U',$on,$matches))
{
$tpl = $matches[1] == $this->name ? $this : new etemplate($matches[1]);
$on = str_replace($matches[0],"'<style>".str_replace(array("\n","\r"),'',$tpl->style)."</style>'",$on);
}*/
// translate messages in confirm()
if (_val.indexOf('confirm(') != -1)
{
_val = _val.replace(/confirm\((['"])(.*?)(\?)?['"]\)/,"confirm(egw.lang($1$2$1)+'$3')"); // add ? if not there, saves extra phrase
}
// replace window.open() with EGw's egw_openWindowCentered2()
if (_val.indexOf('window.open(') != -1)
{
_val = _val.replace(/window.open\('(.*)','(.*)','dependent=yes,width=([^,]*),height=([^,]*),scrollbars=yes,status=(.*)'\)/,
"egw_openWindowCentered2('$1', '$2', $3, $4, '$5')");
}
// replace xajax calls to code in widgets, with the "etemplate" handler,
// this allows to call widgets with the current app, otherwise everyone would need etemplate run rights
if (_val.indexOf("xajax_doXMLHTTP('etemplate.") != -1)
{
_val = _val.replace(/^xajax_doXMLHTTP\('etemplate\.([a-z]+_widget\.[a-zA-Z0-9_]+)\'/,
"xajax_doXMLHTTP('"+egw.getAppName()+".$1.etemplate'");
}
if (_val.indexOf('this.form.submit()') != -1)
{
_val = _val.replace('this.form.submit()','widget.getInstanceManager().submit()');
}
return _val;
}
this.et2_compileLegacyJS = function(_code, _widget, _context) {
// Replace the javascript pseudo-functions
_code = js_pseudo_funcs(_code,_widget);
// Check whether _code is simply "1" -- if yes replace it accordingly
if (_code === '1')
{
_code = 'widget.getInstanceManager().submit(); return false;';
}
// Check whether some pseudo-variables still reside inside of the code,
// if yes, replace them.
if (_code.indexOf("$") >= 0 || _code.indexOf("@") >= 0)
{
// Get the content array manager for the widget
var mgr = _widget.getArrayMgr("content");
if (mgr)
{
_code = mgr.expandName(_code);
}
}
// Context is the context in which the function will run. Set context to
// null as a default, so that it's possible to find bugs where "this" is
// accessed in the code, but not properly set.
var context = _context ? _context : null;
// Check whether the given widget implements the "et2_IDOMNode"
// interface
if (!context && _widget.implements(et2_IDOMNode))
{
context = _widget.getDOMNode();
}
// Check to see if it's referring to an existing function with no arguments specified.
// If so, bind context & use it directly
if(_code.indexOf("(") === -1)
{
var parts = _code.split(".");
var existing_func = parts.pop();
var parent = _widget.egw().window;
for (var i = 0; i < parts.length; ++i) {
if (typeof parent[parts[i]] !== "undefined") {
parent = parent[parts[i]];
}
// Nope
else {
break;
}
}
if (typeof parent[existing_func] === "function") {
return parent[existing_func];
}
}
// Generate the function itself, if it fails, log the error message and
// return a function which always returns false
try {
// Code is app.appname.function, add the arguments so it can be executed
if (typeof _code == 'string' && _code.indexOf('app') == 0 && _code.split('.').length >= 3 && _code.indexOf('(') == -1)
{
const parts = _code.split('.');
const app = _widget.getInstanceManager().app_obj;
// check if we need to load the object
if (parts.length === 3 && typeof app[parts[1]] === 'undefined')
{
return function (ev, widget)
{
return egw.applyFunc(_code, [ev, widget]);
}
}
// Code is app.appname.function, add the arguments so it can be executed
_code += '(ev,widget)';
}
// use app object from etemplate2, which might be private and not just window.app
_code = _code.replace(/(window\.)?app\./, 'widget.getInstanceManager().app_obj.');
var func = new Function('ev', 'widget', _code);
} catch(e) {
_widget.egw().debug('error', 'Error while compiling JS code ', _code);
return (function() {return false;});
}
// Execute the code and return its results, pass the egw instance and
// the widget
return function(ev) {
// Dump the executed code for debugging
egw.debug('log', 'Executing legacy JS code: ', _code);
if(arguments && arguments.length > 2)
{
egw.debug('warn', 'Legacy JS code only supports 2 arguments (event and widget)', _code, arguments);
}
// Return the result of the called function
return func.call(context, ev, _widget);
};
};
}).call(window);
import { egw } from "../jsapi/egw_global";
import { et2_IDOMNode } from "./et2_core_interfaces";
export function et2_compileLegacyJS(_code, _widget, _context) {
// Replace the javascript pseudo-functions
_code = js_pseudo_funcs(_code, _widget);
// Check whether _code is simply "1" -- if yes replace it accordingly
if (_code === '1') {
_code = 'widget.getInstanceManager().submit(); return false;';
}
// Check whether some pseudo-variables still reside inside of the code,
// if yes, replace them.
if (_code.indexOf("$") >= 0 || _code.indexOf("@") >= 0) {
// Get the content array manager for the widget
var mgr = _widget.getArrayMgr("content");
if (mgr) {
_code = mgr.expandName(_code);
}
}
// Context is the context in which the function will run. Set context to
// null as a default, so that it's possible to find bugs where "this" is
// accessed in the code, but not properly set.
var context = _context ? _context : null;
// Check whether the given widget implements the "et2_IDOMNode"
// interface
if (!context && _widget.implements(et2_IDOMNode)) {
context = _widget.getDOMNode();
}
// Check to see if it's referring to an existing function with no arguments specified.
// If so, bind context & use it directly
if (_code.indexOf("(") === -1) {
var parts = _code.split(".");
var existing_func = parts.pop();
var parent = _widget.egw().window;
for (var i = 0; i < parts.length; ++i) {
if (typeof parent[parts[i]] !== "undefined") {
parent = parent[parts[i]];
}
// Nope
else {
break;
}
}
if (typeof parent[existing_func] === "function") {
return parent[existing_func];
}
}
// Generate the function itself, if it fails, log the error message and
// return a function which always returns false
try {
// Code is app.appname.function, add the arguments so it can be executed
if (typeof _code == 'string' && _code.indexOf('app') == 0 && _code.split('.').length >= 3 && _code.indexOf('(') == -1) {
const parts = _code.split('.');
const app = _widget.getInstanceManager().app_obj;
// check if we need to load the object
if (parts.length === 3 && typeof app[parts[1]] === 'undefined') {
return function (ev, widget) {
return egw.applyFunc(_code, [ev, widget]);
};
}
// Code is app.appname.function, add the arguments so it can be executed
_code += '(ev,widget)';
}
// use app object from etemplate2, which might be private and not just window.app
_code = _code.replace(/(window\.)?app\./, 'widget.getInstanceManager().app_obj.');
var func = new Function('ev', 'widget', _code);
}
catch (e) {
_widget.egw().debug('error', 'Error while compiling JS code ', _code);
return (function () { return false; });
}
// Execute the code and return its results, pass the egw instance and
// the widget
return function (ev) {
// Dump the executed code for debugging
egw.debug('log', 'Executing legacy JS code: ', _code);
if (arguments && arguments.length > 2) {
egw.debug('warn', 'Legacy JS code only supports 2 arguments (event and widget)', _code, arguments);
}
// Return the result of the called function
return func.call(context, ev, _widget);
};
}
/**
* Resolve javascript pseudo functions in onclick or onchange:
* - egw::link('$l','$p') calls egw.link($l,$p)
* - form::name('name') returns expanded name/id taking into account the name at that point of the template hierarchy
* - egw::lang('Message ...') translate the message, calls egw.lang()
* - confirm('message') translates 'message' and adds a '?' if not present
* - window.open() replaces it with egw_openWindowCentered2()
* - xajax_doXMLHTTP('etemplate. replace ajax calls in widgets with special handler not requiring etemplate run rights
*
* @param {string} _val onclick, onchange, ... action
* @param {et2_widget} widget
* @ToDo replace xajax_doXMLHTTP with egw.json()
* @ToDo replace (common) cases of confirm with new dialog, idea: calling function supplys function to call after confirm
* @ToDo template::styles(name) inserts the styles of a named template
* @return string
*/
function js_pseudo_funcs(_val, widget) {
if (_val.indexOf('egw::link(') != -1) {
_val = _val.replace(/egw::link\(/g, 'egw.link(');
}
if (_val.indexOf('form::name(') != -1) {
// et2_form_name doesn't care about ][, just [
var _cname = widget.getPath() ? widget.getPath().join("[") : false;
_val = _val.replace(/form::name\(/g, "'" + widget.getRoot()._inst.uniqueId + "_'+" + (_cname ? "et2_form_name('" + _cname + "'," : '('));
}
if (_val.indexOf('egw::lang(') != -1) {
_val = _val.replace(/egw::lang\(/g, 'egw.lang(');
}
// ToDo: inserts the styles of a named template
/*if (preg_match('/template::styles\(["\']{1}(.*)["\']{1}\)/U',$on,$matches))
{
$tpl = $matches[1] == $this->name ? $this : new etemplate($matches[1]);
$on = str_replace($matches[0],"'<style>".str_replace(array("\n","\r"),'',$tpl->style)."</style>'",$on);
}*/
// translate messages in confirm()
if (_val.indexOf('confirm(') != -1) {
_val = _val.replace(/confirm\((['"])(.*?)(\?)?['"]\)/, "confirm(egw.lang($1$2$1)+'$3')"); // add ? if not there, saves extra phrase
}
// replace window.open() with EGw's egw_openWindowCentered2()
if (_val.indexOf('window.open(') != -1) {
_val = _val.replace(/window.open\('(.*)','(.*)','dependent=yes,width=([^,]*),height=([^,]*),scrollbars=yes,status=(.*)'\)/, "egw_openWindowCentered2('$1', '$2', $3, $4, '$5')");
}
// replace xajax calls to code in widgets, with the "etemplate" handler,
// this allows to call widgets with the current app, otherwise everyone would need etemplate run rights
if (_val.indexOf("xajax_doXMLHTTP('etemplate.") != -1) {
_val = _val.replace(/^xajax_doXMLHTTP\('etemplate\.([a-z]+_widget\.[a-zA-Z0-9_]+)\'/, "xajax_doXMLHTTP('" + egw.getAppName() + ".$1.etemplate'");
}
if (_val.indexOf('this.form.submit()') != -1) {
_val = _val.replace('this.form.submit()', 'widget.getInstanceManager().submit()');
}
return _val;
}
//# sourceMappingURL=et2_core_legacyJSFunctions.js.map

View File

@ -0,0 +1,188 @@
/**
* EGroupware eTemplate2 - Execution layer for legacy event code
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright EGroupware GmbH 2011-21
*/
/*egw:uses
et2_interfaces;
et2_core_common;
*/
import {egw} from "../jsapi/egw_global";
import {et2_IDOMNode} from "./et2_core_interfaces";
export function et2_compileLegacyJS(_code, _widget, _context)
{
// Replace the javascript pseudo-functions
_code = js_pseudo_funcs(_code,_widget);
// Check whether _code is simply "1" -- if yes replace it accordingly
if (_code === '1')
{
_code = 'widget.getInstanceManager().submit(); return false;';
}
// Check whether some pseudo-variables still reside inside of the code,
// if yes, replace them.
if (_code.indexOf("$") >= 0 || _code.indexOf("@") >= 0)
{
// Get the content array manager for the widget
var mgr = _widget.getArrayMgr("content");
if (mgr)
{
_code = mgr.expandName(_code);
}
}
// Context is the context in which the function will run. Set context to
// null as a default, so that it's possible to find bugs where "this" is
// accessed in the code, but not properly set.
var context = _context ? _context : null;
// Check whether the given widget implements the "et2_IDOMNode"
// interface
if (!context && _widget.implements(et2_IDOMNode))
{
context = _widget.getDOMNode();
}
// Check to see if it's referring to an existing function with no arguments specified.
// If so, bind context & use it directly
if(_code.indexOf("(") === -1)
{
var parts = _code.split(".");
var existing_func = parts.pop();
var parent = _widget.egw().window;
for (var i = 0; i < parts.length; ++i) {
if (typeof parent[parts[i]] !== "undefined") {
parent = parent[parts[i]];
}
// Nope
else {
break;
}
}
if (typeof parent[existing_func] === "function") {
return parent[existing_func];
}
}
// Generate the function itself, if it fails, log the error message and
// return a function which always returns false
try {
// Code is app.appname.function, add the arguments so it can be executed
if (typeof _code == 'string' && _code.indexOf('app') == 0 && _code.split('.').length >= 3 && _code.indexOf('(') == -1)
{
const parts = _code.split('.');
const app = _widget.getInstanceManager().app_obj;
// check if we need to load the object
if (parts.length === 3 && typeof app[parts[1]] === 'undefined')
{
return function (ev, widget)
{
return egw.applyFunc(_code, [ev, widget]);
}
}
// Code is app.appname.function, add the arguments so it can be executed
_code += '(ev,widget)';
}
// use app object from etemplate2, which might be private and not just window.app
_code = _code.replace(/(window\.)?app\./, 'widget.getInstanceManager().app_obj.');
var func = new Function('ev', 'widget', _code);
} catch(e) {
_widget.egw().debug('error', 'Error while compiling JS code ', _code);
return (function() {return false;});
}
// Execute the code and return its results, pass the egw instance and
// the widget
return function(ev) {
// Dump the executed code for debugging
egw.debug('log', 'Executing legacy JS code: ', _code);
if(arguments && arguments.length > 2)
{
egw.debug('warn', 'Legacy JS code only supports 2 arguments (event and widget)', _code, arguments);
}
// Return the result of the called function
return func.call(context, ev, _widget);
};
}
/**
* Resolve javascript pseudo functions in onclick or onchange:
* - egw::link('$l','$p') calls egw.link($l,$p)
* - form::name('name') returns expanded name/id taking into account the name at that point of the template hierarchy
* - egw::lang('Message ...') translate the message, calls egw.lang()
* - confirm('message') translates 'message' and adds a '?' if not present
* - window.open() replaces it with egw_openWindowCentered2()
* - xajax_doXMLHTTP('etemplate. replace ajax calls in widgets with special handler not requiring etemplate run rights
*
* @param {string} _val onclick, onchange, ... action
* @param {et2_widget} widget
* @ToDo replace xajax_doXMLHTTP with egw.json()
* @ToDo replace (common) cases of confirm with new dialog, idea: calling function supplys function to call after confirm
* @ToDo template::styles(name) inserts the styles of a named template
* @return string
*/
function js_pseudo_funcs(_val,widget)
{
if (_val.indexOf('egw::link(') != -1)
{
_val = _val.replace(/egw::link\(/g,'egw.link(');
}
if (_val.indexOf('form::name(') != -1)
{
// et2_form_name doesn't care about ][, just [
var _cname = widget.getPath() ? widget.getPath().join("[") : false;
_val = _val.replace(/form::name\(/g, "'"+widget.getRoot()._inst.uniqueId+"_'+"+(_cname ? "et2_form_name('"+_cname+"'," : '('));
}
if (_val.indexOf('egw::lang(') != -1)
{
_val = _val.replace(/egw::lang\(/g,'egw.lang(');
}
// ToDo: inserts the styles of a named template
/*if (preg_match('/template::styles\(["\']{1}(.*)["\']{1}\)/U',$on,$matches))
{
$tpl = $matches[1] == $this->name ? $this : new etemplate($matches[1]);
$on = str_replace($matches[0],"'<style>".str_replace(array("\n","\r"),'',$tpl->style)."</style>'",$on);
}*/
// translate messages in confirm()
if (_val.indexOf('confirm(') != -1)
{
_val = _val.replace(/confirm\((['"])(.*?)(\?)?['"]\)/,"confirm(egw.lang($1$2$1)+'$3')"); // add ? if not there, saves extra phrase
}
// replace window.open() with EGw's egw_openWindowCentered2()
if (_val.indexOf('window.open(') != -1)
{
_val = _val.replace(/window.open\('(.*)','(.*)','dependent=yes,width=([^,]*),height=([^,]*),scrollbars=yes,status=(.*)'\)/,
"egw_openWindowCentered2('$1', '$2', $3, $4, '$5')");
}
// replace xajax calls to code in widgets, with the "etemplate" handler,
// this allows to call widgets with the current app, otherwise everyone would need etemplate run rights
if (_val.indexOf("xajax_doXMLHTTP('etemplate.") != -1)
{
_val = _val.replace(/^xajax_doXMLHTTP\('etemplate\.([a-z]+_widget\.[a-zA-Z0-9_]+)\'/,
"xajax_doXMLHTTP('"+egw.getAppName()+".$1.etemplate'");
}
if (_val.indexOf('this.form.submit()') != -1)
{
_val = _val.replace('this.form.submit()','widget.getInstanceManager().submit()');
}
return _val;
}

View File

@ -4,469 +4,350 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
et2_core_common;
et2_core_common;
*/
(function()
{
"use strict";
var STATE_DEFAULT = 0;
var STATE_ESCAPED = 1;
var STATE_CURLY_BRACE_OPEN = 2;
var STATE_EXPECT_CURLY_BRACE_CLOSE = 3;
var STATE_EXPECT_RECT_BRACE_CLOSE = 4;
var STATE_EXPR_BEGIN = 5;
var STATE_EXPR_END = 6;
function _throwParserErr(_p, _err)
{
throw("Syntax error while parsing '" + _p.expr + "' at " +
_p.pos + ", " + _err);
}
function _php_parseDoubleQuoteString(_p, _tree)
{
// Extract all PHP variables from the string
var state = STATE_DEFAULT;
var str = "";
while (_p.pos < _p.expr.length)
{
// Read the current char and then increment the parser position by
// one
var c = _p.expr.charAt(_p.pos++);
switch (state)
{
case STATE_DEFAULT:
case STATE_CURLY_BRACE_OPEN:
switch (c)
{
case '\\':
state = STATE_ESCAPED;
break;
case '$':
// check for '$$' as used in placeholder syntax, it is NOT expanded and returned as is
if (_p.expr.charAt(_p.pos) == "$" && state == STATE_DEFAULT)
{
_p.pos++;
str += '$$';
break;
}
// check for '$' as last char, as in PHP "test$" === 'test$', $ as last char is NOT expanded
if (_p.pos == _p.expr.length)
{
str += '$';
break;
}
// check for regular expression "/ $/"
if (_p.expr.charAt(_p.pos) == '/' && _p.expr.charAt(0) == '/')
{
str += '$';
break;
}
if (str)
{
_tree.push(str); str = "";
}
// Support for the ${[expr] sytax
if (_p.expr.charAt(_p.pos) == "{" && state != STATE_CURLY_BRACE_OPEN)
{
state = STATE_CURLY_BRACE_OPEN;
_p.pos++;
}
if (state == STATE_CURLY_BRACE_OPEN)
{
_tree.push(_php_parseVariable(_p));
state = STATE_EXPECT_CURLY_BRACE_CLOSE;
}
else
{
_tree.push(_php_parseVariable(_p));
}
break;
case '{':
state = STATE_CURLY_BRACE_OPEN;
break;
default:
if (state == STATE_CURLY_BRACE_OPEN)
{
str += '{';
state = STATE_DEFAULT;
}
str += c;
}
break;
case STATE_ESCAPED:
str += c;
break;
case STATE_EXPECT_CURLY_BRACE_CLOSE:
// When returning from the variableEx parser,
// the current char must be a "}"
if (c != "}")
{
_throwParserErr(_p, "expected '}', but got " + c);
}
state = STATE_DEFAULT;
break;
}
}
// Throw an error when reaching the end of the string but expecting
// "}"
if (state == STATE_EXPECT_CURLY_BRACE_CLOSE)
{
_throwParserErr(_p, "unexpected end of string, expected '}'");
}
// Push the last part of the string onto the syntax tree
if (state == STATE_CURLY_BRACE_OPEN)
{
str += "{";
}
if (str)
{
_tree.push(str);
}
}
// Regular expression which matches on PHP variable identifiers (without the $)
var PHP_VAR_PREG = /^([A-Za-z0-9_]+)/;
function _php_parseVariableName(_p)
{
// Extract the variable name form the expression
var vname = PHP_VAR_PREG.exec(_p.expr.substr(_p.pos));
if (vname)
{
// Increment the parser position by the length of vname
_p.pos += vname[0].length;
return {"variable": vname[0], "accessExpressions": []};
}
_throwParserErr(_p, "expected variable identifier.");
}
function _php_parseVariable(_p)
{
// Parse the first variable
var variable = _php_parseVariableName(_p);
// Parse all following variable access identifiers
var state = STATE_DEFAULT;
while (_p.pos < _p.expr.length)
{
var c = _p.expr.charAt(_p.pos++);
switch (state)
{
case STATE_DEFAULT:
switch (c)
{
case "[":
// Parse the expression inside the rect brace
variable.accessExpressions.push(_php_parseExpression(_p));
state = STATE_EXPECT_RECT_BRACE_CLOSE;
break;
default:
_p.pos--;
return variable;
}
break;
case STATE_EXPECT_RECT_BRACE_CLOSE:
if (c != "]")
{
_throwParserErr(_p, " expected ']', but got " + c);
}
state = STATE_DEFAULT;
break;
}
}
return variable;
}
/**
* Reads a string delimited by the char _delim or the regExp _delim from the
* current parser context and returns it.
*
* @param {object} _p parser contect
* @param {string} _delim delimiter
* @return {string} string read (or throws an exception)
*/
function _php_readString(_p, _delim)
{
var state = STATE_DEFAULT;
var str = "";
while (_p.pos < _p.expr.length)
{
var c = _p.expr.charAt(_p.pos++);
switch (state)
{
case STATE_DEFAULT:
if (c == "\\")
{
state = STATE_ESCAPED;
}
else if (c === _delim || (typeof _delim != "string" && _delim.test(c)))
{
return str;
}
else
{
str += c;
}
break;
case STATE_ESCAPED:
str += c;
state = STATE_DEFAULT;
break;
}
}
_throwParserErr(_p, "unexpected end of string while parsing string!");
}
function _php_parseExpression(_p)
{
var state = STATE_EXPR_BEGIN;
var result = null;
while (_p.pos < _p.expr.length)
{
var c = _p.expr.charAt(_p.pos++);
switch (state)
{
case STATE_EXPR_BEGIN:
switch(c)
{
// Skip whitespace
case " ": case "\n": case "\r": case "\t":
break;
case "\"":
result = [];
var p = _php_parser(_php_readString(_p, "\""));
_php_parseDoubleQuoteString(p, result);
state = STATE_EXPR_END;
break;
case "\'":
var result = _php_readString(_p, "'");
state = STATE_EXPR_END;
break;
case "$":
var result = _php_parseVariable(_p);
state = STATE_EXPR_END;
break;
default:
_p.pos--;
var result = _php_readString(_p, /[^A-Za-z0-9_#]/);
if (!result)
{
_throwParserErr(_p, "unexpected char " + c);
}
_p.pos--;
state = STATE_EXPR_END;
break;
}
break;
case STATE_EXPR_END:
switch(c)
{
// Skip whitespace
case " ": case "\n": case "\r": case "\t":
break;
default:
_p.pos--;
return result;
}
}
}
_throwParserErr(_p, "unexpected end of string while parsing access expressions!");
}
function _php_parser(_expr)
{
return {
expr: _expr,
pos: 0
};
}
function _throwCompilerErr(_err)
{
throw("PHP to JS compiler error, " + _err);
}
function _php_compileVariable(_vars, _variable)
{
if (_vars.indexOf(_variable.variable) >= 0)
{
// Attach a "_" to the variable name as PHP variable names may start
// with numeric values
var result = "_" + _variable.variable;
// Create the access functions
for (var i = 0; i < _variable.accessExpressions.length; i++)
{
result += "[" +
_php_compileString(_vars, _variable.accessExpressions[i]) +
"]";
}
return '(typeof _'+_variable.variable+' != "undefined" && typeof '+result + '!="undefined" && ' + result + ' != null ? ' + result + ':"")';
}
_throwCompilerErr("Variable $" + _variable.variable + " is not defined.");
}
function _php_compileString(_vars, _string)
{
if (!(_string instanceof Array))
{
_string = [_string];
}
var parts = [];
var hasString = false;
for (var i = 0; i < _string.length; i++)
{
var part = _string[i];
if (typeof part == "string")
{
hasString = true;
// Escape all "'" and "\" chars and add the string to the parts array
parts.push("'" + part.replace(/\\/g, "\\\\").replace(/'/g, "\\'") + "'");
}
else
{
parts.push(_php_compileVariable(_vars, part));
}
}
if (!hasString) // Force the result to be of the type string
{
parts.push('""');
}
return parts.join(" + ");
}
function _php_compileJSCode(_vars, _tree)
{
// Each tree starts with a "string"
return "return " + _php_compileString(_vars, _tree) + ";";
}
/**
* Function which compiles the given PHP string to a JS function which can be
* easily executed.
*
* @param _expr is the PHP string expression
* @param _vars is an array with variable names (without the PHP $).
* The parameters have to be passed to the resulting JS function in the same
* order.
*/
this.et2_compilePHPExpression = function(_expr, _vars)
{
if (typeof _vars == "undefined")
{
_vars = [];
}
try {
// Initialize the parser object and create the syntax tree for the given
// expression
var parser = _php_parser(_expr);
var syntaxTree = [];
// Parse the given expression as if it was a double quoted string
_php_parseDoubleQuoteString(parser, syntaxTree);
// Transform the generated syntaxTree into a JS string
var js = _php_compileJSCode(_vars, syntaxTree);
// Log the successfull compiling
egw.debug("log", "Compiled PHP " + _expr + " --> " + js);
}
catch(e) {
// if expression does NOT compile use it literally and log a warning, but not stop execution
egw.debug("warn", "Error compiling PHP "+_expr+" --> using it literally ("+
(typeof e == 'string' ? e : e.message)+")!");
return function(){ return _expr; };
}
// Prepate the attributes for the function constuctor
var attrs = [];
for (var i = 0; i < _vars.length; i++)
{
attrs.push("_" + _vars[i]);
}
attrs.push(js);
// Create the function and return it
return (Function.apply(Function, attrs));
};
}).call(window);
import { egw } from "../jsapi/egw_global";
/**
* Function which compiles the given PHP string to a JS function which can be
* easily executed.
*
* @param _expr is the PHP string expression
* @param _vars is an array with variable names (without the PHP $).
* The parameters have to be passed to the resulting JS function in the same
* order.
*/
export function et2_compilePHPExpression(_expr, _vars) {
if (typeof _vars == "undefined") {
_vars = [];
}
try {
// Initialize the parser object and create the syntax tree for the given
// expression
var parser = _php_parser(_expr);
var syntaxTree = [];
// Parse the given expression as if it was a double quoted string
_php_parseDoubleQuoteString(parser, syntaxTree);
// Transform the generated syntaxTree into a JS string
var js = _php_compileJSCode(_vars, syntaxTree);
// Log the successfull compiling
egw.debug("log", "Compiled PHP " + _expr + " --> " + js);
}
catch (e) {
// if expression does NOT compile use it literally and log a warning, but not stop execution
egw.debug("warn", "Error compiling PHP " + _expr + " --> using it literally (" +
(typeof e == 'string' ? e : e.message) + ")!");
return function () { return _expr; };
}
// Prepate the attributes for the function constuctor
var attrs = [];
for (var i = 0; i < _vars.length; i++) {
attrs.push("_" + _vars[i]);
}
attrs.push(js);
// Create the function and return it
return (Function.apply(Function, attrs));
}
const STATE_DEFAULT = 0;
const STATE_ESCAPED = 1;
const STATE_CURLY_BRACE_OPEN = 2;
const STATE_EXPECT_CURLY_BRACE_CLOSE = 3;
const STATE_EXPECT_RECT_BRACE_CLOSE = 4;
const STATE_EXPR_BEGIN = 5;
const STATE_EXPR_END = 6;
function _throwParserErr(_p, _err) {
throw ("Syntax error while parsing '" + _p.expr + "' at " +
_p.pos + ", " + _err);
}
function _php_parseDoubleQuoteString(_p, _tree) {
// Extract all PHP variables from the string
var state = STATE_DEFAULT;
var str = "";
while (_p.pos < _p.expr.length) {
// Read the current char and then increment the parser position by
// one
var c = _p.expr.charAt(_p.pos++);
switch (state) {
case STATE_DEFAULT:
case STATE_CURLY_BRACE_OPEN:
switch (c) {
case '\\':
state = STATE_ESCAPED;
break;
case '$':
// check for '$$' as used in placeholder syntax, it is NOT expanded and returned as is
if (_p.expr.charAt(_p.pos) == "$" && state == STATE_DEFAULT) {
_p.pos++;
str += '$$';
break;
}
// check for '$' as last char, as in PHP "test$" === 'test$', $ as last char is NOT expanded
if (_p.pos == _p.expr.length) {
str += '$';
break;
}
// check for regular expression "/ $/"
if (_p.expr.charAt(_p.pos) == '/' && _p.expr.charAt(0) == '/') {
str += '$';
break;
}
if (str) {
_tree.push(str);
str = "";
}
// Support for the ${[expr] sytax
if (_p.expr.charAt(_p.pos) == "{" && state != STATE_CURLY_BRACE_OPEN) {
state = STATE_CURLY_BRACE_OPEN;
_p.pos++;
}
if (state == STATE_CURLY_BRACE_OPEN) {
_tree.push(_php_parseVariable(_p));
state = STATE_EXPECT_CURLY_BRACE_CLOSE;
}
else {
_tree.push(_php_parseVariable(_p));
}
break;
case '{':
state = STATE_CURLY_BRACE_OPEN;
break;
default:
if (state == STATE_CURLY_BRACE_OPEN) {
str += '{';
state = STATE_DEFAULT;
}
str += c;
}
break;
case STATE_ESCAPED:
str += c;
break;
case STATE_EXPECT_CURLY_BRACE_CLOSE:
// When returning from the variableEx parser,
// the current char must be a "}"
if (c != "}") {
_throwParserErr(_p, "expected '}', but got " + c);
}
state = STATE_DEFAULT;
break;
}
}
// Throw an error when reaching the end of the string but expecting
// "}"
if (state == STATE_EXPECT_CURLY_BRACE_CLOSE) {
_throwParserErr(_p, "unexpected end of string, expected '}'");
}
// Push the last part of the string onto the syntax tree
if (state == STATE_CURLY_BRACE_OPEN) {
str += "{";
}
if (str) {
_tree.push(str);
}
}
// Regular expression which matches on PHP variable identifiers (without the $)
var PHP_VAR_PREG = /^([A-Za-z0-9_]+)/;
function _php_parseVariableName(_p) {
// Extract the variable name form the expression
var vname = PHP_VAR_PREG.exec(_p.expr.substr(_p.pos));
if (vname) {
// Increment the parser position by the length of vname
_p.pos += vname[0].length;
return { "variable": vname[0], "accessExpressions": [] };
}
_throwParserErr(_p, "expected variable identifier.");
}
function _php_parseVariable(_p) {
// Parse the first variable
var variable = _php_parseVariableName(_p);
// Parse all following variable access identifiers
var state = STATE_DEFAULT;
while (_p.pos < _p.expr.length) {
var c = _p.expr.charAt(_p.pos++);
switch (state) {
case STATE_DEFAULT:
switch (c) {
case "[":
// Parse the expression inside the rect brace
variable.accessExpressions.push(_php_parseExpression(_p));
state = STATE_EXPECT_RECT_BRACE_CLOSE;
break;
default:
_p.pos--;
return variable;
}
break;
case STATE_EXPECT_RECT_BRACE_CLOSE:
if (c != "]") {
_throwParserErr(_p, " expected ']', but got " + c);
}
state = STATE_DEFAULT;
break;
}
}
return variable;
}
/**
* Reads a string delimited by the char _delim or the regExp _delim from the
* current parser context and returns it.
*
* @param {object} _p parser contect
* @param {string} _delim delimiter
* @return {string} string read (or throws an exception)
*/
function _php_readString(_p, _delim) {
var state = STATE_DEFAULT;
var str = "";
while (_p.pos < _p.expr.length) {
var c = _p.expr.charAt(_p.pos++);
switch (state) {
case STATE_DEFAULT:
if (c == "\\") {
state = STATE_ESCAPED;
}
else if (c === _delim || (typeof _delim != "string" && _delim.test(c))) {
return str;
}
else {
str += c;
}
break;
case STATE_ESCAPED:
str += c;
state = STATE_DEFAULT;
break;
}
}
_throwParserErr(_p, "unexpected end of string while parsing string!");
}
function _php_parseExpression(_p) {
var state = STATE_EXPR_BEGIN;
var result = null;
while (_p.pos < _p.expr.length) {
var c = _p.expr.charAt(_p.pos++);
switch (state) {
case STATE_EXPR_BEGIN:
switch (c) {
// Skip whitespace
case " ":
case "\n":
case "\r":
case "\t":
break;
case "\"":
result = [];
var p = _php_parser(_php_readString(_p, "\""));
_php_parseDoubleQuoteString(p, result);
state = STATE_EXPR_END;
break;
case "\'":
result = _php_readString(_p, "'");
state = STATE_EXPR_END;
break;
case "$":
result = _php_parseVariable(_p);
state = STATE_EXPR_END;
break;
default:
_p.pos--;
result = _php_readString(_p, /[^A-Za-z0-9_#]/);
if (!result) {
_throwParserErr(_p, "unexpected char " + c);
}
_p.pos--;
state = STATE_EXPR_END;
break;
}
break;
case STATE_EXPR_END:
switch (c) {
// Skip whitespace
case " ":
case "\n":
case "\r":
case "\t":
break;
default:
_p.pos--;
return result;
}
}
}
_throwParserErr(_p, "unexpected end of string while parsing access expressions!");
}
function _php_parser(_expr) {
return {
expr: _expr,
pos: 0
};
}
function _throwCompilerErr(_err) {
throw ("PHP to JS compiler error, " + _err);
}
function _php_compileVariable(_vars, _variable) {
if (_vars.indexOf(_variable.variable) >= 0) {
// Attach a "_" to the variable name as PHP variable names may start
// with numeric values
var result = "_" + _variable.variable;
// Create the access functions
for (var i = 0; i < _variable.accessExpressions.length; i++) {
result += "[" +
_php_compileString(_vars, _variable.accessExpressions[i]) +
"]";
}
return '(typeof _' + _variable.variable + ' != "undefined" && typeof ' + result + '!="undefined" && ' + result + ' != null ? ' + result + ':"")';
}
_throwCompilerErr("Variable $" + _variable.variable + " is not defined.");
}
function _php_compileString(_vars, _string) {
if (!(_string instanceof Array)) {
_string = [_string];
}
var parts = [];
var hasString = false;
for (var i = 0; i < _string.length; i++) {
var part = _string[i];
if (typeof part == "string") {
hasString = true;
// Escape all "'" and "\" chars and add the string to the parts array
parts.push("'" + part.replace(/\\/g, "\\\\").replace(/'/g, "\\'") + "'");
}
else {
parts.push(_php_compileVariable(_vars, part));
}
}
if (!hasString) // Force the result to be of the type string
{
parts.push('""');
}
return parts.join(" + ");
}
function _php_compileJSCode(_vars, _tree) {
// Each tree starts with a "string"
return "return " + _php_compileString(_vars, _tree) + ";";
}
// Include this code in in order to test the above code
/*(function () {
var row = 10;
var row_cont = {"title": "Hello World!"};
var cont = {10: row_cont};
var row = 10;
var row_cont = {"title": "Hello World!"};
var cont = {10: row_cont};
function test(_php, _res)
{
console.log(
et2_compilePHPExpression(_php, ["row", "row_cont", "cont"])
(row, row_cont, cont) === _res);
}
function test(_php, _res)
{
console.log(
et2_compilePHPExpression(_php, ["row", "row_cont", "cont"])
(row, row_cont, cont) === _res);
}
test("${row}[title]", "10[title]");
test("{$row_cont[title]}", "Hello World!");
test('{$cont["$row"][\'title\']}', "Hello World!");
test("$row_cont[${row}[title]]");
test("\\\\", "\\");
test("", "");
test("${row}[title]", "10[title]");
test("{$row_cont[title]}", "Hello World!");
test('{$cont["$row"][\'title\']}', "Hello World!");
test("$row_cont[${row}[title]]");
test("\\\\", "\\");
test("", "");
})();*/
//# sourceMappingURL=et2_core_phpExpressionCompiler.js.map

View File

@ -0,0 +1,467 @@
/**
* EGroupware eTemplate2 - A simple PHP expression parser written in JS
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
et2_core_common;
*/
import {egw} from "../jsapi/egw_global";
/**
* Function which compiles the given PHP string to a JS function which can be
* easily executed.
*
* @param _expr is the PHP string expression
* @param _vars is an array with variable names (without the PHP $).
* The parameters have to be passed to the resulting JS function in the same
* order.
*/
export function et2_compilePHPExpression(_expr, _vars)
{
if (typeof _vars == "undefined")
{
_vars = [];
}
try {
// Initialize the parser object and create the syntax tree for the given
// expression
var parser = _php_parser(_expr);
var syntaxTree = [];
// Parse the given expression as if it was a double quoted string
_php_parseDoubleQuoteString(parser, syntaxTree);
// Transform the generated syntaxTree into a JS string
var js = _php_compileJSCode(_vars, syntaxTree);
// Log the successfull compiling
egw.debug("log", "Compiled PHP " + _expr + " --> " + js);
}
catch(e) {
// if expression does NOT compile use it literally and log a warning, but not stop execution
egw.debug("warn", "Error compiling PHP "+_expr+" --> using it literally ("+
(typeof e == 'string' ? e : e.message)+")!");
return function(){ return _expr; };
}
// Prepate the attributes for the function constuctor
var attrs = [];
for (var i = 0; i < _vars.length; i++)
{
attrs.push("_" + _vars[i]);
}
attrs.push(js);
// Create the function and return it
return (Function.apply(Function, attrs));
}
const STATE_DEFAULT = 0;
const STATE_ESCAPED = 1;
const STATE_CURLY_BRACE_OPEN = 2;
const STATE_EXPECT_CURLY_BRACE_CLOSE = 3;
const STATE_EXPECT_RECT_BRACE_CLOSE = 4;
const STATE_EXPR_BEGIN = 5;
const STATE_EXPR_END = 6;
function _throwParserErr(_p, _err)
{
throw("Syntax error while parsing '" + _p.expr + "' at " +
_p.pos + ", " + _err);
}
function _php_parseDoubleQuoteString(_p, _tree)
{
// Extract all PHP variables from the string
var state = STATE_DEFAULT;
var str = "";
while (_p.pos < _p.expr.length)
{
// Read the current char and then increment the parser position by
// one
var c = _p.expr.charAt(_p.pos++);
switch (state)
{
case STATE_DEFAULT:
case STATE_CURLY_BRACE_OPEN:
switch (c)
{
case '\\':
state = STATE_ESCAPED;
break;
case '$':
// check for '$$' as used in placeholder syntax, it is NOT expanded and returned as is
if (_p.expr.charAt(_p.pos) == "$" && state == STATE_DEFAULT)
{
_p.pos++;
str += '$$';
break;
}
// check for '$' as last char, as in PHP "test$" === 'test$', $ as last char is NOT expanded
if (_p.pos == _p.expr.length)
{
str += '$';
break;
}
// check for regular expression "/ $/"
if (_p.expr.charAt(_p.pos) == '/' && _p.expr.charAt(0) == '/')
{
str += '$';
break;
}
if (str)
{
_tree.push(str); str = "";
}
// Support for the ${[expr] sytax
if (_p.expr.charAt(_p.pos) == "{" && state != STATE_CURLY_BRACE_OPEN)
{
state = STATE_CURLY_BRACE_OPEN;
_p.pos++;
}
if (state == STATE_CURLY_BRACE_OPEN)
{
_tree.push(_php_parseVariable(_p));
state = STATE_EXPECT_CURLY_BRACE_CLOSE;
}
else
{
_tree.push(_php_parseVariable(_p));
}
break;
case '{':
state = STATE_CURLY_BRACE_OPEN;
break;
default:
if (state == STATE_CURLY_BRACE_OPEN)
{
str += '{';
state = STATE_DEFAULT;
}
str += c;
}
break;
case STATE_ESCAPED:
str += c;
break;
case STATE_EXPECT_CURLY_BRACE_CLOSE:
// When returning from the variableEx parser,
// the current char must be a "}"
if (c != "}")
{
_throwParserErr(_p, "expected '}', but got " + c);
}
state = STATE_DEFAULT;
break;
}
}
// Throw an error when reaching the end of the string but expecting
// "}"
if (state == STATE_EXPECT_CURLY_BRACE_CLOSE)
{
_throwParserErr(_p, "unexpected end of string, expected '}'");
}
// Push the last part of the string onto the syntax tree
if (state == STATE_CURLY_BRACE_OPEN)
{
str += "{";
}
if (str)
{
_tree.push(str);
}
}
// Regular expression which matches on PHP variable identifiers (without the $)
var PHP_VAR_PREG = /^([A-Za-z0-9_]+)/;
function _php_parseVariableName(_p)
{
// Extract the variable name form the expression
var vname = PHP_VAR_PREG.exec(_p.expr.substr(_p.pos));
if (vname)
{
// Increment the parser position by the length of vname
_p.pos += vname[0].length;
return {"variable": vname[0], "accessExpressions": []};
}
_throwParserErr(_p, "expected variable identifier.");
}
function _php_parseVariable(_p)
{
// Parse the first variable
var variable = _php_parseVariableName(_p);
// Parse all following variable access identifiers
var state = STATE_DEFAULT;
while (_p.pos < _p.expr.length)
{
var c = _p.expr.charAt(_p.pos++);
switch (state)
{
case STATE_DEFAULT:
switch (c)
{
case "[":
// Parse the expression inside the rect brace
variable.accessExpressions.push(_php_parseExpression(_p));
state = STATE_EXPECT_RECT_BRACE_CLOSE;
break;
default:
_p.pos--;
return variable;
}
break;
case STATE_EXPECT_RECT_BRACE_CLOSE:
if (c != "]")
{
_throwParserErr(_p, " expected ']', but got " + c);
}
state = STATE_DEFAULT;
break;
}
}
return variable;
}
/**
* Reads a string delimited by the char _delim or the regExp _delim from the
* current parser context and returns it.
*
* @param {object} _p parser contect
* @param {string} _delim delimiter
* @return {string} string read (or throws an exception)
*/
function _php_readString(_p, _delim)
{
var state = STATE_DEFAULT;
var str = "";
while (_p.pos < _p.expr.length)
{
var c = _p.expr.charAt(_p.pos++);
switch (state)
{
case STATE_DEFAULT:
if (c == "\\")
{
state = STATE_ESCAPED;
}
else if (c === _delim || (typeof _delim != "string" && _delim.test(c)))
{
return str;
}
else
{
str += c;
}
break;
case STATE_ESCAPED:
str += c;
state = STATE_DEFAULT;
break;
}
}
_throwParserErr(_p, "unexpected end of string while parsing string!");
}
function _php_parseExpression(_p)
{
var state = STATE_EXPR_BEGIN;
var result : any = null;
while (_p.pos < _p.expr.length)
{
var c = _p.expr.charAt(_p.pos++);
switch (state)
{
case STATE_EXPR_BEGIN:
switch(c)
{
// Skip whitespace
case " ": case "\n": case "\r": case "\t":
break;
case "\"":
result = [];
var p = _php_parser(_php_readString(_p, "\""));
_php_parseDoubleQuoteString(p, result);
state = STATE_EXPR_END;
break;
case "\'":
result = _php_readString(_p, "'");
state = STATE_EXPR_END;
break;
case "$":
result = _php_parseVariable(_p);
state = STATE_EXPR_END;
break;
default:
_p.pos--;
result = _php_readString(_p, /[^A-Za-z0-9_#]/);
if (!result)
{
_throwParserErr(_p, "unexpected char " + c);
}
_p.pos--;
state = STATE_EXPR_END;
break;
}
break;
case STATE_EXPR_END:
switch(c)
{
// Skip whitespace
case " ": case "\n": case "\r": case "\t":
break;
default:
_p.pos--;
return result;
}
}
}
_throwParserErr(_p, "unexpected end of string while parsing access expressions!");
}
function _php_parser(_expr)
{
return {
expr: _expr,
pos: 0
};
}
function _throwCompilerErr(_err)
{
throw("PHP to JS compiler error, " + _err);
}
function _php_compileVariable(_vars, _variable)
{
if (_vars.indexOf(_variable.variable) >= 0)
{
// Attach a "_" to the variable name as PHP variable names may start
// with numeric values
var result = "_" + _variable.variable;
// Create the access functions
for (var i = 0; i < _variable.accessExpressions.length; i++)
{
result += "[" +
_php_compileString(_vars, _variable.accessExpressions[i]) +
"]";
}
return '(typeof _'+_variable.variable+' != "undefined" && typeof '+result + '!="undefined" && ' + result + ' != null ? ' + result + ':"")';
}
_throwCompilerErr("Variable $" + _variable.variable + " is not defined.");
}
function _php_compileString(_vars, _string)
{
if (!(_string instanceof Array))
{
_string = [_string];
}
var parts = [];
var hasString = false;
for (var i = 0; i < _string.length; i++)
{
var part = _string[i];
if (typeof part == "string")
{
hasString = true;
// Escape all "'" and "\" chars and add the string to the parts array
parts.push("'" + part.replace(/\\/g, "\\\\").replace(/'/g, "\\'") + "'");
}
else
{
parts.push(_php_compileVariable(_vars, part));
}
}
if (!hasString) // Force the result to be of the type string
{
parts.push('""');
}
return parts.join(" + ");
}
function _php_compileJSCode(_vars, _tree)
{
// Each tree starts with a "string"
return "return " + _php_compileString(_vars, _tree) + ";";
}
// Include this code in in order to test the above code
/*(function () {
var row = 10;
var row_cont = {"title": "Hello World!"};
var cont = {10: row_cont};
function test(_php, _res)
{
console.log(
et2_compilePHPExpression(_php, ["row", "row_cont", "cont"])
(row, row_cont, cont) === _res);
}
test("${row}[title]", "10[title]");
test("{$row_cont[title]}", "Hello World!");
test('{$cont["$row"][\'title\']}', "Hello World!");
test("$row_cont[${row}[title]]");
test("\\\\", "\\");
test("", "");
})();*/

View File

@ -1,66 +1,46 @@
"use strict";
/**
* EGroupware eTemplate2 - JS widget class with value attribute and auto loading
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_valueWidget = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_baseWidget;
*/
var et2_core_baseWidget_1 = require("./et2_core_baseWidget");
require("./et2_core_common");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
import { et2_baseWidget } from './et2_core_baseWidget';
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_csvSplit, et2_no_init } from "./et2_core_common";
/**
* et2_valueWidget is the base class for et2_inputWidget - valueWidget introduces
* the "value" attribute and automatically loads it from the "content" array
* after loading from XML.
*/
var et2_valueWidget = /** @class */ (function (_super) {
__extends(et2_valueWidget, _super);
export class et2_valueWidget extends et2_baseWidget {
/**
* Constructor
*/
function et2_valueWidget(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_valueWidget._attributes, _child || {})) || this;
_this.label = '';
_this._labelContainer = null;
return _this;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_valueWidget._attributes, _child || {}));
this.label = '';
this._labelContainer = null;
}
/**
*
* @param _attrs
*/
et2_valueWidget.prototype.transformAttributes = function (_attrs) {
_super.prototype.transformAttributes.call(this, _attrs);
transformAttributes(_attrs) {
super.transformAttributes(_attrs);
if (this.id) {
// Set the value for this element
var contentMgr = this.getArrayMgr("content");
if (contentMgr != null) {
var val = contentMgr.getEntry(this.id, false, true);
let val = contentMgr.getEntry(this.id, false, true);
if (val !== null) {
_attrs["value"] = val;
}
@ -70,8 +50,8 @@ var et2_valueWidget = /** @class */ (function (_super) {
_attrs["value"] = this.getArrayMgr("content").data;
}
}
};
et2_valueWidget.prototype.set_label = function (_value) {
}
set_label(_value) {
// Abort if there was no change in the label
if (_value == this.label) {
return;
@ -113,34 +93,32 @@ var et2_valueWidget = /** @class */ (function (_super) {
this.getSurroundings().update();
// Copy the given value
this.label = _value;
};
et2_valueWidget.prototype.get_value = function () {
}
get_value() {
return this.value;
};
}
/**
* Set value of widget
*
* @param {string} _value value to set
*/
et2_valueWidget.prototype.set_value = function (_value) {
set_value(_value) {
this.value = _value;
};
et2_valueWidget._attributes = {
"label": {
"name": "Label",
"default": "",
"type": "string",
"description": "The label is displayed by default in front (for radiobuttons behind) each widget (if not empty). If you want to specify a different position, use a '%s' in the label, which gets replaced by the widget itself. Eg. '%s Name' to have the label Name behind a checkbox. The label can contain variables, as descript for name. If the label starts with a '@' it is replaced by the value of the content-array at this index (with the '@'-removed and after expanding the variables).",
"translate": true
},
"value": {
"name": "Value",
"description": "The value of the widget",
"type": "rawstring",
"default": et2_no_init
}
};
return et2_valueWidget;
}(et2_core_baseWidget_1.et2_baseWidget));
exports.et2_valueWidget = et2_valueWidget;
}
}
et2_valueWidget._attributes = {
"label": {
"name": "Label",
"default": "",
"type": "string",
"description": "The label is displayed by default in front (for radiobuttons behind) each widget (if not empty). If you want to specify a different position, use a '%s' in the label, which gets replaced by the widget itself. Eg. '%s Name' to have the label Name behind a checkbox. The label can contain variables, as descript for name. If the label starts with a '@' it is replaced by the value of the content-array at this index (with the '@'-removed and after expanding the variables).",
"translate": true
},
"value": {
"name": "Value",
"description": "The value of the widget",
"type": "rawstring",
"default": et2_no_init
}
};
//# sourceMappingURL=et2_core_valueWidget.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
@ -16,9 +15,9 @@
*/
import { et2_baseWidget } from './et2_core_baseWidget'
import './et2_core_common';
import {WidgetConfig} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_csvSplit, et2_no_init} from "./et2_core_common";
/**
* et2_valueWidget is the base class for et2_inputWidget - valueWidget introduces

View File

@ -1,4 +1,3 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Widget base class
*
@ -8,21 +7,6 @@
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_widget = exports.et2_createWidget = exports.et2_register_widget = void 0;
/*egw:uses
jsapi.egw;
et2_core_xml;
@ -30,14 +14,18 @@ exports.et2_widget = exports.et2_createWidget = exports.et2_register_widget = vo
et2_core_inheritance;
et2_core_arrayMgr;
*/
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_arrayMgr_1 = require("./et2_core_arrayMgr");
import { ClassWithAttributes } from './et2_core_inheritance';
import { et2_arrayMgr } from "./et2_core_arrayMgr";
import { egw } from "../jsapi/egw_global";
import { et2_cloneObject, et2_csvSplit } from "./et2_core_common";
import { et2_compileLegacyJS } from "./et2_core_legacyJSFunctions";
import { et2_IDOMNode, et2_IInputNode } from "./et2_core_interfaces";
/**
* The registry contains all XML tag names and the corresponding widget
* constructor.
*/
var et2_registry = {};
var et2_attribute_registry = {};
export var et2_registry = {};
export var et2_attribute_registry = {};
/**
* Registers the widget class defined by the given constructor, registers all its class attributes, and associates it
* with the types in the _types array.
@ -45,9 +33,9 @@ var et2_attribute_registry = {};
* @param {function} _constructor constructor
* @param {array} _types widget types _constructor wants to register for
*/
function et2_register_widget(_constructor, _types) {
export function et2_register_widget(_constructor, _types) {
"use strict";
et2_attribute_registry[_constructor.name] = et2_core_inheritance_1.ClassWithAttributes.buildAttributes(_constructor);
et2_attribute_registry[_constructor.name] = ClassWithAttributes.buildAttributes(_constructor);
// Iterate over all given types and register those
for (var i = 0; i < _types.length; i++) {
var type = _types[i].toLowerCase();
@ -60,7 +48,6 @@ function et2_register_widget(_constructor, _types) {
et2_registry[type] = _constructor;
}
}
exports.et2_register_widget = et2_register_widget;
/**
* Creates a widget registered for the given tag-name. If "readonly" is listed
* inside the attributes, et2_createWidget will try to use the "_ro" type of the
@ -74,7 +61,7 @@ exports.et2_register_widget = et2_register_widget;
* is not passed, it will default to null. Then you have to attach the element
* to a parent using the addChild or insertChild method.
*/
function et2_createWidget(_name, _attrs, _parent) {
export function et2_createWidget(_name, _attrs, _parent) {
"use strict";
if (typeof _attrs == "undefined") {
_attrs = {};
@ -92,24 +79,21 @@ function et2_createWidget(_name, _attrs, _parent) {
typeof _attrs["readonly"] == "undefined" ? false : _attrs["readonly"];
// Get the constructor - if the widget is readonly, use the special "_ro"
// constructor if it is available
var constructor = typeof et2_registry[nodeName] == "undefined" ?
et2_placeholder : et2_registry[nodeName];
let constructor = et2_registry[typeof et2_registry[nodeName] == "undefined" ? 'placeholder' : nodeName];
if (readonly && typeof et2_registry[nodeName + "_ro"] != "undefined") {
constructor = et2_registry[nodeName + "_ro"];
}
// Do an sanity check for the attributes
et2_core_inheritance_1.ClassWithAttributes.generateAttributeSet(et2_attribute_registry[constructor.name], _attrs);
ClassWithAttributes.generateAttributeSet(et2_attribute_registry[constructor.name], _attrs);
// Create the new widget and return it
return new constructor(_parent, _attrs);
}
exports.et2_createWidget = et2_createWidget;
/**
* The et2 widget base class.
*
* @augments ClassWithAttributes
*/
var et2_widget = /** @class */ (function (_super) {
__extends(et2_widget, _super);
export class et2_widget extends ClassWithAttributes {
/**
* Widget constructor
*
@ -123,17 +107,17 @@ var et2_widget = /** @class */ (function (_super) {
* @param _attrs is an associative array of attributes.
* @param _child attributes object from the child
*/
function et2_widget(_parent, _attrs, _child) {
var _this = _super.call(this) || this;
_this._children = [];
_this._mgrs = {};
constructor(_parent, _attrs, _child) {
super(); // because we in the top of the widget hierarchy
this._children = [];
this._mgrs = {};
/**
* This is used and therefore it we can not (yet) make it private
*
* @deprecated use this.getInstanceMgr()
*/
_this._inst = null;
_this.attributes = et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_widget._attributes, _child || {});
this._inst = null;
this.attributes = ClassWithAttributes.extendAttributes(et2_widget._attributes, _child || {});
// Check whether all attributes are available
if (typeof _parent == "undefined") {
_parent = null;
@ -145,33 +129,32 @@ var et2_widget = /** @class */ (function (_super) {
jQuery.extend(_attrs, _attrs.attributes);
}
// Initialize all important parameters
_this._mgrs = {};
_this._inst = null;
_this._children = [];
_this._type = _attrs["type"];
_this.id = _attrs["id"];
this._mgrs = {};
this._inst = null;
this._children = [];
this._type = _attrs["type"];
this.id = _attrs["id"];
// Add this widget to the given parent widget
if (_parent != null) {
_parent.addChild(_this);
_parent.addChild(this);
}
// The supported widget classes array defines a whitelist for all widget
// classes or interfaces child widgets have to support.
_this.supportedWidgetClasses = [et2_widget];
this.supportedWidgetClasses = [et2_widget];
if (_attrs["id"]) {
// Create a namespace for this object
if (_this._createNamespace()) {
_this.checkCreateNamespace(_attrs);
if (this._createNamespace()) {
this.checkCreateNamespace(_attrs);
}
}
if (_this.id) {
if (this.id) {
//this.id = this.id.replace(/\[/g,'&#x5B;').replace(/]/g,'&#x5D;');
}
// Add all attributes hidden in the content arrays to the attributes
// parameter
_this.transformAttributes(_attrs);
this.transformAttributes(_attrs);
// Create a local copy of the options object
_this.options = et2_cloneObject(_attrs);
return _this;
this.options = et2_cloneObject(_attrs);
}
/**
* The destroy function destroys all children of the widget, removes itself
@ -181,7 +164,7 @@ var et2_widget = /** @class */ (function (_super) {
* unbind ANY event this widget created and to remove all DOM-Nodes it
* created.
*/
et2_widget.prototype.destroy = function () {
destroy() {
// Call the destructor of all children
for (var i = this._children.length - 1; i >= 0; i--) {
this._children[i].destroy();
@ -196,13 +179,13 @@ var et2_widget = /** @class */ (function (_super) {
this._mgrs[key].destroy();
}
}
};
et2_widget.prototype.getType = function () {
}
getType() {
return this._type;
};
et2_widget.prototype.setType = function (_type) {
}
setType(_type) {
this._type = _type;
};
}
/**
* Creates a copy of this widget. The parameters given are passed to the
* constructor of the copied object. If the parameters are omitted, _parent
@ -210,7 +193,7 @@ var et2_widget = /** @class */ (function (_super) {
*
* @param {et2_widget} _parent parent to set for clone, default null
*/
et2_widget.prototype.clone = function (_parent) {
clone(_parent) {
// Default _parent to null
if (typeof _parent == "undefined") {
_parent = null;
@ -220,8 +203,8 @@ var et2_widget = /** @class */ (function (_super) {
// Assign this element to the copy
copy.assign(this);
return copy;
};
et2_widget.prototype.assign = function (_obj) {
}
assign(_obj) {
if (typeof _obj._children == "undefined") {
this.egw().debug("log", "Foo!");
}
@ -231,39 +214,39 @@ var et2_widget = /** @class */ (function (_super) {
}
// Copy a reference to the content array manager
this.setArrayMgrs(_obj.mgrs);
};
}
/**
* Returns the parent widget of this widget
*/
et2_widget.prototype.getParent = function () {
getParent() {
return this._parent;
};
}
/**
* Returns the list of children of this widget.
*/
et2_widget.prototype.getChildren = function () {
getChildren() {
return this._children;
};
}
/**
* Returns the base widget
*/
et2_widget.prototype.getRoot = function () {
getRoot() {
if (this._parent != null) {
return this._parent.getRoot();
}
else {
return this;
}
};
}
/**
* Inserts an child at the end of the list.
*
* @param _node is the node which should be added. It has to be an instance
* of et2_widget
*/
et2_widget.prototype.addChild = function (_node) {
addChild(_node) {
this.insertChild(_node, this._children.length);
};
}
/**
* Inserts a child at the given index.
*
@ -271,7 +254,7 @@ var et2_widget = /** @class */ (function (_super) {
* of et2_widget
* @param _idx is the position at which the element should be added.
*/
et2_widget.prototype.insertChild = function (_node, _idx) {
insertChild(_node, _idx) {
// Check whether the node is one of the supported widget classes.
if (this.isOfSupportedWidgetClass(_node)) {
// Remove the node from its original parent
@ -285,13 +268,13 @@ var et2_widget = /** @class */ (function (_super) {
this.egw().debug("error", "Widget " + _node._type + " is not supported by this widget class", this);
// throw("Widget is not supported by this widget class!");
}
};
}
/**
* Removes the child but does not destroy it.
*
* @param {et2_widget} _node child to remove
*/
et2_widget.prototype.removeChild = function (_node) {
removeChild(_node) {
// Retrieve the child from the child list
var idx = this._children.indexOf(_node);
if (idx >= 0) {
@ -299,13 +282,13 @@ var et2_widget = /** @class */ (function (_super) {
_node._parent = null;
this._children.splice(idx, 1);
}
};
}
/**
* Searches an element by id in the tree, descending into the child levels.
*
* @param _id is the id you're searching for
*/
et2_widget.prototype.getWidgetById = function (_id) {
getWidgetById(_id) {
if (this.id == _id) {
return this;
}
@ -318,7 +301,7 @@ var et2_widget = /** @class */ (function (_super) {
}
}
if (this.id && _id.indexOf('[') > -1 && this._children.length) {
var ids = (new et2_core_arrayMgr_1.et2_arrayMgr()).explodeKey(_id);
var ids = (new et2_arrayMgr()).explodeKey(_id);
var widget = this;
for (var i = 0; i < ids.length && widget !== null; i++) {
widget = widget.getWidgetById(ids[i]);
@ -326,7 +309,7 @@ var et2_widget = /** @class */ (function (_super) {
return widget;
}
return null;
};
}
/**
* Function which allows iterating over the complete widget tree.
*
@ -335,7 +318,7 @@ var et2_widget = /** @class */ (function (_super) {
* @param _type is an optional parameter which specifies a class/interface
* the elements have to be instanceOf.
*/
et2_widget.prototype.iterateOver = function (_callback, _context, _type) {
iterateOver(_callback, _context, _type) {
if (typeof _type == "undefined") {
_type = et2_widget;
}
@ -345,7 +328,7 @@ var et2_widget = /** @class */ (function (_super) {
for (var i = 0; i < this._children.length; i++) {
this._children[i].iterateOver(_callback, _context, _type);
}
};
}
/**
* Returns true if the widget currently resides in the visible part of the
* widget tree. E.g. Templates which have been cloned are not in the visible
@ -357,7 +340,7 @@ var et2_widget = /** @class */ (function (_super) {
* return this._super(inTree);
* when calling this function the _vis parameter does not have to be supplied.
*/
et2_widget.prototype.isInTree = function (_sender, _vis) {
isInTree(_sender, _vis) {
if (typeof _vis == "undefined") {
_vis = true;
}
@ -365,15 +348,15 @@ var et2_widget = /** @class */ (function (_super) {
return _vis && this._parent.isInTree(this);
}
return _vis;
};
et2_widget.prototype.isOfSupportedWidgetClass = function (_obj) {
}
isOfSupportedWidgetClass(_obj) {
for (var i = 0; i < this.supportedWidgetClasses.length; i++) {
if (_obj instanceof this.supportedWidgetClasses[i]) {
return true;
}
}
return false;
};
}
/**
* The parseXMLAttrs function takes an XML DOM attributes object
* and adds the given attributes to the _target associative array. This
@ -383,7 +366,7 @@ var et2_widget = /** @class */ (function (_super) {
* @param {object} _target is the object to which the attributes should be written.
* @param {et2_widget} _proto prototype with attributes and legacyOptions attribute
*/
et2_widget.prototype.parseXMLAttrs = function (_attrsObj, _target, _proto) {
parseXMLAttrs(_attrsObj, _target, _proto) {
// Check whether the attributes object is really existing, if not abort
if (typeof _attrsObj == "undefined") {
return;
@ -395,8 +378,8 @@ var et2_widget = /** @class */ (function (_super) {
var attrValue = _attrsObj[i].value;
// Special handling for the legacy options
if (attrName == "options" && _proto.constructor.legacyOptions && _proto.constructor.legacyOptions.length > 0) {
var legacy = _proto.constructor.legacyOptions || [];
var attrs = et2_attribute_registry[Object.getPrototypeOf(_proto).constructor.name] || {};
let legacy = _proto.constructor.legacyOptions || [];
let attrs = et2_attribute_registry[Object.getPrototypeOf(_proto).constructor.name] || {};
// Check for modifications on legacy options here. Normal modifications
// are handled in widget constructor, but it's too late for legacy options then
if (_target.id && this.getArrayMgr("modifications").getEntry(_target.id)) {
@ -441,7 +424,7 @@ var et2_widget = /** @class */ (function (_super) {
// do NOT overwrite already evaluated readonly attribute
}
else {
var attrs = et2_attribute_registry[_proto.constructor.name] || {};
let attrs = et2_attribute_registry[_proto.constructor.name] || {};
if (mgr != null && typeof attrs[attrName] != "undefined") {
var attr = attrs[attrName];
// If the attribute is marked as boolean, parse the
@ -457,14 +440,14 @@ var et2_widget = /** @class */ (function (_super) {
_target[attrName] = attrValue;
}
}
};
}
/**
* Apply the "modifications" to the element and translate attributes marked
* with "translate: true"
*
* @param {object} _attrs
*/
et2_widget.prototype.transformAttributes = function (_attrs) {
transformAttributes(_attrs) {
// Apply the content of the modifications array
if (this.id) {
if (typeof this.id != "string") {
@ -483,30 +466,26 @@ var et2_widget = /** @class */ (function (_super) {
}
}
}
var _loop_1 = function () {
if (_attrs[key] && typeof this_1.attributes[key] != "undefined") {
if (this_1.attributes[key].translate === true ||
(this_1.attributes[key].translate === "!no_lang" && !_attrs["no_lang"])) {
var value = _attrs[key];
// Translate the attributes
for (var key in _attrs) {
if (_attrs[key] && typeof this.attributes[key] != "undefined") {
if (this.attributes[key].translate === true ||
(this.attributes[key].translate === "!no_lang" && !_attrs["no_lang"])) {
let value = _attrs[key];
// allow statustext to contain multiple translated sub-strings eg: {Firstname}.{Lastname}
if (value.indexOf('{') !== -1) {
var egw_1 = this_1.egw();
const egw = this.egw();
_attrs[key] = value.replace(/{([^}]+)}/g, function (str, p1) {
return egw_1.lang(p1);
return egw.lang(p1);
});
}
else {
_attrs[key] = this_1.egw().lang(value);
_attrs[key] = this.egw().lang(value);
}
}
}
};
var this_1 = this;
// Translate the attributes
for (var key in _attrs) {
_loop_1();
}
};
}
/**
* Create a et2_widget from an XML node.
*
@ -521,7 +500,7 @@ var et2_widget = /** @class */ (function (_super) {
*
* @return et2_widget
*/
et2_widget.prototype.createElementFromNode = function (_node, _name) {
createElementFromNode(_node, _name) {
var attributes = {};
// Parse the "readonly" and "type" flag for this element here, as they
// determine which constructor is used
@ -557,28 +536,27 @@ var et2_widget = /** @class */ (function (_super) {
}
// Get the constructor - if the widget is readonly, use the special "_ro"
// constructor if it is available
var constructor = typeof et2_registry[_nodeName] == "undefined" ?
et2_placeholder : et2_registry[_nodeName];
var constructor = et2_registry[typeof et2_registry[_nodeName] == "undefined" ? 'placeholder' : _nodeName];
if (readonly === true && typeof et2_registry[_nodeName + "_ro"] != "undefined") {
constructor = et2_registry[_nodeName + "_ro"];
}
// Parse the attributes from the given XML attributes object
this.parseXMLAttrs(_node.attributes, attributes, constructor.prototype);
// Do an sanity check for the attributes
et2_core_inheritance_1.ClassWithAttributes.generateAttributeSet(et2_attribute_registry[constructor.name], attributes);
ClassWithAttributes.generateAttributeSet(et2_attribute_registry[constructor.name], attributes);
// Creates the new widget, passes this widget as an instance and
// passes the widgetType. Then it goes on loading the XML for it.
var widget = new constructor(this, attributes);
// Load the widget itself from XML
widget.loadFromXML(_node);
return widget;
};
}
/**
* Loads the widget tree from an XML node
*
* @param _node xml node
*/
et2_widget.prototype.loadFromXML = function (_node) {
loadFromXML(_node) {
// Load the child nodes.
for (var i = 0; i < _node.childNodes.length; i++) {
var node = _node.childNodes[i];
@ -595,14 +573,14 @@ var et2_widget = /** @class */ (function (_super) {
// Create the new element
this.createElementFromNode(node);
}
};
}
/**
* Called whenever textNodes are loaded from the XML tree
*
* @param _content
*/
et2_widget.prototype.loadContent = function (_content) {
};
loadContent(_content) {
}
/**
* Called when loading the widget (sub-tree) is finished. First when this
* function is called, the DOM-Tree is created. loadingFinished is
@ -624,7 +602,7 @@ var et2_widget = /** @class */ (function (_super) {
*
* @param {Promise[]} promises List of promises from widgets that are not done. Pass an empty array, it will be filled if needed.
*/
et2_widget.prototype.loadingFinished = function (promises) {
loadingFinished(promises) {
// Call all availble setters
this.initAttributes(this.options);
// Make sure promises is defined to avoid errors.
@ -660,7 +638,7 @@ var et2_widget = /** @class */ (function (_super) {
// Fihish loading when it's finished
result.done(jQuery.proxy(loadChildren, this));
}
};
}
/**
* The initAttributes function sets the attributes to their default
* values. The attributes are not overwritten, which means, that the
@ -671,19 +649,19 @@ var et2_widget = /** @class */ (function (_super) {
*
* @param {object} _attrs
*/
et2_widget.prototype.initAttributes = function (_attrs) {
initAttributes(_attrs) {
for (var key in _attrs) {
if (typeof this.attributes[key] != "undefined" && !this.attributes[key].ignore && !(_attrs[key] == undefined)) {
var val = _attrs[key];
// compile string values of attribute type "js" to functions
if (this.attributes[key].type == 'js' && typeof _attrs[key] == 'string') {
val = et2_compileLegacyJS(val, this, this.instanceOf(et2_inputWidget) ? this.getInputNode() :
val = et2_compileLegacyJS(val, this, this.implements(et2_IInputNode) ? this.getInputNode() :
(this.implements(et2_IDOMNode) ? this.getDOMNode() : null));
}
this.setAttribute(key, val, false);
}
}
};
}
/**
* Does specific post-processing after the widget is loaded. Most widgets should not
* need to do anything here, it should all be done before.
@ -693,15 +671,15 @@ var et2_widget = /** @class */ (function (_super) {
*
* @see {@link http://api.jquery.com/deferred.promise/|jQuery Promise}
*/
et2_widget.prototype.doLoadingFinished = function () {
doLoadingFinished() {
return true;
};
}
/**
* The egw function returns the instance of the client side api belonging
* to this widget tree. The api instance can be set in the "container"
* widget using the setApiInstance function.
*/
et2_widget.prototype.egw = function () {
egw() {
// The _egw property is not set
if (typeof this._egw === 'undefined') {
if (this._parent != null) {
@ -719,31 +697,31 @@ var et2_widget = /** @class */ (function (_super) {
return egw('phpgwapi', wnd);
}
return this._egw;
};
}
/**
* Sets the client side api instance. It can be retrieved by the widget tree
* by using the "egw()" function.
*
* @param {IegwAppLocal} _egw egw object to set
*/
et2_widget.prototype.setApiInstance = function (_egw) {
setApiInstance(_egw) {
this._egw = _egw;
};
}
/**
* Sets all array manager objects - this function can be used to set the
* root array managers of the container object.
*
* @param {object} _mgrs
*/
et2_widget.prototype.setArrayMgrs = function (_mgrs) {
setArrayMgrs(_mgrs) {
this._mgrs = et2_cloneObject(_mgrs);
};
}
/**
* Returns an associative array containing the top-most array managers.
*
* @param _mgrs is used internally and should not be supplied.
*/
et2_widget.prototype.getArrayMgrs = function (_mgrs) {
getArrayMgrs(_mgrs) {
if (typeof _mgrs == "undefined") {
_mgrs = {};
}
@ -759,22 +737,22 @@ var et2_widget = /** @class */ (function (_super) {
this._parent.getArrayMgrs(_mgrs);
}
return _mgrs;
};
}
/**
* Sets the array manager for the given part
*
* @param {string} _part which array mgr to set
* @param {object} _mgr
*/
et2_widget.prototype.setArrayMgr = function (_part, _mgr) {
setArrayMgr(_part, _mgr) {
this._mgrs[_part] = _mgr;
};
}
/**
* Returns the array manager object for the given part
*
* @param {string} managed_array_type name of array mgr to return
*/
et2_widget.prototype.getArrayMgr = function (managed_array_type) {
getArrayMgr(managed_array_type) {
if (this._mgrs && typeof this._mgrs[managed_array_type] != "undefined") {
return this._mgrs[managed_array_type];
}
@ -782,7 +760,7 @@ var et2_widget = /** @class */ (function (_super) {
return this._parent.getArrayMgr(managed_array_type);
}
return null;
};
}
/**
* Checks whether a namespace exists for this element in the content array.
* If yes, an own perspective of the content array is created. If not, the
@ -790,7 +768,7 @@ var et2_widget = /** @class */ (function (_super) {
*
* Constructor attributes are passed in case a child needs to make decisions
*/
et2_widget.prototype.checkCreateNamespace = function (_attrs) {
checkCreateNamespace(_attrs) {
// Get the content manager
var mgrs = this.getArrayMgrs();
for (var key in mgrs) {
@ -813,7 +791,7 @@ var et2_widget = /** @class */ (function (_super) {
delete (this._mgrs[key]);
}
}
};
}
/**
* Widgets that do support a namespace should override and return true.
*
@ -822,23 +800,23 @@ var et2_widget = /** @class */ (function (_super) {
*
* @private
*/
et2_widget.prototype._createNamespace = function () {
_createNamespace() {
return false;
};
}
/**
* Sets the instance manager object (of type etemplate2, see etemplate2.js)
*
* @param {etemplate2} _inst
*/
et2_widget.prototype.setInstanceManager = function (_inst) {
setInstanceManager(_inst) {
this._inst = _inst;
};
}
/**
* Returns the instance manager
*
* @return {etemplate2}
*/
et2_widget.prototype.getInstanceManager = function () {
getInstanceManager() {
if (this._inst != null) {
return this._inst;
}
@ -846,68 +824,66 @@ var et2_widget = /** @class */ (function (_super) {
return this._parent.getInstanceManager();
}
return null;
};
}
/**
* Returns the path into the data array. By default, array manager takes care of
* this, but some extensions need to override this
*/
et2_widget.prototype.getPath = function () {
getPath() {
var path = this.getArrayMgr("content").getPath();
// Prevent namespaced widgets with value from going an extra layer deep
if (this.id && this._createNamespace() && path[path.length - 1] == this.id)
path.pop();
return path;
};
et2_widget._attributes = {
"id": {
"name": "ID",
"type": "string",
"description": "Unique identifier of the widget"
},
"no_lang": {
"name": "No translation",
"type": "boolean",
"default": false,
"description": "If true, no translations are made for this widget"
},
/**
* Ignore the "span" property by default - it is read by the grid and
* other widgets.
*/
"span": {
"ignore": true
},
/**
* Ignore the "type" tag - it is read by the "createElementFromNode"
* function and passed as second parameter of the widget constructor
*/
"type": {
"name": "Widget type",
"type": "string",
"ignore": true,
"description": "What kind of widget this is"
},
/**
* Ignore the readonly tag by default - its also read by the
* "createElementFromNode" function.
*/
"readonly": {
"ignore": true
},
/**
* Widget's attributes
*/
attributes: {
"name": "Widget attributes",
"type": "any",
"ignore": true,
"description": "Object of widget attributes"
}
};
// Set the legacyOptions array to the names of the properties the "options"
// attribute defines.
et2_widget.legacyOptions = [];
return et2_widget;
}(et2_core_inheritance_1.ClassWithAttributes));
exports.et2_widget = et2_widget;
}
}
et2_widget._attributes = {
"id": {
"name": "ID",
"type": "string",
"description": "Unique identifier of the widget"
},
"no_lang": {
"name": "No translation",
"type": "boolean",
"default": false,
"description": "If true, no translations are made for this widget"
},
/**
* Ignore the "span" property by default - it is read by the grid and
* other widgets.
*/
"span": {
"ignore": true
},
/**
* Ignore the "type" tag - it is read by the "createElementFromNode"
* function and passed as second parameter of the widget constructor
*/
"type": {
"name": "Widget type",
"type": "string",
"ignore": true,
"description": "What kind of widget this is"
},
/**
* Ignore the readonly tag by default - its also read by the
* "createElementFromNode" function.
*/
"readonly": {
"ignore": true
},
/**
* Widget's attributes
*/
attributes: {
"name": "Widget attributes",
"type": "any",
"ignore": true,
"description": "Object of widget attributes"
}
};
// Set the legacyOptions array to the names of the properties the "options"
// attribute defines.
et2_widget.legacyOptions = [];
//# sourceMappingURL=et2_core_widget.js.map

View File

@ -17,15 +17,21 @@
*/
import {ClassWithAttributes} from './et2_core_inheritance';
import {et2_arrayMgr, et2_readonlysArrayMgr} from "./et2_core_arrayMgr";
import {et2_baseWidget, et2_container} from "./et2_core_baseWidget";
import {et2_arrayMgr} from "./et2_core_arrayMgr";
import {egw, IegwAppLocal} from "../jsapi/egw_global";
import {et2_cloneObject, et2_csvSplit} from "./et2_core_common";
import {et2_compileLegacyJS} from "./et2_core_legacyJSFunctions";
import {et2_IDOMNode, et2_IInputNode} from "./et2_core_interfaces";
// fixing circular dependencies by only importing type
import type {et2_container} from "./et2_core_baseWidget";
import type {et2_inputWidget, et2_input} from "./et2_core_inputWidget";
/**
* The registry contains all XML tag names and the corresponding widget
* constructor.
*/
var et2_registry = {};
var et2_attribute_registry = {};
export var et2_registry = {};
export var et2_attribute_registry = {};
/**
@ -97,8 +103,7 @@ export function et2_createWidget(_name : string, _attrs : object, _parent? : any
// Get the constructor - if the widget is readonly, use the special "_ro"
// constructor if it is available
var constructor = typeof et2_registry[nodeName] == "undefined" ?
et2_placeholder : et2_registry[nodeName];
let constructor = et2_registry[typeof et2_registry[nodeName] == "undefined" ? 'placeholder' : nodeName];
if (readonly && typeof et2_registry[nodeName + "_ro"] != "undefined")
{
constructor = et2_registry[nodeName + "_ro"];
@ -327,7 +332,7 @@ export class et2_widget extends ClassWithAttributes
this.setArrayMgrs(_obj.mgrs);
}
private _parent: et2_widget;
_parent: et2_widget;
/**
* Returns the parent widget of this widget
@ -700,8 +705,7 @@ export class et2_widget extends ClassWithAttributes
// Get the constructor - if the widget is readonly, use the special "_ro"
// constructor if it is available
var constructor = typeof et2_registry[_nodeName] == "undefined" ?
et2_placeholder : et2_registry[_nodeName];
var constructor = et2_registry[typeof et2_registry[_nodeName] == "undefined" ? 'placeholder' : _nodeName];
if (readonly === true && typeof et2_registry[_nodeName + "_ro"] != "undefined") {
constructor = et2_registry[_nodeName + "_ro"];
}
@ -838,7 +842,7 @@ export class et2_widget extends ClassWithAttributes
// compile string values of attribute type "js" to functions
if (this.attributes[key].type == 'js' && typeof _attrs[key] == 'string') {
val = et2_compileLegacyJS(val, this,
this.instanceOf(et2_inputWidget) ? (<et2_inputWidget><unknown>this).getInputNode() :
this.implements(et2_IInputNode) ? (<et2_inputWidget><unknown>this).getInputNode() :
(this.implements(et2_IDOMNode) ? (<et2_IDOMNode><unknown>this).getDOMNode() : null));
}
this.setAttribute(key, val, false);

View File

@ -4,9 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
import { egw } from "../jsapi/egw_global";
/**
* Loads the given URL asynchronously from the server
*
@ -18,12 +19,12 @@
* @param {object} _context for _callback
* @param {function} _fail_callback function(_xml)
*/
function et2_loadXMLFromURL(_url, _callback, _context, _fail_callback) {
export function et2_loadXMLFromURL(_url, _callback, _context, _fail_callback) {
if (typeof _context == "undefined") {
_context = null;
}
// use window object from main window with same algorithm as for the template cache
var win;
let win;
try {
if (opener && opener.etemplate2) {
win = opener;
@ -54,28 +55,28 @@ function et2_loadXMLFromURL(_url, _callback, _context, _fail_callback) {
}
});
}
function et2_directChildrenByTagName(_node, _tagName) {
export function et2_directChildrenByTagName(_node, _tagName) {
// Normalize the tag name
_tagName = _tagName.toLowerCase();
var result = [];
for (var i = 0; i < _node.childNodes.length; i++) {
let result = [];
for (let i = 0; i < _node.childNodes.length; i++) {
if (_tagName == _node.childNodes[i].nodeName.toLowerCase()) {
result.push(_node.childNodes[i]);
}
}
return result;
}
function et2_filteredNodeIterator(_node, _callback, _context) {
for (var i = 0; i < _node.childNodes.length; i++) {
var node = _node.childNodes[i];
var nodeName = node.nodeName.toLowerCase();
export function et2_filteredNodeIterator(_node, _callback, _context) {
for (let i = 0; i < _node.childNodes.length; i++) {
let node = _node.childNodes[i];
let nodeName = node.nodeName.toLowerCase();
if (nodeName.charAt(0) != "#") {
_callback.call(_context, node, nodeName);
}
}
}
function et2_readAttrWithDefault(_node, _name, _default) {
var val = _node.getAttribute(_name);
export function et2_readAttrWithDefault(_node, _name, _default) {
let val = _node.getAttribute(_name);
return (val === null) ? _default : val;
}
//# sourceMappingURL=et2_core_xml.js.map

View File

@ -4,10 +4,12 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
import {egw} from "../jsapi/egw_global";
/**
* Loads the given URL asynchronously from the server
*
@ -19,7 +21,7 @@
* @param {object} _context for _callback
* @param {function} _fail_callback function(_xml)
*/
function et2_loadXMLFromURL(_url : string, _callback : Function, _context : object, _fail_callback? : Function)
export function et2_loadXMLFromURL(_url : string, _callback : Function, _context : object, _fail_callback? : Function)
{
if (typeof _context == "undefined")
{
@ -62,7 +64,7 @@ function et2_loadXMLFromURL(_url : string, _callback : Function, _context : obje
});
}
function et2_directChildrenByTagName(_node : HTMLElement, _tagName : String) : HTMLElement[]
export function et2_directChildrenByTagName(_node : HTMLElement, _tagName : String) : HTMLElement[]
{
// Normalize the tag name
_tagName = _tagName.toLowerCase();
@ -79,7 +81,7 @@ function et2_directChildrenByTagName(_node : HTMLElement, _tagName : String) : H
return result;
}
function et2_filteredNodeIterator(_node : HTMLElement, _callback : Function, _context : object)
export function et2_filteredNodeIterator(_node : HTMLElement, _callback : Function, _context : object)
{
for (let i = 0; i < _node.childNodes.length; i++)
{
@ -92,7 +94,7 @@ function et2_filteredNodeIterator(_node : HTMLElement, _callback : Function, _co
}
}
function et2_readAttrWithDefault(_node : HTMLElement, _name : string, _default : string) : string
export function et2_readAttrWithDefault(_node : HTMLElement, _name : string, _default : string) : string
{
let val = _node.getAttribute(_name);

View File

@ -1,16 +1,13 @@
"use strict";
/**
* EGroupware eTemplate2 - dataview code
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-2012
* @version $Id$
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_common;
@ -20,12 +17,10 @@
et2_dataview_view_rowProvider;
et2_dataview_view_resizeable;
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview = void 0;
var et2_dataview_model_columns_1 = require("./et2_dataview_model_columns");
var et2_dataview_view_resizeable_1 = require("./et2_dataview_view_resizeable");
var et2_dataview_view_grid_1 = require("./et2_dataview_view_grid");
var et2_dataview_view_rowProvider_1 = require("./et2_dataview_view_rowProvider");
import { et2_dataview_column, et2_dataview_columns } from './et2_dataview_model_columns';
import { et2_dataview_view_resizable } from "./et2_dataview_view_resizeable";
import { et2_dataview_grid } from "./et2_dataview_view_grid";
import { et2_dataview_rowProvider } from "./et2_dataview_view_rowProvider";
/**
* The et2_dataview class is the main class for displaying a dataview. The
* dataview class manages the creation of the outer html nodes (like the table,
@ -35,7 +30,7 @@ var et2_dataview_view_rowProvider_1 = require("./et2_dataview_view_rowProvider")
*
* @augments Class
*/
var et2_dataview = /** @class */ (function () {
export class et2_dataview {
/**
* Constructor for the grid container
*
@ -43,7 +38,7 @@ var et2_dataview = /** @class */ (function () {
* @param {egw} _egw
* @memberOf et2_dataview
*/
function et2_dataview(_parentNode, _egw) {
constructor(_parentNode, _egw) {
// Copy the arguments
this.parentNode = jQuery(_parentNode);
this.egw = _egw;
@ -63,7 +58,7 @@ var et2_dataview = /** @class */ (function () {
/**
* Destroys the object, removes all dom nodes and clears all references.
*/
et2_dataview.prototype.destroy = function () {
destroy() {
// Clear the columns
this._clearHeader();
// Free the grid
@ -76,46 +71,46 @@ var et2_dataview = /** @class */ (function () {
}
// Detatch the outer element
this.table.remove();
};
}
/**
* Clears all data rows and reloads them
*/
et2_dataview.prototype.clear = function () {
clear() {
if (this.grid) {
this.grid.clear();
}
};
}
/**
* Returns the column container node for the given column index
*
* @param _columnIdx the integer column index
*/
et2_dataview.prototype.getHeaderContainerNode = function (_columnIdx) {
getHeaderContainerNode(_columnIdx) {
if (typeof this.columnNodes[_columnIdx] != "undefined") {
return this.columnNodes[_columnIdx].container[0];
}
return null;
};
}
/**
* Sets the column descriptors and creates the column header according to it.
* The inner grid will be emptied if it has already been built.
*/
et2_dataview.prototype.setColumns = function (_columnData) {
setColumns(_columnData) {
// Free all column objects which have been created till this moment
this._clearHeader();
// Copy the given column data
this.columnMgr = new et2_dataview_model_columns_1.et2_dataview_columns(_columnData);
this.columnMgr = new et2_dataview_columns(_columnData);
// Create the stylesheets
this.updateColumns();
// Build the header row
this._buildHeader();
// Build the grid
this._buildGrid();
};
}
/**
* Resizes the grid
*/
et2_dataview.prototype.resize = function (_w, _h) {
resize(_w, _h) {
// Not fully initialized yet...
if (!this.columnMgr)
return;
@ -137,22 +132,21 @@ var et2_dataview = /** @class */ (function () {
this.headTr.outerHeight(true));
}
}
};
}
/**
* Returns the column manager object. You can use it to set the visibility
* of columns etc. Call "updateHeader" if you did any changes.
*/
et2_dataview.prototype.getColumnMgr = function () {
getColumnMgr() {
return this.columnMgr;
};
}
/**
* Recalculates the stylesheets which determine the column visibility and
* width.
*
* @param setDefault boolean Allow admins to save current settings as default for all users
*/
et2_dataview.prototype.updateColumns = function (setDefault) {
if (setDefault === void 0) { setDefault = false; }
updateColumns(setDefault = false) {
if (this.columnMgr) {
this._updateColumns();
}
@ -160,13 +154,13 @@ var et2_dataview = /** @class */ (function () {
if (this.onUpdateColumns) {
this.onUpdateColumns(setDefault);
}
};
}
/* --- PRIVATE FUNCTIONS --- */
/* --- Code for building the grid container DOM-Tree elements ---- */
/**
* Builds the base DOM-Tree elements
*/
et2_dataview.prototype._createElements = function () {
_createElements() {
/*
Structure:
<table class="egwGridView_outer">
@ -188,12 +182,12 @@ var et2_dataview = /** @class */ (function () {
.addClass("egwGridView_outer")
.append(this.thead, this.tbody)
.appendTo(this.parentNode);
};
}
/* --- Code for building the header row --- */
/**
* Clears the header row
*/
et2_dataview.prototype._clearHeader = function () {
_clearHeader() {
if (this.columnMgr) {
this.columnMgr.destroy();
this.columnMgr = null;
@ -216,12 +210,12 @@ var et2_dataview = /** @class */ (function () {
this.columnNodes = [];
this.columns = [];
this.headTr.empty();
};
}
/**
* Sets the column data which is retrieved by calling egwGridColumns.getColumnData.
* The columns will be updated.
*/
et2_dataview.prototype._updateColumns = function () {
_updateColumns() {
// Copy the columns data
this.columns = this.columnMgr.getColumnData();
// Count the visible rows
@ -292,11 +286,11 @@ var et2_dataview = /** @class */ (function () {
this.egw.css(".egwGridView_grid ." + this.uniqueId + "_div_fullRow", "width: " + (totalWidth - this.columnBorderWidth - 2) + "px; border-right-width: 0 !important;");
this.egw.css(".egwGridView_outer ." + this.uniqueId + "_td_fullRow", "border-right-width: 0 !important;");
this.egw.css(".egwGridView_outer ." + this.uniqueId + "_spacer_fullRow", "width: " + (totalWidth - 1) + "px; border-right-width: 0 !important;");
};
}
/**
* Builds the containers for the header row
*/
et2_dataview.prototype._buildHeader = function () {
_buildHeader() {
var self = this;
var handler = function (event) {
};
@ -320,7 +314,7 @@ var et2_dataview = /** @class */ (function () {
// make column resizable
var enc_column = self.columnMgr.getColumnById(col.id);
if (enc_column.visibility !== et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS_NOSELECT) {
et2_dataview_view_resizeable_1.et2_dataview_view_resizable.makeResizeable(column, function (_w) {
et2_dataview_view_resizable.makeResizeable(column, function (_w) {
// User wants the column to stay where they put it, even for relative
// width columns, so set it explicitly first and adjust other relative
// columns to match.
@ -356,11 +350,11 @@ var et2_dataview = /** @class */ (function () {
});
}
this._buildSelectCol();
};
}
/**
* Builds the select cols column
*/
et2_dataview.prototype._buildSelectCol = function () {
_buildSelectCol() {
// Build the "select columns" icon
this.selectColIcon = jQuery(document.createElement("span"))
.addClass("selectcols")
@ -375,11 +369,11 @@ var et2_dataview = /** @class */ (function () {
.appendTo(this.headTr);
this.selectCol.css("width", this.scrollbarWidth - this.selectCol.outerWidth()
+ this.selectCol.width() + 1);
};
}
/**
* Builds the inner grid class
*/
et2_dataview.prototype._buildGrid = function () {
_buildGrid() {
// Create the collection of column ids
var colIds = [];
for (var i = 0; i < this.columns.length; i++) {
@ -391,19 +385,19 @@ var et2_dataview = /** @class */ (function () {
if (this.rowProvider) {
this.rowProvider.destroy();
}
this.rowProvider = new et2_dataview_view_rowProvider_1.et2_dataview_rowProvider(this.uniqueId, colIds);
this.rowProvider = new et2_dataview_rowProvider(this.uniqueId, colIds);
// Create the grid class and pass "19" as the starting average row height
this.grid = new et2_dataview_view_grid_1.et2_dataview_grid(null, null, this.egw, this.rowProvider, 19);
this.grid = new et2_dataview_grid(null, null, this.egw, this.rowProvider, 19);
// Insert the grid into the DOM-Tree
var tr = jQuery(this.grid.getFirstNode());
this.containerTr.replaceWith(tr);
this.containerTr = tr;
};
}
/* --- Code for calculating the browser/css depending widths --- */
/**
* Reads the browser dependant variables
*/
et2_dataview.prototype._getDepVars = function () {
_getDepVars() {
if (typeof this.scrollbarWidth === 'undefined') {
// Clone the table and attach it to the outer body tag
var clone = this.table.clone();
@ -421,11 +415,11 @@ var et2_dataview = /** @class */ (function () {
// Remove the cloned DOM-Node again from the outer body
clone.remove();
}
};
}
/**
* Reads the scrollbar width
*/
et2_dataview.prototype._getScrollbarWidth = function (_table) {
_getScrollbarWidth(_table) {
// Create a temporary td and two divs, which are inserted into the
// DOM-Tree. The outer div has a fixed size and "overflow" set to auto.
// When the second div is inserted, it will be forced to display a scrollbar.
@ -444,11 +438,11 @@ var et2_dataview = /** @class */ (function () {
// Remove the elements again
div_outer.remove();
return width;
};
}
/**
* Calculates the total width of the header column border
*/
et2_dataview.prototype._getHeaderBorderWidth = function (_table) {
_getHeaderBorderWidth(_table) {
// Create a temporary th which is appended to the outer thead row
var cont = jQuery(document.createElement("div"))
.addClass("innerContainer");
@ -461,11 +455,11 @@ var et2_dataview = /** @class */ (function () {
// Remove the appended element again
th.remove();
return width;
};
}
/**
* Calculates the total width of the column border
*/
et2_dataview.prototype._getColumnBorderWidth = function (_table) {
_getColumnBorderWidth(_table) {
// Create a temporary th which is appended to the outer thead row
var cont = jQuery(document.createElement("div"))
.addClass("innerContainer");
@ -479,8 +473,6 @@ var et2_dataview = /** @class */ (function () {
// Remove the appended element again
td.remove();
return width;
};
return et2_dataview;
}());
exports.et2_dataview = et2_dataview;
}
}
//# sourceMappingURL=et2_dataview.js.map

View File

@ -4,11 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-2012
* @version $Id$
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
@ -20,7 +19,7 @@
et2_dataview_view_resizeable;
*/
import {et2_dataview_columns} from './et2_dataview_model_columns';
import {et2_dataview_column, et2_dataview_columns} from './et2_dataview_model_columns';
import {et2_dataview_view_resizable} from "./et2_dataview_view_resizeable";
import {et2_dataview_grid} from "./et2_dataview_view_grid";
import {et2_dataview_rowProvider} from "./et2_dataview_view_rowProvider"
@ -67,9 +66,9 @@ export class et2_dataview
private columnNodes: any[];
private columns: any[];
private columnMgr: et2_dataview_columns;
private rowProvider: et2_dataview_rowProvider;
rowProvider: et2_dataview_rowProvider;
private grid: et2_dataview_grid;
grid: et2_dataview_grid;
// DOM stuff
private selectColIcon: JQuery;
@ -667,6 +666,4 @@ export class et2_dataview
return width;
}
}

View File

@ -1,41 +1,29 @@
"use strict";
/**
* EGroupware eTemplate2
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-2012
/*egw:uses
et2_core_common;
et2_core_inheritance;
et2_dataview_interfaces;
et2_dataview_controller_selection;
et2_dataview_view_row;
et2_dataview_view_tile;
egw_action.egw_action;
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_controller = void 0;
var et2_dataview_controller_selection_1 = require("./et2_dataview_controller_selection");
var et2_dataview_view_row_1 = require("./et2_dataview_view_row");
* @copyright EGroupware GmbH 2011-2021
*/
import { et2_dataview_selectionManager } from "./et2_dataview_controller_selection";
import { et2_dataview_row } from "./et2_dataview_view_row";
import { et2_arrayIntKeys, et2_bounds } from "./et2_core_common";
import { egw } from "../jsapi/egw_global";
/**
* The fetch timeout specifies the time during which the controller tries to
* consolidate requests for rows.
*/
var ET2_DATAVIEW_FETCH_TIMEOUT = 50;
var ET2_DATAVIEW_STEPSIZE = 50;
export const ET2_DATAVIEW_FETCH_TIMEOUT = 50;
export const ET2_DATAVIEW_STEPSIZE = 50;
/**
* The et2_dataview_controller class is the intermediate layer between a grid
* instance and the corresponding data source. It manages updating the grid,
* as well as inserting and deleting rows.
*/
var et2_dataview_controller = /** @class */ (function () {
export class et2_dataview_controller {
/**
* Constructor of the et2_dataview_controller, connects to the grid
* callback.
@ -50,7 +38,7 @@ var et2_dataview_controller = /** @class */ (function () {
* @param _actionObjectManager is the object that manages the action
* objects.
*/
function et2_dataview_controller(_parentController, _grid) {
constructor(_parentController, _grid) {
this._indexMap = {};
// Copy the given arguments
this._parentController = _parentController;
@ -74,7 +62,7 @@ var et2_dataview_controller = /** @class */ (function () {
this._parentController._children.push(this);
}
}
et2_dataview_controller.prototype.destroy = function () {
destroy() {
// Destroy the selection manager
this._selectionMgr.destroy();
// Clear the selection timeout
@ -89,34 +77,34 @@ var et2_dataview_controller = /** @class */ (function () {
}
}
this._grid = null;
};
}
/**
* @param value is an object implementing the et2_IDataProvider
* interface
*/
et2_dataview_controller.prototype.setDataProvider = function (value) {
setDataProvider(value) {
this._dataProvider = value;
};
et2_dataview_controller.prototype.setRowCallback = function (value) {
}
setRowCallback(value) {
this._rowCallback = value;
};
et2_dataview_controller.prototype.setLinkCallback = function (value) {
}
setLinkCallback(value) {
this._linkCallback = value;
};
}
/**
* @param value is the context in which the _rowCallback and the
* _linkCallback are called.
*/
et2_dataview_controller.prototype.setContext = function (value) {
setContext(value) {
this._context = value;
};
et2_dataview_controller.prototype.setActionObjectManager = function (_actionObjectManager) {
}
setActionObjectManager(_actionObjectManager) {
if (this._selectionMgr) {
this._selectionMgr.destroy();
}
// Create the selection manager
this._selectionMgr = new et2_dataview_controller_selection_1.et2_dataview_selectionManager(this._parentController ? this._parentController._selectionMgr : null, this._indexMap, _actionObjectManager, this._selectionFetchRange, this._makeIndexVisible, this);
};
this._selectionMgr = new et2_dataview_selectionManager(this._parentController ? this._parentController._selectionMgr : null, this._indexMap, _actionObjectManager, this._selectionFetchRange, this._makeIndexVisible, this);
}
/**
* The update function queries the server for changes in the currently
* managed index range -- those changes are then merged into the current
@ -125,7 +113,7 @@ var et2_dataview_controller = /** @class */ (function () {
* @param {boolean} clear Skip the fancy stuff, dump everything and start again.
* Completely clears the grid and selection.
*/
et2_dataview_controller.prototype.update = function (clear) {
update(clear) {
// Avoid update after destroy
// Happens sometimes if AJAX response comes after etemplate unload
if (!this._grid)
@ -163,11 +151,11 @@ var et2_dataview_controller = /** @class */ (function () {
this._request_queue = [];
// Require that range from the server
this._queueFetch(et2_bounds(range.top, clear ? 0 : range.bottom + 1), 0, true);
};
}
/**
* Rebuilds the complete grid.
*/
et2_dataview_controller.prototype.reset = function () {
reset() {
// Throw away all internal mappings and reset the timestamp
this._indexMap = {};
// Update selection manager, it uses this by reference
@ -180,22 +168,22 @@ var et2_dataview_controller = /** @class */ (function () {
this._request_queue = [];
// Update the data
this.update();
};
}
/**
* Loads the initial order. Do not call multiple times.
*/
et2_dataview_controller.prototype.loadInitialOrder = function (order) {
loadInitialOrder(order) {
for (var i = 0; i < order.length; i++) {
this._getIndexEntry(i).uid = order[i];
}
};
}
/**
* Load initial data
*
* @param {string} uid_key Name of the unique row identifier field
* @param {Object} data Key / Value mapping of initial data.
*/
et2_dataview_controller.prototype.loadInitialData = function (uid_prefix, uid_key, data) {
loadInitialData(uid_prefix, uid_key, data) {
var idx = 0;
for (var key in data) {
// Skip any extra keys
@ -216,32 +204,32 @@ var et2_dataview_controller = /** @class */ (function () {
this._selectionMgr.clear();
this._emptyRow(this._grid._total == 0);
}
};
}
/**
* Returns the depth of the controller instance.
*/
et2_dataview_controller.prototype.getDepth = function () {
getDepth() {
if (this._parentController) {
return this._parentController.getDepth() + 1;
}
return 0;
};
}
/**
* Set the data cache prefix
* The default is to use appname, but if you need to set it explicitly to
* something else to avoid conflicts. Use the same prefix everywhere for
* each type of data. eg. infolog for infolog entries, even if accessed via addressbook
*/
et2_dataview_controller.prototype.setPrefix = function (prefix) {
setPrefix(prefix) {
this.dataStorePrefix = prefix;
};
}
/**
* Returns the row information of the passed node, or null if not available
*
* @param {DOMNode} node
* @return {string|false} UID, or false if not found
*/
et2_dataview_controller.prototype.getRowByNode = function (node) {
getRowByNode(node) {
// Whatever the node, find a TR
var row_node = jQuery(node).closest('tr');
var row = null;
@ -270,15 +258,15 @@ var et2_dataview_controller = /** @class */ (function () {
row.controller = this;
}
return row;
};
}
/**
* Returns the current "total" count.
*/
et2_dataview_controller.prototype.getTotalCount = function () {
getTotalCount() {
return this._grid.getTotalCount();
};
}
/* -- PRIVATE FUNCTIONS -- */
et2_dataview_controller.prototype._getIndexEntry = function (_idx) {
_getIndexEntry(_idx) {
// Create an entry in the index map if it does not exist yet
if (typeof this._indexMap[_idx] === "undefined") {
this._indexMap[_idx] = {
@ -291,7 +279,7 @@ var et2_dataview_controller = /** @class */ (function () {
// index does not get updated any further
this._indexMap[_idx]["idx"] = _idx;
return this._indexMap[_idx];
};
}
/**
* Inserts a new data row into the grid. index and uid are derived from the
* given management entry. If the data for the given uid does not exist yet,
@ -306,8 +294,7 @@ var et2_dataview_controller = /** @class */ (function () {
* @return true, if all data for the row has been available, false
* otherwise.
*/
et2_dataview_controller.prototype._insertDataRow = function (_entry, _update) {
var _this = this;
_insertDataRow(_entry, _update) {
// Abort if the entry already has a row but the _insert flag is not set
if (_entry.row && !_update) {
return true;
@ -350,9 +337,9 @@ var et2_dataview_controller = /** @class */ (function () {
}
// Update index map only for push (autorefresh disabled)
if (this._indexMap[_entry.idx] && this._indexMap[_entry.idx].uid !== _entry.uid) {
var max = parseInt(Object.keys(this._indexMap).reduce(function (a, b) { return _this._indexMap[a] > _this._indexMap[b] ? a : b; }));
for (var idx = max; idx >= _entry.idx; idx--) {
var entry = this._indexMap[idx];
let max = parseInt(Object.keys(this._indexMap).reduce((a, b) => this._indexMap[a] > this._indexMap[b] ? a : b));
for (let idx = max; idx >= _entry.idx; idx--) {
let entry = this._indexMap[idx];
this._indexMap[idx].idx = idx + 1;
this._indexMap[this._indexMap[idx].idx] = this._indexMap[idx];
if (this._selectionMgr && this._selectionMgr._registeredRows[entry.uid]) {
@ -362,16 +349,16 @@ var et2_dataview_controller = /** @class */ (function () {
}
this._indexMap[_entry.idx] = _entry;
return this.hasData;
};
}
/**
* Create a new row.
*
* @param {type} ctx
* @returns {et2_dataview_container}
*/
et2_dataview_controller.prototype._createRow = function (ctx) {
return new et2_dataview_view_row_1.et2_dataview_row(this._grid);
};
_createRow(ctx) {
return new et2_dataview_row(this._grid);
}
/**
* Function which gets called by the grid when data is requested.
*
@ -379,7 +366,7 @@ var et2_dataview_controller = /** @class */ (function () {
* requested.
* @param _idxEnd is the index of the last requested row.
*/
et2_dataview_controller.prototype._gridCallback = function (_idxStart, _idxEnd) {
_gridCallback(_idxStart, _idxEnd) {
var needsData = false;
// Iterate over all elements the dataview requested and create a row
// which indicates that we are currently loading data
@ -395,12 +382,12 @@ var et2_dataview_controller = /** @class */ (function () {
if (needsData !== false) {
this._queueFetch(et2_bounds(needsData, _idxEnd + 1), needsData == _idxStart ? 0 : needsData > _idxStart ? 1 : -1, false);
}
};
}
/**
* The _queueFetch function is used to queue a fetch request.
* TODO: Refresh is currently not used
*/
et2_dataview_controller.prototype._queueFetch = function (_range, _direction, _isUpdate) {
_queueFetch(_range, _direction, _isUpdate) {
// Force immediate to be false
_isUpdate = _isUpdate ? _isUpdate : false;
// Push the requests onto the request queue
@ -422,11 +409,11 @@ var et2_dataview_controller = /** @class */ (function () {
if (_isUpdate) {
this._flushQueue(true);
}
};
}
/**
* Flushes the queue.
*/
et2_dataview_controller.prototype._flushQueue = function (_isUpdate) {
_flushQueue(_isUpdate) {
// Clear any still existing timer
this._clearTimer();
// Mark all elements in a radius of ET2_DATAVIEW_STEPSIZE
@ -496,20 +483,21 @@ var et2_dataview_controller = /** @class */ (function () {
"self": this,
"start": query.start,
"count": query.num_rows,
"lastModification": this._lastModification
"lastModification": this._lastModification,
prefix: undefined
};
if (this.dataStorePrefix) {
ctx.prefix = this.dataStorePrefix;
}
this._queueRequest(query, ctx);
}
};
}
/**
* Queue a request for data
* @param {Object} query
* @param {Object} ctx
*/
et2_dataview_controller.prototype._queueRequest = function (query, ctx) {
_queueRequest(query, ctx) {
this._request_queue.push({
query: query,
context: ctx,
@ -517,11 +505,11 @@ var et2_dataview_controller = /** @class */ (function () {
status: 0
});
this._fetchQueuedRequest();
};
}
/**
* Fetch data for a queued request, subject to rate limit
*/
et2_dataview_controller.prototype._fetchQueuedRequest = function () {
_fetchQueuedRequest() {
// Check to see if there's room
var count = 0;
for (var i = 0; i < this._request_queue.length; i++) {
@ -558,20 +546,20 @@ var et2_dataview_controller = /** @class */ (function () {
request.status = 1;
// Call the callback
this._dataProvider.dataFetch(request.query, this._fetchCallback, request.context);
};
et2_dataview_controller.prototype._clearTimer = function () {
}
_clearTimer() {
// Reset the queue timer upon destruction
if (this._queueTimer) {
window.clearTimeout(this._queueTimer);
this._queueTimer = null;
}
};
}
/**
* Called by the data source when the data changes
*
* @param _data Object|null New data, or null. Null will remove the row.
*/
et2_dataview_controller.prototype._dataCallback = function (_data) {
_dataCallback(_data) {
// Set the "hasData" flag
this.self.hasData = true;
// Call the row callback with the new data -- the row callback then
@ -617,11 +605,11 @@ var et2_dataview_controller = /** @class */ (function () {
// Invalidate the current row entry
this.entry.row.invalidate();
}
};
}
/**
*
*/
et2_dataview_controller.prototype._destroyCallback = function (_row) {
_destroyCallback(_row) {
// Unregister the row from the selection manager, if not selected
// If it is selected, leave it there - allows selecting rows and scrolling
var selection = this.self._selectionMgr._getRegisteredRowsEntry(this.entry.uid);
@ -634,18 +622,18 @@ var et2_dataview_controller = /** @class */ (function () {
this.entry.row = null;
// Unregister the data callback
this.self._dataProvider.dataUnregisterUID(this.entry.uid, this.self._dataCallback, this);
};
}
/**
* Returns an array containing "_count" index mapping entries starting from
* the index given in "_start".
*/
et2_dataview_controller.prototype._getIndexMapping = function (_start, _count) {
_getIndexMapping(_start, _count) {
var result = [];
for (var i = _start; i < _start + _count; i++) {
result.push(this._getIndexEntry(i));
}
return result;
};
}
/**
* Updates the grid according to the new order. The function simply does the
* following: It iterates along the new order (given in _order) and the old
@ -665,7 +653,7 @@ var et2_dataview_controller = /** @class */ (function () {
* newly created index entries are returned. This function does not update
* the internal mapping in _idxMap.
*/
et2_dataview_controller.prototype._updateOrder = function (_start, _count, _idxMap, _order) {
_updateOrder(_start, _count, _idxMap, _order) {
// The result contains the newly created index map entries which have to
// be merged with the result
var result = [];
@ -712,8 +700,8 @@ var et2_dataview_controller = /** @class */ (function () {
}
}
return result;
};
et2_dataview_controller.prototype._mergeResult = function (_newEntries, _invalidStartIdx, _diff, _total) {
}
_mergeResult(_newEntries, _invalidStartIdx, _diff, _total) {
if (_newEntries.length > 0 || _diff > 0) {
// Create a new index map
var newMap = {};
@ -744,8 +732,8 @@ var et2_dataview_controller = /** @class */ (function () {
this._indexMap = newMap;
this._selectionMgr.setIndexMap(newMap);
}
};
et2_dataview_controller.prototype._fetchCallback = function (_response) {
}
_fetchCallback(_response) {
// Remove answered request from queue
var request = null;
for (var i = 0; i < this.self._request_queue.length; i++) {
@ -798,11 +786,11 @@ var et2_dataview_controller = /** @class */ (function () {
this.self._grid.invalidate();
// Check if requests are waiting
this.self._fetchQueuedRequest();
};
}
/**
* Insert an empty / placeholder row when there is no data to display
*/
et2_dataview_controller.prototype._emptyRow = function (_noRows) {
_emptyRow(_noRows) {
var noRows = !_noRows ? false : true;
jQuery(".egwGridView_empty", this._grid.innerTbody).remove();
if (typeof this._grid._rowProvider != "undefined" && this._grid._rowProvider.getPrototype("empty")) {
@ -821,26 +809,24 @@ var et2_dataview_controller = /** @class */ (function () {
this._selectionMgr.registerRow("", 0, placeholder.get(0), links);
}
}
};
}
/**
* Callback function used by the selection manager to translate the selected
* range to uids.
*/
et2_dataview_controller.prototype._selectionFetchRange = function (_range, _callback, _context) {
_selectionFetchRange(_range, _callback, _context) {
this._dataProvider.dataFetch({ "start": _range.top, "num_rows": _range.bottom - _range.top + 1,
"no_data": true }, function (_response) {
_callback.call(_context, _response.order);
}, _context);
};
}
/**
* Tells the grid to make the given index visible.
*/
et2_dataview_controller.prototype._makeIndexVisible = function (_idx) {
_makeIndexVisible(_idx) {
this._grid.makeIndexVisible(_idx);
};
// Maximum concurrent data requests. Additional ones are held in the queue.
et2_dataview_controller.CONCURRENT_REQUESTS = 5;
return et2_dataview_controller;
}());
exports.et2_dataview_controller = et2_dataview_controller;
}
}
// Maximum concurrent data requests. Additional ones are held in the queue.
et2_dataview_controller.CONCURRENT_REQUESTS = 5;
//# sourceMappingURL=et2_dataview_controller.js.map

View File

@ -4,9 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-2012
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
et2_core_common;
@ -24,14 +25,16 @@ import {et2_IDataProvider} from "./et2_dataview_interfaces";
import {et2_dataview_selectionManager} from "./et2_dataview_controller_selection";
import {et2_dataview_row} from "./et2_dataview_view_row";
import {et2_dataview_grid} from "./et2_dataview_view_grid";
import {et2_arrayIntKeys, et2_bounds} from "./et2_core_common";
import {egw} from "../jsapi/egw_global";
/**
* The fetch timeout specifies the time during which the controller tries to
* consolidate requests for rows.
*/
var ET2_DATAVIEW_FETCH_TIMEOUT = 50;
export const ET2_DATAVIEW_FETCH_TIMEOUT = 50;
var ET2_DATAVIEW_STEPSIZE = 50;
export const ET2_DATAVIEW_STEPSIZE = 50;
/**
* The et2_dataview_controller class is the intermediate layer between a grid
@ -43,24 +46,25 @@ export class et2_dataview_controller
// Maximum concurrent data requests. Additional ones are held in the queue.
public static readonly CONCURRENT_REQUESTS = 5;
private _parentController: any;
private _grid: et2_dataview_grid;
private dataStorePrefix: any;
protected _parentController: any;
protected _grid: et2_dataview_grid;
protected dataStorePrefix: any;
private _dataProvider: any;
private _rowCallback: any;
private _linkCallback: any;
protected _rowCallback: any;
protected _linkCallback: any;
private _context: any;
private _children: any[];
private _indexMap: any = {};
protected _children: any[];
protected _indexMap: any = {};
private _queueTimer: number;
private _lastModification: number;
private _queue: {};
private _request_queue: any[];
private _selectionMgr: et2_dataview_selectionManager;
protected _selectionMgr: et2_dataview_selectionManager;
private _objectManager: any;
protected _objectManager: any;
private hasData: boolean;
/**
* Constructor of the et2_dataview_controller, connects to the grid
@ -679,7 +683,8 @@ export class et2_dataview_controller
"self": this,
"start": query.start,
"count": query.num_rows,
"lastModification": this._lastModification
"lastModification": this._lastModification,
prefix: undefined
};
if(this.dataStorePrefix)
{

View File

@ -1,22 +1,22 @@
"use strict";
/**
* EGroupware eTemplate2
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-2012
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
et2_dataview_view_aoi;
egw_action.egw_keymanager;
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_selectionManager = void 0;
import { egw } from "../jsapi/egw_global";
import { et2_bounds } from "./et2_core_common";
import { et2_dialog } from "./et2_widget_dialog";
import { et2_createWidget } from "./et2_core_widget";
/**
* The selectioManager is internally used by the et2_dataview_controller class
* to manage the row selection.
@ -28,7 +28,7 @@ exports.et2_dataview_selectionManager = void 0;
*
* @augments Class
*/
var et2_dataview_selectionManager = /** @class */ (function () {
export class et2_dataview_selectionManager {
/**
* Constructor
*
@ -40,7 +40,7 @@ var et2_dataview_selectionManager = /** @class */ (function () {
* @param _context
* @memberOf et2_dataview_selectionManager
*/
function et2_dataview_selectionManager(_parent, _indexMap, _actionObjectManager, _queryRangeCallback, _makeVisibleCallback, _context) {
constructor(_parent, _indexMap, _actionObjectManager, _queryRangeCallback, _makeVisibleCallback, _context) {
// Copy the arguments
this._parent = _parent;
this._indexMap = _indexMap;
@ -68,7 +68,7 @@ var et2_dataview_selectionManager = /** @class */ (function () {
// Callback for when the selection changes
this.select_callback = null;
}
et2_dataview_selectionManager.prototype.destroy = function () {
destroy() {
// If we have a parent, unregister from that
if (this._parent) {
var idx = this._parent._children.indexOf(this);
@ -83,8 +83,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
this.unregisterRow(key, this._registeredRows[key].tr);
}
this.select_callback = null;
};
et2_dataview_selectionManager.prototype.clear = function () {
}
clear() {
for (var key in this._registeredRows) {
this.unregisterRow(key, this._registeredRows[key].tr);
delete this._registeredRows[key];
@ -100,14 +100,14 @@ var et2_dataview_selectionManager = /** @class */ (function () {
this._invertSelection = false;
this._selectAll = false;
this._inUpdate = false;
};
et2_dataview_selectionManager.prototype.setIndexMap = function (_indexMap) {
}
setIndexMap(_indexMap) {
this._indexMap = _indexMap;
};
et2_dataview_selectionManager.prototype.setTotalCount = function (_total) {
}
setTotalCount(_total) {
this._total = _total;
};
et2_dataview_selectionManager.prototype.registerRow = function (_uid, _idx, _tr, _links) {
}
registerRow(_uid, _idx, _tr, _links) {
// Get the corresponding entry from the registered rows array
var entry = this._getRegisteredRowsEntry(_uid);
// If the row has changed unregister the old one and do not delete
@ -127,8 +127,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
entry.tr = _tr;
// Update the visible state of the _tr
this._updateEntryState(entry, entry.state);
};
et2_dataview_selectionManager.prototype.unregisterRow = function (_uid, _tr, _noDelete) {
}
unregisterRow(_uid, _tr, _noDelete) {
// _noDelete defaults to false
_noDelete = _noDelete ? true : false;
if (typeof this._registeredRows[_uid] !== "undefined"
@ -152,8 +152,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
}
this._inUpdate = false;
}
};
et2_dataview_selectionManager.prototype.resetSelection = function () {
}
resetSelection() {
this._invertSelection = false;
this._selectAll = false;
this._actionObjectManager.setAllSelected(false);
@ -163,17 +163,17 @@ var et2_dataview_selectionManager = /** @class */ (function () {
for (var i = 0; i < this._children.length; i++) {
this._children[i].resetSelection();
}
};
et2_dataview_selectionManager.prototype.setSelected = function (_uid, _selected) {
}
setSelected(_uid, _selected) {
this._selectAll = false;
var entry = this._getRegisteredRowsEntry(_uid);
this._updateEntryState(entry, egwSetBit(entry.state, EGW_AO_STATE_SELECTED, _selected));
};
et2_dataview_selectionManager.prototype.getAllSelected = function () {
}
getAllSelected() {
var selected = this.getSelected();
return selected.all || (selected.ids.length === this._total);
};
et2_dataview_selectionManager.prototype.setFocused = function (_uid, _focused) {
}
setFocused(_uid, _focused) {
// Reset the state of the currently focused entry
if (this._focusedEntry) {
this._updateEntryState(this._focusedEntry, egwSetBit(this._focusedEntry.state, EGW_AO_STATE_FOCUSED, false));
@ -185,8 +185,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
var entry = this._focusedEntry = this._getRegisteredRowsEntry(_uid);
this._updateEntryState(entry, egwSetBit(entry.state, EGW_AO_STATE_FOCUSED, true));
}
};
et2_dataview_selectionManager.prototype.selectAll = function () {
}
selectAll() {
// Reset the selection
this.resetSelection();
this._selectAll = true;
@ -203,8 +203,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
this._updateEntryState(entry, entry.state);
}
this._selectAll = true;
};
et2_dataview_selectionManager.prototype.getSelected = function () {
}
getSelected() {
// Collect all currently selected ids
var ids = [];
for (var key in this._registeredRows) {
@ -223,9 +223,9 @@ var et2_dataview_selectionManager = /** @class */ (function () {
"all": this._selectAll,
"ids": ids
};
};
}
/** -- PRIVATE FUNCTIONS -- **/
et2_dataview_selectionManager.prototype._attachActionObjectInterface = function (_entry, _tr, _uid) {
_attachActionObjectInterface(_entry, _tr, _uid) {
// Create the AOI which is used internally in the selection manager
// this AOI is not connected to the AO, as the selection manager
// cares about selection etc.
@ -236,8 +236,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
this._handleSelect(_uid, _entry, egwBitIsSet(_shiftState, EGW_AO_SHIFT_STATE_BLOCK), egwBitIsSet(_shiftState, EGW_AO_SHIFT_STATE_MULTI));
}
}, this);
};
et2_dataview_selectionManager.prototype._getDummyAOI = function (_entry, _tr, _uid, _idx) {
}
_getDummyAOI(_entry, _tr, _uid, _idx) {
// Create AOI
var dummyAOI = new egwActionObjectInterface();
var self = this;
@ -261,8 +261,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
// handlers can be properly bound
dummyAOI.getDOMNode = function () { return _tr; };
return dummyAOI;
};
et2_dataview_selectionManager.prototype._attachActionObject = function (_entry, _tr, _uid, _links, _idx) {
}
_attachActionObject(_entry, _tr, _uid, _links, _idx) {
// Get the dummyAOI which connects the action object to the tr but
// does no selection handling
var dummyAOI = this._getDummyAOI(_entry, _tr, _uid, _idx);
@ -322,13 +322,13 @@ var et2_dataview_selectionManager = /** @class */ (function () {
}
return result;
};
};
et2_dataview_selectionManager.prototype._updateState = function (_uid, _state) {
}
_updateState(_uid, _state) {
var entry = this._getRegisteredRowsEntry(_uid);
this._updateEntryState(entry, _state);
return entry;
};
et2_dataview_selectionManager.prototype._updateEntryState = function (_entry, _state) {
}
_updateEntryState(_entry, _state) {
if (this._selectAll) {
_state |= EGW_AO_STATE_SELECTED;
}
@ -371,8 +371,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
}
// Update the state of the entry
_entry.state = _state;
};
et2_dataview_selectionManager.prototype._getRegisteredRowsEntry = function (_uid) {
}
_getRegisteredRowsEntry(_uid) {
if (typeof this._registeredRows[_uid] === "undefined") {
this._registeredRows[_uid] = {
"uid": _uid,
@ -384,8 +384,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
};
}
return this._registeredRows[_uid];
};
et2_dataview_selectionManager.prototype._handleSelect = function (_uid, _entry, _shift, _ctrl) {
}
_handleSelect(_uid, _entry, _shift, _ctrl) {
// If not "_ctrl" is set, reset the selection
if (!_ctrl) {
var top = this;
@ -408,8 +408,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
if (this.select_callback && typeof this.select_callback == "function") {
this.select_callback.apply(this._context, arguments);
}
};
et2_dataview_selectionManager.prototype._selectRange = function (_start, _stop) {
}
_selectRange(_start, _stop) {
// Contains ranges that are not currently in the index map and that have
// to be queried
var queryRanges = [];
@ -455,8 +455,8 @@ var et2_dataview_selectionManager = /** @class */ (function () {
if (queryRanges.length > 0) {
this._query_ranges(queryRanges);
}
};
et2_dataview_selectionManager.prototype._query_ranges = function (queryRanges) {
}
_query_ranges(queryRanges) {
var that = this;
var record_count = 0;
var range_index = 0;
@ -513,11 +513,9 @@ var et2_dataview_selectionManager = /** @class */ (function () {
fetchPromise.finally(function () {
dialog.destroy();
});
};
// Maximum number of rows we can safely fetch for selection
// Actual selection may have more rows if we already have some
et2_dataview_selectionManager.MAX_SELECTION = 1000;
return et2_dataview_selectionManager;
}());
exports.et2_dataview_selectionManager = et2_dataview_selectionManager;
}
}
// Maximum number of rows we can safely fetch for selection
// Actual selection may have more rows if we already have some
et2_dataview_selectionManager.MAX_SELECTION = 1000;
//# sourceMappingURL=et2_dataview_controller_selection.js.map

View File

@ -4,10 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-2012
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
et2_dataview_view_aoi;
@ -15,6 +15,11 @@
egw_action.egw_keymanager;
*/
import {egw} from "../jsapi/egw_global";
import {et2_bounds} from "./et2_core_common";
import {et2_dialog} from "./et2_widget_dialog";
import {et2_createWidget} from "./et2_core_widget";
/**
* The selectioManager is internally used by the et2_dataview_controller class
* to manage the row selection.
@ -41,8 +46,8 @@ export class et2_dataview_selectionManager
private select_callback: null;
private _context: any;
private _registeredRows: {};
private _focusedEntry: null;
_registeredRows: {};
_focusedEntry: null;
private _invertSelection: boolean;
private _selectAll: boolean;
private _inUpdate: boolean;

View File

@ -1,26 +1,27 @@
"use strict";
/**
* EGroupware eTemplate2 - Contains interfaces used inside the dataview
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
Object.defineProperty(exports, "__esModule", { value: true });
var et2_dataviewIInvalidatable = "et2_dataview_IInvalidatable";
function implements_et2_dataview_IInvalidatable(obj) {
/*egw:uses
et2_core_inheritance;
*/
import { implements_methods, et2_implements_registry } from "./et2_core_interfaces";
export const et2_dataviewIInvalidatable = "et2_dataview_IInvalidatable";
et2_implements_registry.et2_dataview_IInvalidatable = function (obj) {
return implements_methods(obj, ["invalidate"]);
}
var et2_dataview_IViewRange = "et2_dataview_IViewRange";
function implements_et2_dataview_IViewRange(obj) {
};
export const et2_dataview_IViewRange = "et2_dataview_IViewRange";
et2_implements_registry.et2_dataview_IViewRange = function (obj) {
return implements_methods(obj, ["setViewRange"]);
}
var et2_IDataProvider = "et2_IDataProvider";
function implements_et2_IDataProvider(obj) {
};
export const et2_IDataProvider = "et2_IDataProvider";
et2_implements_registry.et2_IDataProvider = function (obj) {
return implements_methods(obj, ["dataFetch", "dataRegisterUID", "dataUnregisterUID"]);
}
};
//# sourceMappingURL=et2_dataview_interfaces.js.map

View File

@ -4,22 +4,24 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
et2_core_inheritance;
*/
import {implements_methods,et2_implements_registry} from "./et2_core_interfaces";
import type {et2_widget} from "./et2_core_widget";
export interface et2_dataview_IInvalidatable
{
invalidate()
}
var et2_dataviewIInvalidatable = "et2_dataview_IInvalidatable";
function implements_et2_dataview_IInvalidatable(obj : et2_widget)
export const et2_dataviewIInvalidatable = "et2_dataview_IInvalidatable";
et2_implements_registry.et2_dataview_IInvalidatable = function(obj : et2_widget)
{
return implements_methods(obj, ["invalidate"]);
}
@ -27,8 +29,8 @@ export interface et2_dataview_IViewRange
{
setViewRange(_range)
}
var et2_dataview_IViewRange = "et2_dataview_IViewRange";
function implements_et2_dataview_IViewRange(obj : et2_widget)
export const et2_dataview_IViewRange = "et2_dataview_IViewRange";
et2_implements_registry.et2_dataview_IViewRange = function(obj : et2_widget)
{
return implements_methods(obj, ["setViewRange"]);
}
@ -101,8 +103,8 @@ export interface et2_IDataProvider
dataUnregisterUID (_uid : string, _callback : Function, _context : object)
}
var et2_IDataProvider = "et2_IDataProvider";
function implements_et2_IDataProvider(obj : et2_widget)
export const et2_IDataProvider = "et2_IDataProvider";
et2_implements_registry.et2_IDataProvider = function(obj : et2_widget)
{
return implements_methods(obj, ["dataFetch", "dataRegisterUID", "dataUnregisterUID"]);
}

201
api/js/etemplate/et2_dataview_model_columns.js Executable file → Normal file
View File

@ -1,31 +1,28 @@
"use strict";
/**
* EGroupware eTemplate2 - Class which contains a the columns model
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_columns = exports.et2_dataview_column = void 0;
/*egw:uses
et2_core_inheritance;
et2_inheritance;
*/
import { egw } from "../jsapi/egw_global";
/**
* Class which stores the data of a single column.
*
* @augments Class
*/
var et2_dataview_column = /** @class */ (function () {
export class et2_dataview_column {
/**
* Constructor
*/
function et2_dataview_column(_attrs) {
constructor(_attrs) {
/**
* Defines the visibility state of this column.
*/
@ -78,7 +75,7 @@ var et2_dataview_column = /** @class */ (function () {
*
* @param {float|string} _value
*/
et2_dataview_column.prototype.set_width = function (_value) {
set_width(_value) {
// Parse the width parameter.
this.relativeWidth = false;
this.fixedWidth = false;
@ -99,8 +96,8 @@ var et2_dataview_column = /** @class */ (function () {
else if (typeof w == 'string' && !isNaN(parseFloat(w))) {
this.fixedWidth = parseInt(w);
}
};
et2_dataview_column.prototype.set_visibility = function (_value) {
}
set_visibility(_value) {
// If visibility is always, don't turn it off
if (this.visibility == et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS || this.visibility == et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS_NOSELECT)
return;
@ -116,68 +113,66 @@ var et2_dataview_column = /** @class */ (function () {
else {
egw().debug("warn", "Invalid visibility option for column: ", _value);
}
};
et2_dataview_column.ET2_COL_TYPE_DEFAULT = 0;
et2_dataview_column.ET2_COL_TYPE_NAME_ICON_FIXED = 1;
et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS = 0;
et2_dataview_column.ET2_COL_VISIBILITY_VISIBLE = 1;
et2_dataview_column.ET2_COL_VISIBILITY_INVISIBLE = 2;
et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS_NOSELECT = 3;
et2_dataview_column.ET2_COL_VISIBILITY_DISABLED = 4;
et2_dataview_column._attributes = {
"id": {
"name": "ID",
"type": "string",
"description": "Unique identifier for this column. It is used to " +
"store changed column widths or visibilities."
},
"visibility": {
"name": "Visibility",
"type": "integer",
"default": et2_dataview_column.ET2_COL_VISIBILITY_VISIBLE,
"description": "Defines the visibility state of this column."
},
"caption": {
"name": "Caption",
"type": "string",
"description": "Caption of the column as it is displayed in the " +
"select columns popup."
},
"type": {
"name": "Column type",
"type": "integer",
"default": et2_dataview_column.ET2_COL_TYPE_DEFAULT,
"description": "Type of the column"
},
"width": {
"name": "Width",
"type": "dimension",
"default": "80px",
"description": "Width of the column."
},
"minWidth": {
"name": "Minimum width",
"type": "integer",
"default": 20,
"description": "Minimum width of the column, in pixels. Values below this are rejected."
},
"maxWidth": {
"name": "Maximum width",
"type": "integer",
"default": 0,
"description": "Maximum width of the column"
}
};
return et2_dataview_column;
}());
exports.et2_dataview_column = et2_dataview_column;
}
}
et2_dataview_column.ET2_COL_TYPE_DEFAULT = 0;
et2_dataview_column.ET2_COL_TYPE_NAME_ICON_FIXED = 1;
et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS = 0;
et2_dataview_column.ET2_COL_VISIBILITY_VISIBLE = 1;
et2_dataview_column.ET2_COL_VISIBILITY_INVISIBLE = 2;
et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS_NOSELECT = 3;
et2_dataview_column.ET2_COL_VISIBILITY_DISABLED = 4;
et2_dataview_column._attributes = {
"id": {
"name": "ID",
"type": "string",
"description": "Unique identifier for this column. It is used to " +
"store changed column widths or visibilities."
},
"visibility": {
"name": "Visibility",
"type": "integer",
"default": et2_dataview_column.ET2_COL_VISIBILITY_VISIBLE,
"description": "Defines the visibility state of this column."
},
"caption": {
"name": "Caption",
"type": "string",
"description": "Caption of the column as it is displayed in the " +
"select columns popup."
},
"type": {
"name": "Column type",
"type": "integer",
"default": et2_dataview_column.ET2_COL_TYPE_DEFAULT,
"description": "Type of the column"
},
"width": {
"name": "Width",
"type": "dimension",
"default": "80px",
"description": "Width of the column."
},
"minWidth": {
"name": "Minimum width",
"type": "integer",
"default": 20,
"description": "Minimum width of the column, in pixels. Values below this are rejected."
},
"maxWidth": {
"name": "Maximum width",
"type": "integer",
"default": 0,
"description": "Maximum width of the column"
}
};
/**
* Contains logic for the columns class. The columns class represents the unique set
* of columns a grid view owns. The parameters of the columns (except for visibility)
* do normaly not change.
*/
var et2_dataview_columns = /** @class */ (function () {
function et2_dataview_columns(_columnData) {
export class et2_dataview_columns {
constructor(_columnData) {
// Initialize some variables
this._totalWidth = 0;
this._totalFixed = 0;
@ -189,71 +184,63 @@ var et2_dataview_columns = /** @class */ (function () {
}
this._updated = true;
}
et2_dataview_columns.prototype.destroy = function () {
destroy() {
// Free all column objects
for (var i = 0; i < this.columns.length; i++) {
this.columns[i] = null;
}
};
et2_dataview_columns.prototype.updated = function () {
}
updated() {
this._updated = true;
};
et2_dataview_columns.prototype.columnCount = function () {
}
columnCount() {
return this.columns.length;
};
Object.defineProperty(et2_dataview_columns.prototype, "totalWidth", {
get: function () {
return this._totalWidth;
},
enumerable: false,
configurable: true
});
Object.defineProperty(et2_dataview_columns.prototype, "totalFixed", {
get: function () {
return this._totalFixed ? this._totalFixed : 0;
},
enumerable: false,
configurable: true
});
}
get totalWidth() {
return this._totalWidth;
}
get totalFixed() {
return this._totalFixed ? this._totalFixed : 0;
}
/**
* Set the total width of the header row
*
* @param {(string|number)} _width
*/
et2_dataview_columns.prototype.setTotalWidth = function (_width) {
setTotalWidth(_width) {
if (_width != this._totalWidth && _width > 0) {
this._totalWidth = _width;
this._updated = true;
}
};
}
/**
* Returns the index of the colum with the given id
*
* @param {string} _id
*/
et2_dataview_columns.prototype.getColumnIndexById = function (_id) {
getColumnIndexById(_id) {
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].id == _id) {
return i;
}
}
return -1;
};
}
/**
* Returns the column with the given id
*
* @param {string} _id
*/
et2_dataview_columns.prototype.getColumnById = function (_id) {
getColumnById(_id) {
var idx = this.getColumnIndexById(_id);
return (idx == -1) ? null : this.columns[idx];
};
}
/**
* Returns the width of the column with the given index
*
* @param {number} _idx
*/
et2_dataview_columns.prototype.getColumnWidth = function (_idx) {
getColumnWidth(_idx) {
if (this._totalWidth > 0 && _idx >= 0 && _idx < this.columns.length) {
// Recalculate the column widths if something has changed.
if (this._updated) {
@ -264,12 +251,12 @@ var et2_dataview_columns = /** @class */ (function () {
return this.columnWidths[_idx];
}
return 0;
};
}
/**
* Returns an array containing the width of the column and its visibility
* state.
*/
et2_dataview_columns.prototype.getColumnData = function () {
getColumnData() {
var result = [];
for (var i = 0; i < this.columns.length; i++) {
result.push({
@ -280,12 +267,12 @@ var et2_dataview_columns = /** @class */ (function () {
});
}
return result;
};
}
/**
* Returns an associative array which contains data about the visibility
* state of the columns.
*/
et2_dataview_columns.prototype.getColumnVisibilitySet = function () {
getColumnVisibilitySet() {
var result = {};
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].visibility != et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS_NOSELECT) {
@ -299,13 +286,13 @@ var et2_dataview_columns = /** @class */ (function () {
}
}
return result;
};
}
/**
* Sets a column visiblity set
*
* @param {object} _set
*/
et2_dataview_columns.prototype.setColumnVisibilitySet = function (_set) {
setColumnVisibilitySet(_set) {
for (var k in _set) {
var col = this.getColumnById(k);
if (col) {
@ -314,16 +301,16 @@ var et2_dataview_columns = /** @class */ (function () {
}
}
this._updated = true;
};
}
/* ---- PRIVATE FUNCTIONS ---- */
/**
* Calculates the absolute column width depending on the previously set
* "totalWidth" value. The calculated values are stored in the columnWidths
* array.
*/
et2_dataview_columns.prototype._calculateWidths = function () {
_calculateWidths() {
// Reset some values which are used during the calculation
var _larger = Array(this.columns.length);
let _larger = Array(this.columns.length);
for (var i = 0; i < this.columns.length; i++) {
_larger[i] = false;
}
@ -424,8 +411,6 @@ var et2_dataview_columns = /** @class */ (function () {
this.columnWidths[columnIndex] = Math.max(column.minWidth, this.columnWidths[columnIndex] - remaining_width);
}
}
};
return et2_dataview_columns;
}());
exports.et2_dataview_columns = et2_dataview_columns;
}
}
//# sourceMappingURL=et2_dataview_model_columns.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
@ -16,6 +15,8 @@
*/
import {egw} from "../jsapi/egw_global";
/**
* Class which stores the data of a single column.
*

View File

@ -4,148 +4,114 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2012
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
egw_action.egw_action_common;
egw_action.egw_action;
/vendor/bower-asset/jquery-touchswipe/jquery.touchSwipe.js;
egw_action.egw_action_common;
egw_action.egw_action;
/vendor/bower-asset/jquery-touchswipe/jquery.touchSwipe.js;
*/
/**
* Contains the action object interface implementation for the nextmatch widget
* row.
*/
var EGW_SELECTMODE_DEFAULT = 0;
var EGW_SELECTMODE_TOGGLE = 1;
export const EGW_SELECTMODE_DEFAULT = 0;
export const EGW_SELECTMODE_TOGGLE = 1;
/**
* An action object interface for each nextmatch widget row - "inherits" from
* egwActionObjectInterface
*
* @param {DOMNode} _node
*/
function et2_dataview_rowAOI(_node)
{
"use strict";
var aoi = new egwActionObjectInterface();
aoi.node = _node;
aoi.selectMode = EGW_SELECTMODE_DEFAULT;
aoi.checkBox = null; //(jQuery(":checkbox", aoi.node))[0];
// Rows without a checkbox OR an id set are unselectable
aoi.doGetDOMNode = function() {
return aoi.node;
};
// Prevent the browser from selecting the content of the element, when
// a special key is pressed.
jQuery(_node).mousedown(egwPreventSelect);
/**
* Now append some action code to the node
*
* @memberOf et2_dataview_rowAOI
* @param {DOMEvent} e
* @param {object} _params
*/
var selectHandler = function(e, _params) {
// Reset the focus so that keyboard navigation will work properly
// after the element has been clicked
egwUnfocus();
// Reset the prevent selection code (in order to allow wanted
// selection of text)
_node.onselectstart = null;
if (e.target != aoi.checkBox)
{
var selected = egwBitIsSet(aoi.getState(), EGW_AO_STATE_SELECTED);
var state = egwGetShiftState(e);
if (_params)
{
if (egwIsMobile())
{
switch (_params.swip)
{
case "left":
case "right":
state = 1;
// Hide context menu on swip actions
if(_egw_active_menu) _egw_active_menu.hide();
break;
case "up":
case "down":
return;
}
}
}
switch (aoi.selectMode)
{
case EGW_SELECTMODE_DEFAULT:
aoi.updateState(EGW_AO_STATE_SELECTED,
!egwBitIsSet(state, EGW_AO_SHIFT_STATE_MULTI) || !selected,
state);
break;
case EGW_SELECTMODE_TOGGLE:
aoi.updateState(EGW_AO_STATE_SELECTED, !selected,
egwSetBit(state, EGW_AO_SHIFT_STATE_MULTI, true));
break;
}
}
};
if (egwIsMobile()) {
jQuery(_node).swipe({
allowPageScroll: "vertical",
longTapThreshold: 10,
swipe: function (event, direction, distance)
{
if (distance > 100) selectHandler(event, {swip:direction});
},
tap: function (event, duration)
{
selectHandler(event);
},
// stop scrolling touch being confused from tap
longTap: function (event)
{
return;
}
});
} else {
jQuery(_node).click(selectHandler);
}
jQuery(aoi.checkBox).change(function() {
aoi.updateState(EGW_AO_STATE_SELECTED, this.checked, EGW_AO_SHIFT_STATE_MULTI);
});
aoi.doSetState = function(_state) {
var selected = egwBitIsSet(_state, EGW_AO_STATE_SELECTED);
if (this.checkBox)
{
this.checkBox.checked = selected;
}
jQuery(this.node).toggleClass('focused',
egwBitIsSet(_state, EGW_AO_STATE_FOCUSED));
jQuery(this.node).toggleClass('selected',
selected);
};
return aoi;
export function et2_dataview_rowAOI(_node) {
"use strict";
var aoi = new egwActionObjectInterface();
aoi.node = _node;
aoi.selectMode = EGW_SELECTMODE_DEFAULT;
aoi.checkBox = null; //(jQuery(":checkbox", aoi.node))[0];
// Rows without a checkbox OR an id set are unselectable
aoi.doGetDOMNode = function () {
return aoi.node;
};
// Prevent the browser from selecting the content of the element, when
// a special key is pressed.
jQuery(_node).mousedown(egwPreventSelect);
/**
* Now append some action code to the node
*
* @memberOf et2_dataview_rowAOI
* @param {DOMEvent} e
* @param {object} _params
*/
var selectHandler = function (e, _params) {
// Reset the focus so that keyboard navigation will work properly
// after the element has been clicked
egwUnfocus();
// Reset the prevent selection code (in order to allow wanted
// selection of text)
_node.onselectstart = null;
if (e.target != aoi.checkBox) {
var selected = egwBitIsSet(aoi.getState(), EGW_AO_STATE_SELECTED);
var state = egwGetShiftState(e);
if (_params) {
if (egwIsMobile()) {
switch (_params.swip) {
case "left":
case "right":
state = 1;
// Hide context menu on swip actions
if (_egw_active_menu)
_egw_active_menu.hide();
break;
case "up":
case "down":
return;
}
}
}
switch (aoi.selectMode) {
case EGW_SELECTMODE_DEFAULT:
aoi.updateState(EGW_AO_STATE_SELECTED, !egwBitIsSet(state, EGW_AO_SHIFT_STATE_MULTI) || !selected, state);
break;
case EGW_SELECTMODE_TOGGLE:
aoi.updateState(EGW_AO_STATE_SELECTED, !selected, egwSetBit(state, EGW_AO_SHIFT_STATE_MULTI, true));
break;
}
}
};
if (egwIsMobile()) {
jQuery(_node).swipe({
allowPageScroll: "vertical",
longTapThreshold: 10,
swipe: function (event, direction, distance) {
if (distance > 100)
selectHandler(event, { swip: direction });
},
tap: function (event, duration) {
selectHandler(event);
},
// stop scrolling touch being confused from tap
longTap: function (event) {
return;
}
});
}
else {
jQuery(_node).click(selectHandler);
}
jQuery(aoi.checkBox).change(function () {
aoi.updateState(EGW_AO_STATE_SELECTED, this.checked, EGW_AO_SHIFT_STATE_MULTI);
});
aoi.doSetState = function (_state) {
var selected = egwBitIsSet(_state, EGW_AO_STATE_SELECTED);
if (this.checkBox) {
this.checkBox.checked = selected;
}
jQuery(this.node).toggleClass('focused', egwBitIsSet(_state, EGW_AO_STATE_FOCUSED));
jQuery(this.node).toggleClass('selected', selected);
};
return aoi;
}
//# sourceMappingURL=et2_dataview_view_aoi.js.map

View File

@ -0,0 +1,150 @@
/**
* EGroupware eTemplate2 - Contains interfaces used inside the dataview
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
egw_action.egw_action_common;
egw_action.egw_action;
/vendor/bower-asset/jquery-touchswipe/jquery.touchSwipe.js;
*/
/**
* Contains the action object interface implementation for the nextmatch widget
* row.
*/
export const EGW_SELECTMODE_DEFAULT = 0;
export const EGW_SELECTMODE_TOGGLE = 1;
/**
* An action object interface for each nextmatch widget row - "inherits" from
* egwActionObjectInterface
*
* @param {DOMNode} _node
*/
export function et2_dataview_rowAOI(_node)
{
"use strict";
var aoi = new egwActionObjectInterface();
aoi.node = _node;
aoi.selectMode = EGW_SELECTMODE_DEFAULT;
aoi.checkBox = null; //(jQuery(":checkbox", aoi.node))[0];
// Rows without a checkbox OR an id set are unselectable
aoi.doGetDOMNode = function() {
return aoi.node;
};
// Prevent the browser from selecting the content of the element, when
// a special key is pressed.
jQuery(_node).mousedown(egwPreventSelect);
/**
* Now append some action code to the node
*
* @memberOf et2_dataview_rowAOI
* @param {DOMEvent} e
* @param {object} _params
*/
var selectHandler = function(e, _params) {
// Reset the focus so that keyboard navigation will work properly
// after the element has been clicked
egwUnfocus();
// Reset the prevent selection code (in order to allow wanted
// selection of text)
_node.onselectstart = null;
if (e.target != aoi.checkBox)
{
var selected = egwBitIsSet(aoi.getState(), EGW_AO_STATE_SELECTED);
var state = egwGetShiftState(e);
if (_params)
{
if (egwIsMobile())
{
switch (_params.swip)
{
case "left":
case "right":
state = 1;
// Hide context menu on swip actions
if(_egw_active_menu) _egw_active_menu.hide();
break;
case "up":
case "down":
return;
}
}
}
switch (aoi.selectMode)
{
case EGW_SELECTMODE_DEFAULT:
aoi.updateState(EGW_AO_STATE_SELECTED,
!egwBitIsSet(state, EGW_AO_SHIFT_STATE_MULTI) || !selected,
state);
break;
case EGW_SELECTMODE_TOGGLE:
aoi.updateState(EGW_AO_STATE_SELECTED, !selected,
egwSetBit(state, EGW_AO_SHIFT_STATE_MULTI, true));
break;
}
}
};
if (egwIsMobile()) {
jQuery(_node).swipe({
allowPageScroll: "vertical",
longTapThreshold: 10,
swipe: function (event, direction, distance)
{
if (distance > 100) selectHandler(event, {swip:direction});
},
tap: function (event, duration)
{
selectHandler(event);
},
// stop scrolling touch being confused from tap
longTap: function (event)
{
return;
}
});
} else {
jQuery(_node).click(selectHandler);
}
jQuery(aoi.checkBox).change(function() {
aoi.updateState(EGW_AO_STATE_SELECTED, this.checked, EGW_AO_SHIFT_STATE_MULTI);
});
aoi.doSetState = function(_state) {
var selected = egwBitIsSet(_state, EGW_AO_STATE_SELECTED);
if (this.checkBox)
{
this.checkBox.checked = selected;
}
jQuery(this.node).toggleClass('focused',
egwBitIsSet(_state, EGW_AO_STATE_FOCUSED));
jQuery(this.node).toggleClass('selected',
selected);
};
return aoi;
}

View File

@ -1,17 +1,15 @@
"use strict";
/**
* EGroupware eTemplate2 - dataview code
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2012
* @copyright EGroupware GmbH 2011-2021
* @version $Id$
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_container = void 0;
import { et2_bounds } from "./et2_core_common";
/**
* The et2_dataview_container class is the main object each dataview consits of.
* Each row, spacer as well as the grid itself are containers. A container is
@ -28,7 +26,7 @@ exports.et2_dataview_container = void 0;
*
* @augments Class
*/
var et2_dataview_container = /** @class */ (function () {
export class et2_dataview_container {
/**
* Initializes the container object.
*
@ -36,7 +34,7 @@ var et2_dataview_container = /** @class */ (function () {
* interface. _parent may not be null.
* @memberOf et2_dataview_container
*/
function et2_dataview_container(_parent) {
constructor(_parent) {
// Copy the given invalidation element
this._parent = _parent;
this._nodes = [];
@ -53,14 +51,14 @@ var et2_dataview_container = /** @class */ (function () {
* should override this method and take care of unregistering all event
* handlers etc.
*/
et2_dataview_container.prototype.destroy = function () {
destroy() {
// Remove the nodes from the tree
this.removeFromTree();
// Call the callback function (if one is registered)
if (this._destroyCallback) {
this._destroyCallback.call(this._destroyContext, this);
}
};
}
/**
* Sets the "destroyCallback" -- the given function gets called whenever
* the container is destroyed. This instance is passed as an parameter to
@ -69,10 +67,10 @@ var et2_dataview_container = /** @class */ (function () {
* @param {function} _callback
* @param {object} _context
*/
et2_dataview_container.prototype.setDestroyCallback = function (_callback, _context) {
setDestroyCallback(_callback, _context) {
this._destroyCallback = _callback;
this._destroyContext = _context;
};
}
/**
* Inserts all container nodes into the DOM tree after or before the given
* element.
@ -83,13 +81,13 @@ var et2_dataview_container = /** @class */ (function () {
* or after the given node. Inserting before is needed for inserting the
* first element in front of an spacer.
*/
et2_dataview_container.prototype.insertIntoTree = function (_node, _prepend) {
insertIntoTree(_node, _prepend) {
if (!this._inTree && _node != null && this._nodes.length > 0) {
// Store the parent node and indicate that this element is now in
// the tree.
this._attachData = { node: _node, prepend: _prepend };
this._inTree = true;
for (var i = 0; i < this._nodes.length; i++) {
for (let i = 0; i < this._nodes.length; i++) {
if (i == 0) {
if (_prepend) {
_node.before(this._nodes[0]);
@ -107,28 +105,28 @@ var et2_dataview_container = /** @class */ (function () {
// parent
this.invalidate();
}
};
}
/**
* Removes all container nodes from the tree.
*/
et2_dataview_container.prototype.removeFromTree = function () {
removeFromTree() {
if (this._inTree) {
// Call the jQuery remove function to remove all nodes from the tree
// again.
for (var i = 0; i < this._nodes.length; i++) {
for (let i = 0; i < this._nodes.length; i++) {
this._nodes[i].remove();
}
// Reset the "attachData"
this._inTree = false;
this._attachData = { "node": null, "prepend": false };
}
};
}
/**
* Appends a node to the container.
*
* @param _node is the DOM-Node which should be appended.
*/
et2_dataview_container.prototype.appendNode = function (_node) {
appendNode(_node) {
// Add the given node to the "nodes" array
this._nodes.push(_node);
// If the container is already in the tree, attach the given node to the
@ -147,15 +145,15 @@ var et2_dataview_container = /** @class */ (function () {
}
this.invalidate();
}
};
}
/**
* Removes a certain node from the container
*
* @param {HTMLElement} _node
*/
et2_dataview_container.prototype.removeNode = function (_node) {
removeNode(_node) {
// Get the index of the node in the nodes array
var idx = this._nodes.indexOf(_node);
const idx = this._nodes.indexOf(_node);
if (idx >= 0) {
// Remove the node if the container is currently attached
if (this._inTree) {
@ -164,35 +162,35 @@ var et2_dataview_container = /** @class */ (function () {
// Remove the node from the nodes array
this._nodes.splice(idx, 1);
}
};
}
/**
* Returns the last node of the container - new nodes have to be appended
* after it.
*/
et2_dataview_container.prototype.getLastNode = function () {
getLastNode() {
if (this._nodes.length > 0) {
return this._nodes[this._nodes.length - 1];
}
return null;
};
}
/**
* Returns the first node of the container.
*/
et2_dataview_container.prototype.getFirstNode = function () {
getFirstNode() {
return this._nodes.length > 0 ? this._nodes[0] : null;
};
}
/**
* Returns the accumulated height of all container nodes. Only visible nodes
* (without "display: none" etc.) are taken into account.
*/
et2_dataview_container.prototype.getHeight = function () {
getHeight() {
if (this._height === -1 && this._inTree) {
this._height = 0;
// Setting this before measuring height helps with issues getting the
// wrong height due to margins & collapsed borders
this.tr.css('display', 'block');
// Increment the height value for each visible container node
for (var i = 0; i < this._nodes.length; i++) {
for (let i = 0; i < this._nodes.length; i++) {
if (et2_dataview_container._isVisible(this._nodes[i][0])) {
this._height += et2_dataview_container._nodeHeight(this._nodes[i][0]);
}
@ -200,7 +198,7 @@ var et2_dataview_container = /** @class */ (function () {
this.tr.css('display', '');
}
return (this._height === -1) ? 0 : this._height;
};
}
/**
* Returns a datastructure containing information used for calculating the
* average row height of a grid.
@ -210,64 +208,64 @@ var et2_dataview_container = /** @class */ (function () {
* avgCount: <the element count this calculation was based on>
* }
*/
et2_dataview_container.prototype.getAvgHeightData = function () {
getAvgHeightData() {
return {
"avgHeight": this.getHeight(),
"avgCount": 1
};
};
}
/**
* Returns the previously set "pixel top" of the container.
*/
et2_dataview_container.prototype.getTop = function () {
getTop() {
return this._top;
};
}
/**
* Returns the "pixel bottom" of the container.
*/
et2_dataview_container.prototype.getBottom = function () {
getBottom() {
return this._top + this.getHeight();
};
}
/**
* Returns the range of the element.
*/
et2_dataview_container.prototype.getRange = function () {
getRange() {
return et2_bounds(this.getTop(), this.getBottom());
};
}
/**
* Returns the index of the element.
*/
et2_dataview_container.prototype.getIndex = function () {
getIndex() {
return this._index;
};
}
/**
* Returns how many elements this container represents.
*/
et2_dataview_container.prototype.getCount = function () {
getCount() {
return 1;
};
}
/**
* Sets the top of the element.
*
* @param {number} _value
*/
et2_dataview_container.prototype.setTop = function (_value) {
setTop(_value) {
this._top = _value;
};
}
/**
* Sets the index of the element.
*
* @param {number} _value
*/
et2_dataview_container.prototype.setIndex = function (_value) {
setIndex(_value) {
this._index = _value;
};
}
/* -- et2_dataview_IInvalidatable -- */
/**
* Broadcasts an invalidation through the container tree. Marks the own
* height as invalid.
*/
et2_dataview_container.prototype.invalidate = function () {
invalidate() {
// Abort if this element is already marked as invalid.
if (this._height !== -1) {
// Delete the own, probably computed height
@ -275,7 +273,7 @@ var et2_dataview_container = /** @class */ (function () {
// Broadcast the invalidation to the parent element
this._parent.invalidate();
}
};
}
/* -- PRIVATE FUNCTIONS -- */
/**
* Used to check whether an element is visible or not (non recursive).
@ -284,31 +282,29 @@ var et2_dataview_container = /** @class */ (function () {
* only checked whether some stylesheet makes the element invisible, not if
* the given object is actually inside the DOM.
*/
et2_dataview_container._isVisible = function (_obj) {
static _isVisible(_obj) {
// Check whether the element is localy invisible
if (_obj.style && (_obj.style.display === "none"
|| _obj.style.visibility === "none")) {
return false;
}
// Get the computed style of the element
var style = window.getComputedStyle ? window.getComputedStyle(_obj, null)
const style = window.getComputedStyle ? window.getComputedStyle(_obj, null)
// @ts-ignore
: _obj.currentStyle;
if (style.display === "none" || style.visibility === "none") {
return false;
}
return true;
};
}
/**
* Returns the height of a node in pixels and zero if the element is not
* visible. The height is clamped to positive values.
*
* @param {HTMLElement} _node
*/
et2_dataview_container._nodeHeight = function (_node) {
static _nodeHeight(_node) {
return _node.offsetHeight;
};
return et2_dataview_container;
}());
exports.et2_dataview_container = et2_dataview_container;
}
}
//# sourceMappingURL=et2_dataview_view_container.js.map

View File

@ -4,9 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2012
* @copyright EGroupware GmbH 2011-2021
* @version $Id$
*/
@ -16,6 +16,7 @@
*/
import {et2_dataview_IInvalidatable} from "./et2_dataview_interfaces";
import {et2_bounds} from "./et2_core_common";
/**
* The et2_dataview_container class is the main object each dataview consits of.

File diff suppressed because it is too large Load Diff

View File

@ -4,11 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
@ -23,6 +22,8 @@ import {et2_dataview_IViewRange} from "./et2_dataview_interfaces";
import {et2_dataview_container} from "./et2_dataview_view_container";
import {et2_dataview_spacer} from "./et2_dataview_view_spacer";
import {et2_dataview_rowProvider} from "./et2_dataview_view_rowProvider";
import {et2_bounds, et2_range, et2_rangeEqual, et2_rangeIntersect} from "./et2_core_common";
import { egw } from "../jsapi/egw_global";
export class et2_dataview_grid extends et2_dataview_container implements et2_dataview_IViewRange
{
@ -65,16 +66,16 @@ export class et2_dataview_grid extends et2_dataview_container implements et2_dat
private _invalidateTimeout: number;
private _invalidateCallback: Function;
private _invalidateContext: null;
private doInvalidate : boolean;
doInvalidate : boolean;
private _map: any[];
private _viewRange: { top: any; bottom: any };
private _total: number;
_total: number;
private _avgHeight: number | boolean;
private _avgCount: number;
private scrollarea: any;
private innerTbody: any;
innerTbody: any;
private outerCell: JQuery;
@ -545,7 +546,7 @@ export class et2_dataview_grid extends et2_dataview_container implements et2_dat
const self = this;
const _super = super.invalidate();
this._invalidateTimeout = window.setTimeout(function() {
egw.debug("log","Dataview grid timed invalidate");
this.egw.debug("log","Dataview grid timed invalidate");
// Clear the "_avgHeight"
self._avgHeight = false;
self._avgCount = -1;
@ -794,8 +795,7 @@ export class et2_dataview_grid extends et2_dataview_container implements et2_dat
// Check which type the container object has
const isSpacer = container instanceof et2_dataview_spacer;
const hasIViewRange = !isSpacer
&& implements_et2_dataview_IViewRange(container);
const hasIViewRange = !isSpacer && container.implements(et2_dataview_IViewRange);
// If the container has one of those special types, calculate the
// view range and use that to update the view range of the element

View File

@ -1,30 +1,25 @@
"use strict";
/**
* EGroupware eTemplate2 - Functions which allow resizing of table headers
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_view_resizable = void 0;
import { egw } from "../jsapi/egw_global";
/**
* This set of functions is currently only supporting resizing in ew-direction
*/
var et2_dataview_view_resizable = /** @class */ (function () {
function et2_dataview_view_resizable() {
}
export class et2_dataview_view_resizable {
// In resize region returns whether the mouse is currently in the
// "resizeRegion"
et2_dataview_view_resizable.inResizeRegion = function (_x, _elem) {
static inResizeRegion(_x, _elem) {
var ol = _x - _elem.offset().left;
return (ol > (_elem.outerWidth(true) - et2_dataview_view_resizable.RESIZE_BORDER));
};
et2_dataview_view_resizable.startResize = function (_outerElem, _elem, _callback, _column) {
}
static startResize(_outerElem, _elem, _callback, _column) {
if (this.overlay == null || this.helper == null) {
// Prevent text selection
// FireFox handles highlight prevention (text selection) different than other browsers
@ -67,8 +62,8 @@ var et2_dataview_view_resizable = /** @class */ (function () {
}.bind(this))
.appendTo("body");
}
};
et2_dataview_view_resizable.stopResize = function (_outerElem) {
}
static stopResize(_outerElem) {
jQuery(_outerElem).removeClass('egwResizing');
if (this.helper != null) {
this.helper.remove();
@ -78,107 +73,105 @@ var et2_dataview_view_resizable = /** @class */ (function () {
this.overlay.remove();
this.overlay = null;
}
};
// Define some constants
et2_dataview_view_resizable.RESIZE_BORDER = 12;
et2_dataview_view_resizable.RESIZE_MIN_WIDTH = 25;
et2_dataview_view_resizable.RESIZE_ADD = 2; // Used to ensure mouse is under the resize element after resizing has finished
et2_dataview_view_resizable.helper = null;
et2_dataview_view_resizable.overlay = null;
et2_dataview_view_resizable.didResize = false;
et2_dataview_view_resizable.resizeWidth = 0;
et2_dataview_view_resizable.makeResizeable = function (_elem, _callback, _context) {
// Get the table surrounding the given element - this element is used to
// align the helper properly
var outerTable = _elem.closest("table");
// Bind the "mousemove" event in the "resize" namespace
_elem.bind("mousemove.resize", function (e) {
var stopResize = false;
// Stop switch to resize cursor if the mouse position
// is more intended for scrollbar not the resize edge
// 8pixel is an arbitary number for scrolbar area
if (e.target.clientHeight < e.target.scrollHeight && e.target.offsetWidth - e.offsetX <= 8) {
stopResize = true;
}
}
// Define some constants
et2_dataview_view_resizable.RESIZE_BORDER = 12;
et2_dataview_view_resizable.RESIZE_MIN_WIDTH = 25;
et2_dataview_view_resizable.RESIZE_ADD = 2; // Used to ensure mouse is under the resize element after resizing has finished
et2_dataview_view_resizable.helper = null;
et2_dataview_view_resizable.overlay = null;
et2_dataview_view_resizable.didResize = false;
et2_dataview_view_resizable.resizeWidth = 0;
et2_dataview_view_resizable.makeResizeable = function (_elem, _callback, _context) {
// Get the table surrounding the given element - this element is used to
// align the helper properly
var outerTable = _elem.closest("table");
// Bind the "mousemove" event in the "resize" namespace
_elem.bind("mousemove.resize", function (e) {
var stopResize = false;
// Stop switch to resize cursor if the mouse position
// is more intended for scrollbar not the resize edge
// 8pixel is an arbitary number for scrolbar area
if (e.target.clientHeight < e.target.scrollHeight && e.target.offsetWidth - e.offsetX <= 8) {
stopResize = true;
}
_elem.css("cursor", et2_dataview_view_resizable.inResizeRegion(e.pageX, _elem) && !stopResize ? "ew-resize" : "auto");
});
// Bind the "mousedown" event in the "resize" namespace
_elem.bind("mousedown.resize", function (e) {
var stopResize = false;
// Stop resize if the mouse position is more intended
// for scrollbar not the resize edge
// 8pixel is an arbitary number for scrolbar area
if (e.target.clientHeight < e.target.scrollHeight && e.target.offsetWidth - e.offsetX <= 8) {
stopResize = true;
}
// Do not triger startResize if clicked element is select-tag, as it may causes conflict in some browsers
if (et2_dataview_view_resizable.inResizeRegion(e.pageX, _elem) && e.target.tagName != 'SELECT' && !stopResize) {
// Start the resizing
et2_dataview_view_resizable.startResize(outerTable, _elem, function (_w) {
_callback.call(_context, _w);
}, _context);
}
});
// Bind double click for auto-size
_elem.dblclick(function (e) {
// Just show message for relative width columns
if (_context && _context.relativeWidth) {
return egw.message(egw.lang('You tried to automatically size a flex column, which always takes the rest of the space', 'info'));
}
// Find column class - it's usually the first one
var col_class = '';
for (var i = 0; i < this.classList.length; i++) {
if (this.classList[i].indexOf('gridCont') === 0) {
col_class = this.classList[i];
break;
}
_elem.css("cursor", et2_dataview_view_resizable.inResizeRegion(e.pageX, _elem) && !stopResize ? "ew-resize" : "auto");
});
// Bind the "mousedown" event in the "resize" namespace
_elem.bind("mousedown.resize", function (e) {
var stopResize = false;
// Stop resize if the mouse position is more intended
// for scrollbar not the resize edge
// 8pixel is an arbitary number for scrolbar area
if (e.target.clientHeight < e.target.scrollHeight && e.target.offsetWidth - e.offsetX <= 8) {
stopResize = true;
}
// Do not triger startResize if clicked element is select-tag, as it may causes conflict in some browsers
if (et2_dataview_view_resizable.inResizeRegion(e.pageX, _elem) && e.target.tagName != 'SELECT' && !stopResize) {
// Start the resizing
et2_dataview_view_resizable.startResize(outerTable, _elem, function (_w) {
_callback.call(_context, _w);
}, _context);
}
});
// Bind double click for auto-size
_elem.dblclick(function (e) {
// Just show message for relative width columns
if (_context && _context.relativeWidth) {
return egw.message(egw.lang('You tried to automatically size a flex column, which always takes the rest of the space', 'info'));
}
// Find column class - it's usually the first one
var col_class = '';
for (var i = 0; i < this.classList.length; i++) {
if (this.classList[i].indexOf('gridCont') === 0) {
col_class = this.classList[i];
break;
}
}
// Find widest part, including header
var column = jQuery(this);
column.children().css('width', 'auto');
var max_width = column.children().children().innerWidth();
var padding = column.outerWidth(true) - max_width;
var resize = jQuery(this).closest('.egwGridView_outer')
.find('tbody td.' + col_class + '> div:first-child')
.add(column.children())
// Set column width to auto to allow space for everything to flow
.css('width', 'auto');
resize.children()
.css({ 'white-space': 'nowrap' })
.each(function () {
var col = jQuery(this);
// Find visible (text) children and force them to not wrap
var children = col.find('span:visible, time:visible, label:visible')
.css({ 'white-space': 'nowrap' });
}
// Find widest part, including header
var column = jQuery(this);
column.children().css('width', 'auto');
var max_width = column.children().children().innerWidth();
var padding = column.outerWidth(true) - max_width;
var resize = jQuery(this).closest('.egwGridView_outer')
.find('tbody td.' + col_class + '> div:first-child')
.add(column.children())
// Set column width to auto to allow space for everything to flow
.css('width', 'auto');
resize.children()
.css({ 'white-space': 'nowrap' })
.each(function () {
var col = jQuery(this);
// Find visible (text) children and force them to not wrap
var children = col.find('span:visible, time:visible, label:visible')
.css({ 'white-space': 'nowrap' });
this.offsetWidth;
children.each(function () {
var child = jQuery(this);
this.offsetWidth;
children.each(function () {
var child = jQuery(this);
this.offsetWidth;
if (child.outerWidth() > max_width) {
max_width = child.outerWidth();
}
window.getComputedStyle(this).width;
});
this.offsetWidth;
if (col.innerWidth() > max_width) {
max_width = col.innerWidth();
if (child.outerWidth() > max_width) {
max_width = child.outerWidth();
}
// Reset children
children.css('white-space', '');
children.css('display', '');
})
.css({ 'white-space': '' });
// Reset column
column.children().css('width', '');
resize.css('width', '');
_callback.call(_context, max_width + padding);
});
};
et2_dataview_view_resizable.et2_dataview_resetResizeable = function (_elem) {
// Remove all events in the ".resize" namespace from the element
_elem.unbind(".resize");
};
return et2_dataview_view_resizable;
}());
exports.et2_dataview_view_resizable = et2_dataview_view_resizable;
window.getComputedStyle(this).width;
});
this.offsetWidth;
if (col.innerWidth() > max_width) {
max_width = col.innerWidth();
}
// Reset children
children.css('white-space', '');
children.css('display', '');
})
.css({ 'white-space': '' });
// Reset column
column.children().css('width', '');
resize.css('width', '');
_callback.call(_context, max_width + padding);
});
};
et2_dataview_view_resizable.et2_dataview_resetResizeable = function (_elem) {
// Remove all events in the ".resize" namespace from the element
_elem.unbind(".resize");
};
//# sourceMappingURL=et2_dataview_view_resizeable.js.map

View File

@ -4,12 +4,13 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
import {egw} from "../jsapi/egw_global";
/**
* This set of functions is currently only supporting resizing in ew-direction
*/

View File

@ -1,69 +1,50 @@
"use strict";
/**
* EGroupware eTemplate2 - dataview
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-2012
* @version $Id$
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
egw_action.egw_action;
et2_dataview_view_container;
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_row = void 0;
var et2_dataview_row = /** @class */ (function (_super) {
__extends(et2_dataview_row, _super);
import { et2_dataview_IViewRange } from "./et2_dataview_interfaces";
import { et2_dataview_container } from "./et2_dataview_view_container";
export class et2_dataview_row extends et2_dataview_container {
/**
* Creates the row container. Use the "setRow" function to load the actual
* row content.
*
* @param _parent is the row parent container.
*/
function et2_dataview_row(_parent) {
var _this =
constructor(_parent) {
// Call the inherited constructor
_super.call(this, _parent) || this;
super(_parent);
// Create the outer "tr" tag and append it to the container
_this.tr = jQuery(document.createElement("tr"));
_this.appendNode(_this.tr);
this.tr = jQuery(document.createElement("tr"));
this.appendNode(this.tr);
// Grid row which gets expanded when clicking on the corresponding
// button
_this.expansionContainer = null;
_this.expansionVisible = false;
this.expansionContainer = null;
this.expansionVisible = false;
// Toggle button which is used to show and hide the expansionContainer
_this.expansionButton = null;
return _this;
this.expansionButton = null;
}
et2_dataview_row.prototype.destroy = function () {
destroy() {
if (this.expansionContainer != null) {
this.expansionContainer.destroy();
}
_super.prototype.destroy.call(this);
};
et2_dataview_row.prototype.clear = function () {
super.destroy();
}
clear() {
this.tr.empty();
};
et2_dataview_row.prototype.makeExpandable = function (_expandable, _callback, _context) {
}
makeExpandable(_expandable, _callback, _context) {
if (_expandable) {
// Create the tr and the button if this has not been done yet
if (!this.expansionButton) {
@ -89,29 +70,29 @@ var et2_dataview_row = /** @class */ (function (_super) {
this.expansionButton = null;
this.expansionContainer = null;
}
};
et2_dataview_row.prototype.removeFromTree = function () {
}
removeFromTree() {
if (this.expansionContainer) {
this.expansionContainer.removeFromTree();
}
this.expansionContainer = null;
this.expansionButton = null;
_super.prototype.removeFromTree.call(this);
};
et2_dataview_row.prototype.getDOMNode = function () {
super.removeFromTree();
}
getDOMNode() {
return this.tr[0];
};
et2_dataview_row.prototype.getJNode = function () {
}
getJNode() {
return this.tr;
};
et2_dataview_row.prototype.getHeight = function () {
var h = _super.prototype.getHeight.call(this);
}
getHeight() {
var h = super.getHeight();
if (this.expansionContainer && this.expansionVisible) {
h += this.expansionContainer.getHeight();
}
return h;
};
et2_dataview_row.prototype.getAvgHeightData = function () {
}
getAvgHeightData() {
// Only take the height of the own tr into account
//var oldVisible = this.expansionVisible;
this.expansionVisible = false;
@ -121,9 +102,9 @@ var et2_dataview_row = /** @class */ (function (_super) {
};
this.expansionVisible = true;
return res;
};
}
/** -- PRIVATE FUNCTIONS -- **/
et2_dataview_row.prototype._handleExpansionButtonClick = function (_callback, _context) {
_handleExpansionButtonClick(_callback, _context) {
// Create the "expansionContainer" if it does not exist yet
if (!this.expansionContainer) {
this.expansionContainer = _callback.call(_context);
@ -143,19 +124,17 @@ var et2_dataview_row = /** @class */ (function (_super) {
this.expansionButton.removeClass("opened");
}
this.invalidate();
};
}
/** -- Implementation of et2_dataview_IViewRange -- **/
et2_dataview_row.prototype.setViewRange = function (_range) {
setViewRange(_range) {
if (this.expansionContainer && this.expansionVisible
&& implements_et2_dataview_IViewRange(this.expansionContainer)) {
&& this.expansionContainer.implements(et2_dataview_IViewRange)) {
// Substract the height of the own row from the container
var oh = jQuery(this._nodes[0]).height();
_range.top -= oh;
// Proxy the setViewRange call to the expansion container
this.expansionContainer.setViewRange(_range);
}
};
return et2_dataview_row;
}(et2_dataview_container));
exports.et2_dataview_row = et2_dataview_row;
}
}
//# sourceMappingURL=et2_dataview_view_row.js.map

View File

@ -4,11 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011-2012
* @version $Id$
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
egw_action.egw_action;
@ -17,6 +16,7 @@
*/
import {et2_dataview_IViewRange} from "./et2_dataview_interfaces";
import {et2_dataview_container} from "./et2_dataview_view_container";
export class et2_dataview_row extends et2_dataview_container implements et2_dataview_IViewRange
{
@ -189,7 +189,7 @@ export class et2_dataview_row extends et2_dataview_container implements et2_data
setViewRange( _range)
{
if (this.expansionContainer && this.expansionVisible
&& implements_et2_dataview_IViewRange(this.expansionContainer))
&& this.expansionContainer.implements(et2_dataview_IViewRange))
{
// Substract the height of the own row from the container
var oh = jQuery(this._nodes[0]).height();

View File

@ -1,17 +1,13 @@
"use strict";
/**
* EGroupware eTemplate2 - Class which contains a factory method for rows
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_rowProvider = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_inheritance;
@ -23,13 +19,13 @@ exports.et2_dataview_rowProvider = void 0;
* The row provider contains prototypes (full clonable dom-trees)
* for all registered row types.
*/
var et2_dataview_rowProvider = /** @class */ (function () {
export class et2_dataview_rowProvider {
/**
*
* @param _outerId
* @param _columnIds
*/
function et2_dataview_rowProvider(_outerId, _columnIds) {
constructor(_outerId, _columnIds) {
// Copy the given parameters
this._outerId = _outerId;
this._columnIds = _columnIds;
@ -43,16 +39,16 @@ var et2_dataview_rowProvider = /** @class */ (function () {
this._createEmptyPrototype();
this._createLoadingPrototype();
}
et2_dataview_rowProvider.prototype.destroy = function () {
destroy() {
this._template = null;
this._mgrs = null;
this._rootWidget = null;
this._prototypes = {};
this._columnIds = [];
};
et2_dataview_rowProvider.prototype.getColumnCount = function () {
}
getColumnCount() {
return this._columnIds.length;
};
}
/**
* Returns a clone of the prototype with the given name. If the generator
* callback function is given, this function is called if the prototype
@ -62,7 +58,7 @@ var et2_dataview_rowProvider = /** @class */ (function () {
* @param {function} _generator
* @param {object} _context
*/
et2_dataview_rowProvider.prototype.getPrototype = function (_name, _generator, _context) {
getPrototype(_name, _generator, _context) {
if (typeof this._prototypes[_name] == "undefined") {
if (typeof _generator != "undefined") {
this._prototypes[_name] = _generator.call(_context, this._outerId, this._columnIds);
@ -72,9 +68,9 @@ var et2_dataview_rowProvider = /** @class */ (function () {
}
}
return this._prototypes[_name].clone();
};
}
/* ---- PRIVATE FUNCTIONS ---- */
et2_dataview_rowProvider.prototype._createFullRowPrototype = function () {
_createFullRowPrototype() {
var tr = jQuery(document.createElement("tr"));
var td = jQuery(document.createElement("td"))
.addClass(this._outerId + "_td_fullRow")
@ -84,12 +80,11 @@ var et2_dataview_rowProvider = /** @class */ (function () {
.addClass(this._outerId + "_div_fullRow")
.appendTo(td);
this._prototypes["fullRow"] = tr;
};
et2_dataview_rowProvider.prototype._createDefaultPrototype = function () {
}
_createDefaultPrototype() {
var tr = jQuery(document.createElement("tr"));
// Append a td for each column
for (var _i = 0, _a = this._columnIds; _i < _a.length; _i++) {
var column = _a[_i];
for (var column of this._columnIds) {
if (!column)
continue;
var td = jQuery(document.createElement("td"))
@ -101,16 +96,14 @@ var et2_dataview_rowProvider = /** @class */ (function () {
.appendTo(td);
}
this._prototypes["default"] = tr;
};
et2_dataview_rowProvider.prototype._createEmptyPrototype = function () {
}
_createEmptyPrototype() {
this._prototypes["empty"] = jQuery(document.createElement("tr"));
};
et2_dataview_rowProvider.prototype._createLoadingPrototype = function () {
}
_createLoadingPrototype() {
var fullRow = this.getPrototype("fullRow");
jQuery("div", fullRow).addClass("loading");
this._prototypes["loading"] = fullRow;
};
return et2_dataview_rowProvider;
}());
exports.et2_dataview_rowProvider = et2_dataview_rowProvider;
}
}
//# sourceMappingURL=et2_dataview_view_rowProvider.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses

View File

@ -1,39 +1,22 @@
"use strict";
/**
* EGroupware eTemplate2 - Class which contains the spacer container
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_spacer = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_dataview_view_container;
*/
import { et2_dataview_container } from "./et2_dataview_view_container";
/**
* @augments et2_dataview_container
*/
var et2_dataview_spacer = /** @class */ (function (_super) {
__extends(et2_dataview_spacer, _super);
export class et2_dataview_spacer extends et2_dataview_container {
/**
* Constructor
*
@ -41,22 +24,20 @@ var et2_dataview_spacer = /** @class */ (function (_super) {
* @param _rowProvider
* @memberOf et2_dataview_spacer
*/
function et2_dataview_spacer(_parent, _rowProvider) {
var _this =
constructor(_parent, _rowProvider) {
// Call the inherited container constructor
_super.call(this, _parent) || this;
super(_parent);
// Initialize the row count and the row height
_this._count = 0;
_this._rowHeight = 19;
_this._avgSum = 0;
_this._avgCount = 0;
this._count = 0;
this._rowHeight = 19;
this._avgSum = 0;
this._avgCount = 0;
// Get the spacer row and append it to the container
_this.spacerNode = _rowProvider.getPrototype("spacer", _this._createSpacerPrototype, _this);
_this._phDiv = jQuery("td", _this.spacerNode);
_this.appendNode(_this.spacerNode);
return _this;
this.spacerNode = _rowProvider.getPrototype("spacer", this._createSpacerPrototype, this);
this._phDiv = jQuery("td", this.spacerNode);
this.appendNode(this.spacerNode);
}
et2_dataview_spacer.prototype.setCount = function (_count, _rowHeight) {
setCount(_count, _rowHeight) {
// Set the new count and _rowHeight if given
this._count = _count;
if (typeof _rowHeight !== "undefined") {
@ -66,16 +47,16 @@ var et2_dataview_spacer = /** @class */ (function (_super) {
this._phDiv.height(this._count * this._rowHeight);
// Call the invalidate function
this.invalidate();
};
et2_dataview_spacer.prototype.getCount = function () {
}
getCount() {
return this._count;
};
et2_dataview_spacer.prototype.getHeight = function () {
}
getHeight() {
// Set the calculated height, so that "invalidate" will work correctly
this._height = this._count * this._rowHeight;
return this._height;
};
et2_dataview_spacer.prototype.getAvgHeightData = function () {
}
getAvgHeightData() {
if (this._avgCount > 0) {
return {
"avgHeight": this._avgSum / this._avgCount,
@ -83,13 +64,13 @@ var et2_dataview_spacer = /** @class */ (function (_super) {
};
}
return null;
};
et2_dataview_spacer.prototype.addAvgHeight = function (_height) {
}
addAvgHeight(_height) {
this._avgSum += _height;
this._avgCount++;
};
}
/* ---- PRIVATE FUNCTIONS ---- */
et2_dataview_spacer.prototype._createSpacerPrototype = function (_outerId, _columnIds) {
_createSpacerPrototype(_outerId, _columnIds) {
var tr = jQuery(document.createElement("tr"));
var td = jQuery(document.createElement("td"))
.addClass("egwGridView_spacer")
@ -97,8 +78,6 @@ var et2_dataview_spacer = /** @class */ (function (_super) {
.attr("colspan", _columnIds.length)
.appendTo(tr);
return tr;
};
return et2_dataview_spacer;
}(et2_dataview_container));
exports.et2_dataview_spacer = et2_dataview_spacer;
}
}
//# sourceMappingURL=et2_dataview_view_spacer.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
@ -15,6 +14,8 @@
et2_dataview_view_container;
*/
import {et2_dataview_container} from "./et2_dataview_view_container";
/**
* @augments et2_dataview_container
*/

View File

@ -1,34 +1,19 @@
"use strict";
/**
* EGroupware eTemplate2 - dataview code
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2014
* @version $Id: et2_dataview_view_container_1.js 46338 2014-03-20 09:40:37Z ralfbecker $
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dataview_tile = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_dataview_interfaces;
*/
import { et2_dataview_row } from "./et2_dataview_view_row";
/**
* Displays tiles or thumbnails (squares) instead of full rows.
*
@ -36,8 +21,7 @@ exports.et2_dataview_tile = void 0;
* so that the rows and columns work out properly.
*
*/
var et2_dataview_tile = /** @class */ (function (_super) {
__extends(et2_dataview_tile, _super);
export class et2_dataview_tile extends et2_dataview_row {
/**
* Creates the row container. Use the "setRow" function to load the actual
* row content.
@ -45,25 +29,23 @@ var et2_dataview_tile = /** @class */ (function (_super) {
* @param _parent is the row parent container.
* @memberOf et2_dataview_row
*/
function et2_dataview_tile(_parent) {
var _this =
constructor(_parent) {
// Call the inherited constructor
_super.call(this, _parent) || this;
_this.columns = 4;
super(_parent);
this.columns = 4;
// Make sure the needed class is there to get the CSS
_this.tr.addClass('tile');
return _this;
this.tr.addClass('tile');
}
et2_dataview_tile.prototype.makeExpandable = function (_expandable, _callback, _context) {
makeExpandable(_expandable, _callback, _context) {
// Nope. It mostly works, it's just weird.
};
et2_dataview_tile.prototype.getAvgHeightData = function () {
}
getAvgHeightData() {
var res = {
"avgHeight": this.getHeight() / this.columns,
"avgCount": this.columns
};
return res;
};
}
/**
* Returns the height for the tile.
*
@ -71,19 +53,19 @@ var et2_dataview_tile = /** @class */ (function (_super) {
* height. If this should be another tile in the same row, we say it has 0 height.
* @returns {Number}
*/
et2_dataview_tile.prototype.getHeight = function () {
getHeight() {
if (this._index % this.columns == 0) {
return _super.prototype.getHeight.call(this);
return super.getHeight();
}
else {
return 0;
}
};
}
/**
* Broadcasts an invalidation through the container tree. Marks the own
* height as invalid.
*/
et2_dataview_tile.prototype.invalidate = function () {
invalidate() {
if (this._inTree && this.tr) {
var template_width = jQuery('.innerContainer', this.tr).children().outerWidth(true);
if (template_width) {
@ -91,19 +73,17 @@ var et2_dataview_tile = /** @class */ (function (_super) {
}
}
this._recalculate_columns();
_super.prototype.invalidate.call(this);
};
super.invalidate();
}
/**
* Recalculate how many columns we can fit in a row.
* While browser takes care of the actual layout, we need this for proper
* pagination.
*/
et2_dataview_tile.prototype._recalculate_columns = function () {
_recalculate_columns() {
if (this._inTree && this.tr && this.tr.parent()) {
this.columns = Math.max(1, parseInt(this.tr.parent().innerWidth() / this.tr.outerWidth(true)));
}
};
return et2_dataview_tile;
}(et2_dataview_row));
exports.et2_dataview_tile = et2_dataview_tile;
}
}
//# sourceMappingURL=et2_dataview_view_tile.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage dataview
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2014
* @version $Id: et2_dataview_view_container_1.js 46338 2014-03-20 09:40:37Z ralfbecker $
@ -15,6 +15,8 @@
et2_dataview_interfaces;
*/
import {et2_dataview_row} from "./et2_dataview_view_row";
/**
* Displays tiles or thumbnails (squares) instead of full rows.
*
@ -22,7 +24,8 @@
* so that the rows and columns work out properly.
*
*/
export class et2_dataview_tile extends et2_dataview_row {
export class et2_dataview_tile extends et2_dataview_row
{
columns: number = 4;
/**

View File

@ -1,30 +1,13 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Custom fields object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2011
* @version $Id$
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_customfields_list = void 0;
/*egw:uses
lib/tooltip;
/vendor/bower-asset/jquery/dist/jquery.js;
@ -32,81 +15,81 @@ exports.et2_customfields_list = void 0;
et2_core_DOMWidget;
et2_core_inputWidget;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
var et2_customfields_list = /** @class */ (function (_super) {
__extends(et2_customfields_list, _super);
function et2_customfields_list(_parent, _attrs, _child) {
var _this = _super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_customfields_list._attributes, _child || {})) || this;
_this.rows = {};
_this.widgets = {};
_this.detachedNodes = [];
import { et2_createWidget, et2_register_widget, et2_registry } from "./et2_core_widget";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_valueWidget } from "./et2_core_valueWidget";
import { et2_cloneObject, et2_no_init } from "./et2_core_common";
import { egw } from "../jsapi/egw_global";
export class et2_customfields_list extends et2_valueWidget {
constructor(_parent, _attrs, _child) {
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_customfields_list._attributes, _child || {}));
this.rows = {};
this.widgets = {};
this.detachedNodes = [];
// Some apps (infolog edit) don't give ID, so assign one to get settings
if (!_this.id) {
_this.id = _attrs.id = et2_customfields_list.DEFAULT_ID;
if (!this.id) {
this.id = _attrs.id = et2_customfields_list.DEFAULT_ID;
// Add all attributes hidden in the content arrays to the attributes
// parameter
_this.transformAttributes(_attrs);
this.transformAttributes(_attrs);
// Create a local copy of the options object
_this.options = et2_cloneObject(_attrs);
this.options = et2_cloneObject(_attrs);
}
// Create the table body and the table
_this.tbody = jQuery(document.createElement("tbody"));
_this.table = jQuery(document.createElement("table"))
this.tbody = jQuery(document.createElement("tbody"));
this.table = jQuery(document.createElement("table"))
.addClass("et2_grid et2_customfield_list");
_this.table.append(_this.tbody);
if (!_this.options.fields)
_this.options.fields = {};
if (typeof _this.options.fields === 'string') {
var fields = _this.options.fields.split(',');
_this.options.fields = {};
this.table.append(this.tbody);
if (!this.options.fields)
this.options.fields = {};
if (typeof this.options.fields === 'string') {
const fields = this.options.fields.split(',');
this.options.fields = {};
for (var i = 0; i < fields.length; i++) {
_this.options.fields[fields[i]] = true;
this.options.fields[fields[i]] = true;
}
}
if (_this.options.type_filter && typeof _this.options.type_filter == "string") {
_this.options.type_filter = _this.options.type_filter.split(",");
if (this.options.type_filter && typeof this.options.type_filter == "string") {
this.options.type_filter = this.options.type_filter.split(",");
}
if (_this.options.type_filter) {
var already_filtered = !jQuery.isEmptyObject(_this.options.fields);
for (var field_name in _this.options.customfields) {
if (this.options.type_filter) {
const already_filtered = !jQuery.isEmptyObject(this.options.fields);
for (let field_name in this.options.customfields) {
// Already excluded?
if (already_filtered && !_this.options.fields[field_name])
if (already_filtered && !this.options.fields[field_name])
continue;
if (!_this.options.customfields[field_name].type2 || _this.options.customfields[field_name].type2.length == 0 ||
_this.options.customfields[field_name].type2 == '0') {
if (!this.options.customfields[field_name].type2 || this.options.customfields[field_name].type2.length == 0 ||
this.options.customfields[field_name].type2 == '0') {
// No restrictions
_this.options.fields[field_name] = true;
this.options.fields[field_name] = true;
continue;
}
var types = typeof _this.options.customfields[field_name].type2 == 'string' ? _this.options.customfields[field_name].type2.split(",") : _this.options.customfields[field_name].type2;
_this.options.fields[field_name] = false;
const types = typeof this.options.customfields[field_name].type2 == 'string' ? this.options.customfields[field_name].type2.split(",") : this.options.customfields[field_name].type2;
this.options.fields[field_name] = false;
for (var i = 0; i < types.length; i++) {
if (jQuery.inArray(types[i], _this.options.type_filter) > -1) {
_this.options.fields[field_name] = true;
if (jQuery.inArray(types[i], this.options.type_filter) > -1) {
this.options.fields[field_name] = true;
}
}
}
}
_this.setDOMNode(_this.table[0]);
return _this;
this.setDOMNode(this.table[0]);
}
et2_customfields_list.prototype.destroy = function () {
_super.prototype.destroy.call(this);
destroy() {
super.destroy();
this.rows = {};
this.widgets = {};
this.detachedNodes = [];
this.tbody = null;
};
}
/**
* What does this do? I don't know, but when everything is done the second
* time, this makes it work. Otherwise, all custom fields are lost.
*/
et2_customfields_list.prototype.assign = function (_obj) {
assign(_obj) {
this.loadFields();
};
et2_customfields_list.prototype.getDOMNode = function (_sender) {
}
getDOMNode(_sender) {
// Check whether the _sender object exists inside the management array
if (this.rows && _sender.id && this.rows[_sender.id]) {
return this.rows[_sender.id];
@ -114,12 +97,12 @@ var et2_customfields_list = /** @class */ (function (_super) {
if (this.rows && _sender.id && _sender.id.indexOf("_label") && this.rows[_sender.id.replace("_label", "")]) {
return jQuery(this.rows[_sender.id.replace("_label", "")]).prev("td")[0] || null;
}
return _super.prototype.getDOMNode.call(this, _sender);
};
return super.getDOMNode(_sender);
}
/**
* Initialize widgets for custom fields
*/
et2_customfields_list.prototype.loadFields = function () {
loadFields() {
if (!this.options || !this.options.customfields)
return;
// Already set up - avoid duplicates in nextmatch
@ -128,18 +111,18 @@ var et2_customfields_list = /** @class */ (function (_super) {
if (!jQuery.isEmptyObject(this.widgets))
return;
// Check for global setting changes (visibility)
var global_data = this.getArrayMgr("modifications").getRoot().getEntry('~custom_fields~');
const global_data = this.getArrayMgr("modifications").getRoot().getEntry('~custom_fields~');
if (global_data && global_data.fields && !this.options.fields)
this.options.fields = global_data.fields;
// For checking app entries
var apps = this.egw().link_app_list();
const apps = this.egw().link_app_list();
// Create the table rows
for (var field_name in this.options.customfields) {
for (let field_name in this.options.customfields) {
// Skip fields if we're filtering
if (this.getType() != 'customfields-list' && !jQuery.isEmptyObject(this.options.fields) && !this.options.fields[field_name])
continue;
var field = this.options.customfields[field_name];
var id = this.options.prefix + field_name;
const field = this.options.customfields[field_name];
let id = this.options.prefix + field_name;
// Need curlies around ID for nm row expansion
if (this.id == '$row') {
id = "{" + this.id + "}" + "[" + this.options.prefix + field_name + "]";
@ -150,15 +133,15 @@ var et2_customfields_list = /** @class */ (function (_super) {
}
// Avoid creating field twice
if (!this.rows[id]) {
var row = jQuery(document.createElement("tr"))
const row = jQuery(document.createElement("tr"))
.appendTo(this.tbody)
.addClass(this.id + '_' + id);
var cf = jQuery(document.createElement("td"))
let cf = jQuery(document.createElement("td"))
.appendTo(row);
if (!field.type)
field.type = 'text";';
var setup_function = '_setup_' + (apps[field.type] ? 'link_entry' : field.type.replace("-", "_"));
var attrs = jQuery.extend({}, this.options[field_name] ? this.options[field_name] : {}, {
const setup_function = '_setup_' + (apps[field.type] ? 'link_entry' : field.type.replace("-", "_"));
const attrs = jQuery.extend({}, this.options[field_name] ? this.options[field_name] : {}, {
'id': id,
'statustext': field.help,
'needed': field.needed,
@ -172,7 +155,7 @@ var et2_customfields_list = /** @class */ (function (_super) {
attrs.onchange = this.options.onchange;
}
if (this[setup_function]) {
var no_skip = this[setup_function].call(this, field_name, field, attrs);
const no_skip = this[setup_function].call(this, field_name, field, attrs);
if (!no_skip)
continue;
}
@ -193,19 +176,19 @@ var et2_customfields_list = /** @class */ (function (_super) {
// Label in first column, widget in 2nd
jQuery(document.createElement("td"))
.prependTo(row);
et2_core_widget_1.et2_createWidget("label", { id: id + "_label", value: field.label, for: id }, this);
et2_createWidget("label", { id: id + "_label", value: field.label, for: id }, this);
}
// Set any additional attributes set in options, but not for widgets that pass actual options
if (['select', 'radio', 'radiogroup', 'checkbox', 'button'].indexOf(field.type) == -1 && !jQuery.isEmptyObject(field.values)) {
var w = et2_registry[attrs.type ? attrs.type : field.type];
for (var attr_name in field.values) {
const w = et2_registry[attrs.type ? attrs.type : field.type];
for (let attr_name in field.values) {
if (typeof w._attributes[attr_name] != "undefined") {
attrs[attr_name] = field.values[attr_name];
}
}
}
// Create widget
var widget = this.widgets[field_name] = et2_core_widget_1.et2_createWidget(attrs.type ? attrs.type : field.type, attrs, this);
const widget = this.widgets[field_name] = et2_createWidget(attrs.type ? attrs.type : field.type, attrs, this);
}
// Field is not to be shown
if (!this.options.fields || jQuery.isEmptyObject(this.options.fields) || this.options.fields[field_name] == true) {
@ -215,48 +198,48 @@ var et2_customfields_list = /** @class */ (function (_super) {
jQuery(this.rows[field_name]).hide();
}
}
};
}
/**
* Read needed info on available custom fields from various places it's stored.
*/
et2_customfields_list.prototype.transformAttributes = function (_attrs) {
_super.prototype.transformAttributes.call(this, _attrs);
transformAttributes(_attrs) {
super.transformAttributes(_attrs);
// Add in settings that are objects
// Customized settings for this widget (unlikely)
var data = this.getArrayMgr("modifications").getEntry(this.id);
const data = this.getArrayMgr("modifications").getEntry(this.id);
// Check for global settings
var global_data = this.getArrayMgr("modifications").getRoot().getEntry('~custom_fields~', true);
const global_data = this.getArrayMgr("modifications").getRoot().getEntry('~custom_fields~', true);
if (global_data) {
for (var key_1 in data) {
for (let key in data) {
// Don't overwrite fields with global values
if (global_data[key_1] && key_1 !== 'fields') {
data[key_1] = jQuery.extend(true, {}, data[key_1], global_data[key_1]);
if (global_data[key] && key !== 'fields') {
data[key] = jQuery.extend(true, {}, data[key], global_data[key]);
}
}
}
for (var key in data) {
_attrs[key] = data[key];
}
for (var key_2 in global_data) {
if (typeof global_data[key_2] != 'undefined' && !_attrs[key_2])
_attrs[key_2] = global_data[key_2];
for (let key in global_data) {
if (typeof global_data[key] != 'undefined' && !_attrs[key])
_attrs[key] = global_data[key];
}
if (this.id) {
// Set the value for this element
var contentMgr = this.getArrayMgr("content");
const contentMgr = this.getArrayMgr("content");
if (contentMgr != null) {
var val = contentMgr.getEntry(this.id);
const val = contentMgr.getEntry(this.id);
_attrs["value"] = {};
var prefix = _attrs["prefix"] || et2_customfields_list.PREFIX;
let prefix = _attrs["prefix"] || et2_customfields_list.PREFIX;
if (val !== null) {
if (this.id.indexOf(prefix) === 0 && typeof data.fields != 'undefined' && data.fields[this.id.replace(prefix, '')] === true) {
_attrs['value'][this.id] = val;
}
else {
// Only set the values that match desired custom fields
for (var key_3 in val) {
if (key_3.indexOf(prefix) === 0) {
_attrs["value"][key_3] = val[key_3];
for (let key in val) {
if (key.indexOf(prefix) === 0) {
_attrs["value"][key] = val[key];
}
}
}
@ -270,23 +253,23 @@ var et2_customfields_list = /** @class */ (function (_super) {
}
}
}
};
et2_customfields_list.prototype.loadFromXML = function (_node) {
}
loadFromXML(_node) {
this.loadFields();
// Load the nodes as usual
_super.prototype.loadFromXML.call(this, _node);
};
et2_customfields_list.prototype.set_value = function (_value) {
super.loadFromXML(_node);
}
set_value(_value) {
if (!this.options.customfields)
return;
for (var field_name in this.options.customfields) {
for (let field_name in this.options.customfields) {
// Skip fields if we're filtering
if (!jQuery.isEmptyObject(this.options.fields) && !this.options.fields[field_name])
continue;
// Make sure widget is created, and has the needed function
if (!this.widgets[field_name] || !this.widgets[field_name].set_value)
continue;
var value = _value[this.options.prefix + field_name] ? _value[this.options.prefix + field_name] : null;
let value = _value[this.options.prefix + field_name] ? _value[this.options.prefix + field_name] : null;
// Check if ID was missing
if (value == null && this.id == et2_customfields_list.DEFAULT_ID && this.getArrayMgr("content").getEntry(this.options.prefix + field_name)) {
value = this.getArrayMgr("content").getEntry(this.options.prefix + field_name);
@ -303,43 +286,43 @@ var et2_customfields_list = /** @class */ (function (_super) {
}
this.widgets[field_name].set_value(value);
}
};
}
/**
* et2_IInput so the custom field can be it's own widget.
*/
et2_customfields_list.prototype.getValue = function () {
getValue() {
// Not using an ID means we have to grab all the widget values, and put them where server knows to look
if (this.id != et2_customfields_list.DEFAULT_ID) {
return null;
}
var value = {};
for (var field_name in this.widgets) {
const value = {};
for (let field_name in this.widgets) {
if (this.widgets[field_name].getValue && !this.widgets[field_name].options.readonly) {
value[this.options.prefix + field_name] = this.widgets[field_name].getValue();
}
}
return value;
};
et2_customfields_list.prototype.isDirty = function () {
var dirty = false;
for (var field_name in this.widgets) {
}
isDirty() {
let dirty = false;
for (let field_name in this.widgets) {
if (this.widgets[field_name].isDirty) {
dirty = dirty || this.widgets[field_name].isDirty();
}
}
return dirty;
};
et2_customfields_list.prototype.resetDirty = function () {
for (var field_name in this.widgets) {
}
resetDirty() {
for (let field_name in this.widgets) {
if (this.widgets[field_name].resetDirty) {
this.widgets[field_name].resetDirty();
}
}
};
et2_customfields_list.prototype.isValid = function () {
}
isValid() {
// Individual customfields will handle themselves
return true;
};
}
/**
* Adapt provided attributes to match options for widget
*
@ -347,7 +330,7 @@ var et2_customfields_list = /** @class */ (function (_super) {
* !rows --> input, with size=len
* rows = 1 --> input, with size=len, maxlength=len
*/
et2_customfields_list.prototype._setup_text = function (field_name, field, attrs) {
_setup_text(field_name, field, attrs) {
// No label on the widget itself
delete (attrs.label);
field.type = 'textbox';
@ -358,33 +341,32 @@ var et2_customfields_list = /** @class */ (function (_super) {
attrs.maxlength = field.len;
}
return true;
};
et2_customfields_list.prototype._setup_passwd = function (field_name, field, attrs) {
}
_setup_passwd(field_name, field, attrs) {
// No label on the widget itself
delete (attrs.label);
var defaults = {
let defaults = {
viewable: true,
plaintext: false,
suggest: 16
};
for (var _i = 0, _a = Object.keys(defaults); _i < _a.length; _i++) {
var key = _a[_i];
for (let key of Object.keys(defaults)) {
attrs[key] = (field.values && typeof field.values[key] !== "undefined") ? field.values[key] : defaults[key];
}
return true;
};
et2_customfields_list.prototype._setup_ajax_select = function (field_name, field, attrs) {
var attributes = ['get_rows', 'get_title', 'id_field', 'template'];
}
_setup_ajax_select(field_name, field, attrs) {
const attributes = ['get_rows', 'get_title', 'id_field', 'template'];
if (field.values) {
for (var i = 0; i < attributes.length; i++) {
for (let i = 0; i < attributes.length; i++) {
if (typeof field.values[attributes[i]] !== 'undefined') {
attrs[attributes[i]] = field.values[attributes[i]];
}
}
}
return true;
};
et2_customfields_list.prototype._setup_float = function (field_name, field, attrs) {
}
_setup_float(field_name, field, attrs) {
// No label on the widget itself
delete (attrs.label);
field.type = 'float';
@ -392,31 +374,31 @@ var et2_customfields_list = /** @class */ (function (_super) {
attrs.size = field.len;
}
return true;
};
et2_customfields_list.prototype._setup_select = function (field_name, field, attrs) {
}
_setup_select(field_name, field, attrs) {
// No label on the widget itself
delete (attrs.label);
attrs.rows = field.rows;
// select_options are now send from server-side incl. ones defined via a file in EGroupware root
attrs.tags = field.tags;
return true;
};
et2_customfields_list.prototype._setup_select_account = function (field_name, field, attrs) {
}
_setup_select_account(field_name, field, attrs) {
attrs.empty_label = egw.lang('Select');
if (field.account_type) {
attrs.account_type = field.account_type;
}
return this._setup_select(field_name, field, attrs);
};
et2_customfields_list.prototype._setup_date = function (field_name, field, attrs) {
}
_setup_date(field_name, field, attrs) {
attrs.data_format = field.values && field.values.format ? field.values.format : 'Y-m-d';
return true;
};
et2_customfields_list.prototype._setup_date_time = function (field_name, field, attrs) {
}
_setup_date_time(field_name, field, attrs) {
attrs.data_format = field.values && field.values.format ? field.values.format : 'Y-m-d H:i:s';
return true;
};
et2_customfields_list.prototype._setup_htmlarea = function (field_name, field, attrs) {
}
_setup_htmlarea(field_name, field, attrs) {
attrs.config = field.config ? field.config : {};
attrs.config.toolbarStartupExpanded = false;
if (field.len) {
@ -425,12 +407,12 @@ var et2_customfields_list = /** @class */ (function (_super) {
attrs.config.height = (((field.rows > 0 && field.rows != 'undefined') ? field.rows : 5) * 16) + 'px';
// We have to push the config modifications into the modifications array, or they'll
// be overwritten by the site config from the server
var data = this.getArrayMgr("modifications").getEntry(this.options.prefix + field_name);
const data = this.getArrayMgr("modifications").getEntry(this.options.prefix + field_name);
if (data)
jQuery.extend(data.config, attrs.config);
return true;
};
et2_customfields_list.prototype._setup_radio = function (field_name, field, attrs) {
}
_setup_radio(field_name, field, attrs) {
// 'Empty' label will be first
delete (attrs.label);
if (field.values && field.values['']) {
@ -440,8 +422,8 @@ var et2_customfields_list = /** @class */ (function (_super) {
field.type = 'radiogroup';
attrs.options = field.values;
return true;
};
et2_customfields_list.prototype._setup_checkbox = function (field_name, field, attrs) {
}
_setup_checkbox(field_name, field, attrs) {
// Read-only checkbox is just text
if (attrs.readonly && this.getType() !== "customfields") {
attrs.ro_true = field.label;
@ -453,12 +435,12 @@ var et2_customfields_list = /** @class */ (function (_super) {
attrs.ro_false = field.ro_false;
}
return true;
};
}
/**
* People set button attributes as
* label: javascript
*/
et2_customfields_list.prototype._setup_button = function (field_name, field, attrs) {
_setup_button(field_name, field, attrs) {
// No label on the widget itself
delete (attrs.label);
attrs.label = field.label;
@ -468,9 +450,9 @@ var et2_customfields_list = /** @class */ (function (_super) {
}
// Simple case, one widget for a custom field
if (!field.values || typeof field.values != 'object' || Object.keys(field.values).length == 1) {
for (var key_4 in field.values) {
attrs.label = key_4;
attrs.onclick = field.values[key_4];
for (let key in field.values) {
attrs.label = key;
attrs.onclick = field.values[key];
}
if (!attrs.label) {
attrs.label = 'No "label=onclick" in values!';
@ -481,26 +463,26 @@ var et2_customfields_list = /** @class */ (function (_super) {
else {
// Complicated case, a single custom field you get multiple widgets
// Handle it all here, since this is the exception
var row = jQuery('tr', this.tbody).last();
var cf = jQuery('td', row);
const row = jQuery('tr', this.tbody).last();
let cf = jQuery('td', row);
// Label in first column, widget in 2nd
cf.text(field.label + "");
cf = jQuery(document.createElement("td"))
.appendTo(row);
for (var key in field.values) {
var button_attrs = jQuery.extend({}, attrs);
const button_attrs = jQuery.extend({}, attrs);
button_attrs.label = key;
button_attrs.onclick = field.values[key];
button_attrs.id = attrs.id + '_' + key;
// This controls where the button is placed in the DOM
this.rows[button_attrs.id] = cf[0];
// Do not store in the widgets list, one name for multiple widgets would cause problems
/*this.widgets[field_name] = */ et2_core_widget_1.et2_createWidget(attrs.type ? attrs.type : field.type, button_attrs, this);
/*this.widgets[field_name] = */ et2_createWidget(attrs.type ? attrs.type : field.type, button_attrs, this);
}
return false;
}
};
et2_customfields_list.prototype._setup_link_entry = function (field_name, field, attrs) {
}
_setup_link_entry(field_name, field, attrs) {
if (field.type === 'filemanager') {
return this._setup_filemanager(field_name, field, attrs);
}
@ -509,8 +491,8 @@ var et2_customfields_list = /** @class */ (function (_super) {
attrs.type = "link-entry";
attrs.only_app = typeof field.only_app == "undefined" ? field.type : field.only_app;
return true;
};
et2_customfields_list.prototype._setup_filemanager = function (field_name, field, attrs) {
}
_setup_filemanager(field_name, field, attrs) {
attrs.type = 'vfs-upload';
delete (attrs.label);
if (this.getType() == 'customfields-list') {
@ -520,19 +502,19 @@ var et2_customfields_list = /** @class */ (function (_super) {
else {
// Complicated case, a single custom field you get multiple widgets
// Handle it all here, since this is the exception
var row = jQuery('tr', this.tbody).last();
var cf = jQuery('td', row);
const row = jQuery('tr', this.tbody).last();
let cf = jQuery('td', row);
// Label in first column, widget in 2nd
cf.text(field.label + "");
cf = jQuery(document.createElement("td"))
.appendTo(row);
// Create upload widget
var widget = this.widgets[field_name] = et2_core_widget_1.et2_createWidget(attrs.type ? attrs.type : field.type, attrs, this);
let widget = this.widgets[field_name] = et2_createWidget(attrs.type ? attrs.type : field.type, attrs, this);
// This controls where the widget is placed in the DOM
this.rows[attrs.id] = cf[0];
jQuery(widget.getDOMNode(widget)).css('vertical-align', 'top');
// Add a link to existing VFS file
var select_attrs = jQuery.extend({}, attrs,
const select_attrs = jQuery.extend({}, attrs,
// Filemanager select
{
label: '',
@ -545,111 +527,109 @@ var et2_customfields_list = /** @class */ (function (_super) {
// This controls where the button is placed in the DOM
this.rows[select_attrs.id] = cf[0];
// Do not store in the widgets list, one name for multiple widgets would cause problems
widget = et2_core_widget_1.et2_createWidget(select_attrs.type, select_attrs, this);
widget = et2_createWidget(select_attrs.type, select_attrs, this);
jQuery(widget.getDOMNode(widget)).css('vertical-align', 'top').prependTo(cf);
}
return false;
};
}
/**
* Display links in list as CF name
* @param field_name
* @param field
* @param attrs
*/
et2_customfields_list.prototype._setup_url = function (field_name, field, attrs) {
_setup_url(field_name, field, attrs) {
if (this.getType() == 'customfields-list') {
attrs.label = field.label;
}
return true;
};
}
/**
* Set which fields are visible, by name
*
* Note: no # prefix on the name
*
*/
et2_customfields_list.prototype.set_visible = function (_fields) {
for (var name_1 in _fields) {
if (this.rows[this.options.prefix + name_1]) {
if (_fields[name_1]) {
jQuery(this.rows[this.options.prefix + name_1]).show();
set_visible(_fields) {
for (let name in _fields) {
if (this.rows[this.options.prefix + name]) {
if (_fields[name]) {
jQuery(this.rows[this.options.prefix + name]).show();
}
else {
jQuery(this.rows[this.options.prefix + name_1]).hide();
jQuery(this.rows[this.options.prefix + name]).hide();
}
}
this.options.fields[name_1] = _fields[name_1];
this.options.fields[name] = _fields[name];
}
};
}
/**
* Code for implementing et2_IDetachedDOM
*/
et2_customfields_list.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push("value", "class");
};
et2_customfields_list.prototype.getDetachedNodes = function () {
}
getDetachedNodes() {
return this.detachedNodes ? this.detachedNodes : [];
};
et2_customfields_list.prototype.setDetachedAttributes = function (_nodes, _values) {
}
setDetachedAttributes(_nodes, _values) {
// Individual widgets are detected and handled by the grid, but the interface is needed for this to happen
// Show the row if there's a value, hide it if there is no value
for (var i = 0; i < _nodes.length; i++) {
for (let i = 0; i < _nodes.length; i++) {
// toggle() needs a boolean to do what we want
var key = _nodes[i].getAttribute('data-field');
const key = _nodes[i].getAttribute('data-field');
jQuery(_nodes[i]).toggle(_values.fields[key] && _values.value[this.options.prefix + key] ? true : false);
}
};
et2_customfields_list._attributes = {
'customfields': {
'name': 'Custom fields',
'description': 'Auto filled',
'type': 'any'
},
'fields': {
'name': 'Custom fields',
'description': 'Auto filled',
'type': 'any'
},
'value': {
'name': 'Custom fields',
'description': 'Auto filled',
'type': "any"
},
'type_filter': {
'name': 'Field filter',
"default": "",
"type": "any",
"description": "Filter displayed custom fields by their 'type2' attribute"
},
'private': {
ignore: true,
type: 'boolean'
},
'sub_app': {
'name': 'sub app name',
'type': "string",
'description': "Name of sub application"
},
// Allow onchange so you can put handlers on the sub-widgets
'onchange': {
"name": "onchange",
"type": "string",
"default": et2_no_init,
"description": "JS code which is executed when the value changes."
},
// Allow changing the field prefix. Normally it's the constant but importexport filter changes it.
"prefix": {
name: "prefix",
type: "string",
default: "#",
description: "Custom prefix for custom fields. Default #"
}
};
et2_customfields_list.legacyOptions = ["type_filter", "private", "fields"]; // Field restriction & private done server-side
et2_customfields_list.PREFIX = '#';
et2_customfields_list.DEFAULT_ID = "custom_fields";
return et2_customfields_list;
}(et2_core_valueWidget_1.et2_valueWidget));
exports.et2_customfields_list = et2_customfields_list;
et2_core_widget_1.et2_register_widget(et2_customfields_list, ["customfields", "customfields-list"]);
}
}
et2_customfields_list._attributes = {
'customfields': {
'name': 'Custom fields',
'description': 'Auto filled',
'type': 'any'
},
'fields': {
'name': 'Custom fields',
'description': 'Auto filled',
'type': 'any'
},
'value': {
'name': 'Custom fields',
'description': 'Auto filled',
'type': "any"
},
'type_filter': {
'name': 'Field filter',
"default": "",
"type": "any",
"description": "Filter displayed custom fields by their 'type2' attribute"
},
'private': {
ignore: true,
type: 'boolean'
},
'sub_app': {
'name': 'sub app name',
'type': "string",
'description': "Name of sub application"
},
// Allow onchange so you can put handlers on the sub-widgets
'onchange': {
"name": "onchange",
"type": "string",
"default": et2_no_init,
"description": "JS code which is executed when the value changes."
},
// Allow changing the field prefix. Normally it's the constant but importexport filter changes it.
"prefix": {
name: "prefix",
type: "string",
default: "#",
description: "Custom prefix for custom fields. Default #"
}
};
et2_customfields_list.legacyOptions = ["type_filter", "private", "fields"]; // Field restriction & private done server-side
et2_customfields_list.PREFIX = '#';
et2_customfields_list.DEFAULT_ID = "custom_fields";
et2_register_widget(et2_customfields_list, ["customfields", "customfields-list"]);
//# sourceMappingURL=et2_extension_customfields.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2011
* @version $Id$
*/
/*egw:uses
@ -18,10 +17,14 @@
et2_core_inputWidget;
*/
import {et2_createWidget, et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_createWidget, et2_register_widget, et2_registry, WidgetConfig} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_valueWidget} from "./et2_core_valueWidget";
import {et2_readonlysArrayMgr} from "./et2_core_arrayMgr";
import {et2_IDetachedDOM, et2_IInput} from "./et2_core_interfaces";
import {et2_cloneObject, et2_no_init} from "./et2_core_common";
import {egw} from "../jsapi/egw_global";
import {et2_DOMWidget} from "./et2_core_DOMWidget";
export class et2_customfields_list extends et2_valueWidget implements et2_IDetachedDOM, et2_IInput
{
@ -80,7 +83,7 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
private tbody: JQuery;
private table: JQuery;
private rows = {};
private widgets = {};
widgets = {};
private detachedNodes = [];
constructor(_parent?, _attrs? : WidgetConfig, _child? : object)
@ -713,7 +716,7 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
.appendTo(row);
// Create upload widget
let widget = this.widgets[field_name] = et2_createWidget(attrs.type ? attrs.type : field.type, attrs, this);
let widget = this.widgets[field_name] = <et2_DOMWidget>et2_createWidget(attrs.type ? attrs.type : field.type, attrs, this);
// This controls where the widget is placed in the DOM
this.rows[attrs.id] = cf[0];
@ -736,7 +739,7 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
this.rows[select_attrs.id] = cf[0];
// Do not store in the widgets list, one name for multiple widgets would cause problems
widget = et2_createWidget(select_attrs.type, select_attrs, this);
widget = <et2_DOMWidget>et2_createWidget(select_attrs.type, select_attrs, this);
jQuery(widget.getDOMNode(widget)).css('vertical-align','top').prependTo(cf);
}
return false;

View File

@ -5,7 +5,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Christian Binder
* @author Nathan Gray
* @copyright 2012 Christian Binder
@ -13,8 +13,8 @@
*/
function itempickerDocumentAction(context, data) {
"use strict";
var formid = "itempicker_action_form";
var form = "<form id='" + formid + "' action='index.php?menuaction=" + data.app + "." + data.app + "_merge.download_by_request' method='POST'>"
let formid = "itempicker_action_form";
let form = "<form id='" + formid + "' action='index.php?menuaction=" + data.app + "." + data.app + "_merge.download_by_request' method='POST'>"
+ "<input type='hidden' name='data_document_name' value='" + data.value.name + "' />"
+ "<input type='hidden' name='data_document_dir' value='" + data.value.dir + "' />"
+ "<input type='hidden' name='data_checked' value='" + data.checked.join(',') + "' />"

View File

@ -5,7 +5,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Christian Binder
* @author Nathan Gray
* @copyright 2012 Christian Binder

File diff suppressed because it is too large Load Diff

View File

@ -4,11 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
@ -41,8 +40,8 @@
*/
import './et2_core_common';
import './et2_core_interfaces';
import {et2_csvSplit, et2_no_init} from "./et2_core_common";
import {et2_IInput, et2_IPrint, et2_IResizeable, implements_methods, et2_implements_registry} from "./et2_core_interfaces";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_createWidget, et2_register_widget, et2_widget, WidgetConfig} from "./et2_core_widget";
import {et2_DOMWidget} from "./et2_core_DOMWidget";
@ -65,6 +64,8 @@ import {et2_arrayMgr} from "./et2_core_arrayMgr";
import {et2_button} from "./et2_widget_button";
import {et2_searchbox} from "./et2_widget_textbox";
import {et2_template} from "./et2_widget_template";
import {app, egw} from "../jsapi/egw_global";
import {et2_compileLegacyJS} from "./et2_core_legacyJSFunctions";
//import {et2_selectAccount} from "./et2_widget_SelectAccount";
@ -82,8 +83,8 @@ export interface et2_INextmatchHeader {
*/
setNextmatch(nextmatch : et2_nextmatch) : void
}
var et2_INextmatchHeader = "et2_INextmatchHeader";
function implements_et2_INextmatchHeader(obj : et2_widget)
export const et2_INextmatchHeader = "et2_INextmatchHeader";
et2_implements_registry.et2_INextmatchHeader = function(obj : et2_widget)
{
return implements_methods(obj, ["setNextmatch"]);
}
@ -93,9 +94,8 @@ export interface et2_INextmatchSortable
setSortmode(_sort_mode): void
}
var et2_INextmatchSortable = "et2_INextmatchSortable";
function implements_et2_INextmatchSortable(obj: et2_widget)
export const et2_INextmatchSortable = "et2_INextmatchSortable";
et2_implements_registry.et2_INextmatchSortable = function(obj: et2_widget)
{
return implements_methods(obj, ["setSortmode"]);
}
@ -3105,7 +3105,7 @@ et2_register_widget(et2_nextmatch, ["nextmatch"]);
* actually load templates from the server.
* @augments et2_DOMWidget
*/
class et2_nextmatch_header_bar extends et2_DOMWidget implements et2_INextmatchHeader
export class et2_nextmatch_header_bar extends et2_DOMWidget implements et2_INextmatchHeader
{
static readonly _attributes: any = {
"filter_label": {
@ -4298,7 +4298,7 @@ et2_register_widget(et2_nextmatch_accountfilterheader, ['nextmatch-accountfilter
*
* @augments et2_taglist
*/
class et2_nextmatch_taglistheader extends et2_taglist implements et2_INextmatchHeader, et2_IResizeable
export class et2_nextmatch_taglistheader extends et2_taglist implements et2_INextmatchHeader, et2_IResizeable
{
static readonly _attributes : any = {
autocomplete_url: { default: ''},
@ -4386,7 +4386,7 @@ et2_register_widget(et2_nextmatch_taglistheader, ['nextmatch-taglistheader']);
/**
* Nextmatch filter that can filter for a selected entry
*/
class et2_nextmatch_entryheader extends et2_link_entry implements et2_INextmatchHeader
export class et2_nextmatch_entryheader extends et2_link_entry implements et2_INextmatchHeader
{
/**
* Override to add change handler
@ -4461,7 +4461,7 @@ et2_register_widget(et2_nextmatch_entryheader, ['nextmatch-entryheader']);
/**
* @augments et2_nextmatch_filterheader
*/
class et2_nextmatch_customfilter extends et2_nextmatch_filterheader
export class et2_nextmatch_customfilter extends et2_nextmatch_filterheader
{
static readonly _attributes: any = {
"widget_type": {

View File

@ -4,11 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @copyright Stylite AG 2012-14
* @version $Id$
* @copyright EGroupware GmbH 2012-2021
*/
/**

View File

@ -1,53 +1,22 @@
"use strict";
/**
* EGroupware eTemplate2 - Class which contains a the data model for nextmatch widgets
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2012
* @version $Id$
*
/*egw:uses
et2_core_common;
et2_core_inheritance;
et2_dataview_view_row;
et2_dataview_controller;
et2_dataview_interfaces;
et2_dataview_view_tile;
et2_extension_nextmatch_actions; // Contains nm_action
egw_data;
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_nextmatch_controller = void 0;
var et2_dataview_view_row_1 = require("./et2_dataview_view_row");
var et2_dataview_view_tile_1 = require("./et2_dataview_view_tile");
var et2_dataview_controller_1 = require("./et2_dataview_controller");
var et2_dataview_model_columns_1 = require("./et2_dataview_model_columns");
* @copyright EGroupware GmbH 2011-2021
*/
import { et2_dataview_row } from "./et2_dataview_view_row";
import { et2_dataview_tile } from "./et2_dataview_view_tile";
import { et2_dataview_controller } from "./et2_dataview_controller";
import { et2_dataview_column } from "./et2_dataview_model_columns";
import { framework } from "../jsapi/egw_global";
/**
* @augments et2_dataview_controller
*/
var et2_nextmatch_controller = /** @class */ (function (_super) {
__extends(et2_nextmatch_controller, _super);
export class et2_nextmatch_controller extends et2_dataview_controller {
/**
* Initializes the nextmatch controller.
*
@ -64,62 +33,60 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
* is given.
* @memberOf et2_nextmatch_controller
*/
function et2_nextmatch_controller(_parentController, _egw, _execId, _widget, _parentId, _grid, _rowProvider, _actionLinks, _objectManager, _actions) {
var _this =
constructor(_parentController, _egw, _execId, _widget, _parentId, _grid, _rowProvider, _actionLinks, _objectManager, _actions) {
// Call the parent et2_dataview_controller constructor
_super.call(this, _parentController, _grid) || this;
_this.setDataProvider(_this);
_this.setRowCallback(_this._rowCallback);
_this.setLinkCallback(_this._linkCallback);
_this.setContext(_this);
super(_parentController, _grid);
this.setDataProvider(this);
this.setRowCallback(this._rowCallback);
this.setLinkCallback(this._linkCallback);
this.setContext(this);
// Copy the egw reference
_this.egw = _egw;
this.egw = _egw;
// Keep a reference to the widget
_this._widget = _widget;
this._widget = _widget;
// Copy the given parameters
_this._actionLinks = _actionLinks;
_this._execId = _execId;
this._actionLinks = _actionLinks;
this._execId = _execId;
// Get full widget ID, including path
var id = _widget.getArrayMgr('content').getPath();
if (typeof id == 'string') {
_this._widgetId = id;
this._widgetId = id;
}
else if (id.length === 1) {
_this._widgetId = id[0];
this._widgetId = id[0];
}
else {
_this._widgetId = id.shift() + '[' + id.join('][') + ']';
this._widgetId = id.shift() + '[' + id.join('][') + ']';
}
_this._parentId = _parentId;
_this._rowProvider = _rowProvider;
this._parentId = _parentId;
this._rowProvider = _rowProvider;
// Initialize the action and the object manager
// _initActions calls _init_link_dnd, which uses this._actionLinks,
// so this must happen after the above parameter copying
if (!_objectManager) {
_this._initActions(_actions);
this._initActions(_actions);
}
else {
_this._actionManager = null;
_this._objectManager = _objectManager;
this._actionManager = null;
this._objectManager = _objectManager;
}
_this.setActionObjectManager(_this._objectManager);
this.setActionObjectManager(this._objectManager);
// Add our selection callback to selection manager
var self = _this;
_this._objectManager.setSelectedCallback = function () { self._selectCallback.apply(self, [this, arguments]); };
var self = this;
this._objectManager.setSelectedCallback = function () { self._selectCallback.apply(self, [this, arguments]); };
// We start with no filters
_this._filters = {};
this._filters = {};
// Keep selection across filter changes
_this.kept_selection = null;
_this.kept_focus = null;
_this.kept_expansion = [];
this.kept_selection = null;
this.kept_focus = null;
this.kept_expansion = [];
// Directly use the API-Implementation of dataRegisterUID and
// dataUnregisterUID
_this.dataUnregisterUID = _egw.dataUnregisterUID;
this.dataUnregisterUID = _egw.dataUnregisterUID;
// Default to rows
_this._view = et2_nextmatch_controller.VIEW_ROW;
return _this;
this._view = et2_nextmatch_controller.VIEW_ROW;
}
et2_nextmatch_controller.prototype.destroy = function () {
destroy() {
// If the actionManager variable is set, the object- and actionManager
// were created by this instance -- clear them
if (this._actionManager) {
@ -127,20 +94,20 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
this._actionManager.remove();
}
this._widget = null;
_super.prototype.destroy.call(this);
};
super.destroy();
}
/**
* Updates the filter instance.
*/
et2_nextmatch_controller.prototype.setFilters = function (_filters) {
setFilters(_filters) {
// Update the filters
this._filters = _filters;
};
}
/**
* Keep the selection, if possible, across a data fetch and restore it
* after
*/
et2_nextmatch_controller.prototype.keepSelection = function () {
keepSelection() {
this.kept_selection = this._selectionMgr ? this._selectionMgr.getSelected() : null;
this.kept_focus = this._selectionMgr && this._selectionMgr._focusedEntry ?
this._selectionMgr._focusedEntry.uid || null : null;
@ -153,17 +120,17 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
controller.kept_expansion.push(entry.uid);
}
});
};
et2_nextmatch_controller.prototype.getObjectManager = function () {
}
getObjectManager() {
return this._objectManager;
};
}
/**
* Deletes a row from the grid
*
* @param {string} uid
*/
et2_nextmatch_controller.prototype.deleteRow = function (uid) {
var entry = Object.values(this._indexMap).find(function (entry) { return entry.uid == uid; });
deleteRow(uid) {
var entry = Object.values(this._indexMap).find(entry => entry.uid == uid);
// Unselect
this._selectionMgr.setSelected(uid, false);
if (entry && entry.idx !== null) {
@ -192,11 +159,10 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
// Not needed, they share by reference
// this._selectionMgr.setIndexMap(this._indexMap);
}
for (var _i = 0, _a = this._children; _i < _a.length; _i++) {
var child = _a[_i];
for (let child of this._children) {
child.deleteRow(uid);
}
};
}
/** -- PRIVATE FUNCTIONS -- **/
/**
* Create a new row, either normal or tiled
@ -204,10 +170,10 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
* @param {type} ctx
* @returns {et2_dataview_container}
*/
et2_nextmatch_controller.prototype._createRow = function (ctx) {
_createRow(ctx) {
switch (this._view) {
case et2_nextmatch_controller.VIEW_TILE:
var row = new et2_dataview_view_tile_1.et2_dataview_tile(this._grid);
var row = new et2_dataview_tile(this._grid);
// Try to overcome chrome rendering issue where float is not
// applied properly, leading to incomplete rows
window.setTimeout(function () {
@ -223,13 +189,13 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
return row;
case et2_nextmatch_controller.VIEW_ROW:
default:
return new et2_dataview_view_row_1.et2_dataview_row(this._grid);
return new et2_dataview_row(this._grid);
}
};
}
/**
* Initializes the action and the object manager.
*/
et2_nextmatch_controller.prototype._initActions = function (_actions) {
_initActions(_actions) {
// Generate a uid for the action and object manager
var uid = this._widget.id || this.egw.uid();
if (_actions == null)
@ -303,11 +269,11 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
}
}
}
};
}
/**
* Automatically add dnd support for linking
*/
et2_nextmatch_controller.prototype._init_links_dnd = function () {
_init_links_dnd() {
var mgr = this._actionManager;
var self = this;
var drop_action = mgr.getActionById('egw_link_drop');
@ -403,29 +369,29 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
this._actionLinks.push(drag_action.id);
}
drag_action.set_dragType('link');
};
}
/**
* Set the data cache prefix
* Overridden from the parent to re-check automatically the added link dnd
* since the prefix is used in support detection.
*/
et2_nextmatch_controller.prototype.setPrefix = function (prefix) {
_super.prototype.setPrefix.call(this, prefix);
setPrefix(prefix) {
super.setPrefix(prefix);
this._init_links_dnd();
};
}
/**
* Overwrites the inherited _destroyCallback function in order to be able
* to free the "rowWidget".
*/
et2_nextmatch_controller.prototype._destroyCallback = function (_row) {
_destroyCallback(_row) {
// Destroy any widget associated to the row
if (this.entry.widget) {
this.entry.widget.destroy();
this.entry.widget = null;
}
// Call the inherited function
_super.prototype._destroyCallback.call(this, _row);
};
super._destroyCallback(_row);
}
/**
* Creates the actual data row.
*
@ -436,11 +402,11 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
* this special case used to store the rowWidget reference, so that it can
* be properly freed.
*/
et2_nextmatch_controller.prototype._rowCallback = function (_data, _tr, _idx, _entry) {
_rowCallback(_data, _tr, _idx, _entry) {
// Let the row provider fill in the data row -- store the returned
// rowWidget inside the _entry
_entry.widget = this._rowProvider.getDataRow({ "content": _data }, _tr, _idx, this);
};
}
/**
* Returns the names of action links for a given data row -- currently these are
* always the same links, as we controll enabled/disabled over the row
@ -458,7 +424,7 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
*
* @return Array List of action names that valid for the row
*/
et2_nextmatch_controller.prototype._linkCallback = function (_data, _idx, _uid) {
_linkCallback(_data, _idx, _uid) {
if (_uid.trim() != "") {
return this._actionLinks;
}
@ -486,13 +452,13 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
catch (e) {
}
return links;
};
}
/**
* Overridden from the parent to also process any additional data that
* the data source adds, such as readonlys and additonal content.
* For example, non-numeric IDs in rows are added to the content manager
*/
et2_nextmatch_controller.prototype._fetchCallback = function (_response) {
_fetchCallback(_response) {
var nm = this.self._widget;
if (!nm) {
// Nextmatch either not connected, or it tried to destroy this
@ -542,7 +508,7 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
col_refresh = true;
nm.dataview.columnMgr.getColumnById('col_' + column_index)
.set_visibility(nm.getArrayMgr('content').parseBoolExpression(nm.columns[column_index].disabled) ?
et2_dataview_model_columns_1.et2_dataview_column.ET2_COL_VISIBILITY_DISABLED :
et2_dataview_column.ET2_COL_VISIBILITY_DISABLED :
nm.columns[column_index].visible);
}
}
@ -558,7 +524,7 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
this.self.keepSelection();
}
// Call the inherited function
_super.prototype._fetchCallback.apply(this, arguments);
super._fetchCallback.apply(this, arguments);
// Restore selection, if passed
if (this.self && this.self.kept_selection && this.self._selectionMgr) {
if (this.self.kept_selection.all) {
@ -584,11 +550,11 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
}
this.self.kept_focus = null;
}
};
}
/**
* Execute the select callback when the row selection changes
*/
et2_nextmatch_controller.prototype._selectCallback = function (action, senders) {
_selectCallback(action, senders) {
if (typeof senders == "undefined") {
senders = [];
}
@ -598,9 +564,9 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
if (egwIsMobile())
framework.nm_onselect_ctrl(this._widget, action, senders);
this._widget.onselect.call(this._widget, action, senders);
};
}
/** -- Implementation of et2_IDataProvider -- **/
et2_nextmatch_controller.prototype.dataFetch = function (_queriedRange, _callback, _context) {
dataFetch(_queriedRange, _callback, _context) {
// Merge the parent id into the _queriedRange if it is set
if (this._parentId !== null) {
_queriedRange["parent_id"] = this._parentId;
@ -613,21 +579,19 @@ var et2_nextmatch_controller = /** @class */ (function (_super) {
// Pass the fetch call to the API, multiplex the data about the
// nextmatch instance into the call.
this.egw.dataFetch(this._widget.getInstanceManager().etemplate_exec_id || this._execId, _queriedRange, obj._filters, this._widgetId, _callback, _context);
};
et2_nextmatch_controller.prototype.dataRegisterUID = function (_uid, _callback, _context) {
}
dataRegisterUID(_uid, _callback, _context) {
// Make sure we use correct prefix when data comes back
if (this._widget && this._widget._get_appname() != this.egw.getAppName()) {
_context.prefix = _uid.split('::')[0];
}
this.egw.dataRegisterUID(_uid, _callback, _context, this._widget.getInstanceManager().etemplate_exec_id || this._execId, this._widgetId);
};
et2_nextmatch_controller.prototype.dataUnregisterUID = function () {
}
dataUnregisterUID() {
// Overwritten in the constructor
};
// Display constants
et2_nextmatch_controller.VIEW_ROW = 'row';
et2_nextmatch_controller.VIEW_TILE = 'tile';
return et2_nextmatch_controller;
}(et2_dataview_controller_1.et2_dataview_controller));
exports.et2_nextmatch_controller = et2_nextmatch_controller;
}
}
// Display constants
et2_nextmatch_controller.VIEW_ROW = 'row';
et2_nextmatch_controller.VIEW_TILE = 'tile';
//# sourceMappingURL=et2_extension_nextmatch_controller.js.map

View File

@ -4,11 +4,10 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2012
* @version $Id$
*
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
et2_core_common;
@ -30,6 +29,7 @@ import {et2_dataview_tile} from "./et2_dataview_view_tile";
import {et2_nextmatch} from "./et2_extension_nextmatch";
import {et2_dataview_controller} from "./et2_dataview_controller";
import {et2_dataview_column} from "./et2_dataview_model_columns";
import {framework, Iegw} from "../jsapi/egw_global";
/**
* @augments et2_dataview_controller
@ -41,6 +41,18 @@ export class et2_nextmatch_controller extends et2_dataview_controller implements
public static readonly VIEW_TILE: string = 'tile';
private _widget: et2_nextmatch;
private egw: Iegw;
private _actionLinks: any;
private _execId: string;
private _widgetId: string;
private _parentId: string;
private _rowProvider: any;
private _actionManager: any;
private _filters: any;
private kept_selection: any;
private kept_focus: any;
private kept_expansion: any[];
private _view: string;
/**
* Initializes the nextmatch controller.

View File

@ -1,30 +1,13 @@
"use strict";
/**
* EGroupware eTemplate2 - Class which contains a factory method for rows
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2012
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_nextmatch_rowProvider = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_inheritance;
@ -33,14 +16,17 @@ exports.et2_nextmatch_rowProvider = void 0;
et2_core_widget;
et2_dataview_view_rowProvider;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_arrayMgr_1 = require("./et2_core_arrayMgr");
import { et2_widget } from "./et2_core_widget";
import { et2_arrayMgrs_expand } from "./et2_core_arrayMgr";
import { et2_dataview_grid } from "./et2_dataview_view_grid";
import { egw } from "../jsapi/egw_global";
import { et2_IDetachedDOM, et2_IDOMNode } from "./et2_core_interfaces";
/**
* The row provider contains prototypes (full clonable dom-trees)
* for all registered row types.
*
*/
var et2_nextmatch_rowProvider = /** @class */ (function () {
export class et2_nextmatch_rowProvider {
/**
* Creates the nextmatch row provider.
*
@ -49,7 +35,7 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
* @param {object} _context
* @memberOf et2_nextmatch_rowProvider
*/
function et2_nextmatch_rowProvider(_rowProvider, _subgridCallback, _context) {
constructor(_rowProvider, _subgridCallback, _context) {
/**
* Match category-ids from class attribute eg. "cat_15" or "123,456,789 "
*
@ -68,12 +54,12 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
this._context = _context;
this._createEmptyPrototype();
}
et2_nextmatch_rowProvider.prototype.destroy = function () {
destroy() {
this._rowProvider.destroy();
this._subgridCallback = null;
this._context = null;
this._dataRow = null;
};
}
/**
* Creates the data row prototype.
*
@ -82,7 +68,7 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
* @param _rootWidget is the parent widget of the data rows (i.e.
* the nextmatch)
*/
et2_nextmatch_rowProvider.prototype.setDataRowTemplate = function (_widgets, _rowData, _rootWidget) {
setDataRowTemplate(_widgets, _rowData, _rootWidget) {
// Copy the root widget
this._rootWidget = _rootWidget;
// Create the base row
@ -118,12 +104,12 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
row.children().each(function () { tmpl.appendChild(this); });
this._dataRow = tmpl;
this._template = rowTemplate;
};
et2_nextmatch_rowProvider.prototype.getDataRow = function (_data, _row, _idx, _controller) {
}
getDataRow(_data, _row, _idx, _controller) {
// Clone the row template
var row = this._dataRow.cloneNode(true);
// Create array managers with the given data merged in
var mgrs = et2_core_arrayMgr_1.et2_arrayMgrs_expand(rowWidget, this._template.mgrs, _data, _idx);
var mgrs = et2_arrayMgrs_expand(rowWidget, this._template.mgrs, _data, _idx);
// Insert the widgets into the row which do not provide the functions
// to set the _data directly
var rowWidget = null;
@ -200,7 +186,7 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
// Set the row data
this._setRowData(this._template.rowData, tr, mgrs);
return rowWidget;
};
}
/**
* Placeholder for empty row
*
@ -208,7 +194,7 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
* This allows the user to still have a drop target, or use actions that
* do not require a row ID, such as 'Add new'.
*/
et2_nextmatch_rowProvider.prototype._createEmptyPrototype = function () {
_createEmptyPrototype() {
var label = this._context && this._context.options && this._context.options.settings.placeholder;
var placeholder = jQuery(document.createElement("td"))
.attr("colspan", this._rowProvider.getColumnCount())
@ -217,16 +203,16 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
this._rowProvider._prototypes["empty"] = jQuery(document.createElement("tr"))
.addClass("egwGridView_empty")
.append(placeholder);
};
}
/** -- PRIVATE FUNCTIONS -- **/
/**
* Returns an array containing objects which have variable attributes
*
* @param {et2_widget} _widget
*/
et2_nextmatch_rowProvider.prototype._getVariableAttributeSet = function (_widget) {
var variableAttributes = [];
var process = function (_widget) {
_getVariableAttributeSet(_widget) {
let variableAttributes = [];
const process = function (_widget) {
// Create the attribtues
var hasAttr = false;
var widgetData = {
@ -234,10 +220,10 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
"data": []
};
// Get all attribute values
for (var key in _widget.attributes) {
for (const key in _widget.attributes) {
if (!_widget.attributes[key].ignore &&
typeof _widget.options[key] != "undefined") {
var val = _widget.options[key];
const val = _widget.options[key];
// TODO: Improve detection
if (typeof val == "string" && val.indexOf("$") >= 0) {
hasAttr = true;
@ -254,7 +240,7 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
}
};
// Check each column
var columns = _widget._widgets;
const columns = _widget._widgets;
for (var i = 0; i < columns.length; i++) {
// If column is hidden, don't process it
if (typeof columns[i] === 'undefined' || this._context && this._context.columns && this._context.columns[i] && !this._context.columns[i].visible) {
@ -263,8 +249,8 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
columns[i].iterateOver(process, this);
}
return variableAttributes;
};
et2_nextmatch_rowProvider.prototype._seperateWidgets = function (_varAttrs) {
}
_seperateWidgets(_varAttrs) {
// The detachable array contains all widgets which implement the
// et2_IDetachedDOM interface for all needed attributes
var detachable = [];
@ -324,13 +310,13 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
"detachable": detachable,
"remaining": remaining
};
};
}
/**
* Removes to DOM code for all widgets in the "remaining" slot
*
* @param {object} _rowTemplate
*/
et2_nextmatch_rowProvider.prototype._stripTemplateRow = function (_rowTemplate) {
_stripTemplateRow(_rowTemplate) {
_rowTemplate.placeholders = [];
for (var i = 0; i < _rowTemplate.seperated.remaining.length; i++) {
var entry = _rowTemplate.seperated.remaining[i];
@ -354,8 +340,8 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
}
}
}
};
et2_nextmatch_rowProvider.prototype._nodeIndex = function (_node) {
}
_nodeIndex(_node) {
if (_node.parentNode == null) {
return 0;
}
@ -365,14 +351,14 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
}
}
return -1;
};
}
/**
* Returns a function which does a relative access on the given DOM-Node
*
* @param {DOMElement} _root
* @param {DOMElement} _target
*/
et2_nextmatch_rowProvider.prototype._compileDOMAccessFunc = function (_root, _target) {
_compileDOMAccessFunc(_root, _target) {
function recordPath(_root, _target, _path) {
if (typeof _path == "undefined") {
_path = [];
@ -394,13 +380,13 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
}
}
return new Function("_node", recordPath.call(this, _root, _target));
};
}
/**
* Builds relative paths to the DOM-Nodes and compiles fast-access functions
*
* @param {object} _rowTemplate
*/
et2_nextmatch_rowProvider.prototype._buildNodeAccessFuncs = function (_rowTemplate) {
_buildNodeAccessFuncs(_rowTemplate) {
for (var i = 0; i < _rowTemplate.seperated.detachable.length; i++) {
var entry = _rowTemplate.seperated.detachable[i];
// Get all needed nodes from the widget
@ -411,7 +397,7 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
nodeFuncs[j] = this._compileDOMAccessFunc(_rowTemplate.row, nodes[j]);
}
}
};
}
/**
* Applies additional row data (like the class) to the tr
*
@ -419,7 +405,7 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
* @param {DOMElement} _tr
* @param {object} _mgrs
*/
et2_nextmatch_rowProvider.prototype._setRowData = function (_data, _tr, _mgrs) {
_setRowData(_data, _tr, _mgrs) {
// TODO: Implement other fields than "class"
if (_data["class"]) {
var classes = _mgrs["content"].expandName(_data["class"]);
@ -449,15 +435,12 @@ var et2_nextmatch_rowProvider = /** @class */ (function () {
var align = _mgrs["content"].expandName(_data["valign"]);
_tr.setAttribute("valign", align);
}
};
return et2_nextmatch_rowProvider;
}());
exports.et2_nextmatch_rowProvider = et2_nextmatch_rowProvider;
}
}
/**
* @augments et2_widget
*/
var et2_nextmatch_rowWidget = /** @class */ (function (_super) {
__extends(et2_nextmatch_rowWidget, _super);
export class et2_nextmatch_rowWidget extends et2_widget {
/**
* Constructor
*
@ -465,16 +448,14 @@ var et2_nextmatch_rowWidget = /** @class */ (function (_super) {
* @param _row
* @memberOf et2_nextmatch_rowWidget
*/
function et2_nextmatch_rowWidget(_mgrs, _row) {
var _this =
constructor(_mgrs, _row) {
// Call the parent constructor with some dummy attributes
_super.call(this, null, { "id": "", "type": "rowWidget" }) || this;
super(null, { "id": "", "type": "rowWidget" });
// Initialize some variables
_this._widgets = [];
this._widgets = [];
// Copy the given DOM node and the content arrays
_this._mgrs = _mgrs;
_this._row = _row;
return _this;
this._mgrs = _mgrs;
this._row = _row;
}
/**
* Copies the given array manager and clones the given widgets and inserts
@ -482,10 +463,10 @@ var et2_nextmatch_rowWidget = /** @class */ (function (_super) {
*
* @param {array} _widgets
*/
et2_nextmatch_rowWidget.prototype.createWidgets = function (_widgets) {
createWidgets(_widgets) {
// Clone the given the widgets with this element as parent
this._widgets = [];
var row_id = 0;
let row_id = 0;
for (var i = 0; i < _widgets.length; i++) {
// Disabled columns might be missing widget - skip it
if (!_widgets[i])
@ -498,14 +479,14 @@ var et2_nextmatch_rowWidget = /** @class */ (function (_super) {
}
row_id++;
}
};
}
/**
* Returns the column node for the given sender
*
* @param {et2_widget} _sender
* @return {DOMElement}
*/
et2_nextmatch_rowWidget.prototype.getDOMNode = function (_sender) {
getDOMNode(_sender) {
var row_id = 0;
for (var i = 0; i < this._widgets.length; i++) {
// Disabled columns might be missing widget - skip it
@ -517,14 +498,12 @@ var et2_nextmatch_rowWidget = /** @class */ (function (_super) {
row_id++;
}
return null;
};
return et2_nextmatch_rowWidget;
}(et2_core_widget_1.et2_widget));
}
}
/**
* @augments et2_widget
*/
var et2_nextmatch_rowTemplateWidget = /** @class */ (function (_super) {
__extends(et2_nextmatch_rowTemplateWidget, _super);
export class et2_nextmatch_rowTemplateWidget extends et2_widget {
/**
* Constructor
*
@ -532,20 +511,18 @@ var et2_nextmatch_rowTemplateWidget = /** @class */ (function (_super) {
* @param _row
* @memberOf et2_nextmatch_rowTemplateWidget
*/
function et2_nextmatch_rowTemplateWidget(_root, _row) {
var _this =
constructor(_root, _row) {
// Call the parent constructor with some dummy attributes
_super.call(this, null, { "id": "", "type": "rowTemplateWidget" }) || this;
_this._root = _root;
_this._mgrs = {};
_this._row = _row;
super(null, { "id": "", "type": "rowTemplateWidget" });
this._root = _root;
this._mgrs = {};
this._row = _row;
// Set parent to root widget, so sub-widget calls still work
_this._parent = _root;
this._parent = _root;
// Clone the widgets inside the placeholders array
_this._widgets = [];
return _this;
this._widgets = [];
}
et2_nextmatch_rowTemplateWidget.prototype.createWidgets = function (_mgrs, _widgets) {
createWidgets(_mgrs, _widgets) {
// Set the array managers - don't use setArrayMgrs here as this creates
// an unnecessary copy of the object
this._mgrs = _mgrs;
@ -558,21 +535,20 @@ var et2_nextmatch_rowTemplateWidget = /** @class */ (function (_super) {
};
this._widgets[i].widget.loadingFinished();
}
};
}
/**
* Returns the column node for the given sender
*
* @param {et2_widget} _sender
* @return {DOMElement}
*/
et2_nextmatch_rowTemplateWidget.prototype.getDOMNode = function (_sender) {
getDOMNode(_sender) {
for (var i = 0; i < this._widgets.length; i++) {
if (this._widgets[i].widget == _sender) {
return this._widgets[i].node;
}
}
return null;
};
return et2_nextmatch_rowTemplateWidget;
}(et2_core_widget_1.et2_widget));
}
}
//# sourceMappingURL=et2_extension_nextmatch_rowProvider.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2012
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
@ -21,6 +20,9 @@
import {et2_widget} from "./et2_core_widget";
import {et2_arrayMgrs_expand} from "./et2_core_arrayMgr";
import {et2_dataview_grid} from "./et2_dataview_view_grid";
import {egw} from "../jsapi/egw_global";
import {et2_IDetachedDOM, et2_IDOMNode} from "./et2_core_interfaces";
/**
* The row provider contains prototypes (full clonable dom-trees)
@ -590,7 +592,7 @@ export class et2_nextmatch_rowProvider
/**
* @augments et2_widget
*/
class et2_nextmatch_rowWidget extends et2_widget implements et2_IDOMNode
export class et2_nextmatch_rowWidget extends et2_widget implements et2_IDOMNode
{
private _widgets: any[];
private _row: any;
@ -669,7 +671,7 @@ class et2_nextmatch_rowWidget extends et2_widget implements et2_IDOMNode
/**
* @augments et2_widget
*/
class et2_nextmatch_rowTemplateWidget extends et2_widget implements et2_IDOMNode
export class et2_nextmatch_rowTemplateWidget extends et2_widget implements et2_IDOMNode
{
private _root: any;
private _row: any;

View File

@ -1,4 +1,3 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Ajax select / auto complete object
@ -6,35 +5,21 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2012
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
/vendor/bower-asset/jquery-ui/jquery-ui.js;
et2_core_inputWidget;
et2_core_valueWidget;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inputWidget_1 = require("./et2_core_inputWidget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
var et2_widget_selectbox_1 = require("./et2_widget_selectbox");
import { et2_register_widget } from "./et2_core_widget";
import { et2_inputWidget } from "./et2_core_inputWidget";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_valueWidget } from "./et2_core_valueWidget";
import { et2_selectbox } from "./et2_widget_selectbox";
/**
* Using AJAX, this widget allows a type-ahead find similar to a ComboBox, where as the user enters information,
* a drop-down box is populated with the n closest matches. If the user clicks on an item in the drop-down, that
@ -44,38 +29,35 @@ var et2_widget_selectbox_1 = require("./et2_widget_selectbox");
* This widget can get data from any function that can provide data to a nextmatch widget.
* @augments et2_inputWidget
*/
var et2_ajaxSelect = /** @class */ (function (_super) {
__extends(et2_ajaxSelect, _super);
export class et2_ajaxSelect extends et2_inputWidget {
/**
* Constructor
*
* @memberOf et2_ajaxSelect
*/
function et2_ajaxSelect(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_ajaxSelect._attributes, _child || {})) || this;
_this.input = null;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_ajaxSelect._attributes, _child || {}));
this.input = null;
if (typeof _attrs.get_rows == 'string') {
_attrs.get_rows = _this.egw().link('/index.php', {
menuaction: _this.options.get_rows
_attrs.get_rows = this.egw().link('/index.php', {
menuaction: this.options.get_rows
});
}
_this.createInputWidget();
_this.input = null;
_this.createInputWidget();
return _this;
this.createInputWidget();
this.input = null;
this.createInputWidget();
}
et2_ajaxSelect.prototype.createInputWidget = function () {
createInputWidget() {
this.input = jQuery(document.createElement("input"));
this.input.addClass("et2_textbox");
this.setDOMNode(this.input[0]);
var widget = this;
let widget = this;
this.input.autocomplete({
delay: 100,
source: this.options.get_rows ?
this.options.get_rows :
et2_widget_selectbox_1.et2_selectbox.find_select_options(this, this.options.values),
et2_selectbox.find_select_options(this, this.options.values),
select: function (event, ui) {
widget.value = ui.item[widget.options.id_field];
if (widget.options.get_title) {
@ -93,18 +75,18 @@ var et2_ajaxSelect = /** @class */ (function (_super) {
return false;
}
});
};
et2_ajaxSelect.prototype.getValue = function () {
}
getValue() {
if (this.options.blur && this.input.val() == this.options.blur)
return "";
return this.value;
};
et2_ajaxSelect.prototype.set_value = function (_value) {
}
set_value(_value) {
this.value = _value;
if (this.input.autocomplete('instance')) {
var source = this.input.autocomplete('option', 'source');
let source = this.input.autocomplete('option', 'source');
if (typeof source == 'object') {
for (var i in source) {
for (let i in source) {
if (typeof source[i].value != 'undefined' && typeof source[i].label != 'undefined' && source[i].value === _value) {
this.input.val(source[i].label);
}
@ -118,8 +100,8 @@ var et2_ajaxSelect = /** @class */ (function (_super) {
// TODO
}
}
};
et2_ajaxSelect.prototype.set_blur = function (_value) {
}
set_blur(_value) {
if (_value) {
this.input.attr("placeholder", _value + ""); // HTML5
if (!this.input[0]["placeholder"]) {
@ -138,111 +120,106 @@ var et2_ajaxSelect = /** @class */ (function (_super) {
else {
this.input.removeAttr("placeholder");
}
};
et2_ajaxSelect._attributes = {
'get_rows': {
"name": "Data source",
"type": "any",
"default": "",
"description": "Function to get search results, either a javascript function or server-side."
},
'get_title': {
"name": "Title function",
"type": "any",
"default": "",
"description": "Function to get title for selected entry. Used when closed, and if no template is given."
},
'id_field': {
"name": "Result ID field",
"type": "string",
"default": "value",
"description": "Which key in result sub-array to look for row ID. If omitted, the key for the row will be used."
},
'template': {
"name": "Row template",
"type": "string",
"default": "",
"description": "ID of the template to use to display rows. If omitted, title will be shown for each result."
},
'filter': {
"name": "Filter",
"type": "string",
"default": "",
"description": "Apply filter to search results. Same as nextmatch."
},
'filter2': {
"name": "Filter 2",
"type": "string",
"default": "",
"description": "Apply filter to search results. Same as nextmatch."
},
'link': {
"name": "Read only link",
"type": "boolean",
"default": "true",
"description": "If readonly, widget will be text. If link is set, widget will be a link."
},
// Pass by code only
'values': {
"name": "Values",
"type": "any",
"default": {},
"description": "Specify the available options. Use this, or Data source."
}
};
return et2_ajaxSelect;
}(et2_core_inputWidget_1.et2_inputWidget));
et2_core_widget_1.et2_register_widget(et2_ajaxSelect, ["ajax_select"]);
}
}
et2_ajaxSelect._attributes = {
'get_rows': {
"name": "Data source",
"type": "any",
"default": "",
"description": "Function to get search results, either a javascript function or server-side."
},
'get_title': {
"name": "Title function",
"type": "any",
"default": "",
"description": "Function to get title for selected entry. Used when closed, and if no template is given."
},
'id_field': {
"name": "Result ID field",
"type": "string",
"default": "value",
"description": "Which key in result sub-array to look for row ID. If omitted, the key for the row will be used."
},
'template': {
"name": "Row template",
"type": "string",
"default": "",
"description": "ID of the template to use to display rows. If omitted, title will be shown for each result."
},
'filter': {
"name": "Filter",
"type": "string",
"default": "",
"description": "Apply filter to search results. Same as nextmatch."
},
'filter2': {
"name": "Filter 2",
"type": "string",
"default": "",
"description": "Apply filter to search results. Same as nextmatch."
},
'link': {
"name": "Read only link",
"type": "boolean",
"default": "true",
"description": "If readonly, widget will be text. If link is set, widget will be a link."
},
// Pass by code only
'values': {
"name": "Values",
"type": "any",
"default": {},
"description": "Specify the available options. Use this, or Data source."
}
};
et2_register_widget(et2_ajaxSelect, ["ajax_select"]);
/**
* et2_textbox_ro is the dummy readonly implementation of the textbox.
* @augments et2_valueWidget
*/
var et2_ajaxSelect_ro = /** @class */ (function (_super) {
__extends(et2_ajaxSelect_ro, _super);
export class et2_ajaxSelect_ro extends et2_valueWidget {
/**
* Constructor
*
* @memberOf et2_ajaxSelect_ro
*/
function et2_ajaxSelect_ro(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_ajaxSelect_ro._attributes, _child || {})) || this;
_this.value = "";
_this.span = jQuery(document.createElement("span"));
_this.setDOMNode(_this.span[0]);
return _this;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_ajaxSelect_ro._attributes, _child || {}));
this.value = "";
this.span = jQuery(document.createElement("span"));
this.setDOMNode(this.span[0]);
}
et2_ajaxSelect_ro.prototype.set_value = function (_value) {
set_value(_value) {
this.value = _value;
if (!_value)
_value = "";
this.span.text(_value);
};
}
/**
* Code for implementing et2_IDetachedDOM
*/
et2_ajaxSelect_ro.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push("value");
};
et2_ajaxSelect_ro.prototype.getDetachedNodes = function () {
}
getDetachedNodes() {
return [this.span[0]];
};
et2_ajaxSelect_ro.prototype.setDetachedAttributes = function (_nodes, _values) {
}
setDetachedAttributes(_nodes, _values) {
this.span = jQuery(_nodes[0]);
if (typeof _values["value"] != 'undefined') {
this.set_value(_values["value"]);
}
};
/**
* Ignore all more advanced attributes.
*/
et2_ajaxSelect_ro._attributes = {
"multiline": {
"ignore": true
}
};
return et2_ajaxSelect_ro;
}(et2_core_valueWidget_1.et2_valueWidget));
et2_core_widget_1.et2_register_widget(et2_ajaxSelect_ro, ["ajax_select_ro"]);
}
}
/**
* Ignore all more advanced attributes.
*/
et2_ajaxSelect_ro._attributes = {
"multiline": {
"ignore": true
}
};
et2_register_widget(et2_ajaxSelect_ro, ["ajax_select_ro"]);
//# sourceMappingURL=et2_widget_ajaxSelect.js.map

View File

@ -5,7 +5,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2012
*/
@ -22,6 +22,7 @@ import {et2_inputWidget} from "./et2_core_inputWidget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_valueWidget} from "./et2_core_valueWidget";
import {et2_selectbox} from "./et2_widget_selectbox";
import {et2_IDetachedDOM} from "./et2_core_interfaces";
/**
* Using AJAX, this widget allows a type-ahead find similar to a ComboBox, where as the user enters information,
@ -32,7 +33,7 @@ import {et2_selectbox} from "./et2_widget_selectbox";
* This widget can get data from any function that can provide data to a nextmatch widget.
* @augments et2_inputWidget
*/
class et2_ajaxSelect extends et2_inputWidget
export class et2_ajaxSelect extends et2_inputWidget
{
static readonly _attributes : any = {
'get_rows': {
@ -204,7 +205,7 @@ et2_register_widget(et2_ajaxSelect, ["ajax_select"]);
* et2_textbox_ro is the dummy readonly implementation of the textbox.
* @augments et2_valueWidget
*/
class et2_ajaxSelect_ro extends et2_valueWidget implements et2_IDetachedDOM
export class et2_ajaxSelect_ro extends et2_valueWidget implements et2_IDetachedDOM
{
/**
* Ignore all more advanced attributes.

View File

@ -1,38 +1,21 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Audio tag
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Hadi Nategh <hn[at]egroupware.org>
* @copyright EGroupware GmbH
* @version $Id$
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_audio = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_interfaces;
et2_core_baseWidget;
*/
var et2_core_baseWidget_1 = require("./et2_core_baseWidget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_widget_1 = require("./et2_core_widget");
import { et2_baseWidget } from './et2_core_baseWidget';
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_register_widget } from "./et2_core_widget";
/**
* This widget represents the HTML5 Audio tag with all its optional attributes
*
@ -59,39 +42,37 @@ var et2_core_widget_1 = require("./et2_core_widget");
*
* @augments et2_baseWidget
*/
var et2_audio = /** @class */ (function (_super) {
__extends(et2_audio, _super);
function et2_audio(_parent, _attrs, _child) {
var _this = _super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_audio._attributes, _child || {})) || this;
_this.audio = null;
_this.container = null;
export class et2_audio extends et2_baseWidget {
constructor(_parent, _attrs, _child) {
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_audio._attributes, _child || {}));
this.audio = null;
this.container = null;
//Create Audio tag
_this.audio = new Audio();
this.audio = new Audio();
// Container
_this.container = document.createElement('div');
_this.container.append(_this.audio);
_this.container.classList.add('et2_audio');
if (_this.options.autohide)
_this.container.classList.add('et2_audio_autohide');
if (_this.options.controls)
_this.audio.setAttribute("controls", '1');
if (_this.options.autoplay)
_this.audio.setAttribute("autoplay", '1');
if (_this.options.muted)
_this.audio.setAttribute("muted", '1');
if (_this.options.loop)
_this.audio.setAttribute("loop", '1');
if (_this.options.preload)
_this.audio.setAttribute('preload', _this.options.preload);
_this.setDOMNode(_this.container);
return _this;
this.container = document.createElement('div');
this.container.append(this.audio);
this.container.classList.add('et2_audio');
if (this.options.autohide)
this.container.classList.add('et2_audio_autohide');
if (this.options.controls)
this.audio.setAttribute("controls", '1');
if (this.options.autoplay)
this.audio.setAttribute("autoplay", '1');
if (this.options.muted)
this.audio.setAttribute("muted", '1');
if (this.options.loop)
this.audio.setAttribute("loop", '1');
if (this.options.preload)
this.audio.setAttribute('preload', this.options.preload);
this.setDOMNode(this.container);
}
/**
* Set audio source
*
* @param {string} _value url
*/
et2_audio.prototype.set_src = function (_value) {
set_src(_value) {
if (_value) {
this.audio.setAttribute('src', _value);
if (this.options.src_type) {
@ -101,72 +82,70 @@ var et2_audio = /** @class */ (function (_super) {
if (this.options.preload != "none")
this.audio.load();
}
};
}
/**
* @return Promise
*/
et2_audio.prototype.play = function () {
play() {
return this.audio.play();
};
et2_audio.prototype.pause = function () {
}
pause() {
this.audio.pause();
};
et2_audio.prototype.currentTime = function () {
}
currentTime() {
return this.audio.currentTime;
};
et2_audio.prototype.seek = function (_time) {
}
seek(_time) {
this.audio.currentTime = _time;
};
et2_audio._attributes = {
"src": {
"name": "Audio",
"type": "string",
"description": "Source of audio to play"
},
"src_type": {
"name": "Source type",
"type": "string",
"description": "Defines the type the stream source provided"
},
"muted": {
"name": "Audio control",
"type": "boolean",
"default": false,
"description": "Defines that the audio output should be muted"
},
"autoplay": {
"name": "Autoplay",
"type": "boolean",
"default": false,
"description": "Defines if audio will start playing as soon as it is ready"
},
"controls": {
"name": "Control buttons",
"type": "boolean",
"default": true,
"description": "Defines if audio controls, play/pause buttons should be displayed"
},
"loop": {
"name": "Audio loop",
"type": "boolean",
"default": false,
"description": "Defines if the audio should be played repeatedly"
},
"autohide": {
"name": "Auto hide",
"type": "boolean",
"default": false,
"description": "Auto hides audio control bars and only shows a play button, hovering for few seconds will show the whole controlbar."
},
"preload": {
"name": "preload",
"type": "string",
"default": 'auto',
"description": "preloads audio source based on given option. none(do not preload), auto(preload), metadata(preload metadata only)."
}
};
return et2_audio;
}(et2_core_baseWidget_1.et2_baseWidget));
exports.et2_audio = et2_audio;
et2_core_widget_1.et2_register_widget(et2_audio, ["audio"]);
}
}
et2_audio._attributes = {
"src": {
"name": "Audio",
"type": "string",
"description": "Source of audio to play"
},
"src_type": {
"name": "Source type",
"type": "string",
"description": "Defines the type the stream source provided"
},
"muted": {
"name": "Audio control",
"type": "boolean",
"default": false,
"description": "Defines that the audio output should be muted"
},
"autoplay": {
"name": "Autoplay",
"type": "boolean",
"default": false,
"description": "Defines if audio will start playing as soon as it is ready"
},
"controls": {
"name": "Control buttons",
"type": "boolean",
"default": true,
"description": "Defines if audio controls, play/pause buttons should be displayed"
},
"loop": {
"name": "Audio loop",
"type": "boolean",
"default": false,
"description": "Defines if the audio should be played repeatedly"
},
"autohide": {
"name": "Auto hide",
"type": "boolean",
"default": false,
"description": "Auto hides audio control bars and only shows a play button, hovering for few seconds will show the whole controlbar."
},
"preload": {
"name": "preload",
"type": "string",
"default": 'auto',
"description": "preloads audio source based on given option. none(do not preload), auto(preload), metadata(preload metadata only)."
}
};
et2_register_widget(et2_audio, ["audio"]);
//# sourceMappingURL=et2_widget_audio.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Hadi Nategh <hn[at]egroupware.org>
* @copyright EGroupware GmbH
* @version $Id$
*/
/*egw:uses
@ -19,6 +18,7 @@
import { et2_baseWidget } from './et2_core_baseWidget'
import {ClassWithAttributes} from "./et2_core_inheritance";
import {WidgetConfig, et2_register_widget} from "./et2_core_widget";
import {et2_IDOMNode} from "./et2_core_interfaces";
/**
* This widget represents the HTML5 Audio tag with all its optional attributes

View File

@ -1,30 +1,13 @@
"use strict";
/**
* EGroupware eTemplate2 - JS barcode widget
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Hadi Nategh <hn[at]stylite.de>
* @copyright Stylite AG
* @version $Id:$
* @copyright EGroupware GmbH
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_barcode = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
/api/js/jquery/barcode/jquery-barcode.min.js;
@ -52,30 +35,27 @@ exports.et2_barcode = void 0;
*
* Further information about types and formats are defined in static part of the class at the end
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
import { et2_register_widget } from "./et2_core_widget";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_valueWidget } from "./et2_core_valueWidget";
/**
* Class which implements the "barcode" XET-Tag
*
*/
var et2_barcode = /** @class */ (function (_super) {
__extends(et2_barcode, _super);
export class et2_barcode extends et2_valueWidget {
/**
* Constructor
*/
function et2_barcode(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_barcode._attributes, _child || {})) || this;
_this.div = jQuery(document.createElement('div')).attr({ class: 'et2_barcode' });
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_barcode._attributes, _child || {}));
this.div = jQuery(document.createElement('div')).attr({ class: 'et2_barcode' });
// Set domid
_this.set_id(_this.id);
_this.setDOMNode(_this.div[0]);
_this.createWidget();
return _this;
this.set_id(this.id);
this.setDOMNode(this.div[0]);
this.createWidget();
}
et2_barcode.prototype.createWidget = function () {
createWidget() {
this.settings = {
output: this.options.format,
bgColor: this.options.bgColor,
@ -87,74 +67,72 @@ var et2_barcode = /** @class */ (function (_super) {
// @ts-ignore
this.div.barcode(this.get_value(), this.options.code_type, this.settings);
}
};
et2_barcode.prototype.set_value = function (_val) {
}
set_value(_val) {
if (typeof _val !== 'undefined') {
this.value = _val;
this.createWidget();
}
};
// Class Constants
/*
* type const
*/
et2_barcode.TYPE_CODEBAR = "codebar";
et2_barcode.TYPE_CODE11 = "code11"; //(code 11)
et2_barcode.TYPE_CODE39 = "code39"; //(code 39)
et2_barcode.TYPE_CODE128 = "code128"; //(code 128)
et2_barcode.TYPE_EAN8 = "ean8"; //(ean 8) - http://barcode-coder.com/en/ean-8-specification-101.html
et2_barcode.TYPE_EAN13 = "ean13"; //(ean 13) - http://barcode-coder.com/en/ean-13-specification-102.html
et2_barcode.TYPE_STD25 = "std25"; //(standard 2 of 5 - industrial 2 of 5) - http://barcode-coder.com/en/standard-2-of-5-specification-103.html
et2_barcode.TYPE_INT25 = "int25"; //(interleaved 2 of 5)
et2_barcode.TYPE_MSI = "msi";
et2_barcode.TYPE_DATAMATRIX = "datamatrix"; //(ASCII + extended) - http://barcode-coder.com/en/datamatrix-specification-104.html
/**
* Formats consts
*/
et2_barcode.FORMAT_CSS = "css";
et2_barcode.FORMAT_SVG = "svg";
et2_barcode.FORMAT_bmp = "bmp";
et2_barcode.FORMAT_CANVAS = "canvas";
et2_barcode._attributes = {
"code_type": {
"name": "code type",
"type": "string",
"default": et2_barcode.TYPE_DATAMATRIX,
"description": "Barcode type to be generated, default is QR barcode"
},
bgColor: {
"name": "bgColor",
"type": "string",
"default": '#FFFFFF',
"description": "Defines backgorund color of barcode container"
},
barColor: {
"name": "barColor",
"type": "string",
"default": '#000000',
"description": "Defines color of the bars in barcode."
},
format: {
"name": "format",
"type": "string",
"default": 'css',
"description": "Defines in which format the barcode should be rendered. Default is SVG."
},
barWidth: {
"name": "bar width",
"type": "string",
"default": '1',
"description": "Defines width of each bar in the barcode."
},
barHeight: {
"name": "bar height",
"type": "string",
"default": '50',
"description": "Defines heigh of each bar in the barcode."
},
};
return et2_barcode;
}(et2_core_valueWidget_1.et2_valueWidget));
exports.et2_barcode = et2_barcode;
et2_core_widget_1.et2_register_widget(et2_barcode, ["barcode"]);
}
}
// Class Constants
/*
* type const
*/
et2_barcode.TYPE_CODEBAR = "codebar";
et2_barcode.TYPE_CODE11 = "code11"; //(code 11)
et2_barcode.TYPE_CODE39 = "code39"; //(code 39)
et2_barcode.TYPE_CODE128 = "code128"; //(code 128)
et2_barcode.TYPE_EAN8 = "ean8"; //(ean 8) - http://barcode-coder.com/en/ean-8-specification-101.html
et2_barcode.TYPE_EAN13 = "ean13"; //(ean 13) - http://barcode-coder.com/en/ean-13-specification-102.html
et2_barcode.TYPE_STD25 = "std25"; //(standard 2 of 5 - industrial 2 of 5) - http://barcode-coder.com/en/standard-2-of-5-specification-103.html
et2_barcode.TYPE_INT25 = "int25"; //(interleaved 2 of 5)
et2_barcode.TYPE_MSI = "msi";
et2_barcode.TYPE_DATAMATRIX = "datamatrix"; //(ASCII + extended) - http://barcode-coder.com/en/datamatrix-specification-104.html
/**
* Formats consts
*/
et2_barcode.FORMAT_CSS = "css";
et2_barcode.FORMAT_SVG = "svg";
et2_barcode.FORMAT_bmp = "bmp";
et2_barcode.FORMAT_CANVAS = "canvas";
et2_barcode._attributes = {
"code_type": {
"name": "code type",
"type": "string",
"default": et2_barcode.TYPE_DATAMATRIX,
"description": "Barcode type to be generated, default is QR barcode"
},
bgColor: {
"name": "bgColor",
"type": "string",
"default": '#FFFFFF',
"description": "Defines backgorund color of barcode container"
},
barColor: {
"name": "barColor",
"type": "string",
"default": '#000000',
"description": "Defines color of the bars in barcode."
},
format: {
"name": "format",
"type": "string",
"default": 'css',
"description": "Defines in which format the barcode should be rendered. Default is SVG."
},
barWidth: {
"name": "bar width",
"type": "string",
"default": '1',
"description": "Defines width of each bar in the barcode."
},
barHeight: {
"name": "bar height",
"type": "string",
"default": '50',
"description": "Defines heigh of each bar in the barcode."
},
};
et2_register_widget(et2_barcode, ["barcode"]);
//# sourceMappingURL=et2_widget_barcode.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Hadi Nategh <hn[at]stylite.de>
* @copyright Stylite AG
* @version $Id:$
* @copyright EGroupware GmbH
*/
/*egw:uses

View File

@ -1,36 +1,20 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Box object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_details = exports.et2_box = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_baseWidget;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_baseWidget_1 = require("./et2_core_baseWidget");
import { et2_register_widget } from "./et2_core_widget";
import { et2_baseWidget } from "./et2_core_baseWidget";
import { et2_readAttrWithDefault } from "./et2_core_xml";
/**
* Class which implements box and vbox tag
*
@ -39,33 +23,31 @@ var et2_core_baseWidget_1 = require("./et2_core_baseWidget");
*
* @augments et2_baseWidget
*/
var et2_box = /** @class */ (function (_super) {
__extends(et2_box, _super);
export class et2_box extends et2_baseWidget {
/**
* Constructor
*
* @memberOf et2_box
*/
function et2_box(_parent, _attrs, _child) {
var _this = _super.call(this, _parent, _attrs, _child) || this;
_this.div = jQuery(document.createElement("div"))
.addClass("et2_" + _this.getType())
constructor(_parent, _attrs, _child) {
super(_parent, _attrs, _child);
this.div = jQuery(document.createElement("div"))
.addClass("et2_" + this.getType())
.addClass("et2_box_widget");
_this.setDOMNode(_this.div[0]);
return _this;
this.setDOMNode(this.div[0]);
}
et2_box.prototype._createNamespace = function () {
_createNamespace() {
return true;
};
}
/**
* Overriden so we can check for autorepeating children. We only check for
* $ in the immediate children & grandchildren of this node.
*
* @param {object} _node
*/
et2_box.prototype.loadFromXML = function (_node) {
loadFromXML(_node) {
if (this.getType() != "box") {
return _super.prototype.loadFromXML.call(this, _node);
return super.loadFromXML(_node);
}
// Load the child nodes.
var childIndex = 0;
@ -111,7 +93,7 @@ var et2_box = /** @class */ (function (_super) {
this.getArrayMgr(name).setPerspectiveData(currentPerspective);
}
}
};
}
/**
* Code for implementing et2_IDetachedDOM
* This doesn't need to be implemented.
@ -119,13 +101,13 @@ var et2_box = /** @class */ (function (_super) {
*
* @param {array} _attrs array to add further attributes to
*/
et2_box.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push('data');
};
et2_box.prototype.getDetachedNodes = function () {
}
getDetachedNodes() {
return [this.getDOMNode()];
};
et2_box.prototype.setDetachedAttributes = function (_nodes, _values) {
}
setDetachedAttributes(_nodes, _values) {
if (_values.data) {
var pairs = _values.data.split(/,/g);
for (var i = 0; i < pairs.length; ++i) {
@ -133,16 +115,14 @@ var et2_box = /** @class */ (function (_super) {
jQuery(_nodes[0]).attr('data-' + name_value[0], name_value[1]);
}
}
};
et2_box._attributes = {
// Not needed
"rows": { "ignore": true },
"cols": { "ignore": true }
};
return et2_box;
}(et2_core_baseWidget_1.et2_baseWidget));
exports.et2_box = et2_box;
et2_core_widget_1.et2_register_widget(et2_box, ["vbox", "box"]);
}
}
et2_box._attributes = {
// Not needed
"rows": { "ignore": true },
"cols": { "ignore": true }
};
et2_register_widget(et2_box, ["vbox", "box"]);
/**
* Details widget implementation
* widget name is "details" and can be use as a wrapping container
@ -156,34 +136,32 @@ et2_core_widget_1.et2_register_widget(et2_box, ["vbox", "box"]);
* <details/>
*
*/
var et2_details = /** @class */ (function (_super) {
__extends(et2_details, _super);
function et2_details(_parent, _attrs, _child) {
var _this = _super.call(this, _parent, _attrs, _child) || this;
_this.div = jQuery(document.createElement('div')).addClass('et2_details');
_this.title = jQuery(document.createElement('span'))
export class et2_details extends et2_box {
constructor(_parent, _attrs, _child) {
super(_parent, _attrs, _child);
this.div = jQuery(document.createElement('div')).addClass('et2_details');
this.title = jQuery(document.createElement('span'))
.addClass('et2_label et2_details_title')
.appendTo(_this.div);
_this.span = jQuery(document.createElement('span'))
.appendTo(this.div);
this.span = jQuery(document.createElement('span'))
.addClass('et2_details_toggle')
.appendTo(_this.div);
_this.wrapper = jQuery(document.createElement('div'))
.appendTo(this.div);
this.wrapper = jQuery(document.createElement('div'))
.addClass('et2_details_wrapper')
.appendTo(_this.div);
_this._createWidget();
return _this;
.appendTo(this.div);
this._createWidget();
}
/**
* Function happens on toggle action
*/
et2_details.prototype._toggle = function () {
_toggle() {
this.div.toggleClass('et2_details_expanded');
};
}
/**
* Create widget, set contents, and binds handlers
*/
et2_details.prototype._createWidget = function () {
var self = this;
_createWidget() {
const self = this;
this.span.on('click', function (e) {
self._toggle();
});
@ -198,32 +176,30 @@ var et2_details = /** @class */ (function (_super) {
// Align toggle button left/right
if (this.options.toggle_align === "left")
this.span.css({ float: 'left' });
};
et2_details.prototype.getDOMNode = function (_sender) {
}
getDOMNode(_sender) {
if (!_sender || _sender === this) {
return this.div[0];
}
else {
return this.wrapper[0];
}
};
et2_details._attributes = {
"toggle_align": {
name: "Toggle button alignment",
description: " Defines where to align the toggle button, default is right alignment",
type: "string",
default: "right"
},
title: {
name: "title",
description: "Set a header title for box and shows it next to toggle button, default is no title",
type: "string",
default: "",
translate: true
}
};
return et2_details;
}(et2_box));
exports.et2_details = et2_details;
et2_core_widget_1.et2_register_widget(et2_details, ["details"]);
}
}
et2_details._attributes = {
"toggle_align": {
name: "Toggle button alignment",
description: " Defines where to align the toggle button, default is right alignment",
type: "string",
default: "right"
},
title: {
name: "title",
description: "Set a header title for box and shows it next to toggle button, default is no title",
type: "string",
default: "",
translate: true
}
};
et2_register_widget(et2_details, ["details"]);
//# sourceMappingURL=et2_widget_box.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:uses
@ -18,6 +17,8 @@
import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_baseWidget} from "./et2_core_baseWidget";
import {et2_IDetachedDOM} from "./et2_core_interfaces";
import {et2_readAttrWithDefault} from "./et2_core_xml";
/**
* Class which implements box and vbox tag

View File

@ -1,70 +1,51 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Button object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_button = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_interfaces;
et2_core_baseWidget;
*/
require("./et2_core_common");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_baseWidget_1 = require("./et2_core_baseWidget");
import { et2_no_init } from "./et2_core_common";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_createWidget, et2_register_widget } from "./et2_core_widget";
import { et2_baseWidget } from './et2_core_baseWidget';
/**
* Class which implements the "button" XET-Tag
*/
var et2_button = /** @class */ (function (_super) {
__extends(et2_button, _super);
export class et2_button extends et2_baseWidget {
/**
* Constructor
*/
function et2_button(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_button._attributes, _child || {})) || this;
_this.label = "";
_this.clicked = false;
_this.btn = null;
_this.image = null;
if (!_this.options.background_image && (_this.options.image || _this.options.ro_image)) {
_this.image = jQuery(document.createElement("img"))
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_button._attributes, _child || {}));
this.label = "";
this.clicked = false;
this.btn = null;
this.image = null;
if (!this.options.background_image && (this.options.image || this.options.ro_image)) {
this.image = jQuery(document.createElement("img"))
.addClass("et2_button et2_button_icon");
if (!_this.options.readonly)
_this.image.addClass("et2_clickable");
_this.setDOMNode(_this.image[0]);
return _this;
if (!this.options.readonly)
this.image.addClass("et2_clickable");
this.setDOMNode(this.image[0]);
return;
}
if (!_this.options.readonly || _this.options.ro_image) {
_this.btn = jQuery(document.createElement("button"))
if (!this.options.readonly || this.options.ro_image) {
this.btn = jQuery(document.createElement("button"))
.addClass("et2_button")
.attr({ type: "button" });
_this.setDOMNode(_this.btn[0]);
this.setDOMNode(this.btn[0]);
}
if (_this.options.image)
_this.set_image(_this.options.image);
return _this;
if (this.options.image)
this.set_image(this.options.image);
}
/**
* Apply the "modifications" to the element and translate attributes marked
@ -74,7 +55,7 @@ var et2_button = /** @class */ (function (_super) {
*
* @param {object} _attrs
*/
et2_button.prototype.transformAttributes = function (_attrs) {
transformAttributes(_attrs) {
if (this.id && typeof _attrs.background_image == 'undefined' && !_attrs.image) {
for (var image in et2_button.default_background_images) {
if (this.id.match(et2_button.default_background_images[image])) {
@ -90,35 +71,35 @@ var et2_button = /** @class */ (function (_super) {
break;
}
}
_super.prototype.transformAttributes.call(this, _attrs);
};
et2_button.prototype.set_accesskey = function (key) {
super.transformAttributes(_attrs);
}
set_accesskey(key) {
jQuery(this.node).attr("accesskey", key);
};
}
/**
* Set image and update current image
*
* @param _image
*/
et2_button.prototype.set_image = function (_image) {
set_image(_image) {
this.options.image = _image;
this.update_image();
};
}
/**
* Set readonly image and update current image
*
* @param _image
*/
et2_button.prototype.set_ro_image = function (_image) {
set_ro_image(_image) {
this.options.ro_image = _image;
this.update_image();
};
}
/**
* Set current image (dont update options.image)
*
* @param _image
*/
et2_button.prototype.update_image = function (_image) {
update_image(_image) {
if (!this.isInTree() || !this.options.background_image && this.image == null)
return;
if (typeof _image == 'undefined')
@ -155,13 +136,13 @@ var et2_button = /** @class */ (function (_super) {
this.btn.removeClass('et2_button_with_image');
}
}
};
}
/**
* Set options.readonly and update image
*
* @param {boolean} _ro
*/
et2_button.prototype.set_readonly = function (_ro) {
set_readonly(_ro) {
if (_ro != this.options.readonly) {
this.options.readonly = _ro;
if (this.options.image || this.options.ro_image) {
@ -175,9 +156,9 @@ var et2_button = /** @class */ (function (_super) {
.css('cursor', _ro ? 'default' : 'pointer'); // temp. 'til it is removed from et2_button
}
}
};
et2_button.prototype.attachToDOM = function () {
var ret = _super.prototype.attachToDOM.call(this);
}
attachToDOM() {
let ret = super.attachToDOM();
if (this.options.readonly && (this.btn || this.image)) {
(this.btn || this.image)
.removeClass('et2_clickable')
@ -185,17 +166,17 @@ var et2_button = /** @class */ (function (_super) {
.css('cursor', 'default'); // temp. 'til it is removed from et2_button
}
return ret;
};
et2_button.prototype.getDOMNode = function () {
}
getDOMNode() {
return this.btn ? this.btn[0] : (this.image ? this.image[0] : null);
};
}
/**
* Overwritten to maintain an internal clicked attribute
*
* @param _ev
* @returns {Boolean}
*/
et2_button.prototype.click = function (_ev) {
click(_ev) {
var _a, _b;
// ignore click on readonly button
if (this.options.readonly)
@ -205,7 +186,7 @@ var et2_button = /** @class */ (function (_super) {
if ((_a = this.btn) === null || _a === void 0 ? void 0 : _a.hasClass("et2_button_cancel")) {
this.getInstanceManager().skip_close_prompt();
}
if (!_super.prototype.click.apply(this, arguments)) {
if (!super.click.apply(this, arguments)) {
this.clicked = false;
return false;
}
@ -216,8 +197,8 @@ var et2_button = /** @class */ (function (_super) {
this.clicked = false;
(_b = this.getInstanceManager()) === null || _b === void 0 ? void 0 : _b.skip_close_prompt(false);
return true;
};
et2_button.prototype.set_label = function (_value) {
}
set_label(_value) {
if (this.btn) {
this.label = _value;
this.btn.text(_value);
@ -233,52 +214,52 @@ var et2_button = /** @class */ (function (_super) {
this.image.attr("title", _value);
}
}
};
}
/**
* Set tab index
*
* @param {number} index
*/
et2_button.prototype.set_tabindex = function (index) {
set_tabindex(index) {
jQuery(this.btn).attr("tabindex", index);
};
}
/**
* Implementation of the et2_IInput interface
*/
/**
* Always return false as a button is never dirty
*/
et2_button.prototype.isDirty = function () {
isDirty() {
return false;
};
et2_button.prototype.resetDirty = function () {
};
et2_button.prototype.getValue = function () {
}
resetDirty() {
}
getValue() {
if (this.clicked) {
return true;
}
// If "null" is returned, the result is not added to the submitted
// array.
return null;
};
et2_button.prototype.isValid = function () {
}
isValid() {
return true;
};
}
/**
* et2_IDetachedDOM
*
* @param {array} _attrs
*/
et2_button.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push("label", "value", "class", "image", "ro_image", "onclick", "background_image");
};
et2_button.prototype.getDetachedNodes = function () {
}
getDetachedNodes() {
return [
this.btn != null ? this.btn[0] : null,
this.image != null ? this.image[0] : null
];
};
et2_button.prototype.setDetachedAttributes = function (_nodes, _values) {
}
setDetachedAttributes(_nodes, _values) {
// Datagrid puts in the row for null
this.btn = _nodes[0].nodeName[0] != '#' ? jQuery(_nodes[0]) : null;
this.image = jQuery(_nodes[1]);
@ -306,94 +287,92 @@ var et2_button = /** @class */ (function (_super) {
var attrs = jQuery.extend(_values, this.options);
var parent = this.getParent();
jQuery(this.getDOMNode()).bind("click.et2_baseWidget", this, function (e) {
var widget = et2_core_widget_1.et2_createWidget(type, attrs, parent);
var widget = et2_createWidget(type, attrs, parent);
e.data = widget;
e.data.set_id(_values["id"]);
return e.data.click.call(e.data, e);
});
};
et2_button._attributes = {
"label": {
"name": "caption",
"type": "string",
"description": "Label of the button",
"translate": true
},
"image": {
"name": "Icon",
"type": "string",
"description": "Use an icon instead of label (when available)"
},
"ro_image": {
"name": "Read-only Icon",
"type": "string",
"description": "Use this icon instead of hiding for read-only"
},
"onclick": {
"description": "JS code which gets executed when the button is clicked",
"type": "js"
},
"accesskey": {
"name": "Access Key",
"type": "string",
"default": et2_no_init,
"description": "Alt + <key> activates widget"
},
"tabindex": {
"name": "Tab index",
"type": "integer",
"default": et2_no_init,
"description": "Specifies the tab order of a widget when the 'tab' button is used for navigating."
},
background_image: {
name: "Add image in front of text",
type: "boolean",
description: "Adds image in front of text instead of just using an image with text as tooltip",
default: et2_no_init // to leave it undefined, if not defined, so background-image is assigned by default
},
novalidate: {
name: "Do NOT validate form",
type: "boolean",
description: "Do NOT validate form before submitting it",
default: false
},
// No such thing as a required button
"needed": {
"ignore": true
}
};
et2_button.legacyOptions = ["image", "ro_image"];
/**
* images to be used as background-image, if none is explicitly applied and id matches given regular expression
*/
et2_button.default_background_images = {
save: /save(&|\]|$)/,
apply: /apply(&|\]|$)/,
cancel: /cancel(&|\]|$)/,
delete: /delete(&|\]|$)/,
discard: /discard(&|\]|$)/,
edit: /edit(&|\[\]|$)/,
next: /(next|continue)(&|\]|$)/,
finish: /finish(&|\]|$)/,
back: /(back|previous)(&|\]|$)/,
copy: /copy(&|\]|$)/,
more: /more(&|\]|$)/,
check: /(yes|check)(&|\]|$)/,
cancelled: /no(&|\]|$)/,
ok: /ok(&|\]|$)/,
close: /close(&|\]|$)/,
add: /(add(&|\]|$)|create)/ // customfields use create*
};
/**
* Classnames added automatic to buttons to set certain hover background colors
*/
et2_button.default_classes = {
et2_button_cancel: /cancel(&|\]|$)/,
et2_button_question: /(yes|no)(&|\]|$)/,
et2_button_delete: /delete(&|\]|$)/ // red
};
return et2_button;
}(et2_core_baseWidget_1.et2_baseWidget));
exports.et2_button = et2_button;
et2_core_widget_1.et2_register_widget(et2_button, ["button", "buttononly"]);
}
}
et2_button._attributes = {
"label": {
"name": "caption",
"type": "string",
"description": "Label of the button",
"translate": true
},
"image": {
"name": "Icon",
"type": "string",
"description": "Use an icon instead of label (when available)"
},
"ro_image": {
"name": "Read-only Icon",
"type": "string",
"description": "Use this icon instead of hiding for read-only"
},
"onclick": {
"description": "JS code which gets executed when the button is clicked",
"type": "js"
},
"accesskey": {
"name": "Access Key",
"type": "string",
"default": et2_no_init,
"description": "Alt + <key> activates widget"
},
"tabindex": {
"name": "Tab index",
"type": "integer",
"default": et2_no_init,
"description": "Specifies the tab order of a widget when the 'tab' button is used for navigating."
},
background_image: {
name: "Add image in front of text",
type: "boolean",
description: "Adds image in front of text instead of just using an image with text as tooltip",
default: et2_no_init // to leave it undefined, if not defined, so background-image is assigned by default
},
novalidate: {
name: "Do NOT validate form",
type: "boolean",
description: "Do NOT validate form before submitting it",
default: false
},
// No such thing as a required button
"needed": {
"ignore": true
}
};
et2_button.legacyOptions = ["image", "ro_image"];
/**
* images to be used as background-image, if none is explicitly applied and id matches given regular expression
*/
et2_button.default_background_images = {
save: /save(&|\]|$)/,
apply: /apply(&|\]|$)/,
cancel: /cancel(&|\]|$)/,
delete: /delete(&|\]|$)/,
discard: /discard(&|\]|$)/,
edit: /edit(&|\[\]|$)/,
next: /(next|continue)(&|\]|$)/,
finish: /finish(&|\]|$)/,
back: /(back|previous)(&|\]|$)/,
copy: /copy(&|\]|$)/,
more: /more(&|\]|$)/,
check: /(yes|check)(&|\]|$)/,
cancelled: /no(&|\]|$)/,
ok: /ok(&|\]|$)/,
close: /close(&|\]|$)/,
add: /(add(&|\]|$)|create)/ // customfields use create*
};
/**
* Classnames added automatic to buttons to set certain hover background colors
*/
et2_button.default_classes = {
et2_button_cancel: /cancel(&|\]|$)/,
et2_button_question: /(yes|no)(&|\]|$)/,
et2_button_delete: /delete(&|\]|$)/ // red
};
et2_register_widget(et2_button, ["button", "buttononly"]);
//# sourceMappingURL=et2_widget_button.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
@ -14,10 +14,11 @@
et2_core_baseWidget;
*/
import './et2_core_common';
import {et2_no_init} from "./et2_core_common";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_createWidget, et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_baseWidget} from './et2_core_baseWidget'
import {et2_IDetachedDOM, et2_IInput} from "./et2_core_interfaces";
/**
* Class which implements the "button" XET-Tag

View File

@ -1,80 +1,60 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Checkbox object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2011
* @version $Id$
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_checkbox = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_inputWidget;
et2_core_valueWidget;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inputWidget_1 = require("./et2_core_inputWidget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
import { et2_register_widget } from "./et2_core_widget";
import { et2_inputWidget } from "./et2_core_inputWidget";
import { ClassWithAttributes } from "./et2_core_inheritance";
/**
* Class which implements the "checkbox" XET-Tag
*
* @augments et2_inputWidget
*/
var et2_checkbox = /** @class */ (function (_super) {
__extends(et2_checkbox, _super);
export class et2_checkbox extends et2_inputWidget {
/**
* Constructor
*
* @memberOf et2_checkbox
*/
function et2_checkbox(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_checkbox._attributes, _child || {})) || this;
_this.input = null;
_this.toggle = null;
_this.input = null;
_this.createInputWidget();
return _this;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_checkbox._attributes, _child || {}));
this.input = null;
this.toggle = null;
this.input = null;
this.createInputWidget();
}
et2_checkbox.prototype.createInputWidget = function () {
createInputWidget() {
this.input = jQuery(document.createElement("input")).attr("type", "checkbox");
this.input.addClass("et2_checkbox");
if (this.options.toggle_on || this.options.toggle_off) {
var self_1 = this;
let self = this;
// checkbox container
this.toggle = jQuery(document.createElement('span'))
.addClass('et2_checkbox_slideSwitch')
.append(this.input);
// update switch status on change
this.input.change(function () {
self_1.getValue();
self.getValue();
return true;
});
// switch container
var area = jQuery(document.createElement('span')).addClass('slideSwitch_container').appendTo(this.toggle);
let area = jQuery(document.createElement('span')).addClass('slideSwitch_container').appendTo(this.toggle);
// on span tag
var on = jQuery(document.createElement('span')).addClass('on').appendTo(area);
let on = jQuery(document.createElement('span')).addClass('on').appendTo(area);
// off span tag
var off = jQuery(document.createElement('span')).addClass('off').appendTo(area);
let off = jQuery(document.createElement('span')).addClass('off').appendTo(area);
on.text(this.options.toggle_on);
off.text(this.options.toggle_off);
// handle a tag
@ -84,25 +64,25 @@ var et2_checkbox = /** @class */ (function (_super) {
else {
this.setDOMNode(this.input[0]);
}
};
}
/**
* Override default to place checkbox before label, if there is no %s in the label
*
* @param {string} label
*/
et2_checkbox.prototype.set_label = function (label) {
set_label(label) {
if (label.length && label.indexOf('%s') < 0) {
label = '%s' + label;
}
_super.prototype.set_label.call(this, label);
super.set_label(label);
jQuery(this.getSurroundings().getWidgetSurroundings()).addClass('et2_checkbox_label');
};
}
/**
* Override default to match against set/unset value
*
* @param {string|boolean} _value
*/
et2_checkbox.prototype.set_value = function (_value) {
set_value(_value) {
// in php, our database storage and et2_checkType(): "0" == false
if (_value === "0" && this.options.selected_value != "0") {
_value = false;
@ -121,20 +101,20 @@ var et2_checkbox = /** @class */ (function (_super) {
this.toggle.removeClass('switchOn');
}
}
};
}
/**
* Disable checkbox on runtime
*
* @param {boolean} _ro
*/
et2_checkbox.prototype.set_readonly = function (_ro) {
set_readonly(_ro) {
jQuery(this.getDOMNode()).attr('disabled', _ro);
this.input.prop('disabled', _ro);
};
}
/**
* Override default to return unchecked value
*/
et2_checkbox.prototype.getValue = function () {
getValue() {
if (this.input.prop("checked")) {
if (this.options.toggle_on || this.options.toggle_off)
this.toggle.addClass('switchOn');
@ -145,9 +125,9 @@ var et2_checkbox = /** @class */ (function (_super) {
this.toggle.removeClass('switchOn');
return this.options.unselected_value;
}
};
et2_checkbox.prototype.set_disabled = function (_value) {
var parentNode = jQuery(this.getDOMNode()).parent();
}
set_disabled(_value) {
let parentNode = jQuery(this.getDOMNode()).parent();
if (parentNode[0] && parentNode[0].nodeName == "label" && parentNode.hasClass('.et2_checkbox_label')) {
if (_value) {
parentNode.hide();
@ -156,78 +136,73 @@ var et2_checkbox = /** @class */ (function (_super) {
parentNode.show();
}
}
_super.prototype.set_disabled.call(this, _value);
};
et2_checkbox._attributes = {
"selected_value": {
"name": "Set value",
"type": "string",
"default": "true",
"description": "Value when checked"
},
"unselected_value": {
"name": "Unset value",
"type": "string",
"default": "",
"description": "Value when not checked"
},
"ro_true": {
"name": "Read only selected",
"type": "string",
"default": "X ",
"description": "What should be displayed when readonly and selected"
},
"ro_false": {
"name": "Read only unselected",
"type": "string",
"default": "",
"description": "What should be displayed when readonly and not selected"
},
"value": {
// Stop framework from messing with value
"type": "any"
},
"toggle_on": {
"name": "Toggle on caption",
"type": "string",
"default": "",
"description": "String caption to show for ON status",
"translate": true
},
"toggle_off": {
"name": "Toggle off caption",
"type": "string",
"default": "",
"description": "String caption to show OFF status",
"translate": true
}
};
et2_checkbox.legacyOptions = ["selected_value", "unselected_value", "ro_true", "ro_false"];
return et2_checkbox;
}(et2_core_inputWidget_1.et2_inputWidget));
exports.et2_checkbox = et2_checkbox;
et2_core_widget_1.et2_register_widget(et2_checkbox, ["checkbox"]);
super.set_disabled(_value);
}
}
et2_checkbox._attributes = {
"selected_value": {
"name": "Set value",
"type": "string",
"default": "true",
"description": "Value when checked"
},
"unselected_value": {
"name": "Unset value",
"type": "string",
"default": "",
"description": "Value when not checked"
},
"ro_true": {
"name": "Read only selected",
"type": "string",
"default": "X ",
"description": "What should be displayed when readonly and selected"
},
"ro_false": {
"name": "Read only unselected",
"type": "string",
"default": "",
"description": "What should be displayed when readonly and not selected"
},
"value": {
// Stop framework from messing with value
"type": "any"
},
"toggle_on": {
"name": "Toggle on caption",
"type": "string",
"default": "",
"description": "String caption to show for ON status",
"translate": true
},
"toggle_off": {
"name": "Toggle off caption",
"type": "string",
"default": "",
"description": "String caption to show OFF status",
"translate": true
}
};
et2_checkbox.legacyOptions = ["selected_value", "unselected_value", "ro_true", "ro_false"];
et2_register_widget(et2_checkbox, ["checkbox"]);
/**
* et2_checkbox_ro is the dummy readonly implementation of the checkbox
* @augments et2_checkbox
*/
var et2_checkbox_ro = /** @class */ (function (_super) {
__extends(et2_checkbox_ro, _super);
export class et2_checkbox_ro extends et2_checkbox {
/**
* Constructor
*
* @memberOf et2_checkbox_ro
*/
function et2_checkbox_ro(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_checkbox_ro._attributes, _child || {})) || this;
_this.span = null;
_this.value = "";
_this.span = jQuery(document.createElement("span"))
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_checkbox_ro._attributes, _child || {}));
this.span = null;
this.value = "";
this.span = jQuery(document.createElement("span"))
.addClass("et2_checkbox_ro");
_this.setDOMNode(_this.span[0]);
return _this;
this.setDOMNode(this.span[0]);
}
/**
* note: checkbox is checked if even there is a value but not only if the _value is only "true"
@ -235,7 +210,7 @@ var et2_checkbox_ro = /** @class */ (function (_super) {
*
* @param {string|boolean} _value
*/
et2_checkbox_ro.prototype.set_value = function (_value) {
set_value(_value) {
if (_value == this.options.selected_value || _value && this.options.selected_value == this.attributes["selected_value"]["default"] &&
_value != this.options.unselected_value) {
this.span.text(this.options.ro_true);
@ -244,19 +219,19 @@ var et2_checkbox_ro = /** @class */ (function (_super) {
else {
this.span.text(this.options.ro_false);
}
};
}
/**
* Code for implementing et2_IDetachedDOM
*
* @param {array} _attrs
*/
et2_checkbox_ro.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push("value", "class");
};
et2_checkbox_ro.prototype.getDetachedNodes = function () {
}
getDetachedNodes() {
return [this.span[0]];
};
et2_checkbox_ro.prototype.setDetachedAttributes = function (_nodes, _values) {
}
setDetachedAttributes(_nodes, _values) {
// Update the properties
if (typeof _values["value"] != "undefined") {
this.span = jQuery(_nodes[0]);
@ -265,16 +240,15 @@ var et2_checkbox_ro = /** @class */ (function (_super) {
if (typeof _values["class"] != "undefined") {
_nodes[0].setAttribute("class", _values["class"]);
}
};
/**
* Ignore unset value
*/
et2_checkbox_ro._attributes = {
"unselected_value": {
"ignore": true
}
};
return et2_checkbox_ro;
}(et2_checkbox));
et2_core_widget_1.et2_register_widget(et2_checkbox_ro, ["checkbox_ro"]);
}
}
/**
* Ignore unset value
*/
et2_checkbox_ro._attributes = {
"unselected_value": {
"ignore": true
}
};
et2_register_widget(et2_checkbox_ro, ["checkbox_ro"]);
//# sourceMappingURL=et2_widget_checkbox.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2011
* @version $Id$
*/
/*egw:uses
@ -19,6 +18,7 @@
import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_inputWidget} from "./et2_core_inputWidget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_IDetachedDOM} from "./et2_core_interfaces";
/**
* Class which implements the "checkbox" XET-Tag
@ -214,7 +214,7 @@ et2_register_widget(et2_checkbox, ["checkbox"]);
* et2_checkbox_ro is the dummy readonly implementation of the checkbox
* @augments et2_checkbox
*/
class et2_checkbox_ro extends et2_checkbox implements et2_IDetachedDOM
export class et2_checkbox_ro extends et2_checkbox implements et2_IDetachedDOM
{
/**
* Ignore unset value

View File

@ -1,142 +1,115 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Color picker object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2012
* @version $Id$
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_color_ro = exports.et2_color = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_inputWidget;
et2_core_valueWidget;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
var et2_core_inputWidget_1 = require("./et2_core_inputWidget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
import { et2_register_widget } from "./et2_core_widget";
import { et2_valueWidget } from "./et2_core_valueWidget";
import { et2_inputWidget } from "./et2_core_inputWidget";
import { ClassWithAttributes } from "./et2_core_inheritance";
/**
* Class which implements the "colorpicker" XET-Tag
*
*/
var et2_color = /** @class */ (function (_super) {
__extends(et2_color, _super);
export class et2_color extends et2_inputWidget {
/**
* Constructor
*/
function et2_color(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_color._attributes, _child || {})) || this;
_this.cleared = true;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_color._attributes, _child || {}));
this.cleared = true;
// included via etemplate2.css
//this.egw().includeCSS("phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.min.css");
_this.span = jQuery("<span class='et2_color'/>");
_this.image = jQuery("<img src='" + _this.egw().image("non_loaded_bg") + "'/>")
.appendTo(_this.span)
this.span = jQuery("<span class='et2_color'/>");
this.image = jQuery("<img src='" + this.egw().image("non_loaded_bg") + "'/>")
.appendTo(this.span)
.on("click", function () {
this.input.trigger('click');
}.bind(_this));
_this.input = jQuery("<input type='color'/>").appendTo(_this.span)
}.bind(this));
this.input = jQuery("<input type='color'/>").appendTo(this.span)
.on('change', function () {
this.cleared = false;
this.image.hide();
}.bind(_this));
if (!_this.options.readonly && !_this.options.needed) {
_this.clear = jQuery("<span class='ui-icon clear'/>")
.appendTo(_this.span)
}.bind(this));
if (!this.options.readonly && !this.options.needed) {
this.clear = jQuery("<span class='ui-icon clear'/>")
.appendTo(this.span)
.on("click", function () {
this.set_value('');
return false;
}.bind(_this));
}.bind(this));
}
_this.setDOMNode(_this.span[0]);
return _this;
this.setDOMNode(this.span[0]);
}
et2_color.prototype.getValue = function () {
getValue() {
var value = this.input.val();
if (this.cleared || value === '#FFFFFF' || value === '#ffffff') {
return '';
}
return value;
};
et2_color.prototype.set_value = function (color) {
}
set_value(color) {
if (!color) {
color = '';
}
this.cleared = !color;
this.image.toggle(!color);
this.input.val(color);
};
return et2_color;
}(et2_core_inputWidget_1.et2_inputWidget));
exports.et2_color = et2_color;
et2_core_widget_1.et2_register_widget(et2_color, ["colorpicker"]);
}
}
et2_register_widget(et2_color, ["colorpicker"]);
/**
* et2_textbox_ro is the dummy readonly implementation of the textbox.
* @augments et2_valueWidget
*/
var et2_color_ro = /** @class */ (function (_super) {
__extends(et2_color_ro, _super);
export class et2_color_ro extends et2_valueWidget {
/**
* Constructor
*
* @memberOf et2_color_ro
*/
function et2_color_ro(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, _child || {}) || this;
_this.value = "";
_this.$node = jQuery(document.createElement("div"))
super(_parent, _attrs, _child || {});
this.value = "";
this.$node = jQuery(document.createElement("div"))
.addClass("et2_color");
_this.setDOMNode(_this.$node[0]);
return _this;
this.setDOMNode(this.$node[0]);
}
et2_color_ro.prototype.set_value = function (_value) {
set_value(_value) {
this.value = _value;
if (!_value)
_value = "inherit";
this.$node.css("background-color", _value);
};
}
/**
* Code for implementing et2_IDetachedDOM
*
* @param {array} _attrs array to add further attributes to
*/
et2_color_ro.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push("value");
};
et2_color_ro.prototype.getDetachedNodes = function () {
}
getDetachedNodes() {
return [this.node];
};
et2_color_ro.prototype.setDetachedAttributes = function (_nodes, _values) {
}
setDetachedAttributes(_nodes, _values) {
this.$node = jQuery(_nodes[0]);
if (typeof _values["value"] != 'undefined') {
this.set_value(_values["value"]);
}
};
return et2_color_ro;
}(et2_core_valueWidget_1.et2_valueWidget));
exports.et2_color_ro = et2_color_ro;
et2_core_widget_1.et2_register_widget(et2_color_ro, ["colorpicker_ro"]);
}
}
et2_register_widget(et2_color_ro, ["colorpicker_ro"]);
//# sourceMappingURL=et2_widget_color.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2012
* @version $Id$
*/
/*egw:uses
@ -20,6 +19,7 @@ import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_valueWidget} from "./et2_core_valueWidget";
import {et2_inputWidget} from "./et2_core_inputWidget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_IDetachedDOM} from "./et2_core_interfaces";
/**
* Class which implements the "colorpicker" XET-Tag

View File

@ -1,36 +1,21 @@
"use strict";
/**
* EGroupware eTemplate2 - Countdown timer widget
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Hadi Nategh
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_countdown = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_baseWidget;
*/
require("./et2_core_common");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
import { et2_no_init } from "./et2_core_common";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_register_widget } from "./et2_core_widget";
import { et2_valueWidget } from "./et2_core_valueWidget";
import { egw } from "../jsapi/egw_global";
/**
* Class which implements the "countdown" XET-Tag
*
@ -38,42 +23,39 @@ var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
*
* The duration has the benefit, that it does not depend on the correct set time and timezone of the browser / computer of the user.
*/
var et2_countdown = /** @class */ (function (_super) {
__extends(et2_countdown, _super);
export class et2_countdown extends et2_valueWidget {
/**
* Constructor
*/
function et2_countdown(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_countdown._attributes, _child || {})) || this;
_this.timer = null;
_this.container = null;
_this.days = null;
_this.hours = null;
_this.minutes = null;
_this.seconds = null;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_countdown._attributes, _child || {}));
this.timer = null;
this.container = null;
this.days = null;
this.hours = null;
this.minutes = null;
this.seconds = null;
// Build countdown dom container
_this.container = jQuery(document.createElement("div"))
this.container = jQuery(document.createElement("div"))
.addClass("et2_countdown");
_this.days = jQuery(document.createElement("span"))
.addClass("et2_countdown_days").appendTo(_this.container);
_this.hours = jQuery(document.createElement("span"))
.addClass("et2_countdown_hours").appendTo(_this.container);
_this.minutes = jQuery(document.createElement("span"))
.addClass("et2_countdown_minutes").appendTo(_this.container);
_this.seconds = jQuery(document.createElement("span"))
.addClass("et2_countdown_seconds").appendTo(_this.container);
_this.setDOMNode(_this.container[0]);
return _this;
this.days = jQuery(document.createElement("span"))
.addClass("et2_countdown_days").appendTo(this.container);
this.hours = jQuery(document.createElement("span"))
.addClass("et2_countdown_hours").appendTo(this.container);
this.minutes = jQuery(document.createElement("span"))
.addClass("et2_countdown_minutes").appendTo(this.container);
this.seconds = jQuery(document.createElement("span"))
.addClass("et2_countdown_seconds").appendTo(this.container);
this.setDOMNode(this.container[0]);
}
et2_countdown.prototype.set_value = function (_time) {
set_value(_time) {
if (isNaN(_time))
return;
_super.prototype.set_value.call(this, _time);
super.set_value(_time);
this.time = new Date();
this.time.setSeconds(this.time.getSeconds() + parseInt(_time));
var self = this;
let self = this;
this.timer = setInterval(function () {
if (self._updateTimer() <= 0) {
clearInterval(self.timer);
@ -81,16 +63,16 @@ var et2_countdown = /** @class */ (function (_super) {
self.onFinish();
}
}, 1000);
};
et2_countdown.prototype._updateTimer = function () {
var now = new Date();
var distance = this.time.getTime() - now.getTime();
}
_updateTimer() {
let now = new Date();
let distance = this.time.getTime() - now.getTime();
if (distance < 0)
return 0;
if (this.options.alarm > 0 && this.options.alarm == distance / 1000 && typeof this.onAlarm == 'function') {
this.onAlarm();
}
var values = {
let values = {
days: Math.floor(distance / (1000 * 60 * 60 * 24)),
hours: Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),
minutes: Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)),
@ -114,10 +96,10 @@ var et2_countdown = /** @class */ (function (_super) {
}
}
if (this.options.precision) {
var units = ['days', 'hours', 'minutes', 'seconds'];
for (var u = 0; u < 4; ++u) {
const units = ['days', 'hours', 'minutes', 'seconds'];
for (let u = 0; u < 4; ++u) {
if (values[units[u]]) {
for (var n = u + this.options.precision; n < 4; n++) {
for (let n = u + this.options.precision; n < 4; n++) {
this[units[n]].hide();
}
break;
@ -128,50 +110,48 @@ var et2_countdown = /** @class */ (function (_super) {
}
}
return distance;
};
et2_countdown.prototype._getIndicator = function (_v) {
}
_getIndicator(_v) {
return this.options.format == 's' ? egw.lang(_v).substr(0, 1) : egw.lang(_v);
};
et2_countdown._attributes = {
format: {
name: "display format",
type: "string",
default: "s",
description: "Defines display format; s (Initial letter) or l (Complete word) display, default is s."
},
onFinish: {
name: "on finish countdown",
type: "js",
default: et2_no_init,
description: "Callback function to call when the countdown is finished."
},
hideEmpties: {
name: "hide empties",
type: "string",
default: true,
description: "Only displays none empty values."
},
precision: {
name: "how many counters to show",
type: "integer",
default: 0,
description: "Limit number of counters, eg. 2 does not show minutes and seconds, if days are displayed"
},
alarm: {
name: "alarm",
type: "any",
default: "",
description: "Defines an alarm set before the countdown is finished, it should be in seconds"
},
onAlarm: {
name: "alarm callback",
type: "js",
default: "",
description: "Defines a callback to gets called at alarm - timer. This only will work if there's an alarm set."
}
};
return et2_countdown;
}(et2_core_valueWidget_1.et2_valueWidget));
exports.et2_countdown = et2_countdown;
et2_core_widget_1.et2_register_widget(et2_countdown, ["countdown"]);
}
}
et2_countdown._attributes = {
format: {
name: "display format",
type: "string",
default: "s",
description: "Defines display format; s (Initial letter) or l (Complete word) display, default is s."
},
onFinish: {
name: "on finish countdown",
type: "js",
default: et2_no_init,
description: "Callback function to call when the countdown is finished."
},
hideEmpties: {
name: "hide empties",
type: "string",
default: true,
description: "Only displays none empty values."
},
precision: {
name: "how many counters to show",
type: "integer",
default: 0,
description: "Limit number of counters, eg. 2 does not show minutes and seconds, if days are displayed"
},
alarm: {
name: "alarm",
type: "any",
default: "",
description: "Defines an alarm set before the countdown is finished, it should be in seconds"
},
onAlarm: {
name: "alarm callback",
type: "js",
default: "",
description: "Defines a callback to gets called at alarm - timer. This only will work if there's an alarm set."
}
};
et2_register_widget(et2_countdown, ["countdown"]);
//# sourceMappingURL=et2_widget_countdown.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Hadi Nategh
*/
@ -13,12 +13,11 @@
et2_core_baseWidget;
*/
import './et2_core_common';
import {et2_no_init} from "./et2_core_common";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_createWidget, et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_date} from "./et2_widget_date";
import {et2_baseWidget} from "./et2_core_baseWidget";
import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_valueWidget} from "./et2_core_valueWidget";
import {egw} from "../jsapi/egw_global";
/**
* Class which implements the "countdown" XET-Tag

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2011
*/
@ -17,13 +17,16 @@
et2_core_valueWidget;
*/
import './et2_core_common';
import {et2_csvSplit, et2_no_init} from "./et2_core_common";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_createWidget, et2_register_widget, et2_widget, WidgetConfig} from "./et2_core_widget";
import {et2_valueWidget} from './et2_core_valueWidget'
import {et2_inputWidget} from './et2_core_inputWidget'
import {et2_selectbox} from './et2_widget_selectbox'
import {et2_DOMWidget} from "./et2_core_DOMWidget";
import {et2_IDetachedDOM} from "./et2_core_interfaces";
import {egw} from "../jsapi/egw_global";
import {date} from "./lib/date.js";
// lib/date.js:
declare function date (format : string, timestamp? : string | number | Date);

View File

@ -1,84 +1,61 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Description object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_description = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_baseWidget;
expose;
*/
require("./et2_core_common");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_baseWidget_1 = require("./et2_core_baseWidget");
var et2_core_inputWidget_1 = require("./et2_core_inputWidget");
import { et2_activateLinks, et2_csvSplit, et2_insertLinkText, et2_no_init } from "./et2_core_common";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_register_widget } from "./et2_core_widget";
import { et2_baseWidget } from './et2_core_baseWidget';
import { et2_inputWidget } from "./et2_core_inputWidget";
import { expose } from "./expose";
import { egw } from "../jsapi/egw_global";
/**
* Class which implements the "description" XET-Tag
*/
var et2_description = /** @class */ (function (_super) {
__extends(et2_description, _super);
function et2_description() {
return _super !== null && _super.apply(this, arguments) || this;
}
return et2_description;
}(expose((_a = /** @class */ (function (_super) {
__extends(et2_description, _super);
export class et2_description extends expose((_a = class et2_description extends et2_baseWidget {
/**
* Constructor
*/
function et2_description(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_description._attributes, _child || {})) || this;
_this._labelContainer = null;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_description._attributes, _child || {}));
this._labelContainer = null;
// Create the span/label tag which contains the label text
_this.span = jQuery(document.createElement(_this.options["for"] ? "label" : "span"))
this.span = jQuery(document.createElement(this.options["for"] ? "label" : "span"))
.addClass("et2_label");
et2_insertLinkText(_this._parseText(_this.options.value), _this.span[0], _this.options.href ? _this.options.extra_link_target : '_blank');
_this.setDOMNode(_this.span[0]);
return _this;
et2_insertLinkText(this._parseText(this.options.value), this.span[0], this.options.href ? this.options.extra_link_target : '_blank');
this.setDOMNode(this.span[0]);
}
et2_description.prototype.transformAttributes = function (_attrs) {
_super.prototype.transformAttributes.call(this, _attrs);
transformAttributes(_attrs) {
super.transformAttributes(_attrs);
if (this.id) {
var val = this.getArrayMgr("content").getEntry(this.id);
if (val) {
_attrs["value"] = val;
}
}
};
et2_description.prototype.doLoadingFinished = function () {
_super.prototype.doLoadingFinished.call(this);
}
doLoadingFinished() {
super.doLoadingFinished();
// Get the real id of the 'for' widget
var for_widget = null;
var for_id = "";
let for_id = "";
if (this.options["for"] && ((for_widget = this.getParent().getWidgetById(this.options.for)) ||
(for_widget = this.getRoot().getWidgetById(this.options.for))) && for_widget && for_widget.id) {
if (for_widget.dom_id) {
for_id = for_widget.dom_id;
if (for_widget.instanceOf(et2_core_inputWidget_1.et2_inputWidget) && for_widget.getInputNode() && for_widget.dom_id !== for_widget.getInputNode().id) {
if (for_widget.instanceOf(et2_inputWidget) && for_widget.getInputNode() && for_widget.dom_id !== for_widget.getInputNode().id) {
for_id = for_widget.getInputNode().id;
}
this.span.attr("for", for_id);
@ -89,7 +66,7 @@ var et2_description = /** @class */ (function (_super) {
window.setTimeout(function () {
var _a;
for_id = for_widget.dom_id;
if (for_widget.instanceOf(et2_core_inputWidget_1.et2_inputWidget) && for_widget.getInputNode() && for_widget.dom_id !== ((_a = for_widget.getInputNode()) === null || _a === void 0 ? void 0 : _a.id)) {
if (for_widget.instanceOf(et2_inputWidget) && for_widget.getInputNode() && for_widget.dom_id !== ((_a = for_widget.getInputNode()) === null || _a === void 0 ? void 0 : _a.id)) {
for_id = for_widget.getInputNode().id;
}
this.span.attr("for", for_id);
@ -99,8 +76,8 @@ var et2_description = /** @class */ (function (_super) {
}
}
return true;
};
et2_description.prototype.set_label = function (_value) {
}
set_label(_value) {
// Abort if ther was no change in the label
if (_value == this.label) {
return;
@ -142,15 +119,15 @@ var et2_description = /** @class */ (function (_super) {
this.getSurroundings().update();
// Copy the given value
this.label = _value;
};
}
/**
* Function to get media content to feed the expose
* @param {type} _value
* @returns {Array|Array.getMedia.mediaContent}
*/
et2_description.prototype.getMedia = function (_value) {
var base_url = egw.webserverUrl.match(new RegExp(/^\//, 'ig')) ? egw(window).window.location.origin : '';
var mediaContent = [];
getMedia(_value) {
let base_url = egw.webserverUrl.match(new RegExp(/^\//, 'ig')) ? egw(window).window.location.origin : '';
let mediaContent = [];
if (_value) {
mediaContent = [{
title: this.options.label,
@ -162,8 +139,8 @@ var et2_description = /** @class */ (function (_super) {
mediaContent[0]["download_href"] = base_url + _value + '?download';
}
return mediaContent;
};
et2_description.prototype.set_value = function (_value) {
}
set_value(_value) {
if (!_value)
_value = "";
if (!this.options.no_lang)
@ -192,8 +169,8 @@ var et2_description = /** @class */ (function (_super) {
return false;
});
}
};
et2_description.prototype._parseText = function (_value) {
}
_parseText(_value) {
if (this.options.href) {
var href = this.options.href;
if (href.indexOf('/') == -1 && href.split('.').length >= 3 &&
@ -215,24 +192,24 @@ var et2_description = /** @class */ (function (_super) {
else {
return [_value];
}
};
et2_description.prototype.set_font_style = function (_value) {
}
set_font_style(_value) {
this.font_style = _value;
this.span.toggleClass("et2_bold", _value.indexOf("b") >= 0);
this.span.toggleClass("et2_italic", _value.indexOf("i") >= 0);
};
}
/**
* Code for implementing et2_IDetachedDOM
*
* @param {array} _attrs
*/
et2_description.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push("value", "class", "href");
};
et2_description.prototype.getDetachedNodes = function () {
}
getDetachedNodes() {
return [this.span[0]];
};
et2_description.prototype.setDetachedAttributes = function (_nodes, _values, _data) {
}
setDetachedAttributes(_nodes, _values, _data) {
// Update the properties
var updateLink = false;
if (typeof _values["href"] != "undefined") {
@ -250,12 +227,12 @@ var et2_description = /** @class */ (function (_super) {
if (this.options.hover_action) {
this._build_hover_action(_data);
}
};
}
/**
* Builds button for hover action
* @param {object} _data
*/
et2_description.prototype._build_hover_action = function (_data) {
_build_hover_action(_data) {
var content = _data && _data.content ? _data.content : undefined;
var widget = this;
this.span.off().on('mouseenter', jQuery.proxy(function (event) {
@ -265,14 +242,14 @@ var et2_description = /** @class */ (function (_super) {
items: 'span.et2_label',
position: { my: "right top", at: "left top", collision: "flipfit" },
tooltipClass: "et2_email_popup",
content: function () {
content() {
return jQuery('<a href="#" class= "et2_url_email_contactPlus" title="' + widget.egw().lang(widget.options.hover_action_title) + '"><img src="'
+ egw.image("edit") + '"/></a>')
.on('click', function () {
widget.options.hover_action.call(self, self.widget, content);
});
},
close: function (event, ui) {
close(event, ui) {
ui.tooltip.hover(function () {
jQuery(this).stop(true).fadeTo(400, 1);
}, function () {
@ -282,9 +259,8 @@ var et2_description = /** @class */ (function (_super) {
})
.tooltip("open");
}, { widget: this, span: this.span }));
};
return et2_description;
}(et2_core_baseWidget_1.et2_baseWidget)),
}
},
_a._attributes = {
"label": {
"name": "Label",
@ -370,8 +346,8 @@ var et2_description = /** @class */ (function (_super) {
},
_a.legacyOptions = ["font_style", "href", "activate_links", "for",
"extra_link_target", "extra_link_popup", "statustext"],
_a))));
exports.et2_description = et2_description;
_a)) {
}
;
et2_core_widget_1.et2_register_widget(et2_description, ["description", "label"]);
et2_register_widget(et2_description, ["description", "label"]);
//# sourceMappingURL=et2_widget_description.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
*/
@ -14,11 +14,14 @@
expose;
*/
import './et2_core_common';
import {et2_activateLinks, et2_csvSplit, et2_insertLinkText, et2_no_init} from "./et2_core_common";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_baseWidget} from './et2_core_baseWidget'
import {et2_inputWidget} from "./et2_core_inputWidget";
import {expose} from "./expose";
import {et2_IDetachedDOM, et2_IExposable} from "./et2_core_interfaces";
import {egw} from "../jsapi/egw_global";
/**
* Class which implements the "description" XET-Tag

View File

@ -1,38 +1,23 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Dialog Widget class
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2013
* @version $Id$
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dialog = void 0;
/*egw:uses
et2_core_widget;
/vendor/bower-asset/jquery-ui/jquery-ui.js;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_widget_2 = require("./et2_core_widget");
var et2_widget_button_1 = require("./et2_widget_button");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var etemplate2_1 = require("./etemplate2");
import { et2_createWidget, et2_register_widget } from "./et2_core_widget";
import { et2_widget } from "./et2_core_widget";
import { et2_button } from "./et2_widget_button";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { etemplate2 } from "./etemplate2";
import { egw } from "../jsapi/egw_global";
import { et2_no_init } from "./et2_core_common";
/**
* A common dialog widget that makes it easy to imform users or prompt for information.
*
@ -106,14 +91,13 @@ var etemplate2_1 = require("./etemplate2");
* @augments et2_widget
* @see http://api.jqueryui.com/dialog/
*/
var et2_dialog = /** @class */ (function (_super) {
__extends(et2_dialog, _super);
function et2_dialog(_parent, _attrs, _child) {
var _this = _super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_dialog._attributes, _child || {})) || this;
export class et2_dialog extends et2_widget {
constructor(_parent, _attrs, _child) {
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_dialog._attributes, _child || {}));
/**
* Details for dialog type options
*/
_this._dialog_types = [
this._dialog_types = [
//PLAIN_MESSAGE: 0
"",
//INFORMATION_MESSAGE: 1,
@ -125,7 +109,7 @@ var et2_dialog = /** @class */ (function (_super) {
//ERROR_MESSAGE: 4,
"dialog_error"
];
_this._buttons = [
this._buttons = [
/*
Pre-defined Button combos
- button ids copied from et2_dialog static, since the constants are not defined yet
@ -150,32 +134,31 @@ var et2_dialog = /** @class */ (function (_super) {
{ "button_id": 0, "text": 'cancel', id: 'dialog[cancel]', image: 'cancel' }
]
];
_this.div = null;
_this.template = null;
this.div = null;
this.template = null;
// Define this as null to avoid breaking any hierarchies (eg: destroy())
if (_this.getParent() != null)
_this.getParent().removeChild(_this);
if (this.getParent() != null)
this.getParent().removeChild(this);
// Button callbacks need a reference to this
var self = _this;
for (var i = 0; i < _this._buttons.length; i++) {
for (var j = 0; j < _this._buttons[i].length; j++) {
_this._buttons[i][j].click = (function (id) {
let self = this;
for (let i = 0; i < this._buttons.length; i++) {
for (let j = 0; j < this._buttons[i].length; j++) {
this._buttons[i][j].click = (function (id) {
return function (event) {
self.click(event.target, id);
};
})(_this._buttons[i][j].button_id);
})(this._buttons[i][j].button_id);
// translate button texts, as translations are not available before
_this._buttons[i][j].text = egw.lang(_this._buttons[i][j].text);
this._buttons[i][j].text = egw.lang(this._buttons[i][j].text);
}
}
_this.div = jQuery(document.createElement("div"));
_this._createDialog();
return _this;
this.div = jQuery(document.createElement("div"));
this._createDialog();
}
/**
* Clean up dialog
*/
et2_dialog.prototype.destroy = function () {
destroy() {
if (this.div != null) {
// Un-dialog the dialog
this.div.dialog("destroy");
@ -186,8 +169,8 @@ var et2_dialog = /** @class */ (function (_super) {
this.div = null;
}
// Call the inherited constructor
_super.prototype.destroy.call(this);
};
super.destroy();
}
/**
* Internal callback registered on all standard buttons.
* The provided callback is called after the dialog is closed.
@ -195,60 +178,60 @@ var et2_dialog = /** @class */ (function (_super) {
* @param target DOMNode The clicked button
* @param button_id integer The ID of the clicked button
*/
et2_dialog.prototype.click = function (target, button_id) {
click(target, button_id) {
if (this.options.callback) {
if (this.options.callback.call(this, button_id, this.get_value()) === false)
return;
}
// Triggers destroy too
this.div.dialog("close");
};
}
/**
* Returns the values of any widgets in the dialog. This does not include
* the buttons, which are only supplied for the callback.
*/
et2_dialog.prototype.get_value = function () {
get_value() {
var value = this.options.value;
if (this.template) {
value = this.template.getValues(this.template.widgetContainer);
}
return value;
};
}
/**
* Set the displayed prompt message
*
* @param {string} message New message for the dialog
*/
et2_dialog.prototype.set_message = function (message) {
set_message(message) {
this.options.message = message;
this.div.empty()
.append("<img class='dialog_icon' />")
.append(jQuery('<div/>').text(message));
};
}
/**
* Set the dialog type to a pre-defined type
*
* @param {integer} type constant from et2_dialog
*/
et2_dialog.prototype.set_dialog_type = function (type) {
set_dialog_type(type) {
if (this.options.dialog_type != type && typeof this._dialog_types[type] == "string") {
this.options.dialog_type = type;
}
this.set_icon(this._dialog_types[type] ? egw.image(this._dialog_types[type]) : "");
};
}
/**
* Set the icon for the dialog
*
* @param {string} icon_url
*/
et2_dialog.prototype.set_icon = function (icon_url) {
set_icon(icon_url) {
if (icon_url == "") {
jQuery("img.dialog_icon", this.div).hide();
}
else {
jQuery("img.dialog_icon", this.div).show().attr("src", icon_url);
}
};
}
/**
* Set the dialog buttons
*
@ -256,7 +239,7 @@ var et2_dialog = /** @class */ (function (_super) {
* @see http://api.jqueryui.com/dialog/#option-buttons
* @param {array} buttons
*/
et2_dialog.prototype.set_buttons = function (buttons) {
set_buttons(buttons) {
this.options.buttons = buttons;
if (buttons instanceof Array) {
for (var i = 0; i < buttons.length; i++) {
@ -266,16 +249,16 @@ var et2_dialog = /** @class */ (function (_super) {
}
// set a default background image and css class based on buttons id
if (button.id && typeof button.class == 'undefined') {
for (var name in et2_widget_button_1.et2_button.default_classes) {
if (button.id.match(et2_widget_button_1.et2_button.default_classes[name])) {
for (var name in et2_button.default_classes) {
if (button.id.match(et2_button.default_classes[name])) {
button.class = (typeof button.class == 'undefined' ? '' : button.class + ' ') + name;
break;
}
}
}
if (button.id && typeof button.image == 'undefined' && typeof button.style == 'undefined') {
for (var name in et2_widget_button_1.et2_button.default_background_images) {
if (button.id.match(et2_widget_button_1.et2_button.default_background_images[name])) {
for (var name in et2_button.default_background_images) {
if (button.id.match(et2_button.default_background_images[name])) {
button.image = name;
break;
}
@ -296,35 +279,35 @@ var et2_dialog = /** @class */ (function (_super) {
// Focus default button so enter works
jQuery('.ui-dialog-buttonpane button[default]', this.div.parent()).focus();
}
};
}
/**
* Set the dialog title
*
* @param {string} title New title for the dialog
*/
et2_dialog.prototype.set_title = function (title) {
set_title(title) {
this.options.title = title;
this.div.dialog("option", "title", title);
};
}
/**
* Block interaction with the page behind the dialog
*
* @param {boolean} modal Block page behind dialog
*/
et2_dialog.prototype.set_modal = function (modal) {
set_modal(modal) {
this.options.modal = modal;
this.div.dialog("option", "modal", modal);
};
}
/**
* Load an etemplate into the dialog
*
* @param template String etemplate file name
*/
et2_dialog.prototype.set_template = function (template) {
set_template(template) {
if (this.template && this.options.template != template) {
this.template.clear();
}
this.template = new etemplate2_1.etemplate2(this.div[0], false);
this.template = new etemplate2(this.div[0]);
if (template.indexOf('.xet') > 0) {
// File name provided, fetch from server
this.template.load("", template, this.options.value || { content: {} }, jQuery.proxy(function () {
@ -340,8 +323,7 @@ var et2_dialog = /** @class */ (function (_super) {
}
// Don't let dialog closing destroy the parent session
if (this.template.etemplate_exec_id && this.template.app) {
for (var _i = 0, _a = etemplate2_1.etemplate2.getByApplication(this.template.app); _i < _a.length; _i++) {
var et = _a[_i];
for (let et of etemplate2.getByApplication(this.template.app)) {
if (et !== this.template && et.etemplate_exec_id === this.template.etemplate_exec_id) {
// Found another template using that exec_id, don't destroy when dialog closes.
this.template.unbind_unload();
@ -351,11 +333,11 @@ var et2_dialog = /** @class */ (function (_super) {
}
// set template-name as id, to allow to style dialogs
this.div.children().attr('id', template.replace(/^(.*\/)?([^/]+)(\.xet)?$/, '$2').replace(/\./g, '-'));
};
}
/**
* Actually create and display the dialog
*/
et2_dialog.prototype._createDialog = function () {
_createDialog() {
if (this.options.template) {
this.set_template(this.options.template);
}
@ -364,13 +346,13 @@ var et2_dialog = /** @class */ (function (_super) {
this.set_dialog_type(this.options.dialog_type);
}
this.set_buttons(typeof this.options.buttons == "number" ? this._buttons[this.options.buttons] : this.options.buttons);
var position_my, position_at = '';
let position_my, position_at = '';
if (this.options.position) {
var positions = this.options.position.split(',');
let positions = this.options.position.split(',');
position_my = positions[0] ? positions[0].trim() : 'center';
position_at = positions[1] ? positions[1].trim() : position_my;
}
var options = {
let options = {
// Pass the internal object, not the option
buttons: this.options.buttons,
modal: this.options.modal,
@ -409,24 +391,24 @@ var et2_dialog = /** @class */ (function (_super) {
this.div.dialog(options);
// Make sure dialog is wide enough for the title
// Arbitrary numbers that seem to work nicely.
var title_width = 20 + 10 * this.options.title.length;
let title_width = 20 + 10 * this.options.title.length;
if (this.div.width() < title_width && this.options.title.trim()) {
// Auto-sizing chopped the title
this.div.dialog('option', 'width', title_width);
}
};
}
/**
* Create a parent to inject application specific egw object with loaded translations into et2_dialog
*
* @param {string|egw} _egw_or_appname egw object with already loaded translations or application name to load translations for
*/
et2_dialog._create_parent = function (_egw_or_appname) {
static _create_parent(_egw_or_appname) {
if (typeof _egw_or_appname == 'undefined') {
// @ts-ignore
_egw_or_appname = egw_appName;
}
// create a dummy parent with a correct reference to an application specific egw object
var parent = new et2_core_widget_2.et2_widget();
let parent = new et2_widget();
// if egw object is passed in because called from et2, just use it
if (typeof _egw_or_appname != 'string') {
parent.setApiInstance(_egw_or_appname);
@ -437,7 +419,7 @@ var et2_dialog = /** @class */ (function (_super) {
parent.egw().langRequireApp(parent.egw().window, _egw_or_appname);
}
return parent;
};
}
/**
* Show a confirmation dialog
*
@ -450,10 +432,10 @@ var et2_dialog = /** @class */ (function (_super) {
* @param {string} _icon URL of an icon to display. If not provided, a type-specific icon will be used.
* @param {string|egw} _egw_or_appname egw object with already laoded translations or application name to load translations for
*/
et2_dialog.show_dialog = function (_callback, _message, _title, _value, _buttons, _type, _icon, _egw_or_appname) {
var parent = et2_dialog._create_parent(_egw_or_appname);
static show_dialog(_callback, _message, _title, _value, _buttons, _type, _icon, _egw_or_appname) {
let parent = et2_dialog._create_parent(_egw_or_appname);
// Just pass them along, widget handles defaults & missing
return et2_core_widget_1.et2_createWidget("dialog", {
return et2_createWidget("dialog", {
callback: _callback || function () {
},
message: _message,
@ -464,7 +446,7 @@ var et2_dialog = /** @class */ (function (_super) {
value: _value,
width: 'auto'
}, parent);
};
}
;
/**
* Show an alert message with OK button
@ -473,9 +455,9 @@ var et2_dialog = /** @class */ (function (_super) {
* @param {string} _title Text in the top bar of the dialog.
* @param {integer} _type One of the message constants. This defines the style of the message.
*/
et2_dialog.alert = function (_message, _title, _type) {
var parent = et2_dialog._create_parent(et2_dialog._create_parent().egw());
et2_core_widget_1.et2_createWidget("dialog", {
static alert(_message, _title, _type) {
let parent = et2_dialog._create_parent(et2_dialog._create_parent().egw());
et2_createWidget("dialog", {
callback: function () {
},
message: _message,
@ -483,7 +465,7 @@ var et2_dialog = /** @class */ (function (_super) {
buttons: et2_dialog.BUTTONS_OK,
dialog_type: _type || et2_dialog.INFORMATION_MESSAGE
}, parent);
};
}
/**
* Show a prompt dialog
*
@ -494,10 +476,10 @@ var et2_dialog = /** @class */ (function (_super) {
* @param {integer|array} _buttons One of the BUTTONS_ constants defining the set of buttons at the bottom of the box
* @param {string|egw} _egw_or_appname egw object with already laoded translations or application name to load translations for
*/
et2_dialog.show_prompt = function (_callback, _message, _title, _value, _buttons, _egw_or_appname) {
static show_prompt(_callback, _message, _title, _value, _buttons, _egw_or_appname) {
var callback = _callback;
// Just pass them along, widget handles defaults & missing
return et2_core_widget_1.et2_createWidget("dialog", {
return et2_createWidget("dialog", {
callback: function (_button_id, _value) {
if (typeof callback == "function") {
callback.call(this, _button_id, _value.value);
@ -514,7 +496,7 @@ var et2_dialog = /** @class */ (function (_super) {
template: egw.webserverUrl + '/api/templates/default/prompt.xet',
class: "et2_prompt"
}, et2_dialog._create_parent(_egw_or_appname));
};
}
/**
* Method to build a confirmation dialog only with
* YES OR NO buttons and submit content back to server
@ -526,18 +508,18 @@ var et2_dialog = /** @class */ (function (_super) {
*
* @description submit the form contents including the button that has been pressed
*/
et2_dialog.confirm = function (_senders, _dialogMsg, _titleMsg, _postSubmit) {
static confirm(_senders, _dialogMsg, _titleMsg, _postSubmit) {
var senders = _senders;
var buttonId = _senders.id;
var dialogMsg = (typeof _dialogMsg != "undefined") ? _dialogMsg : '';
var titleMsg = (typeof _titleMsg != "undefined") ? _titleMsg : '';
var egw = _senders instanceof et2_core_widget_2.et2_widget ? _senders.egw() : et2_dialog._create_parent().egw();
var egw = _senders instanceof et2_widget ? _senders.egw() : et2_dialog._create_parent().egw();
var callbackDialog = function (button_id) {
if (button_id == et2_dialog.YES_BUTTON) {
if (_postSubmit) {
senders.getRoot().getInstanceManager().postSubmit(buttonId);
}
else if (senders.instanceOf(et2_widget_button_1.et2_button) && senders.getType() !== "buttononly") {
else if (senders.instanceOf(et2_button) && senders.getType() !== "buttononly") {
senders.clicked = true;
senders.getInstanceManager().submit(senders, false, senders.options.novalidate);
senders.clicked = false;
@ -548,7 +530,7 @@ var et2_dialog = /** @class */ (function (_super) {
}
};
et2_dialog.show_dialog(callbackDialog, egw.lang(dialogMsg), egw.lang(titleMsg), {}, et2_dialog.BUTTONS_YES_NO, et2_dialog.WARNING_MESSAGE, undefined, egw);
};
}
;
/**
* Show a dialog for a long-running, multi-part task
@ -577,11 +559,11 @@ var et2_dialog = /** @class */ (function (_super) {
*
* @return {et2_dialog}
*/
et2_dialog.long_task = function (_callback, _message, _title, _menuaction, _list, _egw_or_appname) {
var parent = et2_dialog._create_parent(_egw_or_appname);
var egw = parent.egw();
static long_task(_callback, _message, _title, _menuaction, _list, _egw_or_appname) {
let parent = et2_dialog._create_parent(_egw_or_appname);
let egw = parent.egw();
// Special action for cancel
var buttons = [
let buttons = [
{ "button_id": et2_dialog.OK_BUTTON, "text": egw.lang('ok'), "default": true, "disabled": true },
{
"button_id": et2_dialog.CANCEL_BUTTON, "text": egw.lang('cancel'), click: function () {
@ -592,7 +574,7 @@ var et2_dialog = /** @class */ (function (_super) {
}
}
];
var dialog = et2_core_widget_1.et2_createWidget("dialog", {
let dialog = et2_createWidget("dialog", {
template: egw.webserverUrl + '/api/templates/default/long_task.xet',
value: {
content: {
@ -612,19 +594,19 @@ var et2_dialog = /** @class */ (function (_super) {
}, parent);
// OK starts disabled
jQuery("button[button_id=" + et2_dialog.OK_BUTTON + "]", dialog.div.parent()).button("disable");
var log = null;
var progressbar = null;
var cancel = false;
var totals = {
let log = null;
let progressbar = null;
let cancel = false;
let totals = {
success: 0,
skipped: 0,
failed: 0,
widget: null
};
// Updates progressbar & log, calls next step
var update = function (response) {
let update = function (response) {
// context is index
var index = this || 0;
let index = this || 0;
progressbar.set_value(100 * (index / _list.length));
progressbar.set_label(index + ' / ' + _list.length);
// Display response information
@ -635,7 +617,7 @@ var et2_dialog = /** @class */ (function (_super) {
.appendTo(log);
totals.failed++;
// Ask to retry / ignore / abort
et2_core_widget_1.et2_createWidget("dialog", {
et2_createWidget("dialog", {
callback: function (button) {
switch (button) {
case 'dialog[cancel]':
@ -676,7 +658,7 @@ var et2_dialog = /** @class */ (function (_super) {
}
}
// Scroll to bottom
var height = log[0].scrollHeight;
let height = log[0].scrollHeight;
log.scrollTop(height);
// Update totals
totals.widget.set_value(egw.lang("Total: %1 Successful: %2 Failed: %3 Skipped: %4", _list.length, totals.success, totals.failed, totals.skipped));
@ -712,153 +694,151 @@ var et2_dialog = /** @class */ (function (_super) {
}, 0);
});
return dialog;
};
et2_dialog._attributes = {
callback: {
name: "Callback",
type: "js",
description: "Callback function is called with the value when the dialog is closed",
"default": function (button_id) {
egw.debug("log", "Button ID: %d", button_id);
}
},
beforeClose: {
name: "before close callback",
type: "js",
description: "Callback function before dialog is closed, return false to prevent that",
"default": function () {
}
},
message: {
name: "Message",
type: "string",
description: "Dialog message (plain text, no html)",
"default": "Somebody forgot to set this..."
},
dialog_type: {
name: "Dialog type",
type: "integer",
description: "To use a pre-defined dialog style, use et2_dialog.ERROR_MESSAGE, INFORMATION_MESSAGE,WARNING_MESSAGE,QUESTION_MESSAGE,PLAIN_MESSAGE constants. Default is et2_dialog.PLAIN_MESSAGE",
"default": 0 //this.PLAIN_MESSAGE
},
buttons: {
name: "Buttons",
type: "any",
"default": 0,
description: "Buttons that appear at the bottom of the dialog. You can use the constants et2_dialog.BUTTONS_OK, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_OK_CANCEL, or pass in an array for full control"
},
icon: {
name: "Icon",
type: "string",
description: "URL of an icon for the dialog. If omitted, an icon based on dialog_type will be used.",
"default": ""
},
title: {
name: "Title",
type: "string",
description: "Title for the dialog box (plain text, no html)",
"default": ""
},
modal: {
name: "Modal",
type: "boolean",
description: "Prevent the user from interacting with the page",
"default": true
},
resizable: {
name: "Resizable",
type: "boolean",
description: "Allow the user to resize the dialog",
"default": true
},
value: {
"name": "Value",
"description": "The (default) value of the dialog. Use with template.",
"type": "any",
"default": et2_no_init
},
template: {
"name": "Template",
"description": "Instead of displaying a simple message, a full template can be loaded instead. Set defaults with value.",
"type": "string",
"default": et2_no_init
},
minWidth: {
name: "minimum width",
type: "integer",
description: "Define minimum width of dialog",
"default": 0
},
minHeight: {
name: "minimum height",
type: "integer",
description: "Define minimum height of dialog",
"default": 0
},
width: {
name: "width",
type: "string",
description: "Define width of dialog, the default is auto",
"default": et2_no_init
},
height: {
name: "height",
type: "string",
description: "Define width of dialog, the default is auto",
"default": 'auto'
},
position: {
name: "position",
type: "string",
description: "Define position of dialog in the main window",
default: "center"
},
appendTo: {
name: "appendTo",
type: "string",
description: "Defines the dialog parent context",
default: ''
},
draggable: {
name: "Draggable",
type: "boolean",
description: "Allow the user to drag the dialog",
default: true
},
closeOnEscape: {
name: "close on escape",
type: "boolean",
description: "Allow the user to close the dialog by hiting escape",
default: true
},
dialogClass: {
name: "dialog class",
type: "string",
description: "Add css classed into dialog container",
default: ''
}
}
et2_dialog._attributes = {
callback: {
name: "Callback",
type: "js",
description: "Callback function is called with the value when the dialog is closed",
"default": function (button_id) {
egw.debug("log", "Button ID: %d", button_id);
}
};
/**
* Types
* @constant
*/
et2_dialog.PLAIN_MESSAGE = 0;
et2_dialog.INFORMATION_MESSAGE = 1;
et2_dialog.QUESTION_MESSAGE = 2;
et2_dialog.WARNING_MESSAGE = 3;
et2_dialog.ERROR_MESSAGE = 4;
/* Pre-defined Button combos */
et2_dialog.BUTTONS_OK = 0;
et2_dialog.BUTTONS_OK_CANCEL = 1;
et2_dialog.BUTTONS_YES_NO = 2;
et2_dialog.BUTTONS_YES_NO_CANCEL = 3;
/* Button constants */
et2_dialog.CANCEL_BUTTON = 0;
et2_dialog.OK_BUTTON = 1;
et2_dialog.YES_BUTTON = 2;
et2_dialog.NO_BUTTON = 3;
return et2_dialog;
}(et2_core_widget_2.et2_widget));
exports.et2_dialog = et2_dialog;
et2_core_widget_1.et2_register_widget(et2_dialog, ["dialog"]);
},
beforeClose: {
name: "before close callback",
type: "js",
description: "Callback function before dialog is closed, return false to prevent that",
"default": function () {
}
},
message: {
name: "Message",
type: "string",
description: "Dialog message (plain text, no html)",
"default": "Somebody forgot to set this..."
},
dialog_type: {
name: "Dialog type",
type: "integer",
description: "To use a pre-defined dialog style, use et2_dialog.ERROR_MESSAGE, INFORMATION_MESSAGE,WARNING_MESSAGE,QUESTION_MESSAGE,PLAIN_MESSAGE constants. Default is et2_dialog.PLAIN_MESSAGE",
"default": 0 //this.PLAIN_MESSAGE
},
buttons: {
name: "Buttons",
type: "any",
"default": 0,
description: "Buttons that appear at the bottom of the dialog. You can use the constants et2_dialog.BUTTONS_OK, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_OK_CANCEL, or pass in an array for full control"
},
icon: {
name: "Icon",
type: "string",
description: "URL of an icon for the dialog. If omitted, an icon based on dialog_type will be used.",
"default": ""
},
title: {
name: "Title",
type: "string",
description: "Title for the dialog box (plain text, no html)",
"default": ""
},
modal: {
name: "Modal",
type: "boolean",
description: "Prevent the user from interacting with the page",
"default": true
},
resizable: {
name: "Resizable",
type: "boolean",
description: "Allow the user to resize the dialog",
"default": true
},
value: {
"name": "Value",
"description": "The (default) value of the dialog. Use with template.",
"type": "any",
"default": et2_no_init
},
template: {
"name": "Template",
"description": "Instead of displaying a simple message, a full template can be loaded instead. Set defaults with value.",
"type": "string",
"default": et2_no_init
},
minWidth: {
name: "minimum width",
type: "integer",
description: "Define minimum width of dialog",
"default": 0
},
minHeight: {
name: "minimum height",
type: "integer",
description: "Define minimum height of dialog",
"default": 0
},
width: {
name: "width",
type: "string",
description: "Define width of dialog, the default is auto",
"default": et2_no_init
},
height: {
name: "height",
type: "string",
description: "Define width of dialog, the default is auto",
"default": 'auto'
},
position: {
name: "position",
type: "string",
description: "Define position of dialog in the main window",
default: "center"
},
appendTo: {
name: "appendTo",
type: "string",
description: "Defines the dialog parent context",
default: ''
},
draggable: {
name: "Draggable",
type: "boolean",
description: "Allow the user to drag the dialog",
default: true
},
closeOnEscape: {
name: "close on escape",
type: "boolean",
description: "Allow the user to close the dialog by hiting escape",
default: true
},
dialogClass: {
name: "dialog class",
type: "string",
description: "Add css classed into dialog container",
default: ''
}
};
/**
* Types
* @constant
*/
et2_dialog.PLAIN_MESSAGE = 0;
et2_dialog.INFORMATION_MESSAGE = 1;
et2_dialog.QUESTION_MESSAGE = 2;
et2_dialog.WARNING_MESSAGE = 3;
et2_dialog.ERROR_MESSAGE = 4;
/* Pre-defined Button combos */
et2_dialog.BUTTONS_OK = 0;
et2_dialog.BUTTONS_OK_CANCEL = 1;
et2_dialog.BUTTONS_YES_NO = 2;
et2_dialog.BUTTONS_YES_NO_CANCEL = 3;
/* Button constants */
et2_dialog.CANCEL_BUTTON = 0;
et2_dialog.OK_BUTTON = 1;
et2_dialog.YES_BUTTON = 2;
et2_dialog.NO_BUTTON = 3;
et2_register_widget(et2_dialog, ["dialog"]);
//# sourceMappingURL=et2_widget_dialog.js.map

View File

@ -3,10 +3,9 @@
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2013
* @version $Id$
*/
/*egw:uses
@ -18,8 +17,9 @@ import {et2_createWidget, et2_register_widget, WidgetConfig} from "./et2_core_wi
import {et2_widget} from "./et2_core_widget";
import {et2_button} from "./et2_widget_button";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_DOMWidget} from "./et2_core_DOMWidget";
import {etemplate2} from "./etemplate2";
import {egw, IegwAppLocal} from "../jsapi/egw_global";
import {et2_no_init} from "./et2_core_common";
/**
* A common dialog widget that makes it easy to imform users or prompt for information.
@ -479,7 +479,7 @@ export class et2_dialog extends et2_widget {
this.template.clear();
}
this.template = new etemplate2(this.div[0], false);
this.template = new etemplate2(this.div[0]);
if (template.indexOf('.xet') > 0) {
// File name provided, fetch from server
this.template.load("", template, this.options.value || {content: {}}, jQuery.proxy(function () {
@ -612,11 +612,12 @@ export class et2_dialog extends et2_widget {
* @param {string} _icon URL of an icon to display. If not provided, a type-specific icon will be used.
* @param {string|egw} _egw_or_appname egw object with already laoded translations or application name to load translations for
*/
static show_dialog(_callback? : Function, _message? : string, _title? : string, _value? : object, _buttons?, _type? : number, _icon? : string, _egw_or_appname? : string | IegwAppLocal) {
static show_dialog(_callback? : Function, _message? : string, _title? : string, _value? : object, _buttons?, _type? : number, _icon? : string, _egw_or_appname? : string | IegwAppLocal)
{
let parent = et2_dialog._create_parent(_egw_or_appname);
// Just pass them along, widget handles defaults & missing
return et2_createWidget("dialog", {
return <et2_dialog>et2_createWidget("dialog", {
callback: _callback || function () {
},
message: _message,
@ -636,7 +637,8 @@ export class et2_dialog extends et2_widget {
* @param {string} _title Text in the top bar of the dialog.
* @param {integer} _type One of the message constants. This defines the style of the message.
*/
static alert(_message? : string, _title? : string, _type?) {
static alert(_message? : string, _title? : string, _type?)
{
let parent = et2_dialog._create_parent(et2_dialog._create_parent().egw());
et2_createWidget("dialog", {
callback: function () {

View File

@ -1,61 +1,41 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Diff object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2012
* @version $Id$
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_diff = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
/vendor/bower-asset/jquery-ui/jquery-ui.js;
/vendor/bower-asset/diff2html/dist/diff2html.min.js;
et2_core_valueWidget;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
import { et2_register_widget } from "./et2_core_widget";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_valueWidget } from "./et2_core_valueWidget";
/**
* Class that displays the diff between two [text] values
*
* @augments et2_valueWidget
*/
var et2_diff = /** @class */ (function (_super) {
__extends(et2_diff, _super);
export class et2_diff extends et2_valueWidget {
/**
* Constructor
*/
function et2_diff(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_diff._attributes, _child || {})) || this;
_this.mini = true;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_diff._attributes, _child || {}));
this.mini = true;
// included via etemplate2.css
//this.egw().includeCSS('../../../vendor/bower-asset/dist/dist2html.css');
_this.div = document.createElement("div");
jQuery(_this.div).addClass('et2_diff');
return _this;
this.div = document.createElement("div");
jQuery(this.div).addClass('et2_diff');
}
et2_diff.prototype.set_value = function (value) {
set_value(value) {
jQuery(this.div).empty();
if (typeof value == 'string') {
// Diff2Html likes to have files, we don't have them
@ -72,8 +52,8 @@ var et2_diff = /** @class */ (function (_super) {
jQuery(this.div).append(value);
}
this.check_mini();
};
et2_diff.prototype.check_mini = function () {
}
check_mini() {
if (!this.mini) {
return false;
}
@ -94,13 +74,13 @@ var et2_diff = /** @class */ (function (_super) {
width: 'auto',
modal: true,
buttons: [{ text: self.egw().lang('ok'), click: function () { jQuery(this).dialog("close"); } }],
open: function () {
open() {
if (jQuery(this).parent().height() > jQuery(window).height()) {
jQuery(this).height(jQuery(window).height() * 0.7);
}
jQuery(this).addClass('et2_diff').dialog({ position: "center" });
},
close: function (event, ui) {
close(event, ui) {
// Need to destroy the dialog, etemplate widget needs divs back where they were
dialog_div.dialog("destroy");
self.minify(this);
@ -109,16 +89,16 @@ var et2_diff = /** @class */ (function (_super) {
}
});
});
};
et2_diff.prototype.set_label = function (_label) {
}
set_label(_label) {
this.options.label = _label;
};
}
/**
* Make the diff into a mini-diff
*
* @param {DOMNode|String} view
*/
et2_diff.prototype.minify = function (view) {
minify(view) {
view = jQuery(view)
.addClass('mini')
// Dialog changes these, if resized
@ -127,17 +107,17 @@ var et2_diff = /** @class */ (function (_super) {
jQuery('th', view).hide();
jQuery('td.equal', view).hide()
.prevAll().hide();
};
}
/**
* Expand mini-diff
*
* @param {DOMNode|String} view
*/
et2_diff.prototype.un_minify = function (view) {
un_minify(view) {
jQuery(view).removeClass('mini').show();
jQuery('th', view).show();
jQuery('td.equal', view).show();
};
}
/**
* Code for implementing et2_IDetachedDOM
* Fast-clonable read-only widget that only deals with DOM nodes, not the widget tree
@ -149,16 +129,16 @@ var et2_diff = /** @class */ (function (_super) {
*
* @param {object} _attrs
*/
et2_diff.prototype.getDetachedAttributes = function (_attrs) {
getDetachedAttributes(_attrs) {
_attrs.push("value", "label");
};
}
/**
* Returns an array of DOM nodes. The (relativly) same DOM-Nodes have to be
* passed to the "setDetachedAttributes" function in the same order.
*/
et2_diff.prototype.getDetachedNodes = function () {
getDetachedNodes() {
return [this.div];
};
}
/**
* Sets the given associative attribute->value array and applies the
* attributes to the given DOM-Node.
@ -169,7 +149,7 @@ var et2_diff = /** @class */ (function (_super) {
* returned by the "getDetachedAttributes" function and sets them to the
* given values.
*/
et2_diff.prototype.setDetachedAttributes = function (_nodes, _values) {
setDetachedAttributes(_nodes, _values) {
this.div = _nodes[0];
if (typeof _values['label'] != 'undefined') {
this.set_label(_values['label']);
@ -177,14 +157,12 @@ var et2_diff = /** @class */ (function (_super) {
if (typeof _values['value'] != 'undefined') {
this.set_value(_values['value']);
}
};
et2_diff._attributes = {
"value": {
"type": "any"
}
};
return et2_diff;
}(et2_core_valueWidget_1.et2_valueWidget));
exports.et2_diff = et2_diff;
et2_core_widget_1.et2_register_widget(et2_diff, ["diff"]);
}
}
et2_diff._attributes = {
"value": {
"type": "any"
}
};
et2_register_widget(et2_diff, ["diff"]);
//# sourceMappingURL=et2_widget_diff.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2012
* @version $Id$
*/
/*egw:uses
@ -20,6 +19,7 @@
import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_valueWidget} from "./et2_core_valueWidget";
import {et2_IDetachedDOM} from "./et2_core_interfaces";
/**
* Class that displays the diff between two [text] values

View File

@ -1,38 +1,23 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Dropdown Button object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2013
* @version $Id$
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dropdown_button = void 0;
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
/vendor/bower-asset/jquery-ui/jquery-ui.js;
et2_baseWidget;
*/
var et2_core_inputWidget_1 = require("./et2_core_inputWidget");
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
import { et2_inputWidget } from './et2_core_inputWidget';
import { et2_register_widget } from "./et2_core_widget";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_no_init } from "./et2_core_common";
import { egw } from "../jsapi/egw_global";
/**
* A split button - a button with a dropdown list
*
@ -47,33 +32,32 @@ var et2_core_inheritance_1 = require("./et2_core_inheritance");
*
* @augments et2_inputWidget
*/
var et2_dropdown_button = /** @class */ (function (_super) {
__extends(et2_dropdown_button, _super);
export class et2_dropdown_button extends et2_inputWidget {
/**
* Constructor
*
* @memberOf et2_dropdown_button
*/
function et2_dropdown_button(_parent, _attrs, _child) {
var _this = _super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_dropdown_button._attributes, _child || {})) || this;
_this.internal_ids = {
constructor(_parent, _attrs, _child) {
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_dropdown_button._attributes, _child || {}));
this.internal_ids = {
div: "",
button: "",
menu: ""
};
_this.div = null;
_this.buttons = null;
_this.button = null;
_this.arrow = null;
_this.menu = null;
_this.image = null;
_this.clicked = false;
_this.label_updates = true;
_this.value = null;
this.div = null;
this.buttons = null;
this.button = null;
this.arrow = null;
this.menu = null;
this.image = null;
this.clicked = false;
this.label_updates = true;
this.value = null;
/**
* Default menu, so there is something for the widget browser / editor to show
*/
_this.default_menu = '<ul> \
this.default_menu = '<ul> \
<li data-id="opt_1.1"><a href="#">Option-1.1</a></li>\
<li data-id="opt_1.2"><a href="#">Option-1.2</a></li>\
<li data-id="opt_1.3"><a href="#">Option-1.3</a></li>\
@ -82,32 +66,32 @@ var et2_dropdown_button = /** @class */ (function (_super) {
</a></li>\
<li data-id="opt_1.5"><a href="#">Option-1.5</a></li>\
</ul>';
_this.clicked = false;
var self = _this;
this.clicked = false;
let self = this;
// Create the individual UI elements
// Menu is a UL
_this.menu = jQuery(_this.default_menu).attr("id", _this.internal_ids.menu)
this.menu = jQuery(this.default_menu).attr("id", this.internal_ids.menu)
.hide()
.menu({
select: function (event, ui) {
self.onselect.call(self, event, ui.item);
}
});
_this.buttons = jQuery(document.createElement("div"))
this.buttons = jQuery(document.createElement("div"))
.addClass("et2_dropdown");
// Main "wrapper" div
_this.div = jQuery(document.createElement("div"))
.attr("id", _this.internal_ids.div)
.append(_this.buttons)
.append(_this.menu);
this.div = jQuery(document.createElement("div"))
.attr("id", this.internal_ids.div)
.append(this.buttons)
.append(this.menu);
// Left side - activates click action
_this.button = jQuery(document.createElement("button"))
.attr("id", _this.internal_ids.button)
this.button = jQuery(document.createElement("button"))
.attr("id", this.internal_ids.button)
.attr("type", "button")
.addClass("ui-widget ui-corner-left").removeClass("ui-corner-all")
.appendTo(_this.buttons);
.appendTo(this.buttons);
// Right side - shows dropdown
_this.arrow = jQuery(document.createElement("button"))
this.arrow = jQuery(document.createElement("button"))
.addClass("ui-widget ui-corner-right").removeClass("ui-corner-all")
.attr("type", "button")
.click(function () {
@ -133,17 +117,16 @@ var et2_dropdown_button = /** @class */ (function (_super) {
})
// This is the actual down arrow icon
.append("<div class='ui-icon ui-icon-triangle-1-s'/>")
.appendTo(_this.buttons);
.appendTo(this.buttons);
// Common button UI
_this.buttons.children("button")
this.buttons.children("button")
.addClass("ui-state-default")
.hover(function () { jQuery(this).addClass("ui-state-hover"); }, function () { jQuery(this).removeClass("ui-state-hover"); });
// Icon
_this.image = jQuery(document.createElement("img"));
_this.setDOMNode(_this.div[0]);
return _this;
this.image = jQuery(document.createElement("img"));
this.setDOMNode(this.div[0]);
}
et2_dropdown_button.prototype.destroy = function () {
destroy() {
// Destroy widget
if (this.menu && this.menu.data('ui-menu'))
this.menu.menu("destroy");
@ -155,9 +138,9 @@ var et2_dropdown_button = /** @class */ (function (_super) {
this.menu = null;
// Remove
this.div.empty().remove();
};
et2_dropdown_button.prototype.set_id = function (_id) {
_super.prototype.set_id.call(this, _id);
}
set_id(_id) {
super.set_id(_id);
// Update internal IDs - not really needed since we refer by internal
// javascript reference, but good to keep up to date
this.internal_ids = {
@ -165,29 +148,29 @@ var et2_dropdown_button = /** @class */ (function (_super) {
button: this.dom_id,
menu: this.dom_id + "_menu"
};
for (var key in this.internal_ids) {
for (let key in this.internal_ids) {
if (this[key] == null)
continue;
this[key].attr("id", this.internal_ids[key]);
}
};
}
/**
* Set if the button label changes to match the selected option
*
* @param updates boolean Turn updating on or off
*/
et2_dropdown_button.prototype.set_label_updates = function (updates) {
set_label_updates(updates) {
this.label_updates = updates;
};
et2_dropdown_button.prototype.set_accesskey = function (key) {
}
set_accesskey(key) {
jQuery(this.node).attr("accesskey", key);
};
et2_dropdown_button.prototype.set_ro_image = function (_image) {
}
set_ro_image(_image) {
if (this.options.readonly) {
this.set_image(_image);
}
};
et2_dropdown_button.prototype.set_image = function (_image) {
}
set_image(_image) {
if (!this.isInTree() || this.image == null)
return;
if (!_image.trim()) {
@ -196,7 +179,7 @@ var et2_dropdown_button = /** @class */ (function (_super) {
else {
this.image.show();
}
var src = this.egw().image(_image);
let src = this.egw().image(_image);
if (src) {
this.image.attr("src", src);
}
@ -207,60 +190,60 @@ var et2_dropdown_button = /** @class */ (function (_super) {
else {
this.image.hide();
}
};
}
/**
* Overwritten to maintain an internal clicked attribute
*
* @param _ev
* @returns {Boolean}
*/
et2_dropdown_button.prototype.click = function (_ev) {
click(_ev) {
// ignore click on readonly button
if (this.options.readonly)
return false;
this.clicked = true;
if (!_super.prototype.click.call(this, _ev)) {
if (!super.click(_ev)) {
this.clicked = false;
return false;
}
this.clicked = false;
return true;
};
et2_dropdown_button.prototype.onselect = function (event, selected_node) {
}
onselect(event, selected_node) {
this.set_value(selected_node.attr("data-id"));
this.change(selected_node);
};
et2_dropdown_button.prototype.attachToDOM = function () {
var res = _super.prototype.attachToDOM.call(this);
}
attachToDOM() {
let res = super.attachToDOM();
// Move the parent's handler to the button, or we can't tell the difference between the clicks
jQuery(this.node).unbind("click.et2_baseWidget");
this.button.off().bind("click.et2_baseWidget", this, function (e) {
return e.data.click.call(e.data, this);
});
return res;
};
et2_dropdown_button.prototype.set_label = function (_value) {
}
set_label(_value) {
if (this.button) {
this.label = _value;
this.button.text(_value)
.prepend(this.image);
}
};
}
/**
* Set the options for the dropdown
*
* @param options Object ID => Label pairs
*/
et2_dropdown_button.prototype.set_select_options = function (options) {
set_select_options(options) {
this.menu.first().empty();
// Allow more complicated content, if passed
if (typeof options == "string") {
this.menu.append(options);
}
else {
var add_complex_1 = function (node, options) {
for (var key in options) {
var item = void 0;
let add_complex = function (node, options) {
for (let key in options) {
let item;
if (typeof options[key] == "string") {
item = jQuery("<li data-id='" + key + "'><a href='#'>" + options[key] + "</a></li>");
}
@ -270,7 +253,7 @@ var et2_dropdown_button = /** @class */ (function (_super) {
// Optgroup
else {
item = jQuery("<li><a href='#'>" + key + "</a></li>");
add_complex_1(node.append("<ul>"), options[key]);
add_complex(node.append("<ul>"), options[key]);
}
node.append(item);
if (item && options[key].icon) {
@ -279,18 +262,18 @@ var et2_dropdown_button = /** @class */ (function (_super) {
}
}
};
add_complex_1(this.menu.first(), options);
add_complex(this.menu.first(), options);
}
this.menu.menu("refresh");
};
}
/**
* Set tab index
*/
et2_dropdown_button.prototype.set_tabindex = function (index) {
set_tabindex(index) {
jQuery(this.button).attr("tabindex", index);
};
et2_dropdown_button.prototype.set_value = function (new_value) {
var menu_item = jQuery("[data-id='" + new_value + "']", this.menu);
}
set_value(new_value) {
let menu_item = jQuery("[data-id='" + new_value + "']", this.menu);
if (menu_item.length) {
this.value = new_value;
if (this.label_updates) {
@ -303,16 +286,16 @@ var et2_dropdown_button = /** @class */ (function (_super) {
this.set_label(this.options.label);
}
}
};
et2_dropdown_button.prototype.getValue = function () {
}
getValue() {
return this.value;
};
}
/**
* Set options.readonly
*
* @param {boolean} _ro
*/
et2_dropdown_button.prototype.set_readonly = function (_ro) {
set_readonly(_ro) {
if (_ro != this.options.readonly) {
this.options.readonly = _ro;
// don't make readonly dropdown buttons clickable
@ -323,61 +306,59 @@ var et2_dropdown_button = /** @class */ (function (_super) {
.css('cursor', _ro ? 'default' : 'pointer');
}
}
};
et2_dropdown_button.attributes = {
"label": {
"name": "caption",
"type": "string",
"description": "Label of the button",
"translate": true,
"default": "Select..."
},
"label_updates": {
"name": "Label updates",
"type": "boolean",
"description": "Button label updates when an option is selected from the menu",
"default": true
},
"image": {
"name": "Icon",
"type": "string",
"description": "Add an icon"
},
"ro_image": {
"name": "Read-only Icon",
"type": "string",
"description": "Use this icon instead of hiding for read-only"
},
"onclick": {
"description": "JS code which gets executed when the button is clicked"
},
"select_options": {
"type": "any",
"name": "Select options",
"default": {},
"description": "Select options for dropdown. Can be a simple key => value list, or value can be full HTML",
// Skip normal initialization for this one
"ignore": true
},
"accesskey": {
"name": "Access Key",
"type": "string",
"default": et2_no_init,
"description": "Alt + <key> activates widget"
},
"tabindex": {
"name": "Tab index",
"type": "integer",
"default": et2_no_init,
"description": "Specifies the tab order of a widget when the 'tab' button is used for navigating."
},
// No such thing as a required button
"required": {
"ignore": true
}
};
return et2_dropdown_button;
}(et2_core_inputWidget_1.et2_inputWidget));
exports.et2_dropdown_button = et2_dropdown_button;
et2_core_widget_1.et2_register_widget(et2_dropdown_button, ["dropdown_button"]);
}
}
et2_dropdown_button.attributes = {
"label": {
"name": "caption",
"type": "string",
"description": "Label of the button",
"translate": true,
"default": "Select..."
},
"label_updates": {
"name": "Label updates",
"type": "boolean",
"description": "Button label updates when an option is selected from the menu",
"default": true
},
"image": {
"name": "Icon",
"type": "string",
"description": "Add an icon"
},
"ro_image": {
"name": "Read-only Icon",
"type": "string",
"description": "Use this icon instead of hiding for read-only"
},
"onclick": {
"description": "JS code which gets executed when the button is clicked"
},
"select_options": {
"type": "any",
"name": "Select options",
"default": {},
"description": "Select options for dropdown. Can be a simple key => value list, or value can be full HTML",
// Skip normal initialization for this one
"ignore": true
},
"accesskey": {
"name": "Access Key",
"type": "string",
"default": et2_no_init,
"description": "Alt + <key> activates widget"
},
"tabindex": {
"name": "Tab index",
"type": "integer",
"default": et2_no_init,
"description": "Specifies the tab order of a widget when the 'tab' button is used for navigating."
},
// No such thing as a required button
"required": {
"ignore": true
}
};
et2_register_widget(et2_dropdown_button, ["dropdown_button"]);
//# sourceMappingURL=et2_widget_dropdown_button.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2013
* @version $Id$
*/
/*egw:uses
@ -19,6 +18,8 @@
import {et2_inputWidget} from './et2_core_inputWidget';
import {WidgetConfig, et2_register_widget} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_no_init} from "./et2_core_common";
import {egw} from "../jsapi/egw_global";
/**
* A split button - a button with a dropdown list

View File

@ -1,28 +1,25 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Dynheight object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_dynheight = void 0;
/*egw:use
/vendor/bower-asset/jquery/dist/jquery.js;
et2_core_inheritance;
*/
import { egw } from "../jsapi/egw_global";
/**
* Object which resizes an inner node to the maximum extend of an outer node
* (without creating a scrollbar) - it achieves that by performing some very
* nasty and time consuming calculations.
*/
var et2_dynheight = /** @class */ (function () {
function et2_dynheight(_outerNode, _innerNode, _minHeight) {
export class et2_dynheight {
constructor(_outerNode, _innerNode, _minHeight) {
this.initialized = false;
this.minHeight = 0;
this.bottomNodes = [];
@ -32,11 +29,11 @@ var et2_dynheight = /** @class */ (function () {
this.innerNode = jQuery(_innerNode);
this.minHeight = _minHeight;
}
et2_dynheight.prototype.destroy = function () {
destroy() {
this.outerNode = null;
this.innerNode = null;
this.bottomNodes = [];
};
}
/**
* Resizes the inner node. When this is done, the callback function is
* called.
@ -44,21 +41,21 @@ var et2_dynheight = /** @class */ (function () {
* @param {function} _callback
* @param {object} _context
*/
et2_dynheight.prototype.update = function (_callback, _context) {
update(_callback, _context) {
// Check whether the inner node is actually visible - if not, don't
// trigger the callback function
if (this.innerNode.is(":visible")) {
// Initialize the height calculation
this._initialize();
// Get the outer container height and offset, if available
var oh = this.outerNode.height();
var ot = this.outerNode.offset() ? this.outerNode.offset().top : 0;
const oh = this.outerNode.height();
const ot = this.outerNode.offset() ? this.outerNode.offset().top : 0;
// Get top and height of the inner node
var it = this.innerNode.offset().top;
const it = this.innerNode.offset().top;
// Calculate the height of the "bottomNodes"
var bminTop = this.bottomNodes.length ? Infinity : 0;
var bmaxBot = 0;
for (var i = 0; i < this.bottomNodes.length; i++) {
let bminTop = this.bottomNodes.length ? Infinity : 0;
let bmaxBot = 0;
for (let i = 0; i < this.bottomNodes.length; i++) {
// Ignore hidden popups
if (this.bottomNodes[i].find('.action_popup').length) {
egw.debug('warn', "Had to skip a hidden popup - it should be removed", this.bottomNodes[i].find('.action_popup'));
@ -68,9 +65,9 @@ var et2_dynheight = /** @class */ (function () {
if (!this.bottomNodes[i].is(':visible'))
continue;
// Get height, top and bottom and calculate the maximum/minimum
var bh_1 = this.bottomNodes[i].outerHeight(true);
var bt = this.bottomNodes[i].offset().top;
var bb = bh_1 + bt;
let bh = this.bottomNodes[i].outerHeight(true);
let bt = this.bottomNodes[i].offset().top;
const bb = bh + bt;
if (i == 0 || bminTop > bt) {
bminTop = bt;
}
@ -79,15 +76,15 @@ var et2_dynheight = /** @class */ (function () {
}
}
// Get the height of the bottom container
var bh = Math.max(0, bmaxBot - bminTop);
const bh = Math.max(0, bmaxBot - bminTop);
// Calculate the new height of the inner container
var h = Math.max(this.minHeight, oh + ot - it - bh -
const h = Math.max(this.minHeight, oh + ot - it - bh -
this.innerMargin - this.outerMargin);
this.innerNode.height(h);
// Update the width
// Some checking to make sure it doesn't overflow the width when user
// resizes the window
var w = this.outerNode.width();
let w = this.outerNode.width();
if (w > jQuery(window).width()) {
// 50px border, totally arbitrary, but we just need to make sure it's inside
w = jQuery(window).width() - 50;
@ -100,7 +97,7 @@ var et2_dynheight = /** @class */ (function () {
_callback.call(_context, w, h);
}
}
};
}
/**
* Function used internally which collects all DOM-Nodes which are located
* below this element.
@ -108,51 +105,49 @@ var et2_dynheight = /** @class */ (function () {
* @param {HTMLElement} _node
* @param {number} _bottom
*/
et2_dynheight.prototype._collectBottomNodes = function (_node, _bottom) {
_collectBottomNodes(_node, _bottom) {
// Calculate the bottom position of the inner node
if (typeof _bottom == "undefined") {
_bottom = this.innerNode.offset().top + this.innerNode.height();
}
if (_node) {
// Accumulate the outer margin of the parent elements
var node = jQuery(_node);
var ooh = node.outerHeight(true);
var oh = node.height();
const node = jQuery(_node);
const ooh = node.outerHeight(true);
const oh = node.height();
this.outerMargin += (ooh - oh) / 2; // Divide by 2 as the value contains margin-top and -bottom
// Iterate over the children of the given node and do the same
// recursively to the parent nodes until the _outerNode or body is
// reached.
var self_1 = this;
const self = this;
jQuery(_node).children().each(function () {
var $this = jQuery(this);
var top = $this.offset().top;
if (this != self_1.innerNode[0] && top >= _bottom) {
self_1.bottomNodes.push($this);
const $this = jQuery(this);
const top = $this.offset().top;
if (this != self.innerNode[0] && top >= _bottom) {
self.bottomNodes.push($this);
}
});
if (_node != this.outerNode[0] && _node != jQuery("body")[0]) {
this._collectBottomNodes(_node.parentNode, _bottom);
}
}
};
}
/**
* Used internally to calculate some information which will not change over
* the time.
*/
et2_dynheight.prototype._initialize = function () {
_initialize() {
if (!this.initialized) {
// Collect all bottomNodes and calculates the outer margin
this.bottomNodes = [];
this.outerMargin = 0;
this._collectBottomNodes(this.innerNode[0].parentNode);
// Calculate the inner margin
var ioh = this.innerNode.outerHeight(true);
var ih = this.innerNode.height();
const ioh = this.innerNode.outerHeight(true);
const ih = this.innerNode.height();
this.innerMargin = ioh - ih;
this.initialized = true;
}
};
return et2_dynheight;
}());
exports.et2_dynheight = et2_dynheight;
}
}
//# sourceMappingURL=et2_widget_dynheight.js.map

View File

@ -4,10 +4,9 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Andreas Stöckel
* @copyright Stylite 2011
* @version $Id$
* @copyright EGroupware GmbH 2011-2021
*/
/*egw:use
@ -15,6 +14,8 @@
et2_core_inheritance;
*/
import {egw} from "../jsapi/egw_global";
/**
* Object which resizes an inner node to the maximum extend of an outer node
* (without creating a scrollbar) - it achieves that by performing some very

View File

@ -1,32 +1,18 @@
"use strict";
/*
* Egroupware etemplate2 JS Entry widget
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
/*egw:uses
et2_core_valueWidget;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_valueWidget_1 = require("./et2_core_valueWidget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
import { et2_createWidget, et2_register_widget } from "./et2_core_widget";
import { et2_valueWidget } from "./et2_core_valueWidget";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_no_init } from "./et2_core_common";
/**
* A widget to display a value from an entry
*
@ -41,44 +27,41 @@ var et2_core_inheritance_1 = require("./et2_core_inheritance");
*
* @augments et2_valueWidget
*/
var et2_entry = /** @class */ (function (_super) {
__extends(et2_entry, _super);
function et2_entry(_parent, _attrs, _child) {
var _this =
export class et2_entry extends et2_valueWidget {
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_entry._attributes, _child || {})) || this;
_this.widget = null;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_entry._attributes, _child || {}));
this.widget = null;
// Often the ID conflicts, so check prefix
if (_attrs.id && _attrs.id.indexOf(et2_entry.prefix) < 0) {
_attrs.id = et2_entry.prefix + _attrs.id;
}
var value = _attrs.value;
_this = _super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_entry._attributes, _child || {})) || this;
let value = _attrs.value;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_entry._attributes, _child || {}));
// Save value from parsing, but only if set
if (value) {
_this.options.value = value;
this.options.value = value;
}
_this.widget = null;
_this.setDOMNode(document.createElement('span'));
return _this;
this.widget = null;
this.setDOMNode(document.createElement('span'));
}
et2_entry.prototype.loadFromXML = function (_node) {
loadFromXML(_node) {
// Load the nodes as usual
_super.prototype.loadFromXML.call(this, _node);
super.loadFromXML(_node);
// Do the magic
this.loadField();
};
}
/**
* Initialize widget for entry field
*/
et2_entry.prototype.loadField = function () {
loadField() {
// Create widget of correct type
var attrs = {
let attrs = {
id: this.id + (this.options.field ? '[' + this.options.field + ']' : ''),
type: 'label',
readonly: this.options.readonly
};
var modifications = this.getArrayMgr("modifications");
let modifications = this.getArrayMgr("modifications");
if (modifications && this.options.field) {
jQuery.extend(attrs, modifications.getEntry(attrs.id));
}
@ -87,7 +70,7 @@ var et2_entry = /** @class */ (function (_super) {
this.egw().debug('log', "Surpressed label on <" + this.getType() + ' label="' + this.options.label + '" id="' + this.id + '"...>');
this.options.label = '';
}
var widget = et2_createWidget(attrs.type, attrs, this);
let widget = et2_createWidget(attrs.type, attrs, this);
// If value is not set, etemplate takes care of everything
// If value was set, find the record explicitly.
if (typeof this.options.value == 'string') {
@ -101,11 +84,11 @@ var et2_entry = /** @class */ (function (_super) {
widget.options.value = widget.options.value == this.options.compare ? 'X' : '';
}
if (this.options.alternate_fields) {
var sum = 0;
var fields = this.options.alternate_fields.split(':');
for (var i = 0; i < fields.length; i++) {
var negate = (fields[i][0] == "-");
var value = this.getArrayMgr('content').getEntry(fields[i].replace('-', ''));
let sum = 0;
let fields = this.options.alternate_fields.split(':');
for (let i = 0; i < fields.length; i++) {
let negate = (fields[i][0] == "-");
let value = this.getArrayMgr('content').getEntry(fields[i].replace('-', ''));
sum += typeof value === 'undefined' ? 0 : (parseFloat(value) * (negate ? -1 : 1));
if (value && this.options.field !== 'sum') {
widget.options.value = value;
@ -118,53 +101,52 @@ var et2_entry = /** @class */ (function (_super) {
widget.options.value = sum;
}
}
};
et2_entry._attributes = {
field: {
'name': 'Fields',
'description': 'Which entry field to display, or "sum" to add up the alternate_fields',
'type': 'string'
},
compare: {
name: 'Compare',
description: 'if given, the selected field is compared with its value and an X is printed on equality, nothing otherwise',
default: et2_no_init,
type: 'string'
},
alternate_fields: {
name: 'Alternate fields',
description: 'colon (:) separated list of alternative fields. The first non-empty one is used if the selected field is empty, (-) used for subtraction',
type: 'string',
default: et2_no_init
},
precision: {
name: 'Decimals to be shown',
description: 'Specifies the number of decimals for sum of alternates, the default is 2',
type: 'string',
default: '2'
},
regex: {
name: 'Regular expression pattern',
description: 'Only used server-side in a preg_replace with regex_replace to modify the value',
default: et2_no_init,
type: 'string'
},
regex_replace: {
name: 'Regular expression replacement pattern',
description: 'Only used server-side in a preg_replace with regex to modify the value',
default: et2_no_init,
type: 'string'
},
value: {
type: 'any'
},
readonly: {
default: true
}
};
et2_entry.legacyOptions = ["field", "compare", "alternate_fields"];
et2_entry.prefix = '~';
return et2_entry;
}(et2_core_valueWidget_1.et2_valueWidget));
et2_core_widget_1.et2_register_widget(et2_entry, ["entry", 'contact-value', 'contact-account', 'contact-template', 'infolog-value', 'tracker-value', 'records-value']);
}
}
et2_entry._attributes = {
field: {
'name': 'Fields',
'description': 'Which entry field to display, or "sum" to add up the alternate_fields',
'type': 'string'
},
compare: {
name: 'Compare',
description: 'if given, the selected field is compared with its value and an X is printed on equality, nothing otherwise',
default: et2_no_init,
type: 'string'
},
alternate_fields: {
name: 'Alternate fields',
description: 'colon (:) separated list of alternative fields. The first non-empty one is used if the selected field is empty, (-) used for subtraction',
type: 'string',
default: et2_no_init
},
precision: {
name: 'Decimals to be shown',
description: 'Specifies the number of decimals for sum of alternates, the default is 2',
type: 'string',
default: '2'
},
regex: {
name: 'Regular expression pattern',
description: 'Only used server-side in a preg_replace with regex_replace to modify the value',
default: et2_no_init,
type: 'string'
},
regex_replace: {
name: 'Regular expression replacement pattern',
description: 'Only used server-side in a preg_replace with regex to modify the value',
default: et2_no_init,
type: 'string'
},
value: {
type: 'any'
},
readonly: {
default: true
}
};
et2_entry.legacyOptions = ["field", "compare", "alternate_fields"];
et2_entry.prefix = '~';
et2_register_widget(et2_entry, ["entry", 'contact-value', 'contact-account', 'contact-template', 'infolog-value', 'tracker-value', 'records-value']);
//# sourceMappingURL=et2_widget_entry.js.map

View File

@ -3,7 +3,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
*/
@ -12,9 +12,10 @@
et2_core_valueWidget;
*/
import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_createWidget, et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_valueWidget} from "./et2_core_valueWidget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_no_init} from "./et2_core_common";
/**
* A widget to display a value from an entry
@ -30,7 +31,7 @@ import {ClassWithAttributes} from "./et2_core_inheritance";
*
* @augments et2_valueWidget
*/
class et2_entry extends et2_valueWidget
export class et2_entry extends et2_valueWidget
{
static readonly _attributes : any = {
field: {

View File

@ -1,36 +1,21 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Favorite widget
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2013
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_favorites = void 0;
/*egw:uses
et2_dropdown_button;
et2_extension_nextmatch;
*/
var et2_core_widget_1 = require("./et2_core_widget");
var et2_widget_dropdown_button_1 = require("./et2_widget_dropdown_button");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
import { et2_register_widget } from "./et2_core_widget";
import { et2_dropdown_button } from "./et2_widget_dropdown_button";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { app, egw, egw_getFramework } from "../jsapi/egw_global";
/**
* Favorites widget, designed for use with a nextmatch widget
*
@ -58,49 +43,48 @@ var et2_core_inheritance_1 = require("./et2_core_inheritance");
*
* @augments et2_dropdown_button
*/
var et2_favorites = /** @class */ (function (_super) {
__extends(et2_favorites, _super);
export class et2_favorites extends et2_dropdown_button {
/**
* Constructor
*
* @memberOf et2_favorites
*/
function et2_favorites(_parent, _attrs, _child) {
var _this = _super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_favorites._attributes, _child || {})) || this;
constructor(_parent, _attrs, _child) {
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_favorites._attributes, _child || {}));
// Some convenient variables, used in closures / event handlers
_this.header = null;
_this.nextmatch = null;
_this.favSortedList = null;
_this.sidebox_target = null;
this.header = null;
this.nextmatch = null;
this.favSortedList = null;
this.sidebox_target = null;
// If filter was set server side, we need to remember it until nm is created
_this.nm_filter = false;
_this.sidebox_target = jQuery("#" + _this.options.sidebox_target);
if (_this.sidebox_target.length == 0 && egw_getFramework() != null) {
var egw_fw = egw_getFramework();
_this.sidebox_target = jQuery("#" + _this.options.sidebox_target, egw_fw.sidemenuDiv);
this.nm_filter = false;
this.sidebox_target = jQuery("#" + this.options.sidebox_target);
if (this.sidebox_target.length == 0 && egw_getFramework() != null) {
let egw_fw = egw_getFramework();
this.sidebox_target = jQuery("#" + this.options.sidebox_target, egw_fw.sidemenuDiv);
}
// Store array of sorted items
_this.favSortedList = ['blank'];
var apps = egw().user('apps');
this.favSortedList = ['blank'];
let apps = egw().user('apps');
et2_favorites.is_admin = (typeof apps['admin'] != "undefined");
// Make sure we have an app
if (!_this.options.app) {
_this.options.app = _this.getInstanceManager().app;
if (!this.options.app) {
this.options.app = this.getInstanceManager().app;
}
_this.stored_filters = _this.load_favorites(_this.options.app);
_this.preferred = egw.preference(_this.options.default_pref, _this.options.app);
if (!_this.preferred || typeof _this.stored_filters[_this.preferred] == "undefined") {
_this.preferred = "blank";
this.stored_filters = this.load_favorites(this.options.app);
this.preferred = egw.preference(this.options.default_pref, this.options.app);
if (!this.preferred || typeof this.stored_filters[this.preferred] == "undefined") {
this.preferred = "blank";
}
// It helps to have the ID properly set before we get too far
_this.set_id(_this.id);
_this.init_filters(_this);
_this.menu.addClass("favorites");
this.set_id(this.id);
this.init_filters(this);
this.menu.addClass("favorites");
// Set the default (button) value
_this.set_value(_this.preferred, true);
var self = _this;
this.set_value(this.preferred, true);
let self = this;
// Add a listener on the radio buttons to set default filter
jQuery(_this.menu).on("click", "input:radio", function (event) {
jQuery(this.menu).on("click", "input:radio", function (event) {
// Don't do the menu
event.stopImmediatePropagation();
// Save as default favorite - used when you click the button
@ -121,14 +105,14 @@ var et2_favorites = /** @class */ (function (_super) {
});
});
//Sort DomNodes of sidebox fav. menu
var sideBoxDOMNodeSort = function (_favSList) {
var favS = jQuery.isArray(_favSList) ? _favSList.slice(0).reverse() : [];
for (var i = 0; i < favS.length; i++) {
let sideBoxDOMNodeSort = function (_favSList) {
let favS = jQuery.isArray(_favSList) ? _favSList.slice(0).reverse() : [];
for (let i = 0; i < favS.length; i++) {
self.sidebox_target.children().find('[data-id$="' + favS[i] + '"]').prependTo(self.sidebox_target.children());
}
};
//Add Sortable handler to nm fav. menu
jQuery(_this.menu).sortable({
jQuery(this.menu).sortable({
items: 'li:not([data-id$="add"])',
placeholder: 'ui-fav-sortable-placeholder',
delay: 250,
@ -139,7 +123,7 @@ var et2_favorites = /** @class */ (function (_super) {
}
});
// Add a listener on the delete to remove
_this.menu.on("click", "div.ui-icon-trash", app[self.options.app], function () {
this.menu.on("click", "div.ui-icon-trash", app[self.options.app], function () {
// App instance might not be ready yet, so don't bind directly
app[self.options.app].delete_favorite.apply(this, arguments);
})
@ -149,30 +133,29 @@ var et2_favorites = /** @class */ (function (_super) {
.on("mouseleave", "div.ui-icon-trash", function () { jQuery(this).unwrap(); });
// Trigger refresh of menu options now that events are registered
// to update sidebox
if (_this.sidebox_target.length > 0) {
_this.init_filters(_this);
if (this.sidebox_target.length > 0) {
this.init_filters(this);
}
return _this;
}
/**
* Load favorites from preferences
*
* @param app String Load favorites from this application
*/
et2_favorites.prototype.load_favorites = function (app) {
load_favorites(app) {
// Default blank filter
var stored_filters = {
let stored_filters = {
'blank': {
name: this.egw().lang("No filters"),
state: {}
}
};
// Load saved favorites
var preferences = egw.preference("*", app);
for (var pref_name in preferences) {
let preferences = egw.preference("*", app);
for (let pref_name in preferences) {
if (pref_name.indexOf(et2_favorites.PREFIX) == 0 && typeof preferences[pref_name] == 'object') {
var name_1 = pref_name.substr(et2_favorites.PREFIX.length);
stored_filters[name_1] = preferences[pref_name];
let name = pref_name.substr(et2_favorites.PREFIX.length);
stored_filters[name] = preferences[pref_name];
// Keep older favorites working - they used to store nm filters in 'filters',not state
if (preferences[pref_name]["filters"]) {
stored_filters[pref_name]["state"] = preferences[pref_name]["filters"];
@ -189,15 +172,15 @@ var et2_favorites = /** @class */ (function (_super) {
stored_filters = {};
}
else {
for (var name_2 in stored_filters) {
if (this.favSortedList.indexOf(name_2) < 0) {
this.favSortedList.push(name_2);
for (let name in stored_filters) {
if (this.favSortedList.indexOf(name) < 0) {
this.favSortedList.push(name);
}
}
this.egw().set_preference(this.options.app, 'fav_sort_pref', this.favSortedList);
if (this.favSortedList.length > 0) {
var sortedListObj = {};
for (var i = 0; i < this.favSortedList.length; i++) {
let sortedListObj = {};
for (let i = 0; i < this.favSortedList.length; i++) {
if (typeof stored_filters[this.favSortedList[i]] != 'undefined') {
sortedListObj[this.favSortedList[i]] = stored_filters[this.favSortedList[i]];
}
@ -210,18 +193,18 @@ var et2_favorites = /** @class */ (function (_super) {
}
}
return stored_filters;
};
}
// Create & set filter options for dropdown menu
et2_favorites.prototype.init_filters = function (widget, filters) {
init_filters(widget, filters) {
if (typeof filters == "undefined") {
filters = this.stored_filters;
}
var options = {};
for (var name_3 in filters) {
options[name_3] = "<input type='radio' name='" + this.internal_ids.menu + "[button][favorite]' value='" + name_3 + "' title='" +
let options = {};
for (let name in filters) {
options[name] = "<input type='radio' name='" + this.internal_ids.menu + "[button][favorite]' value='" + name + "' title='" +
this.egw().lang('Set as default') + "'/>" +
(filters[name_3].name != undefined ? filters[name_3].name : name_3) +
(filters[name_3].group != false && !et2_favorites.is_admin || name_3 == 'blank' ? "" :
(filters[name].name != undefined ? filters[name].name : name) +
(filters[name].group != false && !et2_favorites.is_admin || name == 'blank' ? "" :
"<div class='ui-icon ui-icon-trash' title='" + this.egw().lang('Delete') + "'/>");
}
// Only add 'Add current' if we have a nextmatch
@ -231,16 +214,16 @@ var et2_favorites = /** @class */ (function (_super) {
widget.set_select_options.call(widget, options);
// Set radio to current value
jQuery("input[value='" + this.preferred + "']:radio", this.menu).attr("checked", 1);
};
et2_favorites.prototype.set_nm_filters = function (filters) {
}
set_nm_filters(filters) {
if (this.nextmatch) {
this.nextmatch.applyFilters(filters);
}
else {
console.log(filters);
}
};
et2_favorites.prototype.onclick = function (node) {
}
onclick(node) {
// Apply preferred filter - make sure it's an object, and not a reference
if (this.preferred && this.stored_filters[this.preferred]) {
// use app[appname].setState if available to allow app to overwrite it (eg. change to non-listview in calendar)
@ -254,15 +237,15 @@ var et2_favorites = /** @class */ (function (_super) {
else {
alert(this.egw().lang("No default set"));
}
};
}
// Apply the favorite when you pick from the list
et2_favorites.prototype.change = function (selected_node) {
change(selected_node) {
this.value = jQuery(selected_node).attr("data-id");
if (this.value == "add" && this.nextmatch) {
// Get current filters
var current_filters = jQuery.extend({}, this.nextmatch.activeFilters);
let current_filters = jQuery.extend({}, this.nextmatch.activeFilters);
// Add in extras
for (var extra in this.options.filters) {
for (let extra in this.options.filters) {
// Don't overwrite what nm has, chances are nm has more up-to-date value
if (typeof current_filters == 'undefined') {
current_filters[extra] = this.nextmatch.options.settings[extra];
@ -272,7 +255,7 @@ var et2_favorites = /** @class */ (function (_super) {
delete current_filters.selcolumns;
// Add in application's settings
if (this.filters != true) {
for (var i = 0; i < this.filters.length; i++) {
for (let i = 0; i < this.filters.length; i++) {
current_filters[this.options.filters[i]] = this.nextmatch.options.settings[this.options.filters[i]];
}
}
@ -285,26 +268,26 @@ var et2_favorites = /** @class */ (function (_super) {
// Reset filters when select no filters
this.set_nm_filters({});
}
};
et2_favorites.prototype.set_value = function (filter_name, parent) {
}
set_value(filter_name, parent) {
if (parent) {
return _super.prototype.set_value.call(this, filter_name);
return super.set_value(filter_name);
}
if (filter_name == 'add')
return false;
app[this.options.app].setState(this.stored_filters[filter_name]);
return false;
};
et2_favorites.prototype.getValue = function () {
}
getValue() {
return null;
};
}
/**
* Set the nextmatch to filter
* From et2_INextmatchHeader interface
*
* @param {et2_nextmatch} nextmatch
*/
et2_favorites.prototype.setNextmatch = function (nextmatch) {
setNextmatch(nextmatch) {
this.nextmatch = nextmatch;
if (this.nm_filter) {
this.set_value(this.nm_filter);
@ -312,39 +295,37 @@ var et2_favorites = /** @class */ (function (_super) {
}
// Re-generate filter list so we can add 'Add current'
this.init_filters(this);
};
et2_favorites._attributes = {
"default_pref": {
"name": "Default preference key",
"type": "string",
"description": "The preference key where default favorite is stored (not the value)"
},
"sidebox_target": {
"name": "Sidebox target",
"type": "string",
"description": "ID of element to insert favorite list into",
"default": "favorite_sidebox"
},
"app": {
"name": "Application",
"type": "string",
"description": "Application to show favorites for"
},
"filters": {
"name": "Extra filters",
"type": "any",
"description": "Array of extra filters to include in the saved favorite"
},
// These are particular to favorites
id: { "default": "favorite" },
label: { "default": "" },
label_updates: { "default": false },
image: { "default": egw().image('fav_filter') },
statustext: { "default": "Favorite queries", "type": "string" }
};
et2_favorites.PREFIX = "favorite_";
return et2_favorites;
}(et2_widget_dropdown_button_1.et2_dropdown_button));
exports.et2_favorites = et2_favorites;
et2_core_widget_1.et2_register_widget(et2_favorites, ["favorites"]);
}
}
et2_favorites._attributes = {
"default_pref": {
"name": "Default preference key",
"type": "string",
"description": "The preference key where default favorite is stored (not the value)"
},
"sidebox_target": {
"name": "Sidebox target",
"type": "string",
"description": "ID of element to insert favorite list into",
"default": "favorite_sidebox"
},
"app": {
"name": "Application",
"type": "string",
"description": "Application to show favorites for"
},
"filters": {
"name": "Extra filters",
"type": "any",
"description": "Array of extra filters to include in the saved favorite"
},
// These are particular to favorites
id: { "default": "favorite" },
label: { "default": "" },
label_updates: { "default": false },
image: { "default": egw().image('fav_filter') },
statustext: { "default": "Favorite queries", "type": "string" }
};
et2_favorites.PREFIX = "favorite_";
et2_register_widget(et2_favorites, ["favorites"]);
//# sourceMappingURL=et2_widget_favorites.js.map

View File

@ -4,7 +4,7 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2013
*/
@ -18,6 +18,7 @@ import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_INextmatchHeader} from "./et2_extension_nextmatch";
import {et2_dropdown_button} from "./et2_widget_dropdown_button";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {app, egw, egw_getFramework} from "../jsapi/egw_global";
/**
* Favorites widget, designed for use with a nextmatch widget

View File

@ -1,103 +1,86 @@
"use strict";
/**
* EGroupware eTemplate2 - JS Number object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2011
* @version $Id$
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.et2_file = void 0;
/*egw:uses
et2_core_inputWidget;
phpgwapi.Resumable.resumable;
api.Resumable.resumable;
*/
var et2_core_inputWidget_1 = require("./et2_core_inputWidget");
var et2_core_widget_1 = require("./et2_core_widget");
var et2_core_inheritance_1 = require("./et2_core_inheritance");
import { et2_inputWidget } from "./et2_core_inputWidget";
import { et2_register_widget } from "./et2_core_widget";
import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_no_init } from "./et2_core_common";
import { et2_vfsSize } from "./et2_widget_vfs";
import "../Resumable/resumable.js";
/**
* Class which implements file upload
*
* @augments et2_inputWidget
*/
var et2_file = /** @class */ (function (_super) {
__extends(et2_file, _super);
export class et2_file extends et2_inputWidget {
/**
* Constructor
*
* @memberOf et2_file
*/
function et2_file(_parent, _attrs, _child) {
var _this =
constructor(_parent, _attrs, _child) {
// Call the inherited constructor
_super.call(this, _parent, _attrs, et2_core_inheritance_1.ClassWithAttributes.extendAttributes(et2_file._attributes, _child || {})) || this;
_this.asyncOptions = {};
_this.input = null;
_this.progress = null;
_this.span = null;
_this.node = null;
_this.input = null;
_this.progress = null;
_this.span = null;
super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_file._attributes, _child || {}));
this.asyncOptions = {};
this.input = null;
this.progress = null;
this.span = null;
this.node = null;
this.input = null;
this.progress = null;
this.span = null;
// Contains all submit buttons need to be disabled during upload process
_this.disabled_buttons = jQuery("input[type='submit'], button");
this.disabled_buttons = jQuery("input[type='submit'], button");
// Make sure it's an object, not an array, or values get lost when sent to server
_this.options.value = jQuery.extend({}, _this.options.value);
if (!_this.options.id) {
this.options.value = jQuery.extend({}, this.options.value);
if (!this.options.id) {
console.warn("File widget needs an ID. Used 'file_widget'.");
_this.options.id = "file_widget";
this.options.id = "file_widget";
}
// Legacy - id ending in [] means multiple
if (_this.options.id.substr(-2) == "[]") {
_this.options.multiple = true;
if (this.options.id.substr(-2) == "[]") {
this.options.multiple = true;
}
// If ID ends in /, it's a directory - allow multiple
else if (_this.options.id.substr(-1) === "/") {
_this.options.multiple = true;
else if (this.options.id.substr(-1) === "/") {
this.options.multiple = true;
_attrs.multiple = true;
}
// Set up the URL to have the request ID & the widget ID
var instance = _this.getInstanceManager();
var self = _this;
_this.asyncOptions = jQuery.extend({}, _this.getAsyncOptions(_this));
_this.asyncOptions.fieldName = _this.options.id;
_this.createInputWidget();
_this.set_readonly(_this.options.readonly);
return _this;
var instance = this.getInstanceManager();
let self = this;
this.asyncOptions = jQuery.extend({}, this.getAsyncOptions(this));
this.asyncOptions.fieldName = this.options.id;
this.createInputWidget();
this.set_readonly(this.options.readonly);
}
et2_file.prototype.destroy = function () {
_super.prototype.destroy.call(this);
destroy() {
super.destroy();
this.set_drop_target(null);
this.node = null;
this.input = null;
this.span = null;
this.progress = null;
};
et2_file.prototype.createInputWidget = function () {
}
createInputWidget() {
this.node = jQuery(document.createElement("div")).addClass("et2_file");
this.span = jQuery(document.createElement("span"))
.addClass('et2_file_span et2_button')
.appendTo(this.node);
if (this.options.label != '')
this.span.addClass('et2_button_text');
var span = this.span;
let span = this.span;
this.input = jQuery(document.createElement("input"))
.attr("type", "file").attr("placeholder", this.options.blur)
.addClass("et2_file_upload")
@ -116,7 +99,7 @@ var et2_file = /** @class */ (function (_super) {
});
if (this.options.accept)
this.input.attr('accept', this.options.accept);
var self = this;
let self = this;
// trigger native input upload file
if (!this.options.readonly)
this.span.click(function () { self.input.click(); });
@ -133,7 +116,7 @@ var et2_file = /** @class */ (function (_super) {
// This may be a problem submitting via ajax
}
if (this.options.progress) {
var widget = this.getRoot().getWidgetById(this.options.progress);
let widget = this.getRoot().getWidgetById(this.options.progress);
if (widget) {
//may be not available at createInputWidget time
this.progress = jQuery(widget.getDOMNode());
@ -150,11 +133,11 @@ var et2_file = /** @class */ (function (_super) {
// set drop target to widget dom node if no target option is specified
if (!this.options.drop_target)
this.resumable.assignDrop([this.getDOMNode()]);
};
}
/**
* Get any specific async upload options
*/
et2_file.prototype.getAsyncOptions = function (self) {
getAsyncOptions(self) {
return {
// Callbacks
onStart: function (event, file_count) {
@ -175,43 +158,43 @@ var et2_file = /** @class */ (function (_super) {
// Disable checking for already uploaded chunks
testChunks: false
};
};
}
/**
* Set a widget or DOM node as a HTML5 file drop target
*
* @param {string} new_target widget ID or DOM node ID to be used as a new target
*/
et2_file.prototype.set_drop_target = function (new_target) {
set_drop_target(new_target) {
// Cancel old drop target
if (this.options.drop_target) {
var widget_1 = this.getRoot().getWidgetById(this.options.drop_target);
var drop_target_1 = widget_1 && widget_1.getDOMNode() || document.getElementById(this.options.drop_target);
if (drop_target_1) {
this.resumable.unAssignDrop(drop_target_1);
let widget = this.getRoot().getWidgetById(this.options.drop_target);
let drop_target = widget && widget.getDOMNode() || document.getElementById(this.options.drop_target);
if (drop_target) {
this.resumable.unAssignDrop(drop_target);
}
}
this.options.drop_target = new_target;
if (!this.options.drop_target)
return;
// Set up new drop target
var widget = this.getRoot().getWidgetById(this.options.drop_target);
var drop_target = widget && widget.getDOMNode() || document.getElementById(this.options.drop_target);
let widget = this.getRoot().getWidgetById(this.options.drop_target);
let drop_target = widget && widget.getDOMNode() || document.getElementById(this.options.drop_target);
if (drop_target) {
this.resumable.assignDrop([drop_target]);
}
else {
this.egw().debug("warn", "Did not find file drop target %s", this.options.drop_target);
}
};
et2_file.prototype.attachToDOM = function () {
var res = _super.prototype.attachToDOM.call(this);
}
attachToDOM() {
let res = super.attachToDOM();
// Override parent's change, file widget will fire change when finished uploading
this.input.unbind("change.et2_inputWidget");
return res;
};
et2_file.prototype.getValue = function () {
}
getValue() {
return this.options.value ? this.options.value : this.input.val();
};
}
/**
* Set the value of the file widget.
*
@ -221,7 +204,7 @@ var et2_file = /** @class */ (function (_super) {
* @param {Event} event Most browsers require the user to initiate file transfers in some way.
* Pass the event in, if you have it.
*/
et2_file.prototype.set_value = function (value, event) {
set_value(value, event) {
if (!value || typeof value == "undefined") {
value = {};
}
@ -234,7 +217,7 @@ var et2_file = /** @class */ (function (_super) {
this.input.unwrap();
return;
}
var addFile = jQuery.proxy(function (i, file) {
let addFile = jQuery.proxy(function (i, file) {
this.resumable.addFile(file, event);
}, this);
if (typeof value == 'object' && value.length && typeof value[0] == 'object' && value[0].name) {
@ -248,24 +231,24 @@ var et2_file = /** @class */ (function (_super) {
jQuery.each(value, addFile);
}
}
};
}
/**
* Set the value for label
* The label is used as caption for span tag which customize the HTML file upload styling
*
* @param {string} value text value of label
*/
et2_file.prototype.set_label = function (value) {
set_label(value) {
if (this.span != null && value != null) {
this.span.text(value);
}
};
et2_file.prototype.getInputNode = function () {
}
getInputNode() {
if (typeof this.input == 'undefined')
return false;
return this.input[0];
};
et2_file.prototype.set_mime = function (mime) {
}
set_mime(mime) {
if (!mime) {
this.options.mime = null;
}
@ -276,24 +259,24 @@ var et2_file = /** @class */ (function (_super) {
else {
this.options.mime = mime;
}
};
et2_file.prototype.set_multiple = function (_multiple) {
}
set_multiple(_multiple) {
this.options.multiple = _multiple;
if (_multiple) {
return this.input.attr("multiple", "multiple");
}
return this.input.removeAttr("multiple");
};
}
/**
* Check to see if the provided file's mimetype matches
*
* @param f File object
* @return boolean
*/
et2_file.prototype.checkMime = function (f) {
checkMime(f) {
if (!this.options.mime)
return true;
var mime = '';
let mime = '';
if (this.options.mime.indexOf("/") != 0) {
// Lower case it now, if it's not a regex
mime = this.options.mime.toLowerCase();
@ -312,8 +295,8 @@ var et2_file = /** @class */ (function (_super) {
}
// Not right mime
return false;
};
et2_file.prototype._fileAdded = function (file, event) {
}
_fileAdded(file, event) {
// Manual additions have no event
if (typeof event == 'undefined') {
event = {};
@ -341,21 +324,21 @@ var et2_file = /** @class */ (function (_super) {
// Wrong mime type - show in the list of files
return this.createStatus(this.egw().lang("File is of wrong type (%1 != %2)!", file.file.type, this.options.mime), file);
}
};
}
/**
* Add in the request id
*/
et2_file.prototype.beforeSend = function (form) {
beforeSend(form) {
var instance = this.getInstanceManager();
return {
request_id: instance.etemplate_exec_id,
widget_id: this.id
};
};
}
/**
* Disables submit buttons while uploading
*/
et2_file.prototype.onStart = function (event, file_count) {
onStart(event, file_count) {
// Hide any previous errors
this.hideMessage();
event.data = this;
@ -367,11 +350,11 @@ var et2_file = /** @class */ (function (_super) {
if (this.options.onStart)
return et2_call(this.options.onStart, event, file_count);
return true;
};
}
/**
* Re-enables submit buttons when done
*/
et2_file.prototype.onFinish = function () {
onFinish() {
this.disabled_buttons.removeAttr("disabled").css('cursor', 'pointer').removeClass('et2_button_ro');
var file_count = this.resumable.files.length;
// Remove files from list
@ -397,13 +380,13 @@ var et2_file = /** @class */ (function (_super) {
// Fire legacy change action when done
this.change(this.input);
}
};
}
/**
* Build up dropdown progress with total count indicator
*
* @todo Implement totalProgress bar instead of ajax-loader, in order to show how much percent of uploading is completed
*/
et2_file.prototype._build_progressDropDownList = function () {
_build_progressDropDownList() {
this.progress.addClass("progress_dropDown_fileList");
//Add uploading indicator and bind hover handler on it
jQuery(this.node).find('span').addClass('totalProgress_loader');
@ -416,14 +399,14 @@ var et2_file = /** @class */ (function (_super) {
jQuery('.progress_dropDown_fileList').hide();
}
});
};
}
/**
* Creates the elements used for displaying the file, and it's upload status, and
* attaches them to the DOM
*
* @param _event Either the event, or an error message
*/
et2_file.prototype.createStatus = function (_event, file) {
createStatus(_event, file) {
var error = (typeof _event == "object" ? "" : _event);
if (this.options.max_file_size && file.size > this.options.max_file_size) {
error = this.egw().lang("File too large. Maximum %1", et2_vfsSize.prototype.human_size(this.options.max_file_size));
@ -448,20 +431,20 @@ var et2_file = /** @class */ (function (_super) {
}
}
return error == "";
};
et2_file.prototype._fileProgress = function (file) {
}
_fileProgress(file) {
if (this.progress) {
jQuery("li[data-file='" + file.fileName.replace(/'/g, '&quot') + "'] > span.progressBar > p").css("width", Math.ceil(file.progress() * 100) + "%");
}
return true;
};
et2_file.prototype.onError = function (event, name, error) {
}
onError(event, name, error) {
console.warn(event, name, error);
};
}
/**
* A file upload is finished, update the UI
*/
et2_file.prototype.finishUpload = function (file, response) {
finishUpload(file, response) {
var name = file.fileName || 'file';
if (typeof response == 'string')
response = jQuery.parseJSON(response);
@ -502,13 +485,13 @@ var et2_file = /** @class */ (function (_super) {
this.onFinishOne(event, response, name);
}
return true;
};
}
/**
* Remove a file from the list of values
*
* @param {File|string} File object, or file name, to remove
*/
et2_file.prototype.remove_file = function (file) {
remove_file(file) {
//console.info(filename);
if (typeof file == 'string') {
file = { fileName: file };
@ -522,11 +505,11 @@ var et2_file = /** @class */ (function (_super) {
}
if (file.isComplete && !file.isComplete() && file.cancel)
file.cancel();
};
}
/**
* Cancel a file - event callback
*/
et2_file.prototype.cancel = function (e) {
cancel(e) {
e.preventDefault();
// Look for file name in list
var target = jQuery(e.target).parents("li");
@ -534,13 +517,13 @@ var et2_file = /** @class */ (function (_super) {
// In case it didn't make it to the list (error)
target.remove();
jQuery(e.target).remove();
};
}
/**
* Set readonly
*
* @param {boolean} _ro boolean readonly state, true means readonly
*/
et2_file.prototype.set_readonly = function (_ro) {
set_readonly(_ro) {
if (typeof _ro != "undefined") {
this.options.readonly = _ro;
this.span.toggleClass('et2_file_ro', _ro);
@ -552,89 +535,87 @@ var et2_file = /** @class */ (function (_super) {
this.span.off().bind('click', function () { self.input.click(); });
}
}
};
et2_file._attributes = {
"multiple": {
"name": "Multiple files",
"type": "boolean",
"default": false,
"description": "Allow the user to select more than one file to upload at a time. Subject to browser support."
},
"max_file_size": {
"name": "Maximum file size",
"type": "integer",
"default": 0,
"description": "Largest file accepted, in bytes. Subject to server limitations. 8MB = 8388608"
},
"mime": {
"name": "Allowed file types",
"type": "string",
"default": et2_no_init,
"description": "Mime type (eg: image/png) or regex (eg: /^text\//i) for allowed file types"
},
"blur": {
"name": "Placeholder",
"type": "string",
"default": "",
"description": "This text get displayed if an input-field is empty and does not have the input-focus (blur). It can be used to show a default value or a kind of help-text."
},
"progress": {
"name": "Progress node",
"type": "string",
"default": et2_no_init,
"description": "The ID of an alternate node (div) to display progress and results. The Node is fetched with et2 getWidgetById so you MUST use the id assigned in XET-File (it may not be available at creation time, so we (re)check on createStatus time)"
},
"onStart": {
"name": "Start event handler",
"type": "any",
"default": et2_no_init,
"description": "A (js) function called when an upload starts. Return true to continue with upload, false to cancel."
},
"onFinish": {
"name": "Finish event handler",
"type": "any",
"default": et2_no_init,
"description": "A (js) function called when all files to be uploaded are finished."
},
drop_target: {
"name": "Optional, additional drop target for HTML5 uploads",
"type": "string",
"default": et2_no_init,
"description": "The ID of an additional drop target for HTML5 drag-n-drop file uploads"
},
label: {
"name": "Label of file upload",
"type": "string",
"default": "Choose file...",
"description": "String caption to be displayed on file upload span"
},
progress_dropdownlist: {
"name": "List on files in progress like dropdown",
"type": "boolean",
"default": false,
"description": "Style list of files in uploading progress like dropdown list with a total upload progress indicator"
},
onFinishOne: {
"name": "Finish event handler for each one",
"type": "js",
"default": et2_no_init,
"description": "A (js) function called when a file to be uploaded is finished."
},
accept: {
"name": "Acceptable extensions",
"type": "string",
"default": '',
"description": "Define types of files that the server accepts. Multiple types can be seperated by comma and the default is to accept everything."
},
chunk_size: {
"name": "Chunk size",
"type": "integer",
"default": 1024 * 1024,
"description": "Max chunk size, gets set from server-side PHP (max_upload_size-1M)/2" // last chunk can be up to 2*chunk_size!
}
};
return et2_file;
}(et2_core_inputWidget_1.et2_inputWidget));
exports.et2_file = et2_file;
et2_core_widget_1.et2_register_widget(et2_file, ["file"]);
}
}
et2_file._attributes = {
"multiple": {
"name": "Multiple files",
"type": "boolean",
"default": false,
"description": "Allow the user to select more than one file to upload at a time. Subject to browser support."
},
"max_file_size": {
"name": "Maximum file size",
"type": "integer",
"default": 0,
"description": "Largest file accepted, in bytes. Subject to server limitations. 8MB = 8388608"
},
"mime": {
"name": "Allowed file types",
"type": "string",
"default": et2_no_init,
"description": "Mime type (eg: image/png) or regex (eg: /^text\//i) for allowed file types"
},
"blur": {
"name": "Placeholder",
"type": "string",
"default": "",
"description": "This text get displayed if an input-field is empty and does not have the input-focus (blur). It can be used to show a default value or a kind of help-text."
},
"progress": {
"name": "Progress node",
"type": "string",
"default": et2_no_init,
"description": "The ID of an alternate node (div) to display progress and results. The Node is fetched with et2 getWidgetById so you MUST use the id assigned in XET-File (it may not be available at creation time, so we (re)check on createStatus time)"
},
"onStart": {
"name": "Start event handler",
"type": "any",
"default": et2_no_init,
"description": "A (js) function called when an upload starts. Return true to continue with upload, false to cancel."
},
"onFinish": {
"name": "Finish event handler",
"type": "any",
"default": et2_no_init,
"description": "A (js) function called when all files to be uploaded are finished."
},
drop_target: {
"name": "Optional, additional drop target for HTML5 uploads",
"type": "string",
"default": et2_no_init,
"description": "The ID of an additional drop target for HTML5 drag-n-drop file uploads"
},
label: {
"name": "Label of file upload",
"type": "string",
"default": "Choose file...",
"description": "String caption to be displayed on file upload span"
},
progress_dropdownlist: {
"name": "List on files in progress like dropdown",
"type": "boolean",
"default": false,
"description": "Style list of files in uploading progress like dropdown list with a total upload progress indicator"
},
onFinishOne: {
"name": "Finish event handler for each one",
"type": "js",
"default": et2_no_init,
"description": "A (js) function called when a file to be uploaded is finished."
},
accept: {
"name": "Acceptable extensions",
"type": "string",
"default": '',
"description": "Define types of files that the server accepts. Multiple types can be seperated by comma and the default is to accept everything."
},
chunk_size: {
"name": "Chunk size",
"type": "integer",
"default": 1024 * 1024,
"description": "Max chunk size, gets set from server-side PHP (max_upload_size-1M)/2" // last chunk can be up to 2*chunk_size!
}
};
et2_register_widget(et2_file, ["file"]);
//# sourceMappingURL=et2_widget_file.js.map

View File

@ -4,20 +4,23 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Nathan Gray
* @copyright Nathan Gray 2011
* @version $Id$
*/
/*egw:uses
et2_core_inputWidget;
phpgwapi.Resumable.resumable;
api.Resumable.resumable;
*/
import {et2_inputWidget} from "./et2_core_inputWidget";
import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_no_init} from "./et2_core_common";
import {et2_DOMWidget} from "./et2_core_DOMWidget";
import {et2_vfsSize} from "./et2_widget_vfs";
import "../Resumable/resumable.js";
/**
* Class which implements file upload
@ -293,7 +296,7 @@ export class et2_file extends et2_inputWidget
if(!this.options.drop_target) return;
// Set up new drop target
let widget = this.getRoot().getWidgetById(this.options.drop_target);
let widget = <et2_DOMWidget>this.getRoot().getWidgetById(this.options.drop_target);
let drop_target = widget && widget.getDOMNode() || document.getElementById(this.options.drop_target);
if(drop_target)
{
@ -603,7 +606,7 @@ export class et2_file extends et2_inputWidget
if(this.options.progress)
{
var widget = this.getRoot().getWidgetById(this.options.progress);
var widget = <et2_DOMWidget>this.getRoot().getWidgetById(this.options.progress);
if(widget)
{
this.progress = jQuery(widget.getDOMNode());

Some files were not shown because too many files have changed in this diff Show More