App-Netdisco
view release on metacpan or search on metacpan
lib/App/Netdisco/Web/Plugin.pm view on Meta::CPAN
register 'register_navbar_item' => sub {
my ($self, $config) = plugin_args(@_);
if (!$config->{tag}
or !$config->{path}
or !$config->{label}) {
debug $config;
return error "bad config to register_navbar_item";
}
foreach my $item (@{ setting('_navbar_items') }) {
if ($item->{tag} eq $config->{tag}) {
$item = $config;
return;
}
}
push @{ setting('_navbar_items') }, $config;
};
register 'register_admin_task' => sub {
my ($self, $config) = plugin_args(@_);
if (!$config->{tag}
or !$config->{label}) {
debug $config;
return error "bad config to register_admin_task";
}
push @{ setting('_admin_order') }, $config->{tag};
setting('_admin_tasks')->{ $config->{tag} } = $config;
};
sub _register_tab {
my ($nav, $config) = @_;
my $stash = setting("_${nav}_tabs");
if (!$config->{tag}
or !$config->{label}) {
debug $config;
return error "bad config to register_${nav}_item";
}
foreach my $item (@{ $stash }) {
if ($item->{tag} eq $config->{tag}) {
$item = $config;
return;
}
}
push @{ $stash }, $config;
}
register 'register_search_tab' => sub {
my ($self, $config) = plugin_args(@_);
_register_tab('search', $config);
if ($config->{api_endpoint}) {
my $tag = $config->{tag};
swagger_path {
tags => ['Search'],
path => setting('api_base')."/search/$tag",
description => $config->{label} .' Search',
parameters => $config->{api_parameters},
responses =>
($config->{api_responses} || { default => {} }),
}, get "/api/v1/search/$tag" => require_role api => sub {
forward "/ajax/content/search/$tag";
};
}
};
register 'register_device_tab' => sub {
my ($self, $config) = plugin_args(@_);
$config->{render_if} ||= sub { true };
_register_tab('device', $config);
};
register 'register_report' => sub {
my ($self, $config) = plugin_args(@_);
my @categories = @{ setting('_report_order') };
if (!$config->{category}
or !$config->{tag}
or !$config->{label}
or 0 == scalar grep {$config->{category} eq $_} @categories) {
debug $config;
return error "bad config to register_report";
}
if (0 == scalar grep {$_ eq $config->{tag}}
@{setting('_reports_menu')->{ $config->{category} }}) {
push @{setting('_reports_menu')->{ $config->{category} }}, $config->{tag};
}
foreach my $tag (@{setting('_reports_menu')->{ $config->{category} }}) {
if ($config->{tag} eq $tag) {
setting('_reports')->{$tag} = $config;
if ($config->{api_endpoint}) {
(my $category_path = lc $config->{category}) =~ s/ /-/g;
my $params_copy = dclone ($config->{api_parameters} || []); #Â swagger plugin nukes it?
swagger_path {
tags => ['Reports'],
path => setting('api_base')."/report/$category_path/$tag",
description => $config->{label} .' Report',
parameters =>
($config->{api_parameters} ||
($config->{bind_params} ? [map { $_ => {} } @{ $config->{bind_params} }] : [])),
responses =>
($config->{api_responses} || { default => {} }),
},
get "/api/v1/report/$category_path/$tag" => require_role api => sub {
#Â #1360 workaround for swagger missing that False is false
foreach my $spec (pairs @{ $params_copy }) {
my ($param, $conf) = @$spec;
next unless exists $conf->{type} and $conf->{type} eq 'boolean';
next unless exists request->{'_query_params'}->{$param}
and defined request->{'_query_params'}->{$param}
and ref q{} eq ref request->{'_query_params'}->{$param}; #Â multiple params are arrayref
if (request->{'_query_params'}->{$param} eq 'False') {
delete request->{'_query_params'}->{$param};
delete params->{$param};
}
}
forward "/ajax/content/report/$tag";
};
}
foreach my $rconfig (@{setting('reports')}) {
if ($rconfig->{tag} eq $tag) {
setting('_reports')->{$tag}->{'rconfig'} = $rconfig;
last;
}
}
}
}
};
register_plugin;
true;
=head1 NAME
App::Netdisco::Web::Plugin - Netdisco Web UI components
=head1 Introduction
L<App::Netdisco>'s plugin system allows you more control of what Netdisco
components are displayed in the web interface. Plugins can be distributed
independently from Netdisco and are a better alternative to source code
patches.
The following web interface components are implemented as plugins:
=over 4
( run in 1.616 second using v1.01-cache-2.11-cpan-437f7b0c052 )