mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-21 13:50:20 +08:00
250 lines
8.3 KiB
Mako
250 lines
8.3 KiB
Mako
<%!
|
|
from galaxy.web.framework.helpers.grids import TextColumn
|
|
|
|
def inherit(context):
|
|
kwargs = context.get( 'kwargs', {} )
|
|
if kwargs.get( 'embedded', False ):
|
|
# No inheritance - using only embeddable content (self.body)
|
|
return None
|
|
if context.get('use_panels'):
|
|
if context.get('webapp'):
|
|
app_name = context.get('webapp')
|
|
elif context.get('app'):
|
|
app_name = context.get('app').name
|
|
else:
|
|
app_name = 'galaxy'
|
|
return '/webapps/%s/base_panels.mako' % app_name
|
|
else:
|
|
return '/base.mako'
|
|
%>
|
|
<%inherit file="${inherit(context)}"/>
|
|
<%namespace file="/display_common.mako" import="get_class_plural" />
|
|
|
|
##
|
|
## Override methods from base.mako and base_panels.mako
|
|
##
|
|
|
|
<%def name="init( embedded=False, insert=None )">
|
|
<%
|
|
self.has_left_panel = False
|
|
self.has_right_panel = False
|
|
self.message_box_visible = False
|
|
self.overlay_visible = False
|
|
self.active_view = 'user'
|
|
%>
|
|
</%def>
|
|
|
|
## render title
|
|
<%def name="title()">${grid.title}</%def>
|
|
|
|
## render in center panel
|
|
<%def name="center_panel()">
|
|
${self.load()}
|
|
</%def>
|
|
|
|
## render in body
|
|
<%def name="body()">
|
|
${self.load()}
|
|
</%def>
|
|
|
|
## creates grid
|
|
<%def name="load( embedded=False, insert=None )">
|
|
<!-- grid_base.mako -->
|
|
## imports
|
|
${h.css(
|
|
"autocomplete_tagging",
|
|
"jquery.rating"
|
|
)}
|
|
${h.js(
|
|
"libs/jquery/jquery.autocomplete",
|
|
)}
|
|
|
|
## grid container
|
|
<div id="grid-container"></div>
|
|
|
|
## load javascript
|
|
<script type="text/javascript">
|
|
require(['mvc/grid/grid-view'], function(GridView) {
|
|
$(function() {
|
|
var gridView = new GridView( ${ h.dumps( self.get_grid_config( embedded=embedded, insert=insert ) ) } );
|
|
});
|
|
});
|
|
</script>
|
|
</%def>
|
|
|
|
<%def name="get_grid_config( embedded=False, insert=None )">
|
|
## generates dictionary
|
|
<%
|
|
item_class = grid.model_class.__name__
|
|
self.grid_config = {
|
|
'title' : grid.title,
|
|
'url_base' : trans.request.path_url,
|
|
'async' : grid.use_async,
|
|
'async_ops' : [],
|
|
'categorical_filters' : {},
|
|
'filters' : cur_filter_dict,
|
|
'sort_key' : sort_key,
|
|
'show_item_checkboxes' : context.get('show_item_checkboxes', False),
|
|
'cur_page_num' : cur_page_num,
|
|
'num_pages' : num_pages,
|
|
'num_page_links' : num_page_links,
|
|
'status' : status,
|
|
'message' : util.restore_text(message),
|
|
'global_actions' : [],
|
|
'operations' : [],
|
|
'items' : [],
|
|
'columns' : [],
|
|
'model_class' : str( grid.model_class ),
|
|
'use_paging' : grid.use_paging,
|
|
'legend' : grid.legend,
|
|
'current_item_id' : False,
|
|
'use_panels' : context.get('use_panels'),
|
|
'use_hide_message' : grid.use_hide_message,
|
|
'insert' : insert,
|
|
'default_filter_dict' : default_filter_dict,
|
|
'advanced_search' : advanced_search,
|
|
'refresh_frames' : [],
|
|
'embedded' : embedded,
|
|
'info_text' : grid.info_text,
|
|
'url' : url(dict())
|
|
}
|
|
|
|
## add refresh frames
|
|
if refresh_frames:
|
|
self.grid_config['refresh_frames'] = refresh_frames
|
|
|
|
## add current item if exists
|
|
if current_item:
|
|
self.grid_config['current_item_id'] = current_item.id
|
|
endif
|
|
|
|
## column
|
|
for column in grid.columns:
|
|
|
|
## add column sort links
|
|
href = None
|
|
extra = ''
|
|
if column.sortable:
|
|
if sort_key.endswith(column.key):
|
|
if not sort_key.startswith("-"):
|
|
href = url( sort=( "-" + column.key ) )
|
|
extra = "↓"
|
|
else:
|
|
href = url( sort=( column.key ) )
|
|
extra = "↑"
|
|
else:
|
|
href = url( sort=column.key )
|
|
|
|
## add to configuration
|
|
self.grid_config['columns'].append({
|
|
'key' : column.key,
|
|
'visible' : column.visible,
|
|
'nowrap' : column.nowrap,
|
|
'attach_popup' : column.attach_popup,
|
|
'label_id_prefix' : column.label_id_prefix,
|
|
'sortable' : column.sortable,
|
|
'label' : column.label,
|
|
'filterable' : column.filterable,
|
|
'target' : column.target,
|
|
'is_text' : isinstance(column, TextColumn),
|
|
'href' : href,
|
|
'extra' : extra
|
|
})
|
|
endfor
|
|
|
|
## operations
|
|
for operation in grid.operations:
|
|
self.grid_config['operations'].append({
|
|
'allow_multiple' : operation.allow_multiple,
|
|
'allow_popup' : operation.allow_popup,
|
|
'target' : operation.target,
|
|
'label' : operation.label,
|
|
'confirm' : operation.confirm,
|
|
'global_operation' : False
|
|
})
|
|
if operation.allow_multiple:
|
|
self.grid_config['show_item_checkboxes'] = True
|
|
|
|
if operation.global_operation:
|
|
self.grid_config['global_operation'] = url( ** (operation.global_operation()) )
|
|
endfor
|
|
|
|
## global actions
|
|
for action in grid.global_actions:
|
|
self.grid_config['global_actions'].append({
|
|
'url_args' : url(**action.url_args),
|
|
'label' : action.label,
|
|
'target' : action.target
|
|
})
|
|
endfor
|
|
|
|
## Operations that are async (AJAX) compatible.
|
|
for operation in [op for op in grid.operations if op.async_compatible]:
|
|
self.grid_config['async_ops'].append(operation.label.lower());
|
|
endfor
|
|
|
|
## Filter values for categorical filters.
|
|
for column in grid.columns:
|
|
if column.filterable is not None and not isinstance( column, TextColumn ):
|
|
self.grid_config['categorical_filters'][column.key] = dict([ (filter.label, filter.args) for filter in column.get_accepted_filters() ])
|
|
endif
|
|
endfor
|
|
|
|
# items
|
|
for i, item in enumerate( query ):
|
|
item_dict = {
|
|
'id' : item.id,
|
|
'encode_id' : trans.security.encode_id(item.id),
|
|
'link' : [],
|
|
'operation_config' : {},
|
|
'column_config' : {}
|
|
}
|
|
|
|
## data columns
|
|
for column in grid.columns:
|
|
if column.visible:
|
|
## get link
|
|
link = column.get_link(trans, grid, item)
|
|
if link:
|
|
link = url(**link)
|
|
else:
|
|
link = None
|
|
endif
|
|
|
|
## target
|
|
target = column.target
|
|
|
|
## get value
|
|
value = column.get_value( trans, grid, item )
|
|
|
|
# Handle non-ascii chars.
|
|
if isinstance(value, str):
|
|
value = unicode(value, 'utf-8')
|
|
value = value.replace('/', '//')
|
|
endif
|
|
|
|
## Item dictionary
|
|
item_dict['column_config'][column.label] = {
|
|
'link' : link,
|
|
'value' : value,
|
|
'target' : target
|
|
}
|
|
endif
|
|
endfor
|
|
## add operation details to item
|
|
for operation in grid.operations:
|
|
item_dict['operation_config'][operation.label] = {
|
|
'allowed' : operation.allowed(item),
|
|
'url_args' : url( **operation.get_url_args( item ) )
|
|
}
|
|
endfor
|
|
|
|
## add item to list
|
|
self.grid_config['items'].append(item_dict)
|
|
endfor
|
|
|
|
return self.grid_config
|
|
%>
|
|
</%def>
|
|
|