diff options
author | Mark Wells <mark@freeside.biz> | 2015-09-30 22:49:38 -0700 |
---|---|---|
committer | Mark Wells <mark@freeside.biz> | 2015-09-30 22:49:38 -0700 |
commit | d07c72046444319e0811c6a00b504885da091992 (patch) | |
tree | 145b723189b757087d9984eafb96413ab994061c /httemplate | |
parent | 21b519eb5313ebe09242a2d90e1e615c56c64739 (diff) |
graphical selection of deployment zones and automatic block lookup, #30260
Diffstat (limited to 'httemplate')
-rw-r--r-- | httemplate/browse/deploy_zone.html | 6 | ||||
-rw-r--r-- | httemplate/edit/deploy_zone-fixed.html | 85 | ||||
-rw-r--r-- | httemplate/edit/deploy_zone-mobile.html | 21 | ||||
-rw-r--r-- | httemplate/edit/process/deploy_zone-fixed.html | 35 | ||||
-rw-r--r-- | httemplate/edit/process/deploy_zone-mobile.html | 19 | ||||
-rw-r--r-- | httemplate/edit/process/elements/process.html | 21 | ||||
-rw-r--r-- | httemplate/elements/polygon.html | 127 | ||||
-rw-r--r-- | httemplate/elements/tr-polygon.html | 5 | ||||
-rw-r--r-- | httemplate/misc/process/deploy_zone-block_lookup.cgi | 13 |
9 files changed, 275 insertions, 57 deletions
diff --git a/httemplate/browse/deploy_zone.html b/httemplate/browse/deploy_zone.html index 3bd9d07dd..02ebb8b8c 100644 --- a/httemplate/browse/deploy_zone.html +++ b/httemplate/browse/deploy_zone.html @@ -17,6 +17,7 @@ 'Market', 'Advertised Mbps', 'Contractual Mbps', + 'Vertices', 'Census blocks', ], fields => [ 'zonenum', @@ -42,6 +43,9 @@ ) }, sub { my $self = shift; + FS::deploy_zone_vertex->count('zonenum = '.$self->zonenum) + }, + sub { my $self = shift; FS::deploy_zone_block->count('zonenum = '.$self->zonenum) }, ], @@ -53,7 +57,7 @@ '(cir_speed_down, cir_speed_up)', ], links => [ $link_fixed, $link_fixed, ], - align => 'clllllr', + align => 'cllllrr', nohtmlheader => 1, disable_maxselect => 1, disable_total => 1, diff --git a/httemplate/edit/deploy_zone-fixed.html b/httemplate/edit/deploy_zone-fixed.html index 90d1b6667..b8d9f8bbc 100644 --- a/httemplate/edit/deploy_zone-fixed.html +++ b/httemplate/edit/deploy_zone-fixed.html @@ -54,29 +54,36 @@ value => 'Contractually guaranteed speed (Mbps)' }, 'cir_speed_down', 'cir_speed_up', - - { type => 'tablebreak-tr-title', value => 'Census blocks'}, - { field => 'file', - type => 'file-upload', - }, - { field => 'format', - type => 'hidden', - value => 'plain', - }, - { field => 'censusyear', - type => 'select', - options => [ '', qw( 2013 2012 2011 ) ], - }, - - { type => 'tablebreak-tr-title', value => '', }, - { field => 'blocknum', - type => 'deploy_zone_block', - o2m_table => 'deploy_zone_block', - m2_label => ' ', - m2_error_callback => $m2_error_callback, - }, + { type => 'tablebreak-tr-title', value => 'Footprint'}, + { field => 'vertices', + type => 'polygon', + curr_value_callback => sub { + my ($cgi, $object) = @_; + $cgi->param('vertices') || $object->vertices_json; + }, + } +# +# { type => 'tablebreak-tr-title', value => 'Census blocks'}, +# { field => 'file', +# type => 'file-upload', +# }, +# { field => 'format', +# type => 'hidden', +# value => 'plain', +# }, +# { field => 'censusyear', +# type => 'hidden', +# options => [ '', qw( 2013 2012 2011 ) ], +# }, +# +# { type => 'tablebreak-tr-title', value => '', }, +# { field => 'blocknum', +# type => 'deploy_zone_block', +# o2m_table => 'deploy_zone_block', +# m2_label => ' ', +# m2_error_callback => $m2_error_callback, +# }, ], - &> <%init> my $curuser = $FS::CurrentUser::CurrentUser; @@ -90,22 +97,22 @@ my $technology_labels = FS::part_pkg_fcc_option->technology_labels; my $media_types = FS::part_pkg_fcc_option->media_types; delete $media_types->{'Mobile Wireless'}; # cause this is the fixed zone page -my $m2_error_callback = sub { - my ($cgi, $deploy_zone) = @_; - my @blocknums = grep { - /^blocknum\d+/ and length($cgi->param($_.'_censusblock')) - } $cgi->param; - - sort { $a->censusblock <=> $b->censusblock } - map { - my $k = $_; - FS::deploy_zone_block->new({ - blocknum => scalar($cgi->param($k)), - zonenum => $deploy_zone->zonenum, - censusblock => scalar($cgi->param($k.'_censusblock')), - censusyear => scalar($cgi->param($k.'_censusyear')), - }) - } @blocknums; -}; +#my $m2_error_callback = sub { +# my ($cgi, $deploy_zone) = @_; +# my @blocknums = grep { +# /^blocknum\d+/ and length($cgi->param($_.'_censusblock')) +# } $cgi->param; +# +# sort { $a->censusblock <=> $b->censusblock } +# map { +# my $k = $_; +# FS::deploy_zone_block->new({ +# blocknum => scalar($cgi->param($k)), +# zonenum => $deploy_zone->zonenum, +# censusblock => scalar($cgi->param($k.'_censusblock')), +# censusyear => scalar($cgi->param($k.'_censusyear')), +# }) +# } @blocknums; +#}; </%init> diff --git a/httemplate/edit/deploy_zone-mobile.html b/httemplate/edit/deploy_zone-mobile.html index d049cb018..8cec298bf 100644 --- a/httemplate/edit/deploy_zone-mobile.html +++ b/httemplate/edit/deploy_zone-mobile.html @@ -49,14 +49,21 @@ 'adv_speed_down', 'adv_speed_up', { type => 'tablebreak-tr-title', value => 'Footprint'}, - { field => 'vertexnum', - type => 'deploy_zone_vertex', - o2m_table => 'deploy_zone_vertex', - m2_label => ' ', - m2_error_callback => $m2_error_callback, - }, - ], + { field => 'vertices', + type => 'polygon', + curr_value_callback => sub { + my ($cgi, $object) = @_; + $cgi->param('vertices') || $object->vertices_json; + }, + } +# { field => 'vertexnum', +# type => 'deploy_zone_vertex', +# o2m_table => 'deploy_zone_vertex', +# m2_label => ' ', +# m2_error_callback => $m2_error_callback, +# }, + ], &> <%init> my $curuser = $FS::CurrentUser::CurrentUser; diff --git a/httemplate/edit/process/deploy_zone-fixed.html b/httemplate/edit/process/deploy_zone-fixed.html index eae3a746d..0033bbe52 100644 --- a/httemplate/edit/process/deploy_zone-fixed.html +++ b/httemplate/edit/process/deploy_zone-fixed.html @@ -3,12 +3,31 @@ error_redirect => popurl(2).'deploy_zone-fixed.html', table => 'deploy_zone', viewall_dir => 'browse', - process_o2m => { - 'table' => 'deploy_zone_block', - 'fields' => [qw( censusblock censusyear )] - }, - process_upload => { - 'process' => 'misc/process/deploy_zone-import.html', - 'fields' => [qw( censusyear format )], - }, + precheck_callback => $precheck_callback, + process_o2m => + { 'table' => 'deploy_zone_vertex', + 'fields' => [qw( latitude longitude )] + }, + progress_init => [ + 'PostForm', + [ 'zonenum' ], + $fsurl.'misc/process/deploy_zone-block_lookup.cgi', + $fsurl.'browse/deploy_zone.html', + ], &> +<%init> +my $precheck_callback = sub { + # convert the vertex list into a process_o2m-style parameter list + if ( $cgi->param('vertices') ) { + my $vertices = decode_json($cgi->param('vertices')); + my $i = 0; + foreach (@$vertices) { + $cgi->param("vertexnum${i}", ''); + $cgi->param("vertexnum${i}_latitude", $_->[0]); + $cgi->param("vertexnum${i}_longitude", $_->[1]); + $i++; + } + } + ''; +}; +</%init> diff --git a/httemplate/edit/process/deploy_zone-mobile.html b/httemplate/edit/process/deploy_zone-mobile.html index 7b8f911ec..d36d5d448 100644 --- a/httemplate/edit/process/deploy_zone-mobile.html +++ b/httemplate/edit/process/deploy_zone-mobile.html @@ -2,8 +2,25 @@ error_redirect => popurl(2).'deploy_zone-mobile.html', table => 'deploy_zone', viewall_dir => 'browse', - process_o2m => + precheck_callback => $precheck_callback, + process_o2m => { 'table' => 'deploy_zone_vertex', 'fields' => [qw( latitude longitude )] }, &> +<%init> +my $precheck_callback = sub { + # convert the vertex list into a process_o2m-style parameter list + if ( $cgi->param('vertices') ) { + my $vertices = decode_json($cgi->param('vertices')); + my $i = 0; + foreach (@$vertices) { + $cgi->param("vertexnum${i}", ''); + $cgi->param("vertexnum${i}_latitude", $_->[0]); + $cgi->param("vertexnum${i}_longitude", $_->[1]); + $i++; + } + } + ''; +}; +</%init> diff --git a/httemplate/edit/process/elements/process.html b/httemplate/edit/process/elements/process.html index 69bd605f6..a76f4befb 100644 --- a/httemplate/edit/process/elements/process.html +++ b/httemplate/edit/process/elements/process.html @@ -160,7 +160,26 @@ process(); </script> <& /elements/footer.html &> -%} elsif ( $opt{'popup_reload'} ) { +% } elsif ( $opt{'progress_init'} ) { +% # some false laziness with the above +% my ($form_name, $job_fields) = @{ $opt{'progress_init'} }; +<form name="<% $form_name %>"> +% foreach my $field (@$job_fields) { + <input type="hidden" name="<% $field %>" value="<% $cgi->param($field) |h %>"> +% } +<& /elements/progress-init.html, + @{ $opt{'progress_init'} } +&> +<input type="submit" style="display:none"> +</form> +<script> +<&| /elements/onload.js &> +process(); +</&> +</script> +<& /elements/footer.html &> + +% } elsif ( $opt{'popup_reload'} ) { <% include('/elements/header-popup.html', $opt{'popup_reload'} ) %> diff --git a/httemplate/elements/polygon.html b/httemplate/elements/polygon.html new file mode 100644 index 000000000..c26e98546 --- /dev/null +++ b/httemplate/elements/polygon.html @@ -0,0 +1,127 @@ +<%init> +my %opt = @_; +my $field = $opt{'field'}; +my $id = $opt{'id'} || $opt{'field'}; +my $div_id = "div_$id"; + +my $vertices_json = $opt{'curr_value'} || '[]'; +</%init> +<& hidden.html, %opt &> +<div id="<% $div_id %>" style="height: 600px; width: 600px"></div> + +<script src="https://maps.googleapis.com/maps/api/js?libraries=drawing"></script> +<script> +var map; +var drawingManager; + +function updateFormInput(event) { + var path = window.polygon.getPath(); + var vertices = []; // array of arrays, geoJSON style + for (var i =0; i < path.getLength(); i++) { + var xy = path.getAt(i); + vertices[i] = [ xy.lat(), xy.lng() ]; + } + console.log(vertices); //XXX + $('#<% $field %>').prop('value', JSON.stringify(vertices)); +} + +$(function() { + mapOptions = { + zoom: 4, + center: {lat: 39.40114, lng: -96.57127}, // continental U.S. + mapTypeId: google.maps.MapTypeId.ROADMAP, + panControl: true, + scaleControl: true, + streetViewControl: false, + }; + map = new google.maps.Map($('#<% $div_id %>')[0], mapOptions); + + var polygonComplete = function(p) { + window.polygon = p; + if (drawingManager) { + drawingManager.setDrawingMode(null); + drawingManager.setOptions({ drawingControl: false }); + } + // double click to delete a vertex (so long as it remains a polygon) + p.addListener('dblclick', function (mev) { + if (mev.vertex != null && window.polygon.getPath().length > 3) { + p.getPath().removeAt(mev.vertex); + } + }); + // any time the polygon is modified, update the vertex list + p.getPath().addListener('set_at', updateFormInput); + p.getPath().addListener('insert_at', updateFormInput); + p.getPath().addListener('remove_at', updateFormInput); + + // and also now + updateFormInput(); + }; + + var polygonOptions = { + fillColor: '#0000a0', + fillOpacity: 0.2, + strokeColor: '#0000a0', + strokeWeight: 2, + clickable: false, + editable: true, + zIndex: 1, + map: map, + }; + + var vertex_array = <% $vertices_json %>; + if ( vertex_array.length > 2 ) { + // then we already have a polygon. make it acceptable to google maps, + // and also create a bounding box for it and fit the map to that. + + var path = []; + var bounds = new google.maps.LatLngBounds(); + for (var i = 0; i < vertex_array.length; i++) { + var xy = new google.maps.LatLng(vertex_array[i][0], vertex_array[i][1]); + path.push(xy); + bounds.extend(xy); + } + + polygonOptions.paths = [ path ]; + polygonComplete(new google.maps.Polygon(polygonOptions)); + map.fitBounds(bounds); + + } else { + // there are no vertices, or not enough to make a polygon, so + // enable drawing mode to create a new one + + drawingManager = new google.maps.drawing.DrawingManager({ + drawingMode: google.maps.drawing.OverlayType.POLYGON, + drawingControl: true, + drawingControlOptions: { + position: google.maps.ControlPosition.TOP_CENTER, + drawingModes: [ + google.maps.drawing.OverlayType.POLYGON, + ] + }, + polygonOptions: polygonOptions, + }); + + // after a single polygon is drawn: remember it, add a listener to let + // nodes be deleted, and exit drawing mode + drawingManager.addListener('polygoncomplete', polygonComplete); + drawingManager.setMap(map); + + // center the map on the user (for lack of a better choice) + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(function(position) { + var pos = { + lat: position.coords.latitude, + lng: position.coords.longitude + }; + + map.setCenter(pos); + map.setZoom(12); + }); + } // on error, or if geolocation isn't available, do nothing + } + +}); + + </script> + </body> +</html> diff --git a/httemplate/elements/tr-polygon.html b/httemplate/elements/tr-polygon.html new file mode 100644 index 000000000..6990d3da6 --- /dev/null +++ b/httemplate/elements/tr-polygon.html @@ -0,0 +1,5 @@ +<tr> +<td colspan=2> +<& polygon.html, @_ &> +</td> +</tr> diff --git a/httemplate/misc/process/deploy_zone-block_lookup.cgi b/httemplate/misc/process/deploy_zone-block_lookup.cgi new file mode 100644 index 000000000..8f4eac7e9 --- /dev/null +++ b/httemplate/misc/process/deploy_zone-block_lookup.cgi @@ -0,0 +1,13 @@ +<% $server->process %> +<%init> +my $curuser = $FS::CurrentUser::CurrentUser; +die "access denied" + unless $curuser->access_right([ + 'Edit FCC report configuration', + 'Edit FCC report configuration for all agents', + ]); + +my $server = FS::UI::Web::JSRPC->new( + 'FS::deploy_zone::process_block_lookup', $cgi +); +</%init> |