Add support for "new-style grids" and "model master views".

Finally, an API that makes some sense...  We don't yet have feature parity
with the old-style grids and CRUD views, but this is already a significant
improvement to the design.  Still needs a lot of docs though...
This commit is contained in:
Lance Edgar 2015-07-29 11:09:38 -05:00
parent 62b7194c21
commit 585eb09bec
26 changed files with 2296 additions and 94 deletions

View file

@ -131,6 +131,7 @@
${h.javascript_link('https://code.jquery.com/ui/1.11.4/jquery-ui.min.js')}
${h.javascript_link(request.static_url('tailbone:static/js/lib/jquery.ui.menubar.js'))}
${h.javascript_link(request.static_url('tailbone:static/js/lib/jquery.loadmask.min.js'))}
${h.javascript_link(request.static_url('tailbone:static/js/jquery.ui.tailbone.js'))}
${h.javascript_link(request.static_url('tailbone:static/js/tailbone.js'))}
</%def>
@ -145,6 +146,7 @@
${h.stylesheet_link(request.static_url('tailbone:static/css/grids.css'))}
${h.stylesheet_link(request.static_url('tailbone:static/css/filters.css'))}
${h.stylesheet_link(request.static_url('tailbone:static/css/forms.css'))}
${h.stylesheet_link(request.static_url('tailbone:static/css/newgrids.css'))}
</%def>
<%def name="head_tags()"></%def>

View file

@ -0,0 +1,16 @@
## -*- coding: utf-8 -*-
<%inherit file="/base.mako" />
<%def name="title()">New ${model_title}</%def>
<%def name="context_menu_items()">
<li>${h.link_to("Back to {0}".format(model_title_plural), index_url)}</li>
</%def>
<ul id="context-menu">
${self.context_menu_items()}
</ul>
<div class="form-wrapper">
${form.render()|n}
</div><!-- form-wrapper -->

View file

@ -0,0 +1,19 @@
## -*- coding: utf-8 -*-
<%inherit file="/base.mako" />
<%def name="title()">${model_title}: ${unicode(instance)}</%def>
<%def name="context_menu_items()">
<li>${h.link_to("Back to {0}".format(model_title_plural), url(route_prefix))}</li>
% if request.has_perm('{0}.view'.format(permission_prefix)):
<li>${h.link_to("View this {0}".format(model_title), action_url('view', instance))}</li>
% endif
</%def>
<ul id="context-menu">
${self.context_menu_items()}
</ul>
<div class="form-wrapper">
${form.render()|n}
</div><!-- form-wrapper -->

View file

@ -0,0 +1,22 @@
## -*- coding: utf-8 -*-
## ##############################################################################
##
## Default master 'index' template. Features a prominent data table and
## exposes a way to filter and sort the data, etc.
##
## ##############################################################################
<%inherit file="/base.mako" />
<%def name="title()">${grid.model_title_plural}</%def>
<%def name="context_menu_items()">
% if request.has_perm('{0}.create'.format(grid.permission_prefix)):
<li>${h.link_to("Create a new {0}".format(grid.model_title), url('{0}.create'.format(grid.route_prefix)))}</li>
% endif
</%def>
<ul id="context-menu">
${self.context_menu_items()}
</ul>
${grid.render_complete()|n}

View file

@ -0,0 +1,19 @@
## -*- coding: utf-8 -*-
<%inherit file="/base.mako" />
<%def name="title()">${model_title}: ${unicode(instance)}</%def>
<%def name="context_menu_items()">
<li>${h.link_to("Back to {0}".format(model_title_plural), url(route_prefix))}</li>
% if request.has_perm('{0}.edit'.format(permission_prefix)):
<li>${h.link_to("Edit this {0}".format(model_title), action_url('edit', instance))}</li>
% endif
</%def>
<ul id="context-menu">
${self.context_menu_items()}
</ul>
<div class="form-wrapper">
${form.render()|n}
</div><!-- form-wrapper -->

View file

@ -0,0 +1,7 @@
## -*- coding: utf-8 -*-
<div class="newgrid-wrapper">
% if grid.filterable:
${grid.render_filters()|n}
% endif
${grid.render_grid()|n}
</div><!-- newgrid-wrapper -->

View file

@ -0,0 +1,31 @@
## -*- coding: utf-8 -*-
<div class="newfilters">
${form.begin(method='get')}
<fieldset>
<legend>Filters</legend>
% for filtr in form.iter_filters():
<div class="filter" id="filter-${filtr.key}" data-key="${filtr.key}"${' style="display: none;"' if not filtr.active else ''|n}>
${form.checkbox('{0}-active'.format(filtr.key), class_='active', id='filter-active-{0}'.format(filtr.key), checked=filtr.active)}
<label for="filter-active-${filtr.key}">${filtr.label}</label>
<div class="inputs">
${form.filter_verb(filtr)}
${form.filter_value(filtr)}
</div>
</div>
% endfor
</fieldset>
<div class="buttons">
${form.tag('button', type='submit', id='apply-filters', c="Apply Filters")}
<select id="add-filter">
<option value="">Add a Filter</option>
% for filtr in form.iter_filters():
<option value="${filtr.key}"${' disabled="disabled"' if filtr.active else ''|n}>${filtr.label}</option>
% endfor
</select>
</div>
${form.end()}
</div><!-- newfilters -->

View file

@ -0,0 +1,50 @@
## -*- coding: utf-8 -*-
<div ${format_attrs(**grid.get_div_attrs())}>
<table>
<thead>
<tr>
## % if grid.checkboxes:
## <th class="checkbox">${h.checkbox('check-all')}</th>
## % endif
% for column in grid.iter_visible_columns():
${grid.column_header(column)}
% endfor
% if grid.show_actions_column:
<th class="actions">Actions</th>
% endif
</tr>
</thead>
<tbody>
% for i, row in enumerate(grid.iter_rows(), 1):
<tr ${format_attrs(**grid.get_row_attrs(row, i))}>
## % if grid.checkboxes:
## <td class="checkbox">${grid.checkbox(row)}</td>
## % endif
% for column in grid.iter_visible_columns():
<td ${format_attrs(**grid.get_cell_attrs(row, column))}>${grid.render_cell(row, column)}</td>
% endfor
% if grid.show_actions_column:
<td class="actions">
${grid.render_actions(row)}
</td>
% endif
</tr>
% endfor
</tbody>
</table>
% if grid.pageable:
<div class="pager">
<p class="showing">
showing ${grid.pager.first_item} thru ${grid.pager.last_item} of ${grid.pager.item_count}
% if grid.pager.page_count > 1:
(page ${grid.pager.page} of ${grid.pager.page_count})
% endif
</p>
<p class="page-links">
${h.select('pagesize', grid.pager.items_per_page, grid.get_pagesize_options())}
per page&nbsp;
${grid.pager.pager('$link_first $link_previous ~1~ $link_next $link_last', symbol_next='next', symbol_previous='prev', partial=1)}
</p>
</div>
% endif
</div>

View file

@ -1,12 +0,0 @@
## -*- coding: utf-8 -*-
<%inherit file="/grid.mako" />
<%def name="title()">Settings</%def>
<%def name="context_menu_items()">
% if request.has_perm('settings.create'):
<li>${h.link_to("Create a new Setting", url('settings.create'))}</li>
% endif
</%def>
${parent.body()}