From 9580dde246b1bc4b29f590f64647ce427b792137 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 15 Jan 2025 17:00:48 -0600 Subject: [PATCH 1/7] fix: let header title be even wider still seeing them get truncated too eagerly.. --- src/wuttaweb/templates/base.mako | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wuttaweb/templates/base.mako b/src/wuttaweb/templates/base.mako index 486b496..48161b7 100644 --- a/src/wuttaweb/templates/base.mako +++ b/src/wuttaweb/templates/base.mako @@ -155,7 +155,7 @@ } #content-title h1 { - max-width: 85%; + max-width: 95%; overflow: hidden; padding-left: 0.5rem; text-overflow: ellipsis; From f0d1f00dd8bdc62092ece8ea032df1865f0acf04 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 15 Jan 2025 17:01:53 -0600 Subject: [PATCH 2/7] fix: avoid literal `None` when rendering form field value --- src/wuttaweb/forms/base.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wuttaweb/forms/base.py b/src/wuttaweb/forms/base.py index edd1e2d..504e012 100644 --- a/src/wuttaweb/forms/base.py +++ b/src/wuttaweb/forms/base.py @@ -1033,12 +1033,13 @@ class Form: # render static text if field not in deform/schema # TODO: need to abstract this somehow if self.model_instance: - html = str(self.model_instance[fieldname]) + value = self.model_instance[fieldname] + html = str(value) if value is not None else '' else: html = '' # mark all that as safe - html = HTML.literal(html) + html = HTML.literal(html or ' ') # render field label label = self.get_label(fieldname) From e6189573819139fa2b93a15ad599624fab2c540d Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 15 Jan 2025 17:03:13 -0600 Subject: [PATCH 3/7] tests: fix tests per upstream changes --- tests/grids/test_base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/grids/test_base.py b/tests/grids/test_base.py index d5f3766..1002ac9 100644 --- a/tests/grids/test_base.py +++ b/tests/grids/test_base.py @@ -1433,7 +1433,7 @@ class TestGrid(WebTestCase): # null obj = MagicMock(dt=None) result = grid.render_date(obj, 'dt', None) - self.assertIsNone(result) + self.assertEqual(result, '') # typical dt = datetime.date(2025, 1, 13) @@ -1446,7 +1446,7 @@ class TestGrid(WebTestCase): obj = MagicMock(dt=None) result = grid.render_datetime(obj, 'dt', None) - self.assertIsNone(result) + self.assertEqual(result, '') dt = datetime.datetime(2024, 12, 12, 13, 44, tzinfo=datetime.timezone.utc) obj = MagicMock(dt=dt) From 6dfb35b688c96cb6e860278127be2c2f01bc2350 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 22 Jan 2025 19:38:16 -0600 Subject: [PATCH 4/7] fix: add WuttaRequestMixin for ThisPage component --- src/wuttaweb/templates/page.mako | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wuttaweb/templates/page.mako b/src/wuttaweb/templates/page.mako index c23ce90..cd5b1da 100644 --- a/src/wuttaweb/templates/page.mako +++ b/src/wuttaweb/templates/page.mako @@ -26,6 +26,7 @@ const ThisPage = { template: '#this-page-template', + mixins: [WuttaRequestMixin], props: { ## configureFieldsHelp: Boolean, }, From 7ba4987003bcf526ca00117d843f64e1720e0167 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 22 Jan 2025 19:43:49 -0600 Subject: [PATCH 5/7] fix: add basic checkbox support for grids --- src/wuttaweb/grids/base.py | 7 +++++++ src/wuttaweb/templates/grids/vue_template.mako | 12 ++++++++++++ src/wuttaweb/views/master.py | 8 ++++++++ 3 files changed, 27 insertions(+) diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py index 33269f2..e93627f 100644 --- a/src/wuttaweb/grids/base.py +++ b/src/wuttaweb/grids/base.py @@ -118,6 +118,11 @@ class Grid: See also :meth:`set_renderer()` and :meth:`set_default_renderers()`. + .. attribute:: checkable + + Boolean indicating whether the grid should expose per-row + checkboxes. + .. attribute:: row_class This represents the CSS ``class`` attribute for a row within @@ -362,6 +367,7 @@ class Grid: data=None, labels={}, renderers={}, + checkable=False, row_class=None, actions=[], linked_columns=[], @@ -388,6 +394,7 @@ class Grid: self.key = key self.data = data self.labels = labels or {} + self.checkable = checkable self.row_class = row_class self.actions = actions or [] self.linked_columns = linked_columns or [] diff --git a/src/wuttaweb/templates/grids/vue_template.mako b/src/wuttaweb/templates/grids/vue_template.mako index ba548cb..fa7b8f7 100644 --- a/src/wuttaweb/templates/grids/vue_template.mako +++ b/src/wuttaweb/templates/grids/vue_template.mako @@ -116,6 +116,13 @@ hoverable icon-pack="fas" + ## checkboxes + % if grid.checkable: + checkable + checkbox-position="right" + :checked-rows.sync="checkedRows" + % endif + ## sorting % if grid.sortable: ## nb. buefy/oruga only support *one* default sorter @@ -267,6 +274,11 @@ shareLink: null, % endif + ## checkboxes + % if grid.checkable: + checkedRows: [], + % endif + ## filtering % if grid.filterable: filters: ${json.dumps(grid.get_vue_filters())|n}, diff --git a/src/wuttaweb/views/master.py b/src/wuttaweb/views/master.py index 61d4d14..5903fe4 100644 --- a/src/wuttaweb/views/master.py +++ b/src/wuttaweb/views/master.py @@ -189,6 +189,12 @@ class MasterView(View): This is optional; see also :meth:`get_grid_columns()`. + .. attribute:: checkable + + Boolean indicating whether the grid should expose per-row + checkboxes. This is passed along to set + :attr:`~wuttaweb.grids.base.Grid.checkable` on the grid. + .. method:: grid_row_class(obj, data, i) This method is *not* defined on the ``MasterView`` base class; @@ -395,6 +401,7 @@ class MasterView(View): # features listable = True has_grid = True + checkable = False filterable = True filter_defaults = None sortable = True @@ -1992,6 +1999,7 @@ class MasterView(View): kwargs['tools'] = tools + kwargs.setdefault('checkable', self.checkable) if hasattr(self, 'grid_row_class'): kwargs.setdefault('row_class', self.grid_row_class) kwargs.setdefault('filterable', self.filterable) From fc76ba7dbd14c419a097a9a762a28d39082d1fcb Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Thu, 23 Jan 2025 16:56:29 -0600 Subject: [PATCH 6/7] fix: improve styling for grid tools section --- src/wuttaweb/templates/base.mako | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wuttaweb/templates/base.mako b/src/wuttaweb/templates/base.mako index 48161b7..d84a0e2 100644 --- a/src/wuttaweb/templates/base.mako +++ b/src/wuttaweb/templates/base.mako @@ -186,6 +186,11 @@ width: 100%; } + .wutta-grid-tools-wrapper { + display: flex; + gap: 0.5rem; + } + ############################## ## forms ############################## From 455a0906c6aec379a99ccbe3e18ca62d03484e80 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Thu, 23 Jan 2025 17:16:08 -0600 Subject: [PATCH 7/7] =?UTF-8?q?bump:=20version=200.20.4=20=E2=86=92=200.20?= =?UTF-8?q?.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 10 ++++++++++ pyproject.toml | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18526c3..4a8ea89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to wuttaweb will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## v0.20.5 (2025-01-23) + +### Fix + +- improve styling for grid tools section +- add basic checkbox support for grids +- add WuttaRequestMixin for ThisPage component +- avoid literal `None` when rendering form field value +- let header title be even wider + ## v0.20.4 (2025-01-15) ### Fix diff --git a/pyproject.toml b/pyproject.toml index 8858f8a..6c63e8c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "hatchling.build" [project] name = "WuttaWeb" -version = "0.20.4" +version = "0.20.5" description = "Web App for Wutta Framework" readme = "README.md" authors = [{name = "Lance Edgar", email = "lance@wuttaproject.org"}] @@ -44,7 +44,7 @@ dependencies = [ "pyramid_tm", "waitress", "WebHelpers2", - "WuttJamaican[db]>=0.20.1", + "WuttJamaican[db]>=0.20.2", "zope.sqlalchemy>=1.5", ]