From 758f011a8b6f37d45147ead790a5e91cec1a8887 Mon Sep 17 00:00:00 2001 From: CelinaKellinghaus Date: Wed, 24 Jun 2026 11:08:17 +0200 Subject: [PATCH 1/6] Add ToggleSwitchWidget for boolean form fields --- app/projects/forms.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/app/projects/forms.py b/app/projects/forms.py index 57d89693..48f27b60 100644 --- a/app/projects/forms.py +++ b/app/projects/forms.py @@ -694,6 +694,30 @@ class Meta: labels = {"name": _("Name"), "type": _("Energy carrier")} +class ToggleSwitchWidget(forms.CheckboxInput): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def render(self, name, value, attrs=None, renderer=None): + checkbox_html = super().render(name, value, attrs, renderer) + return format_html( + """ + + + """, + checkbox_html, + ) + + class AssetCreateForm(OpenPlanModelForm): def __init__(self, *args, **kwargs): self.asset_type_name = kwargs.pop("asset_type", None) @@ -1036,9 +1060,9 @@ class Meta: model = Asset exclude = ["scenario"] widgets = { - "optimize_cap": forms.Select(choices=BOOL_CHOICES), - "dispatchable": forms.Select(choices=TRUE_FALSE_CHOICES), - "renewable_asset": forms.Select(choices=BOOL_CHOICES), + "optimize_cap": ToggleSwitchWidget(), + "dispatchable": ToggleSwitchWidget(), + "renewable_asset": ToggleSwitchWidget(), "name": forms.TextInput( attrs={ "placeholder": _("Asset Name"), From aecbb92dd620f622c0439b68442d187fc2d5528e Mon Sep 17 00:00:00 2001 From: CelinaKellinghaus Date: Wed, 24 Jun 2026 11:10:07 +0200 Subject: [PATCH 2/6] Add settings section with toggle fields --- app/projects/templatetags/custom_filters.py | 20 ++++++++++++++++++-- app/templates/asset/asset_create_form.html | 17 +++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/app/projects/templatetags/custom_filters.py b/app/projects/templatetags/custom_filters.py index 7c54cf49..b052c354 100644 --- a/app/projects/templatetags/custom_filters.py +++ b/app/projects/templatetags/custom_filters.py @@ -80,6 +80,16 @@ def has_field(form, key): return key in form.fields +@register.filter +def has_toggle_parameters(form): + answer = False + for field in form.fields: + if is_toggle_parameter(field): + answer = True + break + return answer + + @register.filter def has_economical_parameters(form): answer = False @@ -100,6 +110,11 @@ def has_technical_parameters(form): return answer +@register.filter +def is_toggle_parameter(param): + return param in ["optimize_cap", "dispatchable", "renewable_asset"] + + @register.filter def is_economical_parameter(param): return param in [ @@ -116,8 +131,9 @@ def is_economical_parameter(param): def is_technical_parameter(param): if param == "name": return False - else: - return not is_economical_parameter(param) + if is_toggle_parameter(param): + return False + return not is_economical_parameter(param) @register.filter diff --git a/app/templates/asset/asset_create_form.html b/app/templates/asset/asset_create_form.html index 484bd4ba..16c66b1d 100644 --- a/app/templates/asset/asset_create_form.html +++ b/app/templates/asset/asset_create_form.html @@ -42,6 +42,23 @@

{% translate "Results" %}

{% endif %} {% endif %} + {% if form|has_toggle_parameters %} +
+
+

{% translate "Settings" %}

+
+ {% for field in form %} + {% if field.name|is_toggle_parameter %} +
+ {{ field }} + +
+ {% endif %} + {% endfor %} +
+
+
+ {% endif %}
{% if form|has_economical_parameters %}
From 3918933756b4c2abfd2fefe4c3dc393f9896c5a5 Mon Sep 17 00:00:00 2001 From: CelinaKellinghaus Date: Wed, 24 Jun 2026 11:11:10 +0200 Subject: [PATCH 3/6] Add toggle switch styles (commented out, not functional) --- app/static/scss/components/_forms.scss | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/app/static/scss/components/_forms.scss b/app/static/scss/components/_forms.scss index 47c2959f..bfcb71e1 100644 --- a/app/static/scss/components/_forms.scss +++ b/app/static/scss/components/_forms.scss @@ -21,6 +21,48 @@ form { background-color: $primary-color-1; } +/* .toggle-switch { + position: relative; + display: inline-block; + width: 48px; + height: 24px; + + input { + opacity: 0; + width: 0; + height: 0; + } + + .toggle-slider { + position: absolute; + cursor: pointer; + inset: 0; + background-color: $primary-gray-color-2; + border-radius: 24px; + transition: 0.3s; + + &::before { + content: ""; + position: absolute; + height: 18px; + width: 18px; + left: 3px; + bottom: 3px; + background-color: $white; + border-radius: 50%; + transition: 0.3s; + } + } + + input:checked + .toggle-slider { + background-color: $primary-color-1; + + &::before { + transform: translateX(24px); + } + } + } +*/ .form-group { margin-bottom: 1rem; color: $primary-color-2; From 2e024da7b1beb92238a82212f64e8a87e80864ef Mon Sep 17 00:00:00 2001 From: paulapreuss Date: Wed, 24 Jun 2026 15:26:55 +0200 Subject: [PATCH 4/6] Uncomment scss and remove slider style from widget --- app/projects/forms.py | 14 +------------- app/static/scss/components/_forms.scss | 3 +-- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/app/projects/forms.py b/app/projects/forms.py index 48f27b60..c752bcc5 100644 --- a/app/projects/forms.py +++ b/app/projects/forms.py @@ -701,19 +701,7 @@ def __init__(self, *args, **kwargs): def render(self, name, value, attrs=None, renderer=None): checkbox_html = super().render(name, value, attrs, renderer) return format_html( - """ - - - """, + '', checkbox_html, ) diff --git a/app/static/scss/components/_forms.scss b/app/static/scss/components/_forms.scss index bfcb71e1..94db7e92 100644 --- a/app/static/scss/components/_forms.scss +++ b/app/static/scss/components/_forms.scss @@ -21,7 +21,7 @@ form { background-color: $primary-color-1; } -/* .toggle-switch { + .toggle-switch { position: relative; display: inline-block; width: 48px; @@ -62,7 +62,6 @@ form { } } } -*/ .form-group { margin-bottom: 1rem; color: $primary-color-2; From 25df372973a95422a93e38876d9d3ff0370c3c38 Mon Sep 17 00:00:00 2001 From: paulapreuss Date: Wed, 24 Jun 2026 15:27:24 +0200 Subject: [PATCH 5/6] Update main.css fom collectstatic --- app/static/css/main.css | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/app/static/css/main.css b/app/static/css/main.css index 4ac250f1..ea7f80ac 100644 --- a/app/static/css/main.css +++ b/app/static/css/main.css @@ -1189,6 +1189,37 @@ form .form-check-input:focus { form .form-check-input:checked { background-color: #1F567D; } +form .toggle-switch { + position: relative; + display: inline-block; + width: 48px; + height: 24px; } + form .toggle-switch input { + opacity: 0; + width: 0; + height: 0; } + form .toggle-switch .toggle-slider { + position: absolute; + cursor: pointer; + inset: 0; + background-color: #E3EAEE; + border-radius: 24px; + transition: 0.3s; } + form .toggle-switch .toggle-slider::before { + content: ""; + position: absolute; + height: 18px; + width: 18px; + left: 3px; + bottom: 3px; + background-color: #fff; + border-radius: 50%; + transition: 0.3s; } + form .toggle-switch input:checked + .toggle-slider { + background-color: #1F567D; } + form .toggle-switch input:checked + .toggle-slider::before { + transform: translateX(24px); } + form .form-group { margin-bottom: 1rem; color: #343434; } From ff6115f34f25fa59536a69a21f6b1aea99f118ac Mon Sep 17 00:00:00 2001 From: paulapreuss Date: Wed, 24 Jun 2026 15:29:08 +0200 Subject: [PATCH 6/6] Add translation string --- app/locale/de/LC_MESSAGES/django.po | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/locale/de/LC_MESSAGES/django.po b/app/locale/de/LC_MESSAGES/django.po index deacd4d3..e380c847 100644 --- a/app/locale/de/LC_MESSAGES/django.po +++ b/app/locale/de/LC_MESSAGES/django.po @@ -1008,6 +1008,9 @@ msgstr "Wirtschaftliche Parameter" msgid "Technical parameters" msgstr "Technische Parameter" +msgid "Settings" +msgstr "Einstellungen" + #: templates/asset/asset_create_form.html:68 msgid "Calculate COP from temperature" msgstr "COP aus Temperatur berechnen"