RT# 30783 js fix for ip selection
[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
6 function update_ip_addr() {
7   var routernum = $('#router_select_0').val() || "";
8   var blocknum  = $('#router_select_1').val() || "";
9   var e_input_ip_addr = $('#input_ip_addr');
10   var e_router_select_1 = $('#router_select_1');
11
12   <% # Is block is automatically selected for this router? %>
13   if ( manual_addr_routernum[routernum] == 'Y' ) {
14     show_ip_input();
15     hide_ip_select();
16     e_router_select_1.hide();
17     e_input_ip_addr.val( ip_addr_curr_value );
18   } else {
19     e_router_select_1.show();
20     e_input_ip_addr.attr('placeholder', <% mt('(automatic)') | js_string %> );
21     if ( routernum == router_curr_values[0] &&
22          blocknum == router_curr_values[1] ) {
23       e_input_ip_addr.val( ip_addr_curr_value );
24     } else {
25       e_input_ip_addr.val('');
26     }
27   }
28   show_or_hide_toggle_ip();
29   populate_ip_select();
30 }
31
32 function toggle_ip_input() {
33   if ( $('#input_ip_addr').is(':hidden') ) {
34     show_ip_input();
35   } else {
36     show_ip_select();
37   }
38 }
39
40 function show_ip_input() {
41   $('#input_ip_addr').show();
42   $('#select_ip_addr').hide();
43   depopulate_ip_select();
44 }
45
46 function show_ip_select() {
47   var e_input_ip_addr = $('#input_ip_addr');
48   var e_select_ip_addr = $('#select_ip_addr');
49
50   e_select_ip_addr.width( e_input_ip_addr.width() );
51   e_input_ip_addr.hide();
52   e_select_ip_addr.show();
53   populate_ip_select();
54 }
55
56 function populate_ip_select() {
57   depopulate_ip_select();
58   var e = $('#select_ip_addr');
59   var blocknum = $('#router_select_1').val();
60
61   var opts = [ '<option value="">loading...</option>' ];
62   e.html(opts.join(''));
63
64 % if ( $opt{ip_addr} ) {
65   opts = [
66     '<option value="<% $opt{ip_addr} |h %>"><% $opt{ip_addr} |h %></option>',
67     '<option value="">-----------</option>'
68   ];
69 % } else {
70   opts = [ '<option value=""><% mt('(automatic)') |h %></option>' ];
71 % }
72   if ( blocknum && $.isNumeric(blocknum) && ! e.is(':hidden')) {
73     $.getJSON(
74       '<% $p %>misc/xmlhttp-free_addresses_in_block.json.html',
75       {blocknum: blocknum},
76       function(ip_json) {
77         $.each( ip_json, function(idx, val) {
78           opts.push(
79             '<option' + (val == ip_addr_curr_value ? 'selected' : '') + '>'
80             + val
81             + '</option>'
82           );
83         });
84         e.html(opts.join(''));
85       }
86     );
87   }
88 }
89
90 function depopulate_ip_select() {
91   $('#select_ip_addr').children().remove();
92 }
93
94 function propogate_ip_select() {
95   $('#input_ip_addr').val( $('#select_ip_addr').val() );
96 }
97
98 function show_or_hide_toggle_ip() {
99   if ( $('#router_select_1').val() ) {
100     $('#toggle_ip').show();
101   } else {
102     show_ip_input();
103     $('#toggle_ip').hide();
104   }
105 }
106
107 </script>
108
109 <& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router'), required => $opt{'required'} &>
110 <td>
111   <& /elements/select-tiered.html, prefix => 'router_', tiers => [
112   {
113     field     => 'routernum',
114     records   => \@routers,
115     name_col  => 'routername',
116     value_col => 'routernum',
117     onchange  => 'update_ip_addr',
118     curr_value=> $opt{'routernum'},
119   },
120   {
121     field     => 'blocknum',
122     table     => 'addr_block',
123     hashref   => (exists($fixed{'blocknum'}) ? 
124                     { blocknum => $fixed{'blocknum'} } : {}
125                  ),
126     name_col  => 'cidr',
127     link_col  => 'routernum',
128     empty_label => '(any)',
129     onchange  => 'update_ip_addr',
130     curr_value  => $opt{'blocknum'},
131   },
132 ]
133 &>
134 </td></tr>
135 <& /elements/tr-td-label.html, label => ($opt{'ip_addr_label'} || 'IP address'), required => $opt{'ip_addr_required'} &>
136 <td>
137 % if ( exists $fixed{$ip_field} ) {
138   <input type="hidden" id="input_ip_addr" name="<% $ip_field %>" 
139     value="<% $opt{'ip_addr'} |h%>"><% $opt{'ip_addr'} || '' %>
140 % }
141 % else {
142     <input type="text"
143            id="input_ip_addr"
144            name="<% $ip_field %>"
145            value="<% $opt{'ip_addr'} | h %>"
146            onfocus="clearhint_ip_addr(this)">
147     <select id="select_ip_addr" style="display: none;" onChange='javascript:propogate_ip_select();'>
148       <option><% mt('loading') |h %>...</option>
149     </select>
150     <button type="button" onClick='javascript:toggle_ip_input();' id="toggle_ip" style="display: none;">&#9660;</button>
151 % }
152 </td> </tr>
153 <script type="text/javascript">
154 update_ip_addr();
155 </script>
156 <%init>
157
158 my %opt = @_;
159 my @routers;
160 my $conf = FS::Conf->new;
161
162 my $svc_x = $opt{'object'};
163 if ( $svc_x ) {
164   # $svc_x->ip_addr does work, even for non-svc_broadband.
165   $opt{$_} = $svc_x->$_
166     foreach qw(routernum blocknum ip_addr svcpart);
167   if ( $svc_x->svcnum ) {
168     $opt{'svcpart'} = $svc_x->cust_svc->svcpart;
169   }
170 }
171
172 my $svcpart = $opt{'svcpart'} || '';
173 my $ip_field = $opt{'ip_field'} || 'ip_addr';
174
175 my %fixed; #  which fields are fixed
176 $svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'";
177 if ( $svcpart ) {
178   my $part_svc = FS::part_svc->by_key($svcpart);
179   # Traditionally, columnflag 'F' on IP address means that it MUST 
180   # be auto-assigned (or, if null IP addresses are allowed, that 
181   # it must be null).
182   foreach (qw(routernum blocknum), $ip_field) {
183     my $psc = $part_svc->part_svc_column($_);
184     if ( $psc and $psc->columnflag eq 'F' ) {
185       $fixed{$_} = $psc->columnvalue;
186     }
187   }
188   if ( exists $fixed{'routernum'} ) {
189     @routers = (FS::router->by_key($fixed{'routernum'}))
190   }
191   else {
192     @routers = map { $_->router } 
193       qsearch('part_svc_router', { svcpart => $svcpart });
194   }
195 }
196 else {
197   @routers = qsearch('router', {});
198 }
199
200 my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers;
201
202 if ( $conf->exists('auto_router') ) {
203   # Then show an "(automatic)" router, with no blocks.  manual_addr is on
204   # so that the ip_addr field will be unlocked.
205   unshift @routers, FS::router->new({
206       'routernum'   => '',
207       'routername'  => '(automatic)',
208       'manual_addr' => 'Y',
209   });
210   $manual_addr_routernum{''} = 'Y';
211 }
212
213 </%init>