mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-11-02 17:21:05 +01:00
Restructuring GUI code - first pass - WIP.
This commit is contained in:
parent
a887ba8ae0
commit
195cb389fd
123
web/gui/src/main/webapp/geometry2.js
Normal file
123
web/gui/src/main/webapp/geometry2.js
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright 2014 Open Networking Laboratory
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
Geometry library - based on work by Mike Bostock.
|
||||
*/
|
||||
|
||||
(function() {
|
||||
|
||||
if (typeof geo == 'undefined') {
|
||||
geo = {};
|
||||
}
|
||||
|
||||
var tolerance = 1e-10;
|
||||
|
||||
function eq(a, b) {
|
||||
return (Math.abs(a - b) < tolerance);
|
||||
}
|
||||
|
||||
function gt(a, b) {
|
||||
return (a - b > -tolerance);
|
||||
}
|
||||
|
||||
function lt(a, b) {
|
||||
return gt(b, a);
|
||||
}
|
||||
|
||||
geo.eq = eq;
|
||||
geo.gt = gt;
|
||||
geo.lt = lt;
|
||||
|
||||
geo.LineSegment = function(x1, y1, x2, y2) {
|
||||
this.x1 = x1;
|
||||
this.y1 = y1;
|
||||
this.x2 = x2;
|
||||
this.y2 = y2;
|
||||
|
||||
// Ax + By = C
|
||||
this.a = y2 - y1;
|
||||
this.b = x1 - x2;
|
||||
this.c = x1 * this.a + y1 * this.b;
|
||||
|
||||
if (eq(this.a, 0) && eq(this.b, 0)) {
|
||||
throw new Error(
|
||||
'Cannot construct a LineSegment with two equal endpoints.');
|
||||
}
|
||||
};
|
||||
|
||||
geo.LineSegment.prototype.intersect = function(that) {
|
||||
var d = (this.x1 - this.x2) * (that.y1 - that.y2) -
|
||||
(this.y1 - this.y2) * (that.x1 - that.x2);
|
||||
|
||||
if (eq(d, 0)) {
|
||||
// The two lines are parallel or very close.
|
||||
return {
|
||||
x : NaN,
|
||||
y : NaN
|
||||
};
|
||||
}
|
||||
|
||||
var t1 = this.x1 * this.y2 - this.y1 * this.x2,
|
||||
t2 = that.x1 * that.y2 - that.y1 * that.x2,
|
||||
x = (t1 * (that.x1 - that.x2) - t2 * (this.x1 - this.x2)) / d,
|
||||
y = (t1 * (that.y1 - that.y2) - t2 * (this.y1 - this.y2)) / d,
|
||||
in1 = (gt(x, Math.min(this.x1, this.x2)) && lt(x, Math.max(this.x1, this.x2)) &&
|
||||
gt(y, Math.min(this.y1, this.y2)) && lt(y, Math.max(this.y1, this.y2))),
|
||||
in2 = (gt(x, Math.min(that.x1, that.x2)) && lt(x, Math.max(that.x1, that.x2)) &&
|
||||
gt(y, Math.min(that.y1, that.y2)) && lt(y, Math.max(that.y1, that.y2)));
|
||||
|
||||
return {
|
||||
x : x,
|
||||
y : y,
|
||||
in1 : in1,
|
||||
in2 : in2
|
||||
};
|
||||
};
|
||||
|
||||
geo.LineSegment.prototype.x = function(y) {
|
||||
// x = (C - By) / a;
|
||||
if (this.a) {
|
||||
return (this.c - this.b * y) / this.a;
|
||||
} else {
|
||||
// a == 0 -> horizontal line
|
||||
return NaN;
|
||||
}
|
||||
};
|
||||
|
||||
geo.LineSegment.prototype.y = function(x) {
|
||||
// y = (C - Ax) / b;
|
||||
if (this.b) {
|
||||
return (this.c - this.a * x) / this.b;
|
||||
} else {
|
||||
// b == 0 -> vertical line
|
||||
return NaN;
|
||||
}
|
||||
};
|
||||
|
||||
geo.LineSegment.prototype.length = function() {
|
||||
return Math.sqrt(
|
||||
(this.y2 - this.y1) * (this.y2 - this.y1) +
|
||||
(this.x2 - this.x1) * (this.x2 - this.x1));
|
||||
};
|
||||
|
||||
geo.LineSegment.prototype.offset = function(x, y) {
|
||||
return new geo.LineSegment(
|
||||
this.x1 + x, this.y1 + y,
|
||||
this.x2 + x, this.y2 + y);
|
||||
};
|
||||
|
||||
})();
|
||||
87
web/gui/src/main/webapp/index2.html
Normal file
87
web/gui/src/main/webapp/index2.html
Normal file
@ -0,0 +1,87 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
~ Copyright 2014 Open Networking Laboratory
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<!--
|
||||
ONOS UI - single page web app
|
||||
Version 1.1
|
||||
|
||||
@author Simon Hunt
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>ONOS GUI (v1.1)</title>
|
||||
|
||||
<link rel="shortcut icon" href="img/onos-logo.png">
|
||||
|
||||
<!-- first script to be run -->
|
||||
<script src="preamble.js"></script>
|
||||
|
||||
<!-- Third party library code included here -->
|
||||
<!--TODO: use the minified version of d3, once debugging is complete -->
|
||||
<script src="libs/d3.js"></script>
|
||||
<script src="libs/jquery-2.1.1.min.js"></script>
|
||||
|
||||
<!-- Base library and framework stylesheets included here -->
|
||||
<link rel="stylesheet" href="base.css">
|
||||
<link rel="stylesheet" href="onos2.css">
|
||||
<link rel="stylesheet" href="mast2.css">
|
||||
|
||||
<!-- This is where contributed stylesheets get INJECTED -->
|
||||
<!-- TODO: replace with template marker and inject refs server-side -->
|
||||
<link rel="stylesheet" href="topo2.css">
|
||||
|
||||
|
||||
<!-- General library modules included here-->
|
||||
<script src="geometry2.js"></script>
|
||||
|
||||
<!-- ONOS UI Framework included here-->
|
||||
<script src="onos2.js"></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div id="frame">
|
||||
<div id="mast">
|
||||
<!-- NOTE: masthead injected here by mast.js -->
|
||||
</div>
|
||||
<div id="view">
|
||||
<!-- NOTE: views injected here by onos.js -->
|
||||
</div>
|
||||
<div id="overlays">
|
||||
<!-- NOTE: overlays injected here, as needed -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Initialize the UI...-->
|
||||
<script type="text/javascript">
|
||||
var ONOS = $.onos({note: "config, if needed"});
|
||||
</script>
|
||||
|
||||
<!-- Framework module files included here -->
|
||||
<script src="mast2.js"></script>
|
||||
|
||||
<!-- Contributed (application) views injected here -->
|
||||
<!-- TODO: replace with template marker and inject refs server-side -->
|
||||
<script src="temp2.js"></script>
|
||||
|
||||
<!-- finally, build the UI-->
|
||||
<script type="text/javascript">
|
||||
$(ONOS.buildUi);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
69
web/gui/src/main/webapp/mast2.css
Normal file
69
web/gui/src/main/webapp/mast2.css
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright 2014 Open Networking Laboratory
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
ONOS GUI -- Masthead -- CSS file
|
||||
|
||||
@author Simon Hunt
|
||||
*/
|
||||
|
||||
#mast {
|
||||
height: 36px;
|
||||
padding: 4px;
|
||||
background-color: #bbb;
|
||||
vertical-align: baseline;
|
||||
box-shadow: 0px 2px 8px #777;
|
||||
}
|
||||
|
||||
#mast img#logo {
|
||||
height: 38px;
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
|
||||
#mast span.title {
|
||||
color: #369;
|
||||
font-size: 14pt;
|
||||
font-style: italic;
|
||||
vertical-align: 12px;
|
||||
}
|
||||
|
||||
#mast span.right {
|
||||
padding-top: 8px;
|
||||
padding-right: 16px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
#mast span.radio {
|
||||
color: darkslateblue;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#mast span.radio {
|
||||
margin: 4px 0;
|
||||
border: 1px dotted #222;
|
||||
padding: 1px 6px;
|
||||
color: #eee;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#mast span.radio.active {
|
||||
background-color: #bbb;
|
||||
border: 1px solid #eee;
|
||||
padding: 1px 6px;
|
||||
color: #666;
|
||||
font-weight: bold;
|
||||
}
|
||||
56
web/gui/src/main/webapp/mast2.js
Normal file
56
web/gui/src/main/webapp/mast2.js
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright 2014 Open Networking Laboratory
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
ONOS GUI -- Masthead
|
||||
|
||||
Defines the masthead for the UI. Injects logo and title, as well as providing
|
||||
the placeholder for a set of radio buttons.
|
||||
|
||||
@author Simon Hunt
|
||||
*/
|
||||
|
||||
(function (onos){
|
||||
'use strict';
|
||||
|
||||
// API's
|
||||
var api = onos.api;
|
||||
|
||||
// Config variables
|
||||
var guiTitle = 'Open Networking Operating System';
|
||||
|
||||
// DOM elements and the like
|
||||
var mast = d3.select('#mast');
|
||||
|
||||
mast.append('img')
|
||||
.attr({
|
||||
id: 'logo',
|
||||
src: 'img/onos-logo.png'
|
||||
});
|
||||
|
||||
mast.append('span')
|
||||
.attr({
|
||||
class: 'title'
|
||||
})
|
||||
.text(guiTitle);
|
||||
|
||||
mast.append('span')
|
||||
.attr({
|
||||
id: 'mastRadio',
|
||||
class: 'right'
|
||||
});
|
||||
|
||||
}(ONOS));
|
||||
204
web/gui/src/main/webapp/onos2.css
Normal file
204
web/gui/src/main/webapp/onos2.css
Normal file
@ -0,0 +1,204 @@
|
||||
/*
|
||||
* Copyright 2014 Open Networking Laboratory
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
ONOS GUI -- Base Framework -- CSS file
|
||||
|
||||
@author Simon Hunt
|
||||
*/
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* === DEBUGGING ======
|
||||
*/
|
||||
svg {
|
||||
/*border: 1px dashed red;*/
|
||||
}
|
||||
|
||||
svg #bg {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Network Graph elements ======================================
|
||||
*/
|
||||
|
||||
svg .link {
|
||||
fill: none;
|
||||
stroke: #666;
|
||||
stroke-width: 2.0px;
|
||||
opacity: .7;
|
||||
|
||||
transition: opacity 250ms;
|
||||
-webkit-transition: opacity 250ms;
|
||||
-moz-transition: opacity 250ms;
|
||||
}
|
||||
|
||||
svg .link.host {
|
||||
stroke: #666;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
|
||||
svg g.portLayer rect.port {
|
||||
fill: #ccc;
|
||||
}
|
||||
|
||||
svg g.portLayer text {
|
||||
font: 8pt sans-serif;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
svg .node.device rect {
|
||||
stroke-width: 1.5px;
|
||||
|
||||
transition: opacity 250ms;
|
||||
-webkit-transition: opacity 250ms;
|
||||
-moz-transition: opacity 250ms;
|
||||
}
|
||||
|
||||
svg .node.device.fixed rect {
|
||||
stroke-width: 1.5;
|
||||
stroke: #ccc;
|
||||
}
|
||||
|
||||
svg .node.device.roadm rect {
|
||||
fill: #03c;
|
||||
}
|
||||
|
||||
svg .node.device.switch rect {
|
||||
fill: #06f;
|
||||
}
|
||||
|
||||
svg .node.host circle {
|
||||
fill: #c96;
|
||||
stroke: #000;
|
||||
}
|
||||
|
||||
svg .node text {
|
||||
fill: white;
|
||||
font: 10pt sans-serif;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* for debugging */
|
||||
svg .node circle.debug {
|
||||
fill: white;
|
||||
stroke: red;
|
||||
}
|
||||
svg .node rect.debug {
|
||||
fill: yellow;
|
||||
stroke: red;
|
||||
opacity: 0.35;
|
||||
}
|
||||
|
||||
|
||||
svg .node.selected rect,
|
||||
svg .node.selected circle {
|
||||
filter: url(#blue-glow);
|
||||
}
|
||||
|
||||
svg .link.inactive,
|
||||
svg .port.inactive,
|
||||
svg .portText.inactive,
|
||||
svg .node.inactive rect,
|
||||
svg .node.inactive circle,
|
||||
svg .node.inactive text,
|
||||
svg .node.inactive image {
|
||||
opacity: .1;
|
||||
}
|
||||
|
||||
svg .node.inactive.selected rect,
|
||||
svg .node.inactive.selected text,
|
||||
svg .node.inactive.selected image {
|
||||
opacity: .6;
|
||||
}
|
||||
|
||||
/*
|
||||
* =============================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* Specific structural elements
|
||||
*/
|
||||
|
||||
/* This is to ensure that the body does not expand to account for the
|
||||
flyout details pane, that is positioned "off screen".
|
||||
*/
|
||||
body {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
#frame {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
#flyout {
|
||||
position: absolute;
|
||||
z-index: 100;
|
||||
display: block;
|
||||
top: 10%;
|
||||
width: 280px;
|
||||
right: -300px;
|
||||
opacity: 0;
|
||||
background-color: rgba(255,255,255,0.8);
|
||||
|
||||
padding: 10px;
|
||||
color: black;
|
||||
font-size: 10pt;
|
||||
box-shadow: 2px 2px 16px #777;
|
||||
}
|
||||
|
||||
#flyout h2 {
|
||||
margin: 8px 4px;
|
||||
color: black;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#flyout h2 img {
|
||||
height: 32px;
|
||||
padding-right: 8px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#flyout p, table {
|
||||
margin: 4px 4px;
|
||||
}
|
||||
|
||||
#flyout td.label {
|
||||
font-style: italic;
|
||||
color: #777;
|
||||
padding-right: 12px;
|
||||
}
|
||||
|
||||
#flyout td.value {
|
||||
|
||||
}
|
||||
|
||||
#flyout hr {
|
||||
height: 1px;
|
||||
color: #ccc;
|
||||
background-color: #ccc;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
303
web/gui/src/main/webapp/onos2.js
Normal file
303
web/gui/src/main/webapp/onos2.js
Normal file
@ -0,0 +1,303 @@
|
||||
/*
|
||||
* Copyright 2014 Open Networking Laboratory
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
ONOS GUI -- Base Framework
|
||||
|
||||
@author Simon Hunt
|
||||
*/
|
||||
|
||||
(function ($) {
|
||||
'use strict';
|
||||
var tsI = new Date().getTime(), // initialize time stamp
|
||||
tsB, // build time stamp
|
||||
defaultHash = 'temp1';
|
||||
|
||||
|
||||
// attach our main function to the jQuery object
|
||||
$.onos = function (options) {
|
||||
var publicApi; // public api
|
||||
|
||||
// internal state
|
||||
var views = {},
|
||||
current = {
|
||||
view: null,
|
||||
ctx: ''
|
||||
},
|
||||
built = false,
|
||||
errorCount = 0;
|
||||
|
||||
// DOM elements etc.
|
||||
var $view;
|
||||
|
||||
|
||||
// ..........................................................
|
||||
// Internal functions
|
||||
|
||||
// throw an error
|
||||
function throwError(msg) {
|
||||
// separate function, as we might add tracing here too, later
|
||||
throw new Error(msg);
|
||||
}
|
||||
|
||||
function doError(msg) {
|
||||
errorCount++;
|
||||
console.warn(msg);
|
||||
}
|
||||
|
||||
// hash navigation
|
||||
function hash() {
|
||||
var hash = window.location.hash,
|
||||
redo = false,
|
||||
view,
|
||||
t;
|
||||
|
||||
if (!hash) {
|
||||
hash = defaultHash;
|
||||
redo = true;
|
||||
}
|
||||
|
||||
t = parseHash(hash);
|
||||
if (!t || !t.vid) {
|
||||
doError('Unable to parse target hash: ' + hash);
|
||||
}
|
||||
|
||||
view = views[t.vid];
|
||||
if (!view) {
|
||||
doError('No view defined with id: ' + t.vid);
|
||||
}
|
||||
|
||||
if (redo) {
|
||||
window.location.hash = makeHash(t);
|
||||
// the above will result in a hashchange event, invoking
|
||||
// this function again
|
||||
} else {
|
||||
// hash was not modified... navigate to where we need to be
|
||||
navigate(hash, view, t);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function parseHash(s) {
|
||||
// extract navigation coordinates from the supplied string
|
||||
// "vid,ctx" --> { vid:vid, ctx:ctx }
|
||||
|
||||
var m = /^[#]{0,1}(\S+),(\S*)$/.exec(s);
|
||||
if (m) {
|
||||
return { vid: m[1], ctx: m[2] };
|
||||
}
|
||||
|
||||
m = /^[#]{0,1}(\S+)$/.exec(s);
|
||||
return m ? { vid: m[1] } : null;
|
||||
}
|
||||
|
||||
function makeHash(t, ctx) {
|
||||
// make a hash string from the given navigation coordinates.
|
||||
// if t is not an object, then it is a vid
|
||||
var h = t,
|
||||
c = ctx || '';
|
||||
|
||||
if ($.isPlainObject(t)) {
|
||||
h = t.vid;
|
||||
c = t.ctx || '';
|
||||
}
|
||||
|
||||
if (c) {
|
||||
h += ',' + c;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
function navigate(hash, view, t) {
|
||||
// closePanes() // flyouts etc.
|
||||
// updateNav() // accordion / selected nav item
|
||||
createView(view);
|
||||
setView(view, hash, t);
|
||||
}
|
||||
|
||||
function reportBuildErrors() {
|
||||
// TODO: validate registered views / nav-item linkage etc.
|
||||
console.log('(no build errors)');
|
||||
}
|
||||
|
||||
// ..........................................................
|
||||
// View life-cycle functions
|
||||
|
||||
function createView(view) {
|
||||
var $d;
|
||||
// lazy initialization of the view
|
||||
if (view && !view.$div) {
|
||||
$d = $view.append('div')
|
||||
.attr({
|
||||
id: view.vid
|
||||
});
|
||||
view.$div = $d; // cache a reference to the selected div
|
||||
}
|
||||
}
|
||||
|
||||
function setView(view, hash, t) {
|
||||
// set the specified view as current, while invoking the
|
||||
// appropriate life-cycle callbacks
|
||||
|
||||
// if there is a current view, and it is not the same as
|
||||
// the incoming view, then unload it...
|
||||
if (current.view && !(current.view.vid !== view.vid)) {
|
||||
current.view.unload();
|
||||
}
|
||||
|
||||
// cache new view and context
|
||||
current.view = view;
|
||||
current.ctx = t.ctx || '';
|
||||
|
||||
// TODO: clear radio button set (store on view?)
|
||||
|
||||
// preload is called only once, after the view is in the DOM
|
||||
if (!view.preloaded) {
|
||||
view.preload(t.ctx);
|
||||
}
|
||||
|
||||
// clear the view of stale data
|
||||
view.reset();
|
||||
|
||||
// load the view
|
||||
view.load(t.ctx);
|
||||
}
|
||||
|
||||
function resizeView() {
|
||||
if (current.view) {
|
||||
current.view.resize();
|
||||
}
|
||||
}
|
||||
|
||||
// ..........................................................
|
||||
// View class
|
||||
// Captures state information about a view.
|
||||
|
||||
// Constructor
|
||||
// vid : view id
|
||||
// nid : id of associated nav-item (optional)
|
||||
// cb : callbacks (preload, reset, load, resize, unload, error)
|
||||
// data: custom data object (optional)
|
||||
function View(vid) {
|
||||
var av = 'addView(): ',
|
||||
args = Array.prototype.slice.call(arguments),
|
||||
nid,
|
||||
cb,
|
||||
data;
|
||||
|
||||
args.shift(); // first arg is always vid
|
||||
if (typeof args[0] === 'string') { // nid specified
|
||||
nid = args.shift();
|
||||
}
|
||||
cb = args.shift();
|
||||
data = args.shift();
|
||||
|
||||
this.vid = vid;
|
||||
|
||||
if (validateViewArgs(vid)) {
|
||||
this.nid = nid; // explicit navitem id (can be null)
|
||||
this.cb = $.isPlainObject(cb) ? cb : {}; // callbacks
|
||||
this.data = data; // custom data (can be null)
|
||||
this.$div = null; // view not yet added to DOM
|
||||
this.ok = true; // valid view
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function validateViewArgs(vid) {
|
||||
var ok = false;
|
||||
if (typeof vid !== 'string' || !vid) {
|
||||
doError(av + 'vid required');
|
||||
} else if (views[vid]) {
|
||||
doError(av + 'View ID "' + vid + '" already exists');
|
||||
} else {
|
||||
ok = true;
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
var viewInstanceMethods = {
|
||||
toString: function () {
|
||||
return '[View: id="' + this.vid + '"]';
|
||||
},
|
||||
|
||||
token: function() {
|
||||
return {
|
||||
vid: this.vid,
|
||||
nid: this.nid,
|
||||
data: this.data
|
||||
}
|
||||
}
|
||||
// TODO: create, preload, reset, load, error, resize, unload
|
||||
};
|
||||
|
||||
// attach instance methods to the view prototype
|
||||
$.extend(View.prototype, viewInstanceMethods);
|
||||
|
||||
// ..........................................................
|
||||
// Exported API
|
||||
|
||||
publicApi = {
|
||||
printTime: function () {
|
||||
console.log("the time is " + new Date());
|
||||
},
|
||||
|
||||
addView: function (vid, nid, cb, data) {
|
||||
var view = new View(vid, nid, cb, data),
|
||||
token;
|
||||
if (view.ok) {
|
||||
views[vid] = view;
|
||||
token = view.token();
|
||||
} else {
|
||||
token = { vid: view.vid, bad: true };
|
||||
}
|
||||
return token;
|
||||
}
|
||||
};
|
||||
|
||||
// function to be called from index.html to build the ONOS UI
|
||||
function buildOnosUi() {
|
||||
tsB = new Date().getTime();
|
||||
tsI = tsB - tsI; // initialization duration
|
||||
|
||||
console.log('ONOS UI initialized in ' + tsI + 'ms');
|
||||
|
||||
if (built) {
|
||||
throwError("ONOS UI already built!");
|
||||
}
|
||||
built = true;
|
||||
|
||||
$view = d3.select('#view');
|
||||
|
||||
$(window).on('hashchange', hash);
|
||||
|
||||
// Invoke hashchange callback to navigate to content
|
||||
// indicated by the window location hash.
|
||||
hash();
|
||||
|
||||
// If there were any build errors, report them
|
||||
reportBuildErrors();
|
||||
}
|
||||
|
||||
|
||||
// export the api and build-UI function
|
||||
return {
|
||||
api: publicApi,
|
||||
buildUi: buildOnosUi
|
||||
};
|
||||
};
|
||||
|
||||
}(jQuery));
|
||||
32
web/gui/src/main/webapp/preamble.js
Normal file
32
web/gui/src/main/webapp/preamble.js
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2014 Open Networking Laboratory
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
ONOS GUI -- Preamble -- the first thing we do
|
||||
|
||||
@author Simon Hunt
|
||||
*/
|
||||
|
||||
(function () {
|
||||
// Check if the URL in the address bar contains a parameter section
|
||||
// (delineated by '?'). If this is the case, rewrite using '#' instead.
|
||||
|
||||
var m = /([^?]*)\?(.*)/.exec(window.location.href);
|
||||
if (m) {
|
||||
window.location.href = m[1] + '#' + m[2];
|
||||
}
|
||||
|
||||
}());
|
||||
75
web/gui/src/main/webapp/temp2.js
Normal file
75
web/gui/src/main/webapp/temp2.js
Normal file
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2014 Open Networking Laboratory
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
Temporary module file to test the framework integration.
|
||||
|
||||
@author Simon Hunt
|
||||
*/
|
||||
|
||||
(function (onos) {
|
||||
'use strict';
|
||||
|
||||
var api = onos.api;
|
||||
|
||||
var vid,
|
||||
svg;
|
||||
|
||||
// == define your functions here.....
|
||||
|
||||
|
||||
// NOTE: view is a data structure:
|
||||
// {
|
||||
// id: 'view-id',
|
||||
// el: ... // d3 selection of dom view div.
|
||||
// }
|
||||
|
||||
function load(view) {
|
||||
vid = view.id;
|
||||
svg = view.el.append('svg')
|
||||
.attr({
|
||||
width: 400,
|
||||
height: 300
|
||||
});
|
||||
|
||||
var fill = (vid === 'temp1') ? 'red' : 'blue',
|
||||
stroke = (vid === 'temp2') ? 'yellow' : 'black';
|
||||
|
||||
svg.append('circle')
|
||||
.attr({
|
||||
cx: 200,
|
||||
cy: 150,
|
||||
r: 30
|
||||
})
|
||||
.style({
|
||||
fill: fill,
|
||||
stroke: stroke,
|
||||
'stroke-width': 3.5
|
||||
});
|
||||
}
|
||||
|
||||
// == register views here, with links to lifecycle callbacks
|
||||
|
||||
api.addView('temp1', {
|
||||
load: load
|
||||
});
|
||||
|
||||
api.addView('temp2', {
|
||||
load: load
|
||||
});
|
||||
|
||||
|
||||
}(ONOS));
|
||||
22
web/gui/src/main/webapp/topo2.css
Normal file
22
web/gui/src/main/webapp/topo2.css
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright 2014 Open Networking Laboratory
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
ONOS GUI -- Topology view -- CSS file
|
||||
|
||||
@author Simon Hunt
|
||||
*/
|
||||
|
||||
1222
web/gui/src/main/webapp/topo2.js
Normal file
1222
web/gui/src/main/webapp/topo2.js
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user