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
31 'prefix' => 'mytable_',
34 Values will be passed through as "mytable_id1", etc.
37 <TABLE ID="<% $prefix %>AutoTable" BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0>
44 % for ( $row = 0; $row < scalar @data; $row++ ) {
47 % for ( $col = 0; $col < scalar @fields; $col++ ) {
48 % my $id = $prefix . $fields[$col] . $row;
53 SIZE = <% $size[$col] %>
54 MAXLENGTH = <% $maxl[$col] %>
55 STYLE = "text-align:<% $align[$col] %>"
56 VALUE = "<% $data[$row][$col] %>"
57 onchange = "possiblyAddRow();"
62 <IMG SRC = "<% "${p}images/cross.png" %>"
64 onclick = "deleteThisRow(this);"
71 <SCRIPT TYPE="text/javascript">
72 var <% $prefix %>rownum = <% $row %>;
73 var <% $prefix %>table = document.getElementById('<% $prefix %>AutoTable');
75 function rownum_of(obj) {
76 return (obj.parentNode.parentNode.sectionRowIndex);
79 function possiblyAddRow() {
80 if ( <% $prefix %>rownum == rownum_of(this) ) {
81 <% $prefix %>addRow();
85 function <% $prefix %>addRow() {
86 var row = <% $prefix %>table.insertRow(<% $prefix %>rownum + 1);
88 % for( $col = 0; $col < scalar @fields; $col++ ) {
89 % my $field = $prefix.$fields[$col];
90 var <% $field %>_cell = document.createElement('TD');
91 var <% $field %>_input = document.createElement('INPUT');
92 <% $field %>_input.setAttribute('name', '<% $field %>'+<% $prefix %>rownum);
93 <% $field %>_input.setAttribute('id', '<% $field %>'+<% $prefix %>rownum);
94 <% $field %>_input.setAttribute('type', 'text');
95 <% $field %>_input.setAttribute('size', <% $size[$col] %>);
96 <% $field %>_input.setAttribute('maxlength', <% $maxl[$col] %>);
97 <% $field %>_input.style.textAlign = '<% $align[$col] %>';
98 <% $field %>_input.onchange = possiblyAddRow;
99 <% $field %>_cell.appendChild(<% $field %>_input);
100 row.appendChild(<% $field %>_cell);
102 var delcell = document.createElement('TD');
103 var delinput = document.createElement('IMG');
104 delinput.setAttribute('src', '<% "${p}images/cross.png" %>');
105 delinput.setAttribute('alt', 'X');
106 delinput.setAttribute('onclick', 'deleteThisRow(this);');
107 delcell.appendChild(delinput);
108 row.appendChild(delcell);
110 <% $prefix %>rownum++;
113 function deleteThisRow(obj) {
114 if(<% $prefix %>rownum == rownum_of(obj)) {
115 <% $prefix %>addRow();
117 <% $prefix %>table.deleteRow(rownum_of(obj));
118 <% $prefix %>rownum--;
122 <% $prefix %>addRow();
128 my @header = @{ $opt{'header'} };
129 my @fields = @{ $opt{'fields'} };
132 @data = @{ $opt{'data'} };
134 elsif($opt{'records'}) {
135 foreach my $rec (@{ $opt{'records'} }) {
136 push @data, [ map { $rec->getfield($_) } @fields ];
141 my $prefix = $opt{'prefix'};
142 my @size = $opt{'size'} ? @{ $opt{'size'} } : (map {16} @fields);
143 my @maxl = $opt{'maxl'} ? @{ $opt{'maxl'} } : @size;
144 my @align = $opt{'align'} ? @{ $opt{'align'} } : (map {'right'} @fields);