feat: add auto-link (to "View") behavior for grid columns
This commit is contained in:
parent
a361f07980
commit
e0de4e9a65
|
@ -72,6 +72,13 @@ class Grid:
|
|||
List of :class:`GridAction` instances represenging action links
|
||||
to be shown for each record in the grid.
|
||||
|
||||
.. attribute:: linked_columns
|
||||
|
||||
List of column names for which auto-link behavior should be
|
||||
applied.
|
||||
|
||||
See also :meth:`set_link()` and :meth:`is_linked()`.
|
||||
|
||||
.. attribute:: vue_tagname
|
||||
|
||||
String name for Vue component tag. By default this is
|
||||
|
@ -85,12 +92,14 @@ class Grid:
|
|||
columns=None,
|
||||
data=None,
|
||||
actions=[],
|
||||
linked_columns=[],
|
||||
vue_tagname='wutta-grid',
|
||||
):
|
||||
self.request = request
|
||||
self.key = key
|
||||
self.data = data
|
||||
self.actions = actions or []
|
||||
self.linked_columns = linked_columns or []
|
||||
self.vue_tagname = vue_tagname
|
||||
|
||||
self.config = self.request.wutta_config
|
||||
|
@ -122,6 +131,51 @@ class Grid:
|
|||
"""
|
||||
self.columns = FieldList(columns)
|
||||
|
||||
def set_link(self, key, link=True):
|
||||
"""
|
||||
Explicitly enable or disable auto-link behavior for a given
|
||||
column.
|
||||
|
||||
If a column has auto-link enabled, then each of its cell
|
||||
contents will automatically be wrapped with a hyperlink. The
|
||||
URL for this will be the same as for the "View"
|
||||
:class:`GridAction`
|
||||
(aka. :meth:`~wuttaweb.views.master.MasterView.view()`).
|
||||
Although of course each cell gets a different link depending
|
||||
on which data record it points to.
|
||||
|
||||
It is typical to enable auto-link for fields relating to ID,
|
||||
description etc. or some may prefer to auto-link all columns.
|
||||
|
||||
See also :meth:`is_linked()`; the list is tracked via
|
||||
:attr:`linked_columns`.
|
||||
|
||||
:param key: Column key as string.
|
||||
|
||||
:param link: Boolean indicating whether column's cell contents
|
||||
should be auto-linked.
|
||||
"""
|
||||
if link:
|
||||
if key not in self.linked_columns:
|
||||
self.linked_columns.append(key)
|
||||
else: # unlink
|
||||
if self.linked_columns and key in self.linked_columns:
|
||||
self.linked_columns.remove(key)
|
||||
|
||||
def is_linked(self, key):
|
||||
"""
|
||||
Returns boolean indicating if auto-link behavior is enabled
|
||||
for a given column.
|
||||
|
||||
See also :meth:`set_link()` which describes auto-link behavior.
|
||||
|
||||
:param key: Column key as string.
|
||||
"""
|
||||
if self.linked_columns:
|
||||
if key in self.linked_columns:
|
||||
return True
|
||||
return False
|
||||
|
||||
def render_vue_tag(self, **kwargs):
|
||||
"""
|
||||
Render the Vue component tag for the grid.
|
||||
|
|
|
@ -10,7 +10,12 @@
|
|||
label="${column['label']}"
|
||||
v-slot="props"
|
||||
cell-class="c_${column['field']}">
|
||||
% if grid.is_linked(column['field']):
|
||||
<a :href="props.row._action_url_view"
|
||||
v-html="props.row.${column['field']}" />
|
||||
% else:
|
||||
<span v-html="props.row.${column['field']}"></span>
|
||||
% endif
|
||||
</${b}-table-column>
|
||||
% endfor
|
||||
|
||||
|
|
|
@ -49,6 +49,26 @@ class TestGrid(TestCase):
|
|||
grid = self.make_grid()
|
||||
self.assertEqual(grid.vue_component, 'WuttaGrid')
|
||||
|
||||
def test_linked_columns(self):
|
||||
grid = self.make_grid(columns=['foo', 'bar'])
|
||||
self.assertEqual(grid.linked_columns, [])
|
||||
self.assertFalse(grid.is_linked('foo'))
|
||||
|
||||
grid.set_link('foo')
|
||||
self.assertEqual(grid.linked_columns, ['foo'])
|
||||
self.assertTrue(grid.is_linked('foo'))
|
||||
self.assertFalse(grid.is_linked('bar'))
|
||||
|
||||
grid.set_link('bar')
|
||||
self.assertEqual(grid.linked_columns, ['foo', 'bar'])
|
||||
self.assertTrue(grid.is_linked('foo'))
|
||||
self.assertTrue(grid.is_linked('bar'))
|
||||
|
||||
grid.set_link('foo', False)
|
||||
self.assertEqual(grid.linked_columns, ['bar'])
|
||||
self.assertFalse(grid.is_linked('foo'))
|
||||
self.assertTrue(grid.is_linked('bar'))
|
||||
|
||||
def test_render_vue_tag(self):
|
||||
grid = self.make_grid(columns=['foo', 'bar'])
|
||||
html = grid.render_vue_tag()
|
||||
|
|
Loading…
Reference in a new issue