From b8ab3b396c5296799bbe80e46e18151ab35b8b5d Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Sun, 10 Dec 2017 13:38:54 +0000 Subject: [PATCH] switch to using defaults all the time instead of params, so multi tab works --- lib/App/Netdisco/Web.pm | 28 +++++++++++++--------------- lib/App/Netdisco/Web/Device.pm | 23 ++++++++++++++++------- share/views/sidebar/device/ports.tt | 10 +++++----- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/lib/App/Netdisco/Web.pm b/lib/App/Netdisco/Web.pm index e07cc812..3fa74fb0 100644 --- a/lib/App/Netdisco/Web.pm +++ b/lib/App/Netdisco/Web.pm @@ -11,6 +11,8 @@ use HTML::Entities (); # to ensure dependency is met use URI::QueryParam (); # part of URI, to add helper methods use Path::Class 'dir'; use Module::Load (); +use Storable 'dclone'; +use Scope::Guard 'guard'; use App::Netdisco::Util::Web 'interval_to_daterange'; use App::Netdisco::Web::AuthN; @@ -79,14 +81,13 @@ hook 'before' => sub { $key =~ s|.*/(\w+)/(\w+)$|${1}_${2}|; vars->{'sidebar_key'} = $key; - return unless param('firstsearch') - and exists setting('sidebar_defaults')->{$key}; + 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 - my %params = %{ setting('sidebar_defaults')->{$key} }; - foreach my $p (keys %params) { - params->{$p} = $params{$p}->{'default'} if $params{$p}->{'default'}; - } + setting('sidebar_defaults')->{$key}->{$_}->{'default'} = params->{$_} + for keys %{ $defaults }; }; # this hook should be loaded _after_ all plugins @@ -120,16 +121,13 @@ hook 'before_template' => sub { $tokens->{$sidebar_key} = uri_for("/$mode/$report"); } - if (exists setting('sidebar_defaults')->{$sidebar_key}) { + if (defined setting('sidebar_defaults')->{$sidebar_key}) { foreach my $col (keys %{ setting('sidebar_defaults')->{$sidebar_key} }) { - if (var('sidebar_key') eq $sidebar_key) { - $tokens->{$sidebar_key}->query_param($col, params->{$col}) - if params->{$col}; - } - else { - $tokens->{$sidebar_key}->query_param($col, - setting('sidebar_defaults')->{$sidebar_key}->{$col}->{'default'}); - } + $tokens->{$sidebar_key}->query_param($col, + setting('sidebar_defaults')->{$sidebar_key}->{$col}->{'default'}); + + $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 79c4c441..4314af46 100644 --- a/lib/App/Netdisco/Web/Device.pm +++ b/lib/App/Netdisco/Web/Device.pm @@ -4,6 +4,9 @@ use Dancer ':syntax'; use Dancer::Plugin::Ajax; use Dancer::Plugin::DBIC; use Dancer::Plugin::Auth::Extensible; + +use Storable 'dclone'; +use Scope::Guard 'guard'; use URL::Encode 'url_params_mixed'; hook 'before' => sub { @@ -14,6 +17,7 @@ hook 'before' => sub { map {{ name => $_, %{ setting('sidebar_defaults')->{'device_ports'}->{$_} } }} grep { $_ =~ m/^c_/ } keys %{ setting('sidebar_defaults')->{'device_ports'} }; + # this could be done at app startup? splice @port_columns, setting('device_port_col_idx_left'), 0, grep {$_->{position} eq 'left'} @{ setting('_extra_device_port_cols') }; splice @port_columns, setting('device_port_col_idx_mid'), 0, @@ -21,12 +25,12 @@ hook 'before' => sub { splice @port_columns, setting('device_port_col_idx_right'), 0, grep {$_->{position} eq 'right'} @{ setting('_extra_device_port_cols') }; - var('port_columns' => \@port_columns); - - # need to update sidebar_defaults so code scanning params sees plugin cols + # update sidebar_defaults so code scanning params sees new plugin cols setting('sidebar_defaults')->{'device_ports'}->{ $_->{name} } = $_ for @port_columns; + var('port_columns' => \@port_columns); + # build view settings for port connected nodes and devices var('connected_properties' => [ sort { $a->{idx} <=> $b->{idx} } @@ -34,17 +38,18 @@ hook 'before' => sub { grep { $_ =~ m/^n_/ } keys %{ setting('sidebar_defaults')->{'device_ports'} } ]); - return unless (request->path eq uri_for('/device')->path - or index(request->path, uri_for('/ajax/content/device')->path) == 0); - # override ports form defaults with cookie settings if (param('reset')) { cookie('nd_ports-form' => '', expires => '-1 day'); } elsif (my $cookie = cookie('nd_ports-form')) { my $cdata = url_params_mixed($cookie); + my $defaults = eval { dclone setting('sidebar_defaults')->{'device_ports'} }; + + if ($cdata and (ref {} eq ref $cdata) and $defaults) { + push @{ vars->{'guards'} }, + guard { setting('sidebar_defaults')->{'device_ports'} = $defaults }; - if ($cdata and (ref {} eq ref $cdata)) { foreach my $key (keys %{ setting('sidebar_defaults')->{'device_ports'} }) { next unless defined $cdata->{$key} and $cdata->{$key} =~ m/^[[:alnum:]_]+$/; @@ -54,6 +59,10 @@ hook 'before' => sub { } } + return unless (request->path eq uri_for('/device')->path + or index(request->path, uri_for('/ajax/content/device')->path) == 0); + + # force always setting params manually params->{'firstsearch'} = 'on'; # TODO set cookie # if (param('reset') or not param('tab') or param('tab') ne 'ports') { diff --git a/share/views/sidebar/device/ports.tt b/share/views/sidebar/device/ports.tt index 5618b3ee..29ad34f2 100644 --- a/share/views/sidebar/device/ports.tt +++ b/share/views/sidebar/device/ports.tt @@ -62,7 +62,7 @@
  • @@ -126,7 +126,7 @@ MAC address format:
    @@ -134,7 +134,7 @@