summaryrefslogtreecommitdiff
path: root/httemplate/edit/elements/detail-table.html
blob: 496ba31b3ceb16d932a861523b3fa0f40b51235e (plain)
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>