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