4 <% include('/elements/auto-table.html',
10 'header' => [ '#', 'Item', 'Amount' ],
11 'fields' => [ 'id', 'name', 'amount' ],
17 'size' => [ 4, 12, 8 ],
18 'maxl' => [ 4, 12, 8 ],
19 'align' => [ 'right', 'left', 'right' ],
25 'data' => [ [ 1, 'Widget', 25 ],
26 [ 12, 'Super Widget, 7 ] ],
28 'records' => [ qsearch('item', { } ) ],
29 # or any other array of FS::Record objects
34 ], # options for second field
37 'prefix' => 'mytable_',
40 Values will be passed through as "mytable_id1", etc.
43 <TABLE ID="<% $prefix %>AutoTable" BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0>
50 % for ( $row = 0; $row < scalar @data; $row++ ) {
53 % for ( $col = 0; $col < scalar @fields; $col++ ) {
54 % my $id = $prefix . $fields[$col];
55 % # don't suffix rownum in the final, blank row
56 % $id .= $row if $row < (scalar @data) - 1;
58 % my @o = @{ $select[$col] };
60 <SELECT NAME="<% $id %>" ID="<% $id %>">
63 <OPTION VALUE=<% $val %><%
64 $val eq $data[$row][$col] ? ' SELECTED' : ''%>><% shift @o %></OPTION>
72 SIZE = <% $size[$col] %>
73 MAXLENGTH = <% $maxl[$col] %>
74 STYLE = "text-align:<% $align[$col] %>"
75 VALUE = "<% $data[$row][$col] %>"
76 % if( $opt{'autoadd'} ) {
77 onchange = "possiblyAddRow(this);"
84 <IMG SRC = "<% "${p}images/cross.png" %>"
86 onclick = "deleteRow(this);"
92 % if( !$opt{'autoadd'} ) {
93 <INPUT TYPE="button" VALUE="Add" onclick="<% $prefix %>addRow();"><BR>
96 <SCRIPT TYPE="text/javascript">
97 var <% $prefix %>rownum = <% $row %>;
98 var <% $prefix %>table = document.getElementById('<% $prefix %>AutoTable');
99 // last row is initially blank, clone it and remove it
100 var <% $prefix %>_blank =
101 <% $prefix %>table.rows[<% $prefix %>table.rows.length-1].cloneNode(true);
102 % if( !$opt{'autoadd'} ) {
103 <% $prefix %>table.deleteRow(<% $prefix %>table.rows.length-1);
108 function rownum_of(obj) {
109 return (obj.parentNode.parentNode.sectionRowIndex);
112 function <% $prefix %>possiblyAddRow(obj) {
113 if ( <% $prefix %>rownum == rownum_of(obj) ) {
114 <% $prefix %>addRow();
118 function <% $prefix %>addRow() {
119 var row = <% $prefix %>table.insertRow(-1);
120 var cells = <% $prefix %>_blank.cells;
121 for (i=0; i<cells.length; i++) {
122 var node = row.appendChild(cells[i].cloneNode(true));
123 var input = node.children[0];
124 input.id = input.id + row.sectionRowIndex;
125 input.name = input.name + row.sectionRowIndex;
127 <% $prefix %>rownum++;
130 function deleteRow(obj) {
131 if(<% $prefix %>rownum == rownum_of(obj)) {
132 <% $prefix %>addRow();
134 <% $prefix %>table.deleteRow(rownum_of(obj));
135 <% $prefix %>rownum--;
144 my @header = @{ $opt{'header'} };
145 my @fields = @{ $opt{'fields'} };
148 @data = @{ $opt{'data'} };
150 elsif($opt{'records'}) {
151 foreach my $rec (@{ $opt{'records'} }) {
152 push @data, [ map { $rec->getfield($_) } @fields ];
156 push @data, [ map {''} @fields ]; # make a blank row
158 my $prefix = $opt{'prefix'};
159 my @size = $opt{'size'} ? @{ $opt{'size'} } : (map {16} @fields);
160 my @maxl = $opt{'maxl'} ? @{ $opt{'maxl'} } : @size;
161 my @align = $opt{'align'} ? @{ $opt{'align'} } : (map {'right'} @fields);
162 my @select = @{ $opt{'select'} || [] };
163 foreach (0..scalar(@fields)-1) {