ee135686c1c85f320023e5c9c2ac0a64d07b1405
[freeside.git] / httemplate / elements / tr-select-router_block_ip.html
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;
14   }
15   else {
16 %# the reverse
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;
23     } else {
24       input_ip_addr.value = <% mt('(automatic)') |js_string %>;
25     }
26   }
27 }
28 function clearhint_ip_addr (what) {
29   if ( what.value == <% mt('(automatic)') |js_string %> )
30     what.value = '';
31 }
32 </script>
33 <& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router'), required => $opt{'required'} &>
34 <td>
35   <& /elements/select-tiered.html, prefix => 'router_', tiers => [
36   {
37     field     => 'routernum',
38     records   => \@routers,
39     name_col  => 'routername',
40     value_col => 'routernum',
41     onchange  => 'update_ip_addr',
42     curr_value=> $opt{'routernum'},
43   },
44   {
45     field     => 'blocknum',
46     table     => 'addr_block',
47     hashref   => (exists($fixed{'blocknum'}) ? 
48                     { blocknum => $fixed{'blocknum'} } : {}
49                  ),
50     name_col  => 'cidr',
51     link_col  => 'routernum',
52     empty_label => '(any)',
53     onchange  => 'update_ip_addr',
54     curr_value  => $opt{'blocknum'},
55   },
56 ]
57 &>
58 </td></tr>
59 <& /elements/tr-td-label.html, label => 'IP address', required => $opt{'ip_addr_required'} &>
60 <td>
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'} || '' %>
65 % }
66 % else {
67   <input type="text" id="input_ip_addr" name="<% $ip_field %>" 
68   value="<% $opt{'ip_addr'} |h%>" onfocus="clearhint_ip_addr(this)">
69 % }
70 </td> </tr>
71 <script type="text/javascript">
72 update_ip_addr();
73 </script>
74 <%init>
75
76 my %opt = @_;
77 my @routers;
78 my $conf = FS::Conf->new;
79
80 my $svc_x = $opt{'object'};
81 if ( $svc_x ) {
82   # $svc_x->ip_addr does work, even for non-svc_broadband.
83   $opt{$_} = $svc_x->$_
84     foreach qw(routernum blocknum ip_addr svcpart);
85   if ( $svc_x->svcnum ) {
86     $opt{'svcpart'} = $svc_x->cust_svc->svcpart;
87   }
88 }
89
90 my $svcpart = $opt{'svcpart'} || '';
91 my $ip_field = $opt{'ip_field'} || 'ip_addr';
92
93 my %fixed; #  which fields are fixed
94 $svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'";
95 if ( $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 
99   # it must be null).
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;
104     }
105   }
106   if ( exists $fixed{'routernum'} ) {
107     @routers = (FS::router->by_key($fixed{'routernum'}))
108   }
109   else {
110     @routers = map { $_->router } 
111       qsearch('part_svc_router', { svcpart => $svcpart });
112   }
113 }
114 else {
115   @routers = qsearch('router', {});
116 }
117
118 my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers;
119
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({
124       'routernum'   => '',
125       'routername'  => '(automatic)',
126       'manual_addr' => 'Y',
127   });
128   $manual_addr_routernum{''} = 'Y';
129 }
130
131 </%init>