Switch page history view to use jquery datatable

This commit is contained in:
Chase Sterling 2016-07-09 15:50:07 -04:00
parent 0bcfaba807
commit b3f6c311b3
3 changed files with 57 additions and 50 deletions

View file

@ -142,6 +142,20 @@ class WikiPage(object):
finally:
cache.set(self._cache_key('history'), cached_revs)
@property
def history_cache(self):
"""Get info about the history cache.
:return: tuple -- (cached items, cache complete?)
"""
cache_complete = False
cached_revs = cache.get(self._cache_key('history')) or []
if cached_revs:
if cached_revs[-1] == 'TAIL':
del cached_revs[-1]
cache_complete = True
return len(cached_revs), cache_complete
@property
def partials(self):
data = self.data

View file

@ -64,22 +64,32 @@ def revert():
def history(name):
if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous():
return current_app.login_manager.unauthorized()
items_per_page = 15
page = int(request.args.get('page', 1))
start_index = (page - 1) * items_per_page
hist = g.current_wiki.get_page(name).history
# Grab one extra item to see if there is a next page
items = list(itertools.islice(hist, start_index, start_index+items_per_page+1))
more = False
if len(items) > items_per_page:
more = True
items.pop()
if page > 1 and not items:
abort(404, 'Page is past end of history.')
return render_template('wiki/history.html', name=name)
@blueprint.route("/_history_data/<path:name>")
def history_data(name):
"""Ajax provider for paginated history data."""
if current_app.config.get('PRIVATE_WIKI') and current_user.is_anonymous():
return current_app.login_manager.unauthorized()
draw = int(request.args.get('draw', 0))
start = int(request.args.get('start', 0))
length = int(request.args.get('length', 10))
page = g.current_wiki.get_page(name)
items = list(itertools.islice(page.history, start, start + length))
for item in items:
item['gravatar'] = gravatar_url(item['author_email'])
return render_template('wiki/history.html', name=name, history=items,
pagination={'page': page, 'more': more})
total_records, hist_complete = page.history_cache
if not hist_complete:
# Force datatables to fetch more data when it gets to the end
total_records += 1
return {
'draw': draw,
'recordsTotal': total_records,
'recordsFiltered': total_records,
'data': items
}
@blueprint.route("/_edit/<path:name>")

View file

@ -6,49 +6,14 @@
<a class="btn btn-default btn-sm compare-revisions">Compare Revisions</a>
</p>
<table class="table table-bordered revision-tbl">
<table class="table table-bordered revision-tbl data-table">
<thead>
<tr>
<th></th>
<th>Name</th>
<th>Revision Message</th>
<th>Date</th>
</tr>
</thead>
{% if pagination.page > 1 or pagination.more %}
<tfoot>
<tr><td colspan="4">
<ul class="pagination" style="float: right">
<li class="paginate_button previous{% if pagination.page == 1 %} disabled{% endif %}">
<a href="{{ url_for('.history', name=name, page=pagination.page - 1) }}">Previous</a>
</li>
{% for p in range(1, pagination.page + 1) %}
<li class="paginate_button{% if p == pagination.page %} active{% endif %}">
<a href="{{ url_for('.history', name=name, page=p) }}">{{ p }}</a>
</li>
{% endfor %}
{% if pagination.more %}<li class="paginate_button disabled"><a></a></li>{% endif %}
<li class="paginate_button next{% if not pagination.more %} disabled{% endif %}">
<a href="{{ url_for('.history', name=name, page=pagination.page + 1) }}">Next</a>
</li>
</ul>
</td></tr>
</tfoot>
{% endif %}
<tbody>
{% for h in history %}
<tr>
<td class="checkbox-cell text-center">
{% if h.type != 'delete' %}
<input type="checkbox" name="versions[]" value="{{ h.sha }}" />
{% endif %}
</td>
<td><img src="{{ h.gravatar }}?s=20" class="avatar"/> {{ h.author }}</td>
<td><a href="{{ url_for('wiki.commit', name=name, sha=h.sha) }}" class='label label-primary'>View</a> {{ h.message }} </td>
<td>{{ h.time|datetime }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<p>
<a class="btn btn-default btn-sm compare-revisions">Compare Revisions</a>
@ -58,6 +23,24 @@
{% block js %}
<script>
$(document).ready(function() {
$('.data-table').dataTable({
serverSide: true,
ajax: '{{ url_for('.history_data', name=name) }}',
ordering: false,
bFilter: false,
columns: [
{ "data": "author" },
{ "data": "message" },
{ "data": "time",
"render": function (data) {
var date = new Date(0);
date.setUTCSeconds(data)
return date.toDateString();
}}
]
});
});
$(function(){
$('.revision-tbl :checkbox').change(function () {
var $cs=$(this).closest('.revision-tbl').find(':checkbox:checked');