diff --git a/Build.PL b/Build.PL index e581f67d..bfe59a26 100644 --- a/Build.PL +++ b/Build.PL @@ -74,7 +74,8 @@ Module::Build->new( 'Term::UI' => '0', 'Try::Tiny' => '0', 'URI' => '0', - 'URL::Encode' => '0.01', + 'URL::Encode' => '0.03', + 'URL::Encode::XS' => 0, 'YAML' => '0.84', 'YAML::XS' => '0.41', }, diff --git a/lib/App/Netdisco/Web.pm b/lib/App/Netdisco/Web.pm index 3fa74fb0..013ee51b 100644 --- a/lib/App/Netdisco/Web.pm +++ b/lib/App/Netdisco/Web.pm @@ -81,11 +81,14 @@ hook 'before' => sub { $key =~ s|.*/(\w+)/(\w+)$|${1}_${2}|; vars->{'sidebar_key'} = $key; + # search or report from navbar can ignore params + return if param('firstsearch'); + my $defaults = dclone (setting('sidebar_defaults')->{$key} or return); push @{ vars->{'guards'} }, guard { setting('sidebar_defaults')->{$key} = $defaults }; - # new searches will use these defaults in their sidebars + # otherwise update defaults to contain the passed url params setting('sidebar_defaults')->{$key}->{$_}->{'default'} = params->{$_} for keys %{ $defaults }; }; @@ -126,6 +129,7 @@ hook 'before_template' => sub { $tokens->{$sidebar_key}->query_param($col, setting('sidebar_defaults')->{$sidebar_key}->{$col}->{'default'}); + # used by the sidebar templates when first rendering $tokens->{"${sidebar_key}_defaults"}->{$col} = setting('sidebar_defaults')->{$sidebar_key}->{$col}->{'default'}; } diff --git a/lib/App/Netdisco/Web/Device.pm b/lib/App/Netdisco/Web/Device.pm index e80c8ddb..f5225b1b 100644 --- a/lib/App/Netdisco/Web/Device.pm +++ b/lib/App/Netdisco/Web/Device.pm @@ -5,6 +5,7 @@ use Dancer::Plugin::Ajax; use Dancer::Plugin::DBIC; use Dancer::Plugin::Auth::Extensible; +use URI (); use Storable 'dclone'; use Scope::Guard 'guard'; use URL::Encode 'url_params_mixed'; @@ -50,20 +51,22 @@ hook 'before' => sub { push @{ vars->{'guards'} }, guard { setting('sidebar_defaults')->{'device_ports'} = $defaults }; - foreach my $key (keys %{ setting('sidebar_defaults')->{'device_ports'} }) { - next unless defined $cdata->{$key} - and $cdata->{$key} =~ m/^[[:alnum:]_]+$/; + foreach my $key (keys %{ $defaults }) { setting('sidebar_defaults')->{'device_ports'}->{$key}->{'default'} = $cdata->{$key}; } } } +}; - return unless (request->path eq uri_for('/device')->path - or index(request->path, uri_for('/ajax/content/device')->path) == 0); +hook 'before_template' => sub { + return unless var('sidebar_key') and (var('sidebar_key') eq 'device_ports'); -# TODO set cookie -# if (param('reset') or not param('tab') or param('tab') ne 'ports') { + my $uri = URI->new(); + foreach my $key (keys %{ setting('sidebar_defaults')->{'device_ports'} }) { + $uri->query_param($key => params->{$key}) if params->{$key}; + } + cookie('nd_ports-form' => $uri->query(), expires => '365 days'); }; get '/device' => require_login sub { diff --git a/share/views/ajax/device/modules.tt b/share/views/ajax/device/modules.tt index f8ec6dbf..834864e5 100644 --- a/share/views/ajax/device/modules.tt +++ b/share/views/ajax/device/modules.tt @@ -20,9 +20,9 @@ [%- ELSE -%]   [%- END -%] - [% nodes.$item.module.description -%] + [% nodes.$item.module.description -%] [%- IF nodes.$item.module.name -%] - ([% nodes.$item.module.name %]) + ([% nodes.$item.module.name %]) [%- END -%] [%- IF nodes.$item.module.fw_ver -%] fw: [% nodes.$item.module.fw_ver %] @@ -34,13 +34,13 @@ sw: [% nodes.$item.module.sw_ver %] [%- END -%] [%- IF nodes.$item.module.serial -%] - [serial: [% nodes.$item.module.serial %]] + [serial: [% nodes.$item.module.serial %]] [%- END -%] [%- IF nodes.$item.module.type -%] - / [% nodes.$item.module.type %] + / [% nodes.$item.module.type %] [%- END -%] [%- IF nodes.$item.module.model -%] - / [% nodes.$item.module.model %] + / [% nodes.$item.module.model %] [%- END -%] [%- IF nodes.$item.module.fru -%] [FRU] diff --git a/share/views/js/common.js b/share/views/js/common.js index 7c875fd0..6b1bc77d 100644 --- a/share/views/js/common.js +++ b/share/views/js/common.js @@ -92,16 +92,6 @@ update_csv_download_link('device', '[% tab.tag %]', '[% tab.provides_csv %]'); [% IF tab.tag == 'ports' %] - // to be fair I can't remember why we do this in JS and not from the app - // perhaps because selecting form fields to go in the cookie is easier? -// var cookie = $('#ports_form').find('input,select') -// .not('#nd_port-query,input[name="q"],input[name="tab"]') -// .serializeArray(); -// $('#ports_form').find('input[type="checkbox"]').map(function() { -// cookie.push({'name': 'columns', 'value': $(this).attr('name')}); -// }); -// $.cookie('nd_ports-form', $.param(cookie) ,{ expires: 365 }); - // form reset icon on ports tab $('#nd_sidebar-reset-link').attr('href', uri_base + '/device?tab=[% tab.tag %]&reset=on&' + $('#ports_form') diff --git a/share/views/layouts/main.tt b/share/views/layouts/main.tt index 2bd2ac13..ccfb06c5 100644 --- a/share/views/layouts/main.tt +++ b/share/views/layouts/main.tt @@ -86,7 +86,7 @@ @@ -138,6 +138,7 @@