2 name_singular => 'tower',
4 viewall_dir => 'browse',
5 fields => [ 'towername',
6 { field=>'disabled', type=>'checkbox', value=>'Y', },
7 { field=>'color', type=>'pickcolor' },
8 { field => 'default_ip_addr',
9 curr_value_callback => $default_ip_addr_callback },
17 { field => 'sectornum',
18 type => 'tower_sector',
19 o2m_table => 'tower_sector',
21 m2_label_callback => sub { 'Sector #'.shift->sectornum; },
22 m2_error_callback => $m2_error_callback,
25 labels => { 'towernum' => 'Tower',
26 'towername' => 'Name',
27 'sectornum' => 'Sector',
28 'disabled' => 'Disabled',
29 'default_ip_addr' => 'Tower IP address',
30 'latitude' => 'Latitude',
31 'longitude' => 'Longitude',
32 'altitude' => 'Altitude (feet)',
33 'height' => 'Height (feet)',
34 'veg_height' => 'Vegetation height (feet)',
36 'up_rate_limit' => 'Up Rate Limit(Kbps)',
37 'down_rate_limit' => 'Down Rate Limit(Kbps)',
42 my $m2_error_callback = sub { # reconstruct the list
43 my ($cgi, $object) = @_;
46 sectorname ip_addr height freq_mhz direction width tilt v_width margin
47 sector_range up_rate_limit down_rate_limit
51 foreach my $k ($cgi->param) {
52 if ($k =~ /^sectornum\d+$/) {
53 my $sectornum = $cgi->param($k);
54 my $sector = FS::tower_sector->new({
55 'sectornum' => $sectornum,
56 'towernum' => $object->towernum,
57 map { $_ => scalar($cgi->param($k.'_'.$_)) } @fields,
59 push @sectors, $sector if length($sector->sectorname) && $sector->sectorname ne '_default';
66 my $default_ip_addr_callback = sub {
67 my ($cgi, $object) = @_;
68 my $sector = $object ? $object->default_sector : '';
69 $sector ? $sector->ip_addr : '';