diff options
Diffstat (limited to 'httemplate/elements/auto-table.html')
-rw-r--r-- | httemplate/elements/auto-table.html | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/httemplate/elements/auto-table.html b/httemplate/elements/auto-table.html new file mode 100644 index 0000000..9c7dfd0 --- /dev/null +++ b/httemplate/elements/auto-table.html @@ -0,0 +1,161 @@ +<%doc> + +Example: +<% include('/elements/auto-table.html', + + ### + # required + ### + + 'header' => [ '#', 'Item', 'Amount' ], + 'fields' => [ 'id', 'name', 'amount' ], + + ### + # highly recommended + ### + + 'size' => [ 4, 12, 8 ], + 'maxl' => [ 4, 12, 8 ], + 'align' => [ 'right', 'left', 'right' ], + + ### + # optional + ### + + 'data' => [ [ 1, 'Widget', 25 ], + [ 12, 'Super Widget, 7 ] ], + #or + 'records' => [ qsearch('item', { } ) ], + # or any other array of FS::Record objects + + 'select' => [ '', + [ 1 => 'option 1', + 2 => 'option 2', ... + ], # options for second field + '' ], + + 'prefix' => 'mytable_', +) %> + +Values will be passed through as "mytable_id1", etc. +</%doc> + +<TABLE ID="<% $prefix %>AutoTable" BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0> + <TR> +% foreach (@header) { + <TH><% $_ %></TH> +% } + </TR> +% my $row = 0; +% for ( $row = 0; $row < scalar @data; $row++ ) { + <TR> +% my $col = 0; +% for ( $col = 0; $col < scalar @fields; $col++ ) { +% my $id = $prefix . $fields[$col] . $row; + <TD> +% my @o = @{ $select[$col] }; +% if( @o ) { + <SELECT NAME="<% $id %>" ID="<% $id %>"> +% while(@o) { +% my $val = shift @o; + <OPTION VALUE=<% $val %><% +$val eq $data[$row][$col] ? ' SELECTED' : ''%>><% shift @o %></OPTION> +% } + </SELECT> +% } +% else { + <INPUT TYPE = "text" + NAME = "<% $id %>" + ID = "<% $id %>" + SIZE = <% $size[$col] %> + MAXLENGTH = <% $maxl[$col] %> + STYLE = "text-align:<% $align[$col] %>" + VALUE = "<% $data[$row][$col] %>" +% if( $opt{'autoadd'} ) { + onchange = "possiblyAddRow(this);" +% } + > + </TD> +% } +% } + <TD> + <IMG SRC = "<% "${p}images/cross.png" %>" + ALT = "X" + onclick = "deleteRow(this);" + > + </TD> + </TR> +% } +</TABLE> +% if( !$opt{'autoadd'} ) { +<INPUT TYPE="button" VALUE="Add" onclick="<% $prefix %>addRow();"><BR> +% } + +<SCRIPT TYPE="text/javascript"> + var <% $prefix %>rownum = <% $row %>; + var <% $prefix %>table = document.getElementById('<% $prefix %>AutoTable'); + // last row is initially blank, clone it and remove it + var <% $prefix %>_blank = + <% $prefix %>table.rows[<% $prefix %>table.rows.length-1].cloneNode(true); +% if( !$opt{'autoadd'} ) { + <% $prefix %>table.deleteRow(<% $prefix %>table.rows.length-1); +% } + + + + function rownum_of(obj) { + return (obj.parentNode.parentNode.sectionRowIndex); + } + + function <% $prefix %>possiblyAddRow(obj) { + if ( <% $prefix %>rownum == rownum_of(obj) ) { + <% $prefix %>addRow(); + } + } + + function <% $prefix %>addRow() { + var row = <% $prefix %>table.insertRow(-1); + var cells = <% $prefix %>_blank.cells; + for (i=0; i<cells.length; i++) { + row.appendChild(cells[i].cloneNode(true)); + } + <% $prefix %>rownum++; + } + + function deleteRow(obj) { + if(<% $prefix %>rownum == rownum_of(obj)) { + <% $prefix %>addRow(); + } + <% $prefix %>table.deleteRow(rownum_of(obj)); + <% $prefix %>rownum--; + return(false); + } + +</SCRIPT> + +<%init> +my %opt = @_; + +my @header = @{ $opt{'header'} }; +my @fields = @{ $opt{'fields'} }; +my @data = (); +if($opt{'data'}) { + @data = @{ $opt{'data'} }; +} +elsif($opt{'records'}) { + foreach my $rec (@{ $opt{'records'} }) { + push @data, [ map { $rec->getfield($_) } @fields ]; + } +} +# else @data = (); +push @data, [ map {''} @fields ]; # make a blank row + +my $prefix = $opt{'prefix'}; +my @size = $opt{'size'} ? @{ $opt{'size'} } : (map {16} @fields); +my @maxl = $opt{'maxl'} ? @{ $opt{'maxl'} } : @size; +my @align = $opt{'align'} ? @{ $opt{'align'} } : (map {'right'} @fields); +my @select = @{ $opt{'select'} || [] }; +foreach (0..scalar(@fields)-1) { + $select[$_] ||= []; +} +</%init> |