From: <ls...@us...> - 2009-09-28 20:26:20
|
Revision: 22122 http://gmod.svn.sourceforge.net/gmod/?rev=22122&view=rev Author: lstein Date: 2009-09-28 20:25:38 +0000 (Mon, 28 Sep 2009) Log Message: ----------- all asynchronous methods now moved into Bio::Graphics::Browser2::Action Modified Paths: -------------- Generic-Genome-Browser/trunk/cgi-bin/gbrowse_img Generic-Genome-Browser/trunk/conf/plugins/FilterTest.pm Generic-Genome-Browser/trunk/htdocs/js/ajax_upload.js Generic-Genome-Browser/trunk/htdocs/js/autocomplete.js Generic-Genome-Browser/trunk/htdocs/js/buttons.js Generic-Genome-Browser/trunk/htdocs/js/controller.js Generic-Genome-Browser/trunk/htdocs/js/login.js Generic-Genome-Browser/trunk/htdocs/js/toggle.js Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Action.pm Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Render/HTML.pm Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Render.pm Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/RenderPanels.pm Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/UploadSet.pm Modified: Generic-Genome-Browser/trunk/cgi-bin/gbrowse_img =================================================================== --- Generic-Genome-Browser/trunk/cgi-bin/gbrowse_img 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/cgi-bin/gbrowse_img 2009-09-28 20:25:38 UTC (rev 22122) @@ -4,7 +4,7 @@ use strict; -use Bio::Graphics::Browser; +use Bio::Graphics::Browser2; use Bio::Graphics::Browser2::Render; use Bio::Graphics::Browser2::Util; use Digest::MD5 'md5_hex'; Modified: Generic-Genome-Browser/trunk/conf/plugins/FilterTest.pm =================================================================== --- Generic-Genome-Browser/trunk/conf/plugins/FilterTest.pm 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/conf/plugins/FilterTest.pm 2009-09-28 20:25:38 UTC (rev 22122) @@ -73,7 +73,6 @@ warn $@ if $@; return $filter,"$key (filter incorrect)" if $@; # error occurred - my $value = $config->{filter_value}; my $new_key = $FILTERS[ $config->{filter} ][1] =~ m/\$value/ ? "$key ($FILTERS[$config->{filter}][0] $value)" : "$key ($FILTERS[$config->{filter}][0])" ; Modified: Generic-Genome-Browser/trunk/htdocs/js/ajax_upload.js =================================================================== --- Generic-Genome-Browser/trunk/htdocs/js/ajax_upload.js 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/htdocs/js/ajax_upload.js 2009-09-28 20:25:38 UTC (rev 22122) @@ -65,7 +65,7 @@ $('upload_status').innerHTML = '<b>Uploading...</b>'; $('ajax_upload').hide(); if (Ajax_Status_Updater==null) - Ajax_Status_Updater = new Ajax.PeriodicalUpdater($('upload_status'),'#',{parameters:{new_file_upload_status:1}}); + Ajax_Status_Updater = new Ajax.PeriodicalUpdater($('upload_status'),'#',{parameters:{action:'upload_status'}}); else Ajax_Status_Updater.start(); return true; @@ -86,7 +86,9 @@ $(indicator).innerHTML = "<image src='/gbrowse2/images/buttons/ajax-loader.gif' />"; new Ajax.Request(document.URL, { method: 'post', - parameters: {deleteUploadTrack:trackName}, + parameters: {action: 'delete_upload', + track: trackName + }, onSuccess: function (transport) { Controller.update_sections(new Array(userdata_table_id)); } Modified: Generic-Genome-Browser/trunk/htdocs/js/autocomplete.js =================================================================== --- Generic-Genome-Browser/trunk/htdocs/js/autocomplete.js 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/htdocs/js/autocomplete.js 2009-09-28 20:25:38 UTC (rev 22122) @@ -8,7 +8,7 @@ document.URL, {indicator: 'indicator1', parameters: 'action=autocomplete', - paramName: 'autocomplete', + paramName: 'prefix', minChars: 2 } ); Modified: Generic-Genome-Browser/trunk/htdocs/js/buttons.js =================================================================== --- Generic-Genome-Browser/trunk/htdocs/js/buttons.js 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/htdocs/js/buttons.js 2009-09-28 20:25:38 UTC (rev 22122) @@ -97,7 +97,7 @@ handle: 'titlebar', scroll: window, onUpdate: function() { - var postData = Sortable.serialize(div_name,{name:'label'}); + var postData = Sortable.serialize(div_name,{name:'label'})+';action=change_track_order'; new Ajax.Request(document.URL,{method:'post',postBody:postData}); } } Modified: Generic-Genome-Browser/trunk/htdocs/js/controller.js =================================================================== --- Generic-Genome-Browser/trunk/htdocs/js/controller.js 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/htdocs/js/controller.js 2009-09-28 20:25:38 UTC (rev 22122) @@ -271,7 +271,7 @@ set_display_option: function(option,value) { - var param = {set_display_option: 1}; + var param = {action: 'set_display_option'}; param[option] = value; new Ajax.Request(document.URL, { @@ -387,7 +387,7 @@ if (force == null) force=false; - var request_str = "add_tracks=1"; + var request_str = "action=add_tracks"; var found_track = false; for (var i = 0; i < track_names.length; i++) { var track_name = track_names[i]; @@ -461,7 +461,7 @@ new Ajax.Request(document.URL,{ method: 'post', parameters: { - rerender_track: 1, + action: 'rerender_track', track_id: gbtrack.track_id }, onSuccess: function(transport) { @@ -527,7 +527,7 @@ new Ajax.Request(document.URL,{ method: 'post', - parameters: $H({ retrieve_multiple: 1, + parameters: $H({ action: 'retrieve_multiple', track_ids: track_ids }).toQueryString() + track_key_str, onSuccess: function(transport) { @@ -654,7 +654,7 @@ method: 'post', parameters: form_element.serialize() +"&"+ $H({ plugin_action: plugin_action, - reconfigure_plugin: 1 + action: 'reconfigure_plugin' }).toQueryString(), onSuccess: function(transport) { @@ -729,13 +729,19 @@ new Ajax.Request(document.URL,{ method: 'post', parameters: form_element.serialize() +"&"+ $H({ - edited_file: edited_file, - commit_file_edit: 1 + action: 'commit_file_edit', + edited_file: edited_file }).toQueryString(), onSuccess: function(transport) { var results = transport.responseJSON; var file_created = results.file_created; var tracks = results.tracks; + var error = results.error; + + if (error) { + alert(error); + return; + } Controller.wipe_div(external_utility_div_id); @@ -788,8 +794,8 @@ new Ajax.Request(document.URL,{ method: 'post', parameters: { - delete_upload_file: 1, - file: file_name + action: 'delete_upload_file', + file: file_name }, onSuccess: function(transport) { Controller.each_track(file_name,function(gbtrack) { @@ -812,8 +818,8 @@ new Ajax.Request(document.URL,{ method: 'post', parameters:{ - add_url: 1, - eurl: eurl + action: 'add_url', + eurl: eurl }, onSuccess: function(transport) { var results = transport.responseJSON; Modified: Generic-Genome-Browser/trunk/htdocs/js/login.js =================================================================== --- Generic-Genome-Browser/trunk/htdocs/js/login.js 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/htdocs/js/login.js 2009-09-28 20:25:38 UTC (rev 22122) @@ -582,7 +582,7 @@ function login_get_account(username,session,remember,openid) { new Ajax.Request(document.URL,{ method: 'post', - parameters: {authorize_login: 1, + parameters: {action: 'authorize_login', username: username, session: session, remember: remember, Modified: Generic-Genome-Browser/trunk/htdocs/js/toggle.js =================================================================== --- Generic-Genome-Browser/trunk/htdocs/js/toggle.js 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/htdocs/js/toggle.js 2009-09-28 20:25:38 UTC (rev 22122) @@ -6,7 +6,8 @@ } function setVisState (element_name,is_visible) { - var postData = 'div_visible_'+ element_name + '=' + is_visible; + var visibility = is_visible ? 'show' : 'hide'; + var postData = 'action=show_hide_section;'+visibility+'='+element_name; new Ajax.Request(document.URL,{method:'post',postBody:postData}); } @@ -51,7 +52,9 @@ pad.style.display = 'none'; control.className = 'titlebar'; } - var postData = 'track_collapse_'+ escape(element_name) + '=' + (closeit ? 1 : 0); + + var direction = closeit ? 'collapse' : 'open'; + var postData = 'action=open_collapse_track;'+direction+'='+escape(element_name); new Ajax.Request(document.URL,{method:'post',postBody:postData}); return false; } Modified: Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Action.pm =================================================================== --- Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Action.pm 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Action.pm 2009-09-28 20:25:38 UTC (rev 22122) @@ -26,6 +26,27 @@ sub session {shift->render->session} sub segment {shift->render->segment} +sub handle_legacy_calls { + my $class = shift; + my ($q,$render) = @_; + + # redirect to galaxy form submission + if ($q->param('galaxy')) { + return (302,undef,$render->galaxy_link($render->state)); + } + + # redirect to the imagelink + if (my $format = $q->param('make_image')) { + return (302,undef,$render->image_link($render->state,$format)); + } + + if ($q->param('clear_dsn') || $q->param('reset_dsn')) { + return (302,undef,"?action=reset_dsn"); + } + + return; +} + # each ACTION_* method corresponds to a "action=*" parameter on the CGI stack sub ACTION_navigate { my $self = shift; @@ -133,4 +154,335 @@ return ( 200, 'application/json', {} ); } +sub ACTION_share_track { + my $self = shift; + my $q = shift; + + my $track_name = $q->param('track') or croak; + my $html = $self->render->share_track($track_name); + return ( 200, 'text/html', $html ); +} + +sub ACTION_retrieve_multiple { + my $self = shift; + my $q = shift; + + my $render = $self->render; + + $render->init_plugins(); + $render->init_remote_sources(); + + my %track_html; + my @track_ids = $q->param('track_ids'); + + foreach my $track_id (@track_ids) { + my $track_key = $q->param( 'tk_' . $track_id ) or next; + warn "retrieving $track_id=>$track_key" if DEBUG; + + $track_html{$track_id} = $render->render_deferred_track( + cache_key => $track_key, + track_id => $track_id, + ) || ''; + } + + my $return_object = { track_html => \%track_html, }; + return ( 200, 'application/json', $return_object ); +} + +sub ACTION_add_tracks { + my $self = shift; + my $q = shift; + + my $render = $self->render; + + + my @track_names = $q->param('track_names'); + + $render->init_database(); + $render->init_plugins(); + $render->init_remote_sources(); + + my $track_data = $render->add_tracks(\@track_names); + my $return_object = { track_data => $track_data, }; + + return ( 200, 'application/json', $return_object ); +} + +sub ACTION_reconfigure_plugin { + my $self = shift; + my $q = shift; + $self->render->init_plugins(); + return (204,'text/plain',undef); +} + +sub ACTION_rerender_track { + my $self = shift; + my $q = shift; + + my $render = $self->render; + my $track_id = $q->param('track_id'); + + $render->init_database(); + $render->init_plugins(); + $render->init_remote_sources(); + + my ( $track_keys, $display_details, $details_msg ) + = $render->background_individual_track_render($track_id); + + my $return_object = { + track_keys => $track_keys, + display_details => $display_details, + details_msg => $details_msg, + }; + return (200,'application/json',$return_object); +} + +sub ACTION_commit_file_edit { + my $self = shift; + my $q = shift; + + my $data = $q->param('a_data'); + my $edited_file = $q->param('edited_file'); + + return ( 204, 'text/plain', undef ) unless ( $edited_file and $data ); + + $self->render->init_remote_sources(); + my ($file_created,$tracks,$error) = $self->render->handle_edit( $edited_file, $self->state, $data ); + + my $return_object = { + file_created => $file_created, + tracks => $tracks, + error => "$error" + }; + + return (200,'application/json',$return_object); +} + +sub ACTION_add_url { + my $self = shift; + my $q = shift; + + my $data = $q->param('eurl'); + my $render = $self->render; + + $render->init_remote_sources; + $render->remote_sources->add_source($data); + $render->add_track_to_state($data); + warn "adding $data to remote sources" if DEBUG; + return (200,'application/json',{url_created=>1}); +} + +sub ACTION_delete_upload_file { + my $self = shift; + my $q = shift; + + my $render = $self->render; + my $file = $q->param('file'); + warn "deleting file $file " if DEBUG; + + $render->init_remote_sources(); + $render->uploaded_sources->clear_file($file); + $render->remote_sources->delete_source($file); + $render->remove_track_from_state($file); + + return (204,'text/plain',undef); +} + +sub ACTION_show_hide_section { + my $self = shift; + my $q = shift; + + my @show = $q->param('show'); + my @hide = $q->param('hide'); + + my $settings = $self->state; + $settings->{section_visible}{$_} = 0 foreach @hide; + $settings->{section_visible}{$_} = 1 foreach @show; + + return (204,'text/plain',undef); +} + +sub ACTION_open_collapse_track { + my $self = shift; + my $q = shift; + + my @open = $q->param('open'); + my @collapse = $q->param('collapse'); + + my $settings = $self->state; + $settings->{track_collapsed}{$_} = 1 foreach @collapse; + $settings->{track_collapsed}{$_} = 0 foreach @open; + + return (204,'text/plain',undef); +} + +sub ACTION_change_track_order { + my $self = shift; + my $q = shift; + + warn "change_track_order()"; + + my $settings = $self->state; + my @labels = $q->param('label[]') or return; + foreach (@labels) { + s/%5F/_/g; + s/:(overview|region|detail)$// if m/^(plugin|file|http|ftp):/; + } + my %seen; + @{ $settings->{tracks} } = grep { length() > 0 && !$seen{$_}++ } + ( @labels, @{ $settings->{tracks} } ); + + return (204,'text/plain',undef); +} + +sub ACTION_set_display_option { + my $self = shift; + + # this is a little bogus because update_options() is going to + # read from the CGI parameter list directly. + $self->render->update_options; + return (204,'text/plain',undef); +} + +sub ACTION_bookmark { + my $self = shift; + return (302,undef,$self->render->bookmark_link($self->state)); +} + +sub ACTION_autocomplete { + my $self = shift; + my $q = shift; + my $render = $self->render; + + my $match = $q->param('prefix') or croak; + + my $search = $render->get_search_object; + my $matches= $search->features_by_prefix($match,100); + my $autocomplete = $render->format_autocomplete($matches,$match); + return (200,'text/html',$autocomplete); +} + +sub ACTION_reset_dsn { + my $self = shift; + warn "here I am"; + $self->data_source->clear_cached_config(); + return (204,'text/plain',undef); +} + +sub ACTION_authorize_login { + my $self = shift; + my $q = shift; + my $username = $q->param('username') or croak; + my $session = $q->param('session') or croak; + my $openid = $q->param('openid') or croak; + + my ($id,$nonce) = $self->render->authorize_user($username,$session,$openid); + return (200,'application/json',{id=>$id,authority=>$nonce}); +} + +# DEBUGGING METHOD +sub ACTION_new_test_track { + my $self = shift; + my $q = shift; + + my $render = $self->render; + my $userdata = Bio::Graphics::Browser2::UploadSet->new($render->data_source, + $render->state, + $render->language); + warn "Adding test track for ",$render->state->{uploadid}," path = ",($userdata->name_file('test'))[1]; + return (204,'text/plain',undef); +} + +sub ACTION_upload_file { + my $self = shift; + my $q = shift; + + my $fh = $q->param('file') or return(204,'text/plain',undef); + + my $render = $self->render; + my $state = $self->state; + my $session = $render->session; + + my $userdata = Bio::Graphics::Browser2::UserTracks->new($render->data_source, + $render->state, + $render->language); + warn "created userdata $userdata"; + + my $name = File::Basename::basename($fh ); + $state->{current_upload} = $name; + $session->flush(); + $session->unlock(); + + my ($result,$msg) = $userdata->upload_track($name,$fh); + + return $msg ? (200, + 'text/html', + "<pre style='background-color:pink'>$msg</pre>". + a({ + -href =>'javascript:void(0)', + -onClick =>"\$('upload_status').innerHTML=''" + }, + '[Remove]' + ) + ) + : (200,'text/plain',''); +} + +sub ACTION_delete_upload { + my $self = shift; + my $q = shift; + + my $track = $q->param('track') or croak; + my $render = $self->render; + + my $userdata = Bio::Graphics::Browser2::UserTracks->new($render->data_source, + $render->state, + $render->language); + $userdata->delete_track($track); + return (204,'text/plain',undef); +} + +sub ACTION_upload_status { + my $self = shift; + my $q = shift; + + my $status = 'status unknown'; + my $file_name = 'Unknown'; + + my $state = $self->state; + my $render = $self->render; + + if ($file_name = $state->{current_upload}) { + my $userdata = Bio::Graphics::Browser2::UserTracks->new($render->data_source, + $render->state, + $render->language); + $status = $userdata->status($file_name); + return (200,'text/html',"<b>$file_name:</b> <i>$status</i>"); + } else { + return (204,'text/plain',undef); + } +} + + 1; + +__END__ + +# some dead code follows here + +# This looks like an older version of the retrieve_multiple request + +# Slightly different -- process a tracks request in the background. +# if ( my @labels = param('render') ) { # deferred rendering requested +# $self->init_database(); +# $self->init_plugins(); +# $self->init_remote_sources(); +# my $features = $self->region->features; +# my $seg = $self->features2segments($features)->[0]; # likely wrong + +# $self->set_segment($seg); + +# my $deferred_data = $self->render_deferred( labels => \@labels ); +# return (200,'application/json',$deferred_data); +# } + Modified: Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Render/HTML.pm =================================================================== --- Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Render/HTML.pm 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Render/HTML.pm 2009-09-28 20:25:38 UTC (rev 22122) @@ -314,7 +314,7 @@ -head => \@extra_headers, ); push @args,(-lang=>($self->language_code)[0]) if $self->language_code; - my $autocomplete = ''; # $self->setting('autocomplete') ? 'initAutocomplete()' : ''; + my $autocomplete = ''; push @args,(-onLoad=>"initialize_page();$set_dragcolors;$autocomplete"); return start_html(@args); @@ -583,7 +583,7 @@ ); my @segment_showing_links =( - a({-href=>'?bookmark=1'},'['.$self->tr('BOOKMARK').']'), + a({-href=>'?action=bookmark'},'['.$self->tr('BOOKMARK').']'), a({-href=>'#', -onMouseDown=>'visibility("upload_tracks_panel",1);new Effect.ScrollTo("upload_tracks_panel");setTimeout(\'new Effect.Highlight("upload_tracks_panel_title")\',1000)'}, '['.$self->tr('Add_your_own_tracks').']'), @@ -643,7 +643,7 @@ } my $action = $galaxy_url =~ /\?/ ? "$galaxy_url&URL=$URL" : "$galaxy_url?URL=$URL"; - + my $html = start_multipart_form(-name => 'galaxyform', -action => $action, -method => 'POST'); @@ -1213,8 +1213,9 @@ action="$url" enctype="multipart/form-data" method="post"> - <input type="file" name="new_file_upload" id="new_upload_field" /> - <input type="submit" name="new_file_submit" value="Upload"/> + <input type="file" name="file" id="upload_field" /> + <input type="submit" name="submit" value="Upload" /> + <input type="hidden" name="action" value="upload_file" /> <a href="javascript:void(0)" onClick="this.parentNode.remove()">Remove</a> </form> END Modified: Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Render.pm =================================================================== --- Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Render.pm 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/Render.pm 2009-09-28 20:25:38 UTC (rev 22122) @@ -248,15 +248,9 @@ # handle asynchronous events # -# asynchronous requests: -# -# div_visible_<label>=bool Turn on/off visibility of track with <label> -# track_collapse_<label>=bool Collapse/uncollapse track with <label> -# label[]=<label1>,label[]=<label2>... Change track order -# render=<label1>,render=<label2>... Render the specified tracks -# navigate= -# -# returns ($http_status,$mime_type,$body_data) +# Asynchronous requests. See Bio::Graphics::Browser2::Action for dispatch +# table. Each request returns a three element list of format: +# ($http_status,$mime_type,$body_data) sub asynchronous_event { my $self = shift; my $settings = $self->state; @@ -264,350 +258,32 @@ warn "event(",(join ' ',param()),")" if DEBUG; - # the big IF/ELSE statement that follows is HORRIBLE, - # so we are slowly cleaning this up with a more orderly - # dispatch object. - if (my $action = param('action')) { + # TO ADD AN ASYNCHRONOUS REQUEST... + # 1. Give the request a unique name, such as "foo" + # 2. Arrange for the client to POST or GET the document URL with a CGI + # argument list that includes "action=foo". + # 3. Modify Bio::Graphics::Browser2::Action to include a method named + # ACTION_foo that processes the request. The method will receive + # the CGI object as its argument, and is expected to return + # a three-item list consisting of the HTTP status code, the MIME type, + # and the message contents in the appropriate format for the MIME type. + # Within the method call $self->render() + # to get this Bio::Graphics::Browser2::Render object. + + # legacy URLs + if (my @result = Bio::Graphics::Browser2::Action->handle_legacy_calls($CGI::Q,$self)) { + return @result; + } + + elsif (my $action = param('action')) { my $dispatch = Bio::Graphics::Browser2::Action->new($self); my $method = "ACTION_${action}"; return $dispatch->$method($CGI::Q); } - # everything below here should be migrated into Bio::Graphics::Browser2::Action - - if ( my $track_name = param('share_track') ) { - my $html = $self->share_track($track_name); - return ( 200, 'text/html', $html ); + else { + return; } - - if ( my $element = param('update') ) { - warn "UPDATE HAS BEEN DEPRECATED"; - my $html = $self->asynchronous_update_element($element); - return (200,'text/html',$html); - } - - if ( param('retrieve_multiple') ) { - $self->init_plugins(); - $self->init_remote_sources(); - - my %track_html; - my @track_ids = param('track_ids'); - - foreach my $track_id (@track_ids) { - my $track_key = param( 'tk_' . $track_id ) or next; - warn "retrieving $track_id=>$track_key" if DEBUG; - $track_html{$track_id} = $self->render_deferred_track( - cache_key => $track_key, - track_id => $track_id, - ) || ''; - } - - my $return_object = { track_html => \%track_html, }; - return ( 200, 'application/json', $return_object ); - } - - if ( my $action = param('add_tracks') ) { - my @track_names = param('track_names'); - - $self->init_database(); - $self->init_plugins(); - $self->init_remote_sources(); - my %track_data; - - foreach my $track_name ( @track_names ) { - warn "add_track_to_state($track_name)" if DEBUG; - - $self->add_track_to_state($track_name); - next unless $self->segment; - - my @track_ids = $self->expand_track_names($track_name); - - for my $track_id (@track_ids) { - - warn "rendering track $track_id" if DEBUG; - - my ( $track_keys, $display_details, $details_msg ) - = $self->background_individual_track_render($track_id); - - my $track_key = $track_keys->{$track_id}; - my $track_section = $self->get_section_from_label($track_id); - my $image_width = $self->get_image_width; - my $image_element_id = $track_name . "_image"; - - my $track_html; - if ( $track_section eq 'detail' and not $display_details ) { - my $image_width = $self->get_image_width; - $track_html .= $self->render_grey_track( - track_id => $track_name, - image_width => $image_width, - image_height => EMPTY_IMAGE_HEIGHT, - image_element_id => $track_name . "_image", - ); - } - else { - $track_html = $self->render_deferred_track( - cache_key => $track_key, - track_id => $track_id, - ) || ''; - } - $track_html = $self->wrap_track_in_track_div( - track_id => $track_id, - track_name => $track_name, - track_html => $track_html, - ); - - my $panel_id = 'detail_panels'; - if ( $track_id =~ /:overview$/ ) { - $panel_id = 'overview_panels'; - } - elsif ( $track_id =~ /:region$/ ) { - $panel_id = 'region_panels'; - } - warn "add_track() returning track_id=$track_id, key=$track_key, name=$track_name, panel_id=$panel_id" if DEBUG; - - $track_data{$track_id} = { - track_key => $track_key, - track_id => $track_id, - track_name => $track_name, - track_html => $track_html, - track_section => $track_section, - image_element_id => $image_element_id, - panel_id => $panel_id, - display_details => $display_details, - details_msg => $details_msg, - }; - } - } - - my $return_object = { track_data => \%track_data, }; - return ( 200, 'application/json', $return_object ); - } - if ( param('set_track_visibility') ) { - my $visible = param('visible'); - my $track_name = param('track_name'); - - param('track_name'),'=>',param('visible') if DEBUG; - - if ($visible) { - $self->init_plugins(); - $self->init_remote_sources(); - $self->add_track_to_state($track_name); - } - else { - $self->remove_track_from_state($track_name); - } - - return (204,'text/plain',undef); - } - - if ( my $action = param('rerender_track') ) { - my $track_id = param('track_id'); - - $self->init_database(); - $self->init_plugins(); - $self->init_remote_sources(); - - my ( $track_keys, $display_details, $details_msg ) - = $self->background_individual_track_render($track_id); - - my $return_object = { - track_keys => $track_keys, - display_details => $display_details, - details_msg => $details_msg, - }; - return (200,'application/json',$return_object); - } - - if ( param('reconfigure_plugin') ) { - # init_plugins will do the configure call needed - $self->init_plugins(); - return (204,'text/plain',undef); - } - - if ( param('commit_file_edit') ) { - my $data = param('a_data'); - my $edited_file = param('edited_file'); - - return ( 204, 'text/plain', undef ) unless ( $edited_file and $data ); - $self->init_remote_sources(); - my ($file_created,$tracks) = $self->handle_edit( $edited_file, $self->state, $data ); - - my $return_object = { - file_created => $file_created, - tracks => $tracks, - }; - - return (200,'application/json',$return_object); - } - - if (param ('add_url')) { - my $data = param('eurl'); - $self->init_remote_sources; - $self->remote_sources->add_source($data); - $self->add_track_to_state($data); - warn "adding $data to remote sources" if DEBUG; - return (200,'application/json',{url_created=>1}); - } - - if ( param('delete_upload_file') ) { - my $file = param('file'); - warn "deleting file $file " if DEBUG; - $self->init_remote_sources(); - $self->uploaded_sources->clear_file($file); - $self->remote_sources->delete_source($file); - $self->remove_track_from_state($file); - - return (204,'text/plain',undef); - } - - # toggle the visibility of sections by looking for "div_visible_*" - # parameters - for my $p ( grep {/^div_visible_/} param() ) { - my $visibility = param($p); - $p =~ s/^div_visible_//; - $settings->{section_visible}{$p} = $visibility; - $events++; - } - - # toggle the visibility of individual tracks - for my $p ( grep {/^track_collapse_/} param() ) { - my $collapsed = param($p); - $p =~ s/^track_collapse_//; - warn "\$settings->{track_collapsed}{$p} = $collapsed" if DEBUG; - $settings->{track_collapsed}{$p} = $collapsed; - $events++; - } - - # Change the order of tracks if any "label[]" parameters are present - if ( my @labels = param('label[]') ) { - foreach (@labels) { - s/%5F/_/g; - s/:(overview|region|detail)$// if m/^(plugin|file|http|ftp):/; - } - my %seen; - @{ $settings->{tracks} } = grep { length() > 0 && !$seen{$_}++ } - ( @labels, @{ $settings->{tracks} } ); - $events++; - } - - # Slightly different -- process a tracks request in the background. - if ( my @labels = param('render') ) { # deferred rendering requested - $self->init_database(); - $self->init_plugins(); - $self->init_remote_sources(); - my $features = $self->region->features; - my $seg = $self->features2segments($features)->[0]; # likely wrong - - $self->set_segment($seg); - - my $deferred_data = $self->render_deferred( labels => \@labels ); - return (200,'application/json',$deferred_data); - } - - # miscellaneous options - if (param('set_display_option')) { - $self->update_options(); - $events++; - } - - # redirect to the bookmark - if (param('bookmark')) { - return (302,undef,$self->bookmark_link($self->state)); - } - - # redirect to galaxy form submission - if (param('galaxy')) { - return (302,undef,$self->galaxy_link($self->state)); - } - - # redirect to the imagelink - if (my $format = param('make_image')) { - return (302,undef,$self->image_link($self->state,$format)); - } - - # autocomplete support - if (my $match = param('autocomplete')) { - my $search = $self->get_search_object; - my $matches= $search->features_by_prefix($match,100); - my $autocomplete = $self->format_autocomplete($matches,$match); - return (200,'text/html',$autocomplete); - } - - # clear a cached data source - if (param('clear_dsn') || param('reset_dsn')) { - $self->data_source->clear_cached_config(); - return (204,'text/plain',undef); - } - - # authorize an attempted login - if (param('authorize_login') && param('username') && param('session') && param('openid')) { - my ($id,$nonce) = $self->authorize_user(param('username'),param('session'),param('remember'),param('openid')); - return (200,'application/json',{id=>$id,authority=>$nonce}); - } - - # add a dummy track to the user data - if (param('new_test_track')) { - my $userdata = Bio::Graphics::Browser2::UploadSet->new($self->data_source, - $self->state, - $self->language); - warn "Adding test track for ",$self->state->{uploadid}," path = ",($userdata->name_file('test'))[1]; - return (204,'text/plain',undef); - } - - # new-style ajax upload - if (param('new_file_submit')) { - if (my $fh = param('new_file_upload')) { - my $userdata = Bio::Graphics::Browser2::UserTracks->new($self->data_source, - $self->state, - $self->language); - warn "created userdata $userdata"; - my $name = basename($fh ); - $self->state->{current_upload} = $name; - $self->session->flush(); - $self->session->unlock(); - my ($result,$msg) = $userdata->upload_track($name,$fh); - return $msg ? (200, - 'text/html', - "<pre style='background-color:pink'>$msg</pre>". - a({ - -href =>'javascript:void(0)', - -onClick =>"\$('upload_status').innerHTML=''" - }, - '[Remove]' - ) - ) - : (200,'text/plain',undef); - } - return (204,'text/plain',undef); - } - - if (param('new_file_upload_status')) { - my $status = 'status unknown'; - my $file_name = 'Unknown'; - - if ($file_name = $self->state->{current_upload}) { - my $userdata = Bio::Graphics::Browser2::UserTracks->new($self->data_source, - $self->state, - $self->language); - $status = $userdata->status($file_name); - return (200,'text/html',"<b>$file_name:</b> <i>$status</i>"); - } else { - return (204,'text/plain',undef); - } - } - - if (my $track = param('deleteUploadTrack')) { - my $userdata = Bio::Graphics::Browser2::UserTracks->new($self->data_source, - $self->state, - $self->language); - $userdata->delete_track($track); - return (204,'text/plain',undef); - } - - return unless $events; - warn "processing asynchronous event(s)" if DEBUG; - return (204,'text/plain',undef); - 1; } sub authorize_user { @@ -711,6 +387,81 @@ return (\%track_keys, $display_details, $details_msg); } +sub add_tracks { + my $self = shift; + my $track_names = shift; + + my %track_data; + + foreach my $track_name ( @$track_names ) { + + warn "add_track_to_state($track_name)" if DEBUG; + + $self->add_track_to_state($track_name); + next unless $self->segment; + + my @track_ids = $self->expand_track_names($track_name); + + for my $track_id (@track_ids) { + + warn "rendering track $track_id" if DEBUG; + + my ( $track_keys, $display_details, $details_msg ) + = $self->background_individual_track_render($track_id); + + my $track_key = $track_keys->{$track_id}; + my $track_section = $self->get_section_from_label($track_id); + my $image_width = $self->get_image_width; + my $image_element_id = $track_name . "_image"; + + my $track_html; + if ( $track_section eq 'detail' and not $display_details ) { + my $image_width = $self->get_image_width; + $track_html .= $self->render_grey_track( + track_id => $track_name, + image_width => $image_width, + image_height => EMPTY_IMAGE_HEIGHT, + image_element_id => $track_name . "_image", + ); + } + else { + $track_html = $self->render_deferred_track( + cache_key => $track_key, + track_id => $track_id, + ) || ''; + } + $track_html = $self->wrap_track_in_track_div( + track_id => $track_id, + track_name => $track_name, + track_html => $track_html, + ); + + my $panel_id = 'detail_panels'; + if ( $track_id =~ /:overview$/ ) { + $panel_id = 'overview_panels'; + } + elsif ( $track_id =~ /:region$/ ) { + $panel_id = 'region_panels'; + } + warn "add_track() returning track_id=$track_id, key=$track_key, name=$track_name, panel_id=$panel_id" if DEBUG; + + $track_data{$track_id} = { + track_key => $track_key, + track_id => $track_id, + track_name => $track_name, + track_html => $track_html, + track_section => $track_section, + image_element_id => $image_element_id, + panel_id => $panel_id, + display_details => $display_details, + details_msg => $details_msg, + }; + } + } + + return \%track_data; +} + sub create_cache_extra { my $self = shift; my $settings = $self->state(); @@ -1723,7 +1474,11 @@ $self->state, $self->language); $uploads->add_file($uploads->name_file($file)); - my @sections = eval {$self->_featurefile_sections($uploads->feature_file($file))}; + + my $ff = eval {$uploads->feature_file($file)}; + return (0,[],$@) unless $ff; + + my @sections = $self->_featurefile_sections($ff); my @tracks = map {"$file:$_"} @sections; warn "will return tracks @tracks" if DEBUG; @@ -3476,9 +3231,11 @@ warn "FEATURESET = $featureset, sources = ",join ' ',eval{$featureset->sources} if DEBUG; next unless $featureset; - $featureset->annotate($meta_segment,$f, - $rel2abs,$rel2abs_slow,$max_segment, - $self->whole_segment,$self->region_segment); + eval { + $featureset->annotate($meta_segment,$f, + $rel2abs,$rel2abs_slow,$max_segment, + $self->whole_segment,$self->region_segment); + }; } } @@ -3546,9 +3303,6 @@ $q->param(-name=>'h_region',-value=>$settings->{h_region}) if $settings->{h_region}; my @h_feat= map {"$_\@$settings->{h_feat}{$_}"} keys %{$settings->{h_feat}}; $q->param(-name=>'h_feat', -value=>\@h_feat) if @h_feat; - - warn 'query string = ',$q->query_string(); - return "?".$q->query_string(); } Modified: Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/RenderPanels.pm =================================================================== --- Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/RenderPanels.pm 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/RenderPanels.pm 2009-09-28 20:25:38 UTC (rev 22122) @@ -459,7 +459,7 @@ -onMouseOver => "$balloon_style.showTooltip(event,'$share_this_track')", -onMousedown => - "GBox.showTooltip(event,'url:?share_track=$escaped_label',1,500,500)", + "GBox.showTooltip(event,'url:?action=share_track;track=$escaped_label',1,500,500)", } ), Modified: Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/UploadSet.pm =================================================================== --- Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/UploadSet.pm 2009-09-28 15:23:59 UTC (rev 22121) +++ Generic-Genome-Browser/trunk/lib/Bio/Graphics/Browser2/UploadSet.pm 2009-09-28 20:25:38 UTC (rev 22122) @@ -152,14 +152,13 @@ my $fh = $self->open_file($url) or return; my $safe = $self->config->setting('allow remote callbacks') || 0; warn "creating $url feature_file" if DEBUG; - my $feature_file = eval { + my $feature_file = Bio::Graphics::FeatureFile->new(-file => $fh, -smart_features => 1, -allow_whitespace => 1, -safe_world => $safe, @args, - ); - }; + ); close $fh; # BUG: breaking encapsulation here This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |