galaxy-dev
Threads by month
- ----- 2026 -----
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- 10009 discussions
09 Feb '10
details: http://www.bx.psu.edu/hg/galaxy/rev/c64ef44ed4c5
changeset: 3356:c64ef44ed4c5
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Mon Feb 08 12:45:28 2010 -0500
description:
First pass at allowing explicit datatype conversion to be specified. This can be used for e.g. providing a tool with a non-metadata based index file.
Defined as part of a DataToolParameter:
<param name="input1" type="interval" label="An Interval File">
<converter name='input1_as_a_bed_file' type='bed'/>
</param>
Both the original input as well as the converted dataset can be accessed like:
<command>some_binary $input1 $input1_as_a_bed_file </command>
if $input1 is already BED, it will be used for input1_as_a_bed_file.
The name is be placed in the dictionary space of the data input parameter's parent; so for Grouping objects, e.g. a repeat:
<repeat name="queries" title="Query">
<param name="input2" type="data" label="Select" >
<converter name='input2_as_a_bed_file' type='bed'/>
</param>
</repeat>
is accessed like (putting both the original and converted dataset as arguments on the command line):
<command> ...
#for $q in $queries
${q.input2} ${q.input2_as_a_bed_file}
#end for
... </command>
See notes in code in commit for additional comments.
diffstat:
lib/galaxy/tools/__init__.py | 28 ++++++++++++++++++++++++
lib/galaxy/tools/actions/__init__.py | 41 +++++++++++++++++++++++++++++------
lib/galaxy/tools/parameters/basic.py | 13 +++++++++-
3 files changed, 73 insertions(+), 9 deletions(-)
diffs (147 lines):
diff -r 26f01eafc6bd -r c64ef44ed4c5 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py Mon Feb 08 11:20:44 2010 -0500
+++ b/lib/galaxy/tools/__init__.py Mon Feb 08 12:45:28 2010 -0500
@@ -1198,6 +1198,28 @@
current = values["__current_case__"]
wrap_values( input.cases[current].inputs, values )
elif isinstance( input, DataToolParameter ):
+ ##FIXME: We're populating param_dict with converters when wrapping values,
+ ##this should happen as a separate step before wrapping (or call this wrapping step something more generic)
+ ##(but iterating this same list twice would be wasteful)
+ #add explicit converters by name to current parent
+ for converter_name, converter_extensions, converter_datatypes in input.converters:
+ #if we are at building cmdline step, then converters have already executed
+ conv_ext, converted_dataset = input_values[ input.name ].find_conversion_destination( converter_datatypes )
+ #when dealing with optional inputs, we'll provide a valid extension to be used for None converted dataset
+ if not conv_ext:
+ conv_ext = converter_extensions[0]
+ #input_values[ input.name ] is None when optional dataset,
+ #'conversion' of optional dataset should create wrapper around NoneDataset for converter output
+ if input_values[ input.name ] and not converted_dataset:
+ #input that converter is based from has a value, but converted dataset does not exist
+ raise Exception, 'A path for explicit datatype conversion has not been found: %s --/--> %s' % ( input_values[ input.name ].extension, converter_extensions )
+ else:
+ input_values[ converter_name ] = \
+ DatasetFilenameWrapper( converted_dataset,
+ datatypes_registry = self.app.datatypes_registry,
+ tool = Bunch( converter_name = Bunch( extensions = conv_ext ) ), #trick wrapper into using target conv ext (when None) without actually being a tool parameter
+ name = converter_name )
+ #wrap actual input dataset
input_values[ input.name ] = \
DatasetFilenameWrapper( input_values[ input.name ],
datatypes_registry = self.app.datatypes_registry,
@@ -1212,6 +1234,12 @@
# tools (e.g. UCSC) should really be handled in a special way.
if self.check_values:
wrap_values( self.inputs, param_dict )
+ ###FIXME: when self.check_values==True, input datasets are being wrapped twice
+ ### (above and below, creating 2 separate DatasetFilenameWrapper objects - first is overwritten by second),
+ ###is this necessary? - if we get rid of this way to access children, can we stop this redundancy, or is there another reason for this?
+ ###Only necessary when self.check_values is False (==external dataset tool?: can this be abstracted out as part of being a datasouce tool?)
+ ### but we still want (ALWAYS) to wrap input datasets
+ ### (this should be checked to prevent overhead of creating a new object?)
# Additionally, datasets go in the param dict. We wrap them such that
# if the bare variable name is used it returns the filename (for
# backwards compatibility). We also add any child datasets to the
diff -r 26f01eafc6bd -r c64ef44ed4c5 lib/galaxy/tools/actions/__init__.py
--- a/lib/galaxy/tools/actions/__init__.py Mon Feb 08 11:20:44 2010 -0500
+++ b/lib/galaxy/tools/actions/__init__.py Mon Feb 08 12:45:28 2010 -0500
@@ -31,11 +31,13 @@
"""
input_datasets = dict()
def visitor( prefix, input, value, parent = None ):
- def process_dataset( data ):
- if data and not isinstance( data.datatype, input.formats ):
+ def process_dataset( data, formats = None ):
+ if formats is None:
+ formats = input.formats
+ if data and not isinstance( data.datatype, formats ):
# Need to refresh in case this conversion just took place, i.e. input above in tool performed the same conversion
trans.sa_session.refresh( data )
- target_ext, converted_dataset = data.find_conversion_destination( input.formats, converter_safe = input.converter_safe( param_values, trans ) )
+ target_ext, converted_dataset = data.find_conversion_destination( formats, converter_safe = input.converter_safe( param_values, trans ) )
if target_ext:
if converted_dataset:
data = converted_dataset
@@ -61,16 +63,41 @@
# are stored as name1, name2, ...
for i, v in enumerate( value ):
input_datasets[ prefix + input.name + str( i + 1 ) ] = process_dataset( v )
+ converters = []
+ for converter_name, converter_extensions, converter_datatypes in input.converters:
+ new_data = process_dataset( input_datasets[ prefix + input.name + str( i + 1 ) ], converter_datatypes )
+ if not new_data or isinstance( new_data.datatype, converter_datatypes ):
+ input_datasets[ prefix + converter_name + str( i + 1 ) ] = new_data
+ converters.append( ( converter_name, new_data ) )
+ else:
+ raise Exception, 'A path for explicit datatype conversion has not been found: %s --/--> %s' % ( input_datasets[ prefix + input.name + str( i + 1 ) ].extension, converter_extensions )
if parent:
parent[input.name] = input_datasets[ prefix + input.name + str( i + 1 ) ]
+ for converter_name, converter_data in converters:
+ #allow explicit conversion to be stored in job_parameter table
+ parent[ converter_name ] = converter_data.id #a more robust way to determine JSONable value is desired
else:
param_values[input.name][i] = input_datasets[ prefix + input.name + str( i + 1 ) ]
+ for converter_name, converter_data in converters:
+ #allow explicit conversion to be stored in job_parameter table
+ param_values[ converter_name ][i] = converter_data.id #a more robust way to determine JSONable value is desired
else:
input_datasets[ prefix + input.name ] = process_dataset( value )
- if parent:
- parent[input.name] = input_datasets[ prefix + input.name ]
- else:
- param_values[input.name] = input_datasets[ prefix + input.name ]
+ converters = []
+ for converter_name, converter_extensions, converter_datatypes in input.converters:
+ new_data = process_dataset( input_datasets[ prefix + input.name ], converter_datatypes )
+ if not new_data or isinstance( new_data.datatype, converter_datatypes ):
+ input_datasets[ prefix + converter_name ] = new_data
+ converters.append( ( converter_name, new_data ) )
+ else:
+ raise Exception, 'A path for explicit datatype conversion has not been found: %s --/--> %s' % ( input_datasets[ prefix + input.name ].extension, converter_extensions )
+ target_dict = parent
+ if not target_dict:
+ target_dict = param_values
+ target_dict[ input.name ] = input_datasets[ prefix + input.name ]
+ for converter_name, converter_data in converters:
+ #allow explicit conversion to be stored in job_parameter table
+ target_dict[ converter_name ] = converter_data.id #a more robust way to determine JSONable value is desired
tool.visit_inputs( param_values, visitor )
return input_datasets
diff -r 26f01eafc6bd -r c64ef44ed4c5 lib/galaxy/tools/parameters/basic.py
--- a/lib/galaxy/tools/parameters/basic.py Mon Feb 08 11:20:44 2010 -0500
+++ b/lib/galaxy/tools/parameters/basic.py Mon Feb 08 12:45:28 2010 -0500
@@ -50,14 +50,14 @@
def get_html( self, trans=None, value=None, other_values={}):
"""
- Returns the html widget corresponding to the paramter.
+ Returns the html widget corresponding to the parameter.
Optionally attempt to retain the current value specific by 'value'
"""
return self.get_html_field( trans, value, other_values ).get_html()
def from_html( self, value, trans=None, other_values={} ):
"""
- Convert a value from an HTML POST into the parameters prefered value
+ Convert a value from an HTML POST into the parameters preferred value
format.
"""
return value
@@ -1168,6 +1168,15 @@
else:
self.options = dynamic_options.DynamicOptions( options, self )
self.is_dynamic = self.options is not None
+ # Load converters required for the dataset input
+ self.converters = []
+ for conv_elem in elem.findall( "converter" ):
+ name = conv_elem.get( "name" ) #name for commandline substitution
+ conv_extensions = conv_elem.get( "type" ) #target datatype extension
+ # FIXME: conv_extensions should be able to be an ordered list
+ assert None not in [ name, type ], 'A name (%s) and type (%s) are required for explicit conversion' % ( name, type )
+ conv_types = tool.app.datatypes_registry.get_datatype_by_extension( conv_extensions.lower() ).__class__
+ self.converters.append( ( name, conv_extensions, conv_types ) )
def get_html_field( self, trans=None, value=None, other_values={} ):
filter_value = None
1
0
09 Feb '10
details: http://www.bx.psu.edu/hg/galaxy/rev/26f01eafc6bd
changeset: 3355:26f01eafc6bd
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Mon Feb 08 11:20:44 2010 -0500
description:
On edit attributes page, only sanitize and add annotation when it exists.
Metadata editing was throwing server error when not logged in.
diffstat:
lib/galaxy/web/controllers/root.py | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diffs (15 lines):
diff -r 4e8785b6815c -r 26f01eafc6bd lib/galaxy/web/controllers/root.py
--- a/lib/galaxy/web/controllers/root.py Mon Feb 08 10:00:30 2010 -0500
+++ b/lib/galaxy/web/controllers/root.py Mon Feb 08 11:20:44 2010 -0500
@@ -307,8 +307,9 @@
setattr( data.metadata, name, spec.unwrap( params.get (name, None) ) )
data.datatype.after_setting_metadata( data )
# Sanitize annotation before adding it.
- annotation = sanitize_html( params.annotation, 'utf-8', 'text/html' )
- self.add_item_annotation( trans, data, annotation )
+ if params.annotation:
+ annotation = sanitize_html( params.annotation, 'utf-8', 'text/html' )
+ self.add_item_annotation( trans, data, annotation )
else:
msg = ' (Metadata could not be changed because this dataset is currently being used as input or output. You must cancel or wait for these jobs to complete before changing metadata.)'
trans.sa_session.flush()
1
0
09 Feb '10
details: http://www.bx.psu.edu/hg/galaxy/rev/4e8785b6815c
changeset: 3354:4e8785b6815c
user: Nate Coraor <nate(a)bx.psu.edu>
date: Mon Feb 08 10:00:30 2010 -0500
description:
Fix from Assaf Gordon for Cheetah syntax errors in the Bar Chart tool.
diffstat:
tools/plotting/bar_chart.py | 1 -
tools/plotting/bar_chart.xml | 4 ++--
2 files changed, 2 insertions(+), 3 deletions(-)
diffs (25 lines):
diff -r 390dfb039df7 -r 4e8785b6815c tools/plotting/bar_chart.py
--- a/tools/plotting/bar_chart.py Mon Feb 08 09:53:20 2010 -0500
+++ b/tools/plotting/bar_chart.py Mon Feb 08 10:00:30 2010 -0500
@@ -23,7 +23,6 @@
"""
-from Numeric import *
import Gnuplot, Gnuplot.funcutils
import sys, string, tempfile, os
diff -r 390dfb039df7 -r 4e8785b6815c tools/plotting/bar_chart.xml
--- a/tools/plotting/bar_chart.xml Mon Feb 08 09:53:20 2010 -0500
+++ b/tools/plotting/bar_chart.xml Mon Feb 08 10:00:30 2010 -0500
@@ -1,8 +1,8 @@
<tool id="barchart_gnuplot" name="Bar chart">
<description>for multiple columns</description>
<command interpreter="python">
- #if $xtic.userSpecified == "Yes": #bar_chart.py $input $xtic.xticColumn $colList "$title" "$ylabel" $ymin $ymax $out_file1 "$pdf_size"
- #else: #bar_chart.py $input 0 $colList "$title" "$ylabel" $ymin $ymax $out_file1 "$pdf_size"
+ #if $xtic.userSpecified == "Yes" #bar_chart.py $input $xtic.xticColumn $colList "$title" "$ylabel" $ymin $ymax $out_file1 "$pdf_size"
+ #else #bar_chart.py $input 0 $colList "$title" "$ylabel" $ymin $ymax $out_file1 "$pdf_size"
#end if
</command>
<inputs>
1
0
09 Feb '10
details: http://www.bx.psu.edu/hg/galaxy/rev/390dfb039df7
changeset: 3353:390dfb039df7
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Mon Feb 08 09:53:20 2010 -0500
description:
Refactoring grid code: moved numerous grid column definitions from controller.py to grids.py
diffstat:
lib/galaxy/web/base/controller.py | 83 --------------------------
lib/galaxy/web/controllers/admin.py | 6 +-
lib/galaxy/web/controllers/forms.py | 2 +-
lib/galaxy/web/controllers/history.py | 8 +-
lib/galaxy/web/controllers/library_admin.py | 2 +-
lib/galaxy/web/controllers/page.py | 28 ++++----
lib/galaxy/web/controllers/requests.py | 2 +-
lib/galaxy/web/controllers/requests_admin.py | 4 +-
lib/galaxy/web/controllers/workflow.py | 4 +-
lib/galaxy/web/framework/helpers/grids.py | 89 ++++++++++++++++++++++++++-
10 files changed, 113 insertions(+), 115 deletions(-)
diffs (465 lines):
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/base/controller.py Mon Feb 08 09:53:20 2010 -0500
@@ -9,41 +9,10 @@
from galaxy.web import error, form, url_for
from galaxy.model.orm import *
from galaxy.web.framework.helpers import grids
-from galaxy.util.odict import odict
from Cheetah.Template import Template
log = logging.getLogger( __name__ )
-
-# Useful columns in many grids used by controllers.
-
-class OwnerColumn( grids.TextColumn ):
- """ Column that lists item's owner. """
- def get_value( self, trans, grid, item ):
- return item.user.username
-
-class PublicURLColumn( grids.TextColumn ):
- """ Column displays item's public URL based on username and slug. """
- def get_link( self, trans, grid, item ):
- if item.user.username and item.slug:
- return dict( action='display_by_username_and_slug', username=item.user.username, slug=item.slug )
- elif not item.user.username:
- # TODO: provide link to set username.
- return None
- elif not item.user.slug:
- # TODO: provide link to set slg
- return None
-
-class DeletedColumn( grids.GridColumn ):
- """ Column that tracks and filters for items with deleted attribute. """
- def get_accepted_filters( self ):
- """ Returns a list of accepted filters for this column. """
- accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
- accepted_filters = []
- for label, val in accepted_filter_labels_and_vals.items():
- args = { self.key: val }
- accepted_filters.append( grids.GridColumnFilter( label, args) )
- return accepted_filters
class BaseController( object ):
"""
@@ -138,58 +107,6 @@
return True
Root = BaseController
-
-class SharingStatusColumn( grids.GridColumn ):
- """ Grid column to indicate sharing status. """
- def get_value( self, trans, grid, item ):
- # Delete items cannot be shared.
- if item.deleted:
- return ""
-
- # Build a list of sharing for this item.
- sharing_statuses = []
- if item.users_shared_with:
- sharing_statuses.append( "Shared" )
- if item.importable:
- sharing_statuses.append( "Accessible" )
- if item.published:
- sharing_statuses.append( "Published" )
- return ", ".join( sharing_statuses )
-
- def get_link( self, trans, grid, item ):
- if not item.deleted and ( item.users_shared_with or item.importable or item.published ):
- return dict( operation="share or publish", id=item.id )
- return None
-
- def filter( self, db_session, user, query, column_filter ):
- """ Modify query to filter histories by sharing status. """
- if column_filter == "All":
- pass
- elif column_filter:
- if column_filter == "private":
- query = query.filter( self.model_class.users_shared_with == None )
- query = query.filter( self.model_class.importable == False )
- elif column_filter == "shared":
- query = query.filter( self.model_class.users_shared_with != None )
- elif column_filter == "accessible":
- query = query.filter( self.model_class.importable == True )
- elif column_filter == "published":
- query = query.filter( self.model_class.published == True )
- return query
-
- def get_accepted_filters( self ):
- """ Returns a list of accepted filters for this column. """
- accepted_filter_labels_and_vals = odict()
- accepted_filter_labels_and_vals["private"] = "private"
- accepted_filter_labels_and_vals["shared"] = "shared"
- accepted_filter_labels_and_vals["accessible"] = "accessible"
- accepted_filter_labels_and_vals["published"] = "published"
- accepted_filter_labels_and_vals["all"] = "All"
- accepted_filters = []
- for label, val in accepted_filter_labels_and_vals.items():
- args = { self.key: val }
- accepted_filters.append( grids.GridColumnFilter( label, args) )
- return accepted_filters
class Sharable:
""" Mixin for a controller that manages and item that can be shared. """
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/controllers/admin.py
--- a/lib/galaxy/web/controllers/admin.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/controllers/admin.py Mon Feb 08 09:53:20 2010 -0500
@@ -71,7 +71,7 @@
LastLoginColumn( "Last Login", format=time_ago ),
StatusColumn( "Status", attach_popup=False ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
]
columns.append( grids.MulticolFilterColumn( "Search",
cols_to_filter=[ columns[0], columns[1] ],
@@ -159,7 +159,7 @@
UsersColumn( "Users", attach_popup=False ),
StatusColumn( "Status", attach_popup=False ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
]
columns.append( grids.MulticolFilterColumn( "Search",
cols_to_filter=[ columns[0], columns[1], columns[2] ],
@@ -225,7 +225,7 @@
RolesColumn( "Roles", attach_popup=False ),
StatusColumn( "Status", attach_popup=False ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
]
columns.append( grids.MulticolFilterColumn( "Search",
cols_to_filter=[ columns[0], columns[1], columns[2] ],
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/controllers/forms.py
--- a/lib/galaxy/web/controllers/forms.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/controllers/forms.py Mon Feb 08 09:53:20 2010 -0500
@@ -44,7 +44,7 @@
model_class=model.FormDefinition,
filterable="advanced" ),
TypeColumn( "Type" ),
- DeletedColumn( "Deleted",
+ grids.DeletedColumn( "Deleted",
key="deleted",
visible=False,
filterable="advanced" )
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/controllers/history.py Mon Feb 08 09:53:20 2010 -0500
@@ -44,11 +44,11 @@
attach_popup=True, filterable="advanced" ),
DatasetsByStateColumn( "Datasets (by state)", ncells=4 ),
grids.IndividualTagsColumn( "Tags", "tags", model.History, model.HistoryTagAssociation, filterable="advanced", grid_name="HistoryListGrid" ),
- SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False ),
+ grids.SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False ),
grids.GridColumn( "Created", key="create_time", format=time_ago ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
]
columns.append(
grids.MulticolFilterColumn(
@@ -118,7 +118,7 @@
return query.filter( model.HistoryUserShareAssociation.user == trans.user )
class HistoryAllPublishedGrid( grids.Grid ):
- class NameURLColumn( PublicURLColumn, NameColumn ):
+ class NameURLColumn( grids.PublicURLColumn, NameColumn ):
pass
title = "Published Histories"
@@ -128,7 +128,7 @@
use_async = True
columns = [
NameURLColumn( "Name", key="name", model_class=model.History, filterable="advanced" ),
- OwnerColumn( "Owner", key="username", model_class=model.User, filterable="advanced", sortable=False ),
+ grids.OwnerColumn( "Owner", key="username", model_class=model.User, filterable="advanced", sortable=False ),
grids.CommunityTagsColumn( "Community Tags", "tags", model.History, model.HistoryTagAssociation, filterable="advanced", grid_name="PublicHistoryListGrid" ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago )
]
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/controllers/library_admin.py
--- a/lib/galaxy/web/controllers/library_admin.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/controllers/library_admin.py Mon Feb 08 09:53:20 2010 -0500
@@ -52,7 +52,7 @@
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
StatusColumn( "Status", attach_popup=False ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
]
columns.append( grids.MulticolFilterColumn( "Search",
cols_to_filter=[ columns[0], columns[1] ],
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/controllers/page.py
--- a/lib/galaxy/web/controllers/page.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/controllers/page.py Mon Feb 08 09:53:20 2010 -0500
@@ -16,7 +16,7 @@
class PageListGrid( grids.Grid ):
# Custom column.
- class URLColumn( PublicURLColumn ):
+ class URLColumn( grids.PublicURLColumn ):
def get_value( self, trans, grid, item ):
return url_for( action='display_by_username_and_slug', username=item.user.username, slug=item.slug )
@@ -30,7 +30,7 @@
grids.TextColumn( "Title", key="title", model_class=model.Page, attach_popup=True, filterable="advanced" ),
URLColumn( "Public URL" ),
grids.IndividualTagsColumn( "Tags", "tags", model.Page, model.PageTagAssociation, filterable="advanced", grid_name="PageListGrid" ),
- SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False ),
+ grids.SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False ),
grids.GridColumn( "Created", key="create_time", format=time_ago ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
]
@@ -62,8 +62,8 @@
default_sort_key = "-update_time"
default_filter = dict( title="All", username="All" )
columns = [
- PublicURLColumn( "Title", key="title", model_class=model.Page, filterable="advanced"),
- OwnerColumn( "Owner", key="username", model_class=model.User, filterable="advanced", sortable=False ),
+ grids.PublicURLColumn( "Title", key="title", model_class=model.Page, filterable="advanced"),
+ grids.OwnerColumn( "Owner", key="username", model_class=model.User, filterable="advanced", sortable=False ),
grids.CommunityTagsColumn( "Community Tags", "tags", model.Page, model.PageTagAssociation, filterable="advanced", grid_name="PageAllPublishedGrid" ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago )
]
@@ -100,8 +100,8 @@
grids.IndividualTagsColumn( "Tags", "tags", model.History, model.HistoryTagAssociation, filterable="advanced"),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
- SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False, visible=False ),
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
+ grids.SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False, visible=False ),
]
columns.append(
grids.MulticolFilterColumn(
@@ -144,8 +144,8 @@
grids.IndividualTagsColumn( "Tags", "tags", model.History, model.HistoryTagAssociation, filterable="advanced"),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
- SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False, visible=False ),
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
+ grids.SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False, visible=False ),
]
columns.append(
grids.MulticolFilterColumn(
@@ -167,8 +167,8 @@
grids.IndividualTagsColumn( "Tags", "tags", model.StoredWorkflow, model.HistoryDatasetAssociationTagAssociation, filterable="advanced"),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
- SharingStatusColumn( "Sharing", key="sharing", model_class=model.HistoryDatasetAssociation, filterable="advanced", sortable=False, visible=False ),
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
+ grids.SharingStatusColumn( "Sharing", key="sharing", model_class=model.HistoryDatasetAssociation, filterable="advanced", sortable=False, visible=False ),
]
columns.append(
grids.MulticolFilterColumn(
@@ -192,8 +192,8 @@
grids.IndividualTagsColumn( "Tags", "tags", model.StoredWorkflow, model.StoredWorkflowTagAssociation, filterable="advanced"),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
- SharingStatusColumn( "Sharing", key="sharing", model_class=model.StoredWorkflow, filterable="advanced", sortable=False, visible=False ),
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
+ grids.SharingStatusColumn( "Sharing", key="sharing", model_class=model.StoredWorkflow, filterable="advanced", sortable=False, visible=False ),
]
columns.append(
grids.MulticolFilterColumn(
@@ -212,8 +212,8 @@
grids.IndividualTagsColumn( "Tags", "tags", model.Page, model.PageTagAssociation, filterable="advanced"),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
- SharingStatusColumn( "Sharing", key="sharing", model_class=model.Page, filterable="advanced", sortable=False, visible=False ),
+ grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
+ grids.SharingStatusColumn( "Sharing", key="sharing", model_class=model.Page, filterable="advanced", sortable=False, visible=False ),
]
columns.append(
grids.MulticolFilterColumn(
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/controllers/requests.py
--- a/lib/galaxy/web/controllers/requests.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/controllers/requests.py Mon Feb 08 09:53:20 2010 -0500
@@ -95,7 +95,7 @@
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
TypeColumn( "Type" ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
- DeletedColumn( "Deleted",
+ grids.DeletedColumn( "Deleted",
key="deleted",
visible=False,
filterable="advanced" ),
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/controllers/requests_admin.py
--- a/lib/galaxy/web/controllers/requests_admin.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/controllers/requests_admin.py Mon Feb 08 09:53:20 2010 -0500
@@ -107,7 +107,7 @@
TypeColumn( "Type",
link=( lambda item: iff( item.deleted, None, dict( operation="view_type", id=item.type.id ) ) ), ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
- DeletedColumn( "Deleted",
+ grids.DeletedColumn( "Deleted",
key="deleted",
visible=False,
filterable="advanced" ),
@@ -184,7 +184,7 @@
link=( lambda item: iff( item.deleted, None, dict( operation="view_form", id=item.request_form.id ) ) ), ),
SampleFormColumn( "Sample Form",
link=( lambda item: iff( item.deleted, None, dict( operation="view_form", id=item.sample_form.id ) ) ), ),
- DeletedColumn( "Deleted",
+ grids.DeletedColumn( "Deleted",
key="deleted",
visible=False,
filterable="advanced" )
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/controllers/workflow.py
--- a/lib/galaxy/web/controllers/workflow.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/controllers/workflow.py Mon Feb 08 09:53:20 2010 -0500
@@ -59,8 +59,8 @@
default_filter = dict( public_url="All", username="All", tags="All" )
use_async = True
columns = [
- PublicURLColumn( "Name", key="name", model_class=model.StoredWorkflow, filterable="advanced" ),
- OwnerColumn( "Owner", key="username", model_class=model.User, filterable="advanced", sortable=False ),
+ grids.PublicURLColumn( "Name", key="name", model_class=model.StoredWorkflow, filterable="advanced" ),
+ grids.OwnerColumn( "Owner", key="username", model_class=model.User, filterable="advanced", sortable=False ),
grids.CommunityTagsColumn( "Community Tags", "tags", model.StoredWorkflow, model.StoredWorkflowTagAssociation, filterable="advanced", grid_name="PublicWorkflowListGrid" ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago )
]
diff -r aa81684b9275 -r 390dfb039df7 lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py Mon Feb 08 09:03:07 2010 -0500
+++ b/lib/galaxy/web/framework/helpers/grids.py Mon Feb 08 09:53:20 2010 -0500
@@ -5,6 +5,7 @@
from galaxy.tags.tag_handler import TagHandler
from galaxy.web import url_for
from galaxy.util.json import from_json_string, to_json_string
+from galaxy.util.odict import odict
import sys, logging, math
@@ -329,8 +330,8 @@
accepted_filters.append( GridColumnFilter( val, args) )
return accepted_filters
-# Generic column that employs freetext and, hence, supports freetext, case-independent filtering.
class TextColumn( GridColumn ):
+ """ Generic column that employs freetext and, hence, supports freetext, case-independent filtering. """
def filter( self, db_session, user, query, column_filter ):
""" Modify query to filter using free text, case independence. """
if column_filter == "All":
@@ -350,8 +351,8 @@
clause_list.append( func.lower( model_class_key_field ).like( "%" + filter.lower() + "%" ) )
return and_( *clause_list )
-# Column that supports community tags.
class CommunityTagsColumn( TextColumn ):
+ """ Column that supports community tags. """
def __init__( self, col_name, key, model_class, model_tag_association_class, filterable, grid_name=None ):
GridColumn.__init__(self, col_name, key=key, model_class=model_class, filterable=filterable)
self.model_tag_association_class = model_tag_association_class
@@ -386,8 +387,8 @@
clause_list.append( self.model_class.tags.any( func.lower( self.model_tag_association_class.user_value ).like( "%" + value.lower() + "%" ) ) )
return and_( *clause_list )
-# Column that supports individual tags.
class IndividualTagsColumn( CommunityTagsColumn ):
+ """ Column that supports individual tags. """
def get_value( self, trans, grid, item ):
return trans.fill_template( "/tagging_common.mako", tag_type="individual", trans=trans, user=trans.get_user(), tagged_item=item, elt_context=self.grid_name,
in_form=True, input_size="20", tag_click_fn="add_tag_to_grid_filter" )
@@ -408,8 +409,8 @@
clause_list.append( self.model_class.tags.any( and_( func.lower( self.model_tag_association_class.user_value ).like( "%" + value.lower() + "%" ), self.model_tag_association_class.user == user ) ) )
return and_( *clause_list )
-# Column that performs multicolumn filtering.
class MulticolFilterColumn( TextColumn ):
+ """ Column that performs multicolumn filtering. """
def __init__( self, col_name, cols_to_filter, key, visible, filterable="default" ):
GridColumn.__init__( self, col_name, key=key, visible=visible, filterable=filterable)
self.cols_to_filter = cols_to_filter
@@ -432,6 +433,86 @@
complete_filter = or_( *clause_list )
return query.filter( complete_filter )
+
+class OwnerColumn( TextColumn ):
+ """ Column that lists item's owner. """
+ def get_value( self, trans, grid, item ):
+ return item.user.username
+
+class PublicURLColumn( TextColumn ):
+ """ Column displays item's public URL based on username and slug. """
+ def get_link( self, trans, grid, item ):
+ if item.user.username and item.slug:
+ return dict( action='display_by_username_and_slug', username=item.user.username, slug=item.slug )
+ elif not item.user.username:
+ # TODO: provide link to set username.
+ return None
+ elif not item.user.slug:
+ # TODO: provide link to set slg
+ return None
+
+class DeletedColumn( GridColumn ):
+ """ Column that tracks and filters for items with deleted attribute. """
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( GridColumnFilter( label, args) )
+ return accepted_filters
+
+class SharingStatusColumn( GridColumn ):
+ """ Grid column to indicate sharing status. """
+ def get_value( self, trans, grid, item ):
+ # Delete items cannot be shared.
+ if item.deleted:
+ return ""
+
+ # Build a list of sharing for this item.
+ sharing_statuses = []
+ if item.users_shared_with:
+ sharing_statuses.append( "Shared" )
+ if item.importable:
+ sharing_statuses.append( "Accessible" )
+ if item.published:
+ sharing_statuses.append( "Published" )
+ return ", ".join( sharing_statuses )
+
+ def get_link( self, trans, grid, item ):
+ if not item.deleted and ( item.users_shared_with or item.importable or item.published ):
+ return dict( operation="share or publish", id=item.id )
+ return None
+
+ def filter( self, db_session, user, query, column_filter ):
+ """ Modify query to filter histories by sharing status. """
+ if column_filter == "All":
+ pass
+ elif column_filter:
+ if column_filter == "private":
+ query = query.filter( self.model_class.users_shared_with == None )
+ query = query.filter( self.model_class.importable == False )
+ elif column_filter == "shared":
+ query = query.filter( self.model_class.users_shared_with != None )
+ elif column_filter == "accessible":
+ query = query.filter( self.model_class.importable == True )
+ elif column_filter == "published":
+ query = query.filter( self.model_class.published == True )
+ return query
+
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = odict()
+ accepted_filter_labels_and_vals["private"] = "private"
+ accepted_filter_labels_and_vals["shared"] = "shared"
+ accepted_filter_labels_and_vals["accessible"] = "accessible"
+ accepted_filter_labels_and_vals["published"] = "published"
+ accepted_filter_labels_and_vals["all"] = "All"
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( GridColumnFilter( label, args) )
+ return accepted_filters
class GridOperation( object ):
def __init__( self, label, key=None, condition=None, allow_multiple=True, allow_popup=True, target=None, url_args=None, async_compatible=False, confirm=None ):
1
0
09 Feb '10
details: http://www.bx.psu.edu/hg/galaxy/rev/aa81684b9275
changeset: 3352:aa81684b9275
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Mon Feb 08 09:03:07 2010 -0500
description:
Bug fixes to slug editing, tooltips, and click-to-edit elements.
diffstat:
lib/galaxy/web/controllers/history.py | 2 +-
lib/galaxy/web/controllers/page.py | 2 +-
lib/galaxy/web/controllers/workflow.py | 2 +-
static/june_2007_style/base.css.tmpl | 6 +++---
static/june_2007_style/blue/base.css | 4 ++--
static/scripts/autocomplete_tagging.js | 9 +++++++--
static/scripts/galaxy.base.js | 7 +++++++
static/scripts/packed/autocomplete_tagging.js | 2 +-
static/scripts/packed/galaxy.base.js | 2 +-
static/scripts/packed/trackster.js | 2 +-
templates/root/history.mako | 6 +++---
templates/sharing_base.mako | 2 +-
templates/tagging_common.mako | 26 ++++++++++++--------------
13 files changed, 41 insertions(+), 31 deletions(-)
diffs (246 lines):
diff -r 60308825b252 -r aa81684b9275 lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Fri Feb 05 23:03:03 2010 -0500
+++ b/lib/galaxy/web/controllers/history.py Mon Feb 08 09:03:07 2010 -0500
@@ -405,7 +405,7 @@
if history:
history.slug = new_slug
trans.sa_session.flush()
- return
+ return history.slug
@web.expose
def name_autocomplete_data( self, trans, q=None, limit=None, timestamp=None ):
diff -r 60308825b252 -r aa81684b9275 lib/galaxy/web/controllers/page.py
--- a/lib/galaxy/web/controllers/page.py Fri Feb 05 23:03:03 2010 -0500
+++ b/lib/galaxy/web/controllers/page.py Mon Feb 08 09:03:07 2010 -0500
@@ -547,7 +547,7 @@
if page:
page.slug = new_slug
trans.sa_session.flush()
- return
+ return page.slug
@web.expose
@web.json
diff -r 60308825b252 -r aa81684b9275 lib/galaxy/web/controllers/workflow.py
--- a/lib/galaxy/web/controllers/workflow.py Fri Feb 05 23:03:03 2010 -0500
+++ b/lib/galaxy/web/controllers/workflow.py Mon Feb 08 09:03:07 2010 -0500
@@ -389,7 +389,7 @@
if stored:
stored.slug = new_slug
trans.sa_session.flush()
- return
+ return stored.slug
@web.expose
@web.json
diff -r 60308825b252 -r aa81684b9275 static/june_2007_style/base.css.tmpl
--- a/static/june_2007_style/base.css.tmpl Fri Feb 05 23:03:03 2010 -0500
+++ b/static/june_2007_style/base.css.tmpl Mon Feb 08 09:03:07 2010 -0500
@@ -718,7 +718,7 @@
cursor: pointer;
}
-.tooltip span.tip {
+span.tip {
display: none
}
@@ -726,8 +726,8 @@
font-size: 90%;
display: block;
position: absolute;
- right:2em;top:-1.75em;
- width: inherit;
+ left:2em;
+ bottom:1.75em;
background-color: black;
color: white;
text-align: center;
diff -r 60308825b252 -r aa81684b9275 static/june_2007_style/blue/base.css
--- a/static/june_2007_style/blue/base.css Fri Feb 05 23:03:03 2010 -0500
+++ b/static/june_2007_style/blue/base.css Mon Feb 08 09:03:07 2010 -0500
@@ -120,7 +120,7 @@
.icon-button.tag{background-image:url(/static/images/tag-label.png);background-repeat:no-repeat;background-position:center;padding: 0px 0px 0px 0px;}
.icon-button.annotate{background-image:url(/static/images/sticky-note-text.png);background-repeat:no-repeat;background-position:center;padding: 0px 0px 0px 0px;}
.tooltip {position: relative; cursor: pointer}
-.tooltip span.tip{display: none;}
-.tooltip:hover span.tip{font-size: 90%; display: block;position: absolute;right:2em;top:-1.75em; width: inherit; background-color: black;color: white;text-align: center;padding: 0.25em 0.5em;}
+span.tip{display: none;}
+.tooltip:hover span.tip{font-size: 90%; display: block;position: absolute;left:3em;bottom:1.75em; background-color: black;color: white;text-align: center;padding: 0.25em 0.5em;}
.editable-text{cursor:pointer}
.editable-text:hover{background-image:url();background-repeat:no-repeat;background-position:right}
\ No newline at end of file
diff -r 60308825b252 -r aa81684b9275 static/scripts/autocomplete_tagging.js
--- a/static/scripts/autocomplete_tagging.js Fri Feb 05 23:03:03 2010 -0500
+++ b/static/scripts/autocomplete_tagging.js Mon Feb 08 09:03:07 2010 -0500
@@ -259,6 +259,7 @@
add_tag_button.show();
tag_input_field.hide();
tag_area.removeClass("active-tag-area");
+ tag_area.addClass("tooltip");
}
else
{
@@ -273,11 +274,14 @@
// If a "delete image" object was pressed and area is inactive, do nothing.
if ($(e.target).hasClass("delete-tag-img") && !is_active)
- return false;
+ return false;
// If a "tag name" object was pressed and area is inactive, do nothing.
if ($(e.target).hasClass("tag-name") && !is_active)
- return false;
+ return false;
+
+ // Remove tooltip.
+ $(this).removeClass("tooltip");
// Hide add tag button, show tag_input field. Change background to show
// area is active.
@@ -299,6 +303,7 @@
{
tag_area.blur();
$(document).unbind("click", handle_document_click);
+ $(this).addClass("tooltip");
}
};
// TODO: we should attach the click handler to all frames in order to capture
diff -r 60308825b252 -r aa81684b9275 static/scripts/galaxy.base.js
--- a/static/scripts/galaxy.base.js Fri Feb 05 23:03:03 2010 -0500
+++ b/static/scripts/galaxy.base.js Mon Feb 08 09:03:07 2010 -0500
@@ -229,9 +229,13 @@
t.blur( function() {
$(this).remove();
$("#" + text_elt_id).show();
+ if (has_tooltip)
+ tooltip_elt.addClass("tooltip");
if (on_finish != null)
on_finish(t);
});
+ var has_tooltip = $(this).hasClass("tooltip");
+ var tooltip_elt = $(this);
t.keyup( function( e ) {
if ( e.keyCode == 27 ) {
// Escape key
@@ -268,6 +272,9 @@
t.insertAfter( $("#" + text_elt_id) );
t.focus();
t.select();
+
+ // Remove tooltip so that it doesn't show during editing.
+ $(this).removeClass("tooltip");
return false;
});
diff -r 60308825b252 -r aa81684b9275 static/scripts/packed/autocomplete_tagging.js
--- a/static/scripts/packed/autocomplete_tagging.js Fri Feb 05 23:03:03 2010 -0500
+++ b/static/scripts/packed/autocomplete_tagging.js Mon Feb 08 09:03:07 2010 -0500
@@ -1,1 +1,1 @@
-function init_tag_click_function(b,a){$(b).find(".tag-name").each(function(){$(this).click(function(){var d=$(this).text();var c=d.split(":");a(c[0],c[1]);return true})})}jQuery.fn.autocomplete_tagging=function(q){var g={get_toggle_link_text_fn:function(r){var t="";var s=o(r);if(s!=0){t=s+(s!=0?" Tags":" Tag")}else{t="Add tags"}return t},tag_click_fn:function(r,s){},editable:true,input_size:20,in_form:false,tags:{},use_toggle_link:true,item_id:"",add_tag_img:"",add_tag_img_rollover:"",delete_tag_img:"",ajax_autocomplete_tag_url:"",ajax_retag_url:"",ajax_delete_tag_url:"",ajax_add_tag_url:""};var e=jQuery.extend(g,q);var o=function(r){if(r.length){return r.length}var s=0;for(element in r){s++}return s};var h=$(this);var c=h.find(".tag-area");var f=h.find(".toggle-link");var b=h.find(".tag-input");var n=h.find(".add-tag-button");f.click(function(){var r=(c.css("display")=="none");var s;if(r){s=function(){var t=$(this).find(".tag-button").length;if(t==0){c.click()}}}else{s=func
tion(){c.blur()}}c.slideToggle("fast",s);return $(this)});if(e.editable){b.hide()}b.keyup(function(w){if(w.keyCode==27){$(this).trigger("blur")}else{if((w.keyCode==13)||(w.keyCode==188)||(w.keyCode==32)){new_value=this.value;if(return_key_pressed_for_autocomplete==true){return_key_pressed_for_autocomplete=false;return false}if(new_value.indexOf(": ",new_value.length-2)!=-1){this.value=new_value.substring(0,new_value.length-1);return false}if((w.keyCode==188)||(w.keyCode==32)){new_value=new_value.substring(0,new_value.length-1)}new_value=new_value.replace(/^\s+|\s+$/g,"");if(new_value.length<2){return false}this.value="";var t=k(new_value);var s=c.children(".tag-button");if(s.length!=0){var x=s.slice(s.length-1);x.after(t)}else{c.prepend(t)}var r=new_value.split(":");e.tags[r[0]]=r[1];var u=e.get_toggle_link_text_fn(e.tags);f.text(u);var v=$(this);$.ajax({url:e.ajax_add_tag_url,data:{new_tag:new_value},error:function(){t.remove();delete e.tags[r[0]];var y=e.get_toggle_link_te
xt_fn(e.tags);f.text(y);alert("Add tag failed")},success:function(){v.flushCache()}});return false}}});var j=function(t,s,r,v,u){tag_name_and_value=v.split(":");return(tag_name_and_value.length==1?tag_name_and_value[0]:tag_name_and_value[1])};var i={selectFirst:false,formatItem:j,autoFill:false,highlight:false};b.autocomplete(e.ajax_autocomplete_tag_url,i);h.find(".delete-tag-img").each(function(){d($(this))});init_tag_click_function($(this),e.tag_click_fn);n.click(function(){$(this).hide();c.click();return false});if(e.editable){c.blur(function(r){p=o(e.tags);if(p!=0){n.show();b.hide();c.removeClass("active-tag-area")}else{}});c.click(function(t){var s=$(this).hasClass("active-tag-area");if($(t.target).hasClass("delete-tag-img")&&!s){return false}if($(t.target).hasClass("tag-name")&&!s){return false}$(this).addClass("active-tag-area");n.hide();b.show();b.focus();var r=function(v){var u=c.attr("id");if(($(v.target).attr("id")!=u)&&($(v.target).parents().filter(u).length==0))
{c.blur();$(document).unbind("click",r)}};$(window).click(r);return false})}if(e.use_toggle_link){c.hide()}else{var p=o(e.tags);if(p==0){n.hide();b.show()}}function l(s,r){return s+((r!=""&&r)?":"+r:"")}function d(r){$(r).mouseenter(function(){$(this).attr("src",e.delete_tag_img_rollover)});$(r).mouseleave(function(){$(this).attr("src",e.delete_tag_img)});$(r).click(function(){var x=$(this).parent();var w=x.find(".tag-name").eq(0);var v=w.text();var t=m(v);var z=t[0];var s=t[1];var y=x.prev();x.remove();delete e.tags[z];var u=e.get_toggle_link_text_fn(e.tags);f.text(u);$.ajax({url:e.ajax_delete_tag_url,data:{tag_name:z},error:function(){e.tags[z]=s;if(y.hasClass("tag-button")){y.after(x)}else{c.prepend(x)}var A=e.get_toggle_link_text_fn(e.tags);alert("Remove tag failed");f.text(A);r.mouseenter(function(){$(this).attr("src",e.delete_tag_img_rollover)});r.mouseleave(function(){$(this).attr("src",e.delete_tag_img)})},success:function(){}});return true})}function a(r){var s=new
Array();for(key in r){s[s.length]=key+"-->"+r[key]}return"{"+s.join(",")+"}"}function m(r){return r.split(":")}function k(r){var s=$("<img src='"+e.delete_tag_img+"'/>").addClass("delete-tag-img");d(s);var t=$("<span>").text(r).addClass("tag-name");t.click(function(){tag_name_and_value=r.split(":");e.tag_click_fn(tag_name_and_value[0],tag_name_and_value[1]);return true});var u=$("<span></span>").addClass("tag-button");u.append(t);if(e.editable){u.append(s)}return u}};
\ No newline at end of file
+function init_tag_click_function(b,a){$(b).find(".tag-name").each(function(){$(this).click(function(){var d=$(this).text();var c=d.split(":");a(c[0],c[1]);return true})})}jQuery.fn.autocomplete_tagging=function(q){var g={get_toggle_link_text_fn:function(r){var t="";var s=o(r);if(s!=0){t=s+(s!=0?" Tags":" Tag")}else{t="Add tags"}return t},tag_click_fn:function(r,s){},editable:true,input_size:20,in_form:false,tags:{},use_toggle_link:true,item_id:"",add_tag_img:"",add_tag_img_rollover:"",delete_tag_img:"",ajax_autocomplete_tag_url:"",ajax_retag_url:"",ajax_delete_tag_url:"",ajax_add_tag_url:""};var e=jQuery.extend(g,q);var o=function(r){if(r.length){return r.length}var s=0;for(element in r){s++}return s};var h=$(this);var c=h.find(".tag-area");var f=h.find(".toggle-link");var b=h.find(".tag-input");var n=h.find(".add-tag-button");f.click(function(){var r=(c.css("display")=="none");var s;if(r){s=function(){var t=$(this).find(".tag-button").length;if(t==0){c.click()}}}else{s=func
tion(){c.blur()}}c.slideToggle("fast",s);return $(this)});if(e.editable){b.hide()}b.keyup(function(w){if(w.keyCode==27){$(this).trigger("blur")}else{if((w.keyCode==13)||(w.keyCode==188)||(w.keyCode==32)){new_value=this.value;if(return_key_pressed_for_autocomplete==true){return_key_pressed_for_autocomplete=false;return false}if(new_value.indexOf(": ",new_value.length-2)!=-1){this.value=new_value.substring(0,new_value.length-1);return false}if((w.keyCode==188)||(w.keyCode==32)){new_value=new_value.substring(0,new_value.length-1)}new_value=new_value.replace(/^\s+|\s+$/g,"");if(new_value.length<2){return false}this.value="";var t=k(new_value);var s=c.children(".tag-button");if(s.length!=0){var x=s.slice(s.length-1);x.after(t)}else{c.prepend(t)}var r=new_value.split(":");e.tags[r[0]]=r[1];var u=e.get_toggle_link_text_fn(e.tags);f.text(u);var v=$(this);$.ajax({url:e.ajax_add_tag_url,data:{new_tag:new_value},error:function(){t.remove();delete e.tags[r[0]];var y=e.get_toggle_link_te
xt_fn(e.tags);f.text(y);alert("Add tag failed")},success:function(){v.flushCache()}});return false}}});var j=function(t,s,r,v,u){tag_name_and_value=v.split(":");return(tag_name_and_value.length==1?tag_name_and_value[0]:tag_name_and_value[1])};var i={selectFirst:false,formatItem:j,autoFill:false,highlight:false};b.autocomplete(e.ajax_autocomplete_tag_url,i);h.find(".delete-tag-img").each(function(){d($(this))});init_tag_click_function($(this),e.tag_click_fn);n.click(function(){$(this).hide();c.click();return false});if(e.editable){c.blur(function(r){p=o(e.tags);if(p!=0){n.show();b.hide();c.removeClass("active-tag-area");c.addClass("tooltip")}else{}});c.click(function(t){var s=$(this).hasClass("active-tag-area");if($(t.target).hasClass("delete-tag-img")&&!s){return false}if($(t.target).hasClass("tag-name")&&!s){return false}$(this).removeClass("tooltip");$(this).addClass("active-tag-area");n.hide();b.show();b.focus();var r=function(v){var u=c.attr("id");if(($(v.target).attr("i
d")!=u)&&($(v.target).parents().filter(u).length==0)){c.blur();$(document).unbind("click",r);$(this).addClass("tooltip")}};$(window).click(r);return false})}if(e.use_toggle_link){c.hide()}else{var p=o(e.tags);if(p==0){n.hide();b.show()}}function l(s,r){return s+((r!=""&&r)?":"+r:"")}function d(r){$(r).mouseenter(function(){$(this).attr("src",e.delete_tag_img_rollover)});$(r).mouseleave(function(){$(this).attr("src",e.delete_tag_img)});$(r).click(function(){var x=$(this).parent();var w=x.find(".tag-name").eq(0);var v=w.text();var t=m(v);var z=t[0];var s=t[1];var y=x.prev();x.remove();delete e.tags[z];var u=e.get_toggle_link_text_fn(e.tags);f.text(u);$.ajax({url:e.ajax_delete_tag_url,data:{tag_name:z},error:function(){e.tags[z]=s;if(y.hasClass("tag-button")){y.after(x)}else{c.prepend(x)}var A=e.get_toggle_link_text_fn(e.tags);alert("Remove tag failed");f.text(A);r.mouseenter(function(){$(this).attr("src",e.delete_tag_img_rollover)});r.mouseleave(function(){$(this).attr("src",e
.delete_tag_img)})},success:function(){}});return true})}function a(r){var s=new Array();for(key in r){s[s.length]=key+"-->"+r[key]}return"{"+s.join(",")+"}"}function m(r){return r.split(":")}function k(r){var s=$("<img src='"+e.delete_tag_img+"'/>").addClass("delete-tag-img");d(s);var t=$("<span>").text(r).addClass("tag-name");t.click(function(){tag_name_and_value=r.split(":");e.tag_click_fn(tag_name_and_value[0],tag_name_and_value[1]);return true});var u=$("<span></span>").addClass("tag-button");u.append(t);if(e.editable){u.append(s)}return u}};
\ No newline at end of file
diff -r 60308825b252 -r aa81684b9275 static/scripts/packed/galaxy.base.js
--- a/static/scripts/packed/galaxy.base.js Fri Feb 05 23:03:03 2010 -0500
+++ b/static/scripts/packed/galaxy.base.js Mon Feb 08 09:03:07 2010 -0500
@@ -1,1 +1,1 @@
-$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};jQuery(document).ready(function(){jQuery("a[confirm]").click(function(){return confirm(jQuery(this).attr("confirm"))});make_popup_menus()});function make_popup_menus(){jQuery("div[popupmenu]").each(function(){var c={};$(this).find("a").each(function(){var b=$(this).attr("confirm"),d=$(this).attr("href"),e=$(this).attr("target");c[$(this).text()]=function(){if(!b||confirm(b)){var g=window;if(e=="_parent"){g=window.parent}else{if(e=="_top"){g=window.top}}g.location=d}}});var a=$("#"+$(this).attr("popupmenu"));make_popupmenu(a,c);$(this).remove();a.addClass("popup").show()})}function ensure_popup_helper(){if($("#popup-helper").length==0){$("<div id='popup-helper'/>").css({background:"white",opacity:0,zIndex:15000,position:"absolute",t
op:0,left:0,width:"100%",height:"100%"}).appendTo("body").hide()}}function make_popupmenu(d,c){ensure_popup_helper();var a=$(d);var b=$("<ul id='"+d.attr("id")+"-menu'></ul>");$.each(c,function(g,f){if(f){$("<li/>").html(g).click(f).appendTo(b)}else{$("<li class='head'/>").html(g).appendTo(b)}});var e=$("<div class='popmenu-wrapper'>");e.append(b).append("<div class='overlay-border'>").css("position","absolute").appendTo("body").hide();attach_popupmenu(d,e)}function attach_popupmenu(b,d){var a=function(){d.unbind().hide();$("#popup-helper").unbind("click.popupmenu").hide()};var c=function(g){var h=$(b).offset();$("#popup-helper").bind("click.popupmenu",a).show();d.click(a).css({left:0,top:-1000}).show();var f=g.pageX-d.width()/2;f=Math.min(f,$(document).scrollLeft()+$(window).width()-$(d).width()-20);f=Math.max(f,$(document).scrollLeft()+20);d.css({top:g.pageY-5,left:f});return false};$(b).click(c)}var array_length=function(a){if(a.length){return a.length}var b=0;for(element
in a){b++}return b};var replace_dbkey_select=function(){var c=$("select[name=dbkey]");var d=c.attr("value");if(c.length!=0){var e=$("<input id='dbkey-input' type='text'></input>");e.attr("size",40);e.attr("name",c.attr("name"));e.click(function(){var g=$(this).attr("value");$(this).attr("value","Loading...");$(this).showAllInCache();$(this).attr("value",g);$(this).select()});var b=new Array();var a=new Object();c.children("option").each(function(){var h=$(this).text();var g=$(this).attr("value");if(g=="?"){return}b.push(h);a[h]=g;if(g==d){e.attr("value",h)}});if(e.attr("value")==""){e.attr("value","Click to Search or Select Build")}var f={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:1000,minChars:0,hideForLessThanMinChars:false};e.autocomplete(b,f);c.replaceWith(e);$("form").submit(function(){var i=$("#dbkey-input");if(i.length!=0){var h=i.attr("value");var g=a[h];if(g!=null&&g!=undefined){i.attr("value",g)}else{if(d!=""){i.attr("value",d)}else{i.
attr("value","?")}}}})}};function async_save_text(d,f,e,a,c,h,i,g,b){if(c==null){c=30}if(i==null){i=4}$("#"+d).click(function(){var k=$("#"+f).text();if(h){var j=$("<textarea rows='"+i+"' cols='"+c+"'>"+k+"</textarea>")}else{var j=$("<input type='text' value='"+k+"' size='"+c+"'></input>")}j.blur(function(){$(this).remove();$("#"+f).show();if(b!=null){b(j)}});j.keyup(function(m){if(m.keyCode==27){$(this).trigger("blur")}else{if(m.keyCode==13){new_text=this.value;$(this).trigger("blur");var l=new Object();l[a]=new_text;$.ajax({url:e,data:l,error:function(){alert("Text editing for elt "+f+" failed")},success:function(n){$("#"+f).text(n);if(b!=null){b(j)}}})}}});if(g!=null){g(j)}$("#"+f).hide();j.insertAfter($("#"+f));j.focus();j.select();return false})};
\ No newline at end of file
+$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};jQuery(document).ready(function(){jQuery("a[confirm]").click(function(){return confirm(jQuery(this).attr("confirm"))});make_popup_menus()});function make_popup_menus(){jQuery("div[popupmenu]").each(function(){var c={};$(this).find("a").each(function(){var b=$(this).attr("confirm"),d=$(this).attr("href"),e=$(this).attr("target");c[$(this).text()]=function(){if(!b||confirm(b)){var g=window;if(e=="_parent"){g=window.parent}else{if(e=="_top"){g=window.top}}g.location=d}}});var a=$("#"+$(this).attr("popupmenu"));make_popupmenu(a,c);$(this).remove();a.addClass("popup").show()})}function ensure_popup_helper(){if($("#popup-helper").length==0){$("<div id='popup-helper'/>").css({background:"white",opacity:0,zIndex:15000,position:"absolute",t
op:0,left:0,width:"100%",height:"100%"}).appendTo("body").hide()}}function make_popupmenu(d,c){ensure_popup_helper();var a=$(d);var b=$("<ul id='"+d.attr("id")+"-menu'></ul>");$.each(c,function(g,f){if(f){$("<li/>").html(g).click(f).appendTo(b)}else{$("<li class='head'/>").html(g).appendTo(b)}});var e=$("<div class='popmenu-wrapper'>");e.append(b).append("<div class='overlay-border'>").css("position","absolute").appendTo("body").hide();attach_popupmenu(d,e)}function attach_popupmenu(b,d){var a=function(){d.unbind().hide();$("#popup-helper").unbind("click.popupmenu").hide()};var c=function(g){var h=$(b).offset();$("#popup-helper").bind("click.popupmenu",a).show();d.click(a).css({left:0,top:-1000}).show();var f=g.pageX-d.width()/2;f=Math.min(f,$(document).scrollLeft()+$(window).width()-$(d).width()-20);f=Math.max(f,$(document).scrollLeft()+20);d.css({top:g.pageY-5,left:f});return false};$(b).click(c)}var array_length=function(a){if(a.length){return a.length}var b=0;for(element
in a){b++}return b};var replace_dbkey_select=function(){var c=$("select[name=dbkey]");var d=c.attr("value");if(c.length!=0){var e=$("<input id='dbkey-input' type='text'></input>");e.attr("size",40);e.attr("name",c.attr("name"));e.click(function(){var g=$(this).attr("value");$(this).attr("value","Loading...");$(this).showAllInCache();$(this).attr("value",g);$(this).select()});var b=new Array();var a=new Object();c.children("option").each(function(){var h=$(this).text();var g=$(this).attr("value");if(g=="?"){return}b.push(h);a[h]=g;if(g==d){e.attr("value",h)}});if(e.attr("value")==""){e.attr("value","Click to Search or Select Build")}var f={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:1000,minChars:0,hideForLessThanMinChars:false};e.autocomplete(b,f);c.replaceWith(e);$("form").submit(function(){var i=$("#dbkey-input");if(i.length!=0){var h=i.attr("value");var g=a[h];if(g!=null&&g!=undefined){i.attr("value",g)}else{if(d!=""){i.attr("value",d)}else{i.
attr("value","?")}}}})}};function async_save_text(d,f,e,a,c,h,i,g,b){if(c==null){c=30}if(i==null){i=4}$("#"+d).click(function(){var l=$("#"+f).text();if(h){var j=$("<textarea rows='"+i+"' cols='"+c+"'>"+l+"</textarea>")}else{var j=$("<input type='text' value='"+l+"' size='"+c+"'></input>")}j.blur(function(){$(this).remove();$("#"+f).show();if(m){k.addClass("tooltip")}if(b!=null){b(j)}});var m=$(this).hasClass("tooltip");var k=$(this);j.keyup(function(o){if(o.keyCode==27){$(this).trigger("blur")}else{if(o.keyCode==13){new_text=this.value;$(this).trigger("blur");var n=new Object();n[a]=new_text;$.ajax({url:e,data:n,error:function(){alert("Text editing for elt "+f+" failed")},success:function(p){$("#"+f).text(p);if(b!=null){b(j)}}})}}});if(g!=null){g(j)}$("#"+f).hide();j.insertAfter($("#"+f));j.focus();j.select();$(this).removeClass("tooltip");return false})};
\ No newline at end of file
diff -r 60308825b252 -r aa81684b9275 static/scripts/packed/trackster.js
--- a/static/scripts/packed/trackster.js Fri Feb 05 23:03:03 2010 -0500
+++ b/static/scripts/packed/trackster.js Mon Feb 08 09:03:07 2010 -0500
@@ -1,1 +1,1 @@
-var DEBUG=false;var DENSITY=1000,FEATURE_LEVELS=10,DATA_ERROR="There was an error in indexing this dataset.",DATA_NONE="No data for this chrom/contig.",DATA_PENDING="Currently indexing... please wait",DATA_LOADING="Loading data...",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=30,CACHED_DATA=20,CONTEXT=$("<canvas></canvas>").get(0).getContext("2d"),RIGHT_STRAND,LEFT_STRAND;var right_img=new Image();right_img.src="../images/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src="../images/visualization/strand_left.png";left_img.onload=function(){LEFT_STRAND=CONTEXT.createPattern(left_img,"repeat")};var right_img_inv=new Image();right_img_inv.src="../images/visualization/strand_right_inv.png";right_img_inv.onload=function(){RIGHT_STRAND_INV=CONTEXT.createPattern(right_img_inv,"repeat")};var left_img_inv=new Image();left_img_inv.src="../images/visualization/strand_left_inv.png";left_i
mg_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}var Cache=function(a){this.num_elements=a;this.clear()};$.extend(Cache.prototype,{get:function(b){var a=this.key_ary.indexOf(b);if(a!=-1){this.key_ary.splice(a,1);this.key_ary.push(b)}return this.obj_cache[b]},set:function(b,c){if(!this.obj_cache[b]){if(this.key_ary.length>=this.num_elements){var a=this.key_ary.shift();delete this.obj_cache[a]}this.key_ary.push(b)}this.obj_cache[b]=c;return c},clear:function(){this.obj_cache={};this.key_ary=[]}});var View=function(c,a,b){this.chrom=c;this.config=b;this.tracks=[];this.max_low=0;this.max_high=a;this.center=(this.max_high-this.max_low)/2;this.span=this.max_high-this.max_low;this.zoom_factor=3;this.zoom_level=0};$.extend(View.prototype,{add_track:function(a){a.view=this;this.tracks.push(a);if(a.init){a.init()}},remove_track:function(a){delete this
.tracks[a]},update_options:function(){for(var b in view.tracks){var a=view.tracks[b];if(a.update_options){a.update_options(b)}}},redraw:function(){var d=this.span/Math.pow(this.zoom_factor,this.zoom_level),b=this.center-(d/2),e=b+d;if(b<0){b=0;e=b+d}else{if(e>this.max_high){e=this.max_high;b=e-d}}this.low=Math.floor(b);this.high=Math.ceil(e);this.center=Math.round(this.low+(this.high-this.low)/2);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/DENSITY)/Math.LN10));this.zoom_res=Math.pow(FEATURE_LEVELS,Math.max(0,Math.ceil(Math.log(this.resolution,FEATURE_LEVELS)/Math.log(FEATURE_LEVELS))));$("#overview-box").css({left:(this.low/this.span)*$("#overview-viewport").width(),width:Math.max(12,((this.high-this.low)/this.span)*$("#overview-viewport").width())}).show();$("#low").val(commatize(this.low));$("#high").val(commatize(this.high));for(var c=0,a=this.tracks.length;c<a;c++){this.tracks[c].draw()}},zoom_in:function(a){if(this.max_high===0||this.high-this.lo
w<30){return}if(a){this.center=a/$(document).width()*(this.high-this.low)+this.low}this.zoom_level+=1;this.redraw()},zoom_out:function(){if(this.max_high===0){return}if(this.zoom_level<=0){this.zoom_level=0;return}this.zoom_level-=1;this.redraw()}});var Track=function(a,b){this.name=a;this.parent_element=b;this.make_container()};$.extend(Track.prototype,{make_container:function(){this.header_div=$("<div class='track-header'>").text(this.name);this.content_div=$("<div class='track-content'>");this.container_div=$("<div class='track'></div>").append(this.header_div).append(this.content_div);this.parent_element.append(this.container_div)}});var TiledTrack=function(){};$.extend(TiledTrack.prototype,Track.prototype,{draw:function(){var i=this.view.low,e=this.view.high,f=e-i,d=this.view.resolution;if(DEBUG){$("#debug").text(d+" "+this.view.zoom_res)}var k=$("<div style='position: relative;'></div>");this.content_div.children(":first").remove();this.content_div.append(k);var l=this
.content_div.width()/f;var h;var a=Math.floor(i/d/DENSITY);while((a*DENSITY*d)<e){var j=this.content_div.width()+"_"+this.view.zoom_level+"_"+a;var c=this.tile_cache.get(j);if(c){var g=a*DENSITY*d;var b=(g-i)*l;if(this.left_offset){b-=this.left_offset}c.css({left:b});k.append(c);this.max_height=Math.max(this.max_height,c.height())}else{this.delayed_draw(this,j,i,e,a,d,k,l)}a+=1}},delayed_draw:function(c,e,a,f,b,d,g,h){setTimeout(function(){if(!(a>c.view.high||f<c.view.low)){tile_element=c.draw_tile(d,b,g,h);if(tile_element){c.tile_cache.set(e,tile_element);c.max_height=Math.max(c.max_height,tile_element.height());c.content_div.css("height",c.max_height)}}},50)}});var LabelTrack=function(a){Track.call(this,null,a);this.hidden=true;this.container_div.addClass("label-track")};$.extend(LabelTrack.prototype,Track.prototype,{draw:function(){var c=this.view,d=c.high-c.low,g=Math.floor(Math.pow(10,Math.floor(Math.log(d)/Math.log(10)))),a=Math.floor(c.low/g)*g,e=this.content_div.widt
h(),b=$("<div style='position: relative; height: 1.3em;'></div>");while(a<c.high){var f=(a-c.low)/d*e;b.append($("<div class='label'>"+commatize(a)+"</div>").css({position:"absolute",left:f-1}));a+=g}this.content_div.children(":first").remove();this.content_div.append(b)}});var LineTrack=function(c,a,d,b){this.track_type="LineTrack";this.tile_cache=new Cache(CACHED_TILES_LINE);Track.call(this,c,$("#viewport"));TiledTrack.call(this);this.indexer=d;this.height_px=100;this.container_div.addClass("line-track");this.dataset_id=a;this.data_queue={};this.data_cache=new Cache(CACHED_DATA);this.prefs={min_value:undefined,max_value:undefined};if(b.min_value!==undefined){this.prefs.min_value=b.min_value}if(b.max_value!==undefined){this.prefs.max_value=b.max_value}};$.extend(LineTrack.prototype,TiledTrack.prototype,{init:function(){var a=this,b=a.view.tracks.indexOf(a);a.content_div.text(DATA_LOADING);$.getJSON(data_url,{stats:true,indexer:a.indexer,chrom:a.view.chrom,low:null,high:null
,dataset_id:a.dataset_id},function(d){if(!d||d=="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR)}else{if(d=="no data"){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(d=="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},5000)}else{a.content_div.text("");a.content_div.css("height",a.height_px+"px");if(a.prefs.min_value===undefined||a.prefs.max_value===undefined){a.prefs.min_value=d.min;a.prefs.max_value=d.max;$("#track_"+b+"_minval").val(a.prefs.min_value);$("#track_"+b+"_maxval").val(a.prefs.max_value)}a.vertical_range=a.prefs.max_value-a.prefs.min_value;var e=$("<div></div>").addClass("yaxislabel").attr("id","linetrack_"+b+"_minval").text(a.prefs.min_value);var c=$("<div></div>").addClass("yaxislabel").attr("id","linetrack_"+b+"_maxval").text(a.prefs.max_value);c.css({position:"relative",top:"25px"});c.prependTo(a.container_div);e.css({position:"relative",top:a.he
ight_px+55+"px"});e.prependTo(a.container_div);a.draw()}}}})},get_data:function(d,b){var c=this,a=b*DENSITY*d,f=(b+1)*DENSITY*d,e=d+"_"+b;if(!c.data_queue[e]){c.data_queue[e]=true;$.getJSON(data_url,{indexer:this.indexer,chrom:this.view.chrom,low:a,high:f,dataset_id:this.dataset_id,resolution:this.view.resolution},function(g){c.data_cache.set(e,g);delete c.data_queue[e];c.draw()})}},draw_tile:function(n,p,c,e){if(!this.vertical_range){return}var q=p*DENSITY*n,a=DENSITY*n,b=$("<canvas class='tile'></canvas>"),s=n+"_"+p;if(!this.data_cache.get(s)){this.get_data(n,p);return}var r=this.data_cache.get(s);b.css({position:"absolute",top:0,left:(q-this.view.low)*e});b.get(0).width=Math.ceil(a*e);b.get(0).height=this.height_px;var m=b.get(0).getContext("2d"),j=false,k=this.prefs.min_value,f=this.prefs.max_value,l=this.vertical_range,d=this.height_px;m.beginPath();for(var o=0;o<r.length-1;o++){var h=r[o][0]-q;var g=r[o][1];if(isNaN(g)){j=false}else{h=h*e;if(g<=k){g=k}else{if(g>=f){g=f
}}g=Math.round(d-(g-k)/l*d);if(j){m.lineTo(h,g)}else{m.moveTo(h,g);j=true}}}m.stroke();c.append(b);return b},gen_options:function(j){var a=$("<div></div>").addClass("form-row");var e="track_"+j+"_minval",g="track_"+j+"_maxval",h=$("<label></label>").attr("for",e).text("Min value:"),b=(this.prefs.min_value===undefined?"":this.prefs.min_value),i=$("<input></input>").attr("id",e).val(b),d=$("<label></label>").attr("for",g).text("Max value:"),f=(this.prefs.max_value===undefined?"":this.prefs.max_value),c=$("<input></input>").attr("id",g).val(f);return a.append(h).append(i).append(d).append(c)},update_options:function(c){var a=$("#track_"+c+"_minval").val(),b=$("#track_"+c+"_maxval").val();if(a!==this.prefs.min_value||b!==this.prefs.max_value){this.prefs.min_value=parseFloat(a);this.prefs.max_value=parseFloat(b);this.vertical_range=this.prefs.max_value-this.prefs.min_value;$("#linetrack_"+c+"_minval").text(this.prefs.min_value);$("#linetrack_"+c+"_maxval").text(this.prefs.max_val
ue);this.tile_cache.clear();this.draw()}}});var FeatureTrack=function(c,a,d,b){this.track_type="FeatureTrack";this.tile_cache=new Cache(CACHED_TILES_FEATURE);Track.call(this,c,$("#viewport"));TiledTrack.call(this);this.indexer=d;this.height_px=100;this.container_div.addClass("feature-track");this.dataset_id=a;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.vertical_detail_px=10;this.vertical_nodetail_px=3;this.default_font="9px Monaco, Lucida Console, monospace";this.left_offset=200;this.inc_slots={};this.data_queue={};this.s_e_by_tile={};this.data_cache=new Cache(20);this.prefs={block_color:"black",label_color:"black"};if(b.block_color!==undefined){this.prefs.block_color=b.block_color}if(b.label_color!==undefined){this.prefs.label_color=b.label_color}};$.extend(FeatureTrack.prototype,TiledTrack.prototype,{init:function(){var a=this;a.content_div.text(DATA_LOADING);$.getJSON(data_url,{indexer:a.indexer,low:a.view.max_low,high:a.view.max_high,dat
aset_id:a.dataset_id,chrom:a.view.chrom},function(b){if(b=="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR)}else{if(b.length===0||b=="no data"){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(b=="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},5000)}else{a.content_div.text("");a.content_div.css("height",a.height_px+"px");a.values=b;a.calc_slots();a.slots=a.zo_slots;a.draw()}}}})},get_data:function(a,d){var b=this,c=a+"_"+d;if(!b.data_queue[c]){b.data_queue[c]=true;$.getJSON(data_url,{indexer:b.indexer,chrom:b.view.chrom,low:a,high:d,dataset_id:b.dataset_id,include_blocks:true},function(e){b.data_cache.set(c,e);delete b.data_queue[c];b.draw()})}},calc_slots:function(){var b=[],a=this.content_div.width()/(this.view.high-this.view.low),d=this.view.max_low;for(var e=0,f=this.values.length;e<f;e++){var g,h,k=this.values[e];g=Math.floor((k.start-d)*a);h=Math.ceil((k.end
-d)*a);var c=0;while(true){if(b[c]===undefined||b[c]<g){b[c]=h;this.zo_slots[k.uid]=c;break}c++}}this.height_px=b.length*this.vertical_nodetail_px+15;this.content_div.css("height",this.height_px+"px")},incremental_slots:function(a,f){if(!this.inc_slots[a]){this.inc_slots[a]={};this.inc_slots[a].w_scale=1/a;this.s_e_by_tile[a]={}}var h=this.inc_slots[a].w_scale,s=[],g=0,b=$("<canvas></canvas>").get(0).getContext("2d"),l=this.view.max_low;var c,e,u=[];for(var p=0,q=f.length;p<q;p++){var d=f[p];if(this.inc_slots[a][d.uid]!==undefined){g=Math.max(g,this.inc_slots[a][d.uid]);u.push(this.inc_slots[a][d.uid])}else{s.push(p)}}for(var p=0,q=s.length;p<q;p++){var d=f[s[p]];c=Math.floor((d.start-l)*h);c-=b.measureText(d.name).width;e=Math.ceil((d.end-l)*h);var o=0;while(true){var m=true;if(this.s_e_by_tile[a][o]!==undefined){for(var n=0,t=this.s_e_by_tile[a][o].length;n<t;n++){var r=this.s_e_by_tile[a][o][n];if(e>r[0]&&c<r[1]){m=false;break}}}if(m){if(this.s_e_by_tile[a][o]===undefined
){this.s_e_by_tile[a][o]=[]}this.s_e_by_tile[a][o].push([c,e]);this.inc_slots[a][d.uid]=o;g=Math.max(g,o);break}o++}}return g},draw_tile:function(B,f,g,M){if(!this.values){return}var s=f*DENSITY*B,G=(f+1)*DENSITY*B,r=DENSITY*B;var K,L,m;if(M>this.show_labels_scale){if(!this.showing_details){this.showing_details=true}for(var H in this.data_cache.obj_cache){var C=H.split("_"),z=C[0],c=C[1];if(z<=s&&c>=G){K=this.data_cache.get(H);break}}if(!K){this.data_queue[[s,G]]=true;this.get_data(s,G);return}m=this.incremental_slots(this.view.zoom_res,K)*this.vertical_detail_px+15;L=this.inc_slots[this.view.zoom_res]}else{if(this.showing_details){this.showing_details=false}m=this.height_px;L=this.zo_slots;K=this.values}var a=Math.ceil(r*M),u=$("<canvas class='tile'></canvas>"),D=this.prefs.label_color,e=this.prefs.block_color,x=this.left_offset,N=this.showing_details,O=(this.showing_details?this.vertical_detail_px:this.vertical_nodetail_px);u.css({position:"absolute",top:0,left:(s-this.vie
w.low)*M-x});u.get(0).width=a+x;u.get(0).height=m;var p=u.get(0).getContext("2d");p.fillStyle=this.prefs.block_color;p.font=this.default_font;p.textAlign="right";var I=0;for(var J=0,o=K.length;J<o;J++){var v=K[J];if(v.start<=G&&v.end>=s){var A=Math.floor(Math.max(0,(v.start-s)*M)),q=Math.ceil(Math.min(a,(v.end-s)*M)),y=L[v.uid]*O;var n,E,t=null,P=null;if(v.thick_start&&v.thick_end){t=Math.floor(Math.max(0,(v.thick_start-s)*M));P=Math.ceil(Math.min(a,(v.thick_end-s)*M))}if(!N){p.fillRect(A+x,y+5,q-A,1)}else{if(v.start>s){p.fillStyle=D;p.fillText(v.name,A-1+x,y+8);p.fillStyle=e}var Q=v.blocks;if(Q){if(v.strand){if(v.strand=="+"){p.fillStyle=RIGHT_STRAND}else{if(v.strand=="-"){p.fillStyle=LEFT_STRAND}}p.fillRect(A+x,y,q-A,10);p.fillStyle=e}for(var H=0,d=Q.length;H<d;H++){var h=Q[H],b=Math.floor(Math.max(0,(h[0]-s)*M)),w=Math.ceil(Math.min(a,(h[1]-s)*M));if(b>w){continue}n=5;E=3;p.fillRect(b+x,y+E,w-b,n);if(t!==undefined&&!(b>P||w<t)){n=9;E=1;var F=Math.max(b,t),l=Math.min(w,P);
p.fillRect(F+x,y+E,l-F,n)}}}else{n=9;E=1;p.fillRect(A+x,y+E,q-A,n);if(v.strand){if(v.strand=="+"){p.fillStyle=RIGHT_STRAND_INV}else{if(v.strand=="-"){p.fillStyle=LEFT_STRAND_INV}}p.fillRect(A+x,y,q-A,10);p.fillStyle=prefs.block_color}}}I++}}g.append(u);return u},gen_options:function(g){var a=$("<div></div>").addClass("form-row");var d="track_"+g+"_block_color",c=$("<label></label>").attr("for",d).text("Block color:"),b=$("<input></input>").attr("id",d).attr("name",d).val(this.prefs.block_color),f="track_"+g+"_label_color",h=$("<label></label>").attr("for",f).text("Label color:"),e=$("<input></input>").attr("id",f).attr("name",f).val(this.prefs.label_color);return a.append(c).append(b).append(h).append(e)},update_options:function(c){var a=$("#track_"+c+"_block_color").val(),b=$("#track_"+c+"_label_color").val();if(a!==this.prefs.block_color||b!==this.prefs.label_color){this.prefs.block_color=a;this.prefs.label_color=b;this.tile_cache.clear();this.draw()}}});var ReadTrack=func
tion(c,a,d,b){this.track_type="ReadTrack";this.tile_cache=new Cache(CACHED_TILES_FEATURE);Track.call(this,c,$("#viewport"));TiledTrack.call(this);FeatureTrack.call(this,c,a,d,b)};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{draw_tile:function(v,z,m,n){if(!this.values){return}var A=z*DENSITY*v,e=(z+1)*DENSITY*v,q=DENSITY*v;var D,p,h;h=this.height_px;p=this.zo_slots;D=this.values;var t=Math.ceil(q*n),r=$("<canvas class='tile'></canvas>");r.css({position:"absolute",top:0,left:(A-this.view.low)*n-this.left_offset});r.get(0).width=t+this.left_offset;r.get(0).height=h;var u=r.get(0).getContext("2d");u.fillStyle=this.prefs.block_color;u.font=this.default_font;u.textAlign="right";var s=u.measureText("A").width;var w=0;for(var x=0,y=D.length;x<y;x++){var l=D[x];if(l.start<=e&&l.end>=A){var g=Math.floor(Math.max(0,(l.start-A)*n)),k=Math.ceil(Math.min(t,(l.end-A)*n)),f=p[l.uid]*this.vertical_detail_px;var a,E,d=null,o=null;if(n>s){for(var B=0,b=l.name.lengt
h;B<b;B++){var C=Math.floor(Math.max(0,(l.start+B-A)*n));u.fillText(l.name[B],C+this.left_offset,f+8)}}else{u.fillRect(g+this.left_offset,f+4,k-g,3)}}}m.append(r);return r}});
\ No newline at end of file
+var DEBUG=false;var DENSITY=1000,FEATURE_LEVELS=10,DATA_ERROR="There was an error in indexing this dataset.",DATA_NONE="No data for this chrom/contig.",DATA_PENDING="Currently indexing... please wait",DATA_LOADING="Loading data...",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=30,CACHED_DATA=20,CONTEXT=$("<canvas></canvas>").get(0).getContext("2d"),RIGHT_STRAND,LEFT_STRAND;var right_img=new Image();right_img.src="../images/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src="../images/visualization/strand_left.png";left_img.onload=function(){LEFT_STRAND=CONTEXT.createPattern(left_img,"repeat")};var right_img_inv=new Image();right_img_inv.src="../images/visualization/strand_right_inv.png";right_img_inv.onload=function(){RIGHT_STRAND_INV=CONTEXT.createPattern(right_img_inv,"repeat")};var left_img_inv=new Image();left_img_inv.src="../images/visualization/strand_left_inv.png";left_i
mg_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}var Cache=function(a){this.num_elements=a;this.clear()};$.extend(Cache.prototype,{get:function(b){var a=this.key_ary.indexOf(b);if(a!=-1){this.key_ary.splice(a,1);this.key_ary.push(b)}return this.obj_cache[b]},set:function(b,c){if(!this.obj_cache[b]){if(this.key_ary.length>=this.num_elements){var a=this.key_ary.shift();delete this.obj_cache[a]}this.key_ary.push(b)}this.obj_cache[b]=c;return c},clear:function(){this.obj_cache={};this.key_ary=[]}});var View=function(b,d,c,a){this.vis_id=c;this.dbkey=a;this.title=d;this.chrom=b;this.tracks=[];this.label_tracks=[];this.max_low=0;this.max_high=0;this.center=(this.max_high-this.max_low)/2;this.zoom_factor=3;this.zoom_level=0};$.extend(View.prototype,{add_track:function(a){a.view=this;this.tracks.push(a);if(a.init){a.init()}},add_label_track:function
(a){a.view=this;this.label_tracks.push(a)},remove_track:function(a){delete this.tracks[a]},update_options:function(){for(var b in view.tracks){var a=view.tracks[b];if(a.update_options){a.update_options(b)}}},redraw:function(f){this.span=this.max_high-this.max_low;var d=this.span/Math.pow(this.zoom_factor,this.zoom_level),b=this.center-(d/2),e=b+d;if(b<0){b=0;e=b+d}else{if(e>this.max_high){e=this.max_high;b=e-d}}this.low=Math.floor(b);this.high=Math.ceil(e);this.center=Math.round(this.low+(this.high-this.low)/2);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/DENSITY)/Math.LN10));this.zoom_res=Math.pow(FEATURE_LEVELS,Math.max(0,Math.ceil(Math.log(this.resolution,FEATURE_LEVELS)/Math.log(FEATURE_LEVELS))));$("#overview-box").css({left:(this.low/this.span)*$("#overview-viewport").width(),width:Math.max(12,((this.high-this.low)/this.span)*$("#overview-viewport").width())}).show();$("#low").val(commatize(this.low));$("#high").val(commatize(this.high));if(!f){f
or(var c=0,a=this.tracks.length;c<a;c++){this.tracks[c].draw()}for(var c=0,a=this.label_tracks.length;c<a;c++){this.label_tracks[c].draw()}}},zoom_in:function(a){if(this.max_high===0||this.high-this.low<30){return}if(a){this.center=a/$(document).width()*(this.high-this.low)+this.low}this.zoom_level+=1;this.redraw()},zoom_out:function(){if(this.max_high===0){return}if(this.zoom_level<=0){this.zoom_level=0;return}this.zoom_level-=1;this.redraw()}});var Track=function(a,b){this.name=a;this.parent_element=b;this.make_container()};$.extend(Track.prototype,{make_container:function(){this.header_div=$("<div class='track-header'>").text(this.name);this.content_div=$("<div class='track-content'>");this.container_div=$("<div class='track'></div>").append(this.header_div).append(this.content_div);this.parent_element.append(this.container_div)}});var TiledTrack=function(){};$.extend(TiledTrack.prototype,Track.prototype,{draw:function(){var i=this.view.low,e=this.view.high,f=e-i,d=this.v
iew.resolution;if(DEBUG){$("#debug").text(d+" "+this.view.zoom_res)}var k=$("<div style='position: relative;'></div>");this.content_div.children(":first").remove();this.content_div.append(k);var l=this.content_div.width()/f;var h;var a=Math.floor(i/d/DENSITY);while((a*DENSITY*d)<e){var j=this.content_div.width()+"_"+this.view.zoom_level+"_"+a;var c=this.tile_cache.get(j);if(c){var g=a*DENSITY*d;var b=(g-i)*l;if(this.left_offset){b-=this.left_offset}c.css({left:b});k.append(c);this.max_height=Math.max(this.max_height,c.height())}else{this.delayed_draw(this,j,i,e,a,d,k,l)}a+=1}},delayed_draw:function(c,e,a,f,b,d,g,h){setTimeout(function(){if(!(a>c.view.high||f<c.view.low)){tile_element=c.draw_tile(d,b,g,h);if(tile_element){c.tile_cache.set(e,tile_element);c.max_height=Math.max(c.max_height,tile_element.height());c.content_div.css("height",c.max_height)}}},50)}});var LabelTrack=function(a){Track.call(this,null,a);this.track_type="LabelTrack";this.hidden=true;this.container_div.
addClass("label-track")};$.extend(LabelTrack.prototype,Track.prototype,{draw:function(){var c=this.view,d=c.high-c.low,g=Math.floor(Math.pow(10,Math.floor(Math.log(d)/Math.log(10)))),a=Math.floor(c.low/g)*g,e=this.content_div.width(),b=$("<div style='position: relative; height: 1.3em;'></div>");while(a<c.high){var f=(a-c.low)/d*e;b.append($("<div class='label'>"+commatize(a)+"</div>").css({position:"absolute",left:f-1}));a+=g}this.content_div.children(":first").remove();this.content_div.append(b)}});var LineTrack=function(c,a,d,b){this.track_type="LineTrack";this.tile_cache=new Cache(CACHED_TILES_LINE);Track.call(this,c,$("#viewport"));TiledTrack.call(this);this.indexer=d;this.height_px=100;this.container_div.addClass("line-track");this.dataset_id=a;this.prefs={min_value:undefined,max_value:undefined};if(b.min_value!==undefined){this.prefs.min_value=b.min_value}if(b.max_value!==undefined){this.prefs.max_value=b.max_value}};$.extend(LineTrack.prototype,TiledTrack.prototype,{i
nit:function(){this.data_queue={};this.data_cache=new Cache(CACHED_DATA);var a=this,b=a.view.tracks.indexOf(a);a.content_div.text(DATA_LOADING);a.container_div.removeClass("nodata error pending");$.getJSON(data_url,{stats:true,indexer:a.indexer,chrom:a.view.chrom,low:null,high:null,dataset_id:a.dataset_id},function(d){if(!d||d=="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR)}else{if(d.length===0||d=="no data"){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(d=="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},5000)}else{a.content_div.text("");a.content_div.css("height",a.height_px+"px");if(a.prefs.min_value===undefined||a.prefs.max_value===undefined){a.prefs.min_value=d.min;a.prefs.max_value=d.max;$("#track_"+b+"_minval").val(a.prefs.min_value);$("#track_"+b+"_maxval").val(a.prefs.max_value)}a.vertical_range=a.prefs.max_value-a.prefs.min_value;if($("#linetrack_"+b
+"_minval").length===0){var e=$("<div></div>").addClass("yaxislabel").attr("id","linetrack_"+b+"_minval").text(a.prefs.min_value);var c=$("<div></div>").addClass("yaxislabel").attr("id","linetrack_"+b+"_maxval").text(a.prefs.max_value);c.css({position:"relative",top:"25px"});c.prependTo(a.container_div);e.css({position:"relative",top:a.height_px+55+"px"});e.prependTo(a.container_div)}a.draw()}}}})},get_data:function(d,b){var c=this,a=b*DENSITY*d,f=(b+1)*DENSITY*d,e=d+"_"+b;if(!c.data_queue[e]){c.data_queue[e]=true;$.getJSON(data_url,{indexer:this.indexer,chrom:this.view.chrom,low:a,high:f,dataset_id:this.dataset_id,resolution:this.view.resolution},function(g){c.data_cache.set(e,g);delete c.data_queue[e];c.draw()})}},draw_tile:function(n,p,c,e){if(this.vertical_range===undefined){return}var q=p*DENSITY*n,a=DENSITY*n,b=$("<canvas class='tile'></canvas>"),s=n+"_"+p;if(!this.data_cache.get(s)){this.get_data(n,p);return}var r=this.data_cache.get(s);b.css({position:"absolute",top:
0,left:(q-this.view.low)*e});b.get(0).width=Math.ceil(a*e);b.get(0).height=this.height_px;var m=b.get(0).getContext("2d"),j=false,k=this.prefs.min_value,f=this.prefs.max_value,l=this.vertical_range,d=this.height_px;m.beginPath();for(var o=0;o<r.length-1;o++){var h=r[o][0]-q;var g=r[o][1];if(isNaN(g)){j=false}else{h=h*e;if(g<=k){g=k}else{if(g>=f){g=f}}g=Math.round(d-(g-k)/l*d);if(j){m.lineTo(h,g)}else{m.moveTo(h,g);j=true}}}m.stroke();c.append(b);return b},gen_options:function(j){var a=$("<div></div>").addClass("form-row");var e="track_"+j+"_minval",g="track_"+j+"_maxval",h=$("<label></label>").attr("for",e).text("Min value:"),b=(this.prefs.min_value===undefined?"":this.prefs.min_value),i=$("<input></input>").attr("id",e).val(b),d=$("<label></label>").attr("for",g).text("Max value:"),f=(this.prefs.max_value===undefined?"":this.prefs.max_value),c=$("<input></input>").attr("id",g).val(f);return a.append(h).append(i).append(d).append(c)},update_options:function(c){var a=$("#trac
k_"+c+"_minval").val(),b=$("#track_"+c+"_maxval").val();if(a!==this.prefs.min_value||b!==this.prefs.max_value){this.prefs.min_value=parseFloat(a);this.prefs.max_value=parseFloat(b);this.vertical_range=this.prefs.max_value-this.prefs.min_value;$("#linetrack_"+c+"_minval").text(this.prefs.min_value);$("#linetrack_"+c+"_maxval").text(this.prefs.max_value);this.tile_cache.clear();this.draw()}}});var FeatureTrack=function(c,a,d,b){this.track_type="FeatureTrack";this.tile_cache=new Cache(CACHED_TILES_FEATURE);Track.call(this,c,$("#viewport"));TiledTrack.call(this);this.indexer=d;this.height_px=100;this.container_div.addClass("feature-track");this.dataset_id=a;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.vertical_detail_px=10;this.vertical_nodetail_px=3;this.default_font="9px Monaco, Lucida Console, monospace";this.left_offset=200;this.inc_slots={};this.data_queue={};this.s_e_by_tile={};this.data_cache=new Cache(20);this.prefs={block_color:"black",l
abel_color:"black"};if(b.block_color!==undefined){this.prefs.block_color=b.block_color}if(b.label_color!==undefined){this.prefs.label_color=b.label_color}};$.extend(FeatureTrack.prototype,TiledTrack.prototype,{init:function(){var a=this;a.content_div.text(DATA_LOADING);a.container_div.removeClass("nodata error pending");$.getJSON(data_url,{indexer:a.indexer,low:a.view.max_low,high:a.view.max_high,dataset_id:a.dataset_id,chrom:a.view.chrom},function(b){if(b=="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR)}else{if(b.length===0||b=="no data"){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(b=="pending"){a.container_div.adClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},5000)}else{a.content_div.text("");a.content_div.css("height",a.height_px+"px");a.values=b;a.calc_slots();a.slots=a.zo_slots;a.draw()}}}})},get_data:function(a,d){var b=this,c=a+"_"+d;if(!b.data_queue[c]){b.data_queue[c]=true;$.get
JSON(data_url,{indexer:b.indexer,chrom:b.view.chrom,low:a,high:d,dataset_id:b.dataset_id,include_blocks:true},function(e){b.data_cache.set(c,e);delete b.data_queue[c];b.draw()})}},calc_slots:function(){var b=[],a=this.content_div.width()/(this.view.high-this.view.low),d=this.view.max_low;for(var e=0,f=this.values.length;e<f;e++){var g,h,k=this.values[e];g=Math.floor((k.start-d)*a);h=Math.ceil((k.end-d)*a);var c=0;while(true){if(b[c]===undefined||b[c]<g){b[c]=h;this.zo_slots[k.uid]=c;break}c++}}this.height_px=b.length*this.vertical_nodetail_px+15;this.content_div.css("height",this.height_px+"px")},incremental_slots:function(a,f){if(!this.inc_slots[a]){this.inc_slots[a]={};this.inc_slots[a].w_scale=1/a;this.s_e_by_tile[a]={}}var h=this.inc_slots[a].w_scale,s=[],g=0,b=$("<canvas></canvas>").get(0).getContext("2d"),l=this.view.max_low;var c,e,u=[];for(var p=0,q=f.length;p<q;p++){var d=f[p];if(this.inc_slots[a][d.uid]!==undefined){g=Math.max(g,this.inc_slots[a][d.uid]);u.push(thi
s.inc_slots[a][d.uid])}else{s.push(p)}}for(var p=0,q=s.length;p<q;p++){var d=f[s[p]];c=Math.floor((d.start-l)*h);c-=b.measureText(d.name).width;e=Math.ceil((d.end-l)*h);var o=0;while(true){var m=true;if(this.s_e_by_tile[a][o]!==undefined){for(var n=0,t=this.s_e_by_tile[a][o].length;n<t;n++){var r=this.s_e_by_tile[a][o][n];if(e>r[0]&&c<r[1]){m=false;break}}}if(m){if(this.s_e_by_tile[a][o]===undefined){this.s_e_by_tile[a][o]=[]}this.s_e_by_tile[a][o].push([c,e]);this.inc_slots[a][d.uid]=o;g=Math.max(g,o);break}o++}}return g},draw_tile:function(B,f,g,M){if(!this.values){return}var s=f*DENSITY*B,G=(f+1)*DENSITY*B,r=DENSITY*B;var K,L,m;if(M>this.show_labels_scale){if(!this.showing_details){this.showing_details=true}for(var H in this.data_cache.obj_cache){var C=H.split("_"),z=C[0],c=C[1];if(z<=s&&c>=G){K=this.data_cache.get(H);break}}if(!K){this.data_queue[[s,G]]=true;this.get_data(s,G);return}m=this.incremental_slots(this.view.zoom_res,K)*this.vertical_detail_px+15;L=this.inc_slo
ts[this.view.zoom_res]}else{if(this.showing_details){this.showing_details=false}m=this.height_px;L=this.zo_slots;K=this.values}var a=Math.ceil(r*M),u=$("<canvas class='tile'></canvas>"),D=this.prefs.label_color,e=this.prefs.block_color,x=this.left_offset,N=this.showing_details,O=(this.showing_details?this.vertical_detail_px:this.vertical_nodetail_px);u.css({position:"absolute",top:0,left:(s-this.view.low)*M-x});u.get(0).width=a+x;u.get(0).height=m;var p=u.get(0).getContext("2d");p.fillStyle=this.prefs.block_color;p.font=this.default_font;p.textAlign="right";var I=0;for(var J=0,o=K.length;J<o;J++){var v=K[J];if(v.start<=G&&v.end>=s){var A=Math.floor(Math.max(0,(v.start-s)*M)),q=Math.ceil(Math.min(a,(v.end-s)*M)),y=L[v.uid]*O;var n,E,t=null,P=null;if(v.thick_start&&v.thick_end){t=Math.floor(Math.max(0,(v.thick_start-s)*M));P=Math.ceil(Math.min(a,(v.thick_end-s)*M))}if(!N){p.fillRect(A+x,y+5,q-A,1)}else{if(v.start>s){p.fillStyle=D;p.fillText(v.name,A-1+x,y+8);p.fillStyle=e}var
Q=v.blocks;if(Q){if(v.strand){if(v.strand=="+"){p.fillStyle=RIGHT_STRAND}else{if(v.strand=="-"){p.fillStyle=LEFT_STRAND}}p.fillRect(A+x,y,q-A,10);p.fillStyle=e}for(var H=0,d=Q.length;H<d;H++){var h=Q[H],b=Math.floor(Math.max(0,(h[0]-s)*M)),w=Math.ceil(Math.min(a,(h[1]-s)*M));if(b>w){continue}n=5;E=3;p.fillRect(b+x,y+E,w-b,n);if(t!==undefined&&!(b>P||w<t)){n=9;E=1;var F=Math.max(b,t),l=Math.min(w,P);p.fillRect(F+x,y+E,l-F,n)}}}else{n=9;E=1;p.fillRect(A+x,y+E,q-A,n);if(v.strand){if(v.strand=="+"){p.fillStyle=RIGHT_STRAND_INV}else{if(v.strand=="-"){p.fillStyle=LEFT_STRAND_INV}}p.fillRect(A+x,y,q-A,10);p.fillStyle=prefs.block_color}}}I++}}g.append(u);return u},gen_options:function(g){var a=$("<div></div>").addClass("form-row");var d="track_"+g+"_block_color",c=$("<label></label>").attr("for",d).text("Block color:"),b=$("<input></input>").attr("id",d).attr("name",d).val(this.prefs.block_color),f="track_"+g+"_label_color",h=$("<label></label>").attr("for",f).text("Label color:"),e
=$("<input></input>").attr("id",f).attr("name",f).val(this.prefs.label_color);return a.append(c).append(b).append(h).append(e)},update_options:function(c){var a=$("#track_"+c+"_block_color").val(),b=$("#track_"+c+"_label_color").val();if(a!==this.prefs.block_color||b!==this.prefs.label_color){this.prefs.block_color=a;this.prefs.label_color=b;this.tile_cache.clear();this.draw()}}});var ReadTrack=function(c,a,d,b){this.track_type="ReadTrack";this.tile_cache=new Cache(CACHED_TILES_FEATURE);Track.call(this,c,$("#viewport"));TiledTrack.call(this);FeatureTrack.call(this,c,a,d,b)};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{draw_tile:function(v,z,m,n){if(!this.values){return}var A=z*DENSITY*v,e=(z+1)*DENSITY*v,q=DENSITY*v;var D,p,h;h=this.height_px;p=this.zo_slots;D=this.values;var t=Math.ceil(q*n),r=$("<canvas class='tile'></canvas>");r.css({position:"absolute",top:0,left:(A-this.view.low)*n-this.left_offset});r.get(0).width=t+this.left_offset;r.get(0
).height=h;var u=r.get(0).getContext("2d");u.fillStyle=this.prefs.block_color;u.font=this.default_font;u.textAlign="right";var s=u.measureText("A").width;var w=0;for(var x=0,y=D.length;x<y;x++){var l=D[x];if(l.start<=e&&l.end>=A){var g=Math.floor(Math.max(0,(l.start-A)*n)),k=Math.ceil(Math.min(t,(l.end-A)*n)),f=p[l.uid]*this.vertical_detail_px;var a,E,d=null,o=null;if(n>s){for(var B=0,b=l.name.length;B<b;B++){var C=Math.floor(Math.max(0,(l.start+B-A)*n));u.fillText(l.name[B],C+this.left_offset,f+8)}}else{u.fillRect(g+this.left_offset,f+4,k-g,3)}}}m.append(r);return r}});
\ No newline at end of file
diff -r 60308825b252 -r aa81684b9275 templates/root/history.mako
--- a/templates/root/history.mako Fri Feb 05 23:03:03 2010 -0500
+++ b/templates/root/history.mako Mon Feb 08 09:03:07 2010 -0500
@@ -43,7 +43,7 @@
}));
// Rename management.
- async_save_text("history-name", "history-name", "${h.url_for( controller="/history", action="rename_async", id=trans.security.encode_id(history.id) )}", "new_name", 18);
+ async_save_text("history-name-container", "history-name", "${h.url_for( controller="/history", action="rename_async", id=trans.security.encode_id(history.id) )}", "new_name", 18);
// Tag management.
$('#history-tag').click( function()
@@ -57,7 +57,7 @@
$('#history-annotation-area').toggle("fast");
return false;
});
- async_save_text("history-annotation", "history-annotation", "${h.url_for( controller="/history", action="annotate_async", id=trans.security.encode_id(history.id) )}", "new_annotation", 18, true, 4);
+ async_save_text("history-annotation-container", "history-annotation", "${h.url_for( controller="/history", action="annotate_async", id=trans.security.encode_id(history.id) )}", "new_annotation", 18, true, 4);
// Updater
updater({
@@ -322,7 +322,7 @@
## Annotation elt.
<div id="history-annotation-area" class="form-row" style="display: none">
<label>Annotation / Notes:</label>
- <div class="tooltip">
+ <div id="history-annotation-container" class="tooltip">
%if annotation:
<span id="history-annotation">${annotation | h}</span>
%else:
diff -r 60308825b252 -r aa81684b9275 templates/sharing_base.mako
--- a/templates/sharing_base.mako Fri Feb 05 23:03:03 2010 -0500
+++ b/templates/sharing_base.mako Mon Feb 08 09:03:07 2010 -0500
@@ -49,7 +49,7 @@
};
<% controller_name = get_controller_name( item ) %>
- async_save_text("edit-identifier", "item-identifier", "${h.url_for( controller=controller_name, action='set_slug_async', id=trans.security.encode_id( item.id ) )}", "new_slug", false, 0, on_start, on_finish);
+ async_save_text("edit-identifier", "item-identifier", "${h.url_for( controller=controller_name, action='set_slug_async', id=trans.security.encode_id( item.id ) )}", "new_slug", null, false, 0, on_start, on_finish);
});
</script>
</%def>
diff -r 60308825b252 -r aa81684b9275 templates/tagging_common.mako
--- a/templates/tagging_common.mako Fri Feb 05 23:03:03 2010 -0500
+++ b/templates/tagging_common.mako Mon Feb 08 09:03:07 2010 -0500
@@ -37,7 +37,7 @@
%if use_toggle_link:
<a class="toggle-link" href="#">${num_tags} Tag${iff( num_tags == 1, "", "s")}</a>
%endif
- <div class="tag-area
+ <div class="tag-area tooltip
%if tag_type == 'individual':
individual-tag-area
%endif
@@ -72,20 +72,18 @@
%endfor
## Add tag input field. If element is in form, tag input is a textarea; otherwise element is a input type=text.
- <div class="tooltip">
- %if editable:
- %if in_form:
- <textarea class="tag-input" rows='1' cols='${input_size}'></textarea>
- %else:
- <input class="tag-input" type='text' size='${input_size}'/>
- %endif
- ## Add "add tag" button.
- %if render_add_tag_button:
- <img src='${h.url_for('/static/images/add_icon.png')}' rollover='${h.url_for('/static/images/add_icon_dark.png')}' class="add-tag-button"/>
- %endif
+ %if editable:
+ %if in_form:
+ <textarea class="tag-input" rows='1' cols='${input_size}'></textarea>
+ %else:
+ <input class="tag-input" type='text' size='${input_size}'/>
%endif
- <span class="tip">Click to add tags</span>
- </div>
+ ## Add "add tag" button.
+ %if render_add_tag_button:
+ <img src='${h.url_for('/static/images/add_icon.png')}' rollover='${h.url_for('/static/images/add_icon_dark.png')}' class="add-tag-button"/>
+ %endif
+ <span class="tip">Click to edit tags</span>
+ %endif
</div>
</div>
</%def>
1
0
09 Feb '10
details: http://www.bx.psu.edu/hg/galaxy/rev/60308825b252
changeset: 3351:60308825b252
user: Ross Lazarus <ross.lazarus(a)gmail.com>
date: Fri Feb 05 23:03:03 2010 -0500
description:
python2.4 sha.new() cannot be based to hmac - this patch tested with 2.4 and 2.5
diffstat:
lib/galaxy/util/hash_util.py | 11 ++++++-----
1 files changed, 6 insertions(+), 5 deletions(-)
diffs (30 lines):
diff -r 4af74d038535 -r 60308825b252 lib/galaxy/util/hash_util.py
--- a/lib/galaxy/util/hash_util.py Fri Feb 05 19:35:52 2010 -0500
+++ b/lib/galaxy/util/hash_util.py Fri Feb 05 23:03:03 2010 -0500
@@ -6,15 +6,16 @@
import sys, logging
# Use hashlib module if for Python 2.5+, fall back on old sha and md5 modules
+# sha1 requires explicit calls to new if also being passed to hmac (!)
try:
import hashlib
sha1 = hashlib.sha1
+ sha = sha1
md5 = hashlib.md5
except ImportError, e:
- import sha, md5
- sha1 = sha.new
- md5 = md5.new
-
+ from sha import new as sha1
+ import sha
+ from md5 import new as md5
import hmac
log = logging.getLogger( __name__ )
@@ -30,4 +31,4 @@
return sha1()
def hmac_new( key, value ):
- return hmac.new( key, value, sha1 ).hexdigest()
+ return hmac.new( key, value, sha ).hexdigest()
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/4af74d038535
changeset: 3350:4af74d038535
user: Kanwei Li <kanwei(a)gmail.com>
date: Fri Feb 05 19:35:52 2010 -0500
description:
typo
diffstat:
lib/galaxy/web/controllers/tracks.py | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diffs (16 lines):
diff -r 432a32ba55bb -r 4af74d038535 lib/galaxy/web/controllers/tracks.py
--- a/lib/galaxy/web/controllers/tracks.py Fri Feb 05 19:08:37 2010 -0500
+++ b/lib/galaxy/web/controllers/tracks.py Fri Feb 05 19:35:52 2010 -0500
@@ -121,7 +121,11 @@
latest_revision = vis.latest_revision
tracks = []
- dbkey = latest_revision.config['dbkey']
+ try:
+ dbkey = latest_revision.config['dbkey']
+ except KeyError:
+ dbkey = None
+
hda_query = session.query( model.HistoryDatasetAssociation )
for t in vis.latest_revision.config['tracks']:
dataset_id = t['dataset_id']
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/432a32ba55bb
changeset: 3349:432a32ba55bb
user: Kanwei Li <kanwei(a)gmail.com>
date: Fri Feb 05 19:08:37 2010 -0500
description:
trackster:
- New interface for new track browsers
- Saving shows progress bar
- Can now add tracks async
- Switching dbkeys is now async
diffstat:
lib/galaxy/web/controllers/tracks.py | 128 ++++------
lib/galaxy/web/controllers/visualization.py | 2 +-
static/scripts/trackster.js | 61 +++-
static/trackster.css | 1 +
templates/grid_base.mako | 4 +
templates/tracks/add_tracks.mako | 3 +-
templates/tracks/browser.mako | 344 ++++++++++++++++-----------
templates/tracks/index.mako | 52 +++-
templates/tracks/new_browser.mako | 81 +-----
9 files changed, 359 insertions(+), 317 deletions(-)
diffs (955 lines):
diff -r 99483ae6c738 -r 432a32ba55bb lib/galaxy/web/controllers/tracks.py
--- a/lib/galaxy/web/controllers/tracks.py Fri Feb 05 16:34:30 2010 -0500
+++ b/lib/galaxy/web/controllers/tracks.py Fri Feb 05 19:08:37 2010 -0500
@@ -57,10 +57,7 @@
use_paging = False
columns = [
grids.TextColumn( "Name", key="name", model_class=model.HistoryDatasetAssociation ),
- # grids.IndividualTagsColumn( "Tags", "tags", model.History, model.HistoryTagAssociation, filterable="advanced"),
grids.GridColumn( "Filetype", key="extension" ),
- # Columns that are valid for filtering but are not visible.
- # SharingColumn( "Shared", key="shared", visible=False, filterable="advanced" )
]
def apply_default_filter( self, trans, query, **kwargs ):
if self.available_tracks is None:
@@ -80,62 +77,40 @@
@web.expose
def index( self, trans ):
- return trans.fill_template( "tracks/index.mako" )
-
+ config = {}
+
+ return trans.fill_template( "tracks/browser.mako", config=config )
+
@web.expose
@web.require_login()
- def new_browser( self, trans, dbkey=None, dataset_ids=None, browse=None, title=None ):
- """
- Build a new browser from datasets in the current history. Redirects
- to 'browser' once datasets to browse have been selected.
- """
- session = trans.sa_session
- # If the user clicked the submit button explicitly, try to build the browser
- if title and browse and dataset_ids:
- if not isinstance( dataset_ids, list ):
- dataset_ids = [ dataset_ids ]
- # Build config
- tracks = []
- for dataset_id in dataset_ids:
- tracks.append( { "dataset_id": str( dataset_id ) } )
- config = { "tracks": tracks }
- # Build visualization object
- vis = model.Visualization()
- vis.user = trans.user
- vis.title = title
- vis.type = "trackster"
- vis_rev = model.VisualizationRevision()
- vis_rev.visualization = vis
- vis_rev.title = title
- vis_rev.config = config
- vis.latest_revision = vis_rev
- session.add( vis )
- session.add( vis_rev )
- session.flush()
- trans.response.send_redirect( web.url_for( controller='tracks', action='browser', id=trans.security.encode_id( vis.id ) ) )
+ def new_browser( self, trans ):
+ dbkeys = [ d.metadata.dbkey for d in trans.get_history().datasets if not d.deleted ]
+ dbkey_set = set( dbkeys )
+ if not dbkey_set:
+ return trans.show_error_message( "Current history has no valid datasets to visualize." )
else:
- # Determine the set of all dbkeys that are used in the current history
- dbkeys = [ d.metadata.dbkey for d in trans.get_history().datasets if not d.deleted ]
- dbkey_set = set( dbkeys )
- if not dbkey_set:
- return trans.show_error_message( "Current history has no valid datasets to visualize." )
-
- # If a dbkey argument was not provided, or is no longer valid, default
- # to the first one
- if dbkey is None or dbkey not in dbkey_set:
- dbkey = dbkeys[0]
- # Find all datasets in the current history that are of that dbkey
- # and can be displayed
- datasets = {}
- if self.available_tracks is None:
- self.available_tracks = trans.app.datatypes_registry.get_available_tracks()
- for dataset in session.query( model.HistoryDatasetAssociation ).filter_by( deleted=False, history_id=trans.history.id ):
- if dataset.metadata.dbkey == dbkey and dataset.extension in self.available_tracks:
- datasets[dataset.id] = (dataset.extension, dataset.name)
- # Render the template
- return trans.fill_template( "tracks/new_browser.mako", available_tracks=self.available_tracks, dbkey=dbkey, dbkey_set=dbkey_set, datasets=datasets )
-
+ return trans.fill_template( "tracks/new_browser.mako", dbkey_set=dbkey_set )
+
+ @web.json
+ @web.require_login()
+ def add_track_async(self, trans, id):
+ dataset_id = trans.security.decode_id( id )
+
+ hda_query = trans.sa_session.query( model.HistoryDatasetAssociation )
+ dataset = hda_query.get( dataset_id )
+ track_type, indexer = dataset.datatype.get_track_type()
+
+ track = {
+ "track_type": track_type,
+ "indexer": indexer,
+ "name": dataset.name,
+ "dataset_id": dataset.id,
+ "prefs": {},
+ }
+ return track
+
@web.expose
+ @web.require_login()
def browser(self, trans, id, chrom=""):
"""
Display browser for the datasets listed in `dataset_ids`.
@@ -143,8 +118,10 @@
decoded_id = trans.security.decode_id( id )
session = trans.sa_session
vis = session.query( model.Visualization ).get( decoded_id )
+ latest_revision = vis.latest_revision
tracks = []
- dbkey = ""
+
+ dbkey = latest_revision.config['dbkey']
hda_query = session.query( model.HistoryDatasetAssociation )
for t in vis.latest_revision.config['tracks']:
dataset_id = t['dataset_id']
@@ -161,18 +138,10 @@
"dataset_id": dataset.id,
"prefs": simplejson.dumps(prefs),
} )
- dbkey = dataset.dbkey
- chrom_lengths = self._chroms( trans, dbkey )
- if chrom_lengths is None:
- error( "No chromosome lengths file found for '%s'" % dataset.name )
- return trans.fill_template( 'tracks/browser.mako',
- #dataset_ids=dataset_ids,
- title = vis.title,
- id=id,
- tracks=tracks,
- chrom=chrom,
- dbkey=dbkey,
- LEN=chrom_lengths.get(chrom, 0) )
+ if dbkey is None: dbkey = dataset.dbkey # Hack for backward compat
+
+ config = { "title": vis.title, "vis_id": id, "tracks": tracks, "chrom": chrom, "dbkey": dbkey }
+ return trans.fill_template( 'tracks/browser.mako', config=config )
@web.json
def chroms(self, trans, dbkey=None ):
@@ -288,9 +257,19 @@
@web.json
def save( self, trans, **kwargs ):
- decoded_id = trans.security.decode_id( kwargs['id'] )
session = trans.sa_session
- vis = session.query( model.Visualization ).get( decoded_id )
+ vis_id = kwargs['vis_id'].strip('"')
+ dbkey = kwargs['dbkey']
+
+ if vis_id == "undefined": # new vis
+ vis = model.Visualization()
+ vis.user = trans.user
+ vis.title = kwargs['vis_title']
+ vis.type = "trackster"
+ session.add( vis )
+ else:
+ decoded_id = trans.security.decode_id( vis_id )
+ vis = session.query( model.Visualization ).get( decoded_id )
decoded_payload = simplejson.loads( kwargs['payload'] )
vis_rev = model.VisualizationRevision()
@@ -304,10 +283,11 @@
"track_type": track['track_type'],
"prefs": track['prefs']
} )
- vis_rev.config = { "tracks": tracks }
+ vis_rev.config = { "dbkey": dbkey, "tracks": tracks }
vis.latest_revision = vis_rev
session.add( vis_rev )
session.flush()
+ return trans.security.encode_id(vis.id)
data_grid = DatasetSelectionGrid()
@@ -316,11 +296,5 @@
def list_datasets( self, trans, **kwargs ):
"""List all datasets that can be added as tracks"""
-
# Render the list view
- # return trans.fill_template( 'tracks/add_tracks.mako', grid=data_grid( trans, status=status, message=message, **kwargs ) )
return self.data_grid( trans, **kwargs )
-
- #
-
-
\ No newline at end of file
diff -r 99483ae6c738 -r 432a32ba55bb lib/galaxy/web/controllers/visualization.py
--- a/lib/galaxy/web/controllers/visualization.py Fri Feb 05 16:34:30 2010 -0500
+++ b/lib/galaxy/web/controllers/visualization.py Fri Feb 05 19:08:37 2010 -0500
@@ -7,7 +7,7 @@
# Grid definition
title = "Visualizations"
model_class = model.Visualization
- default_sort_key = "-create_time"
+ default_sort_key = "-update_time"
columns = [
grids.GridColumn( "Title", key="title", attach_popup=True,
link=( lambda item: dict( controller="tracks", action="browser", id=item.id ) ) ),
diff -r 99483ae6c738 -r 432a32ba55bb static/scripts/trackster.js
--- a/static/scripts/trackster.js Fri Feb 05 16:34:30 2010 -0500
+++ b/static/scripts/trackster.js Fri Feb 05 19:08:37 2010 -0500
@@ -77,14 +77,16 @@
}
});
-var View = function( chrom, max_high, config ) {
+var View = function( chrom, title, vis_id, dbkey ) {
+ this.vis_id = vis_id;
+ this.dbkey = dbkey;
+ this.title = title;
this.chrom = chrom;
- this.config = config;
this.tracks = [];
+ this.label_tracks = [];
this.max_low = 0;
- this.max_high = max_high;
+ this.max_high = 0;
this.center = (this.max_high - this.max_low) / 2;
- this.span = this.max_high - this.max_low;
this.zoom_factor = 3;
this.zoom_level = 0;
};
@@ -94,6 +96,10 @@
this.tracks.push( track );
if (track.init) { track.init(); }
},
+ add_label_track: function ( label_track ) {
+ label_track.view = this;
+ this.label_tracks.push( label_track );
+ },
remove_track: function( track ) {
delete this.tracks[track];
},
@@ -105,7 +111,8 @@
}
}
},
- redraw: function() {
+ redraw: function(nodraw) {
+ this.span = this.max_high - this.max_low;
var span = this.span / Math.pow(this.zoom_factor, this.zoom_level),
low = this.center - (span / 2),
high = low + span;
@@ -134,11 +141,14 @@
}).show();
$("#low").val( commatize(this.low) );
$("#high").val( commatize(this.high) );
- for ( var i = 0, len = this.tracks.length; i < len; i++ ) {
- this.tracks[i].draw();
+ if (!nodraw) {
+ for ( var i = 0, len = this.tracks.length; i < len; i++ ) {
+ this.tracks[i].draw();
+ }
+ for ( var i = 0, len = this.label_tracks.length; i < len; i++ ) {
+ this.label_tracks[i].draw();
+ }
}
- //$("#bottom-spacer").remove();
- //$("#viewport").append('<div id="bottom-spacer" style="height: 200px;"></div>');
},
zoom_in: function ( point ) {
if (this.max_high === 0 || this.high - this.low < 30) {
@@ -238,6 +248,7 @@
var LabelTrack = function ( parent_element ) {
Track.call( this, null, parent_element );
+ this.track_type = "LabelTrack";
this.hidden = true;
this.container_div.addClass( "label-track" );
};
@@ -273,26 +284,27 @@
this.height_px = 100;
this.container_div.addClass( "line-track" );
this.dataset_id = dataset_id;
- this.data_queue = {};
- this.data_cache = new Cache(CACHED_DATA); // We need to cache some data because of
- // asynchronous calls
this.prefs = { 'min_value': undefined, 'max_value': undefined };
if (prefs.min_value !== undefined) { this.prefs.min_value = prefs.min_value; }
if (prefs.max_value !== undefined) { this.prefs.max_value = prefs.max_value; }
};
$.extend( LineTrack.prototype, TiledTrack.prototype, {
init: function() {
+ this.data_queue = {};
+ this.data_cache = new Cache(CACHED_DATA); // We need to cache some data because of
+ // asynchronous calls
var track = this,
track_id = track.view.tracks.indexOf(track);
-
+
track.content_div.text(DATA_LOADING);
+ track.container_div.removeClass("nodata error pending");
$.getJSON( data_url, { stats: true, indexer: track.indexer,
chrom: track.view.chrom, low: null, high: null,
dataset_id: track.dataset_id }, function ( data ) {
if (!data || data == "error") {
track.container_div.addClass("error");
track.content_div.text(DATA_ERROR);
- } else if (data == "no data") {
+ } else if (data.length === 0 || data == "no data") {
track.container_div.addClass("nodata");
track.content_div.text(DATA_NONE);
} else if (data == "pending") {
@@ -313,15 +325,17 @@
}
track.vertical_range = track.prefs.max_value - track.prefs.min_value;
- // Draw y-axis labels
- var min_label = $("<div></div>").addClass('yaxislabel').attr("id", 'linetrack_' + track_id + '_minval').text(track.prefs.min_value);
- var max_label = $("<div></div>").addClass('yaxislabel').attr("id", 'linetrack_' + track_id + '_maxval').text(track.prefs.max_value);
+ // Draw y-axis labels if necessary
+ if ( $('#linetrack_' + track_id + '_minval').length === 0) {
+ var min_label = $("<div></div>").addClass('yaxislabel').attr("id", 'linetrack_' + track_id + '_minval').text(track.prefs.min_value);
+ var max_label = $("<div></div>").addClass('yaxislabel').attr("id", 'linetrack_' + track_id + '_maxval').text(track.prefs.max_value);
- max_label.css({ position: "relative", top: "25px" });
- max_label.prependTo(track.container_div);
+ max_label.css({ position: "relative", top: "25px" });
+ max_label.prependTo(track.container_div);
- min_label.css({ position: "relative", top: track.height_px + 55 + "px" });
- min_label.prependTo(track.container_div);
+ min_label.css({ position: "relative", top: track.height_px + 55 + "px" });
+ min_label.prependTo(track.container_div);
+ }
track.draw();
}
@@ -345,7 +359,7 @@
}
},
draw_tile: function( resolution, tile_index, parent_element, w_scale ) {
- if (!this.vertical_range) { // We don't have the necessary information yet
+ if (this.vertical_range === undefined) { // We don't have the necessary information yet
return;
}
@@ -463,6 +477,7 @@
init: function() {
var track = this;
track.content_div.text(DATA_LOADING);
+ track.container_div.removeClass("nodata error pending");
$.getJSON( data_url, { indexer: track.indexer, low: track.view.max_low,
high: track.view.max_high, dataset_id: track.dataset_id,
chrom: track.view.chrom }, function ( data ) {
@@ -473,7 +488,7 @@
track.container_div.addClass("nodata");
track.content_div.text(DATA_NONE);
} else if (data == "pending") {
- track.container_div.addClass("pending");
+ track.container_div.adClass("pending");
track.content_div.text(DATA_PENDING);
setTimeout(function() { track.init(); }, 5000);
} else {
diff -r 99483ae6c738 -r 432a32ba55bb static/trackster.css
--- a/static/trackster.css Fri Feb 05 16:34:30 2010 -0500
+++ b/static/trackster.css Fri Feb 05 19:08:37 2010 -0500
@@ -8,6 +8,7 @@
#nav-container {
position: fixed;
+ left: 0;
bottom: 0;
}
diff -r 99483ae6c738 -r 432a32ba55bb templates/grid_base.mako
--- a/templates/grid_base.mako Fri Feb 05 16:34:30 2010 -0500
+++ b/templates/grid_base.mako Fri Feb 05 19:08:37 2010 -0500
@@ -27,6 +27,10 @@
<%def name="javascripts()">
${parent.javascripts()}
+ ${self.grid_javascripts()}
+</%def>
+
+<%def name="grid_javascripts()">
${h.js("jquery.autocomplete", "autocomplete_tagging" )}
<script type="text/javascript">
## TODO: generalize and move into galaxy.base.js
diff -r 99483ae6c738 -r 432a32ba55bb templates/tracks/add_tracks.mako
--- a/templates/tracks/add_tracks.mako Fri Feb 05 16:34:30 2010 -0500
+++ b/templates/tracks/add_tracks.mako Fri Feb 05 19:08:37 2010 -0500
@@ -1,8 +1,9 @@
## Template generates a grid that enables user to add tracks
<%namespace file="../grid_base.mako" import="*" />
-${javascripts()}
${stylesheets()}
+${grid_javascripts()}
+
${render_grid_table( grid, show_item_checkboxes=True )}
## Initialize the grid.
diff -r 99483ae6c738 -r 432a32ba55bb templates/tracks/browser.mako
--- a/templates/tracks/browser.mako Fri Feb 05 16:34:30 2010 -0500
+++ b/templates/tracks/browser.mako Fri Feb 05 19:08:37 2010 -0500
@@ -45,7 +45,7 @@
</div>
</div>
-<div id="nav-container">
+<div id="nav-container" style="width:100%;">
<div id="nav-labeltrack"></div>
<div id="nav">
<div id="overview">
@@ -59,8 +59,7 @@
<option value="">Loading</option>
</select>
<input id="low" size="12" />:<input id="high" size="12" />
- ## <input type="hidden" name="dataset_ids" value="${dataset_ids}" />
- <input type="hidden" name="id" value="${id}" />
+ <input type="hidden" name="id" value="${config.get('vis_id', '')}" />
<a href="#" onclick="javascript:view.zoom_in();view.redraw();">+</a>
<a href="#" onclick="javascript:view.zoom_out();view.redraw();">-</a>
</form>
@@ -75,11 +74,10 @@
<div class="unified-panel-header-inner">Configuration</div>
</div>
<form action="${h.url_for( action='update_config' )}">
-## <input name="title" id="title" value="${title}" />
+## <input name="title" id="title" value="${config.title}" />
<div id="show-hide-move">
<ul id="sortable-ul"></ul>
</div>
-## <input type="submit" id="update-config" value="Save settings" />
<input type="button" id="refresh-button" value="Refresh" />
<input type="button" id="save-button" value="Save" />
<input id="add-track" type="button" value="Add Track" />
@@ -89,154 +87,227 @@
<%def name="javascripts()">
${parent.javascripts()}
-${h.js( "json2", "jquery", "jquery.event.drag", "jquery.mousewheel", "trackster", "ui.core", "ui.sortable" )}
+${h.js( 'galaxy.base', 'galaxy.panels', "json2", "jquery", "jquery.event.drag", "jquery.mousewheel", "trackster", "ui.core", "ui.sortable" )}
<script type="text/javascript">
var data_url = "${h.url_for( action='data' )}";
- var view = new View( "${chrom}", ${LEN} );
+ var view;
$(function() {
- view.add_track( new LabelTrack( $("#top-labeltrack" ) ) );
- view.add_track( new LabelTrack( $("#nav-labeltrack" ) ) );
-
- %for track in tracks:
- view.add_track(
- new ${track["track_type"]}( "${track['name']}", ${track['dataset_id']}, "${track['indexer']}", ${track['prefs']} )
- );
- %endfor
-
- $(document).bind( "redraw", function( e ) {
- view.redraw();
- });
-
- $("#content").bind("mousewheel", function( e, delta ) {
- if (delta > 0) {
- view.zoom_in(e.pageX);
- } else {
- view.zoom_out();
- }
- e.preventDefault();
- });
-
- $("#content").bind("dblclick", function( e ) {
- view.zoom_in(e.pageX);
- });
-
- // To let the overview box be draggable
- $("#overview-box").bind("dragstart", function( e ) {
- this.current_x = e.offsetX;
- }).bind("drag", function( e ) {
- var delta = e.offsetX - this.current_x;
- this.current_x = e.offsetX;
-
- var delta_chrom = Math.round(delta / $(document).width() * view.span);
- view.center += delta_chrom;
- view.redraw();
- });
-
- // To adjust the size of the viewport to fit the fixed-height footer
- var refresh = function( e ) {
- $("#content").height( $(window).height() - $("#nav-container").height() - $("#masthead").height());
- $("#viewport-container").height( $("#content").height() - $("#top-labeltrack").height() - $("#nav-labeltrack").height() );
- $("#nav-container").width( $("#center").width() );
- view.redraw();
- };
- $(window).bind( "resize", function(e) { refresh(e); } );
- $("#right-border").bind( "click", function(e) { refresh(e); } );
- $("#right-border").bind( "dragend", function(e) { refresh(e); } );
- $(window).trigger( "resize" );
-
- $("#viewport").bind( "dragstart", function( e ) {
- this.original_low = view.low;
- this.current_height = e.clientY;
- this.current_x = e.offsetX;
- }).bind( "drag", function( e ) {
- var container = $(this).parent();
- var delta = e.offsetX - this.current_x;
- var new_scroll = container.scrollTop() - (e.clientY - this.current_height);
- if ( new_scroll < container.get(0).scrollHeight - container.height() ) {
- container.scrollTop(new_scroll);
- }
- this.current_height = e.clientY;
- this.current_x = e.offsetX;
-
- var delta_chrom = Math.round(delta / $(document).width() * (view.high - view.low));
- view.center -= delta_chrom;
- view.redraw();
- });
-
- $("#refresh-button").bind( "click", function(e) {
- view.update_options();
- });
-
- // Use a popup grid to add more tracks
- $("#add-track").bind( "click", function(e) {
+ %if config:
+ view = new View( "${config.get('chrom')}", "${config.get('title') | h}", "${config.get('vis_id')}", "${config.get('dbkey')}" );
+ %for track in config.get('tracks'):
+ view.add_track(
+ new ${track["track_type"]}( "${track['name'] | h}", ${track['dataset_id']}, "${track['indexer']}", ${track['prefs']} )
+ );
+ %endfor
+ init();
+ %else:
$.ajax({
- url: "${h.url_for( action='list_datasets' )}",
+ url: "${h.url_for( action='new_browser' )}",
data: {},
- error: function() { alert( "Grid refresh failed" ) },
- success: function(table_html) {
- show_modal("Add Track — Select Dataset(s)", table_html, {
- "Insert": function() {
- hide_modal();
- },
- "Cancel": function() {
+ error: function() { alert( "Couldn't create new browser" ) },
+ success: function(form_html) {
+ show_modal("New Track Browser", form_html, {
+ "Continue": function() {
+ view = new View( undefined, $("#new-title").val(), undefined, $("#new-dbkey").val() );
+ init();
hide_modal();
}
});
}
});
- });
+ %endif
- $("#save-button").bind("click", function(e) {
- view.update_options();
- var sorted = $("ul#sortable-ul").sortable('toArray');
- var payload = [];
- for (var i in sorted) {
- var track_id = parseInt(sorted[i].split("track_")[1]),
- track = view.tracks[track_id];
-
- payload.push( {
- "track_type": track.track_type,
- "indexer": track.indexer,
- "name": track.name,
- "dataset_id": track.dataset_id,
- "prefs": track.prefs
- });
- }
- $.ajax({
- url: "${h.url_for( action='save' )}",
- data: {
- 'id': '${id}',
- 'payload': JSON.stringify(payload)
+ // Execute this when everything is ready
+ function init() {
+ $("ul#sortable-ul").sortable({
+ update: function(event, ui) {
+ for (var track_id in view.tracks) {
+ var track = view.tracks[track_id];
+ }
}
});
- });
-
- // Execute this on page load
- (function () {
- $.getJSON( "${h.url_for( action='chroms' )}", { dbkey: "${dbkey}" }, function ( data ) {
+
+ $(document).bind( "redraw", function( e ) {
+ view.redraw();
+ });
+
+ $("#content").bind("mousewheel", function( e, delta ) {
+ if (delta > 0) {
+ view.zoom_in(e.pageX);
+ } else {
+ view.zoom_out();
+ }
+ e.preventDefault();
+ });
+
+ $("#content").bind("dblclick", function( e ) {
+ view.zoom_in(e.pageX);
+ });
+
+ // To let the overview box be draggable
+ $("#overview-box").bind("dragstart", function( e ) {
+ this.current_x = e.offsetX;
+ }).bind("drag", function( e ) {
+ var delta = e.offsetX - this.current_x;
+ this.current_x = e.offsetX;
+
+ var delta_chrom = Math.round(delta / $(document).width() * view.span);
+ view.center += delta_chrom;
+ view.redraw();
+ });
+
+ // To adjust the size of the viewport to fit the fixed-height footer
+ var refresh = function( e ) {
+ $("#content").height( $(window).height() - $("#nav-container").height() - $("#masthead").height());
+ $("#viewport-container").height( $("#content").height() - $("#top-labeltrack").height() - $("#nav-labeltrack").height() );
+ $("#nav-container").width( $("#center").width() );
+ view.redraw();
+ };
+ $(window).bind( "resize", function(e) { refresh(e); } );
+ $("#right-border").bind( "click", function(e) { refresh(e); } );
+ $("#right-border").bind( "dragend", function(e) { refresh(e); } );
+ $(window).trigger( "resize" );
+
+ $("#viewport").bind( "dragstart", function( e ) {
+ this.original_low = view.low;
+ this.current_height = e.clientY;
+ this.current_x = e.offsetX;
+ }).bind( "drag", function( e ) {
+ var container = $(this).parent();
+ var delta = e.offsetX - this.current_x;
+ var new_scroll = container.scrollTop() - (e.clientY - this.current_height);
+ if ( new_scroll < container.get(0).scrollHeight - container.height() ) {
+ container.scrollTop(new_scroll);
+ }
+ this.current_height = e.clientY;
+ this.current_x = e.offsetX;
+
+ var delta_chrom = Math.round(delta / $(document).width() * (view.high - view.low));
+ view.center -= delta_chrom;
+ view.redraw();
+ });
+
+ $("#refresh-button").bind( "click", function(e) {
+ view.update_options();
+ });
+
+ // Use a popup grid to add more tracks
+ $("#add-track").bind( "click", function(e) {
+ $.ajax({
+ url: "${h.url_for( action='list_datasets' )}",
+ data: {},
+ error: function() { alert( "Grid refresh failed" ) },
+ success: function(table_html) {
+ show_modal("Add Track — Select Dataset(s)", table_html, {
+ "Insert": function() {
+ $('input[name=id]:checked').each(function() {
+ var item_id = $(this).val();
+ $.ajax( {
+ url: "${h.url_for( action='add_track_async' )}",
+ data: { id: item_id },
+ dataType: "json",
+ error: function() {},
+ success: function(track_data) {
+ var new_track;
+ var td = track_data;
+ switch(track_data.track_type) {
+ case "LineTrack":
+ new_track = new LineTrack( track_data.name, track_data.dataset_id, track_data.indexer, track_data.prefs );
+ break;
+ case "FeatureTrack":
+ new_track = new FeatureTrack( track_data.name, track_data.dataset_id, track_data.indexer, track_data.prefs );
+ break;
+ case "ReadTrack":
+ new_track = new ReadTrack( track_data.name, track_data.dataset_id, track_data.indexer, track_data.prefs );
+ break;
+ }
+ view.add_track(new_track);
+ sidebar_box(new_track);
+ }
+ });
+
+ });
+
+ hide_modal();
+ },
+ "Cancel": function() {
+ hide_modal();
+ }
+ });
+ }
+ });
+ });
+
+ $("#save-button").bind("click", function(e) {
+ view.update_options();
+ var sorted = $("ul#sortable-ul").sortable('toArray');
+ var payload = [];
+ for (var i in sorted) {
+ var track_id = parseInt(sorted[i].split("track_")[1]),
+ track = view.tracks[track_id];
+
+ payload.push( {
+ "track_type": track.track_type,
+ "indexer": track.indexer,
+ "name": track.name,
+ "dataset_id": track.dataset_id,
+ "prefs": track.prefs
+ });
+ }
+ // Show saving dialog box
+ show_modal("Saving...", "<img src='${h.url_for('/static/images/yui/rel_interstitial_loading.gif')}'/>");
+
+ $.ajax({
+ url: "${h.url_for( action='save' )}",
+ data: {
+ 'vis_id': view.vis_id,
+ 'vis_title': view.title,
+ 'dbkey': view.dbkey,
+ 'payload': JSON.stringify(payload)
+ },
+ success: function(vis_id) {
+ view.vis_id = vis_id;
+ hide_modal();
+ }
+ });
+ });
+
+ view.add_label_track( new LabelTrack( $("#top-labeltrack" ) ) );
+ view.add_label_track( new LabelTrack( $("#nav-labeltrack" ) ) );
+
+ $.getJSON( "${h.url_for( action='chroms' )}", { dbkey: view.dbkey }, function ( data ) {
+ view.chrom_data = data;
var chrom_options = '<option value="">Select Chrom/Contig</option>';
for (i in data) {
- chrom = data[i]['chrom']
- if( chrom == view.chrom ) {
- chrom_options += '<option value="' + chrom + '" selected="true">' + chrom + '</option>';
- } else {
- chrom_options += '<option value="' + chrom + '">' + chrom + '</option>';
- }
+ var chrom = data[i]['chrom']
+ chrom_options += '<option value="' + chrom + '">' + chrom + '</option>';
}
$("#chrom").html(chrom_options);
$("#chrom").bind( "change", function () {
- $("#chr").submit();
+ view.chrom = $("#chrom").val();
+ var found = $.grep(view.chrom_data, function(v, i) {
+ return v.chrom === view.chrom;
+ })[0];
+ view.max_high = found.len;
+ view.redraw(true);
+
+ for (var track_id in view.tracks) {
+ var track = view.tracks[track_id];
+ if (track.init) {
+ track.init();
+ }
+ }
+ // view.redraw();
});
});
- // Populate sort/move ul
- for (var track_id in view.tracks) {
- var track = view.tracks[track_id];
+ function sidebar_box(track) {
if (!track.hidden) {
+ var track_id = view.tracks.length -1; // Track was just added to view, so index is current length -1
var label = $('<label for="track_' + track_id + 'title">' + track.name + '</label>');
var title = $('<div class="historyItemTitle"></div>');
var del_icon = $('<a style="display:block; float:right" href="#" class="icon-button delete" />');
@@ -255,18 +326,17 @@
li.append(div);
$("ul#sortable-ul").append(li);
}
+ };
+
+ // Populate sort/move ul
+ for (var track_id in view.tracks) {
+ var track = view.tracks[track_id];
+ sidebar_box(track);
}
- $("ul#sortable-ul").sortable({
- update: function(event, ui) {
- for (var track_id in view.tracks) {
- var track = view.tracks[track_id];
- }
- }
- });
-
- })();
- $(window).trigger("resize");
+ $(window).trigger("resize");
+ };
+
});
</script>
diff -r 99483ae6c738 -r 432a32ba55bb templates/tracks/index.mako
--- a/templates/tracks/index.mako Fri Feb 05 16:34:30 2010 -0500
+++ b/templates/tracks/index.mako Fri Feb 05 19:08:37 2010 -0500
@@ -1,16 +1,38 @@
-<%inherit file="/base_panels.mako"/>
+<form id="form" method="POST">
+ <div class="form-row">
+ <label for="dbkey">Browser name:</label>
+ <div class="form-row-input">
+ <input type="text" name="title" id="title" value="Unnamed Browser"></input>
+ </div>
+ <div style="clear: both;"></div>
+ </div>
+ <div class="form-row">
+ <label for="dbkey">Reference genome build (dbkey): </label>
+ <div class="form-row-input">
+ <select name="dbkey" id="dbkey" refresh_on_change="true">
+ %for tmp_dbkey in dbkey_set:
+ <option value="${tmp_dbkey}"
+ %if tmp_dbkey == dbkey:
+ selected="selected"
+ %endif
+ >${tmp_dbkey}</option>
+ %endfor
+ </select>
+ </div>
+ <div style="clear: both;"></div>
+ </div>
+ <div class="form-row">
+ <label for="dataset_ids">Datasets to visualize: (${", ".join(available_tracks)} files are supported)</label>
+ %for dataset_id, (dataset_ext, dataset_name) in datasets.iteritems():
+ <div>
+ <input type="checkbox" id="${dataset_id}" name="dataset_ids" value="${dataset_id}" />
+ <label style="display:inline; font-weight: normal" for="${dataset_id}">[${dataset_ext}] ${dataset_name}</label>
+ </div>
+ %endfor
-<%def name="init()">
-<%
- self.has_left_panel=False
- self.has_right_panel=False
- self.active_view="visualization"
- self.message_box_visible=False
-%>
-</%def>
-
-<%def name="center_panel()">
-
- <iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${h.url_for( controller="tracks", action="new_browser" )}"> </iframe>
-
-</%def>
\ No newline at end of file
+ <div style="clear: both;"></div>
+ </div>
+ <div class="form-row">
+ <input type="submit" name="browse" value="Browse"/>
+ </div>
+</form>
diff -r 99483ae6c738 -r 432a32ba55bb templates/tracks/new_browser.mako
--- a/templates/tracks/new_browser.mako Fri Feb 05 16:34:30 2010 -0500
+++ b/templates/tracks/new_browser.mako Fri Feb 05 19:08:37 2010 -0500
@@ -1,65 +1,20 @@
-<%inherit file="/base.mako"/>
-
-<%def name="javascripts()">
-${parent.javascripts()}
-<script type="text/javascript">
-$( function() {
- $( "select[refresh_on_change='true']").change( function() {
- $("#form").submit();
- });
-});
-</script>
-</%def>
-
-% if not available_tracks:
- <div class="errormessagelarge">
- There are no available converters needed for visualization. Please verify that your tool_conf.xml file contains
- converters for datatypes (see tool_conf.xml.sample) for examples.
+<form id="form" method="POST">
+ <div class="form-row">
+ <label for="title">Browser name:</label>
+ <div class="form-row-input">
+ <input type="text" name="title" id="new-title" value="Unnamed Browser"></input>
+ </div>
+ <div style="clear: both;"></div>
</div>
-
-% else:
- <div class="form">
- <div class="form-title">Create new track browser</div>
-
- <div id="dbkey" class="form-body">
- <form id="form" method="POST">
- <div class="form-row">
- <label for="dbkey">Browser name:</label>
- <div class="form-row-input">
- <input type="text" name="title" id="title" value="Unnamed Browser"></input>
- </div>
- <div style="clear: both;"></div>
- </div>
- <div class="form-row">
- <label for="dbkey">Reference genome build (dbkey): </label>
- <div class="form-row-input">
- <select name="dbkey" id="dbkey" refresh_on_change="true">
- %for tmp_dbkey in dbkey_set:
- <option value="${tmp_dbkey}"
- %if tmp_dbkey == dbkey:
- selected="selected"
- %endif
- >${tmp_dbkey}</option>
- %endfor
- </select>
- </div>
- <div style="clear: both;"></div>
- </div>
- <div class="form-row">
- <label for="dataset_ids">Datasets to visualize: (${", ".join(available_tracks)} files are supported)</label>
- %for dataset_id, (dataset_ext, dataset_name) in datasets.iteritems():
- <div>
- <input type="checkbox" id="${dataset_id}" name="dataset_ids" value="${dataset_id}" />
- <label style="display:inline; font-weight: normal" for="${dataset_id}">[${dataset_ext}] ${dataset_name}</label>
- </div>
- %endfor
-
- <div style="clear: both;"></div>
- </div>
- </div>
- <div class="form-row">
- <input type="submit" name="browse" value="Browse"/>
- </div>
- </form>
+ <div class="form-row">
+ <label for="dbkey">Reference genome build (dbkey): </label>
+ <div class="form-row-input">
+ <select name="dbkey" id="new-dbkey">
+ %for dbkey in dbkey_set:
+ <option value="${dbkey}">${dbkey}</option>
+ %endfor
+ </select>
+ </div>
+ <div style="clear: both;"></div>
</div>
-% endif
+</form>
1
0
09 Feb '10
details: http://www.bx.psu.edu/hg/galaxy/rev/99483ae6c738
changeset: 3348:99483ae6c738
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Fri Feb 05 16:34:30 2010 -0500
description:
Prevent history tag and annotation icons from wrapping.
diffstat:
templates/root/history.mako | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diffs (14 lines):
diff -r 656e1014f2fa -r 99483ae6c738 templates/root/history.mako
--- a/templates/root/history.mako Fri Feb 05 16:27:18 2010 -0500
+++ b/templates/root/history.mako Fri Feb 05 16:34:30 2010 -0500
@@ -286,8 +286,8 @@
<span class="tip">Click to edit</span></a>
</div>
</td>
- <td align="right">
- <div style="float: right">
+ <td align="right" style="width: 40px">
+ <div style="float: right; white-space: nowrap">
<a id="history-tag" title="Tag" class="icon-button tag tooltip" target="galaxy_main" href="${h.url_for( controller='history', action='tag' )}"></a>
<a id="history-annotate" title="Annotate" class="icon-button annotate" target="galaxy_main" href="${h.url_for( controller='history', action='annotate' )}"></a>
</div>
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/656e1014f2fa
changeset: 3347:656e1014f2fa
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Fri Feb 05 16:27:18 2010 -0500
description:
Add a label for experiment name in MACs
diffstat:
tools/peak_calling/macs_wrapper.xml | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diffs (12 lines):
diff -r e9de35947c06 -r 656e1014f2fa tools/peak_calling/macs_wrapper.xml
--- a/tools/peak_calling/macs_wrapper.xml Fri Feb 05 16:06:27 2010 -0500
+++ b/tools/peak_calling/macs_wrapper.xml Fri Feb 05 16:27:18 2010 -0500
@@ -6,7 +6,7 @@
<requirement type="binary">macs</requirement>
</requirements>
<inputs>
- <param name="experiment_name" type="text" value="MACS in Galaxy" size="50"/>
+ <param name="experiment_name" type="text" value="MACS in Galaxy" size="50" label="Experiment Name"/>
<conditional name="input_type">
<param name="input_type_selector" type="select" label="Paired End Sequencing">
<option value="paired_end">Paired End (requires elandmultipet format)</option>
1
0