| // Copyright (c) 2000-2017 Ericsson Telecom AB // |
| // All rights reserved. This program and the accompanying materials are made available under the // |
| // terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at // |
| // http://www.eclipse.org/legal/epl-v10.html // |
| /////////////////////////////////////////////////////////////////////////////////////////////////////// |
| function CViewModel_UnionTable(aViewModel, aOptions) {
|
| "use strict";
|
|
|
| /** private members */
|
| var mViewModel = aViewModel;
|
| var mOptions = aOptions;
|
| //var mRq = mViewModel.getRequest();
|
| var mBinder;
|
| var mReponseDataPaths = [];
|
| var mSelections = []; // mSelectionss is a list of references to objects, each containing a field named "selection"
|
| var mThis = this;
|
| var mEnlistElementName = mOptions.enlistElementName;
|
| if (mEnlistElementName === undefined)
|
| mEnlistElementName = true;
|
|
|
| /** public functions - Interface for parent */
|
|
|
| this.setSelectionToControl = function (aSelection) {
|
| /** aSelection is a reference to an object containing a "selection" field */
|
| mSelections.push(aSelection);
|
| };
|
|
|
| this.setReponseDataPath = function (aExpectedReponseDataIndex, aReponseDataPath) {
|
| mReponseDataPaths[aExpectedReponseDataIndex] = aReponseDataPath;
|
| };
|
|
|
| this.setBinder = function (aBinder) {
|
| mBinder = aBinder;
|
| };
|
|
|
| /** public functions - Interface for views */
|
| this.select = function (aIndex) {
|
| for (var i = 0; i < mSelections.length; ++i)
|
| mViewModel.select(mSelections[i], aIndex);
|
| mBinder.notifyChange();
|
| };
|
|
|
| this.getHeader = function () {
|
| var header = [];
|
| if (mOptions.header) {
|
| header = mcopy(mOptions.header);
|
| } else {
|
| var request = (mViewModel.getRequestFromPath())[mReponseDataPaths[0][0]];
|
| if (mEnlistElementName) {
|
| for(var i = 1; i < mReponseDataPaths[0].length; i++) { //for parents
|
| header.push(request.getData.element);
|
| request = request.getData.children[mReponseDataPaths[0][i]];
|
| }
|
| header.push(request.getData.element); //for connected node (data connection)
|
| }
|
| if (request.getData.children) { // for children
|
| for (var i = 0; i < request.getData.children.length; ++i) {
|
| header.push(request.getData.children[i].getData.element);
|
| }
|
| }
|
| }
|
|
|
| for (var i = 0; i < header.length; ++i) {
|
| header[i] = {
|
| "heading": header[i],
|
| "elementIndex": i
|
| };
|
| }
|
| return header;
|
| };
|
|
|
| this.getName = function () {
|
| return mViewModel.getRequestFromPath(mReponseDataPaths[0]).getData.element;
|
| };
|
|
|
| this.getResponseElement = function (aReponseDataPath, aFullTableSelection) {
|
| var lElement;
|
| if (aFullTableSelection) {
|
| aFullTableSelection.parents = [];
|
| aFullTableSelection.depth = aReponseDataPath.length;
|
| aFullTableSelection.path = aReponseDataPath;
|
| }
|
| if (aReponseDataPath) {
|
| lElement = mViewModel.getResponseElement();
|
| if (lElement != undefined) {
|
| lElement = lElement[aReponseDataPath[0]];
|
| }
|
| if (lElement) {
|
| var lRq = mViewModel.getRequest()[aReponseDataPath[0]];
|
| for (var i = 1; i < aReponseDataPath.length && lElement; ++i) {
|
| if (lElement.list && lRq.getData.selection && lRq.getData.selection.length > 0) {
|
| if (aFullTableSelection) {
|
| aFullTableSelection.depth--;
|
| if (lElement.list[lRq.getData.selection[0]] != undefined) {
|
| aFullTableSelection.parents.push(lElement.list[lRq.getData.selection[0]].node.val);
|
| } else {
|
| aFullTableSelection.parents.push(undefined);
|
| }
|
| aFullTableSelection.path = aFullTableSelection.path.slice(1);
|
| }
|
| if (lElement.list[lRq.getData.selection[0]] && lElement.list[lRq.getData.selection[0]].node.childVals) {
|
| lElement = lElement.list[lRq.getData.selection[0]].node.childVals[aReponseDataPath[i]];
|
| } else {
|
| lElement = undefined;
|
| break;
|
| }
|
| } else if (!lRq.getData.selection || lRq.getData.selection.length === 0) {
|
| /**/
|
| } else if (lElement.node && lElement.node.childVals) {
|
| lElement = lElement.node.childVals[aReponseDataPath[i]];
|
| } else
|
| lElement = {
|
| "error" : "cannot determine node"
|
| };
|
| if (lRq.getData.children)
|
| lRq = lRq.getData.children[aReponseDataPath[i]];
|
| }
|
| }
|
| }
|
| return lElement;
|
| };
|
|
|
| this.getTable = function () {
|
| var aFullTableSelection = {};
|
| var response = mThis.getResponseElement(mReponseDataPaths[0], aFullTableSelection);
|
| return {
|
| selection : mSelections[0] ? mSelections[0].selection : undefined,
|
| table : (response === undefined) ? [] : flattenResponseElement(response.list, aFullTableSelection.depth, 0, aFullTableSelection.parents, aFullTableSelection.path.slice(1))
|
| };
|
| };
|
|
|
| this.setValue = function() {};
|
|
|
| /** private functions */
|
|
|
| function flattenResponseElement(arr, limit, depth, parents, path) {
|
| if (arr) {
|
| limit = limit || 0;
|
| depth = depth || 0;
|
| parents = parents || [];
|
| path = path || [];
|
| return arr.reduce(function _reduce(flat, toFlatten) {
|
| if (limit === depth && toFlatten.node)
|
| return flat.concat({"val": toFlatten.node.val});
|
| else if (limit === depth && toFlatten.list)
|
| return flat.concat([flattenResponseElement(toFlatten.list, limit, depth, parents, path)].join());
|
| else if (limit === depth + 1 && toFlatten.node) {
|
| if (mEnlistElementName)
|
| return flat.concat([parents.concat([{"val": toFlatten.node.val}].concat(flattenResponseElement(toFlatten.node.childVals, limit, depth + 1, [], path)))]);
|
| else
|
| return flat.concat([flattenResponseElement(toFlatten.node.childVals, limit, depth + 1, [], path)]);
|
| } else if (Array.isArray(toFlatten))
|
| return flat.concat(flattenResponseElement(toFlatten, limit, depth, parents, path));
|
| else if (toFlatten.node && toFlatten.node.childVals && limit !== depth)
|
| return flat.concat(flattenResponseElement([toFlatten.node.childVals[path[depth]]], limit, depth + 1, parents.concat([{"val": toFlatten.node.val}]), path));
|
| else if (toFlatten.node && toFlatten.node.childVals)
|
| return flat.concat(flattenResponseElement(toFlatten.node.childVals, limit, depth + 1, parents.concat([{"val": toFlatten.node.val}]), path));
|
| else if (toFlatten.list)
|
| return flat.concat(flattenResponseElement(toFlatten.list, limit, depth, parents, path));
|
| else
|
| console.error("flattenResponseElement met an unexpected condition. Reason: The response object is nonconformant OR not all parents have a selection!");
|
| }, []);
|
| }
|
| }
|
| }
|
|
|
| CViewModel_UnionTable.getHelp = function() {
|
| return "A viewmodel that creates a merged table when there are iterators above the normal table-like request structure.\n" +
|
| "The select and setValue methods are not implemented.";
|
| }
|
|
|
| CViewModel_UnionTable.providesInterface = function () {
|
| return ["select", "getName", "getHeader", "getTable", "setValue"];
|
| };
|
|
|
| CViewModel_UnionTable.getCustomDataSchema = function () {
|
| return {
|
| "$schema" : "http://json-schema.org/draft-04/schema#",
|
| "title" : "Custom data for CViewModel_UnionTable",
|
| "type" : "object",
|
| "properties" : {
|
| "header": {
|
| "description": "The header of the table. It should have as many elements as the number of columns.",
|
| "type": "array",
|
| "format": "table",
|
| "items": {
|
| "type": "string",
|
| "title": "heading"
|
| }
|
| },
|
| "enlistElementName": {
|
| "description": "Whether we add the parents to the table.",
|
| "type": "boolean",
|
| "format": "checkbox",
|
| "default": false
|
| }
|
| }
|
| };
|
| };
|
|
|
| //# sourceURL=CustomizableApp\ViewModels\ViewModel_UnionTable.js
|