UNPKG

@indexea/sdk

Version:

Indexea JavaScript SDK (indexea.com)

236 lines (235 loc) 8.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WidgetLayout = void 0; /** * widget layout manager * example: <layout> <row> <col width='6'> <control type='input'/> </col> <col width='6'> <control type='hotwords'/> </col> </row> <row> <col width='9'> <control type='results'/> </col> <col width='3'> <control type='aggregation'/> <control type='aggregation'/> </col> </row> <row> <col width='9'> <control type='pagination'/> </col> </row> </layout> */ var WidgetLayout = /** @class */ (function () { function WidgetLayout(xml) { this.xml = xml; } /** * parse layout xml string * @param xmlstring * @returns */ WidgetLayout.parse = function (xmlstring) { var parser = new DOMParser(); var xml = parser.parseFromString(xmlstring, 'text/xml'); return new WidgetLayout(xml); }; /** * turn to layout xml string * @returns */ WidgetLayout.prototype.toString = function () { var oSerializer = new XMLSerializer(); var sXML = oSerializer.serializeToString(this.xml); return sXML; }; /** * check if exists a control named `ctrl_name` * @param ctrl_name * @returns */ WidgetLayout.prototype.control = function (ctrl_name) { return this.xml.querySelector("control[type='".concat(ctrl_name, "']")); }; /** * get all rows in layout * @returns */ WidgetLayout.prototype.rows = function () { return this.xml.getElementsByTagName("row"); }; /** * append node to position * @param node * @param row * @param col * @returns */ WidgetLayout.prototype.append = function (node, row, col) { var _a; if (row === void 0) { row = 0; } if (col === void 0) { col = 0; } if (this.control(node.type) != null) return this; //get position of row and col var theNode; var rowNodes = this.xml.getElementsByTagName('row'); if (row >= 0 && row < rowNodes.length) { var rowNode = rowNodes[row]; var colNodes = rowNode.getElementsByTagName('col'); if (col >= 0 && col < colNodes.length) { theNode = colNodes[col]; } } var elem = this.xml.createElement('control'); elem.setAttribute('type', node.type); if (theNode) { //拖入设计器的某个元素之上 var cols = (_a = theNode.parentNode) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('col'); var lastWidth = parseInt(cols[cols.length - 1].getAttribute('width')); var totalWidth = 0; for (var i = 0; i < cols.length; i++) { totalWidth += parseInt(cols[i].getAttribute('width')); } if (totalWidth + node.width > 12) { if (node.width == lastWidth) cols[cols.length - 1].appendChild(elem); else this.appendToNewRow(theNode, elem, node.width); } else { this.appendToNewCol(theNode, elem, node.width); } } else { //拖入设计器的空白处 this.appendToNewRow(theNode, elem, node.width); } return this; }; /** * remove node from position * @param row * @param col * @param index * @returns */ WidgetLayout.prototype.remove = function (row, col, index) { var _a; var rowNodes = this.xml.getElementsByTagName('row'); if (row < rowNodes.length) { var rowNode = rowNodes[row]; var colNodes = rowNode.getElementsByTagName('col'); if (col < colNodes.length) { colNodes[col].removeChild(colNodes[col].childNodes[index]); //如果该列已经没有子节点了,则删除该列 if (!colNodes[col].hasChildNodes()) { rowNode.removeChild(colNodes[col]); } //如果该行已经没有子节点了,则删除该行 if (!rowNode.hasChildNodes()) { (_a = rowNode.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(rowNode); } } } return this; }; /** * get control attribute with name `attr_name` * @param ctrl_name * @param attr_name * @returns */ WidgetLayout.prototype.getAttribute = function (ctrl_name, attr_name) { var ctl = this.xml.querySelector("control[type='".concat(ctrl_name, "']")); return ctl ? ctl.getAttribute(attr_name) : null; }; /** * get attributes of control * @param ctrl_name */ WidgetLayout.prototype.getAttributes = function (ctrl_name) { var _a, _b; if (ctrl_name === void 0) { ctrl_name = ""; } var attrs = ctrl_name ? (_a = this.xml.querySelector("control[type='".concat(ctrl_name, "']"))) === null || _a === void 0 ? void 0 : _a.attributes : (_b = this.xml.querySelector('layout')) === null || _b === void 0 ? void 0 : _b.attributes; var props = {}; if (attrs) for (var i = 0; i < attrs.length; i++) { var att = attrs.item(i); if (att) { if (att.value === 'true') props[att.name] = true; else if (att.value === 'false') props[att.name] = false; else if (att.value) props[att.name] = att.value; } } return props; }; /** * set control attributes * @param {row}} ctrl_name * @param {attrs} attrs */ WidgetLayout.prototype.setAttributes = function (ctrl_name, attrs) { var ctrl = this.xml.querySelector("control[type='".concat(ctrl_name, "']")); if (ctrl) { for (var key in attrs) { ctrl.setAttribute(key, attrs[key]); } } }; /** * set control attributes * @param {row}} row * @param {col} col * @param {index} index * @param {attrs} attrs */ WidgetLayout.prototype.setAttributesByPos = function (row, col, index, attrs) { var rowNodes = this.xml.getElementsByTagName('row'); if (row < rowNodes.length) { var rowNode = rowNodes[row]; var colNodes = rowNode.getElementsByTagName('col'); if (col < colNodes.length) { if (index < colNodes[col].childNodes.length) { var controls = colNodes[col].getElementsByTagName('control'); if (index < controls.length) { var control = controls[index]; for (var key in attrs) { control.setAttribute(key, attrs[key]); } } } } } }; WidgetLayout.prototype.appendToNewRow = function (node, elem, width) { var row = this.xml.createElement('row'); var col = this.xml.createElement('col'); col.setAttribute('width', width + ""); col.appendChild(elem); row.appendChild(col); this.xml.getElementsByTagName('layout')[0].appendChild(row); }; WidgetLayout.prototype.appendToNewCol = function (node, elem, width) { var col = this.xml.createElement('col'); col.setAttribute('width', width + ""); col.appendChild(elem); node.parentNode.appendChild(col); }; return WidgetLayout; }()); exports.WidgetLayout = WidgetLayout;