diff --git a/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_UnionTable.js b/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_UnionTable.js index abdd7964b6a2c38c0f8d4c74d084b9aa09a12b86..d1e07f0df891d5e0bcffeb8d8460016e509927fc 100644 --- a/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_UnionTable.js +++ b/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_UnionTable.js @@ -1,7 +1,7 @@ -// Copyright (c) 2000-2023 Ericsson Telecom AB Telecom AB // +// Copyright (c) 2000-2025 Ericsson Telecom AB Telecom AB // // All rights reserved. This program and the accompanying materials are made available under the // // terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at // -// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html // +// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html // /////////////////////////////////////////////////////////////////////////////////////////////////////// function CViewModel_UnionTable(aViewModel, aOptions) { "use strict"; @@ -9,10 +9,9 @@ function CViewModel_UnionTable(aViewModel, aOptions) { /** private members */ var mViewModel = aViewModel; var mOptions = aOptions; - //var mRq = mViewModel.getRequest(); var mBinder; var mResponseDataPaths = []; - var mSelections = []; // mSelectionss is a list of references to objects, each containing a field named "selection" + var mSelections = []; // mSelections is a list of references to objects, each containing a field named "selection" var mThis = this; var mEnlistElementName = mOptions.enlistElementName; if (mEnlistElementName === undefined) @@ -22,7 +21,7 @@ function CViewModel_UnionTable(aViewModel, aOptions) { this.setSelectionToControl = function (aSelection) { /** aSelection is a reference to an object containing a "selection" field */ - mSelections.push(aSelection); + mSelections.push(aSelection); }; this.setReponseDataPath = function (aExpectedReponseDataIndex, aReponseDataPath) { @@ -30,7 +29,7 @@ function CViewModel_UnionTable(aViewModel, aOptions) { }; this.setBinder = function (aBinder) { - mBinder = aBinder; + mBinder = aBinder; }; /** public functions - Interface for views */ @@ -65,7 +64,7 @@ function CViewModel_UnionTable(aViewModel, aOptions) { "heading": header[i], "elementIndex": i }; - } + } return header; }; @@ -73,21 +72,19 @@ function CViewModel_UnionTable(aViewModel, aOptions) { return mViewModel.getRequestFromPath(mResponseDataPaths[0]).getData.element; }; - this.getResponseElement = function (aReponseDataPath, aFullTableSelection) { + this.getResponseElement = function (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 (aFullTableSelection.path) { + var pathIdx = 0; + lElement = mViewModel.getResponseElement(); + if (lElement != undefined) { + lElement = lElement[aFullTableSelection.path[pathIdx]]; + } if (lElement) { - var lRq = mViewModel.getRequest()[aReponseDataPath[0]]; - for (var i = 1; i < aReponseDataPath.length && lElement; ++i) { + var lRq = mViewModel.getRequest()[aFullTableSelection.path[pathIdx]]; + + // need to select the table data from the path, which is the last two element + for (; pathIdx < aFullTableSelection.path.length - 1 && lElement; ++pathIdx) { if (lElement.list && lRq.getData.selection && lRq.getData.selection.length > 0) { if (aFullTableSelection) { aFullTableSelection.depth--; @@ -99,67 +96,76 @@ function CViewModel_UnionTable(aViewModel, aOptions) { 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]]; + lElement = lElement.list[lRq.getData.selection[0]].node.childVals[aFullTableSelection.path[pathIdx]]; } 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]]; + aFullTableSelection.path.shift(); + aFullTableSelection.depth--; + lElement = lElement.node.childVals[aFullTableSelection.path[pathIdx]]; + } else if (!lRq.getData.selection || lRq.getData.selection.length === 0) { + // intentionally blank } else lElement = { "error" : "cannot determine node" }; - if (lRq.getData.children) - lRq = lRq.getData.children[aReponseDataPath[i]]; + if (lRq.getData.children) { + lRq = lRq.getData.children[aFullTableSelection.path[pathIdx]]; + } } } - } + } return lElement; }; this.getTable = function () { - var aFullTableSelection = {}; - var response = mThis.getResponseElement(mResponseDataPaths[0], aFullTableSelection); + var pathCopy = mcopy(mResponseDataPaths[0]); + var aFullTableSelection = { + parents: [], + depth: pathCopy.length, + path: pathCopy + }; + + var response = mThis.getResponseElement(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) { + 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!"); - }, []); + 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!"); + }, []); } } }