merge branch og-portcontrol

This commit is contained in:
Oliver Gorwits
2012-11-24 23:29:00 +00:00
parent 3724e3ed37
commit 083f3a51ed
31 changed files with 1368 additions and 377 deletions

View File

@@ -6,14 +6,36 @@
</tr>
<tr>
<td>Location</td>
[% IF vars.user.port_control %]
<td class="nd_editable_cell" contenteditable="true"
data-field="location" data-for-device="[% d.ip %]">
<i class="icon-edit nd_edit_icon nd_device_details_edit"></i>
[% d.location %]
<i class="icon-thumbs-up nd_thumb_icon"
rel="tooltip" data-placement="left" data-offset="3"
data-animation="" title="Click to Apply"></i>
</td>
[% ELSE %]
<td>
<a rel="tooltip" data-placement="top" data-offset="5" title="Find Similar Devices"
href="[% vars.search_device %]&location=[% d.location | uri %]">[% d.location %]</a>
</td>
[% END %]
</tr>
<tr>
<td>Contact</td>
[% IF vars.user.port_control %]
<td class="nd_editable_cell" contenteditable="true"
data-field="contact" data-for-device="[% d.ip %]">
<i class="icon-edit nd_edit_icon nd_device_details_edit"></i>
[% d.contact %]
<i class="icon-thumbs-up nd_thumb_icon"
rel="tooltip" data-placement="left" data-offset="3"
data-animation="" title="Click to Apply"></i>
</td>
[% ELSE %]
<td>[% d.contact %]</td>
[% END %]
</tr>
<tr>
<td>Vendor / Model</td>

View File

