]> Frank Brehm's Git Trees - books.git/commitdiff
Autor editierbar gemacht
authorFrank Brehm <frank@brehm-online.com>
Thu, 11 Jun 2009 22:46:35 +0000 (22:46 +0000)
committerFrank Brehm <frank@brehm-online.com>
Thu, 11 Jun 2009 22:46:35 +0000 (22:46 +0000)
lib/FrBr/Books/Controller/Autor.pm
lib/FrBr/Books/Controller/Books.pm
lib/FrBr/Books/Util/Author.pm
root/src/autor/autor_form.tt2
root/src/autor/edit.tt2 [new file with mode: 0644]
root/src/autor/form.css
root/src/autor/new.tt2
root/src/books/form.css

index 6aa360d4d74b5eb5fc9cc934f0614385e6d37fd4..690eb7a713963de73f0294f068ac5d9aaf0b6bea 100644 (file)
@@ -59,6 +59,8 @@ sub index : Private {
 
     $c->stash->{'template'} = 'autor/index.tt2';
 
+       delete $c->session->{'from_autor_list'} if exists $c->session->{'from_autor_list'};
+
 }
 
 #-------------------------------------------------------
@@ -151,6 +153,7 @@ sub list : Local {
     $c->session->{'return_target_view'} = $c->web_path("/autor/list");
 
     $c->stash->{'template'} = 'autor/list.tt2';
+       $c->session->{'from_autor_list'} = 1;
 
 }
 
@@ -175,6 +178,7 @@ sub form_new : Path('new') {
     }
 
     $c->stash->{'menu_path'} = [] unless $c->stash->{'menu_path'};
