summaryrefslogtreecommitdiff
path: root/httemplate/elements/tr-select-router_block_ip.html
blob: 11f7c48317d3280190a0b03166239c5fd9ef9524 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<script type="text/javascript">
var manual_addr_routernum = <% encode_json(\%manual_addr_routernum) %>;
var ip_addr_curr_value = <% $opt{'ip_addr'} |js_string %>;
var blocknum_curr_value = <% $opt{'blocknum'} |js_string %>;
function update_ip_addr(obj, i) {
  var routernum = document.getElementById('router_select_0').value;
  var select_blocknum = document.getElementById('router_select_1');
  var blocknum = select_blocknum.value;
  var input_ip_addr = document.getElementById('input_ip_addr');
  if ( manual_addr_routernum[routernum] == 'Y' ) {
%# hide block selection and default ip address to its previous value
    select_blocknum.style.display = 'none';
    input_ip_addr.value = ip_addr_curr_value;
  }
  else {
%# the reverse
    select_blocknum.style.display = '';
%# default ip address to null, unless the router/block are set to the 
%# previous value, in which case default it to current value
    if ( routernum == router_curr_values[0] &&
         blocknum  == router_curr_values[1] ) {
      input_ip_addr.value = ip_addr_curr_value;
    } else {
      input_ip_addr.value = <% mt('(automatic)') |js_string %>;
    }
  }
}
function clearhint_ip_addr (what) {
  if ( what.value == <% mt('(automatic)') |js_string %> )
    what.value = '';
}
</script>
<& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router') &>
<td>
  <& /elements/select-tiered.html, prefix => 'router_', tiers => [
  {
    field     => 'routernum',
    records   => \@routers,
    name_col  => 'routername',
    value_col => 'routernum',
    onchange  => 'update_ip_addr',
    curr_value=> $opt{'routernum'},
  },
  {
    field     => 'blocknum',
    table     => 'addr_block',
    hashref   => (exists($fixed{'blocknum'}) ? 
                    { blocknum => $fixed{'blocknum'} } : {}
                 ),
    name_col  => 'cidr',
    link_col  => 'routernum',
    empty_label => '(any)',
    onchange  => 'update_ip_addr',
    curr_value  => $opt{'blocknum'},
  },
]
&>
</td></tr>
<& /elements/tr-td-label.html, label => 'IP address' &>
<td>
% warn Dumper \%fixed;
% if ( exists $fixed{$ip_field} ) {
  <input type="hidden" id="input_ip_addr" name="<% $ip_field %>" 
    value="<% $opt{'ip_addr'} |h%>"><% $opt{'ip_addr'} || '' %>
% }
% else {
  <input type="text" id="input_ip_addr" name="<% $ip_field %>" 
  value="<% $opt{'ip_addr'} |h%>" onfocus="clearhint_ip_addr(this)">
% }
</td> </tr>
<script type="text/javascript">
update_ip_addr();
</script>
<%init>

my %opt = @_;
my @routers;
my $conf = FS::Conf->new;

my $svc_x = $opt{'object'};
if ( $svc_x ) {
  # $svc_x->ip_addr does work, even for non-svc_broadband.
  $opt{$_} = $svc_x->$_
    foreach qw(routernum blocknum ip_addr svcpart);
  if ( $svc_x->svcnum ) {
    $opt{'svcpart'} = $svc_x->cust_svc->svcpart;
  }
}

my $svcpart = $opt{'svcpart'} || '';
my $ip_field = $opt{'ip_field'} || 'ip_addr';

my %fixed; #  which fields are fixed
$svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'";
if ( $svcpart ) {
  my $part_svc = FS::part_svc->by_key($svcpart);
  # Traditionally, columnflag 'F' on IP address means that it MUST 
  # be auto-assigned (or, if null IP addresses are allowed, that 
  # it must be null).
  foreach (qw(routernum blocknum), $ip_field) {
    my $psc = $part_svc->part_svc_column($_);
    if ( $psc and $psc->columnflag eq 'F' ) {
      $fixed{$_} = $psc->columnvalue;
    }
  }
  if ( exists $fixed{'routernum'} ) {
    @routers = (FS::router->by_key($fixed{'routernum'}))
  }
  else {
    @routers = map { $_->router } 
      qsearch('part_svc_router', { svcpart => $svcpart });
  }
}
else {
  @routers = qsearch('router', {});
}

my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers;

if ( $conf->exists('auto_router') ) {
  # Then show an "(automatic)" router, with no blocks.  manual_addr is on
  # so that the ip_addr field will be unlocked.
  unshift @routers, FS::router->new({
      'routernum'   => '',
      'routername'  => '(automatic)',
      'manual_addr' => 'Y',
  });
  $manual_addr_routernum{''} = 'Y';
}

</%init>