1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
<%doc>
Common code for editing invoice/quotation details/comments.
Expects to be the last element in a two-column table with specified id
<& /edit/elements/detail-table.html,
id => 'element_id', # required
details => \@details, # plain text strings, existing details
label => 'Comments', # optional, shows on first row only
field => 'comment', # input field name/id, appended with rownum, default 'detail'
&>
</%doc>
<SCRIPT>
% unless ($detail_table_init) {
% $detail_table_init = 1;
var detail_table_info = {};
detail_table_info.rownum = {};
detail_table_info.label = {};
detail_table_info.field = {};
function possiblyAddDetailRow(tableid,rownum) {
if (( detail_table_info.rownum[tableid] - rownum == 1 ) || !detail_table_info.rownum[tableid]) {
addDetailRow(tableid);
}
}
function addDetailRow(tableid,newtext) {
var table = document.getElementById(tableid);
var newrownum = detail_table_info.rownum[tableid];
var newfield = detail_table_info.field[tableid] + newrownum;
var row = document.createElement('TR');
var empty_cell = document.createElement('TD');
if (!newrownum) {
empty_cell.innerHTML = detail_table_info.label[tableid];
empty_cell.style.textAlign = 'right';
}
row.appendChild(empty_cell);
var detail_cell = document.createElement('TD');
var detail_input = document.createElement('INPUT');
detail_input.setAttribute('name', newfield);
detail_input.setAttribute('id', newfield);
detail_input.setAttribute('size', 60);
detail_input.setAttribute('maxLength', 65);
detail_input.onkeyup = function () { possiblyAddDetailRow(tableid,newrownum) };
detail_input.onchange = function () { possiblyAddDetailRow(tableid,newrownum) };
detail_input.value = newtext || '';
detail_cell.appendChild(detail_input);
row.appendChild(detail_cell);
table.appendChild(row);
detail_table_info.rownum[tableid]++;
}
% } # end init
detail_table_info.label['<% $id %>'] = '<% emt($label) %>';
detail_table_info.field['<% $id %>'] = '<% $field %>';
detail_table_info.rownum['<% $id %>'] = 0;
% foreach my $detail ( @details ) {
addDetailRow('<% $id %>','<% $detail %>');
% }
</SCRIPT>
<%shared>
my $detail_table_init = 0;
</%shared>
<%init>
my %opt = @_;
my @details = $opt{'details'} ? @{ $opt{'details'} } : ();
push(@details,'') if $details[$#details] || !@details;
my $id = $opt{'id'} or die "No id specified";
my $label = $opt{'label'} || '';
my $field = $opt{'field'} || 'detail';
</%init>
|