@@ -3,6 +3,7 @@
<tr>
<th></th>
[% FOREACH item IN vars.port_columns %]
[% NEXT IF item.name == 'c_admin' %]
[% NEXT UNLESS params.${item.name} %]
<th[% ' class="center_cell"' IF NOT loop.first %]>[% item.label %]</th>
[% END %]
@@ -22,18 +23,39 @@
<span class="label label-warning">D</span>
[% END %]
</td>
[% IF params.c_port %]
<td><a class="nd_linkcell nd_this_port_only" href="[% uri_for('/device',
vars.self_options) %]&q=[% params.q | uri %]&f=[% row.port | uri %]">
[% IF vars.user.port_control AND params.c_admin %]
[% IF row.up_admin == 'up' %]
<td class="nd_editable_cell" data-action="down"
data-field="c_port" data-for-device="[% device %]" data-for-port="[% row.port | html_entity %]">
<i class="icon-hand-down nd_hand_icon"
rel="tooltip" data-placement="top" data-offset="3"
data-animation="" title="Click to Disable"></i>
[% ELSE %]
<td class="nd_editable_cell" data-action="up"
data-field="c_port" data-for-device="[% device %]" data-for-port="[% row.port | html_entity %]">
<i class="icon-hand-up nd_hand_icon"
rel="tooltip" data-placement="top" data-offset="3"
data-animation="" title="Click to Enable"></i>
[% END %]
[% ELSE %]
<td>
[% END %]
<a class="nd_linkcell nd_this_port_only" href="[% uri_for('/device',
vars.self_options) %]&q=[% params.q | uri %]&f=[% row.port | uri %]">
[% row.port | html_entity %]
</a></td>
[% END %]
[% IF params.c_descr %]
<td class="center_cell">[% row.descr | html_entity %]</td>
[% END %]
[% IF params.c_type %]
<td class="center_cell">[% row.type | html_entity %]</td>
[% END %]
[% IF params.c_duplex %]
<td class="center_cell">
[% IF row.up == 'up' AND row.duplex %]
@@ -41,27 +63,63 @@
[% END %]
</td>
[% END %]
[% IF params.c_lastchange %]
<td class="center_cell">[% row.lastchange_stamp | html_entity %]</td>
[% END %]
[% IF params.c_name %]
<td class="center_cell">[% row.name | html_entity %]</td>
[% IF vars.user.port_control AND params.c_admin %]
<td class="center_cell nd_editable_cell" contenteditable="true"
data-field="c_name" data-for-device="[% device %]" data-for-port="[% row.port | html_entity %]">
<i class="icon-edit nd_edit_icon"></i>
[% ELSE %]
<td class="center_cell">
[% END %]
<div class="nd_editable_cell_content">
[% row.name | html_entity %]
[% IF vars.user.port_control AND params.c_admin %]
<i class="icon-thumbs-up nd_thumb_icon"
rel="tooltip" data-placement="top" data-offset="3"
data-animation="" title="Click to Apply"></i>
[% END %]
</div>
</td>
[% END %]
[% IF params.c_speed %]
<td class="center_cell">[% row.speed | html_entity %]</td>
[% END %]
[% IF params.c_mac %]
<td class="center_cell">[% row.mac | html_entity %]</td>
[% END %]
[% IF params.c_mtu %]
<td class="center_cell">[% row.mtu | html_entity %]</td>
[% END %]
[% IF params.c_vlan %]
[% IF vars.user.port_control AND params.c_admin %]
<td class="center_cell nd_editable_cell" contenteditable="true"
data-field="c_vlan" data-for-device="[% device %]" data-for-port="[% row.port | html_entity %]">
<i class="icon-edit nd_edit_icon"></i>
<div class="nd_editable_cell_content">
[% IF row.vlan %][% row.vlan | html_entity %][% ELSE %]&nbsp;[% END %]
<i class="icon-thumbs-up nd_thumb_icon"
rel="tooltip" data-placement="top" data-offset="3"
data-animation="" title="Click to Apply"></i>
</div>
</td>
[% ELSE %]
<td class="center_cell">
<a class="nd_linkcell"
href="[% uri_for('/search') %]?tab=vlan&q=[% row.vlan | uri %]">[% row.vlan | html_entity %]</a>
href="[% uri_for('/search') %]?tab=vlan&q=[% row.vlan | uri %]">
[% row.vlan | html_entity %]</a>
</td>
[% END %]
[% END %]
[% IF params.c_vmember %]
<td>
[% IF row.tagged_vlans_count %]
@@ -73,14 +131,17 @@
[% END %]
[% IF row.tagged_vlans_count > 10 %] [%# FIXME make this a settable variable %]
[% SET output = '<div class="vlan_total">(' _ row.tagged_vlans_count
_ ')</div><a href="#" class="nd_linkcell nd_collapse_vlans"><div class="cell-arrow-up"></div>'
_ 'Show VLANs</a><div class="nd_collapsing nd_collapse_pre_hidden">' _ output %]
_ ')</div><span class="nd_linkcell nd_collapse_vlans">
<i class="cell-arrow-up-down icon-chevron-up icon-large">
</i>Show VLANs</span>
<div class="nd_collapsing nd_collapse_pre_hidden">' _ output %]
[% SET output = output _ '</div>' %]
[% END %]
[% output %]
[% END %]
</td>
[% END %]
[% IF params.c_connected %]
<td>
[% IF row.remote_ip %]
@@ -115,9 +176,11 @@
[% END %]
</td>
[% END %]
[% IF params.c_stp %]
<td class="center_cell">[% row.stp | html_entity %]</td>
[% END %]
[% IF params.c_up %]
<td class="center_cell">
[% row.up_admin | html_entity %] / [% row.up | html_entity %]

View File

@@ -38,7 +38,7 @@
<td>&nbsp;</td>
[% END %]
<td>Switch Port</td>
<td><a href="[% vars.device_ports %]&q=[% node.switch | url %]&f=[% node.port | url %]">[% node.switch %] [ [% node.port %] ]</a>
<td><a href="[% vars.device_ports %]&q=[% node.switch | url %]&f=[% node.port | url %]&c_connected=on">[% node.switch %] [ [% node.port %] ]</a>
[% ' (' _ node.device.dns.remove(settings.domain_suffix) _ ')' IF node.device.dns %]
[% ' <span class="label label-warning">A</span>' IF NOT node.active %]
</td>

View File

@@ -66,7 +66,7 @@
</td>
[% END %]
<td>Switch Port</td>
<td><a href="[% vars.device_ports %]&q=[% node.switch | url %]&f=[% node.port | url %]">[% node.switch %] [ [% node.port %] ]</a>
<td><a href="[% vars.device_ports %]&q=[% node.switch | url %]&f=[% node.port | url %]&c_connected=on">[% node.switch %] [ [% node.port %] ]</a>
[% ' (' _ node.device.dns.remove(settings.domain_suffix) _ ')' IF node.device.dns %]
[% ' <span class="label label-warning">A</span>' IF NOT node.active %]
</td>
@@ -97,7 +97,7 @@
</td>
[% END %]
<td>Switch Port</td>
<td><a href="[% vars.device_ports %]&q=[% port.ip | url %]&f=[% port.port | url %]">[% port.ip %] [ [% port.port %] ]</a>
<td><a href="[% vars.device_ports %]&q=[% port.ip | url %]&f=[% port.port | url %]&c_connected=on">[% port.ip %] [ [% port.port %] ]</a>
[% ' (' _ port.device.dns.remove(settings.domain_suffix) _ ')' IF port.device.dns %]
</td>
[% IF params.stamps %]

View File

@@ -1,15 +1,12 @@
<img class="sidebar_toggle" id="sidebar_toggle_img_out"
src="[% uri_base %]/images/diagona_settings.png"
rel="tooltip" data-placement="left" data-offset="5" title="Show Options"/>
<i class="sidebar_toggle icon-wrench icon-large" id="sidebar_toggle_img_out"
rel="tooltip" data-placement="left" data-offset="5" title="Show Sidebar"></i>
<div class="container-fluid">
<div class="sidebar">
<div class="sidebar sidebar_pinned">
<div class="well">
<img class="sidebar_toggle" id="sidebar_toggle_img_in"
src="[% uri_base %]/images/splashyfish_right.png"
rel="tooltip" data-placement="left" data-offset="5" title="Hide Sidebar"/>
<div id="sidebar_pin_box" class="well">
<img id="sidebar_pin" src="[% uri_base %]/images/matte_basic_pin.png"/>
</div>
<i class="sidebar_toggle icon-signout" id="sidebar_toggle_img_in"
rel="tooltip" data-placement="left" data-offset="5" title="Hide Sidebar"></i>
<i class="sidebar_pin icon-pushpin sidebar_pin_clicked"
rel="tooltip" data-placement="left" data-offset="5" title="Pin Sidebar"></i>
<div class="tab-content">
[% FOREACH tab IN vars.tabs %]
<div id="[% tab.id %]_search" class="tab-pane [% 'active' IF params.tab == tab.id %]">
@@ -37,6 +34,7 @@
[% FOREACH tab IN vars.tabs %]
<li[% ' class="active"' IF params.tab == tab.id %]><a id="[% tab.id %]_link" href="#[% tab.id %]_pane">[% tab.label %]</a></li>
[% END %]
<span class="nd_device_name">[% d.dns || d.name %]</span>
</ul>
<div class="tab-content">
[% FOREACH tab IN vars.tabs %]

View File

@@ -6,26 +6,76 @@
// VLANs column list collapser trigger
// it's a bit of a faff because we can't easily use Bootstrap's collapser
$('.nd_collapse_vlans').toggle(function() {
event.preventDefault(); // prevent jump to top of page
$(this).siblings('.nd_collapsing').toggle('fast');
$(this).siblings('.cell-arrow-up').toggleClass('cell-arrow-down cell-arrow-up');
$(this).html('<div class="cell-arrow-down"></div>Hide VLANs');
$(this).siblings('.nd_collapsing').toggle();
$(this).siblings('.cell-arrow-up-down')
.toggleClass('icon-chevron-up icon-chevron-down');
$(this).html('<div class="cell-arrow-up-down icon-chevron-down icon-large"></div>Hide VLANs');
}, function() {
event.preventDefault(); // prevent jump to top of page
$(this).siblings('.nd_collapsing').toggle('fast');
$(this).siblings('.cell-arrow-down').toggleClass('cell-arrow-down cell-arrow-up');
$(this).html('<div class="cell-arrow-up"></div>Show VLANs');
$(this).siblings('.nd_collapsing').toggle();
$(this).siblings('.cell-arrow-up-down')
.toggleClass('icon-chevron-up icon-chevron-down');
$(this).html('<div class="cell-arrow-up-down icon-chevron-up icon-large"></div>Show VLANs');
});
// toggle visibility of port up/down and edit controls
$('.nd_editable_cell').hover(function() {
$(this).children('.nd_hand_icon').toggle();
$(this).children('.nd_edit_icon').toggle();
});
// toggle visibility of VLAN edit control when clicked
$('[contenteditable=true]').focus(function() {
$(this).find('.nd_thumb_icon').toggle();
});
$('[contenteditable=true]').blur(function() {
$(this).find('.nd_thumb_icon').toggle();
// can undo but CSS doesn't shift, so just do nothing for now.
});
// activity for port up/down control
$('.icon-hand-up').click(function() {
port_control(this); // save
});
$('.icon-hand-down').click(function() {
port_control(this); // save
});
// activity for contenteditable control
$('.nd_thumb_icon').click(function() {
$(this).closest('[contenteditable=true]').blur();
port_control(this); // save
});
// activity for contenteditable control
$('[contenteditable=true]').keydown(function() {
var esc = event.which == 27,
nl = event.which == 13;
if (esc) {
document.execCommand('undo');
$(this).blur();
}
else if (nl) {
$(this).blur();
event.preventDefault();
port_control(this); // save
}
});
// activate tooltips
$("[rel=tooltip]").tooltip({live: true});
}
$(document).ready(function() {
// sidebar collapser events trigger change of up/down arrow
$('.collapse').on('show', function() {
$(this).siblings().find('.arrow-up').toggleClass('arrow-down arrow-up');
$(this).siblings().find('.arrow-up-down')
.toggleClass('icon-chevron-up icon-chevron-down');
});
$('.collapse').on('hide', function() {
$(this).siblings().find('.arrow-down').toggleClass('arrow-down arrow-up');
$(this).siblings().find('.arrow-up-down')
.toggleClass('icon-chevron-up icon-chevron-down');
});
// show or hide sweeping brush icon when field has content

View File

@@ -20,11 +20,21 @@
<script type="text/javascript">
var uri_base = '[% uri_base %]';
</script>
<script type="text/javascript" src="[% uri_base %]/javascripts/netdisco.js"></script>
<link rel="stylesheet" href="[% uri_base %]/css/bootstrap.min.css">
<link rel="stylesheet" href="[% uri_base %]/css/netdisco.css">
<link rel="stylesheet" href="[% uri_base %]/css/nd_print.css" media="print">
[% IF vars.user.port_control %]
<script type="text/javascript" src="[% uri_base %]/javascripts/toastr.js"></script>
<script type="text/javascript" src="[% uri_base %]/javascripts/netdisco_portcontrol.js"></script>
<link rel="stylesheet" href="[% uri_base %]/css/toastr.css"/>
<link rel="stylesheet" href="[% uri_base %]/css/toastr-responsive.css"/>
[% END %]
<link rel="stylesheet" href="[% uri_base %]/css/bootstrap.min.css"/>
<link rel="stylesheet" href="[% uri_base %]/css/font-awesome.css"/>
<link rel="stylesheet" href="[% uri_base %]/css/netdisco.css"/>
<link rel="stylesheet" href="[% uri_base %]/css/nd_print.css" media="print"/>
</head>
<body>
@@ -60,12 +70,19 @@
</ul>
<form class="navbar-search pull-left" method="get" action="[% uri_for('/search') %]">
<input placeholder="Find Anything" class="search-query span3" id="nq" name="q" type="text"/>
<i id="navsearchgo" class="icon-search icon-white navbar_icon"></i>
<span style="font-size: 24px;">
<i id="navsearchgo" class="icon-search navbar_icon"></i>
</span>
</form>
<ul class="nav pull-right">
<li class="nd_navbartext">Logged in as &nbsp;</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
[% IF vars.user.port_control %]
<i class="icon-user-md"></i>
[% ELSE %]
<i class="icon-user"></i>
[% END %]
[% session.user %] <b class="caret"></b></a>
<ul class="dropdown-menu">
[% FOREACH item IN user_dd %]

View File

@@ -1,15 +1,12 @@
<img class="sidebar_toggle" id="sidebar_toggle_img_out"
src="[% uri_base %]/images/diagona_settings.png"
rel="tooltip" data-placement="left" data-offset="5" title="Show Search Options"/>
<i class="sidebar_toggle icon-wrench icon-large" id="sidebar_toggle_img_out"
rel="tooltip" data-placement="left" data-offset="5" title="Show Sidebar"></i>
<div class="container-fluid">
<div class="sidebar">
<div class="well">
<img class="sidebar_toggle" id="sidebar_toggle_img_in"
src="[% uri_base %]/images/splashyfish_right.png"
rel="tooltip" data-placement="left" data-offset="5" title="Hide Sidebar"/>
<div id="sidebar_pin_box" class="well">
<img id="sidebar_pin" src="[% uri_base %]/images/matte_basic_pin.png"/>
</div>
<i class="sidebar_toggle icon-signout" id="sidebar_toggle_img_in"
rel="tooltip" data-placement="left" data-offset="5" title="Hide Sidebar"></i>
<i class="sidebar_pin icon-pushpin"
rel="tooltip" data-placement="left" data-offset="5" title="Pin Sidebar"></i>
<div class="tab-content">
[% FOREACH tab IN vars.tabs %]
<div id="[% tab.id %]_search" class="tab-pane [% 'active' IF params.tab == tab.id %]">

View File

@@ -1,5 +1,4 @@
<p><em>Port Filter Options</em></p>
<input name="q" value="[% params.q %]" type="hidden"/>
<div class="clearfix">
<a class="field_clear_icon" href="#"
@@ -10,9 +9,11 @@
rel="tooltip" data-placement="left" data-offset="5" title="Filter by Port, Name or VLAN"/>
</div>
<div class="clearfix">
<a href="#" data-toggle="collapse" data-target="#nd_legend">
<label class="nd_collapser">Legend<div class="arrow-down"></div></label></a>
<div id="nd_legend" class="collapse in">
<span data-toggle="collapse" data-target="#nd_legend">
<label class="nd_collapser">Legend
<i class="arrow-up-down icon-chevron-up icon-large"></i>
</label></span>
<div id="nd_legend" class="collapse">
<ul class="inputs-list unstyled">
<li>
<span class="label">S</span>&nbsp; Admin Disabled
@@ -39,16 +40,23 @@
</div>
</div>
<div class="clearfix">
<a href="#" data-toggle="collapse" data-target="#nd_columns">
<label class="nd_collapser">Display Columns<div class="arrow-down"></div></label></a>
<span data-toggle="collapse" data-target="#nd_columns">
<label class="nd_collapser">Display Columns
<i class="arrow-up-down icon-chevron-down icon-large"></i>
</label></span>
<div id="nd_columns" class="collapse in">
<ul class="inputs-list unstyled">
[% FOREACH item IN vars.port_columns %]
[% NEXT IF item.name == 'c_admin' AND NOT vars.user.port_control %]
<li>
<label class="checkbox">
<input type="checkbox" id="[% item.name %]"
name="[% item.name %]"[% ' checked="checked"' IF params.${item.name} %] />
[% item.label %]
[% IF item.name == 'c_admin' %]
<span class="label label-inverse">[% item.label %]</span>
[% ELSE %]
[% item.label %]
[% END %]
</label>
</li>
[% END %]
@@ -56,8 +64,10 @@
</div>
</div>
<div class="clearfix">
<a href="#" data-toggle="collapse" data-target="#nd_portprops">
<label class="nd_collapser">Port Properties<div class="arrow-up"></div></label></a>
<span data-toggle="collapse" data-target="#nd_portprops">
<label class="nd_collapser">Port Properties
<i class="arrow-up-down icon-chevron-up icon-large"></i>
</label></span>
<div id="nd_portprops" class="collapse">
<ul class="inputs-list unstyled">
<li>
@@ -86,8 +96,10 @@
</div>
</div>
<div class="clearfix">
<a href="#" data-toggle="collapse" data-target="#nd_nodeprops">
<label class="nd_collapser">Node Properties<div class="arrow-up"></div></label></a>
<span data-toggle="collapse" data-target="#nd_nodeprops">
<label class="nd_collapser">Node Properties
<i class="arrow-up-down icon-chevron-up icon-large"></i>
</label></span>
<div id="nd_nodeprops" class="collapse">
<ul class="inputs-list unstyled">
[% FOREACH item IN vars.connected_properties %]

View File

@@ -1,47 +1,42 @@
<p><em>Device Search Options</em></p>
<p class="nd_sidebar_title"><em>Device Search Options</em></p>
<input name="q" value="[% params.q %]" type="hidden"/>
<div class="clearfix">
<a data-btn-for="dns" class="field_copy_icon" href="#">
<img src="[% uri_base %]/images/vaga_copy.png"/></a>
<a id="dns_clear_btn" data-btn-for="dns" class="field_clear_icon" href="#">
<i class="icon-trash"></i></a>
<i data-btn-for="dns" class="field_copy_icon icon-copy icon-large"></i>
<i id="dns_clear_btn" data-btn-for="dns"
class="field_clear_icon icon-trash icon-large"></i>
<input class="nd_side_input" placeholder="DNS"
type="text" name="dns" value="[% params.dns %]"
rel="tooltip" data-placement="left" data-offset="5" title="DNS"/>
</div>
<div class="clearfix">
<a data-btn-for="ip" class="field_copy_icon" href="#">
<img src="[% uri_base %]/images/vaga_copy.png"/></a>
<a id="ip_clear_btn" data-btn-for="ip" class="field_clear_icon" href="#">
<i class="icon-trash"></i></a>
<i data-btn-for="ip" class="field_copy_icon icon-copy icon-large"></i>
<i id="ip_clear_btn" data-btn-for="ip"
class="field_clear_icon icon-trash icon-large"></i>
<input class="nd_side_input" placeholder="IP Address"
type="text" name="ip" value="[% params.ip %]"
rel="tooltip" data-placement="left" data-offset="5" title="IP Address"/>
</div>
<div class="clearfix">
<a data-btn-for="name" class="field_copy_icon" href="#">
<img src="[% uri_base %]/images/vaga_copy.png"/></a>
<a id="name_clear_btn" data-btn-for="name" class="field_clear_icon" href="#">
<i class="icon-trash"></i></a>
<i data-btn-for="name" class="field_copy_icon icon-copy icon-large"></i>
<i id="name_clear_btn" data-btn-for="name"
class="field_clear_icon icon-trash icon-large"></i>
<input class="nd_side_input" placeholder="System Name"
type="text" name="name" value="[% params.name %]"
rel="tooltip" data-placement="left" data-offset="5" title="System Name"/>
</div>
<div class="clearfix">
<a data-btn-for="location" class="field_copy_icon" href="#">
<img src="[% uri_base %]/images/vaga_copy.png"/></a>
<a id="location_clear_btn" data-btn-for="location" class="field_clear_icon" href="#">
<i class="icon-trash"></i></a>
<i data-btn-for="location" class="field_copy_icon icon-copy icon-large"></i>
<i id="location_clear_btn" data-btn-for="location"
class="field_clear_icon icon-trash icon-large"></i>
<input class="nd_side_input" placeholder="Location"
type="text" name="location" value="[% params.location %]"
rel="tooltip" data-placement="left" data-offset="5" title="Location"/>
</div>
<div class="clearfix">
<a data-btn-for="description" class="field_copy_icon" href="#">
<img src="[% uri_base %]/images/vaga_copy.png"/></a>
<a id="description_clear_btn" data-btn-for="description" class="field_clear_icon" href="#">
<i class="icon-trash"></i></a>
<i data-btn-for="description" class="field_copy_icon icon-copy icon-large"></i>
<i id="description_clear_btn" data-btn-for="description"
class="field_clear_icon icon-trash icon-large"></i>
<input class="nd_side_input" placeholder="Description"
type="text" name="description" value="[% params.description %]"
rel="tooltip" data-placement="left" data-offset="5" title="Description"/>

View File

@@ -1,5 +1,5 @@
<p><em>Node Search Options</em></p>
<p class="nd_sidebar_title"><em>Node Search Options</em></p>
<input name="q" value="[% params.q %]" type="hidden"/>
<div class="clearfix input-prepend">
<label class="add-on">