Merge pull request #4157 from guerler/grid_pages

Remove saved pages grid mako
This commit is contained in:
Dannon Baker
2017-06-08 08:07:44 -04:00
committed by GitHub
20 changed files with 117 additions and 103 deletions
+7 -2
View File
@@ -9,7 +9,8 @@ var jQuery = require( 'jquery' ),
UserPreferences = require( 'mvc/user/user-preferences' ),
CustomBuilds = require( 'mvc/user/user-custom-builds' ),
Tours = require( 'mvc/tours' ),
GridView = require( 'mvc/grid/grid-view' )
GridView = require( 'mvc/grid/grid-view' ),
PageList = require( 'mvc/page/page-list' ),
Workflows = require( 'mvc/workflow/workflow' ),
WorkflowsConfigureMenu = require( 'mvc/workflow/workflow-configure-menu' );
@@ -118,7 +119,11 @@ window.app = function app( options, bootstrapped ){
},
show_pages : function( action_id ) {
this.page.display( new GridView( { url_base: Galaxy.root + 'page/list_published', dict_format: true } ) );
if ( action_id == 'list' ) {
this.page.display( new PageList.View() );
} else {
this.page.display( new GridView( { url_base: Galaxy.root + 'page/list_published', dict_format: true } ) );
}
},
show_workflows : function(){
+1 -1
View File
@@ -275,7 +275,7 @@ var Collection = Backbone.Collection.extend({
target : 'galaxy_main'
},{
title : _l('Saved Pages'),
url : 'page/list',
url : 'pages/list',
target : '_top'
}]
};
+1 -1
View File
@@ -656,7 +656,7 @@ return Backbone.View.extend({
var insert = self.grid.get('insert');
// request new configuration
var json = self.dict_format ? response_text.embedded_grid || response_text : $.parseJSON(response_text);
var json = self.dict_format ? response_text : $.parseJSON(response_text);
// update
json.embedded = embedded;
@@ -0,0 +1,56 @@
/** This class renders the page list. */
define( [ 'utils/utils', 'mvc/grid/grid-view' ], function( Utils, GridView ) {
var View = Backbone.View.extend({
initialize: function( options ) {
var self = this;
this.setElement( $( '<div/>' ) );
this.model = new Backbone.Model();
Utils.get({
url : Galaxy.root + 'page/list',
success : function( response ) {
response[ 'dict_format' ] = true;
self.model.set( response );
self.render();
}
});
},
render: function() {
var grid = new GridView( this.model.attributes );
this.$el.empty().append( grid.$el );
this.$el.append( this._templateShared() );
},
_templateShared: function() {
var $tmpl = $( '<div>' +
'<h2>Pages shared with you by others</h2>' +
'</div>' );
var options = this.model.attributes;
if ( options.shared_by_others && options.shared_by_others.length > 0 ) {
var $table = $( '<table class="colored" border="0" cellspacing="0" cellpadding="0" width="100%">' +
'<tr class="header">' +
'<th>Title</th>' +
'<th>Owner</th>' +
'</tr>' +
'</table>' );
_.each( options.shared_by_others, function( page, index ) {
var display_url = Galaxy.root + 'page/display_by_username_and_slug?username=' + page.username + '&slug=' + page.slug;
$table.append( '<tr>' +
'<td>' +
'<a href="' + display_url + '">' + _.escape( page.title ) + '</a>' +
'</td>' +
'<td>' + _.escape( page.username ) + '</td>' +
'</tr>' );
});
$tmpl.append( $table );
} else {
$tmpl.append( 'No pages have been shared with you.' );
}
return $tmpl;
}
});
return {
View: View
}
});
+15 -13
View File
@@ -46,13 +46,13 @@ class PageListGrid( grids.Grid ):
key="free-text-search", visible=False, filterable="standard" )
)
global_actions = [
grids.GridAction( "Add new page", dict( action='create' ) )
grids.GridAction( "Add new page", dict( action='create' ), target="inbound" )
]
operations = [
grids.DisplayByUsernameAndSlugGridOperation( "View", allow_multiple=False ),
grids.GridOperation( "Edit content", allow_multiple=False, url_args=dict( action='edit_content') ),
grids.GridOperation( "Edit attributes", allow_multiple=False, url_args=dict( action='edit') ),
grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Edit content", allow_multiple=False, url_args=dict( action='edit_content' ) ),
grids.GridOperation( "Edit attributes", allow_multiple=False, url_args=dict( action='edit' ) ),
grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), url_args=dict( action='sharing' ) ),
grids.GridOperation( "Delete", confirm="Are you sure you want to delete this page?" ),
]
@@ -308,6 +308,7 @@ class PageController( BaseUIController, SharableMixin,
self.hda_manager = managers.hdas.HDAManager( app )
@web.expose
@web.json
@web.require_login()
def list( self, trans, *args, **kwargs ):
""" List user's pages. """
@@ -320,13 +321,10 @@ class PageController( BaseUIController, SharableMixin,
item = session.query( model.Page ).get( self.decode_id( id ) )
if operation == "delete":
item.deleted = True
if operation == "share or publish":
return self.sharing( trans, **kwargs )
session.flush()
# HACK: to prevent the insertion of an entire html document inside another
kwargs[ 'embedded' ] = True
# Build grid HTML.
# Build grid dictionary.
kwargs[ 'dict_format' ] = True
grid = self._page_list( trans, *args, **kwargs )
# Build list of pages shared with user.
@@ -339,7 +337,11 @@ class PageController( BaseUIController, SharableMixin,
.all()
# Render grid wrapped in panels
return trans.fill_template( "page/index.mako", embedded_grid=grid, shared_by_others=shared_by_others )
grid[ 'shared_by_others' ] = [ {
'username' : p.page.user.username,
'slug' : p.page.slug,
'title' : p.page.title } for p in shared_by_others ]
return grid
@web.expose
@web.json
@@ -384,7 +386,7 @@ class PageController( BaseUIController, SharableMixin,
session.flush()
# Display the management page
# trans.set_message( "Page '%s' created" % page.title )
return trans.response.send_redirect( web.url_for(controller='page', action='list' ) )
return trans.response.send_redirect( web.url_for(controller='pages', action='list' ) )
return trans.show_form(
web.FormBuilder( web.url_for(controller='page', action='create'), "Create new page", submit_text="Submit" )
.add_text( "page_title", "Page title", value=page_title, error=page_title_err )
@@ -429,7 +431,7 @@ class PageController( BaseUIController, SharableMixin,
self.add_item_annotation( trans.sa_session, trans.get_user(), page, page_annotation )
session.flush()
# Redirect to page list.
return trans.response.send_redirect( web.url_for(controller='page', action='list' ) )
return trans.response.send_redirect( web.url_for(controller='pages', action='list' ) )
else:
page_title = page.title
page_slug = page.slug
@@ -494,7 +496,7 @@ class PageController( BaseUIController, SharableMixin,
session.flush()
return trans.fill_template( "/sharing_base.mako",
item=page, use_panels=True )
item=page, controller_list='pages', use_panels=True )
@web.expose
@web.require_login( "use Galaxy pages" )
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"page-list.js","sources":["../../../src/mvc/page/page-list.js"],"names":["define","Utils","GridView","View","Backbone","extend","initialize","self","this","setElement","$","model","Model","get","url","Galaxy","root","success","response","set","render","grid","attributes","$el","empty","append","_templateShared","$tmpl","options","shared_by_others","length","$table","_","each","page","display_url","username","slug","escape","title"],"mappings":"AACAA,QAAU,cAAe,sBAAwB,SAAUC,EAAOC,GAC9D,GAAIC,GAAOC,SAASD,KAAKE,QACrBC,WAAY,WACR,GAAIC,GAAOC,IACXA,MAAKC,WAAYC,EAAG,WACpBF,KAAKG,MAAQ,GAAIP,UAASQ,MAC1BX,EAAMY,KACFC,IAAUC,OAAOC,KAAO,YACxBC,QAAU,SAAUC,GAChBA,EAAwB,aAAI,EAC5BX,EAAKI,MAAMQ,IAAKD,GAChBX,EAAKa,aAKjBA,OAAQ,WACJ,GAAIC,GAAO,GAAInB,GAAUM,KAAKG,MAAMW,WACpCd,MAAKe,IAAIC,QAAQC,OAAQJ,EAAKE,KAC9Bf,KAAKe,IAAIE,OAAQjB,KAAKkB,oBAG1BA,gBAAiB,WACb,GAAIC,GAAQjB,EAAI,uDAGZkB,EAAUpB,KAAKG,MAAMW,UACzB,IAAKM,EAAQC,kBAAoBD,EAAQC,iBAAiBC,OAAS,EAAI,CACnE,GAAIC,GAASrB,EAAG,8IAMhBsB,GAAEC,KAAML,EAAQC,iBAAkB,SAAUK,GACxC,GAAIC,GAAcpB,OAAOC,KAAO,8CAAgDkB,EAAKE,SAAW,SAAWF,EAAKG,IAChHN,GAAON,OAAS,oBAEsBU,EAAc,KAAOH,EAAEM,OAAQJ,EAAKK,OAAU,gBAEvDP,EAAEM,OAAQJ,EAAKE,UAAa,gBAG7DT,EAAMF,OAAQM,OAEdJ,GAAMF,OAAQ,sCAElB,OAAOE,KAIf,QACIxB,KAAMA"}
+1 -1
View File
@@ -1,2 +1,2 @@
webpackJsonp([4],{0:function(e,t,i){(function(e){var t=i(1),s=t,a=i(30).GalaxyApp,l=i(92),n=i(31);window.app=function(t,i){window.Galaxy=new a(t,i),Galaxy.debug("admin app"),Galaxy.params=Galaxy.config.params,s(function(){e.extend(t.config,{active_view:"admin"}),Galaxy.page=new n.View(e.extend(t,{Left:l}))})}}).call(t,i(2))},92:function(e,t,i){(function(t,s,a){var l=i(5),n=t.View.extend({initialize:function(e,i){var s=this;this.page=e,this.root=i.root,this.config=i.config,this.settings=i.settings,this.message=i.message,this.status=i.status,this.model=new t.Model({title:l("Administration")}),this.categories=new t.Collection([{title:"Server",items:[{title:"Data types registry",url:"admin/view_datatypes_registry"},{title:"Data tables registry",url:"admin/view_tool_data_tables"},{title:"Display applications",url:"admin/display_applications"},{title:"Manage jobs",url:"admin/jobs"}]},{title:"Tools and Tool Shed",items:[{title:"Search Tool Shed",url:"admin_toolshed/browse_tool_sheds",enabled:s.settings.is_tool_shed_installed},{title:"Search Tool Shed (Beta)",url:"admin_toolshed/browse_toolsheds",enabled:s.settings.is_tool_shed_installed&&s.config.enable_beta_ts_api_install},{title:"Monitor installing repositories",url:"admin_toolshed/monitor_repository_installation?installing_repository_ids="+s.settings.installing_repository_ids,enabled:s.settings.installing_repository_ids},{title:"Manage installed tools",url:"admin_toolshed/browse_repositories",enabled:s.settings.is_repo_installed},{title:"Reset metadata",url:"admin_toolshed/reset_metadata_on_selected_installed_repositories",enabled:s.settings.is_repo_installed},{title:"Download local tool",url:"admin/package_tool"},{title:"Tool lineage",url:"admin/tool_versions"},{title:"Reload a tool's configuration",url:"admin/reload_tool"},{title:"Review tool migration stages",url:"admin/review_tool_migration_stages"},{title:"View Tool Error Logs",url:"admin/tool_errors"},{title:"Manage Display Whitelist",url:"admin/sanitize_whitelist"},{title:"Manage Tool Dependencies",url:"admin/manage_tool_dependencies"}]},{title:"User Management",items:[{title:"Users",url:"admin/users"},{title:"Groups",url:"admin/groups"},{title:"Roles",url:"admin/roles"},{title:"API keys",url:"userskeys/all_users"},{title:"Impersonate a user",url:"admin/impersonate",enabled:s.config.allow_user_impersonation}]},{title:"Data",items:[{title:"Quotas",url:"admin/quotas",enabled:s.config.enable_quotas},{title:"Data libraries",url:"library_admin/browse_libraries"},{title:"Roles",url:"admin/roles"},{title:"Local data",url:"data_manager"}]},{title:"Form Definitions",items:[{title:"Form definitions",url:"forms/browse_form_definitions"}]},{title:"Sample Tracking",items:[{title:"Sequencers and external services",url:"external_service/browse_external_services"},{title:"Request types",url:"request_type/browse_request_types"},{title:"Sequencing requests",url:"requests_admin/browse_requests"},{title:"Find samples",url:"requests_common/find_samples?cntrller=requests_admin"}]}]),this.setElement(this._template())},render:function(){var e=this;this.$el.empty(),this.categories.each(function(t){var i=s(e._templateSection(t.attributes)),n=i.find(".ui-side-section-body");a.each(t.get("items"),function(t){(void 0===t.enabled||t.enabled)&&n.append(s("<div/>").addClass("ui-side-section-body-title").append(s("<a/>").attr({href:e.root+t.url,target:"galaxy_main"}).text(l(t.title))))}),e.$el.append(i)}),this.page.$("#galaxy_main").prop("src",this.root+"admin/center?message="+this.message+"&status="+this.status)},_templateSection:function(e){return["<div>",'<div class="ui-side-section-title">'+l(e.title)+"</div>",'<div class="ui-side-section-body"/>',"</div>"].join("")},_template:function(){return'<div class="ui-side-panel"/>'},toString:function(){return"adminPanel"}});e.exports=n}).call(t,i(3),i(1),i(2))}});
webpackJsonp([4],{0:function(e,t,i){(function(e){var t=i(1),s=t,a=i(30).GalaxyApp,l=i(93),n=i(31);window.app=function(t,i){window.Galaxy=new a(t,i),Galaxy.debug("admin app"),Galaxy.params=Galaxy.config.params,s(function(){e.extend(t.config,{active_view:"admin"}),Galaxy.page=new n.View(e.extend(t,{Left:l}))})}}).call(t,i(2))},93:function(e,t,i){(function(t,s,a){var l=i(5),n=t.View.extend({initialize:function(e,i){var s=this;this.page=e,this.root=i.root,this.config=i.config,this.settings=i.settings,this.message=i.message,this.status=i.status,this.model=new t.Model({title:l("Administration")}),this.categories=new t.Collection([{title:"Server",items:[{title:"Data types registry",url:"admin/view_datatypes_registry"},{title:"Data tables registry",url:"admin/view_tool_data_tables"},{title:"Display applications",url:"admin/display_applications"},{title:"Manage jobs",url:"admin/jobs"}]},{title:"Tools and Tool Shed",items:[{title:"Search Tool Shed",url:"admin_toolshed/browse_tool_sheds",enabled:s.settings.is_tool_shed_installed},{title:"Search Tool Shed (Beta)",url:"admin_toolshed/browse_toolsheds",enabled:s.settings.is_tool_shed_installed&&s.config.enable_beta_ts_api_install},{title:"Monitor installing repositories",url:"admin_toolshed/monitor_repository_installation?installing_repository_ids="+s.settings.installing_repository_ids,enabled:s.settings.installing_repository_ids},{title:"Manage installed tools",url:"admin_toolshed/browse_repositories",enabled:s.settings.is_repo_installed},{title:"Reset metadata",url:"admin_toolshed/reset_metadata_on_selected_installed_repositories",enabled:s.settings.is_repo_installed},{title:"Download local tool",url:"admin/package_tool"},{title:"Tool lineage",url:"admin/tool_versions"},{title:"Reload a tool's configuration",url:"admin/reload_tool"},{title:"Review tool migration stages",url:"admin/review_tool_migration_stages"},{title:"View Tool Error Logs",url:"admin/tool_errors"},{title:"Manage Display Whitelist",url:"admin/sanitize_whitelist"},{title:"Manage Tool Dependencies",url:"admin/manage_tool_dependencies"}]},{title:"User Management",items:[{title:"Users",url:"admin/users"},{title:"Groups",url:"admin/groups"},{title:"Roles",url:"admin/roles"},{title:"API keys",url:"userskeys/all_users"},{title:"Impersonate a user",url:"admin/impersonate",enabled:s.config.allow_user_impersonation}]},{title:"Data",items:[{title:"Quotas",url:"admin/quotas",enabled:s.config.enable_quotas},{title:"Data libraries",url:"library_admin/browse_libraries"},{title:"Roles",url:"admin/roles"},{title:"Local data",url:"data_manager"}]},{title:"Form Definitions",items:[{title:"Form definitions",url:"forms/browse_form_definitions"}]},{title:"Sample Tracking",items:[{title:"Sequencers and external services",url:"external_service/browse_external_services"},{title:"Request types",url:"request_type/browse_request_types"},{title:"Sequencing requests",url:"requests_admin/browse_requests"},{title:"Find samples",url:"requests_common/find_samples?cntrller=requests_admin"}]}]),this.setElement(this._template())},render:function(){var e=this;this.$el.empty(),this.categories.each(function(t){var i=s(e._templateSection(t.attributes)),n=i.find(".ui-side-section-body");a.each(t.get("items"),function(t){(void 0===t.enabled||t.enabled)&&n.append(s("<div/>").addClass("ui-side-section-body-title").append(s("<a/>").attr({href:e.root+t.url,target:"galaxy_main"}).text(l(t.title))))}),e.$el.append(i)}),this.page.$("#galaxy_main").prop("src",this.root+"admin/center?message="+this.message+"&status="+this.status)},_templateSection:function(e){return["<div>",'<div class="ui-side-section-title">'+l(e.title)+"</div>",'<div class="ui-side-section-body"/>',"</div>"].join("")},_template:function(){return'<div class="ui-side-panel"/>'},toString:function(){return"adminPanel"}});e.exports=n}).call(t,i(3),i(1),i(2))}});
//# sourceMappingURL=admin.bundled.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
define(["utils/utils","mvc/grid/grid-view"],function(a,b){var c=Backbone.View.extend({initialize:function(){var b=this;this.setElement($("<div/>")),this.model=new Backbone.Model,a.get({url:Galaxy.root+"page/list",success:function(a){a.dict_format=!0,b.model.set(a),b.render()}})},render:function(){var a=new b(this.model.attributes);this.$el.empty().append(a.$el),this.$el.append(this._templateShared())},_templateShared:function(){var a=$("<div><h2>Pages shared with you by others</h2></div>"),b=this.model.attributes;if(b.shared_by_others&&b.shared_by_others.length>0){var c=$('<table class="colored" border="0" cellspacing="0" cellpadding="0" width="100%"><tr class="header"><th>Title</th><th>Owner</th></tr></table>');_.each(b.shared_by_others,function(a){var b=Galaxy.root+"page/display_by_username_and_slug?username="+a.username+"&slug="+a.slug;c.append('<tr><td><a href="'+b+'">'+_.escape(a.title)+"</a></td><td>"+_.escape(a.username)+"</td></tr>")}),a.append(c)}else a.append("No pages have been shared with you.");return a}});return{View:c}});
//# sourceMappingURL=../../../maps/mvc/page/page-list.js.map
+7 -6
View File
@@ -73,6 +73,7 @@
## Set use_panels var for use in page's URLs.
<% use_panels = context.get('use_panels', False) %>
<% controller_name = get_controller_name( item ) %>
<% controller_list = context.get('controller_list', controller_name) %>
## Render message.
%if message:
@@ -142,7 +143,7 @@
</blockquote>
%if item.published:
This ${item_class_name_lc} is publicly listed and searchable in Galaxy's <a href='${h.url_for( controller=controller_name, action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section.
This ${item_class_name_lc} is publicly listed and searchable in Galaxy's <a href='${h.url_for( controller=controller_list, action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section.
%endif
</div>
@@ -155,16 +156,16 @@
<div class="toolParamHelp">Disables ${item_class_name_lc}'s link so that it is not accessible.</div>
<br />
<input class="action-button" type="submit" name="publish" value="Publish ${item_class_name}" method="POST">
<div class="toolParamHelp">Publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for( controller=controller_name, action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
<div class="toolParamHelp">Publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for( controller=controller_list, action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
<br />
%else: ## item.published == True
## Item is importable and published. User can unpublish or disable import and unpublish.
<input class="action-button" type="submit" name="unpublish" value="Unpublish ${item_class_name}">
<div class="toolParamHelp">Removes this ${item_class_name_lc} from Galaxy's <a href='${h.url_for(controller=controller_name, action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
<div class="toolParamHelp">Removes this ${item_class_name_lc} from Galaxy's <a href='${h.url_for(controller=controller_list, action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
<br />
<input class="action-button" type="submit" name="disable_link_access_and_unpublish" value="Disable Access to ${item_class_name} via Link and Unpublish">
<div class="toolParamHelp">Disables this ${item_class_name_lc}'s link so that it is not accessible and removes ${item_class_name_lc} from Galaxy's <a href='${h.url_for(controller=controller_name, action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
<div class="toolParamHelp">Disables this ${item_class_name_lc}'s link so that it is not accessible and removes ${item_class_name_lc} from Galaxy's <a href='${h.url_for(controller=controller_list, action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
%endif
</form>
</div>
@@ -179,7 +180,7 @@
<br />
<input class="action-button" type="submit" name="make_accessible_and_publish" value="Make ${item_class_name} Accessible and Publish" method="POST">
<div class="toolParamHelp">Makes the ${item_class_name_lc} accessible via link (see above) and publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for(controller=controller_name, action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
<div class="toolParamHelp">Makes the ${item_class_name_lc} accessible via link (see above) and publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for(controller=controller_list, action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
</form>
%endif
@@ -239,5 +240,5 @@
%endif
<br /><br />
<a href="${h.url_for(controller=controller_name, action="list" )}">Back to ${item_class_plural_name} List</a>
<a href="${h.url_for(controller=controller_list, action="list" )}">Back to ${item_class_plural_name} List</a>
</%def>
+1 -1
View File
@@ -14,7 +14,7 @@
<script type="text/javascript">
// Define variables needed by galaxy.pages script.
var page_id = "${trans.security.encode_id(page.id)}",
page_list_url = '${h.url_for( controller='page', action='list' )}',
page_list_url = '${h.url_for( controller='pages', action='list' )}',
list_objects_url = "${h.url_for(controller='page', action='LIST_ACTION' )}",
set_accessible_url = "${h.url_for( controller='ITEM_CONTROLLER', action='set_accessible_async' )}",
get_name_and_link_url = "${h.url_for( controller='ITEM_CONTROLLER', action='get_name_and_link_async' )}?id=",
-53
View File
@@ -1,53 +0,0 @@
<%inherit file="/webapps/galaxy/base_panels.mako"/>
<%def name="init()">
<%
self.has_left_panel=False
self.has_right_panel=False
self.active_view="shared"
self.message_box_visible=False
%>
</%def>
<%def name="center_panel()">
<div style="overflow: auto; height: 100%;">
<div class="page-container" style="padding: 10px;">
<!-- embedded grid -->
${h.to_unicode( embedded_grid )}
<br><br>
<h2>Pages shared with you by others</h2>
%if shared_by_others:
<table class="colored" border="0" cellspacing="0" cellpadding="0" width="100%">
<tr class="header">
<th>Title</th>
<th>Owner</th>
<th></th>
</tr>
%for i, association in enumerate( shared_by_others ):
<% page = association.page %>
<tr>
<td>
<a class="menubutton" id="shared-${i}-popup" href="${h.url_for(controller='page', action='display_by_username_and_slug', username=page.user.username, slug=page.slug)}">${page.title | h}</a>
</td>
<td>${page.user.username}</td>
<td>
<div popupmenu="shared-${i}-popup">
<a class="action-button" href="${h.url_for(controller='page', action='display_by_username_and_slug', username=page.user.username, slug=page.slug)}" target="_top">View</a>
</div>
</td>
</tr>
%endfor
</table>
%else:
No pages have been shared with you.
%endif
</div>
</div>
</%def>