Add search box, using perl Search::Query syntax
authorVincent Tondellier <tonton+hg@team1664.org>
Mon, 26 Jan 2015 00:48:15 +0100
changeset 57 cebbfcd7deff
parent 56 2a4d97741155
child 58 a3e856c4d161
Add search box, using perl Search::Query syntax
CrashTest.conf
CrashTest.pl
dist.ini
lib/CrashTest/Storage/Sql.pm
templates/layouts/main.html.ep
--- a/CrashTest.conf	Sun Jan 25 22:48:47 2015 +0100
+++ b/CrashTest.conf	Mon Jan 26 00:48:15 2015 +0100
@@ -3,15 +3,15 @@
       JSONStackwalker => './stackwalker',
       SymbolsPath => 'breakpad-debug-symbols/*',
   },
+#  Storage => {
+#      Type => "CrashTest::Storage::FileSystem",
+#      DataDir => 'data/',
+#  },
   Storage => {
-      Type => "CrashTest::Storage::FileSystem",
+      Type => "CrashTest::Storage::Sql",
+      DSN => "dbi:SQLite:dbname=data/db.sqlite",
       DataDir => 'data/',
   },
-#  Storage => {
-#      Type => "CrashTest::Storage::Sql",
-#      DSN => "dbi:SQLite:dbname=data/db.sqlite",
-#      DataDir => 'data/',
-#  },
   DecodeQueue => {
       Type => "CrashTest::Decode::Queue::NoQueue"
   },
--- a/CrashTest.pl	Sun Jan 25 22:48:47 2015 +0100
+++ b/CrashTest.pl	Mon Jan 26 00:48:15 2015 +0100
@@ -63,7 +63,7 @@
     $self->validation->required('page')->like(qr/^[0-9]+$/);
     $page = scalar $self->validation->param("page") if $self->validation->is_valid('page');
 
-    my $result = $self->app->storage->index($page, $crashs_per_page);
+    my $result = $self->app->storage->index($page, $crashs_per_page, $self->req->param('search'));
 
     $self->stash(files => $result->{crashs});
     $self->stash(pager => $result->{pager});
@@ -100,6 +100,8 @@
 
     # save the dump in a file
     my $file = $self->req->upload('upload_file_minidump');
+
+    # TODO check for authorised values ...
     my %paramshash = map { $_ => $self->req->param($_) } $self->req->param;
 
     my ($uuid, $uuidstr);
--- a/dist.ini	Sun Jan 25 22:48:47 2015 +0100
+++ b/dist.ini	Mon Jan 26 00:48:15 2015 +0100
@@ -21,8 +21,8 @@
 format = %-9v %{yyyy-MM-dd}d
 
 [Prereqs]
-Mojolicious     = >= 5.48
-Mojolicious::Plugin::BootstrapPagination = 0.0.9
+Mojolicious     = 5.48
+Mojolicious::Plugin::BootstrapPagination = 0.12
 UUID = 0.0.3
 [Prereqs / RuntimeRecommends]
 ; Gearman Queue (also contains the Worker class)
@@ -31,6 +31,9 @@
 DBIx::Class::DeploymentHandler = 0.002000
 DBIx::Class = 0.08196
 DBIx::Class::Candy = 0.002100
+; For search field (only for SQL)
+Search::Query = 0.300
+Search::Query::Dialect::DBIxClass = 0.005
 ; PostgreSQL
 DateTime::Format::Pg = 0
 DBD::Pg = 0
--- a/lib/CrashTest/Storage/Sql.pm	Sun Jan 25 22:48:47 2015 +0100
+++ b/lib/CrashTest/Storage/Sql.pm	Mon Jan 26 00:48:15 2015 +0100
@@ -16,6 +16,7 @@
 use Mojo::JSON qw/j/;
 use DateTime;
 use CrashTest::Storage::Sql::Schema;
+use Search::Query;
 
 sub new {
     my $self = shift->SUPER::new(@_);
@@ -26,10 +27,30 @@
 }
 
 sub index {
-    my ($self, $page, $nperpage) = @_;
+    my ($self, $page, $nperpage, $search_str) = @_;
+
+    my $dbic_query = {};
 
-    my $dbcrashs = $self->{schema}->resultset('CrashReport')->search(
-        undef,
+    if(defined($search_str) && $search_str ne "") {
+        my $search_fields = {
+            user_id             => { alias_for => 'crash_user.user_id' },
+            product             => { alias_for => 'product.name' },
+            version             => { alias_for => 'product.version' },
+            channel             => { alias_for => 'product.release_channel' },
+        };
+        my $query = Search::Query->parser(
+            dialect => 'DBIxClass',
+            fields => $search_fields,
+            default_field => [qw( product.name product.version )],
+        )->parse($search_str);
+
+        if(defined($query)) {
+            $dbic_query = $query->as_dbic_query;
+        }
+    }
+
+    my $dbcrashs = $self->{schema}->resultset('CrashReport')->search_rs(
+        $dbic_query,
         {
             prefetch    => [ 'product', 'crash_user' ],
             order_by    => { -desc => 'crash_time' },
--- a/templates/layouts/main.html.ep	Sun Jan 25 22:48:47 2015 +0100
+++ b/templates/layouts/main.html.ep	Mon Jan 26 00:48:15 2015 +0100
@@ -25,6 +25,12 @@
     <div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
       <div class="container-fluid">
           %= link_to 'Crash test' => url_for('index') => (class => 'navbar-brand')
+          <form id="search-box" class="navbar-form navbar-right" method="get" action="<%= url_for("index") %>" role="search">
+            <div class="form-group">
+              <input name="search" type="text" class="form-control" placeholder="Search" value="<%= param("search") %>">
+            </div>
+            <button type="submit" class="btn btn-default">Submit</button>
+          </form>
       </div>
     </div>
     <div class="container-fluid">