Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
2340dddd06 | |||
57c5fb30c6 | |||
2b6a222bcf | |||
10345d5238 |
@ -1,6 +1,9 @@
|
|||||||
$(document).ready( ->
|
$(document).ready( ->
|
||||||
|
|
||||||
$('#nav-toggle').on('click', toggleNav)
|
$('#nav-toggle').on('click', toggleNav)
|
||||||
|
if getCookie('navCollapsed') == 'true'
|
||||||
|
$('body').addClass('collapsed')
|
||||||
|
$('#mobile-nav-toggle').on('click', toggleMobileNav)
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -8,5 +11,33 @@ toggleNav = () ->
|
|||||||
bodyElem = $('body')
|
bodyElem = $('body')
|
||||||
if bodyElem.hasClass('collapsed')
|
if bodyElem.hasClass('collapsed')
|
||||||
bodyElem.removeClass('collapsed')
|
bodyElem.removeClass('collapsed')
|
||||||
|
setCookie('navCollapsed', 'false')
|
||||||
else
|
else
|
||||||
bodyElem.addClass('collapsed')
|
bodyElem.addClass('collapsed')
|
||||||
|
setCookie('navCollapsed', 'true')
|
||||||
|
|
||||||
|
toggleMobileNav = () ->
|
||||||
|
navElem = $('#mobile-nav')
|
||||||
|
if navElem.hasClass('expanded')
|
||||||
|
navElem.removeClass('expanded')
|
||||||
|
else
|
||||||
|
navElem.addClass('expanded')
|
||||||
|
|
||||||
|
getCookie = (cName) ->
|
||||||
|
name = cName + '='
|
||||||
|
cDecoded = decodeURIComponent(document.cookie)
|
||||||
|
#to be careful
|
||||||
|
cArr = cDecoded.split('; ')
|
||||||
|
res = undefined
|
||||||
|
cArr.forEach (val) ->
|
||||||
|
if val.indexOf(name) == 0
|
||||||
|
res = val.substring(name.length)
|
||||||
|
return
|
||||||
|
res
|
||||||
|
|
||||||
|
setCookie = (cName, cValue, expDays = 30) ->
|
||||||
|
date = new Date
|
||||||
|
date.setTime date.getTime() + expDays * 24 * 60 * 60 * 1000
|
||||||
|
expires = 'expires=' + date.toUTCString()
|
||||||
|
document.cookie = cName + '=' + cValue + '; ' + expires + '; path=/'
|
||||||
|
return
|
||||||
|
@ -16,6 +16,87 @@ body{
|
|||||||
box-shadow: $box-shadow-2;
|
box-shadow: $box-shadow-2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 992px) {
|
||||||
|
body,
|
||||||
|
body.collapsed{
|
||||||
|
padding-left: 0 !important;
|
||||||
|
}
|
||||||
|
#main-nav{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#mobile-nav{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 993px) {
|
||||||
|
#mobile-nav{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#mobile-nav{
|
||||||
|
width: calc(100% + 16px);
|
||||||
|
height: 55px;
|
||||||
|
margin-top: -8px;
|
||||||
|
margin-left: -8px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
background: #212121;
|
||||||
|
color: white;
|
||||||
|
font-size: 3rem;
|
||||||
|
box-shadow: $box-shadow-1;
|
||||||
|
overflow-y: hidden;
|
||||||
|
transition: height 230ms ease-in-out;
|
||||||
|
|
||||||
|
span{
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
padding-top: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul{
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
li{
|
||||||
|
margin: 0;
|
||||||
|
border-bottom: 1px solid #999;
|
||||||
|
|
||||||
|
&:first-child{
|
||||||
|
border-top: 1px solid #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
i{
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
right: 18px;
|
||||||
|
margin-top: 5px;
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a{
|
||||||
|
display: block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px 15px;
|
||||||
|
color: limegreen;
|
||||||
|
font-size: 2.5rem;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: all 230ms ease-in-out;
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#mobile-nav.expanded{
|
||||||
|
height: 300px;
|
||||||
|
i{
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#main-nav{
|
#main-nav{
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
@ -130,3 +211,7 @@ body.collapsed #main-nav{
|
|||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.u-text-centered{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
18
db/migrations/0005_add_ip_table.rb
Normal file
18
db/migrations/0005_add_ip_table.rb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Sequel.migration do
|
||||||
|
|
||||||
|
up do
|
||||||
|
create_table(:ip_addresses) do
|
||||||
|
primary_key :id
|
||||||
|
String :address, null: false
|
||||||
|
String :dns_name
|
||||||
|
String :comment
|
||||||
|
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP
|
||||||
|
DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
down do
|
||||||
|
drop_table(:ip_addresses)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
5
lib/models/ip_address.rb
Normal file
5
lib/models/ip_address.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
class IpAddress < Sequel::Model
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
end
|
@ -5,3 +5,5 @@ require_relative 'routes/item.rb'
|
|||||||
require_relative 'routes/license.rb'
|
require_relative 'routes/license.rb'
|
||||||
|
|
||||||
require_relative 'routes/search.rb'
|
require_relative 'routes/search.rb'
|
||||||
|
|
||||||
|
require_relative 'routes/ip_tracker.rb'
|
||||||
|
38
lib/routes/ip_tracker.rb
Normal file
38
lib/routes/ip_tracker.rb
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
require 'ipaddr'
|
||||||
|
|
||||||
|
namespace '/ip-tracker' do
|
||||||
|
|
||||||
|
get '' do
|
||||||
|
ip_addresses = IpAddress.all()
|
||||||
|
ip_addresses.sort! { |a,b| IPAddr.new( a.address ) <=> IPAddr.new( b.address ) }
|
||||||
|
|
||||||
|
erb :'ip/ip-tracker', :locals => {
|
||||||
|
:title => 'IP Tracker',
|
||||||
|
:ip_addresses => ip_addresses
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/add' do
|
||||||
|
erb :'ip/add', :locals => {
|
||||||
|
:title => 'Add IP Address'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
post '/add' do
|
||||||
|
ip = IpAddress.create(
|
||||||
|
address: params[:ip_address],
|
||||||
|
dns_name: params[:ip_dns],
|
||||||
|
comment: params[:ip_comment]
|
||||||
|
)
|
||||||
|
|
||||||
|
redirect '/ip-tracker'
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/delete/:ip_id' do
|
||||||
|
ip = IpAddress.where(id: params[:ip_id]).first()
|
||||||
|
ip.delete()
|
||||||
|
|
||||||
|
redirect '/ip-tracker'
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
1
raven.rb
1
raven.rb
@ -26,6 +26,7 @@ require_relative 'lib/models/item.rb'
|
|||||||
require_relative 'lib/models/item_comment.rb'
|
require_relative 'lib/models/item_comment.rb'
|
||||||
require_relative 'lib/models/license.rb'
|
require_relative 'lib/models/license.rb'
|
||||||
require_relative 'lib/models/license_comment.rb'
|
require_relative 'lib/models/license_comment.rb'
|
||||||
|
require_relative 'lib/models/ip_address.rb'
|
||||||
|
|
||||||
# Load helper functions
|
# Load helper functions
|
||||||
require_relative 'lib/helpers.rb'
|
require_relative 'lib/helpers.rb'
|
||||||
|
32
views/ip/add.erb
Normal file
32
views/ip/add.erb
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<div class="row">
|
||||||
|
<div class="twelve columns">
|
||||||
|
<h1>Add new IP address</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="twelve columns">
|
||||||
|
<form action="/ip-tracker/add" method="POST" class="u-full-width">
|
||||||
|
<div class="row">
|
||||||
|
<div class="six columns">
|
||||||
|
<label for="ip_address">IP address:</label>
|
||||||
|
<input class="u-full-width" type="text" placeholder="192.168.1.20" id="ip_address" name="ip_address">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="six columns">
|
||||||
|
<label for="ip_dns">DNS name:</label>
|
||||||
|
<input class="u-full-width" type="text" placeholder="test.example.com" id="ip_dns" name="ip_dns">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="twelve columns">
|
||||||
|
<label for="ip_comment">Comments:</label>
|
||||||
|
<input class="u-full-width" type="text" placeholder="My thoughts on this address..." id="ip_comment" name="ip_comment">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input class="button-primary u-full-width" type="submit" value="Submit">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
31
views/ip/ip-tracker.erb
Normal file
31
views/ip/ip-tracker.erb
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<div class="row">
|
||||||
|
<div class="twelve columns">
|
||||||
|
<% if ip_addresses.length > 0 %>
|
||||||
|
<p><a href="/ip-tracker/add">Add new address</a></p>
|
||||||
|
<table class="u-full-width">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Address</th>
|
||||||
|
<th>DNS Name</th>
|
||||||
|
<th>Comments</th>
|
||||||
|
<th>Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% ip_addresses.each do |ip| %>
|
||||||
|
<tr>
|
||||||
|
<td><%= ip.address %></td>
|
||||||
|
<td><%= ip.dns_name %></td>
|
||||||
|
<td><%= ip.comment %></td>
|
||||||
|
<td>
|
||||||
|
<a href="/ip-tracker/delete/<%= ip.id %>"><i class="fa-solid fa-trash"></i></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<% else %>
|
||||||
|
<p>There are no IP addresses to show at this time. Trying <a href="/ip-tracker/add">adding some</a>.</p>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -13,6 +13,8 @@
|
|||||||
<body>
|
<body>
|
||||||
<!-- Main navigation -->
|
<!-- Main navigation -->
|
||||||
<%= erb :'layout/navbar', :locals => locals %>
|
<%= erb :'layout/navbar', :locals => locals %>
|
||||||
|
<!-- Mobile navigatin -->
|
||||||
|
<%= erb :'layout/mobile_navbar', :locals => locals %>
|
||||||
|
|
||||||
<!-- Inventory search/actions bar -->
|
<!-- Inventory search/actions bar -->
|
||||||
<%= erb :'layout/actions', :locals => locals %>
|
<%= erb :'layout/actions', :locals => locals %>
|
||||||
|
9
views/layout/mobile_navbar.erb
Normal file
9
views/layout/mobile_navbar.erb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<nav id="mobile-nav">
|
||||||
|
<span class="u-text-centered"><i id="mobile-nav-toggle" class="fa-solid fa-bars"></i></span>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/">Dashboard <i class="fa-solid fa-gauge"></i></a></li>
|
||||||
|
<li><a href="/item/list">Items <i class="fa-solid fa-desktop"></i></a></li>
|
||||||
|
<li><a href="/license/list">Licenses <i class="fa-solid fa-floppy-disk"></i></a></li>
|
||||||
|
<li><a href="/ip-tracker">IP Tracker <i class="fa-solid fa-network-wired"></i></a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
@ -4,5 +4,6 @@
|
|||||||
<li><a href="/">Dashboard <i class="fa-solid fa-gauge"></i></a></li>
|
<li><a href="/">Dashboard <i class="fa-solid fa-gauge"></i></a></li>
|
||||||
<li><a href="/item/list">Items <i class="fa-solid fa-desktop"></i></a></li>
|
<li><a href="/item/list">Items <i class="fa-solid fa-desktop"></i></a></li>
|
||||||
<li><a href="/license/list">Licenses <i class="fa-solid fa-floppy-disk"></i></a></li>
|
<li><a href="/license/list">Licenses <i class="fa-solid fa-floppy-disk"></i></a></li>
|
||||||
|
<li><a href="/ip-tracker">IP Tracker <i class="fa-solid fa-network-wired"></i></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
Reference in New Issue
Block a user