mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-22 21:01:00 +02:00
GUI -- TableService can take a div, config object, and data object in order to programmatically render and load data into a table. Test functions added.
Change-Id: I95f82108d7bb4f84a701b49e0e419afbdbac6f14
This commit is contained in:
parent
9ea3e6f477
commit
aa8d2ed957
@ -21,6 +21,54 @@
|
|||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
colIds: ['_iconid_available', 'id', 'mfr', 'hw', 'sw', 'serial',
|
||||||
|
'annotations.protocol'],
|
||||||
|
colText: ['', 'URI', 'Vendor', 'Hardware Version', 'Software Version',
|
||||||
|
'Serial Number', 'Protocol']
|
||||||
|
},
|
||||||
|
deviceData = {
|
||||||
|
"devices": [{
|
||||||
|
"id": "of:0000000000000001",
|
||||||
|
"available": true,
|
||||||
|
"_iconid_available": "deviceOnline",
|
||||||
|
"role": "MASTER",
|
||||||
|
"mfr": "Nicira, Inc.",
|
||||||
|
"hw": "Open vSwitch",
|
||||||
|
"sw": "2.0.1",
|
||||||
|
"serial": "None",
|
||||||
|
"annotations": {
|
||||||
|
"protocol": "OF_10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "of:0000000000000004",
|
||||||
|
"available": false,
|
||||||
|
"_iconid_available": "deviceOffline",
|
||||||
|
"role": "MASTER",
|
||||||
|
"mfr": "Nicira, Inc.",
|
||||||
|
"hw": "Open vSwitch",
|
||||||
|
"sw": "2.0.1",
|
||||||
|
"serial": "None",
|
||||||
|
"annotations": {
|
||||||
|
"protocol": "OF_10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "of:0000000000000092",
|
||||||
|
"available": false,
|
||||||
|
"_iconid_available": "deviceOffline",
|
||||||
|
"role": "MASTER",
|
||||||
|
"mfr": "Nicira, Inc.",
|
||||||
|
"hw": "Open vSwitch",
|
||||||
|
"sw": "2.0.1",
|
||||||
|
"serial": "None",
|
||||||
|
"annotations": {
|
||||||
|
"protocol": "OF_10"
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
function setColWidth(t) {
|
function setColWidth(t) {
|
||||||
var tHeaders, tdElement, colWidth;
|
var tHeaders, tdElement, colWidth;
|
||||||
|
|
||||||
@ -84,4 +132,4 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}]);
|
}]);
|
||||||
}());
|
}());
|
||||||
|
@ -22,12 +22,68 @@
|
|||||||
|
|
||||||
var $log;
|
var $log;
|
||||||
|
|
||||||
|
function renderTable(div, config) {
|
||||||
|
var table = div.append('table').attr('fixed-header', true),
|
||||||
|
thead, tr, numTableCols, i;
|
||||||
|
table.append('thead');
|
||||||
|
table.append('tbody');
|
||||||
|
|
||||||
|
thead = table.select('thead');
|
||||||
|
tr = thead.append('tr');
|
||||||
|
numTableCols = config.colIds.length;
|
||||||
|
|
||||||
|
for(i = 0; i < numTableCols; i += 1) {
|
||||||
|
tr.append('th').html(config.colText[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return config.colIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
// I can delete these comments later...
|
||||||
|
// loadTableData needs to know which IDs are used to create the table...
|
||||||
|
// Potentially, there will be some rows in the JSON that the server is
|
||||||
|
// sending back that will be unused. We don't want to create unneeded rows.
|
||||||
|
// For example, in device view, we aren't displaying "role" or
|
||||||
|
// "available" properties, but they would be displayed if we took it
|
||||||
|
// directly from the data being sent in.
|
||||||
|
function loadTableData(data, div, colIds) {
|
||||||
|
// let me know if you have suggestions for this function
|
||||||
|
|
||||||
|
var numTableCols = colIds.length,
|
||||||
|
tbody, tr, td, i;
|
||||||
|
tbody = div.select('tbody');
|
||||||
|
|
||||||
|
// get the array associated with the first object, such as "devices"
|
||||||
|
// in fakeData
|
||||||
|
// (for some reason it doesn't like the data.keys() function, saying
|
||||||
|
// "undefined is not a function"
|
||||||
|
// Object.keys(data) works though)
|
||||||
|
// loop through every object in the array, and every property in the object
|
||||||
|
// put their property in the td of the table
|
||||||
|
(data[Object.keys(data)[0]]).forEach(function (item) {
|
||||||
|
tr = tbody.append('tr');
|
||||||
|
for(var key in item) {
|
||||||
|
for(i = 0; i < numTableCols; i += 1) {
|
||||||
|
if(key === colIds[i]) {
|
||||||
|
td = tr.append('td').html(item[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderAndLoadTable(div, config, data) {
|
||||||
|
loadTableData(data, div, (renderTable(div, config)));
|
||||||
|
}
|
||||||
|
|
||||||
angular.module('onosWidget')
|
angular.module('onosWidget')
|
||||||
.factory('TableService', ['$log', function (_$log_) {
|
.factory('TableService', ['$log', function (_$log_) {
|
||||||
$log = _$log_;
|
$log = _$log_;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
renderTable: renderTable,
|
||||||
|
loadTableData: loadTableData,
|
||||||
|
renderAndLoadTable: renderAndLoadTable
|
||||||
};
|
};
|
||||||
}]);
|
}]);
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
<!-- Device partial HTML -->
|
<!-- Device partial HTML -->
|
||||||
<div id="ov-device">
|
<div id="ov-device">
|
||||||
<h2>Device View</h2>
|
<h2>Device View</h2>
|
||||||
<!-- TODO: uncomment and test the thead and tbody tags for CSS styling -->
|
|
||||||
<table class="summary-list">
|
<table class="summary-list">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -18,7 +18,54 @@
|
|||||||
ONOS GUI -- Widget -- Table Service - Unit Tests
|
ONOS GUI -- Widget -- Table Service - Unit Tests
|
||||||
*/
|
*/
|
||||||
describe('factory: fw/widget/table.js', function() {
|
describe('factory: fw/widget/table.js', function() {
|
||||||
var ts, $log;
|
var ts, $log, d3Elem;
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
colIds: ['id', 'mfr', 'hw', 'sw', 'serial', 'annotations.protocol'],
|
||||||
|
colText: ['URI', 'Vendor', 'Hardware Version', 'Software Version',
|
||||||
|
'Serial Number', 'Protocol']
|
||||||
|
},
|
||||||
|
fakeData = {
|
||||||
|
"devices": [{
|
||||||
|
"id": "of:0000000000000001",
|
||||||
|
"available": true,
|
||||||
|
"_iconid_available": "deviceOnline",
|
||||||
|
"role": "MASTER",
|
||||||
|
"mfr": "Nicira, Inc.",
|
||||||
|
"hw": "Open vSwitch",
|
||||||
|
"sw": "2.0.1",
|
||||||
|
"serial": "None",
|
||||||
|
"annotations": {
|
||||||
|
"protocol": "OF_10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "of:0000000000000004",
|
||||||
|
"available": false,
|
||||||
|
"_iconid_available": "deviceOffline",
|
||||||
|
"role": "MASTER",
|
||||||
|
"mfr": "Nicira, Inc.",
|
||||||
|
"hw": "Open vSwitch",
|
||||||
|
"sw": "2.0.1",
|
||||||
|
"serial": "None",
|
||||||
|
"annotations": {
|
||||||
|
"protocol": "OF_10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "of:0000000000000092",
|
||||||
|
"available": false,
|
||||||
|
"_iconid_available": "deviceOffline",
|
||||||
|
"role": "MASTER",
|
||||||
|
"mfr": "Nicira, Inc.",
|
||||||
|
"hw": "Open vSwitch",
|
||||||
|
"sw": "2.0.1",
|
||||||
|
"serial": "None",
|
||||||
|
"annotations": {
|
||||||
|
"protocol": "OF_10"
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
beforeEach(module('onosWidget'));
|
beforeEach(module('onosWidget'));
|
||||||
|
|
||||||
@ -30,4 +77,58 @@ describe('factory: fw/widget/table.js', function() {
|
|||||||
it('should define TableService', function () {
|
it('should define TableService', function () {
|
||||||
expect(ts).toBeDefined();
|
expect(ts).toBeDefined();
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
function verifyTableTags(div) {
|
||||||
|
var table = div.select('table'),
|
||||||
|
tableHeaders;
|
||||||
|
expect(table).toBeTruthy();
|
||||||
|
expect(table.attr('fixed-header')).toBeTruthy();
|
||||||
|
expect(table.select('thead')).toBeTruthy();
|
||||||
|
expect(table.select('tbody')).toBeTruthy();
|
||||||
|
|
||||||
|
tableHeaders = table.select('thead').selectAll('th');
|
||||||
|
tableHeaders.each(function(thElement, i) {
|
||||||
|
thElement = d3.select(this);
|
||||||
|
expect(thElement).toBeTruthy();
|
||||||
|
expect(thElement.html()).toBe(config.colText[i]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function verifyData(div) {
|
||||||
|
var tbody = div.select('tbody'),
|
||||||
|
tableBoxes = tbody.selectAll('td');
|
||||||
|
expect(tbody).toBeTruthy();
|
||||||
|
expect(tbody.select('tr')).toBeTruthy();
|
||||||
|
|
||||||
|
tableBoxes.each(function(tdElement, i){
|
||||||
|
tdElement = d3.select(this);
|
||||||
|
if(i === 0) {
|
||||||
|
expect(tdElement.html()).toBe('of:0000000000000001');
|
||||||
|
}
|
||||||
|
if(i === 1) {
|
||||||
|
expect(tdElement.html()).toBe('Nicira, Inc.');
|
||||||
|
}
|
||||||
|
if(i === 2) {
|
||||||
|
expect(tdElement.html()).toBe('Open vSwitch');
|
||||||
|
}
|
||||||
|
expect(tdElement).toBeTruthy();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
it('should create table tags', function () {
|
||||||
|
ts.renderTable(d3Elem, config);
|
||||||
|
verifyTableTags(d3Elem);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should load data into table', function () {
|
||||||
|
var colIds = ts.renderTable(d3Elem, config);
|
||||||
|
ts.loadTableData(fakeData, d3Elem, colIds);
|
||||||
|
verifyData(d3Elem);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render table and load data', function () {
|
||||||
|
ts.renderAndLoadTable(d3Elem, config, fakeData);
|
||||||
|
verifyData(d3Elem);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user