| // 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_ElementRelay(aViewModel, aOptions) |
| { |
| "use strict"; |
| /** private members */ |
| var mViewModel; |
| var mOptions; |
| var mRq; |
| var mBinder; |
| var mReponseDataPaths; |
| var mSelections = []; // mSelectionss is a list of references to objects, each containing a field named "selection" |
| |
| /** constructor */ |
| mViewModel = aViewModel; |
| mRq = mViewModel.getRequest(); |
| mOptions = aOptions; |
| mReponseDataPaths = []; |
| |
| /** public functions - Interface for parent */ |
| this.expectedReponseData = function() // TODO: might be put in prototype (without header info) |
| { |
| return[{type: "elementRelay"}, {type: "string"}]; |
| }; |
| |
| this.setSelectionToControl = function(aSelection) |
| { |
| mSelections.push(aSelection); |
| }; |
| |
| this.setReponseDataPath = function(aDataPathIndex, aReponseDataPath) |
| { |
| mReponseDataPaths[aDataPathIndex] = 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(true); |
| }; |
| |
| this.getOptions = function() |
| { |
| return mOptions; |
| }; |
| |
| this.getList = function() |
| { |
| return prepareResponse(getSimpleDataFromResponseElement); |
| }; |
| |
| this.getListWithElementInfo = function() |
| { |
| return prepareResponse(getDataFromResponseElement); |
| }; |
| |
| this.setValue = function(aDataPathIndex, aValue, aIndexInList, aLastSelectionIndexes, aDataHasBeenSet, aAdditionalData) |
| { |
| mViewModel.setResponseElement(mReponseDataPaths[aDataPathIndex], aValue, aIndexInList, aLastSelectionIndexes, aDataHasBeenSet, aAdditionalData); |
| }; |
| |
| /** private functions */ |
| |
| function prepareResponse(aGetValueFunction) |
| { |
| var lValues = []; |
| var lSelections = []; |
| for (var i = 0; i < mReponseDataPaths.length; ++i) |
| { |
| lValues[i] = aGetValueFunction(mViewModel.getResponseElement(mReponseDataPaths[i]), mViewModel.getRequestFromPath(mReponseDataPaths[i])); |
| } |
| for (var i = 0; i < mSelections.length; ++i) |
| { |
| lSelections[i] = mSelections[i] ? mSelections[i].selection : undefined; |
| } |
| return { |
| selections: lSelections, |
| values: lValues |
| }; |
| } |
| |
| |
| function getRow(node) |
| { |
| var row = []; |
| row.push(node.val); |
| if (node.childVals) |
| { |
| var lChildren = []; |
| for (var j = 0; j < node.childVals.length; ++j) |
| { |
| if (node.childVals[j].node) |
| { |
| lChildren.push(node.childVals[j].node.val); |
| } |
| else if (node.childVals[j].list) |
| { |
| var lList = []; |
| for (var i = 0; i < node.childVals[j].list.length; ++i) |
| lList.push(node.childVals[j].list[i].node.val); |
| lChildren.push(lList); |
| //console.log ("lListVM::", lList); |
| } |
| } |
| row.push(lChildren); |
| } |
| return row; |
| } |
| |
| function getSimpleDataFromResponseElement(lElement, aRq) |
| { |
| var lTable = []; |
| if (lElement) |
| { |
| if (lElement.error) |
| lTable.push([lElement.error]); |
| else if (lElement.node) |
| lTable.push(getRow(lElement.node)); |
| else if (lElement.list) |
| { |
| /*if (mSelections[0] && mSelections[0][0] >= lElement.list.length) |
| mSelections[0][0] = 0;*/ |
| if (mOptions.showOnlySelected != undefined && aRq.getData.selection != undefined) { |
| if (lElement.list.length > 0) { |
| if (aRq.getData.selectionValues != undefined) { |
| lTable.push(getRow(lElement.list[0].node)); |
| } else { |
| lTable.push(getRow(lElement.list[aRq.getData.selection[0]].node)); |
| } |
| } |
| } else { |
| for (var i = 0; i < lElement.list.length; ++i) { |
| lTable.push(getRow(lElement.list[i].node)); |
| } |
| } |
| } |
| //else |
| //console.log("something else lElement: ", lElement) |
| } |
| return lTable; |
| } |
| |
| function getChildren(node) |
| { |
| var lChildren = []; |
| if (node.childVals) |
| { |
| for (var j = 0; j < node.childVals.length; ++j) |
| { |
| if (node.childVals[j].node) |
| { |
| lChildren.push(node.childVals[j].node.val); |
| } |
| else if (node.childVals[j].list) |
| { |
| var lList = []; |
| for (var i = 0; i < node.childVals[j].list.length; ++i) |
| lList.push(node.childVals[j].list[i].node.val); |
| lChildren.push(lList); |
| } |
| } |
| } |
| return lChildren; |
| } |
| |
| function getDataFromResponseElement(lElement, aRq) |
| { |
| var lData = {}; |
| if (lElement) |
| { |
| lData.element = aRq.getData.element; |
| lData.selection = aRq.getData.selection; |
| if (lElement.error) |
| lData.error = lElement.error; |
| else if (lElement.node) |
| { |
| lData.val = lElement.node.val; |
| lData.isWritable = lElement.node.tp > 0; |
| lData.children = getChildren(lElement.node, aRq.getData)[1]; |
| } |
| else if (lElement.list) |
| { |
| |
| if (mOptions.showOnlySelected != undefined && aRq.getData.selection != undefined) { |
| if (lElement.list.length > 0) { |
| var node; |
| var lChildList = []; |
| if (aRq.getData.selectionValues != undefined) { |
| node = lElement.list[0].node |
| } else { |
| |
| node = lElement.list[aRq.getData.selection[0]].node; |
| } |
| lData.val = node.val; |
| if (aRq.getData.children) { |
| var lChildren = getChildren(node); |
| if (aRq.getData.children) { |
| for (var j = 0; j < lChildren.length; ++j) { |
| lChildList[j] = { |
| element: aRq.getData.children[j].getData.element, |
| val:[lChildren[j]], |
| selection: aRq.getData.children[j].getData.selection |
| }; |
| } |
| } |
| } |
| lData.children = lChildList; |
| } else { |
| lData.val = ""; |
| lData.children = []; |
| } |
| } else { |
| var lList = []; |
| var lChildList = []; |
| |
| for (var i = 0; i < lElement.list.length; ++i) { |
| lList.push(lElement.list[i].node.val); |
| var lChildren = getChildren(lElement.list[i].node); |
| if (aRq.getData.children) |
| { |
| if (lChildList.length == 0) |
| { |
| for (var j = 0; j < lChildren.length; ++j) |
| { |
| lChildList[j] = { |
| element: aRq.getData.children[j].getData.element, |
| val:[], |
| selection: aRq.getData.children[j].getData.selection |
| }; |
| } |
| } |
| for (var j = 0; j < lChildren.length; ++j) |
| { |
| lChildList[j].val.push(lChildren[j]); |
| } |
| } |
| } |
| |
| lData.val = lList; |
| lData.children = lChildList; |
| } |
| |
| |
| } |
| } |
| return lData; |
| } |
| } |
| |
| CViewModel_ElementRelay.getHelp = function() { |
| var help = 'Simple interface for views.\n'; |
| help += 'The function getList will return the following structure: {values: [[value, [children], isWritable]], selections: [[]]}\n'; |
| help += 'The function getListWithElementInfo will return the following structure: {values: [{val: "", element: "", isWritable: boolean, selection: [], children: []}], selections: [[]]}\n'; |
| return help; |
| } |
| |
| CViewModel_ElementRelay.providesInterface = function() { |
| return ["setValue", "getListWithElementInfo", "getList", "getOptions", "select"]; |
| }; |
| |
| CViewModel_ElementRelay.getCustomDataSchema = function() { |
| return { |
| "$schema": "http://json-schema.org/draft-04/schema#", |
| "title": "Custom data for CViewModel_ElementRelay", |
| "type": "object", |
| "properties": { |
| "showOnlySelected": { |
| "type": "boolean", |
| "format": "checkbox", |
| "description": "whther we only show the selected element from an iterator", |
| "default": true |
| } |
| } |
| }; |
| }; |
| |
| //# sourceURL=CustomizableApp\ViewModels\ViewModel_ElementRelay.js |