-<%
+<%doc>
- ##required
- # 'table' => 'table_name',
- # 'name_col' => 'name_column',
- #
- ##strongly recommended (you want your forms to be "sticky" on errors, right?)
- # 'value' => 'current_value',
- #
- ##opt
- # 'empty_label' => '', #better specify it though, the default might change
- # 'hashref' => {},
- # 'records' => \@records, #instead of hashref
+Example:
- my( %opt ) = @_;
+ include( '/elements/select-table.html',
- my $key = dbdef->table($opt{'table'})->primary_key; #? $opt{'primary_key'} ||
+ #required
+ 'table' => 'table_name',
+ 'name_col' => 'name_column',
+
+ #strongly recommended (you want your forms to be "sticky" on errors, right?)
+ 'curr_value' => 'current_value',
+ #'value' => #deprecated form of 'curr_value',
+
+ #opt
+ 'empty_label' => '', #better specify it though, the default might change
+ 'hashref' => {},
+ 'extra_sql' => '',
+ 'records' => \@records, #instead of hashref
+ 'pre_options' => [ 'value' => 'option' ], #before normal options
+ 'element_name' => '', #HTML element name, defaults to the name of
+ # the primary key column
+ 'field' => '', #synonym for element_name
+ 'element_etc' => '', #additional attributes (i.e. "DISABLED") for the
+ #<SELECT> element
+ 'onchange' => '', #javascript code
+ 'multiple' => 0, # bool
+ 'disable_empty' => 0, # bool (implied by multiple)
+ 'debug' => 0, #set true to enable
+ 'label_callback' => sub { my $record = shift; return "label"; },
+ )
- my $name_col = $opt{'name_col'};
+</%doc>
- my @records = ();
- if ( $opt{'records'} ) {
- @records = @{ $opt{'records'} };
- } else {
- @records = qsearch( $opt{'table'}, ( $opt{'hashref'} || {} ) );
- }
+<SELECT <% $opt{'multiple'} ? 'MULTIPLE' : '' %>
+ NAME = "<% $opt{'element_name'} || $opt{'field'} || $key %>"
+ <% $onchange %>
+ <% $opt{'element_etc'} %>
+>
-%>
+% while ( @pre_options ) {
+ <OPTION VALUE="<% shift(@pre_options) %>"><% shift(@pre_options) %>
-<SELECT NAME="<%= $key %>">
+% }
- <OPTION VALUE=""><%= $opt{'empty_label'} || 'all' %></OPTION>
+% unless ( $opt{'multiple'} || $opt{'disable_empty'} ) {
+ <OPTION VALUE=""><% $opt{'empty_label'} || 'all' %>
+% }
- <% foreach my $record ( sort { $a->$name_col() cmp $b->$name_col() }
- @records
- )
- {
- %>
+% foreach my $record ( sort { $a->$name_col() cmp $b->$name_col() } @records ) {
+% my $recvalue = $record->$key();
+ <OPTION VALUE="<% $recvalue %>"
+ <% ref($value) && $value->{$recvalue} || $value == $recvalue
+ ? ' SELECTED' : ''
+ %>
+ ><% $opt{'label_callback'}
+ ? &{ $opt{'label_callback'} }( $record )
+ : $record->$name_col()
+ %>
+% }
- <OPTION VALUE="<%= $record->$key() %>"<%= $opt{'value'} == $record->$key() ? ' SELECTED' : '' %>><%= $record->$name_col() %>
+</SELECT>
- <% } %>
+<%init>
-</SELECT>
+my( %opt ) = @_;
+
+warn "elements/select-table.html: \n". Dumper(%opt)
+ if exists $opt{debug} && $opt{debug};
+
+my $onchange = $opt{'onchange'}
+ ? 'onChange="'. $opt{'onchange'}. '(this)"'
+ : '';
+
+my $key = dbdef->table($opt{'table'})->primary_key; #? $opt{'primary_key'} ||
+
+my $name_col = $opt{'name_col'};
+
+my $value = $opt{'curr_value'} || $opt{'value'};
+$value = [ split(/\s*,\s*/, $value) ] if $opt{'multiple'} && $value =~ /,/;
+
+my @records = ();
+if ( $opt{'records'} ) {
+ @records = @{ $opt{'records'} };
+} else {
+ @records = qsearch( {
+ 'table' => $opt{'table'},
+ 'hashref' => ( $opt{'hashref'} || {} ),
+ 'extra_sql' => ( $opt{'extra_sql'} || '' ),
+ });
+}
+
+unless ( ! $value
+ or ref($value)
+ or ! exists( $opt{hashref}->{disabled} ) #??
+ or grep { $value == $_->$key() } @records
+ ) {
+ delete $opt{hashref}->{disabled};
+ $opt{hashref}->{$key} = $value;
+ my $record = qsearchs( {
+ 'table' => $opt{table},
+ 'hashref' => $opt{hashref},
+ 'extra_sql' => ( $opt{extra_sql} || '' ),
+ });
+ push @records, $record if $record;
+}
+
+if ( ref( $value ) eq 'ARRAY' ) {
+ $value = { map { $_ => 1 } @$value };
+}
+
+my @pre_options = $opt{pre_options} ? @{ $opt{pre_options} } : ();
+</%init>