blob: aa68b003731c8e31cf16e7896a887fad52bdf847 [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 v2.0 which accompanies this distribution, and is available at //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function CViewModel_Clients(p_viewmodel, p_options) {
"use strict";
/** constructor */
var v_options = p_options;
var base = new CViewModel_TableForLargeData(p_viewmodel, p_options);
var v_flexAligner = new CViewModel_FlexAligner();
var v_tableData = {
"table": []
};
var v_header = [];
var v_viewmodels = [];
var v_firstSeparatorExists;
/** public functions - interface for parent */
this.setSelectionToControl = base.setSelectionToControl;
this.setReponseDataPath = base.setReponseDataPath;
this.setBinder = base.setBinder;
/** public functions - interface for views */
this.getViewmodelBundle = function() {
var newTableData = base.getTable();
var newHeader = base.getHeader();
// in the check we use both v_tableData and newTableData
var fullRefresh = checkIfFullRefreshNeeded(newTableData);
v_tableData = newTableData;
v_header = newHeader;
updateViewmodels();
return {
"viewmodels": v_viewmodels,
"fullRefresh": fullRefresh,
"firstSeparatorExists": v_firstSeparatorExists
};
};
this.getRange = base.getRange;
this.getPosition = base.getPosition;
this.setPosition = base.setPosition;
this.getViewportSize = base.getViewportSize;
this.isStreaming = base.isStreaming;
/** private functions */
function checkIfFullRefreshNeeded(newTableData) {
if ((newTableData.separators == undefined && v_tableData.separators == undefined) ||
(newTableData.separators != undefined && v_tableData.separators != undefined && newTableData.separators.length == v_tableData.separators.length)) {
if (newTableData.separators != undefined && v_tableData.separators != undefined) {
var columnIndexThatContainsTheSize = v_options.numberOfElementsInFirstAligner + v_options.numberOfElementsInSecondAligner;
var limitForFirstSeparatorExistance;
if (newTableData.separators.length > 1) {
limitForFirstSeparatorExistance = newTableData.separators[1].index;
} else {
limitForFirstSeparatorExistance = newTableData.table.length;
}
var firstSeparatorExists = true;
if (base.getPosition() != 0) {
for (var i = 0; i < limitForFirstSeparatorExistance; ++i) {
if (parseInt(newTableData.table[i][columnIndexThatContainsTheSize].val) != limitForFirstSeparatorExistance) {
firstSeparatorExists = false;
break;
}
}
}
if (firstSeparatorExists != v_firstSeparatorExists) {
v_firstSeparatorExists = firstSeparatorExists;
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return true;
}
}
function updateViewmodels() {
// create or delete viewmodels so we have the correct number of them
var numberOfAdditionalViewmodels = v_tableData.separators.length - v_viewmodels.length;
if (numberOfAdditionalViewmodels > 0) {
for (var i = 0; i < numberOfAdditionalViewmodels; ++i) {
v_viewmodels.push({
"aligner1": new AlignerViewmodel(),
"aligner2": new AlignerViewmodel(),
"table": new TableViewmodel()
});
}
} else if (numberOfAdditionalViewmodels < 0) {
for (var i = 0; i > numberOfAdditionalViewmodels; --i) {
v_viewmodels.pop();
}
}
// update the viewmodels, we now know that v_viewmodels.length == v_tableData.separators.length
v_tableData.separators.push({"index": v_tableData.table.length}); // a small trick so we avoid conditions below
for (var i = 0; i < v_viewmodels.length; ++i) {
v_viewmodels[i].aligner1.setData(v_tableData.separators[i].index, 0, v_options.numberOfElementsInFirstAligner);
v_viewmodels[i].aligner2.setData(v_tableData.separators[i].index, v_options.numberOfElementsInFirstAligner, v_options.numberOfElementsInSecondAligner);
v_viewmodels[i].table.setData(v_tableData.separators[i].index, v_options.numberOfElementsInFirstAligner + v_options.numberOfElementsInSecondAligner + 1, v_tableData.separators[i + 1].index - v_tableData.separators[i].index);
}
v_tableData.separators.pop();
}
/** private Classes */
// The mocked viewmodel for ElementRelay used in the element aligners
function AlignerViewmodel() {
var v_row;
var v_col;
var v_columnCount;
this.setData = function(p_row, p_col, p_columnCount) {
v_row = p_row;
v_col = p_col;
v_columnCount = p_columnCount;
};
this.select = function() {};
this.getListWithElementInfo = function() {
var list = [];
for (var i = 0; i < v_columnCount; ++i) {
list.push({
"element": v_header[v_col + i].heading,
"val": v_tableData.table[v_row][v_col + i].val,
"isWritable": v_tableData.table[v_row][v_col + i].isWritable,
});
}
return {
"values": list,
"selections": []
}
};
this.getList = function() {
var list = [];
for (var i = 0; i < v_columnCount; ++i) {
list.push([
[v_tableData.table[v_row][v_col + i].val, undefined, v_tableData.table[v_row][v_col + i].isWritable]
]);
}
return list;
};
this.setValue = function(dataPathIndex, value) {
base.setValue(v_row, v_col + dataPathIndex, value);
};
this.getChildPercentagesFromFlex = v_flexAligner.getChildPercentagesFromFlex;
}
// The mocked viewmodel for DynamicTable used in the tables
function TableViewmodel() {
var v_row;
var v_col;
var v_rowCount;
this.setData = function(p_row, p_col, p_rowCount) {
v_row = p_row;
v_col = p_col;
v_rowCount = p_rowCount;
};
this.select = function() {};
this.getHeader = function() {
var header = mcopy(v_header.slice(v_col));
for (var i = 0; i < header.length; ++i) {
header[i].elementIndex = i;
}
return header;
};
this.getName = function() {
return v_header[v_col].heading;
};
this.getTable = function() {
var tableData = [];
for (var i = 0; i < v_rowCount; ++i) {
tableData.push(v_tableData.table[v_row + i].slice(v_col));
}
return {"table": tableData};
};
this.setValue = function(row, col, value) {
base.setValue(v_row + row, v_col + col, value);
};
this.getChildPercentagesFromFlex = v_flexAligner.getChildPercentagesFromFlex;
}
}
CViewModel_Clients.getHelp = function() {
return "Viewmodel for the clients tab. Will return a list whose elements contain 3 viewmodels: 2 for aligners and one for a table.\n" +
"A data connection for the possible size of the tables must precede the connection representing the 'iterator' of the table.";
};
CViewModel_Clients.providesInterface = function() {
return ["getViewmodelBundle", "getRange", "getPosition", "setPosition", "getViewportSize", "isStreaming"];
};
CViewModel_Clients.getCustomDataSchema = function() {
var outerTableSchema = CViewModel_TableForLargeData.getCustomDataSchema();
outerTableSchema.title = "Custom data for CViewModel_Clients";
outerTableSchema.properties["numberOfElementsInFirstAligner"] = {
"type": "integer"
};
outerTableSchema.properties["numberOfElementsInSecondAligner"] = {
"type": "integer"
};
// Why does outerTableSchema.properties.name = undefined not work???
delete outerTableSchema.properties.name;
if (outerTableSchema.required == undefined) {
outerTableSchema.required = []
}
outerTableSchema.required.splice(0, 0, "separateBy", "numberOfElementsInFirstAligner", "numberOfElementsInSecondAligner");
return outerTableSchema;
};
CViewModel_Clients.expectsConnection = function() {
return CViewModel_TableForLargeData.expectsConnection();
};
//# sourceURL=CustomizableApp\ViewModels\ViewModel_Clients.js