+       $self->add_autorlist_menu($c) if $c->session->{'from_autor_list'};
     push @{ $c->stash->{'menu_path'} }, {
         'path' => $c->web_path("/autor/new"),
         'name' => "Neu"
@@ -215,6 +219,7 @@ sub form_view : Path('view') {
     $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
 
     $c->stash->{'menu_path'} = [] unless $c->stash->{'menu_path'};
+       $self->add_autorlist_menu($c) if $c->session->{'from_autor_list'};
     push @{ $c->stash->{'menu_path'} }, {
         'path' => $c->web_path("/autor/view"),
         'name' => "Betrachten"
@@ -249,6 +254,95 @@ sub form_view : Path('view') {
 
 #-------------------------------------------------------
 
+=head2 form_edit( )
+
+Aendern eines vorhandenen Autors.
+
+=cut
+
+sub form_edit : Path('edit') {
+
+    my ( $self, $c ) = @_;
+    my $K = ( caller(0) )[3] . "(): ";
+
+    $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
+
+    unless ( $c->user_exists() ) {
+        $c->detach('/not_allowed');
+        return;
+    }
+
+    $c->stash->{'menu_path'} = [] unless $c->stash->{'menu_path'};
+       $self->add_autorlist_menu($c) if $c->session->{'from_autor_list'};
+    push @{ $c->stash->{'menu_path'} }, {
+        'path' => $c->web_path("/autor/edit"),
+        'name' => "&Auml;ndern"
+    };
+
+    $c->stash->{'error_message'} = '';
+
+    # Zu bearbeitende Autor-Id ermitteln
+    my $aid = to_int( $c->request->params->{'edit_autor_id'} || 0 );
+
+    unless ( $aid ) {
+        if ( $c->session->{'autor_data_edit'} and $c->session->{'autor_data_edit'}{'id'} ) {
+            $aid = $c->session->{'autor_data_edit'}{'id'};
+        }
+    }
+
+    # Keine Autor-Id da?
+    unless ( $aid ) {
+        $c->stash->{'template'} = 'error.tt2';
+        $c->stash->{'error'}    = 'Keine oder ung&uuml;ltige Autor-Id &uuml;bergeben.';
+        return 1;
+    }
+
+    # Angaben zum Buch aus der Datenbank holen
+    my $aliste = get_author_list( $c, 'autor_id' => $aid );
+
+    unless ( $aliste and scalar( @$aliste ) ) {
+        $c->stash->{'template'} = 'error.tt2';
+        $c->stash->{'error'}    = 'Zur &uuml;bergebenen Autor-Id wurde kein Autor gefunden.';
+        return 1;
+    }
+
+    my $autor = $aliste->[0];
+
+    $c->log->debug( get_output_string( $K, "Autor aus Datenbank: ", $autor ) ) if $c->stash->{'debug_level'} >= 2;
+
+    # Ruecksprung-URL bestimmen
+    $c->stash->{'return_target'} = $c->session->{'return_target_edit'} or $c->web_path("/autor/list");
+
+    # Sitzungsdaten vorbelegen, falls noch nicht geschehen
+    if ( $c->session->{'autor_data_edit'} ) {
+        if ( ! $c->session->{'autor_data_edit'}{'id'} or $c->session->{'autor_data_edit'}{'id'} != $aid ) {
+            $c->session->{'autor_data_edit'} = $autor;
+        }
+    }
+    else {
+        $c->session->{'autor_data_edit'} = $autor;
+    }
+    $aliste = undef;
+
+#      $self->prepare_data_structures($c);
+       $self->autor_cgi2session($c);
+
+    $c->stash->{'template'} = 'autor/edit.tt2';
+    push @{$c->stash->{'cssfiles'}}, 'autor/form.css';
+
+    $self->autor_session2stash($c);
+
+    unless ( $c->request->params->{'autor_form_sent'} and $c->request->params->{'do_save'} ) {
+        return 1;
+    }
+
+    $c->stash->{'return_target_action'} = $c->session->{'return_target_edit'};
+    return $self->save_author($c);
+
+}
+
+#-------------------------------------------------------
+
 sub save_author : Private {
 
     my ( $self, $c ) = @_;
@@ -256,6 +350,7 @@ sub save_author : Private {
 
     return 1 unless $self->check_formparams($c);
 
+       $c->log->debug( get_output_string( $K, "Sichere Autor: ", $c->stash->{'autor_edit'} ) ) if $c->stash->{'debug_level'} >= 2;
     my $autor_id = undef;
     eval {
         $autor_id = save_autor( $c, $c->stash->{'autor_edit'} );
@@ -316,7 +411,7 @@ sub autor_session2stash : Private {
     $c->stash->{'autor_edit'}{'mittelname'}  = $c->session->{'autor_data_edit'}{'mittelname'}  if exists $c->session->{'autor_data_edit'}{'mittelname'};
     $c->stash->{'autor_edit'}{'nachname'}    = $c->session->{'autor_data_edit'}{'nachname'}    if $c->session->{'autor_data_edit'}{'nachname'};
     $c->stash->{'autor_edit'}{'name_suffix'} = $c->session->{'autor_data_edit'}{'name_suffix'} if exists $c->session->{'autor_data_edit'}{'name_suffix'};
-    $c->stash->{'autor_edit'}{'desc'}        = $c->session->{'autor_data_edit'}{'desc'}        if exists $c->session->{'autor_data_edit'}{'desc'};
+    $c->stash->{'autor_edit'}{'descr'}       = $c->session->{'autor_data_edit'}{'descr'}       if exists $c->session->{'autor_data_edit'}{'descr'};
 
     $c->stash->{'return_target_autor_save'} = $c->session->{'return_target_autor_save'} || $c->web_path('/autor');
 
@@ -386,7 +481,7 @@ sub autor_cgi2session : Private {
     }
 
     # Genauere Beschreibung des Autors
-    $c->session->{'autor_data_edit'}{'desc'} = $c->request->params->{'autor_desc'} if defined $c->request->params->{'autor_desc'};
+    $c->session->{'autor_data_edit'}{'descr'} = $c->request->params->{'autor_desc'} if defined $c->request->params->{'autor_desc'};
 
     return 1;
 
@@ -404,6 +499,22 @@ Frank Brehm
 This library is free software, you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=head1 INTERNA
+
+=head2 Sitzungs-Variablen:
+
+=over 4
+
+=item I<autor_data_edit>: die aktuellen Daten des zu bearbeitenden Autors, bevor sie gespeichert werden
+
+=item I<delete_autor_id>: die Id des zu loeschenden Autors
+
+=item I<list_length>: die aktuelle Listenlaenge
+
+=item I<from_autor_list>: boolscher Flag, ob man aus der Autorenliste ins Formular kam oder aus dem Menue
+
+=back
+
 =cut
 
 1;
index a1fc0325d5312879baf9aacafdc781418472d65e..5802b5e17441cce9e180d5dad30d2edfece06fff 100644 (file)
@@ -1174,7 +1174,7 @@ it under the same terms as Perl itself.
 
 =over 4
 
-=item I<book_data_edit>: die aktuellen daten des zu bearbeitenden Buches, bevor sie gespeichert werden
+=item I<book_data_edit>: die aktuellen Daten des zu bearbeitenden Buches, bevor sie gespeichert werden
 
 =item I<delete_book_id>: die Id des zu loeschenden Buches
 
index c661dfb4b0dd0f6d22f9998840ba3bb62438a921..4fe22ee972ce3e5f277c5806d4af6cb1741a1ec5 100644 (file)
@@ -247,124 +247,70 @@ sub get_author_list {
 
 sub save_autor {
 
-    my $c     = shift;
-    my $autor = shift;
-    my $K = ( caller(0) )[3] . "(): ";
-
-    $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
-
-    my $storage = $c->stash->{'storage'};
-    $c->stash->{'storage'}{'save_autor_result'} = '';
-
-    my $save_func = sub {
+       my $c     = shift;
+       my $autor = shift;
+       my $K = ( caller(0) )[3] . "(): ";
 
-        my ( $storage, $dbh, $insert, $autor_id, $titel, $vorname, $mittelname, $nachname, $suffix, $desc ) = @_;
-        $desc = '' unless defined $desc;
+       $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
 
-        my $sql = '';
-        my @P = ();
+       my $storage = $c->stash->{'storage'};
+       $c->stash->{'storage'}{'save_autor_result'} = '';
 
-        if ( $insert ) {
-            if ( $autor_id ) {
-                $sql = <<ENDE;
-INSERT INTO `autoren` (
-    `id`, `titel`, `vorname`, `mittelname`, `nachname`, `name_suffix`, `autor_descr` )
-  VALUES (
-    LAST_INSERT_ID(?), ?, ?, ?, ?, ?, ? )
-ENDE
-                @P = ( $autor_id, $titel, $vorname, $mittelname, $nachname, $suffix, $desc );
-            }
-            else {
-                $sql = <<ENDE;
-INSERT INTO `autoren` (
-    `titel`, `vorname`, `mittelname`, `nachname`, `name_suffix`, `autor_descr` )
-  VALUES (
-    ?, ?, ?, ?, ?, ? )
-ENDE
-                @P = ( $titel, $vorname, $mittelname, $nachname, $suffix, $desc );
-            }
-        }
-        else {
-            $sql = <<ENDE;
-UPDATE `autoren`
-   SET `id` = LAST_INSERT_ID(`id`),
-       `titel` = ?,
-       `vorname` = ?,
-       `mittelname` = ?,
-       `nachname` = ?,
-       `name_suffix` = ?,
-       `autor_descr` = ?
- WHERE `id` = ?
-ENDE
-            @P = ( $titel, $vorname, $mittelname, $nachname, $suffix, $desc, $autor_id );
-        }
-
-        if ( $storage->debug() ) {
-            my $text = $sql;
-            $text =~ s/\s+$//;
-            $text .= ": " . join( ", ", map { $dbh->quote($_) } @P ) . "\n";
-            warn $text;
-        }
-
-        my $sth = $dbh->prepare($sql);
-        $sth->execute( @P );
-
-    };
-
-    my @Params = ();
-    my $search_params = {};
-
-    push @Params, $autor->{'id'};
-
-    my $a_params = {};
+       my $search_params = {};
+       my $row = {};
 
     my $tmp = $autor->{'titel'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
-    push @Params, ( $tmp ? $tmp : undef );
+       $row->{'titel'} = $tmp eq '' ? undef : $tmp;
 
     $tmp = $autor->{'vorname'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
-    push @Params, ( $tmp ? $tmp : undef );
-    $a_params->{'vorname'} = $tmp if $tmp;
+       $row->{'vorname'} = $tmp eq '' ? undef : $tmp;
+       $search_params->{'vorname'} = $tmp if $tmp ne '';
 
     $tmp = $autor->{'mittelname'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
-    push @Params, ( $tmp ? $tmp : undef );
-    $a_params->{'mittelname'} = $tmp if $tmp;
+       $row->{'mittelname'} = $tmp eq '' ? undef : $tmp;
+       $search_params->{'mittelname'} = $tmp if $tmp ne '';
 
     $tmp = $autor->{'nachname'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
-    push @Params, $tmp;
-    $a_params->{'nachname'} = $tmp;
+       $row->{'nachname'} = $tmp;
+       $search_params->{'nachname'} = $tmp;
 
     $tmp = $autor->{'name_suffix'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
-    push @Params, ( $tmp ? $tmp : undef );
-    $a_params->{'name_suffix'} = $tmp if $tmp;
+       $row->{'name_suffix'} = $tmp eq '' ? undef : $tmp;
+       $search_params->{'name_suffix'} = $tmp if $tmp ne '';
 
-    push @Params, $autor->{'desc'};
+    $tmp = $autor->{'descr'};
+    $tmp = '' unless defined $tmp;
+    $tmp =~ s/^\s+//;
+    $tmp =~ s/\s+$//;
+       $row->{'autor_descr'} = $tmp;
 
+       my $saved_aid = get_autor_id( $c, $search_params );
+       
     # Zuerst einmal Test im nichgelocktem Zustand ...
     if ( $autor->{'id'} ) {
-        my $new_id = get_autor_id( $c, $a_params );
-        if ( $new_id and ( $new_id != $autor->{'id'} ) ) {
-            $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den uebergebenen Angaben.';
-            $c->log->info( $K . "Es existiert bereits ein Autor mit den uebergebenen Angaben." );
+        if ( $saved_aid and ( $saved_aid != $autor->{'id'} ) ) {
+            $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den übergebenen Angaben.';
+            $c->log->info( $K . "Es existiert bereits ein Autor mit den übergebenen Angaben." );
             return undef;
         }
     }
     else {
-        if ( get_autor_id( $c, $a_params ) ) {
+        if ( $saved_aid ) {
             $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den uebergebenen Angaben.';
             $c->log->info( $K . "Es existiert bereits ein Autor mit den uebergebenen Angaben." );
             return undef;
@@ -374,18 +320,19 @@ ENDE
     # Sperren der Autoren-Tabelle
     lock_tables( $c, 'write' => [ 'autoren', 'autoren', 'as', 'me' ] );
 
+       $saved_aid = get_autor_id( $c, $search_params );
+       
     # Und jetzt Test im gelocktem Zustand ...
     if ( $autor->{'id'} ) {
-        my $new_id = get_autor_id( $c, $a_params );
-        if ( $new_id and ( $new_id != $autor->{'id'} ) ) {
-            $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den uebergebenen Angaben.';
-            $c->log->info( $K . "Es existiert bereits ein Autor mit den uebergebenen Angaben." );
+        if ( $saved_aid and ( $saved_aid != $autor->{'id'} ) ) {
+            $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den übergebenen Angaben.';
+            $c->log->info( $K . "Es existiert bereits ein Autor mit den übergebenen Angaben." );
             unlock_tables($c);
             return undef;
         }
     }
     else {
-        if ( get_autor_id( $c, $a_params ) ) {
+        if ( $saved_aid ) {
             $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den uebergebenen Angaben.';
             $c->log->info( $K . "Es existiert bereits ein Autor mit den uebergebenen Angaben." );
             unlock_tables($c);
@@ -393,37 +340,35 @@ ENDE
         }
     }
 
-    my $id = undef;
-    my $do_insert = undef;
-    if ( $autor->{'id'} ) {
-        $search_params = { '`id`' => $autor->{'id'}, };
-    }
-    else {
-        $search_params = {
-            'nachname'    => $autor->{'nachname'},
-            'vorname'     => $autor->{'vorname'},
-            'mittelname'  => $autor->{'mittelname'},
-            'name_suffix' => $autor->{'name_suffix'},
-        };
-    }
-    for my $autor_rs ( $c->model('Schema::Autoren')->search( $search_params )->all() ) {
-        $id = $autor_rs->id();
-    }
-
-    if ( $id ) {
-        $autor->{'id'} = $id;
-        $Params[0] = $id;
-    }
-    else {
-        $do_insert = 1;
-    }
-
-    $storage->dbh_do( $save_func, $do_insert, @Params );
+    my $new_id = undef;
+
+       eval {
+               if ( $autor->{'id'} ) {
+                       $new_id = $autor->{'id'};
+                       my $count = $c->model('Schema::Autoren')->count( { 'id' => $autor->{'id'} } );
+                       if ( $count ) {
+                               $c->model('Schema::Autoren')->search( { 'id' => $autor->{'id'} } )->update( $row );
+                       }
+                       else {
+                               $row->{'id'} = $new_id;
+                               $c->model('Schema::Autoren')->create($row);
+                       }
+               }
+               else {
+                       $c->model('Schema::Autoren')->create($row);
+               $new_id = $storage->last_insert_id();
+               }
+       };
+       if ( $@ ) {
+               $c->stash->{'save_autor_result'} = $@;
+               $c->log->info( $K . $@ );
+               unlock_tables($c);
+               return undef;
+       }
 
-    my $author_id = $storage->last_insert_id();
     unlock_tables($c);
     $c->stash->{'storage'}{'save_autor_result'} = 'OK';
-    return $author_id;
+    return $new_id;
 
 }
 
@@ -486,9 +431,10 @@ ENDE
 
     my $id = undef;
     for my $autor_rs ( $storage->dbh_do( $select_func, $name ) ) {
-        $id = $autor_rs->[0];
+        $id = $autor_rs->[0][0];
     }
 
+       $c->log->debug( $K . get_output_string( "Ermittelte Autor-Id: ", ( defined $id ? $id : '<keine>' ) ) ) if $c->stash->{'debug_level'} >= 2;
     return $id;
 
 }
index 5b981d079065f917b2271bc4ffb40db0f6349dc8..7fd09f37ff25c3caae7a0dd2822e319f6e81b182 100644 (file)
@@ -35,7 +35,7 @@
       <td><input type="text" name="autor_name_suffix" size="50" maxlength="100" value="[% autor_edit.name_suffix | html %]" /></td>
     </tr><tr>
       <th>Zusätzliche Angaben:</th>
-      <td><textarea name="autor_desc" cols="50" rows="5">[% autor_edit.desc | html %]</textarea></td>
+      <td><textarea name="autor_desc" cols="50" rows="5">[% autor_edit.descr | html %]</textarea></td>
     </tr><tr>
       <td colspan="2">&nbsp;</td>
     </tr><tr>
diff --git a/root/src/autor/edit.tt2 b/root/src/autor/edit.tt2
new file mode 100644 (file)
index 0000000..94586a4
--- /dev/null
@@ -0,0 +1,17 @@
+<!-- [%#
+    Template zum Ändern der Angaben eines Autors
+
+    vim: noai : ts=4 fenc=utf-8 filetype=html expandtab :
+
+    $Id$
+    $URL$
+
+-%]
+[%- autor_form_title = 'Autor ändern' %]
+[% autor_form_title %]
+-->
+[% PROCESS autor/autor_form.tt2 %]
+
+<div class="back">
+<h2><a href="[% return_target_autor_save %]">[% 'Zurück' %]</a></h2>
+</div>
index 79ffe51c2f5b70291d67aaabe36a6e65451a65a0..c4232106e04b2562350145bff7e33b82443d67cf 100644 (file)
@@ -7,4 +7,66 @@
 -%]
 /*  Stylesheets Autoren-Formulare */
 
+TABLE.ftable {
+  border-width:         2px;
+  border-style:         solid;
+  border-top-color:     [% site.col.tab_rahmen_hell %];
+  border-left-color:    [% site.col.tab_rahmen_hell %];
+  border-right-color:   [% site.col.tab_rahmen_dkl %];
+  border-bottom-color:  [% site.col.tab_rahmen_dkl %];
+  border-collapse:      separate;
+  border-spacing:       0;
+  margin:              auto;
+}
+
+TABLE.ftable UL {
+  margin:              0;
+}
+
+TABLE.ftable TH {
+  vertical-align:       top;
+  text-align:           left;
+  padding:              2px;
+  border-width:         1px;
+  border-style:         solid;
+  font-size:           1em;
+  border-top-color:     [% site.col.tab_rahmen_dkl %];
+  border-left-color:    [% site.col.tab_rahmen_dkl %];
+  border-right-color:   [% site.col.tab_rahmen_hell %];
+  border-bottom-color:  [% site.col.tab_rahmen_hell %];
+  background-color:     [% site.col.list_head %];
+}
+
+TABLE.ftable TD {
+  vertical-align:       top;
+  padding:              2px;
+  border-width:         1px;
+  border-style:         solid;
+  border-top-color:     [% site.col.tab_rahmen_dkl %];
+  border-left-color:    [% site.col.tab_rahmen_dkl %];
+  border-right-color:   [% site.col.tab_rahmen_hell %];
+  border-bottom-color:  [% site.col.tab_rahmen_hell %];
+  background-color:     [% site.col.list_row_bold %];
+}
+
+TABLE.ftable TD.empty {
+  height:              0.5em;
+}
+
+TABLE.ftable TH.button {
+  font-weight:         bolder;
+  text-align:           center;
+  font-size:           1.2em;
+  padding-left:                1em;
+  padding-right:       1em;
+}
+
+TABLE.ftable TH.button INPUT {
+  font-weight:         bolder;
+  text-align:           center;
+  font-size:           1em;
+  padding-left:                1em;
+  padding-right:       1em;
+}
+
 
index 824821a8aca1f85db96176ab383e7c60ca0e9a9c..a59942e306cf1de64a8fb16902d5420ed23b5563 100644 (file)
@@ -1,4 +1,4 @@
-[%#
+<!-- [%#
     Template fuer neuen Autor
 
     vim: noai : ts=4 fenc=utf-8 filetype=html expandtab :
@@ -8,6 +8,8 @@
 
 -%]
 [%- autor_form_title = 'Neuer Autor' -%]
+[% autor_form_title %]
+-->
 [% PROCESS autor/autor_form.tt2 %]
 
 <div class="back">
index 81191e8652ba0288fae4dc145653979d9e4a9c1f..dca8e048c44883e314fb184517a16bc0703130c8 100644 (file)
@@ -7,4 +7,66 @@
 -%]
 /*  Stylesheets Formulare */
 
+TABLE.ftable {
+  border-width:         2px;
+  border-style:         solid;
+  border-top-color:     [% site.col.tab_rahmen_hell %];
+  border-left-color:    [% site.col.tab_rahmen_hell %];
+  border-right-color:   [% site.col.tab_rahmen_dkl %];
+  border-bottom-color:  [% site.col.tab_rahmen_dkl %];
+  border-collapse:      separate;
+  border-spacing:       0;
+  margin:              auto;
+}
+
+TABLE.ftable UL {
+  margin:              0;
+}
+
+TABLE.ftable TH {
+  vertical-align:       top;
+  text-align:           left;
+  padding:              2px;
+  border-width:         1px;
+  border-style:         solid;
+  font-size:           1em;
+  border-top-color:     [% site.col.tab_rahmen_dkl %];
+  border-left-color:    [% site.col.tab_rahmen_dkl %];
+  border-right-color:   [% site.col.tab_rahmen_hell %];
+  border-bottom-color:  [% site.col.tab_rahmen_hell %];
+  background-color:     [% site.col.list_head %];
+}
+
+TABLE.ftable TD {
+  vertical-align:       top;
+  padding:              2px;
+  border-width:         1px;
+  border-style:         solid;
+  border-top-color:     [% site.col.tab_rahmen_dkl %];
+  border-left-color:    [% site.col.tab_rahmen_dkl %];
+  border-right-color:   [% site.col.tab_rahmen_hell %];
+  border-bottom-color:  [% site.col.tab_rahmen_hell %];
+  background-color:     [% site.col.list_row_bold %];
+}
+
+TABLE.ftable TD.empty {
+  height:              0.5em;
+}
+
+TABLE.ftable TH.button {
+  font-weight:         bolder;
+  text-align:           center;
+  font-size:           1.2em;
+  padding-left:                1em;
+  padding-right:       1em;
+}
+
+TABLE.ftable TH.button INPUT {
+  font-weight:         bolder;
+  text-align:           center;
+  font-size:           1em;
+  padding-left:                1em;
+  padding-right:       1em;
+}
+