From 6c1098088945f10c4b2ba27598ac86f9ac1d1a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=93teris=20Caune?= Date: Fri, 18 Jun 2021 13:51:07 +0300 Subject: [PATCH] Add Account Settings > Appearance page --- hc/accounts/admin.py | 1 + hc/accounts/migrations/0038_profile_theme.py | 18 ++++ hc/accounts/models.py | 1 + hc/accounts/urls.py | 1 + hc/accounts/views.py | 20 +++++ static/css/appearance.css | 11 +++ static/img/theme-dark.png | Bin 0 -> 8799 bytes static/img/theme-light.png | Bin 0 -> 8992 bytes static/js/appearance.js | 5 ++ templates/accounts/appearance.html | 90 +++++++++++++++++++ templates/accounts/billing.html | 1 + templates/accounts/notifications.html | 1 + templates/accounts/profile.html | 1 + templates/base.html | 3 +- 14 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 hc/accounts/migrations/0038_profile_theme.py create mode 100644 static/css/appearance.css create mode 100644 static/img/theme-dark.png create mode 100644 static/img/theme-light.png create mode 100644 static/js/appearance.js create mode 100644 templates/accounts/appearance.html diff --git a/hc/accounts/admin.py b/hc/accounts/admin.py index 5bc79920..40e1444b 100644 --- a/hc/accounts/admin.py +++ b/hc/accounts/admin.py @@ -45,6 +45,7 @@ class ProfileFieldset(Fieldset): "email", "reports", "tz", + "theme", "next_report_date", "nag_period", "next_nag_date", diff --git a/hc/accounts/migrations/0038_profile_theme.py b/hc/accounts/migrations/0038_profile_theme.py new file mode 100644 index 00000000..09aefc9e --- /dev/null +++ b/hc/accounts/migrations/0038_profile_theme.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.4 on 2021-06-18 09:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0037_profile_tz'), + ] + + operations = [ + migrations.AddField( + model_name='profile', + name='theme', + field=models.CharField(blank=True, max_length=10, null=True), + ), + ] diff --git a/hc/accounts/models.py b/hc/accounts/models.py index 52167d2f..81b80fd6 100644 --- a/hc/accounts/models.py +++ b/hc/accounts/models.py @@ -73,6 +73,7 @@ class Profile(models.Model): deletion_notice_date = models.DateTimeField(null=True, blank=True) last_active_date = models.DateTimeField(null=True, blank=True) tz = models.CharField(max_length=36, default="UTC") + theme = models.CharField(max_length=10, null=True, blank=True) objects = ProfileManager() diff --git a/hc/accounts/urls.py b/hc/accounts/urls.py index 15341527..dd269c91 100644 --- a/hc/accounts/urls.py +++ b/hc/accounts/urls.py @@ -13,6 +13,7 @@ urlpatterns = [ name="hc-check-token", ), path("profile/", views.profile, name="hc-profile"), + path("profile/appearance/", views.appearance, name="hc-appearance"), path("profile/notifications/", views.notifications, name="hc-notifications"), path("close/", views.close, name="hc-close"), path( diff --git a/hc/accounts/views.py b/hc/accounts/views.py index 2f4e785c..8d5f2dc5 100644 --- a/hc/accounts/views.py +++ b/hc/accounts/views.py @@ -742,3 +742,23 @@ def login_webauthn(request): ctx = {"options": base64.b64encode(cbor.encode(options)).decode()} return render(request, "accounts/login_webauthn.html", ctx) + + +@login_required +def appearance(request): + profile = request.profile + + ctx = { + "page": "appearance", + "profile": profile, + "status": "default", + } + + if request.method == "POST": + theme = request.POST.get("theme", "") + if theme in ("", "dark"): + profile.theme = theme + profile.save() + ctx["status"] = "info" + + return render(request, "accounts/appearance.html", ctx) diff --git a/static/css/appearance.css b/static/css/appearance.css new file mode 100644 index 00000000..a1a30b8f --- /dev/null +++ b/static/css/appearance.css @@ -0,0 +1,11 @@ +.theme img { + border: 1px solid var(--border-color); + padding: 4px; + width: 100%; +} + +.theme .radio-container { + margin-top: 12px; + margin-left: 12px; +} + diff --git a/static/img/theme-dark.png b/static/img/theme-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5400d925061c86e121bdb85a0c6c71f9e754f3 GIT binary patch literal 8799 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 literal 0 HcmV?d00001 diff --git a/static/img/theme-light.png b/static/img/theme-light.png new file mode 100644 index 0000000000000000000000000000000000000000..389e5c87c6f6e586b63d33509a00dc3f05b16258 GIT binary patch literal 8992 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 +
+

+ Settings + {{ request.user.email }} +

+
+ + +
+
+ +
+ +
+
+
+
+ {% csrf_token %} +

Theme

+ +
+
+ Light theme preview + + +
+
+ Dark theme preview + + +
+
+ + + +
+
+ {% if status == "info" %} + + {% endif %} +
+
+
+{% endblock %} + +{% block scripts %} +{% compress js %} + + + +{% endcompress %} +{% endblock %} diff --git a/templates/accounts/billing.html b/templates/accounts/billing.html index 570dcd17..18fe1a1c 100644 --- a/templates/accounts/billing.html +++ b/templates/accounts/billing.html @@ -17,6 +17,7 @@
diff --git a/templates/accounts/notifications.html b/templates/accounts/notifications.html index 92dd11ce..4026adb5 100644 --- a/templates/accounts/notifications.html +++ b/templates/accounts/notifications.html @@ -17,6 +17,7 @@