From 5ed7c07142704f574d8100ed115745cb89bd26d1 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Wed, 21 Aug 2024 13:32:37 +0200 Subject: [PATCH] Add a widget to show a simple treeview --- media/css/confadmin.css | 18 ++++++++++++++++++ .../forms/widgets/treeview_widget.html | 9 +++++++++ postgresqleu/util/widgets.py | 14 ++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 postgresqleu/util/templates/forms/widgets/treeview_widget.html diff --git a/media/css/confadmin.css b/media/css/confadmin.css index 747632be..1735711c 100644 --- a/media/css/confadmin.css +++ b/media/css/confadmin.css @@ -177,6 +177,24 @@ a.partial-collapse:not(.collapsed):after { content: 'Show less'; } +/* + * Trivial treeview widget + */ +details.treeview { + margin-left: 1rem; +} + +details.treeview summary:has(+ div) { + display: list-item; /* Sometimes set by bootstrap, but we override to always have it */ + list-style-position: outside; + cursor: pointer; +} + + +details.treeview details.treeview { + margin-left: 2rem; +} + /* * Nested dropdown */ diff --git a/postgresqleu/util/templates/forms/widgets/treeview_widget.html b/postgresqleu/util/templates/forms/widgets/treeview_widget.html new file mode 100644 index 00000000..123e3d52 --- /dev/null +++ b/postgresqleu/util/templates/forms/widgets/treeview_widget.html @@ -0,0 +1,9 @@ +{%load miscutil%} +{%if treedata|isdict%}{%for k, v in treedata.items|dictsort:0 %} +
{{k}}{%if v and not v|islistordict%} ({{v}}){%endif%}{%if v|islistordict %}
{%include "forms/widgets/treeview_widget.html" with treedata=v%}
{%endif%}
+{%endfor%} +{%elif treedata|islist%}
Array of:
{%for k in treedata.0 %} +
{{k}}
+{%endfor%} +
+{%endif%} diff --git a/postgresqleu/util/widgets.py b/postgresqleu/util/widgets.py index 0d6e5336..9af60ebc 100644 --- a/postgresqleu/util/widgets.py +++ b/postgresqleu/util/widgets.py @@ -126,6 +126,20 @@ class StaticTextWidget(TextInput): return mark_safe(value) +class SimpleTreeviewWidget(TextInput): + template_name = 'forms/widgets/treeview_widget.html' + + def __init__(self, *args, **kwargs): + self.treedata = dict(kwargs.pop('treedata')) + + super().__init__(*args, **kwargs) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + context['treedata'] = self.treedata + return context + + class StaticHtmlPreviewWidget(TextInput): template_name = 'forms/widgets/static_html_preview_widget.html' -- 2.39.5