summaryrefslogtreecommitdiff
path: root/httemplate/elements/tr-select-router_block_ip.html
blob: 95d1787b85565d39ed3f79b356f1fc37610bb3c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<script type="text/javascript">
var manual_addr_routernum = <% encode_json(\%manual_addr_routernum) %>;
var ip_addr_curr_value = <% $opt{'ip_addr'} |js_string %>;
var blocknum_curr_value = <% $opt{'blocknum'} |js_string %>;
function update_ip_addr(obj, i) {
  var routernum = document.getElementById('router_select_0').value;
  var select_blocknum = document.getElementById('router_select_1');
  var blocknum = select_blocknum.value;
  var input_ip_addr = document.getElementById('input_ip_addr');
  if ( manual_addr_routernum[routernum] == 'Y' ) {
%# hide block selection and default ip address to its previous value
    select_blocknum.style.display = 'none';
    input_ip_addr.value = ip_addr_curr_value;
  }
  else {
%# the reverse
    select_blocknum.style.display = '';
%# default ip address to null, unless the router/block are set to the 
%# previous value, in which case default it to current value
    if ( routernum == router_curr_values[0] &&
         blocknum  == router_curr_values[1] ) {
      input_ip_addr.value = ip_addr_curr_value;
    } else {
      input_ip_addr.value = <% mt('(automatic)') |js_string %>;
    }
  }
}
function clearhint_ip_addr (what) {
  if ( what.value == <% mt('(automatic)') |js_string %> )
    what.value = '';
}
</script>
<& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router') &>
<td>
  <& /elements/select-tiered.html, prefix => 'router_', tiers => [
  {
    field     => 'routernum',
    records   => \@routers,
    name_col  => 'routername',
    value_col => 'routernum',
    onchange  => 'update_ip_addr',
    curr_value=> $opt{'routernum'},
  },
  {
    field     => 'blocknum',
    table     => 'addr_block',
    hashref   => (exists($fixed{'blocknum'}) ? 
                    { blocknum => $fixed{'blocknum'} } : {}
                 ),
    name_col  => 'cidr',
    link_col  => 'routernum',
    empty_label => '(any)',
    onchange  => 'update_ip_addr',
    curr_value  => $opt{'blocknum'},
  },
]
&>
</td></tr>
<& /elements/tr-td-label.html, label => 'IP address' &>
<td>
% if ( $fixed{'ip_addr'} ) {
  <input type="hidden" id="input_ip_addr" name="ip_addr" 
    value="<% $opt{'ip_addr'} |h%>"><% $opt{'ip_addr'} || '' %>
% }
% else {
  <input type="text" id="input_ip_addr" name="ip_addr" 
  value="<% $opt{'ip_addr'} |h%>" onfocus="clearhint_ip_addr(this)">
% }
</td> </tr>
<script type="text/javascript">
update_ip_addr();
</script>
<%init>

my %opt = @_;
my @routers;
my $conf = FS::Conf->new;

my $svc_x = $opt{'object'};
if ( $svc_x ) {
  $opt{$_} = $svc_x->$_
    foreach qw(routernum blocknum ip_addr svcpart);
  if ( $svc_x->svcnum ) {
    $opt{'svcpart'} = $svc_x->cust_svc->svcpart;
  }
}

my $svcpart = $opt{'svcpart'} || '';
my %fixed; #  which fields are fixed
$svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'";
if ( $svcpart ) {
  my $part_svc = FS::part_svc->by_key($svcpart);
  # Traditionally, columnflag 'F' on IP address means that it MUST 
  # be auto-assigned (or, if null IP addresses are allowed, that 
  # it must be null).
  foreach (qw(routernum blocknum ip_addr)) {
    my $psc = $part_svc->part_svc_column($_);
    if ( $psc and $psc->columnflag eq 'F' ) {
      $fixed{$_} = $psc->columnvalue;
    }
  }
  if ( $fixed{'routernum'} ) {
    @routers = (FS::router->by_key($fixed{'routernum'}))
  }
  else {
    @routers = map { $_->router } 
      qsearch('part_svc_router', { svcpart => $svcpart });
  }
}
else {
  @routers = qsearch('router', {});
}

my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers;

if ( $conf->exists('auto_router') ) {
  # Then show an "(automatic)" router, with no blocks.  manual_addr is on
  # so that the ip_addr field will be unlocked.
  unshift @routers, FS::router->new({
      'routernum'   => '',
      'routername'  => '(automatic)',
      'manual_addr' => 'Y',
  });
  $manual_addr_routernum{''} = 'Y';
}

</%init>