]> Frank Brehm's Git Trees - books.git/commitdiff
Darstellung der Spalten, nach denen sortiert wird
authorFrank Brehm <frank@brehm-online.com>
Sun, 27 Dec 2009 09:14:39 +0000 (09:14 +0000)
committerFrank Brehm <frank@brehm-online.com>
Sun, 27 Dec 2009 09:14:39 +0000 (09:14 +0000)
lib/FrBr/Books/Controller/Books.pm
lib/FrBr/Books/Db/BuchListe.pm
lib/FrBr/Books/Util/Book.pm
root/lib/config/main.tt2
root/src/books/filter.tt2
root/src/books/list.tt2
root/static/pic/s_asc.png [new file with mode: 0644]
root/static/pic/s_desc.png [new file with mode: 0644]

index b07726448146390a309989c4495b5525c7ef9f9d..fa781bc2db6c0e0acd6d254807a7560ad49fbf2c 100644 (file)
@@ -146,7 +146,40 @@ sub list : Local {
         $c->session->{'book_list_page'} = $page;
     }
 
-    my ( $buchliste, $anzahl ) = get_booklist( $c, { 'page' => $page }  );
+    my $book_order_criteria = $c->session->{'book_order_criteria'};
+    unless ( $book_order_criteria and ref($book_order_criteria) and ref($book_order_criteria) eq 'ARRAY' and scalar(@$book_order_criteria) ) {
+        $book_order_criteria = [
+            'autoren',
+            'title',
+        ];
+    }
+    $c->stash->{'book_order_columns'} =  {};
+    for my $crit (  @$book_order_criteria ) {
+        if ( ref($crit) ) {
+            if ( ref($crit) eq 'HASH' ) {
+                for my $col ( keys %$crit ) {
+                    if ( $crit->{$col} =~ /^\s*d(?:esc)?/i ) {
+                      $c->stash->{'book_order_columns'}{$col} = 'd';
+                    }
+                    else {
+                      $c->stash->{'book_order_columns'}{$col} = 'a';
+                    }
+                }
+            }
+        }
+        else {
+            $c->stash->{'book_order_columns'}{$crit} = 'a';
+        }
+    }
+
+       my $list_params = {
+               'page' => $page,
+               'list_length' => $c->stash->{'list_length'},
+               'sort_criteria' => $book_order_criteria,
+       };
+       $list_params->{'filter'} = $c->session->{'booklist_filter'} if $c->session->{'booklist_filter'};
+       
+    my ( $buchliste, $anzahl ) = get_booklist( $c, $list_params  );
     my $max_page = 1;
     if ( $anzahl ) {
         $max_page = int( $anzahl / $list_length ) + 1;
@@ -294,7 +327,7 @@ sub filter : Local {
                
                }
 
-               $c->detach('/books/list');
+               $c->stash->{'booklist_filter_changed'} = 1;
 
        }
 
