* Add enclair_db option to UserDB.pm. Allows logging of enclair password
[interchange.git] / code / UI_Tag / row_edit.coretag
1 # Copyright 2002-2007 Interchange Development Group and others
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.  See the LICENSE file for details.
7
8 # $Id: row_edit.coretag,v 1.12 2007-03-30 23:40:54 pajamian Exp $
9
10 UserTag row-edit Order       key table size columns
11 UserTag row-edit HasEndTag
12 UserTag row-edit addAttr
13 UserTag row-edit Interpolate 1
14 UserTag row-edit Version     $Revision: 1.12 $
15 UserTag row-edit Routine     <<EOR
16 sub {
17         my ($key,$table,$size,$columns,$opt) = @_;
18         use vars qw/$CGI $Values $Variable/;
19 #::logDebug("row_edit options=" . ::uneval($opt));
20         $table = $table || $CGI::values{mv_data_table} || return "BLANK DB";
21         my $db = ::database_exists_ref($table);
22         my $mtab = $::Variable->{UI_META_TABLE} || 'mv_metadata';
23         my $mdb = ::database_exists_ref($mtab);
24         $opt->{view} ||= $CGI->{ui_meta_view};
25
26         my $view = Vend::Table::Editor::meta_record($table, $opt->{view}) || {};
27         
28         my $tm_extra = '';
29         my $ta_extra = '';
30         my $tf_extra = '';
31         if($opt->{extra}) {
32                 $tf_extra = " $opt->{extra}";
33         }
34         if($opt->{meta_extra}) {
35                 $tm_extra .= " $opt->{meta_extra}";
36         }
37         if($opt->{textarea_extra}) {
38                 $tm_extra .= " $opt->{textarea_extra}";
39         }
40
41         $ta_extra ||= $tf_extra;
42         $tm_extra ||= $tf_extra;
43
44         my $prependor = '';
45         if($opt->{pointer}) {
46                 $prependor = $opt->{pointer};
47                 $prependor =~ s/\D+//;
48                 $prependor = $prependor ? $prependor . '_' : '';
49 #::logDebug("setting prependor to $prependor");
50         }
51
52         my $appendor = '';
53         if($opt->{stacker}) {
54                 $appendor = "__$opt->{stacker}";
55 #::logDebug("setting appendor to $appendor");
56         }
57         return errmsg("non-existent table '%s' for row-edit", $table)
58                 unless $db;
59         $db = $db->ref();
60
61         my $acl = UI::Primitive::get_ui_table_acl();
62
63         my $record;
64         my $bad;
65         if ($key) {
66                 eval {
67                         $bad = ! $db->record_exists($key);
68                         $bad = errmsg('DELETED') if $bad;
69                 };
70                 $bad = errmsg('ERROR') if $@;
71                 if($bad) {
72                         # Do nothing, we are already bad
73                 }
74                 elsif($acl) {
75                         $bad = errmsg('Not available')
76                                 if ! UI::Primitive::ui_acl_atom($acl, 'keys', $key);
77                 }
78                 else {
79                         $record = $db->row_hash($key);
80                 }
81         }
82
83         $record ||= {};
84
85         my @cols;
86
87         if($columns ||= $view->{spread_cols} || $view->{attribute}) {
88                 @cols = split /[\s,\0]+/, $columns;
89                 my %col;
90                 for($db->columns()) {
91                         $col{$_} = 1;
92                 }
93                 @cols = grep defined $col{$_}, @cols;
94         }
95         else {
96                 @cols = $db->columns();
97         }
98
99         if($acl) {
100                 @cols = UI::Primitive::ui_acl_grep( $acl, 'fields', @cols);
101         }
102
103         # See if we have a textarea reference
104         my %ta;
105         if($opt->{textarea}) {
106                 my @tmp = split /[\s,\0]+/, $opt->{textarea};
107                 for(@tmp) {
108                         $ta{$_} = 1;
109                 }
110         }
111
112         my $out = '';
113
114         my $meta   = $CGI->{ui_no_meta_display} ? '' : $view->{spread_meta};
115         my %do_ta;
116         my %do_meta;
117         if($meta) {
118                 my @metas = grep /\S/, split /[\0,\s]+/, $meta;
119                 @do_meta{@metas} = @metas;
120         }
121
122         if($view->{spread_textarea}) {
123                 my @tas = grep /\S/, split /[\0,\s]+/, $view->{spread_textarea};
124                 @do_ta{@tas} = @tas;
125         }
126         my $tmp;
127
128         $size = $size || $view->{spread_width} || $view->{width} || 12;
129         if($bad) {
130                 for(@cols) {
131                         $out .= "<TD$tf_extra>$bad</TD>";
132                 }
133         }
134         elsif($key or $opt->{blank}) {
135                 for(@cols) {
136                         my $text = $opt->{blank} ? '' : $record->{$_} || '';
137                         my $msg = '';
138                         if($do_meta{$_}) {
139                                 my $tmp = Vend::Tags->display( {
140                                                                                         table => $table,
141                                                                                         column => $_,
142                                                                                         name => "$prependor$_$appendor",
143                                                                                         value => $text,
144                                                                                         template => ' $WIDGET$ ',
145                                                                                         specific => $opt->{ui_meta_specific},
146                                                                                         key => $key,
147                                                                                 });
148                                 $out .= "<TD$tm_extra>$tmp</TD>";
149                                 next;
150                         }
151                         elsif($do_ta{$_}) {
152                                 my $rows = $opt->{height} || 4;
153                                 HTML::Entities::encode($text, $ESCAPE_CHARS::std);
154                                 $out .= <<EOF;
155 <TD$ta_extra><TEXTAREA NAME="$prependor$_$appendor" COLS="$size" ROWS="$rows">$text</TEXTAREA>$msg</TD>
156 EOF
157                         }
158                         else {
159                                 $text =~ s/"/&quot;/g;
160                                 $out .= <<EOF;
161 <TD$tf_extra><INPUT NAME="$prependor$_$appendor" SIZE=$size VALUE="$text">$msg</TD>
162 EOF
163                         }
164                 }
165         }
166         else {
167                 for(@cols) {
168                                 $out .= <<EOF;
169 <TH ALIGN=left>$_</TH>
170 EOF
171                 }
172         }
173         return $out;
174
175 }
176 EOR