diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py
index fcfff93..6bf7274 100644
--- a/src/wuttaweb/grids/base.py
+++ b/src/wuttaweb/grids/base.py
@@ -2041,9 +2041,9 @@ class Grid:
"""
Render a simple Vue table element for the grid.
- This is what you want for a "simple" grid which does require a
- unique Vue component, but can instead use the standard table
- component.
+ This is what you want for a "simple" grid which does not
+ require a unique Vue component, but can instead use the
+ standard table component.
This returns something like:
@@ -2227,6 +2227,35 @@ class Grid:
'order': sorter['dir']})
return sorters
+ def get_vue_first_sorter(self):
+ """
+ Returns the first active sorter, if applicable.
+
+ This method is used to declare the initial sort for a simple
+ table component, i.e. for use with the ``table-element.mako``
+ template. It generally is assumed that frontend sorting is in
+ use, as opposed to backend sorting, although it should work
+ for either scenario.
+
+ This checks :attr:`active_sorters` and if set, will use the
+ first sorter from that. Note that ``active_sorters`` will
+ *not* be set unless :meth:`load_settings()` has been called.
+
+ Otherwise this will use the first sorter from
+ :attr:`sort_defaults` which is defined in constructor.
+
+ :returns: The first sorter in format ``[sortkey, sortdir]``,
+ or ``None``.
+ """
+ if hasattr(self, 'active_sorters'):
+ if self.active_sorters:
+ sorter = self.active_sorters[0]
+ return [sorter['key'], sorter['dir']]
+
+ elif self.sort_defaults:
+ sorter = self.sort_defaults[0]
+ return [sorter.sortkey, sorter.sortdir]
+
def get_vue_filters(self):
"""
Returns a list of Vue-compatible filter definitions.
diff --git a/src/wuttaweb/templates/grids/table_element.mako b/src/wuttaweb/templates/grids/table_element.mako
index 3c40338..c964089 100644
--- a/src/wuttaweb/templates/grids/table_element.mako
+++ b/src/wuttaweb/templates/grids/table_element.mako
@@ -1,5 +1,22 @@
## -*- coding: utf-8; -*-
-<${b}-table :data="gridContext['${grid.key}'].data">
+
+
+ % if grid.tools:
+
+ % for html in grid.tools.values():
+ ${html}
+ % endfor
+
+ % endif
+
+<${b}-table :data="gridContext['${grid.key}'].data"
+
+ ## sorting
+ % if grid.sortable:
+ :default-sort="${grid.get_vue_first_sorter() or 'null'}"
+ % endif
+
+ icon-pack="fas">
% for column in grid.get_vue_columns():
% if not column['hidden']:
@@ -52,3 +69,5 @@
${b}-table>
+
+
diff --git a/tests/grids/test_base.py b/tests/grids/test_base.py
index 167ba8c..2e336d0 100644
--- a/tests/grids/test_base.py
+++ b/tests/grids/test_base.py
@@ -1610,6 +1610,50 @@ class TestGrid(WebTestCase):
sorters = grid.get_vue_active_sorters()
self.assertEqual(sorters, [{'field': 'name', 'order': 'asc'}])
+ def test_get_vue_first_sorter(self):
+
+ # empty by default
+ grid = self.make_grid(key='foo', sortable=True)
+ sorter = grid.get_vue_first_sorter()
+ self.assertIsNone(sorter)
+
+ # will use first element from sort_defaults when applicable...
+
+ # basic
+ grid = self.make_grid(key='foo', sortable=True, sort_defaults='name')
+ sorter = grid.get_vue_first_sorter()
+ self.assertEqual(sorter, ['name', 'asc'])
+
+ # descending
+ grid = self.make_grid(key='foo', sortable=True, sort_defaults=('name', 'desc'))
+ sorter = grid.get_vue_first_sorter()
+ self.assertEqual(sorter, ['name', 'desc'])
+
+ # multiple
+ grid = self.make_grid(key='foo', sortable=True, sort_defaults=[('key', 'asc'), ('name', 'asc')])
+ sorter = grid.get_vue_first_sorter()
+ self.assertEqual(sorter, ['key', 'asc'])
+
+ # will use first element from active_sorters when applicable...
+
+ # basic
+ grid = self.make_grid(key='foo', sortable=True)
+ grid.active_sorters = [{'key': 'name', 'dir': 'asc'}]
+ sorter = grid.get_vue_first_sorter()
+ self.assertEqual(sorter, ['name', 'asc'])
+
+ # descending
+ grid = self.make_grid(key='foo', sortable=True)
+ grid.active_sorters = [{'key': 'name', 'dir': 'desc'}]
+ sorter = grid.get_vue_first_sorter()
+ self.assertEqual(sorter, ['name', 'desc'])
+
+ # multiple
+ grid = self.make_grid(key='foo', sortable=True)
+ grid.active_sorters = [{'key': 'key', 'dir': 'asc'}, {'key': 'name', 'dir': 'asc'}]
+ sorter = grid.get_vue_first_sorter()
+ self.assertEqual(sorter, ['key', 'asc'])
+
def test_get_vue_filters(self):
model = self.app.model