Fix package diff table for upgrade view template, per Buefy
This commit is contained in:
parent
63807e71fd
commit
558e127caa
|
@ -2,7 +2,7 @@
|
|||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2017 Lance Edgar
|
||||
# Copyright © 2010-2019 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -35,7 +35,8 @@ class Diff(object):
|
|||
Core diff class. In sore need of documentation.
|
||||
"""
|
||||
|
||||
def __init__(self, old_data, new_data, columns=None, fields=None, render_field=None, render_value=None, monospace=False):
|
||||
def __init__(self, old_data, new_data, columns=None, fields=None, render_field=None, render_value=None, monospace=False,
|
||||
extra_row_attrs=None):
|
||||
self.old_data = old_data
|
||||
self.new_data = new_data
|
||||
self.columns = columns or ["field name", "old value", "new value"]
|
||||
|
@ -43,6 +44,7 @@ class Diff(object):
|
|||
self._render_field = render_field or self.render_field_default
|
||||
self.render_value = render_value or self.render_value_default
|
||||
self.monospace = monospace
|
||||
self.extra_row_attrs = extra_row_attrs
|
||||
|
||||
def make_fields(self):
|
||||
return sorted(set(self.old_data) | set(self.new_data), key=lambda x: x.lower())
|
||||
|
@ -61,6 +63,32 @@ class Diff(object):
|
|||
context['diff'] = self
|
||||
return HTML.literal(render(template, context))
|
||||
|
||||
def get_row_attrs(self, field):
|
||||
"""
|
||||
Returns a *rendered* set of extra attributes for the ``<tr>`` element
|
||||
for the given field. May be an empty string, or a snippet of HTML
|
||||
attribute syntax, e.g.:
|
||||
|
||||
.. code-highlight:: none
|
||||
|
||||
class="diff" foo="bar"
|
||||
|
||||
If you wish to supply additional attributes, please define
|
||||
:attr:`extra_row_attrs`, which can be either a static dict, or a
|
||||
callable returning a dict.
|
||||
"""
|
||||
attrs = {}
|
||||
if self.values_differ(field):
|
||||
attrs['class'] = 'diff'
|
||||
|
||||
if self.extra_row_attrs:
|
||||
if callable(self.extra_row_attrs):
|
||||
attrs.update(self.extra_row_attrs(field, attrs))
|
||||
else:
|
||||
attrs.update(self.extra_row_attrs)
|
||||
|
||||
return HTML.render_attrs(attrs)
|
||||
|
||||
def render_field(self, field):
|
||||
return self._render_field(field, self)
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
</thead>
|
||||
<tbody>
|
||||
% for field in diff.fields:
|
||||
<tr${' class="diff"' if diff.values_differ(field) else ''|n}>
|
||||
<tr ${diff.get_row_attrs(field)|n}>
|
||||
<td class="field">${diff.render_field(field)}</td>
|
||||
<td class="old-value">${diff.render_old_value(field)}</td>
|
||||
<td class="new-value">${diff.render_new_value(field)}</td>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
<%def name="extra_javascript()">
|
||||
${parent.extra_javascript()}
|
||||
% if not use_buefy:
|
||||
<script type="text/javascript">
|
||||
|
||||
function show_packages(type) {
|
||||
|
@ -34,6 +35,7 @@
|
|||
});
|
||||
|
||||
</script>
|
||||
% endif
|
||||
</%def>
|
||||
|
||||
<%def name="render_form_buttons()">
|
||||
|
@ -60,5 +62,13 @@
|
|||
% endif
|
||||
</%def>
|
||||
|
||||
<%def name="modify_tailbone_form()">
|
||||
<script type="text/javascript">
|
||||
|
||||
TailboneFormData.showingPackages = 'diffs'
|
||||
|
||||
</script>
|
||||
</%def>
|
||||
|
||||
|
||||
${parent.body()}
|
||||
|
|
|
@ -240,24 +240,57 @@ class UpgradeView(MasterView):
|
|||
return filename
|
||||
|
||||
def render_package_diff(self, upgrade, fieldname):
|
||||
use_buefy = self.get_use_buefy()
|
||||
try:
|
||||
before = self.parse_requirements(upgrade, 'before')
|
||||
after = self.parse_requirements(upgrade, 'after')
|
||||
|
||||
kwargs = {}
|
||||
if use_buefy:
|
||||
kwargs['extra_row_attrs'] = self.get_extra_diff_row_attrs
|
||||
diff = self.make_diff(before, after,
|
||||
columns=["package", "old version", "new version"],
|
||||
render_field=self.render_diff_field,
|
||||
render_value=self.render_diff_value,
|
||||
)
|
||||
showing = HTML.tag('div',
|
||||
"showing: "
|
||||
+ tags.link_to("all", '#', class_='all')
|
||||
+ " / "
|
||||
+ tags.link_to("diffs only", '#', class_='diffs'),
|
||||
class_='showing')
|
||||
return showing + diff.render_html()
|
||||
**kwargs)
|
||||
|
||||
kwargs = {}
|
||||
if use_buefy:
|
||||
kwargs['@click'] = "showingPackages = 'all'"
|
||||
kwargs[':style'] = "{'font-weight': showingPackages == 'all' ? 'bold' : null}"
|
||||
else:
|
||||
kwargs['class_'] = 'all'
|
||||
all_link = tags.link_to("all", '#', **kwargs)
|
||||
|
||||
kwargs = {}
|
||||
if use_buefy:
|
||||
kwargs['@click'] = "showingPackages = 'diffs'"
|
||||
kwargs[':style'] = "{'font-weight': showingPackages == 'diffs' ? 'bold' : null}"
|
||||
else:
|
||||
kwargs['class_'] = 'diffs'
|
||||
diffs_link = tags.link_to("diffs only", '#', **kwargs)
|
||||
|
||||
kwargs = {}
|
||||
if not use_buefy:
|
||||
kwargs['class_'] = 'showing'
|
||||
showing = HTML.tag('div', c=["showing: "
|
||||
+ all_link
|
||||
+ " / "
|
||||
+ diffs_link],
|
||||
**kwargs)
|
||||
|
||||
return HTML.tag('div', c=[showing + diff.render_html()])
|
||||
|
||||
except:
|
||||
log.debug("failed to render package diff for upgrade: {}".format(upgrade), exc_info=True)
|
||||
return "(not available for this upgrade)"
|
||||
return HTML.tag('div', c="(not available for this upgrade)")
|
||||
|
||||
def get_extra_diff_row_attrs(self, field, attrs):
|
||||
# note, this is only needed/used with Buefy
|
||||
extra = {}
|
||||
if attrs.get('class') != 'diff':
|
||||
extra['v-show'] = "showingPackages == 'all'"
|
||||
return extra
|
||||
|
||||
def changelog_link(self, project, url):
|
||||
return tags.link_to(project, url, target='_blank')
|
||||
|
|
Loading…
Reference in a new issue