2011-08-10 16:36:31 +02:00
|
|
|
/**
|
2013-04-13 21:00:13 +02:00
|
|
|
* EGroupware eTemplate2 - JS Box object
|
2011-08-10 16:36:31 +02:00
|
|
|
*
|
|
|
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
|
|
|
* @package etemplate
|
|
|
|
* @subpackage api
|
2021-06-07 17:33:53 +02:00
|
|
|
* @link https://www.egroupware.org
|
2011-08-10 16:36:31 +02:00
|
|
|
* @author Andreas Stöckel
|
2021-06-07 17:33:53 +02:00
|
|
|
* @copyright EGroupware GmbH 2011-2021
|
2011-08-10 16:36:31 +02:00
|
|
|
*/
|
|
|
|
/*egw:uses
|
2020-01-21 15:36:45 +01:00
|
|
|
/vendor/bower-asset/jquery/dist/jquery.js;
|
|
|
|
et2_core_baseWidget;
|
2011-08-10 16:36:31 +02:00
|
|
|
*/
|
2021-06-07 17:33:53 +02:00
|
|
|
import { et2_register_widget } from "./et2_core_widget";
|
|
|
|
import { et2_baseWidget } from "./et2_core_baseWidget";
|
|
|
|
import { et2_readAttrWithDefault } from "./et2_core_xml";
|
2011-08-10 16:36:31 +02:00
|
|
|
/**
|
2014-01-27 10:48:43 +01:00
|
|
|
* Class which implements box and vbox tag
|
|
|
|
*
|
2017-10-05 17:48:31 +02:00
|
|
|
* Auto-repeat: In order to get box auto repeat to work we need to have another
|
|
|
|
* box as a wrapper with an id set.
|
|
|
|
*
|
2013-04-13 21:00:13 +02:00
|
|
|
* @augments et2_baseWidget
|
2014-01-27 10:48:43 +01:00
|
|
|
*/
|
2021-06-07 17:33:53 +02:00
|
|
|
export class et2_box extends et2_baseWidget {
|
2020-01-21 15:36:45 +01:00
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*
|
|
|
|
* @memberOf et2_box
|
|
|
|
*/
|
2021-06-07 17:33:53 +02:00
|
|
|
constructor(_parent, _attrs, _child) {
|
|
|
|
super(_parent, _attrs, _child);
|
|
|
|
this.div = jQuery(document.createElement("div"))
|
|
|
|
.addClass("et2_" + this.getType())
|
2020-01-21 15:36:45 +01:00
|
|
|
.addClass("et2_box_widget");
|
2021-06-07 17:33:53 +02:00
|
|
|
this.setDOMNode(this.div[0]);
|
2020-01-21 15:36:45 +01:00
|
|
|
}
|
2021-06-07 17:33:53 +02:00
|
|
|
_createNamespace() {
|
2020-01-29 22:29:06 +01:00
|
|
|
return true;
|
2021-06-07 17:33:53 +02:00
|
|
|
}
|
2020-01-21 15:36:45 +01:00
|
|
|
/**
|
|
|
|
* Overriden so we can check for autorepeating children. We only check for
|
|
|
|
* $ in the immediate children & grandchildren of this node.
|
|
|
|
*
|
|
|
|
* @param {object} _node
|
|
|
|
*/
|
2021-06-07 17:33:53 +02:00
|
|
|
loadFromXML(_node) {
|
2020-01-21 15:36:45 +01:00
|
|
|
if (this.getType() != "box") {
|
2021-06-07 17:33:53 +02:00
|
|
|
return super.loadFromXML(_node);
|
2020-01-21 15:36:45 +01:00
|
|
|
}
|
|
|
|
// Load the child nodes.
|
|
|
|
var childIndex = 0;
|
|
|
|
var repeatNode = null;
|
|
|
|
for (var i = 0; i < _node.childNodes.length; i++) {
|
|
|
|
var node = _node.childNodes[i];
|
|
|
|
var widgetType = node.nodeName.toLowerCase();
|
|
|
|
if (widgetType == "#comment") {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (widgetType == "#text") {
|
|
|
|
if (node.data.replace(/^\s+|\s+$/g, '')) {
|
|
|
|
this.loadContent(node.data);
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// Create the new element, if no expansion needed
|
2020-01-22 09:58:43 +01:00
|
|
|
var id = et2_readAttrWithDefault(node, "id", "");
|
2020-10-27 23:17:04 +01:00
|
|
|
if (id.indexOf('$') < 0 || ['box', 'grid'].indexOf(widgetType) == -1) {
|
2020-01-21 15:36:45 +01:00
|
|
|
this.createElementFromNode(node);
|
|
|
|
childIndex++;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
repeatNode = node;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Only the last child repeats(?)
|
|
|
|
if (repeatNode != null) {
|
|
|
|
var currentPerspective = this.getArrayMgr("content").perspectiveData;
|
|
|
|
// Extra content
|
|
|
|
for (childIndex; typeof this.getArrayMgr("content").data[childIndex] != "undefined" && this.getArrayMgr("content").data[childIndex]; childIndex++) {
|
|
|
|
// Adjust for the row
|
|
|
|
var mgrs = this.getArrayMgrs();
|
|
|
|
for (var name in mgrs) {
|
|
|
|
if (this.getArrayMgr(name).getEntry(childIndex)) {
|
2020-01-22 11:40:55 +01:00
|
|
|
this.getArrayMgr(name).setRow(childIndex);
|
2020-01-21 15:36:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
this.createElementFromNode(repeatNode);
|
|
|
|
}
|
|
|
|
// Reset
|
|
|
|
for (var name in this.getArrayMgrs()) {
|
2020-01-22 11:40:55 +01:00
|
|
|
this.getArrayMgr(name).setPerspectiveData(currentPerspective);
|
2020-01-21 15:36:45 +01:00
|
|
|
}
|
|
|
|
}
|
2021-06-07 17:33:53 +02:00
|
|
|
}
|
2020-01-21 15:36:45 +01:00
|
|
|
/**
|
|
|
|
* Code for implementing et2_IDetachedDOM
|
|
|
|
* This doesn't need to be implemented.
|
|
|
|
* Individual widgets are detected and handled by the grid, but the interface is needed for this to happen
|
|
|
|
*
|
|
|
|
* @param {array} _attrs array to add further attributes to
|
|
|
|
*/
|
2021-06-07 17:33:53 +02:00
|
|
|
getDetachedAttributes(_attrs) {
|
2020-01-21 15:36:45 +01:00
|
|
|
_attrs.push('data');
|
2021-06-07 17:33:53 +02:00
|
|
|
}
|
|
|
|
getDetachedNodes() {
|
2020-01-21 15:36:45 +01:00
|
|
|
return [this.getDOMNode()];
|
2021-06-07 17:33:53 +02:00
|
|
|
}
|
|
|
|
setDetachedAttributes(_nodes, _values) {
|
2020-01-21 15:36:45 +01:00
|
|
|
if (_values.data) {
|
|
|
|
var pairs = _values.data.split(/,/g);
|
|
|
|
for (var i = 0; i < pairs.length; ++i) {
|
|
|
|
var name_value = pairs[i].split(':');
|
|
|
|
jQuery(_nodes[0]).attr('data-' + name_value[0], name_value[1]);
|
|
|
|
}
|
|
|
|
}
|
2021-06-07 17:33:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
et2_box._attributes = {
|
|
|
|
// Not needed
|
|
|
|
"rows": { "ignore": true },
|
|
|
|
"cols": { "ignore": true }
|
|
|
|
};
|
|
|
|
et2_register_widget(et2_box, ["vbox", "box"]);
|
2016-01-19 12:42:11 +01:00
|
|
|
/**
|
|
|
|
* Details widget implementation
|
|
|
|
* widget name is "details" and can be use as a wrapping container
|
|
|
|
* in order to make its children collapsible.
|
2016-02-29 21:40:43 +01:00
|
|
|
*
|
2016-01-19 12:42:11 +01:00
|
|
|
* Note: details widget does not represent html5 "details" tag in DOM
|
2016-02-29 21:40:43 +01:00
|
|
|
*
|
2016-01-19 12:42:11 +01:00
|
|
|
* <details>
|
|
|
|
* <widgets>
|
|
|
|
* ....
|
|
|
|
* <details/>
|
2016-02-29 21:40:43 +01:00
|
|
|
*
|
2016-01-19 12:42:11 +01:00
|
|
|
*/
|
2021-06-07 17:33:53 +02:00
|
|
|
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'))
|
2020-01-21 15:36:45 +01:00
|
|
|
.addClass('et2_label et2_details_title')
|
2021-06-07 17:33:53 +02:00
|
|
|
.appendTo(this.div);
|
|
|
|
this.span = jQuery(document.createElement('span'))
|
2020-01-21 15:36:45 +01:00
|
|
|
.addClass('et2_details_toggle')
|
2021-06-07 17:33:53 +02:00
|
|
|
.appendTo(this.div);
|
|
|
|
this.wrapper = jQuery(document.createElement('div'))
|
2020-01-21 15:36:45 +01:00
|
|
|
.addClass('et2_details_wrapper')
|
2021-06-07 17:33:53 +02:00
|
|
|
.appendTo(this.div);
|
|
|
|
this._createWidget();
|
2020-01-21 15:36:45 +01:00
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Function happens on toggle action
|
|
|
|
*/
|
2021-06-07 17:33:53 +02:00
|
|
|
_toggle() {
|
2020-01-21 15:36:45 +01:00
|
|
|
this.div.toggleClass('et2_details_expanded');
|
2021-06-07 17:33:53 +02:00
|
|
|
}
|
2020-01-21 15:36:45 +01:00
|
|
|
/**
|
|
|
|
* Create widget, set contents, and binds handlers
|
|
|
|
*/
|
2021-06-07 17:33:53 +02:00
|
|
|
_createWidget() {
|
|
|
|
const self = this;
|
2020-01-21 15:36:45 +01:00
|
|
|
this.span.on('click', function (e) {
|
|
|
|
self._toggle();
|
|
|
|
});
|
|
|
|
//Set header title
|
|
|
|
if (this.options.title) {
|
|
|
|
this.title
|
2020-01-23 08:53:13 +01:00
|
|
|
.click(function () {
|
|
|
|
self._toggle();
|
|
|
|
})
|
2020-01-21 15:36:45 +01:00
|
|
|
.text(this.options.title);
|
|
|
|
}
|
|
|
|
// Align toggle button left/right
|
|
|
|
if (this.options.toggle_align === "left")
|
|
|
|
this.span.css({ float: 'left' });
|
2021-06-07 17:33:53 +02:00
|
|
|
}
|
|
|
|
getDOMNode(_sender) {
|
2020-01-21 15:36:45 +01:00
|
|
|
if (!_sender || _sender === this) {
|
|
|
|
return this.div[0];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return this.wrapper[0];
|
|
|
|
}
|
2021-06-07 17:33:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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"]);
|
2020-01-21 19:45:21 +01:00
|
|
|
//# sourceMappingURL=et2_widget_box.js.map
|