1package App::Netdisco::Web::TypeAhead;
2
3use Dancer ':syntax';
4use Dancer::Plugin::Ajax;
5use Dancer::Plugin::DBIC;
6use Dancer::Plugin::Auth::Extensible;
7
8use App::Netdisco::Util::Web (); # for sort_port
9
10ajax '/ajax/data/devicename/typeahead' => require_login sub {
11    return '[]' unless setting('navbar_autocomplete');
12
13    my $q = param('query') || param('term');
14    my $set = schema('netdisco')->resultset('Device')->search_fuzzy($q);
15
16    content_type 'application/json';
17    to_json [map {$_->dns || $_->name || $_->ip} $set->all];
18};
19
20ajax '/ajax/data/deviceip/typeahead' => require_login sub {
21    my $q = param('query') || param('term');
22    my $set = schema('netdisco')->resultset('Device')->search_fuzzy($q);
23
24    my @data = ();
25    while (my $d = $set->next) {
26        my $label = $d->ip;
27        if ($d->dns or $d->name) {
28            $label = sprintf '%s (%s)',
29              ($d->dns || $d->name), $d->ip;
30        }
31        push @data, { label => $label, value => $d->ip };
32    }
33
34    content_type 'application/json';
35    to_json \@data;
36};
37
38ajax '/ajax/data/port/typeahead' => require_login sub {
39    my $dev  = param('dev1')  || param('dev2');
40    my $port = param('port1') || param('port2');
41    send_error('Missing device', 400) unless $dev;
42
43    my $device = schema('netdisco')->resultset('Device')
44      ->find({ip => $dev});
45    send_error('Bad device', 400) unless $device;
46
47    my $set = $device->ports({},{order_by => 'port'});
48    $set = $set->search({port => { -ilike => "\%$port\%" }})
49      if $port;
50
51    my $results = [
52      map  {{ label => (sprintf "%s (%s)", $_->port, ($_->name || '')), value => $_->port }}
53      sort { &App::Netdisco::Util::Web::sort_port($a->port, $b->port) } $set->all
54    ];
55
56    content_type 'application/json';
57    to_json \@$results;
58};
59
60ajax '/ajax/data/subnet/typeahead' => require_login sub {
61    my $q = param('query') || param('term');
62    $q = "$q\%" if $q !~ m/\%/;
63    my $nets = schema('netdisco')->resultset('Subnet')->search(
64           { 'me.net::text'  => { '-ilike' => $q }},
65           { columns => ['net'], order_by => 'net' } );
66
67    content_type 'application/json';
68    to_json [map {$_->net} $nets->all];
69};
70
71true;
72