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 },
15 { field => 'sectornum',
16 type => 'tower_sector',
17 o2m_table => 'tower_sector',
19 m2_error_callback => $m2_error_callback,
22 labels => { 'towernum' => 'Tower',
23 'towername' => 'Name',
24 'sectornum' => 'Sector',
25 'disabled' => 'Disabled',
26 'default_ip_addr' => 'Tower IP address',
27 'latitude' => 'Latitude',
28 'longitude' => 'Longitude',
29 'altitude' => 'Altitude',
31 'veg_height' => 'Vegetation height',
37 my $m2_error_callback = sub { # reconstruct the list
38 my ($cgi, $object) = @_;
40 my @fields = qw( sectorname ip_addr height freq_mhz direction width range );
43 new FS::tower_sector {
44 'towernum' => $object->towernum,
45 'sectornum' => scalar( $cgi->param($k) ),
46 map { $_ => scalar( $cgi->param($k.'_'.$_) ) } @fields,
48 } grep length($cgi->param($_.'_sectorname')),
49 grep /^sectornum\d+$/,
53 my $default_ip_addr_callback = sub {
54 my ($cgi, $object) = @_;
55 my $sector = $object ? $object->default_sector : '';
56 $sector ? $sector->ip_addr : '';