initial implementaton of ports sidebar

This commit is contained in:
Oliver Gorwits
2012-01-09 19:12:06 +00:00
parent 28116d40c8
commit fe09ad7dd9
7 changed files with 153 additions and 4 deletions

View File

@@ -46,7 +46,7 @@ hook 'before' => sub {
};
ajax '/ajax/content/device/:thing' => sub {
return "<p>Hello ". param('thing') ."</p>";
return "<p>Hello, this is where the ". param('thing') ." content goes.</p>";
};
# device ports with a description (er, name) matching
@@ -76,6 +76,30 @@ get '/device' => sub {
return;
}
# list of columns
var('port_columns' => [
{ name => 'port', label => 'Port' },
{ name => 'description', label => 'Description' },
{ name => 'type', label => 'Type' },
{ name => 'duplex', label => 'Duplex' },
{ name => 'lastchange', label => 'Last Change' },
{ name => 'name', label => 'Name' },
{ name => 'speed', label => 'Speed' },
{ name => 'mac', label => 'Port Mac' },
{ name => 'mtu', label => 'MTU' },
{ name => 'native', label => 'Native VLAN' },
{ name => 'vlan', label => 'VLAN Membership' },
{ name => 'connected', label => 'Connected Devices' },
{ name => 'stp', label => 'Spanning Tree' },
{ name => 'status', label => 'Status' },
]);
# details for connected devices
var('connected_properties' => [
{ name => 'age', label => 'Age Stamp' },
{ name => 'ip', label => 'IP Address' },
]);
# list of tabs
var('tabs' => [
{ id => 'details', label => 'Details' },

View File

@@ -32,11 +32,23 @@ form .clearfix.success input {
padding: 30px 60px 40px 90px;
}
.inputs-list:first-child {
padding-top: 2px !important;
}
.device_label {
color: #0069D6;
}
.nd_loginform {
margin-top: 30px;
margin-bottom: 0px;
}
.nd_days_select {
width: 56px;
}
.nd_sidesearchform {
padding-left: 0px;
}
@@ -72,3 +84,33 @@ form .clearfix.success input {
padding: 0px;
height: 100%;
}
.nd_collapser {
cursor: pointer;
}
.nd_collapse_pre_hidden {
display: none;
}
a:hover {
text-decoration: none;
}
.arrow-up {
float: right;
margin-top: 6px;
margin-right: 11px;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 8px solid #F89406;
}
.arrow-down {
float: right;
margin-top: 6px;
margin-right: 11px;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-top: 8px solid #F89406;
}

View File

@@ -0,0 +1,9 @@
/*
* jQuery - Collapser - Plugin v1.0
* http://www.aakashweb.com/
* Copyright 2010, Aakash Chakravarthy
* Released under the MIT License.
*/
(function($){$.fn.collapser=function(options,beforeCallback,afterCallback){var defaults={target:'next',targetOnly:null,effect:'slide',changeText:true,expandHtml:'Expand',collapseHtml:'Collapse',expandClass:'',collapseClass:''};var options=$.extend(defaults,options);var expHtml,collHtml,effectShow,effectHide;if(options.effect=='slide'){effectShow='slideDown';effectHide='slideUp';}else{effectShow='fadeIn';effectHide='fadeOut';}if(options.changeText==true){expHtml=options.expandHtml;collHtml=options.collapseHtml;}function callBeforeCallback(obj){if(beforeCallback!==undefined){beforeCallback.apply(obj);}}function callAfterCallback(obj){if(afterCallback!==undefined){afterCallback.apply(obj);}}function hideElement(obj,method){callBeforeCallback(obj);if(method==1){obj[options.target](options.targetOnly)[effectHide]();obj.html(expHtml);obj.removeClass(options.collapseClass);obj.addClass(options.expandClass);}else{$(document).find(options.target)[effectHide]();obj.html(expHtml);obj.removeClass(options.collapseClass);obj.addClass(options.expandClass);}callAfterCallback(obj);}function showElement(obj,method){callBeforeCallback(obj)
if(method==1){obj[options.target](options.targetOnly)[effectShow]();obj.html(collHtml);obj.removeClass(options.expandClass);obj.addClass(options.collapseClass);}else{$(document).find(options.target)[effectShow]();obj.html(collHtml);obj.removeClass(options.expandClass);obj.addClass(options.collapseClass);}callAfterCallback(obj);}function toggleElement(obj,method){if(method==1){if(obj[options.target](options.targetOnly).is(':visible')){hideElement(obj,1);}else{showElement(obj,1);}}else{if($(document).find(options.target).is(':visible')){hideElement(obj,2);}else{showElement(obj,2);}}}return this.each(function(){if($.fn[options.target]&&$(this)[options.target]()){$(this).toggle(function(){toggleElement($(this),1);},function(){toggleElement($(this),1);});}else{$(this).toggle(function(){toggleElement($(this),2);},function(){toggleElement($(this),2);});}if($.fn[options.target]&&$(this)[options.target]()){if($(this)[options.target]().is(':hidden')){$(this).html(expHtml);$(this).removeClass(options.collapseClass);$(this).addClass(options.expandClass);}else{$(this).html(collHtml);$(this).removeClass(options.expandClass);$(this).addClass(options.collapseClass);}}else{if($(document).find(options.target).is(':hidden')){$(this).html(expHtml);}else{$(this).html(collHtml);}}});};})(jQuery);

View File

@@ -5,7 +5,8 @@
[% FOREACH tab IN vars.tabs %]
<div id="[% tab.id %]_search" class="tab-pane [% 'active' IF params.tab == tab.id %]">
<div class="clearfix">
<h3>[% d.ip %]</h3><p>[% d.dns.remove(settings.domain_suffix) %]</p>
<h3 class="device_label">[% d.ip %]</h3>
<p class="device_label">[% d.dns.remove(settings.domain_suffix) %]</p>
</div>
[%+ TRY %][% INCLUDE "inc/device/${tab.id}.tt" %][% CATCH %]<!-- no "[% tab.id %]" search options -->[% END %]
</div> <!-- /tab-pane -->

View File

@@ -3,11 +3,67 @@
<input name="tab" value="[% tab.id %]" type="hidden"/>
<input name="ip" value="[% params.ip %]" type="hidden"/>
<input name="port" value="[% params.port %]" type="hidden"/>
<div class="clearfix">
<a href="#" class="nd_collapse_columns"><label>Display Columns</label></a>
<div class="input nd_collapse_pre_hidden">
<ul class="inputs-list">
[% FOREACH item IN vars.port_columns %]
<li>
<label>
<input type="checkbox" name="[% item.name %]" value="[% item.name %]"/>
<span>[% item.label %]</span>
</label>
</li>
[% END %]
</ul>
</div>
</div>
<div class="clearfix">
<a href="#" class="nd_collapse_nodeprop"><label>Node Properties</label></a>
<div class="input nd_collapse_pre_hidden">
<ul class="inputs-list">
[% FOREACH item IN vars.connected_properties %]
<li>
<label>
<input type="checkbox" name="[% item.name %]" value="[% item.name %]"/>
<span>[% item.label %]</span>
</label>
</li>
[% END %]
</ul>
</div>
</div>
<div class="clearfix">
<label>Ports become &quot;Free&quot; after</label>
<span rel="twipsy" data-placement="right" data-offset="5" title="Time since Port went Down">
<select class="nd_days_select" name="age_num"/>
[% SET count = 1 %]
[% WHILE count < 32 %]
<option>[% count %]</option>
[% SET count = count + 1 %]
[% END %]
</select>
<select class="span2" name="age_unit"/>
<option>days</option>
<option>weeks</option>
<option>months</option>
<option>years</option>
</select>
</span>
</div>
<div class="clearfix"></div>
<div class="clearfix input-prepend">
<label class="add-on">
<input type="checkbox" id="archived" name="archived"[% ' checked="checked"' IF params.archived %]/>
</label>
<label for="archived">
<span class="nd_searchcheckbox uneditable-input">Archived Data <span class="nd_legendlabel label warning">a</span></span>
</label>
</div>
<div class="nd_search clearfix">
<button id="[% tab.id %]_submit" type="submit" class="btn info">Update View</button>
<a id="[% tab.id %]_bookmark" href="#"
rel="twipsy" data-placement="right" data-offset="5" title="Bookmark these Settings">
<img class="nd_bookmark" src="/images/glyphicons_072_bookmark.png">
</a>
<img class="nd_bookmark" src="/images/glyphicons_072_bookmark.png"></a>
</div>
</form>

View File

@@ -1,4 +1,20 @@
$(document).ready(function() {
$('.nd_collapse_columns').collapser({
target: 'next',
effect: 'slide',
changeText: true,
expandHtml: '<label class="nd_collapser">Display Columns<div class="arrow-down"></div></label>',
collapseHtml: '<label class="nd_collapser">Display Columns<div class="arrow-up"></div></label>',
});
$('.nd_collapse_nodeprop').collapser({
target: 'next',
effect: 'slide',
changeText: true,
expandHtml: '<label class="nd_collapser">Node Properties<div class="arrow-down"></div></label>',
collapseHtml: '<label class="nd_collapser">Node Properties<div class="arrow-up"></div></label>',
});
// parameterised for the active tab - submits search form and injects
// HTML response into the tab pane, or an error/empty-results message
function do_search (event, tab) {

View File

@@ -12,6 +12,7 @@
<![endif]-->
<script type="text/javascript" src="/javascripts/jquery-latest.min.js"></script>
<script type="text/javascript" src="/javascripts/jquery-collapser.min.js"></script>
<script type="text/javascript" src="/javascripts/bootstrap-alerts.js"></script>
<script type="text/javascript" src="/javascripts/bootstrap-twipsy.js"></script>
<script type="text/javascript" src="/javascripts/bootstrap-dropdown.js"></script>