index cd6d04cad6a8e322adca4a51691091cdc694270c..8f665ed3a1df60c81723bb0ce74be632b0be8fd4 100644 (file)
@@ -13,17 +13,19 @@ __PACKAGE__->load_components("Core");
 __PACKAGE__->table("NONE");
 
 __PACKAGE__->add_columns(
-  "id",
-  "title",
-  "title_original",
-  "untertitel",
-  "verlag",
-  "isbn",
-  "buch_nr",
-  "ausgabejahr",
-  "druckjahr",
-  "seiten",
-  "preis",
+    "id",
+    "title",
+    "title_original",
+    "untertitel",
+    "verlag",
+    "isbn",
+    "buch_nr",
+    "ausgabejahr",
+    "druckjahr",
+    "seiten",
+    "preis",
+    "verlags_id",
+    "orts_id",
     "waehrungs_kuerzel",
     "waehrung",
     "ort",
@@ -48,6 +50,8 @@ __PACKAGE__->result_source_instance()->name( \<<SQL );
          `druckjahr`,
          `seiten`,
          `preis`,
+         `verlags_id`,
+         `orts_id`,
          `waehrungs_kuerzel`,
          `waehrung`,
          `ort`,
@@ -68,6 +72,8 @@ __PACKAGE__->result_source_instance()->name( \<<SQL );
                   b.`druckjahr`         AS `druckjahr`,
                   b.`seiten`            AS `seiten`,
                   b.`preis`             AS `preis`,
+                  b.`verlags_id`        AS `verlags_id`,
+                  b.`orts_id`           AS `orts_id`,
                   w.`waehrungs_kuerzel` AS `waehrungs_kuerzel`,
                   w.`waehrungs_name`    AS `waehrung`,
                   CONCAT( '`', a.`nachname`,
index f06715aa6627630cd4f188f5d8f890930efb553c..1b0d44fda073eaf58f254697f908702eed15e2f6 100644 (file)
@@ -66,6 +66,18 @@ Folgende benannte Parameter koennen ueber $params uebergeben werden:
 
 =item I<autor_id>: Alle Buecher des Autors mit dieser Id
 
+=item I<page>: Die Nummer der Listenseite, die dargestellt werden soll.
+
+Wenn nicht übergeben, werden alle Buecher des Resultsets zurueckgegeben.
+
+=item I<list_length>: Laenge einer Listenseite.
+
+Ist standardmaessig 20. Wird nicht beruecksichtigt, wenn I<page> nicht mit uebergeben wurde.
+
+=item I<filter>: eine optionale Hash-Ref mit folgenden Filterkriterien:
+
+
+
 =item I<sort_criteria>: Eine Array-Ref mit den Spalten, nach denen sortiert wird.
 
 In diesem Fall wird anhand dieses Parameters und nicht des Sitzungsparameters 'book_order_criteria' sortiert
@@ -157,6 +169,117 @@ sub get_booklist {
         $order = collect_sort_criteria( $c, $order )
     }
 
+    # uebergebenen Filter auswerten
+    if ( $params->{'filter'} and ref($params->{'filter'}) and ( scalar( keys %{$params->{'filter'}} ) ) and not $params->{'buch_id'} ) {
+
+        my $filter = $params->{'filter'};
+
+        # Es wurde ein Buchtitel als Filter uebergeben
+        if ( $filter->{'title_name'} ) {
+            if ( $filter->{'title_name_where'} eq 'contains' ) {
+                $b_search_params->{'-or'} = [
+                    'title'          => { 'RLIKE', $filter->{'title_name'} },
+                    'title_original' => { 'RLIKE', $filter->{'title_name'} },
+                    'untertitel'     => { 'RLIKE', $filter->{'title_name'} },
+                ];
+            }
+            elsif ( $filter->{'title_name_where'} eq 'starts_with' ) {
+                $b_search_params->{'-or'} = [
+                    'title'          => { 'LIKE', ( $filter->{'title_name'} . '%' ) },
+                    'title_original' => { 'LIKE', ( $filter->{'title_name'} . '%' ) },
+                    'untertitel'     => { 'LIKE', ( $filter->{'title_name'} . '%' ) },
+                ];
+            }
+            else {
+                $b_search_params->{'-or'} = [
+                    'title'          => $filter->{'title_name'},
+                    'title_original' => $filter->{'title_name'},
+                    'untertitel'     => $filter->{'title_name'},
+                ];
+            }
+        }
+
+        my $buch_id = {};
+
+        # Es wurden Autoren als Filter uebergeben
+        if ( $filter->{'autoren'} and scalar( keys %{ $filter->{'autoren'} } ) ) {
+            my $ids = [ keys( %{ $filter->{'autoren'} } ) ];
+            my $s_params = {};
+            if ( scalar(@$ids) > 1 ) {
+                $s_params->{'me.autor_id'} = { '-in' => $ids };
+            }
+            else {
+                $s_params->{'me.autor_id'} = $ids->[0];
+            }
+            for my $autor ( $c->model('Schema::Autor2buch')->search( $s_params )->all() ) {
+                my $id = $autor->get_column('buch_id');
+                $buch_id->{$id} = 1;
+            }
+        }
+
+        # Es wurden Kategorien als Filter uebergeben
+        if ( $filter->{'kategorien'} and scalar( keys %{ $filter->{'kategorien'} } ) ) {
+            my $ids = [ keys( %{ $filter->{'kategorien'} } ) ];
+            my $s_params = {};
+            if ( scalar(@$ids) > 1 ) {
+                $s_params->{'me.kategorie_id'} = { '-in' => $ids };
+            }
+            else {
+                $s_params->{'me.kategorie_id'} = $ids->[0];
+            }
+            for my $bkat ( $c->model('Schema::Buch2kategorie')->search( $s_params )->all() ) {
+                my $id = $bkat->get_column('buch_id');
+                $buch_id->{$id} = 1;
+            }
+        }
+
+        # Es wurden Buchserien als Filter uebergeben
+        if ( $filter->{'serien'} and scalar( keys %{ $filter->{'serien'} } ) ) {
+            my $ids = [ keys( %{ $filter->{'serien'} } ) ];
+            my $s_params = {};
+            if ( scalar(@$ids) > 1 ) {
+                $s_params->{'me.serien_id'} = { '-in' => $ids };
+            }
+            else {
+                $s_params->{'me.serien_id'} = $ids->[0];
+            }
+            for my $bserie ( $c->model('Schema::Buch2serie')->search( $s_params )->all() ) {
+                my $id = $bserie->get_column('buch_id');
+                $buch_id->{$id} = 1;
+            }
+        }
+
+        # eventuell spezifizierte Buch-Ids auswerten
+        my $buch_ids = undef;
+        if ( keys %$buch_id and scalar( keys %$buch_id ) ) {
+            $buch_ids = [ keys %$buch_id ];
+        }
+        $b_search_params->{'me.id'} = ( scalar(@$buch_ids) > 1 ? { '-in' => $buch_ids } : $buch_ids->[0] ) if $buch_ids;
+
+        # Es wurden Verlage als Filter uebergeben
+        if ( $filter->{'verlage'} and scalar( keys %{ $filter->{'verlage'} } ) ) {
+            my $ids = [ keys( %{ $filter->{'verlage'} } ) ];
+            if ( scalar(@$ids) > 1 ) {
+                $b_search_params->{'me.verlags_id'} = { '-in' => $ids };
+            }
+            else {
+                $b_search_params->{'me.verlags_id'} = $ids->[0];
+            }
+        }
+
+        # Es wurden Aufbewahrungsorte als Filter uebergeben
+        if ( $filter->{'orte'} and scalar( keys %{ $filter->{'orte'} } ) ) {
+            my $ids = [ keys( %{ $filter->{'orte'} } ) ];
+            if ( scalar(@$ids) > 1 ) {
+                $b_search_params->{'me.orts_id'} = { '-in' => $ids };
+            }
+            else {
+                $b_search_params->{'me.orts_id'} = $ids->[0];
+            }
+        }
+
+    }
+
     # Suchparameter auf undef setzen, falls es keine gibt.
     $b_search_params = undef unless scalar keys %$b_search_params;
 
@@ -171,7 +294,7 @@ sub get_booklist {
 
        my $page = to_int( $params->{'page'} ) ? to_int( $params->{'page'} ) : undef;
        my $rows = undef;
-       $rows = $c->stash->{'list_length'} || 20 if defined $page;
+       $rows = ( $params->{'list_length'} || $c->stash->{'list_length'} || 20 ) if defined $page;
 
        if ( $page ) {
                $other_params->{'rows'} = $rows;
index edd07812fa86814b4787cdc4c825d72965e8556a..810e19756b507819e64d4d8c13311ecac6d9bc73 100644 (file)
@@ -18,6 +18,8 @@
     END;
 
 -%]
+[%- MACRO icon_sort_asc BLOCK -%]<img src="[% Catalyst.web_path( '/static/pic/s_asc.png' ) %]" width="11" height="9" alt="aufsteigend" title="aufsteigend" />[%- END -%]
+[%- MACRO icon_sort_desc BLOCK -%]<img src="[% Catalyst.web_path( '/static/pic/s_desc.png' ) %]" width="11" height="9" alt="absteigend" title="absteigend" />[%- END -%]
 [%-
 
     MACRO uri( path ) BLOCK;
index 56b0539e39ca8254cba096a7b9f0ac9cd6484d11..f1e0026bedf9a52aabd4108fb8ef30bf6c888aa4 100644 (file)
@@ -62,7 +62,9 @@ function set_filter_enabled() {
                     <option value="starts_with"[% IF booklist_filter.title_name_where == "starts_with" %] selected[% END %]>beginnt mit</option>
                     <option value="contains"[% IF booklist_filter.title_name_where == "contains" %] selected[% END %]>enthält</option>
                   </select>&nbsp;
-                  <input name="title_name" id="title_name" type="text" size="50" value="[% booklist_filter.title_name %]"></td>
+                  <input name="title_name" id="title_name" type="text" size="50" value="[% booklist_filter.title_name %]"><br />
+                  <span style="font-size: 0.8em;"><b>Hinweis:</b> wenn Sie <i>&quot;enthält&quot;</i> als Suchmethode wählen, können Sie MySQL-reguläre Ausdrücke verwenden
+                    (Siehe <a href="http://dev.mysql.com/doc/refman/5.1/de/regexp.html" target="_new">Beschreibung der MySQL-Syntax für reguläre Ausdrücke</a>).</span></td>
             </tr><tr>
               <th><label for="autoren_ids">Autor:</label>&nbsp;</th>
               <td><select name="autoren_ids" id="autoren_ids" size="12" multiple>
@@ -112,6 +114,17 @@ document.booklist_filter_form.filter_disabled.checked = false;[% ELSE %]set_filt
 document.booklist_filter_form.filter_enabled.checked = false;
 document.booklist_filter_form.filter_disabled.checked = true;[% END %] 
 
+[%- IF booklist_filter_changed %]
+
+function goto_list() {
+    var target = '[% Catalyst.web_path( '/books/list' ) %]';
+    window.location.href = target;
+}
+
+window.setTimeout("goto_list()", 2000);
+
+[% END %]
+
 </script>
 
 [%- IF error_message %]
index 292e3e021cd827489a60e69aa9081a5556cdd916..4c2db7b45e627d1595854a9a0aefc10c86f245a7 100644 (file)
         </table></td>
   </tr>
 [% END -%]
+[%- MACRO display_sorting_head(column) BLOCK -%]
+    [%- IF book_order_columns -%]
+        [%- IF book_order_columns.$column -%]
+            [%- IF book_order_columns.$column == 'd' -%]&nbsp;[%- icon_sort_desc -%]
+            [%- ELSE -%]&nbsp;[%- icon_sort_asc -%]
+            [%- END -%]
+        [%- END -%]
+    [%- END -%]
+[%- END -%]
 
 <div class="center">
 
 [% IF Catalyst.user_exists %]<tr><td class="action"><a href="[% path('/books/new') %]">Neues Buch ...</a></td></tr>[% END %]
 <tr><td><table class="buchliste" cellspacing="0">
   <tr>
-    <th>Autor (-en)</th>
-    <th>Titel</th>
-    <th>Kategorie</th>
-    <th>Verlag</th>
-    <th>Aufbewahrungsort</th>
+    <th>Autor (-en)[%- display_sorting_head('autoren') -%]</th>
+    <th>Titel[%- display_sorting_head('title') -%]</th>
+    <th>Kategorie[%- display_sorting_head('kategorien') -%]</th>
+    <th>Verlag[%- display_sorting_head('verlag') -%]</th>
+    <th>Aufbewahrungsort[%- display_sorting_head('ort') -%]</th>
     <th></th>
     [% IF Catalyst.user_exists %]<th></th>
     <th></th>[% END %]
diff --git a/root/static/pic/s_asc.png b/root/static/pic/s_asc.png
new file mode 100644 (file)
index 0000000..9990376
Binary files /dev/null and b/root/static/pic/s_asc.png differ
diff --git a/root/static/pic/s_desc.png b/root/static/pic/s_desc.png
new file mode 100644 (file)
index 0000000..a03226d
Binary files /dev/null and b/root/static/pic/s_desc.png differ