Showing
4 changed files
with
141 additions
and
11 deletions
| ... | @@ -81,6 +81,7 @@ | ... | @@ -81,6 +81,7 @@ |
| 81 | <!-- TODO: replace with template marker and inject refs server-side --> | 81 | <!-- TODO: replace with template marker and inject refs server-side --> |
| 82 | <script src="sample2.js"></script> | 82 | <script src="sample2.js"></script> |
| 83 | <script src="sampleAlt2.js"></script> | 83 | <script src="sampleAlt2.js"></script> |
| 84 | + <script src="sampleRadio.js"></script> | ||
| 84 | 85 | ||
| 85 | <!-- finally, build the UI--> | 86 | <!-- finally, build the UI--> |
| 86 | <script type="text/javascript"> | 87 | <script type="text/javascript"> | ... | ... |
| ... | @@ -48,12 +48,8 @@ | ... | @@ -48,12 +48,8 @@ |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | #mast span.radio { | 50 | #mast span.radio { |
| 51 | - color: darkslateblue; | ||
| 52 | font-size: 10pt; | 51 | font-size: 10pt; |
| 53 | -} | 52 | + margin: 4px 2px; |
| 54 | - | ||
| 55 | -#mast span.radio { | ||
| 56 | - margin: 4px 0; | ||
| 57 | border: 1px dotted #222; | 53 | border: 1px dotted #222; |
| 58 | padding: 1px 6px; | 54 | padding: 1px 6px; |
| 59 | color: #eee; | 55 | color: #eee; | ... | ... |
| ... | @@ -51,7 +51,8 @@ | ... | @@ -51,7 +51,8 @@ |
| 51 | errorCount = 0; | 51 | errorCount = 0; |
| 52 | 52 | ||
| 53 | // DOM elements etc. | 53 | // DOM elements etc. |
| 54 | - var $view; | 54 | + var $view, |
| 55 | + $mastRadio; | ||
| 55 | 56 | ||
| 56 | 57 | ||
| 57 | // .......................................................... | 58 | // .......................................................... |
| ... | @@ -204,6 +205,9 @@ | ... | @@ -204,6 +205,9 @@ |
| 204 | // the incoming view, then unload it... | 205 | // the incoming view, then unload it... |
| 205 | if (current.view && (current.view.vid !== view.vid)) { | 206 | if (current.view && (current.view.vid !== view.vid)) { |
| 206 | current.view.unload(); | 207 | current.view.unload(); |
| 208 | + // detach radio buttons, if they were there.. | ||
| 209 | + $('#mastRadio').children().detach(); | ||
| 210 | + | ||
| 207 | } | 211 | } |
| 208 | 212 | ||
| 209 | // cache new view and context | 213 | // cache new view and context |
| ... | @@ -223,6 +227,61 @@ | ... | @@ -223,6 +227,61 @@ |
| 223 | view.load(current.ctx); | 227 | view.load(current.ctx); |
| 224 | } | 228 | } |
| 225 | 229 | ||
| 230 | + // generate 'unique' id by prefixing view id | ||
| 231 | + function uid(view, id) { | ||
| 232 | + return view.vid + '-' + id; | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + // restore id by removing view id prefix | ||
| 236 | + function unUid(view, uid) { | ||
| 237 | + var re = new RegExp('^' + view.vid + '-'); | ||
| 238 | + return uid.replace(re, ''); | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + function setRadioButtons(vid, btnSet, callback) { | ||
| 242 | + var view = views[vid], | ||
| 243 | + btnG; | ||
| 244 | + | ||
| 245 | + // lazily create the buttons... | ||
| 246 | + if (!(btnG = view.radioButtons)) { | ||
| 247 | + btnG = d3.select(document.createElement('div')); | ||
| 248 | + | ||
| 249 | + btnSet.forEach(function (btn, i) { | ||
| 250 | + var bid = btn.id || 'b' + i, | ||
| 251 | + txt = btn.text || 'Button #' + i, | ||
| 252 | + b = btnG.append('span') | ||
| 253 | + .attr({ | ||
| 254 | + id: uid(view, bid), | ||
| 255 | + class: 'radio' | ||
| 256 | + }) | ||
| 257 | + .text(txt); | ||
| 258 | + if (i === 0) { | ||
| 259 | + b.classed('active', true); | ||
| 260 | + } | ||
| 261 | + }); | ||
| 262 | + | ||
| 263 | + btnG.selectAll('span') | ||
| 264 | + .on('click', function (d) { | ||
| 265 | + var btn = d3.select(this), | ||
| 266 | + bid = btn.attr('id'), | ||
| 267 | + act = btn.classed('active'); | ||
| 268 | + | ||
| 269 | + if (!act) { | ||
| 270 | + $mastRadio.selectAll('span') | ||
| 271 | + .classed('active', false); | ||
| 272 | + btn.classed('active', true); | ||
| 273 | + | ||
| 274 | + callback(view.token(), unUid(view, bid)); | ||
| 275 | + } | ||
| 276 | + }); | ||
| 277 | + | ||
| 278 | + view.radioButtons = btnG; | ||
| 279 | + } | ||
| 280 | + | ||
| 281 | + // attach the buttons to the masthead | ||
| 282 | + $mastRadio.node().appendChild(btnG.node()); | ||
| 283 | + } | ||
| 284 | + | ||
| 226 | function resize(e) { | 285 | function resize(e) { |
| 227 | d3.selectAll('.onosView').call(setViewDimensions); | 286 | d3.selectAll('.onosView').call(setViewDimensions); |
| 228 | // allow current view to react to resize event... | 287 | // allow current view to react to resize event... |
| ... | @@ -256,8 +315,9 @@ | ... | @@ -256,8 +315,9 @@ |
| 256 | if (validateViewArgs(vid)) { | 315 | if (validateViewArgs(vid)) { |
| 257 | this.nid = nid; // explicit navitem id (can be null) | 316 | this.nid = nid; // explicit navitem id (can be null) |
| 258 | this.cb = $.isPlainObject(cb) ? cb : {}; // callbacks | 317 | this.cb = $.isPlainObject(cb) ? cb : {}; // callbacks |
| 259 | - this.$div = null; // view not yet added to DOM | 318 | + this.$div = null; // view not yet added to DOM |
| 260 | - this.ok = true; // valid view | 319 | + this.radioButtons = null; // no radio buttons yet |
| 320 | + this.ok = true; // valid view | ||
| 261 | } | 321 | } |
| 262 | 322 | ||
| 263 | } | 323 | } |
| ... | @@ -289,7 +349,8 @@ | ... | @@ -289,7 +349,8 @@ |
| 289 | 349 | ||
| 290 | // functions | 350 | // functions |
| 291 | width: this.width, | 351 | width: this.width, |
| 292 | - height: this.height | 352 | + height: this.height, |
| 353 | + setRadio: this.setRadio | ||
| 293 | } | 354 | } |
| 294 | }, | 355 | }, |
| 295 | 356 | ||
| ... | @@ -368,8 +429,11 @@ | ... | @@ -368,8 +429,11 @@ |
| 368 | 429 | ||
| 369 | height: function () { | 430 | height: function () { |
| 370 | return $(this.$div.node()).height(); | 431 | return $(this.$div.node()).height(); |
| 371 | - } | 432 | + }, |
| 372 | 433 | ||
| 434 | + setRadio: function (btnSet, cb) { | ||
| 435 | + setRadioButtons(this.vid, btnSet, cb); | ||
| 436 | + } | ||
| 373 | 437 | ||
| 374 | // TODO: consider schedule, clearTimer, etc. | 438 | // TODO: consider schedule, clearTimer, etc. |
| 375 | }; | 439 | }; |
| ... | @@ -465,6 +529,7 @@ | ... | @@ -465,6 +529,7 @@ |
| 465 | built = true; | 529 | built = true; |
| 466 | 530 | ||
| 467 | $view = d3.select('#view'); | 531 | $view = d3.select('#view'); |
| 532 | + $mastRadio = d3.select('#mastRadio'); | ||
| 468 | 533 | ||
| 469 | $(window).on('hashchange', hash); | 534 | $(window).on('hashchange', hash); |
| 470 | $(window).on('resize', resize); | 535 | $(window).on('resize', resize); |
| ... | @@ -487,4 +552,4 @@ | ... | @@ -487,4 +552,4 @@ |
| 487 | }; | 552 | }; |
| 488 | }; | 553 | }; |
| 489 | 554 | ||
| 490 | -}(jQuery)); | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 555 | +}(jQuery)); | ... | ... |
web/gui/src/main/webapp/sampleRadio.js
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright 2014 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +/* | ||
| 18 | + Sample view to illustrate radio buttons. | ||
| 19 | + | ||
| 20 | + @author Simon Hunt | ||
| 21 | + */ | ||
| 22 | + | ||
| 23 | +(function (onos) { | ||
| 24 | + 'use strict'; | ||
| 25 | + | ||
| 26 | + var data = [ 'Yo, radio button set...', 'Time to shine' ], | ||
| 27 | + btnSet = [ | ||
| 28 | + { id: 'b1', text: 'First Button' }, | ||
| 29 | + { id: 'b2', text: 'Second Button' }, | ||
| 30 | + { id: 'b3', text: 'Third Button' } | ||
| 31 | + ], | ||
| 32 | + btnLookup = {}; | ||
| 33 | + | ||
| 34 | + btnSet.forEach(function (b) { | ||
| 35 | + btnLookup[b.id] = b; | ||
| 36 | + }); | ||
| 37 | + | ||
| 38 | + // invoked when the view is loaded | ||
| 39 | + function load(view, ctx) { | ||
| 40 | + view.setRadio(btnSet, doRadio); | ||
| 41 | + | ||
| 42 | + view.$div.selectAll('p') | ||
| 43 | + .data(data) | ||
| 44 | + .enter() | ||
| 45 | + .append('p') | ||
| 46 | + .text(function (d) { return d; }) | ||
| 47 | + .style('padding', '2px 8px'); | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + function doRadio(view, id) { | ||
| 51 | + view.$div.append('p') | ||
| 52 | + .text('You pressed the ' + btnLookup[id].text) | ||
| 53 | + .style({ | ||
| 54 | + 'font-size': '10pt', | ||
| 55 | + color: 'green', | ||
| 56 | + padding: '0 20px', | ||
| 57 | + margin: '2px' | ||
| 58 | + }); | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + // == register the view here, with links to lifecycle callbacks | ||
| 62 | + | ||
| 63 | + onos.ui.addView('sampleRadio', { | ||
| 64 | + reset: true, // empty the div on reset | ||
| 65 | + load: load | ||
| 66 | + }); | ||
| 67 | + | ||
| 68 | +}(ONOS)); |
-
Please register or login to post a comment