diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py index 44c2170..a754a2c 100644 --- a/src/wuttaweb/grids/base.py +++ b/src/wuttaweb/grids/base.py @@ -156,6 +156,15 @@ class Grid: See also :meth:`set_link()` and :meth:`is_linked()`. + .. attribute:: hidden_columns + + List of column names which should be hidden from view. + + Hidden columns are sometimes useful to pass "extra" data into + the grid, for use by other component logic etc. + + See also :meth:`set_hidden()` and :meth:`is_hidden()`. + .. attribute:: sortable Boolean indicating whether *any* column sorting is allowed for @@ -372,6 +381,7 @@ class Grid: row_class=None, actions=[], linked_columns=[], + hidden_columns=[], sortable=False, sort_multiple=True, sort_on_backend=True, @@ -399,6 +409,7 @@ class Grid: self.row_class = row_class self.actions = actions or [] self.linked_columns = linked_columns or [] + self.hidden_columns = hidden_columns or [] self.joiners = joiners or {} self.config = self.request.wutta_config @@ -535,6 +546,43 @@ class Grid: if key in self.columns: self.columns.remove(key) + def set_hidden(self, key, hidden=True): + """ + Set/override the hidden flag for a column. + + Hidden columns are sometimes useful to pass "extra" data into + the grid, for use by other component logic etc. + + See also :meth:`is_hidden()`; the list is tracked via + :attr:`hidden_columns`. + + :param key: Column key as string. + + :param hidden: Flag indicating whether column should be hidden + (vs. shown). + """ + if hidden: + if key not in self.hidden_columns: + self.hidden_columns.append(key) + else: # un-hide + if self.hidden_columns and key in self.hidden_columns: + self.hidden_columns.remove(key) + + def is_hidden(self, key): + """ + Returns boolean indicating if the column is hidden from view. + + See also :meth:`set_hidden()` and :attr:`hidden_columns`. + + :param key: Column key as string. + + :rtype: bool + """ + if self.hidden_columns: + if key in self.hidden_columns: + return True + return False + def set_label(self, key, label, column_only=False): """ Set/override the label for a column. @@ -2090,6 +2138,7 @@ class Grid: columns.append({ 'field': name, 'label': self.get_label(name), + 'hidden': self.is_hidden(name), 'sortable': self.is_sortable(name), 'searchable': self.is_searchable(name), }) diff --git a/src/wuttaweb/templates/grids/vue_template.mako b/src/wuttaweb/templates/grids/vue_template.mako index fa7b8f7..85dd468 100644 --- a/src/wuttaweb/templates/grids/vue_template.mako +++ b/src/wuttaweb/templates/grids/vue_template.mako @@ -165,19 +165,21 @@ > % for column in grid.get_vue_columns(): - <${b}-table-column field="${column['field']}" - label="${column['label']}" - v-slot="props" - :sortable="${json.dumps(column.get('sortable', False))|n}" - :searchable="${json.dumps(column.get('searchable', False))|n}" - cell-class="c_${column['field']}"> - % if grid.is_linked(column['field']): - - % else: - - % endif - + % if not column['hidden']: + <${b}-table-column field="${column['field']}" + label="${column['label']}" + v-slot="props" + :sortable="${json.dumps(column.get('sortable', False))|n}" + :searchable="${json.dumps(column.get('searchable', False))|n}" + cell-class="c_${column['field']}"> + % if grid.is_linked(column['field']): + + % else: + + % endif + + % endif % endfor % if grid.actions: diff --git a/tests/grids/test_base.py b/tests/grids/test_base.py index 0184c0c..eea0215 100644 --- a/tests/grids/test_base.py +++ b/tests/grids/test_base.py @@ -281,6 +281,26 @@ class TestGrid(WebTestCase): self.assertFalse(grid.is_linked('foo')) self.assertTrue(grid.is_linked('bar')) + def test_hidden_columns(self): + grid = self.make_grid(columns=['foo', 'bar']) + self.assertEqual(grid.hidden_columns, []) + self.assertFalse(grid.is_hidden('foo')) + + grid.set_hidden('foo') + self.assertEqual(grid.hidden_columns, ['foo']) + self.assertTrue(grid.is_hidden('foo')) + self.assertFalse(grid.is_hidden('bar')) + + grid.set_hidden('bar') + self.assertEqual(grid.hidden_columns, ['foo', 'bar']) + self.assertTrue(grid.is_hidden('foo')) + self.assertTrue(grid.is_hidden('bar')) + + grid.set_hidden('foo', False) + self.assertEqual(grid.hidden_columns, ['bar']) + self.assertFalse(grid.is_hidden('foo')) + self.assertTrue(grid.is_hidden('bar')) + def test_searchable_columns(self): grid = self.make_grid(columns=['foo', 'bar']) self.assertEqual(grid.searchable_columns, set())