blob: 9a856effb165b2815d7292697909bf9c54816ac7 [file] [log] [blame]
// 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