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 var blocknum_curr_value = <% $opt{'blocknum'} |js_string %>;
5 function update_ip_addr(obj, i) {
6 var routernum = document.getElementById('router_select_0').value;
7 var select_blocknum = document.getElementById('router_select_1');
8 var blocknum = select_blocknum.value;
9 var input_ip_addr = document.getElementById('input_ip_addr');
10 if ( manual_addr_routernum[routernum] == 'Y' ) {
11 %# hide block selection and default ip address to its previous value
12 select_blocknum.style.display = 'none';
13 input_ip_addr.value = ip_addr_curr_value;
17 select_blocknum.style.display = '';
18 %# default ip address to null, unless the router/block are set to the
19 %# previous value, in which case default it to current value
20 if ( routernum == router_curr_values[0] &&
21 blocknum == router_curr_values[1] ) {
22 input_ip_addr.value = ip_addr_curr_value;
24 input_ip_addr.value = <% mt('(automatic)') |js_string %>;
28 function clearhint_ip_addr (what) {
29 if ( what.value == <% mt('(automatic)') |js_string %> )
33 <& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router') &>
35 <& /elements/select-tiered.html, prefix => 'router_', tiers => [
39 name_col => 'routername',
40 value_col => 'routernum',
41 onchange => 'update_ip_addr',
42 curr_value=> $opt{'routernum'},
46 table => 'addr_block',
47 hashref => (exists($fixed{'blocknum'}) ?
48 { blocknum => $fixed{'blocknum'} } : {}
51 link_col => 'routernum',
52 empty_label => '(any)',
53 onchange => 'update_ip_addr',
54 curr_value => $opt{'blocknum'},
59 <& /elements/tr-td-label.html, label => 'IP address' &>
61 % warn Dumper \%fixed;
62 % if ( exists $fixed{$ip_field} ) {
63 <input type="hidden" id="input_ip_addr" name="<% $ip_field %>"
64 value="<% $opt{'ip_addr'} |h%>"><% $opt{'ip_addr'} || '' %>
67 <input type="text" id="input_ip_addr" name="<% $ip_field %>"
68 value="<% $opt{'ip_addr'} |h%>" onfocus="clearhint_ip_addr(this)">
71 <script type="text/javascript">
78 my $conf = FS::Conf->new;
80 my $svc_x = $opt{'object'};
82 # $svc_x->ip_addr does work, even for non-svc_broadband.
84 foreach qw(routernum blocknum ip_addr svcpart);
85 if ( $svc_x->svcnum ) {
86 $opt{'svcpart'} = $svc_x->cust_svc->svcpart;
90 my $svcpart = $opt{'svcpart'} || '';
91 my $ip_field = $opt{'ip_field'} || 'ip_addr';
93 my %fixed; # which fields are fixed
94 $svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'";
96 my $part_svc = FS::part_svc->by_key($svcpart);
97 # Traditionally, columnflag 'F' on IP address means that it MUST
98 # be auto-assigned (or, if null IP addresses are allowed, that
100 foreach (qw(routernum blocknum), $ip_field) {
101 my $psc = $part_svc->part_svc_column($_);
102 if ( $psc and $psc->columnflag eq 'F' ) {
103 $fixed{$_} = $psc->columnvalue;
106 if ( exists $fixed{'routernum'} ) {
107 @routers = (FS::router->by_key($fixed{'routernum'}))
110 @routers = map { $_->router }
111 qsearch('part_svc_router', { svcpart => $svcpart });
115 @routers = qsearch('router', {});
118 my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers;
120 if ( $conf->exists('auto_router') ) {
121 # Then show an "(automatic)" router, with no blocks. manual_addr is on
122 # so that the ip_addr field will be unlocked.
123 unshift @routers, FS::router->new({
125 'routername' => '(automatic)',
126 'manual_addr' => 'Y',
128 $manual_addr_routernum{''} = 'Y';