1 <script type="text/javascript">
2 var manual_addr_routernum = <% encode_json(\%manual_addr_routernum) %>;
3 var ip_addr_curr_value = <% $opt{'ip_addr'} |js_string %>;
4 function lock_ip_addr(obj, i) {
5 var routernum = obj.value;
6 var select_blocknum = document.getElementsByName('blocknum')[0];
7 var input_ip_addr = document.getElementById('input_ip_addr');
8 if ( manual_addr_routernum[routernum] == 'Y' ) {
9 %# enable ip_addr, default it to its previous value, and hide block selection
10 select_blocknum.style.display = 'none';
11 input_ip_addr.value = ip_addr_curr_value;
12 input_ip_addr.disabled = false;
16 select_blocknum.style.display = '';
17 input_ip_addr.disabled = true;
18 input_ip_addr.value = '(automatic)';
22 <& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router') &>
24 <& /elements/select-tiered.html, prefix => 'router_', tiers => [
28 name_col => 'routername',
29 value_col => 'routernum',
30 onchange => 'lock_ip_addr',
31 curr_value=> $opt{'routernum'},
35 table => 'addr_block',
36 hashref => (exists($fixed{'blocknum'}) ?
37 { blocknum => $fixed{'blocknum'} } : {}
40 link_col => 'routernum',
41 empty_label => '(any)',
42 curr_value => $opt{'blocknum'},
47 <& /elements/tr-td-label.html, label => 'IP address' &>
49 % if ( $fixed{'ip_addr'} ) {
50 <input type="hidden" id="input_ip_addr" name="ip_addr"
51 value="<% $opt{'ip_addr'} |h%>"><% $opt{'ip_addr'} || '' %>
54 <input type="text" id="input_ip_addr" name="ip_addr"
55 value="<% $opt{'ip_addr'} |h%>">
58 <input type="hidden" name="prev_ip_addr" value="<% $opt{'ip_addr'} |h%>">
59 <script type="text/javascript">
60 lock_ip_addr(document.getElementsByName('routernum')[0],0);
66 my $conf = FS::Conf->new;
68 my $svc_x = $opt{'object'};
71 foreach qw(routernum blocknum ip_addr svcpart);
72 if ( $svc_x->svcnum ) {
73 $opt{'svcpart'} = $svc_x->cust_svc->svcpart;
77 my $svcpart = $opt{'svcpart'} || '';
78 my %fixed; # which fields are fixed
79 $svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'";
81 my $part_svc = FS::part_svc->by_key($svcpart);
82 # Traditionally, columnflag 'F' on IP address means that it MUST
83 # be auto-assigned (or, if null IP addresses are allowed, that
85 foreach (qw(routernum blocknum ip_addr)) {
86 my $psc = $part_svc->part_svc_column($_);
87 if ( $psc and $psc->columnflag eq 'F' ) {
88 $fixed{$_} = $psc->columnvalue;
91 if ( $fixed{'routernum'} ) {
92 @routers = (FS::router->by_key($fixed{'routernum'}))
95 @routers = map { $_->router }
96 qsearch('part_svc_router', { svcpart => $svcpart });
100 @routers = qsearch('router', {});
103 my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers;
105 if ( $conf->exists('auto_router') ) {
106 # Then show an "(automatic)" router, with no blocks. manual_addr is on
107 # so that the ip_addr field will be unlocked.
108 unshift @routers, FS::router->new({
110 'routername' => '(automatic)',
111 'manual_addr' => 'Y',
113 $manual_addr_routernum{''} = 'Y';