summaryrefslogtreecommitdiff
path: root/httemplate/elements/auto-table.html
diff options
context:
space:
mode:
Diffstat (limited to 'httemplate/elements/auto-table.html')
-rw-r--r--httemplate/elements/auto-table.html161
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>