feat: add "searchable" column support for grids
frontend / basic only
This commit is contained in:
parent
770c4612d5
commit
a042d511fb
|
@ -282,6 +282,12 @@ class Grid:
|
||||||
|
|
||||||
Only relevant if :attr:`paginated` is true. If not specified,
|
Only relevant if :attr:`paginated` is true. If not specified,
|
||||||
constructor will assume ``1`` (first page).
|
constructor will assume ``1`` (first page).
|
||||||
|
|
||||||
|
.. attribute:: searchable_columns
|
||||||
|
|
||||||
|
Set of columns declared as searchable for the Vue component.
|
||||||
|
|
||||||
|
See also :meth:`set_searchable()` and :meth:`is_searchable()`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
|
@ -306,6 +312,7 @@ class Grid:
|
||||||
pagesize_options=None,
|
pagesize_options=None,
|
||||||
pagesize=None,
|
pagesize=None,
|
||||||
page=1,
|
page=1,
|
||||||
|
searchable_columns=None,
|
||||||
):
|
):
|
||||||
self.request = request
|
self.request = request
|
||||||
self.vue_tagname = vue_tagname
|
self.vue_tagname = vue_tagname
|
||||||
|
@ -344,6 +351,9 @@ class Grid:
|
||||||
self.pagesize = pagesize or self.get_pagesize()
|
self.pagesize = pagesize or self.get_pagesize()
|
||||||
self.page = page
|
self.page = page
|
||||||
|
|
||||||
|
# searching
|
||||||
|
self.searchable_columns = set(searchable_columns or [])
|
||||||
|
|
||||||
def get_columns(self):
|
def get_columns(self):
|
||||||
"""
|
"""
|
||||||
Returns the official list of column names for the grid, or
|
Returns the official list of column names for the grid, or
|
||||||
|
@ -543,6 +553,28 @@ class Grid:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def set_searchable(self, key, searchable=True):
|
||||||
|
"""
|
||||||
|
(Un)set the given column's searchable flag for the Vue
|
||||||
|
component.
|
||||||
|
|
||||||
|
See also :meth:`is_searchable()`. Flags are tracked via
|
||||||
|
:attr:`searchable_columns`.
|
||||||
|
"""
|
||||||
|
if searchable:
|
||||||
|
self.searchable_columns.add(key)
|
||||||
|
elif key in self.searchable_columns:
|
||||||
|
self.searchable_columns.remove(key)
|
||||||
|
|
||||||
|
def is_searchable(self, key):
|
||||||
|
"""
|
||||||
|
Check if the given column is marked as searchable for the Vue
|
||||||
|
component.
|
||||||
|
|
||||||
|
See also :meth:`set_searchable()`.
|
||||||
|
"""
|
||||||
|
return key in self.searchable_columns
|
||||||
|
|
||||||
def add_action(self, key, **kwargs):
|
def add_action(self, key, **kwargs):
|
||||||
"""
|
"""
|
||||||
Convenience to add a new :class:`GridAction` instance to the
|
Convenience to add a new :class:`GridAction` instance to the
|
||||||
|
@ -1384,8 +1416,13 @@ class Grid:
|
||||||
'field': 'foo',
|
'field': 'foo',
|
||||||
'label': "Foo",
|
'label': "Foo",
|
||||||
'sortable': True,
|
'sortable': True,
|
||||||
|
'searchable': False,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
The full format is determined by Buefy; see the Column section
|
||||||
|
in its `Table docs
|
||||||
|
<https://buefy.org/documentation/table/#api-view>`_.
|
||||||
|
|
||||||
See also :meth:`get_vue_data()`.
|
See also :meth:`get_vue_data()`.
|
||||||
"""
|
"""
|
||||||
if not self.columns:
|
if not self.columns:
|
||||||
|
@ -1397,6 +1434,7 @@ class Grid:
|
||||||
'field': name,
|
'field': name,
|
||||||
'label': self.get_label(name),
|
'label': self.get_label(name),
|
||||||
'sortable': self.is_sortable(name),
|
'sortable': self.is_sortable(name),
|
||||||
|
'searchable': self.is_searchable(name),
|
||||||
})
|
})
|
||||||
return columns
|
return columns
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
label="${column['label']}"
|
label="${column['label']}"
|
||||||
v-slot="props"
|
v-slot="props"
|
||||||
:sortable="${json.dumps(column.get('sortable', False))|n}"
|
:sortable="${json.dumps(column.get('sortable', False))|n}"
|
||||||
|
:searchable="${json.dumps(column.get('searchable', False))|n}"
|
||||||
cell-class="c_${column['field']}">
|
cell-class="c_${column['field']}">
|
||||||
% if grid.is_linked(column['field']):
|
% if grid.is_linked(column['field']):
|
||||||
<a :href="props.row._action_url_view"
|
<a :href="props.row._action_url_view"
|
||||||
|
|
|
@ -95,6 +95,12 @@ class AppInfoView(MasterView):
|
||||||
|
|
||||||
g.sort_multiple = False
|
g.sort_multiple = False
|
||||||
|
|
||||||
|
# name
|
||||||
|
g.set_searchable('name')
|
||||||
|
|
||||||
|
# editable_project_location
|
||||||
|
g.set_searchable('editable_project_location')
|
||||||
|
|
||||||
def get_weblibs(self):
|
def get_weblibs(self):
|
||||||
""" """
|
""" """
|
||||||
return OrderedDict([
|
return OrderedDict([
|
||||||
|
|
|
@ -187,6 +187,26 @@ class TestGrid(WebTestCase):
|
||||||
self.assertFalse(grid.is_linked('foo'))
|
self.assertFalse(grid.is_linked('foo'))
|
||||||
self.assertTrue(grid.is_linked('bar'))
|
self.assertTrue(grid.is_linked('bar'))
|
||||||
|
|
||||||
|
def test_searchable_columns(self):
|
||||||
|
grid = self.make_grid(columns=['foo', 'bar'])
|
||||||
|
self.assertEqual(grid.searchable_columns, set())
|
||||||
|
self.assertFalse(grid.is_searchable('foo'))
|
||||||
|
|
||||||
|
grid.set_searchable('foo')
|
||||||
|
self.assertEqual(grid.searchable_columns, {'foo'})
|
||||||
|
self.assertTrue(grid.is_searchable('foo'))
|
||||||
|
self.assertFalse(grid.is_searchable('bar'))
|
||||||
|
|
||||||
|
grid.set_searchable('bar')
|
||||||
|
self.assertEqual(grid.searchable_columns, {'foo', 'bar'})
|
||||||
|
self.assertTrue(grid.is_searchable('foo'))
|
||||||
|
self.assertTrue(grid.is_searchable('bar'))
|
||||||
|
|
||||||
|
grid.set_searchable('foo', False)
|
||||||
|
self.assertEqual(grid.searchable_columns, {'bar'})
|
||||||
|
self.assertFalse(grid.is_searchable('foo'))
|
||||||
|
self.assertTrue(grid.is_searchable('bar'))
|
||||||
|
|
||||||
def test_add_action(self):
|
def test_add_action(self):
|
||||||
grid = self.make_grid()
|
grid = self.make_grid()
|
||||||
self.assertEqual(len(grid.actions), 0)
|
self.assertEqual(len(grid.actions), 0)
|
||||||
|
|
Loading…
Reference in a new issue