details:
http://www.bx.psu.edu/hg/galaxy/rev/6d079d53f9db
changeset: 3530:6d079d53f9db
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Mon Mar 15 11:31:14 2010 -0400
description:
Add functionality for inline editing of dataset tags and annotation in history panel
(icons are currently opposite save/rerun icons). Various style and template fixes as
well.
diffstat:
lib/galaxy/web/base/controller.py | 11 +-
lib/galaxy/web/controllers/dataset.py | 31 ++++-
lib/galaxy/web/controllers/page.py | 2 +-
lib/galaxy/web/controllers/tag.py | 19 ++-
lib/galaxy/web/framework/helpers/grids.py | 4 +-
static/june_2007_style/autocomplete_tagging.css.tmpl | 5 +
static/june_2007_style/base.css.tmpl | 9 +-
static/june_2007_style/blue/autocomplete_tagging.css | 3 +-
static/june_2007_style/blue/base.css | 3 +-
templates/dataset/display.mako | 2 +-
templates/dataset/embed.mako | 6 +-
templates/display_base.mako | 2 +-
templates/embed_base.mako | 20 ++-
templates/grid_base_async.mako | 2 +-
templates/root/history.mako | 110 ++++++++++++++++--
templates/root/history_common.mako | 18 ++-
templates/tagging_common.mako | 6 +-
17 files changed, 203 insertions(+), 50 deletions(-)
diffs (553 lines):
diff -r 96ec861b4b6e -r 6d079d53f9db lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py Sun Mar 14 11:49:44 2010 -0400
+++ b/lib/galaxy/web/base/controller.py Mon Mar 15 11:31:14 2010 -0400
@@ -62,7 +62,7 @@
def get_item_annotation_obj( self, db_session, user, item ):
""" Returns a user's annotation object for an item.
"""
- # Get annotation association. TODO: we could replace this eval() with a long
if/else stmt, but this is more general without sacrificing
+ # Get annotation association.
try:
annotation_assoc_class = eval( "model.%sAnnotationAssociation" %
item.__class__.__name__ )
except:
@@ -126,7 +126,7 @@
class UsesHistoryDatasetAssociation:
""" Mixin for controllers that use HistoryDatasetAssociation objects.
"""
- def get_dataset( self, trans, dataset_id, check_accessible=True ):
+ def get_dataset( self, trans, dataset_id, check_ownership=True,
check_accessible=False ):
""" Get an HDA object by id. """
# DEPRECATION: We still support unencoded ids for backward compatibility
try:
@@ -136,6 +136,13 @@
data = trans.sa_session.query( model.HistoryDatasetAssociation ).get( dataset_id
)
if not data:
raise paste.httpexceptions.HTTPRequestRangeNotSatisfiable( "Invalid
dataset id: %s." % str( dataset_id ) )
+ if check_ownership:
+ # Verify ownership.
+ user = trans.get_user()
+ if not user:
+ error( "Must be logged in to manage Galaxy items" )
+ if data.history.user != user:
+ error( "%s is not owned by current user" %
data.__class__.__name__ )
if check_accessible:
current_user_roles = trans.get_current_user_roles()
if trans.app.security_agent.can_access_dataset( current_user_roles,
data.dataset ):
diff -r 96ec861b4b6e -r 6d079d53f9db lib/galaxy/web/controllers/dataset.py
--- a/lib/galaxy/web/controllers/dataset.py Sun Mar 14 11:49:44 2010 -0400
+++ b/lib/galaxy/web/controllers/dataset.py Mon Mar 15 11:31:14 2010 -0400
@@ -5,6 +5,7 @@
from galaxy import util, datatypes, jobs, web, model
from cgi import escape, FieldStorage
from galaxy.datatypes.display_applications.util import encode_dataset_user,
decode_dataset_user
+from galaxy.util.sanitize_html import sanitize_html
from email.MIMEText import MIMEText
import pkg_resources;
@@ -444,16 +445,14 @@
@web.require_login( "use Galaxy datasets" )
def get_name_and_link_async( self, trans, id=None ):
""" Returns dataset's name and link. """
- dataset = self.get_dataset( trans, id )
+ dataset = self.get_dataset( trans, id, False, True )
return_dict = { "name" : dataset.name, "link" : url_for(
action="display_by_username_and_slug", username=dataset.history.user.username,
slug=trans.security.encode_id( dataset.id ) ) }
return return_dict
@web.expose
def get_embed_html_async( self, trans, id ):
""" Returns HTML for embedding a dataset in a page.
"""
-
- # TODO: user should be able to embed any item he has access to. see
display_by_username_and_slug for security code.
- dataset = self.get_dataset( trans, id )
+ dataset = self.get_dataset( trans, id, False, True )
if dataset:
return "Embedded Dataset '%s'" % dataset.name
@@ -466,7 +465,7 @@
@web.expose
def display_by_username_and_slug( self, trans, username, slug, preview=True ):
""" Display dataset by username and slug; because datasets do not
yet have slugs, the slug is the dataset's id. """
- dataset = self.get_dataset( trans, slug )
+ dataset = self.get_dataset( trans, slug, False, True )
if dataset:
truncated, dataset_data = self.get_data( dataset, preview )
dataset.annotation = self.get_item_annotation_str( trans.sa_session,
dataset.history.user, dataset )
@@ -478,7 +477,7 @@
def get_item_content_async( self, trans, id ):
""" Returns item content in HTML format. """
- dataset = self.get_dataset( trans, id )
+ dataset = self.get_dataset( trans, id, False, True )
if dataset is None:
raise web.httpexceptions.HTTPNotFound()
truncated, dataset_data = self.get_data( dataset, preview=True )
@@ -486,6 +485,24 @@
dataset.annotation = self.get_item_annotation_str( trans.sa_session,
trans.get_user(), dataset )
return trans.stream_template_mako( "/dataset/item_content.mako",
item=dataset, item_data=dataset_data, truncated=truncated )
+ @web.expose
+ def annotate_async( self, trans, id, new_annotation=None, **kwargs ):
+ dataset = self.get_dataset( trans, id, False, True )
+ if not dataset:
+ web.httpexceptions.HTTPNotFound()
+ if dataset and new_annotation:
+ # Sanitize annotation before adding it.
+ new_annotation = sanitize_html( new_annotation, 'utf-8',
'text/html' )
+ self.add_item_annotation( trans, dataset, new_annotation )
+ trans.sa_session.flush()
+ return new_annotation
+
+ @web.expose
+ def get_annotation_async( self, trans, id ):
+ dataset = self.get_dataset( trans, id, False, True )
+ if not dataset:
+ web.httpexceptions.HTTPNotFound()
+ return self.get_item_annotation_str( trans.sa_session, trans.get_user(), dataset
)
@web.expose
def display_at( self, trans, dataset_id, filename=None, **kwd ):
@@ -704,7 +721,7 @@
if user != history.user:
error_msg = error_msg + "You do not have permission to add
datasets to %i requested histories. " % ( len( target_histories ) )
for dataset_id in dataset_ids:
- data = self.get_dataset( trans, dataset_id )
+ data = self.get_dataset( trans, dataset_id, False, True )
if data is None:
error_msg = error_msg + "You tried to copy a dataset that does
not exist or that you do not have access to. "
invalid_datasets += 1
diff -r 96ec861b4b6e -r 6d079d53f9db lib/galaxy/web/controllers/page.py
--- a/lib/galaxy/web/controllers/page.py Sun Mar 14 11:49:44 2010 -0400
+++ b/lib/galaxy/web/controllers/page.py Mon Mar 15 11:31:14 2010 -0400
@@ -674,7 +674,7 @@
datasets = self.get_history_datasets( trans, history )
return trans.fill_template( "history/embed.mako", item=history,
item_data=datasets )
elif item_class == model.HistoryDatasetAssociation:
- dataset = self.get_dataset( trans, item_id )
+ dataset = self.get_dataset( trans, item_id, False, True )
dataset.annotation = self.get_item_annotation_str( trans.sa_session,
dataset.history.user, dataset )
if dataset:
data = self.get_data( dataset )
diff -r 96ec861b4b6e -r 6d079d53f9db lib/galaxy/web/controllers/tag.py
--- a/lib/galaxy/web/controllers/tag.py Sun Mar 14 11:49:44 2010 -0400
+++ b/lib/galaxy/web/controllers/tag.py Mon Mar 15 11:31:14 2010 -0400
@@ -11,12 +11,21 @@
def __init__(self, app):
BaseController.__init__(self, app)
-
- # Set up tag handler to recognize the following items: History,
HistoryDatasetAssociation, Page, ...
self.tag_handler = TagHandler()
+
+ @web.expose
+ @web.require_login( "edit item tags" )
+ def get_tagging_elt_async( self, trans, item_id, item_class, elt_context=""
):
+ """ Returns HTML for editing an item's tags.
"""
+ item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
+ if not item:
+ return trans.show_error_message( "No item of class %s with id % " %
( item_class, item_id ) )
+ user = trans.get_user()
+ return trans.fill_template( "/tagging_common.mako",
tag_type="individual", user=trans.get_user(), tagged_item=item,
elt_context=elt_context,
+ in_form=False, input_size="22",
tag_click_fn="default_tag_click_fn", use_toggle_link=False )
@web.expose
- @web.require_login( "Add tag to an item." )
+ @web.require_login( "add tag to an item" )
def add_tag_async( self, trans, item_id=None, item_class=None, new_tag=None,
context=None ):
""" Add tag to an item. """
@@ -28,10 +37,10 @@
# Log.
params = dict( item_id=item.id, item_class=item_class, tag=new_tag)
- trans.log_action( user, unicode( "tag"), context, params )
+ trans.log_action( user, unicode( "tag" ), context, params )
@web.expose
- @web.require_login( "Remove tag from an item." )
+ @web.require_login( "remove tag from an item" )
def remove_tag_async( self, trans, item_id=None, item_class=None, tag_name=None,
context=None ):
""" Remove tag from an item. """
diff -r 96ec861b4b6e -r 6d079d53f9db lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py Sun Mar 14 11:49:44 2010 -0400
+++ b/lib/galaxy/web/framework/helpers/grids.py Mon Mar 15 11:31:14 2010 -0400
@@ -389,7 +389,7 @@
self.grid_name = grid_name
def get_value( self, trans, grid, item ):
return trans.fill_template( "/tagging_common.mako",
tag_type="community", 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" )
+ in_form=True, input_size="20",
tag_click_fn="add_tag_to_grid_filter", use_toggle_link=True )
def filter( self, db_session, user, query, column_filter ):
""" Modify query to filter model_class by tag. Multiple filters
are ANDed. """
if column_filter == "All":
@@ -418,7 +418,7 @@
""" 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" )
+ in_form=True, input_size="20",
tag_click_fn="add_tag_to_grid_filter", use_toggle_link=True )
def get_filter( self, user, column_filter ):
# Parse filter to extract multiple tags.
tag_handler = TagHandler()
diff -r 96ec861b4b6e -r 6d079d53f9db static/june_2007_style/autocomplete_tagging.css.tmpl
--- a/static/june_2007_style/autocomplete_tagging.css.tmpl Sun Mar 14 11:49:44 2010 -0400
+++ b/static/june_2007_style/autocomplete_tagging.css.tmpl Mon Mar 15 11:31:14 2010 -0400
@@ -74,6 +74,11 @@
cursor: pointer;
}
+.individual-tag-area:hover
+{
+ border:dotted #999999 1px;
+}
+
.active-tag-area {
background-color: white;
}
diff -r 96ec861b4b6e -r 6d079d53f9db static/june_2007_style/base.css.tmpl
--- a/static/june_2007_style/base.css.tmpl Sun Mar 14 11:49:44 2010 -0400
+++ b/static/june_2007_style/base.css.tmpl Mon Mar 15 11:31:14 2010 -0400
@@ -835,8 +835,7 @@
cursor:pointer;
}
-.editable-text:hover{
- background-image:url();
- background-repeat:no-repeat;
- background-position:right;
-}
+.editable-text:hover {
+ cursor: text;
+ border: dotted #999999 1px;
+}
\ No newline at end of file
diff -r 96ec861b4b6e -r 6d079d53f9db static/june_2007_style/blue/autocomplete_tagging.css
--- a/static/june_2007_style/blue/autocomplete_tagging.css Sun Mar 14 11:49:44 2010 -0400
+++ b/static/june_2007_style/blue/autocomplete_tagging.css Mon Mar 15 11:31:14 2010 -0400
@@ -7,7 +7,8 @@
.ac_over{background-color:#0A246A;color:white;}
.ac_header{font-style:normal;color:gray;border-bottom:0.1em solid gray;}
.tag-area{width:100%;}
-.individual-tag-area{border:solid 1px #eee;cursor:pointer;}
+.individual-tag-area{cursor:pointer;}
+.individual-tag-area:hover{border:dotted #999999 1px;}
.active-tag-area{background-color:white;}
.toggle-link{font-weight:normal;padding:0.3em;margin-bottom:1em;width:100%;padding:0.2em
0em 0.2em 0em;}
.tag-button{width:auto;color:#444;text-decoration:none;display:inline-block;cursor:pointer;margin:0.2em;border:solid
#bbb 1px;padding:0.1em 0.5em 0.1em
0.5em;-moz-border-radius:.5em;-webkit-border-radius:.5em;border-radius:.5em;background:#eee;}
diff -r 96ec861b4b6e -r 6d079d53f9db static/june_2007_style/blue/base.css
--- a/static/june_2007_style/blue/base.css Sun Mar 14 11:49:44 2010 -0400
+++ b/static/june_2007_style/blue/base.css Mon Mar 15 11:31:14 2010 -0400
@@ -145,4 +145,5 @@
.tipsy-east{background-position:right center;}
.tipsy-west{background-position:left center;}
.editable-text{cursor:pointer;}
-.editable-text:hover{background-image:url();background-repeat:no-repeat;background-position:right;}
+.editable-text:hover{cursor: text;border: dotted #999999 1px;}
+
diff -r 96ec861b4b6e -r 6d079d53f9db templates/dataset/display.mako
--- a/templates/dataset/display.mako Sun Mar 14 11:49:44 2010 -0400
+++ b/templates/dataset/display.mako Mon Mar 15 11:31:14 2010 -0400
@@ -22,7 +22,7 @@
</%def>
<%def name="render_item_links( data )">
- ## Provide links to save data and TODO: import dataset.
+ ## Provide links to save data and import dataset.
<a href="${h.url_for( controller='/dataset',
action='display', dataset_id=trans.security.encode_id( data.id ), to_ext=data.ext
)}" class="icon-button disk tooltip" title="Save
dataset"></a>
<a href="${h.url_for( controller='/dataset',
action='imp', dataset_id=trans.security.encode_id( data.id ) )}"
class="icon-button import tooltip" title="Import
dataset"></a>
</%def>
diff -r 96ec861b4b6e -r 6d079d53f9db templates/dataset/embed.mako
--- a/templates/dataset/embed.mako Sun Mar 14 11:49:44 2010 -0400
+++ b/templates/dataset/embed.mako Mon Mar 15 11:31:14 2010 -0400
@@ -3,8 +3,12 @@
from galaxy.web.framework.helpers import iff
%>
-<%def name="render_item_specific_title_links( dataset )">
+<%def name="render_item_links( dataset )">
<a href="${h.url_for( controller='/dataset',
action='display', dataset_id=trans.security.encode_id( dataset.id ),
to_ext=dataset.ext )}" title="Save dataset" class="icon-button disk
tooltip"></a>
+ ## Links for importing and viewing an item.
+ <a href="${h.url_for( controller='/dataset', action='imp',
dataset_id=trans.security.encode_id( item.id ) )}" title="Import dataset"
class="icon-button import tooltip"></a>
+ <a class="icon-button go-to-full-screen tooltip" href="${h.url_for(
controller='/dataset', action='display_by_username_and_slug',
username=dataset.history.user.username, slug=trans.security.encode_id( dataset.id )
)}" title="Go to dataset"></a>
+
</%def>
<%def name="render_summary_content( dataset, data )">
diff -r 96ec861b4b6e -r 6d079d53f9db templates/display_base.mako
--- a/templates/display_base.mako Sun Mar 14 11:49:44 2010 -0400
+++ b/templates/display_base.mako Mon Mar 15 11:31:14 2010 -0400
@@ -25,7 +25,7 @@
self.has_left_panel=False
self.has_right_panel=True
self.message_box_visible=False
- self.active_view="user"
+ self.active_view=""
self.overlay_visible=False
%>
</%def>
diff -r 96ec861b4b6e -r 6d079d53f9db templates/embed_base.mako
--- a/templates/embed_base.mako Sun Mar 14 11:49:44 2010 -0400
+++ b/templates/embed_base.mako Mon Mar 15 11:31:14 2010 -0400
@@ -18,8 +18,19 @@
</div>
</div>
-## Render item-specific title links.
-<%def name="render_item_specific_title_links( item )">
+## Render item links.
+<%def name="render_item_links( item )">
+ <%
+ item_display_name = get_class_display_name( item.__class__ ).lower()
+ item_controller = "/%s" % get_controller_name( item )
+ item_user = get_item_user( item )
+ item_slug = get_item_slug( item )
+ display_href = h.url_for( controller=item_controller,
action='display_by_username_and_slug', username=item_user.username, slug=item_slug
)
+ %>
+
+ ## Links for importing and viewing an item.
+ <a href="${h.url_for( controller=item_controller, action='imp',
id=trans.security.encode_id( item.id ) )}" title="Import
${item_display_name}" class="icon-button import tooltip"></a>
+ <a class="icon-button go-to-full-screen tooltip"
href="${display_href}" title="Go to
${item_display_name}"></a>
</%def>
<%def name="render_title( item )">
@@ -36,10 +47,7 @@
<a class="toggle-contract icon-button tooltip"
href="${display_href}" title="Hide ${item_display_name}
content"></a>
</div>
<div style="float: right">
- ${self.render_item_specific_title_links( item )}
- ## Links applicable for all items.
- <a href="${h.url_for( controller=item_controller, action='imp',
id=trans.security.encode_id( item.id ) )}" title="Import
${item_display_name}" class="icon-button import tooltip"></a>
- <a class="icon-button go-to-full-screen tooltip"
href="${display_href}" title="Go to
${item_display_name}"></a>
+ ${self.render_item_links( item )}
</div>
<h4><a class="toggle-embed tooltip"
href="${display_href}" title="Show or hide ${item_display_name}
content">Galaxy ${get_class_display_name( item.__class__ )} | ${get_item_name(
item )}</a></h4>
%if hasattr( item, "annotation") and item.annotation:
diff -r 96ec861b4b6e -r 6d079d53f9db templates/grid_base_async.mako
--- a/templates/grid_base_async.mako Sun Mar 14 11:49:44 2010 -0400
+++ b/templates/grid_base_async.mako Mon Mar 15 11:31:14 2010 -0400
@@ -13,4 +13,4 @@
*****
${num_pages}
*****
-${render_message( grid )}
\ No newline at end of file
+${render_message( message, message_type )}
\ No newline at end of file
diff -r 96ec861b4b6e -r 6d079d53f9db templates/root/history.mako
--- a/templates/root/history.mako Sun Mar 14 11:49:44 2010 -0400
+++ b/templates/root/history.mako Mon Mar 15 11:31:14 2010 -0400
@@ -42,10 +42,10 @@
$.jStore.remove("history_expand_state");
}).show();
- // Rename management.
+ // History rename functionality.
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 tagging functionality.
var historyTagArea = $('#history-tag-area');
$('#history-tag').click( function()
{
@@ -57,7 +57,7 @@
return false;
});
- // Annotation management.
+ // History annotation functionality.
var historyAnnotationArea = $('#history-annotation-area');
$('#history-annotate').click( function() {
if ( historyAnnotationArea.is( ":hidden" ) ) {
@@ -104,7 +104,8 @@
})
}
}
-// Add show/hide link and delete link to a history item
+// (a) Add show/hide link and delete link to a history item;
+// (b) handle tagging and annotation using jquery.
function setupHistoryItem( query ) {
query.each( function() {
var id = this.id;
@@ -180,6 +181,99 @@
return false;
});
});
+
+ // Tag handling.
+ $(this).find( "a.icon-button.tags").each( function()
+ {
+ // Use links parameters but custom URL as ajax URL.
+ $(this).click( function() {
+ // Get tag area, tag element.
+ var history_item = $(this).parents(".historyItem");
+ var tag_area = history_item.find(".tag-area");
+ var tag_elt = history_item.find(".tag-elt");
+
+ // Show or hide tag area; if showing tag area and it's empty, fill
it.
+ if ( tag_area.is( ":hidden" ) )
+ {
+ if (tag_elt.html() == "" )
+ {
+ // Need to fill tag element.
+ var href_parms =
$(this).attr("href").split("?")[1];
+ var ajax_url = "${h.url_for( controller='tag',
action='get_tagging_elt_async' )}?" + href_parms;
+ $.ajax({
+ url: ajax_url,
+ error: function() { alert( "Tagging failed" ) },
+ success: function(tag_elt_html) {
+ tag_elt.html(tag_elt_html);
+ tag_elt.find(".tooltip").tipsy( { gravity:
's' } );
+ tag_area.slideDown("fast");
+ }
+ });
+ }
+ else
+ {
+ // Tag element is filled; show.
+ tag_area.slideDown("fast");
+ }
+ }
+ else
+ {
+ // Hide.
+ tag_area.slideUp("fast");
+ }
+ return false;
+ });
+ });
+
+ // Annotation handling.
+ $(this).find( "a.icon-button.annotate").each( function()
+ {
+ // Use links parameters but custom URL as ajax URL.
+ $(this).click( function() {
+ // Get tag area, tag element.
+ var history_item = $(this).parents(".historyItem");
+ var annotation_area = history_item.find(".annotation-area");
+ var annotation_elt = history_item.find(".annotation-elt");
+
+ // Show or hide annotation area; if showing annotation area and it's
empty, fill it.
+ if ( annotation_area.is( ":hidden" ) )
+ {
+ if (annotation_elt.html() == "" )
+ {
+ // Need to fill annotation element.
+ var href_parms =
$(this).attr("href").split("?")[1];
+ var ajax_url = "${h.url_for( controller='dataset',
action='get_annotation_async' )}?" + href_parms;
+ $.ajax({
+ url: ajax_url,
+ error: function() { alert( "Annotations failed" )
},
+ success: function(annotation) {
+ if (annotation == "")
+ annotation = "<i>Describe or add notes to
dataset</i>";
+ annotation_elt.html(annotation);
+ annotation_area.find(".tooltip").tipsy( {
gravity: 's' } );
+ async_save_text(
+ annotation_elt.attr("id"),
annotation_elt.attr("id"),
+ "${h.url_for( controller="/dataset",
action="annotate_async")}?" + href_parms,
+ "new_annotation", 18, true, 4);
+ annotation_area.slideDown("fast");
+ }
+ });
+ }
+ else
+ {
+ // Annotation element is filled; show.
+ annotation_area.slideDown("fast");
+ }
+ }
+ else
+ {
+ // Hide.
+ annotation_area.slideUp("fast");
+ }
+ return false;
+ });
+ });
+
});
};
// Looks for changes in dataset state using an async request. Keeps
@@ -279,13 +373,6 @@
padding: 3px;
margin: -4px;
}
-.editable-text:hover {
- cursor: text;
- border: dotted #999999 1px;
-}
-.tag-area {
- border: none;
-}
</style>
<noscript>
@@ -299,7 +386,6 @@
</head>
<body class="historyPage">
-
<div id="top-links" class="historyLinks">
<a title="${_('refresh')}" class="icon-button arrow-circle
tooltip" href="${h.url_for('history',
show_deleted=show_deleted)}"></a>
diff -r 96ec861b4b6e -r 6d079d53f9db templates/root/history_common.mako
--- a/templates/root/history_common.mako Sun Mar 14 11:49:44 2010 -0400
+++ b/templates/root/history_common.mako Mon Mar 15 11:31:14 2010 -0400
@@ -86,10 +86,26 @@
</div>
<div class="info">${_('Info:
')}${data.display_info()}</div>
<div>
+ <% dataset_id=trans.security.encode_id( data.id ) %>
%if data.has_data:
- <a href="${h.url_for( controller='dataset',
action='display', dataset_id=trans.security.encode_id( data.id ), to_ext=data.ext
)}" title="Save" class="icon-button disk tooltip"></a>
+ <a href="${h.url_for( controller='dataset',
action='display', dataset_id=dataset_id, to_ext=data.ext )}"
title="Save" class="icon-button disk tooltip"></a>
%if user_owns_dataset:
<a href="${h.url_for( controller='tool_runner',
action='rerun', id=data.id )}" target="galaxy_main" title="Run
this job again" class="icon-button arrow-circle tooltip"></a>
+ %if trans.user:
+ <div style="float: right">
+ <a href="${h.url_for( controller='tag',
action='retag', item_class=data.__class__.__name__, item_id=dataset_id )}"
target="galaxy_main" title="Edit dataset tags" class="icon-button
tags tooltip"></a>
+ <a href="${h.url_for(
controller='dataset', action='annotate', id=dataset_id )}"
target="galaxy_main" title="Edit dataset annotation"
class="icon-button annotate tooltip"></a>
+ </div>
+ <div style="clear: both"></div>
+ <div class="tag-area" style="display:
none">
+ <strong>Tags:</strong>
+ <div class="tag-elt"></div>
+ </div>
+ <div id="${dataset_id}-annotation-area"
class="annotation-area" style="display: none">
+ <strong>Annotation:</strong>
+ <div id="${dataset_id}-annotation-elt"
style="margin: 1px 0px 1px 0px" class="annotation-elt tooltip
editable-text" title="Edit dataset annotation"></div>
+ </div>
+ %endif
%endif
<div style="clear: both"></div>
%for display_app in data.datatype.get_display_types():
diff -r 96ec861b4b6e -r 6d079d53f9db templates/tagging_common.mako
--- a/templates/tagging_common.mako Sun Mar 14 11:49:44 2010 -0400
+++ b/templates/tagging_common.mako Mon Mar 15 11:31:14 2010 -0400
@@ -13,7 +13,7 @@
## Render a tagging element if there is a tagged_item.
%if tagged_item is not None:
%if tag_type == "individual":
- ${render_individual_tagging_element(user=user, tagged_item=tagged_item,
elt_context=elt_context, in_form=in_form, input_size=input_size,
tag_click_fn=tag_click_fn)}
+ ${render_individual_tagging_element( user=user, tagged_item=tagged_item,
elt_context=elt_context, in_form=in_form, input_size=input_size,
tag_click_fn=tag_click_fn, use_toggle_link=use_toggle_link )}
%elif tag_type == "community":
${render_community_tagging_element(tagged_item=tagged_item,
elt_context=elt_context, tag_click_fn=tag_click_fn)}
%endif
@@ -123,7 +123,7 @@
//
// Set up autocomplete tagger.
//
-
+
//
// Default function get text to display on the toggle link.
//
@@ -193,7 +193,7 @@
ajax_delete_tag_url: "${h.url_for( controller='/tag',
action='remove_tag_async', item_id=tagged_item_id,
item_class=tagged_item.__class__.__name__, context=elt_context )}",
delete_tag_img:
"${h.url_for('/static/images/delete_tag_icon_gray.png')}",
delete_tag_img_rollover:
"${h.url_for('/static/images/delete_tag_icon_white.png')}",
- use_toggle_link: ${iff( use_toggle_link, 'true', 'false' )},
+ use_toggle_link: ${iff( use_toggle_link, 'true', 'false' )}
};
$('#${elt_id}').autocomplete_tagging(options);