[galaxy-dev] [hg] galaxy 3327: Added slug editing. Also updated/added HTML es...
Greg Von Kuster
greg at bx.psu.edu
Tue Feb 9 11:27:33 EST 2010
details: http://www.bx.psu.edu/hg/galaxy/rev/8570bf26275d
changeset: 3327:8570bf26275d
user: jeremy goecks <jeremy.goecks at emory.edu>
date: Thu Feb 04 10:11:50 2010 -0500
description:
Added slug editing. Also updated/added HTML escaping on display templates.
diffstat:
lib/galaxy/web/base/controller.py | 6 ++++
lib/galaxy/web/controllers/history.py | 11 +++++++-
lib/galaxy/web/controllers/page.py | 9 ++++++
lib/galaxy/web/controllers/workflow.py | 9 ++++++
static/images/pencil.png | 0
static/scripts/galaxy.base.js | 16 ++++++++++-
templates/dataset/display.mako | 10 ++++---
templates/display_base.mako | 8 +++---
templates/display_common.mako | 2 +
templates/history/display.mako | 2 +-
templates/root/history.mako | 4 +-
templates/sharing_base.mako | 43 +++++++++++++++++++++++++++++++-
templates/workflow/display.mako | 2 +-
templates/workflow/editor.mako | 4 +-
templates/workflow/list.mako | 4 +-
15 files changed, 109 insertions(+), 21 deletions(-)
diffs (350 lines):
diff -r da557305232f -r 8570bf26275d lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py Thu Feb 04 09:18:17 2010 -0500
+++ b/lib/galaxy/web/base/controller.py Thu Feb 04 10:11:50 2010 -0500
@@ -204,6 +204,12 @@
return self.sharing( trans, id, **kwargs )
# Abstract methods.
+
+ @web.expose
+ @web.require_login( "modify Galaxy items" )
+ def set_slug_async( self, trans, id, new_slug ):
+ """ Set item slug asynchronously. """
+ pass
@web.expose
@web.require_login( "share Galaxy items" )
diff -r da557305232f -r 8570bf26275d lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Thu Feb 04 09:18:17 2010 -0500
+++ b/lib/galaxy/web/controllers/history.py Thu Feb 04 10:11:50 2010 -0500
@@ -395,7 +395,16 @@
trans.sa_session.flush()
return
-
+
+ @web.expose
+ @web.require_login( "modify Galaxy items" )
+ def set_slug_async( self, trans, id, new_slug ):
+ history = self.get_history( trans, id )
+ if history:
+ history.slug = new_slug
+ trans.sa_session.flush()
+ return
+
@web.expose
def name_autocomplete_data( self, trans, q=None, limit=None, timestamp=None ):
"""Return autocomplete data for history names"""
diff -r da557305232f -r 8570bf26275d lib/galaxy/web/controllers/page.py
--- a/lib/galaxy/web/controllers/page.py Thu Feb 04 09:18:17 2010 -0500
+++ b/lib/galaxy/web/controllers/page.py Thu Feb 04 10:11:50 2010 -0500
@@ -541,6 +541,15 @@
return
@web.expose
+ @web.require_login( "modify Galaxy items" )
+ def set_slug_async( self, trans, id, new_slug ):
+ page = self.get_page( trans, id )
+ if page:
+ page.slug = new_slug
+ trans.sa_session.flush()
+ return
+
+ @web.expose
@web.json
@web.require_login( "use Galaxy pages" )
def get_name_and_link_async( self, trans, id=None ):
diff -r da557305232f -r 8570bf26275d lib/galaxy/web/controllers/workflow.py
--- a/lib/galaxy/web/controllers/workflow.py Thu Feb 04 09:18:17 2010 -0500
+++ b/lib/galaxy/web/controllers/workflow.py Thu Feb 04 10:11:50 2010 -0500
@@ -383,6 +383,15 @@
return
@web.expose
+ @web.require_login( "modify Galaxy items" )
+ def set_slug_async( self, trans, id, new_slug ):
+ stored = get_stored_workflow( trans, id )
+ if stored:
+ stored.slug = new_slug
+ trans.sa_session.flush()
+ return
+
+ @web.expose
@web.json
@web.require_login( "use Galaxy workflows" )
def get_name_and_link_async( self, trans, id=None ):
diff -r da557305232f -r 8570bf26275d static/images/pencil.png
Binary file static/images/pencil.png has changed
diff -r da557305232f -r 8570bf26275d static/scripts/galaxy.base.js
--- a/static/scripts/galaxy.base.js Thu Feb 04 09:18:17 2010 -0500
+++ b/static/scripts/galaxy.base.js Thu Feb 04 10:11:50 2010 -0500
@@ -211,7 +211,7 @@
//
// Edit and save text asynchronously.
//
-function async_save_text(click_to_edit_elt, text_elt_id, save_url, text_parm_name, use_textarea, num_rows)
+function async_save_text(click_to_edit_elt, text_elt_id, save_url, text_parm_name, use_textarea, num_rows, on_start, on_finish)
{
$("#" + click_to_edit_elt).click( function() {
var old_text = $("#" + text_elt_id).text()
@@ -236,13 +236,25 @@
$.ajax({
url: save_url,
data: ajax_data,
- error: function() { alert( "Text editing for elt " + text_elt_id + " failed" ) },
+ error: function() {
+ alert( "Text editing for elt " + text_elt_id + " failed" );
+ // TODO: call finish or no? For now, let's not because error occurred.
+ },
success: function() {
+ // Set new text and call finish method.
$("#" + text_elt_id).text( new_text );
+ if (on_finish != null)
+ on_finish(t);
}
});
}
});
+
+ // Call onstart method if it exists.
+ if (on_start != null)
+ on_start(t);
+
+ // Replace text with input object and focus & select.
$("#" + text_elt_id).hide();
t.insertAfter( $("#" + text_elt_id) );
t.focus();
diff -r da557305232f -r 8570bf26275d templates/dataset/display.mako
--- a/templates/dataset/display.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/dataset/display.mako Thu Feb 04 10:11:50 2010 -0500
@@ -18,7 +18,7 @@
</%def>
<%def name="title()">
- Galaxy | ${get_class_display_name( item.__class__ )} | ${get_item_name( item )}
+ Galaxy | ${get_class_display_name( item.__class__ )} | ${get_item_name( item ) | h}
</%def>
<%def name="render_item_links( data )">
@@ -43,7 +43,7 @@
<div class="unified-panel-header" unselectable="on">
<div class="unified-panel-header-inner">
${get_class_display_name( item.__class__ )}
- | ${get_item_name( item )}
+ | ${get_item_name( item ) | h}
</div>
</div>
@@ -72,11 +72,13 @@
<div style="padding: 10px;">
<h4>Author</h4>
- <p>${item.history.user.username}</p>
+ <p>${item.history.user.username | h}</p>
<div><img src="http://www.gravatar.com/avatar/${h.md5(item.history.user.email)}?s=150"></div>
- ## Page meta. No page meta for datasets for now.
+ ## Page meta.
+
+ ## No links for datasets right now.
## Tags.
<p>
diff -r da557305232f -r 8570bf26275d templates/display_base.mako
--- a/templates/display_base.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/display_base.mako Thu Feb 04 10:11:50 2010 -0500
@@ -13,13 +13,13 @@
<%namespace file="/display_common.mako" import="*" />
<%def name="title()">
- Galaxy | ${iff( item.published, "Published ", iff( item.importable , "Accessible ", iff( item.users_shared_with, "Shared ", "Private " ) ) ) + get_class_display_name( item.__class__ )} | ${get_item_name( item )}
+ Galaxy | ${iff( item.published, "Published ", iff( item.importable , "Accessible ", iff( item.users_shared_with, "Shared ", "Private " ) ) ) + get_class_display_name( item.__class__ )} | ${get_item_name( item ) | h}
</%def>
<%def name="init()">
<%
self.has_left_panel=False
- self.has_right_panel=item.published
+ self.has_right_panel=True
self.message_box_visible=False
self.active_view="user"
self.overlay_visible=False
@@ -152,7 +152,7 @@
<div style="padding: 10px;">
<h4>Author</h4>
- <p>${item.user.username}</p>
+ <p>${item.user.username | h}</p>
<div><img src="http://www.gravatar.com/avatar/${h.md5(item.user.email)}?s=150"></div>
@@ -162,7 +162,7 @@
<h4>Related ${item_plural}</h4>
<p>
<a href="${href_to_all_items}">All published ${item_plural.lower()}</a><br>
- <a href="${href_to_user_items}">${item_plural} owned by ${item.user.username}</a>
+ <a href="${href_to_user_items}">Published ${item_plural.lower()} by ${item.user.username | h}</a>
## Tags.
<h4>Tags</strong></h4>
diff -r da557305232f -r 8570bf26275d templates/display_common.mako
--- a/templates/display_common.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/display_common.mako Thu Feb 04 10:11:50 2010 -0500
@@ -1,6 +1,8 @@
##
## Utilities for sharing items and displaying shared items.
+## HACK: these should probably go in the web helper object.
##
+
<%! from galaxy import model %>
## Get display name for a class.
diff -r da557305232f -r 8570bf26275d templates/history/display.mako
--- a/templates/history/display.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/history/display.mako Thu Feb 04 10:11:50 2010 -0500
@@ -241,7 +241,7 @@
<%def name="render_item( history, datasets )">
<div id="history-name-area" class="historyLinks" style="color: gray; font-weight: bold; padding: 0px 0px 5px 0px">
- <div id="history-name">${history.get_display_name()}</div>
+ <div id="history-name">${history.get_display_name() | h}</div>
</div>
%if history.deleted:
diff -r da557305232f -r 8570bf26275d templates/root/history.mako
--- a/templates/root/history.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/root/history.mako Thu Feb 04 10:11:50 2010 -0500
@@ -276,7 +276,7 @@
<div id="history-name-area" class="historyLinks" style="color: gray; font-weight: bold;">
<div style="float: right"><a id="history-rename" title="Rename" class="icon-button edit" target="galaxy_main" href="${h.url_for( controller='history', action='rename' )}"></a></div>
- <div id="history-name">${h.escape( history.get_display_name() )}</div>
+ <div id="history-name">${history.get_display_name() | h}</div>
</div>
%if history.deleted:
@@ -311,7 +311,7 @@
<label>Annotation / Notes:</label>
<div style="float: right"><a id="history-annotate" title="Annotate" class="icon-button edit" target="galaxy_main" href="${h.url_for( controller='history', action='annotate_async' )}"></a></div>
%if annotation:
- <div id="history-annotation">${h.escape(annotation)}</div>
+ <div id="history-annotation">${annotation | h}</div>
%else:
<div id="history-annotation"></div>
%endif
diff -r da557305232f -r 8570bf26275d templates/sharing_base.mako
--- a/templates/sharing_base.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/sharing_base.mako Thu Feb 04 10:11:50 2010 -0500
@@ -15,6 +15,40 @@
Sharing and Publishing ${get_class_display_name( item.__class__ )} '${get_item_name( item )}'
</%def>
+<%def name="javascripts()">
+ ${parent.javascripts()}
+ <script type="text/javascript">
+ $(document).ready( function()
+ {
+ //
+ // Set up slug-editing functionality.
+ //
+ var on_start = function( text_elt )
+ {
+ // Because text element is inside a URL, need to disable click so that clicking on element does not trigger URL.
+ $( text_elt ).click( function() {
+ return false;
+ });
+
+ // Allow only lowercase alphanumeric and '-' characters in slug.
+ text_elt.keyup(function(){
+ text_elt.val( $(this).val().replace(/\s+/g,'-').replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase() )
+ });
+ };
+
+ var on_finish = function( text_elt )
+ {
+ // Set URL to new value.
+ var item_url_obj = $('#item-url');
+ item_url_obj.attr( "href", item_url_obj.text() );
+ };
+
+ <% 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);
+ });
+ </script>
+</%def>
+
<%def name="stylesheets()">
${parent.stylesheets()}
<style>
@@ -77,9 +111,14 @@
This ${item_class_name_lc} <strong>${item_status}</strong>.
<div>
<p>Anyone can view and import this ${item_class_name_lc} by visiting the following URL:
- <% url = h.url_for( action='display_by_username_and_slug', username=trans.get_user().username, slug=item.slug, qualified=True ) %>
+
<blockquote>
- <a href="${url}" target="_top">${url}</a>
+ <%
+ url = h.url_for( action='display_by_username_and_slug', username=trans.get_user().username, slug=item.slug, qualified=True )
+ url_parts = url.split("/")
+ %>
+ <a id="item-url" href="${url}" target="_top">${"/".join( url_parts[:-1] )}/<span id='item-identifier'>${url_parts[-1]}</span></a>
+ <a href="#" id="edit-identifier"><img src="${h.url_for('/static/images/pencil.png')}"/></a>
</blockquote>
%if item.published:
diff -r da557305232f -r 8570bf26275d templates/workflow/display.mako
--- a/templates/workflow/display.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/workflow/display.mako Thu Feb 04 10:11:50 2010 -0500
@@ -78,7 +78,7 @@
</%def>
<%def name="render_item( workflow, steps )">
- <h2>${workflow.name}</h2>
+ <h2>${workflow.name | h}</h2>
%for i, step in enumerate( steps ):
%if step.type == 'tool' or step.type is None:
<% tool = app.toolbox.tools_by_id[step.tool_id] %>
diff -r da557305232f -r 8570bf26275d templates/workflow/editor.mako
--- a/templates/workflow/editor.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/workflow/editor.mako Thu Feb 04 10:11:50 2010 -0500
@@ -784,7 +784,7 @@
<div id="workflow-name-area" class="form-row">
<label>Name:</label>
<div style="float: right"><a id="workflow-rename" title="Rename" class="icon-button edit" target="galaxy_main" href="${h.url_for( controller='workflow', action='rename_sync' )}"></a></div>
- <div id="workflow-name">${h.escape( stored.name )}</div>
+ <div id="workflow-name">${stored.name | h}</div>
<div style="clear: both"></div>
</div>
## Workflow tags.
@@ -809,7 +809,7 @@
<div id="workflow-annotation-area" class="form-row">
<label>Annotation / Notes:</label>
<div style="float: right"><a id="workflow-annotate" title="Annotate" class="icon-button edit" target="galaxy_main" href="${h.url_for( controller='workflow', action='annotate_async' )}"></a></div>
- <div id="workflow-annotation">${h.escape( annotation )}</div>
+ <div id="workflow-annotation">${annotation | h}</div>
<div style="clear: both"></div>
<div class="toolParamHelp">Add an annotation or notes to a workflow; annotations are available when a workflow is viewed.</div>
</div>
diff -r da557305232f -r 8570bf26275d templates/workflow/list.mako
--- a/templates/workflow/list.mako Thu Feb 04 09:18:17 2010 -0500
+++ b/templates/workflow/list.mako Thu Feb 04 10:11:50 2010 -0500
@@ -38,7 +38,7 @@
<tr>
<td>
<div class="menubutton" style="float: left;" id="wf-${i}-popup">
- ${workflow.name}
+ ${workflow.name | h}
</div>
</td>
<td>${len(workflow.latest_workflow.steps)}</td>
@@ -76,7 +76,7 @@
<% workflow = association.stored_workflow %>
<tr>
<td>
- <a class="menubutton" id="shared-${i}-popup" href="${h.url_for( action='run', id=trans.security.encode_id(workflow.id) )}">${workflow.name}</a>
+ <a class="menubutton" id="shared-${i}-popup" href="${h.url_for( action='run', id=trans.security.encode_id(workflow.id) )}">${workflow.name | h}</a>
</td>
<td>${workflow.user.email}</td>
<td>${len(workflow.latest_workflow.steps)}</td>
More information about the galaxy-dev
mailing list