Merge branch 'master' of git.freeside.biz:/home/git/freeside
[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 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;
13   }
14   else {
15 %# the reverse
16     select_blocknum.style.display = '';
17     input_ip_addr.disabled = true;
18     input_ip_addr.value = '(automatic)';
19   }
20 }
21 </script>
22 <& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router') &>
23 <td>
24   <& /elements/select-tiered.html, prefix => 'router_', tiers => [
25   {
26     field     => 'routernum',
27     records   => \@routers,
28     name_col  => 'routername',
29     value_col => 'routernum',
30     onchange  => 'lock_ip_addr',
31     curr_value=> $opt{'routernum'},
32   },
33   {
34     field     => 'blocknum',
35     table     => 'addr_block',
36     hashref   => (exists($fixed{'blocknum'}) ? 
37                     { blocknum => $fixed{'blocknum'} } : {}
38                  ),
39     name_col  => 'cidr',
40     link_col  => 'routernum',
41     empty_label => '(any)',
42     curr_value  => $opt{'blocknum'},
43   },
44 ]
45 &>
46 </td></tr>
47 <& /elements/tr-td-label.html, label => 'IP address' &>
48 <td>
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'} || '' %>
52 % }
53 % else {
54   <input type="text" id="input_ip_addr" name="ip_addr" 
55   value="<% $opt{'ip_addr'} |h%>">
56 % }
57 </td> </tr>
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);
61 </script>
62 <%init>
63
64 my %opt = @_;
65 my @routers;
66 my $conf = FS::Conf->new;
67
68 my $svc_x = $opt{'object'};
69 if ( $svc_x ) {
70   $opt{$_} = $svc_x->$_
71     foreach qw(routernum blocknum ip_addr svcpart);
72   if ( $svc_x->svcnum ) {
73     $opt{'svcpart'} = $svc_x->cust_svc->svcpart;
74   }
75 }
76
77 my $svcpart = $opt{'svcpart'} || '';
78 my %fixed; #  which fields are fixed
79 $svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'";
80 if ( $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 
84   # it must be null).
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;
89     }
90   }
91   if ( $fixed{'routernum'} ) {
92     @routers = (FS::router->by_key($fixed{'routernum'}))
93   }
94   else {
95     @routers = map { $_->router } 
96       qsearch('part_svc_router', { svcpart => $svcpart });
97   }
98 }
99 else {
100   @routers = qsearch('router', {});
101 }
102
103 my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers;
104
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({
109       'routernum'   => '',
110       'routername'  => '(automatic)',
111       'manual_addr' => 'Y',
112   });
113   $manual_addr_routernum{''} = 'Y';
114 }
115
116 </%init>