From cbe4c89fc9e7d4998c04efb61feef68635c9e10b Mon Sep 17 00:00:00 2001 From: Pascal Repond Date: Sun, 4 Jan 2026 15:54:28 +0100 Subject: [PATCH] feat: add a navigation sidebar - Introduce a new sidebar navigation component to enhance user experience and accessibility across the application. - Add logo and favicon to the app from Freepik on [Flaticon](https://www.flaticon.com/free-icons/bookcase). --- Dockerfile | 6 +- src/core/views.py | 17 ++- src/locale/fr/LC_MESSAGES/django.po | 103 ++++++++----- src/static/images/bookshelf.png | Bin 0 -> 21604 bytes src/static/js/base.js | 18 +-- src/templates/accounts/profile_edit.html | 13 +- src/templates/backup_manage.html | 2 +- src/templates/base.html | 127 ++++++---------- src/templates/base_auth.html | 33 +++++ src/templates/media.html | 25 ++-- src/templates/media_detail.html | 2 +- src/templates/media_edit.html | 2 +- src/templates/partials/confirm-modal.html | 11 +- src/templates/partials/contributor-chip.html | 13 +- src/templates/partials/filters.html | 8 +- .../partials/media-contributors.html | 6 +- src/templates/partials/media-cover.html | 3 +- src/templates/partials/media-items.html | 3 +- src/templates/partials/sidebar-nav.html | 137 ++++++++++++++++++ src/templates/partials/spinner.html | 6 +- src/templates/partials/view-mode-toggle.html | 34 ++--- src/templates/registration/login.html | 4 +- src/tests/core/test_views.py | 10 +- 23 files changed, 376 insertions(+), 207 deletions(-) create mode 100644 src/static/images/bookshelf.png create mode 100644 src/templates/base_auth.html create mode 100644 src/templates/partials/sidebar-nav.html diff --git a/Dockerfile b/Dockerfile index fc90a17..9c83c80 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,9 +29,10 @@ ENV MEDIA_ROOT=/app/data/media WORKDIR /app -# Install cron and other system dependencies +# Install cron, gettext and other system dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ cron \ + gettext \ && rm -rf /var/lib/apt/lists/* # Install uv @@ -68,6 +69,9 @@ RUN echo "PATH=/usr/local/bin:/usr/bin:/bin" > /etc/cron.d/datakult-backup && \ COPY scripts/entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh +# Compile translation messages +RUN uv run ./src/manage.py compilemessages + # Collect static files with production settings # Set DEBUG=false to use CompressedManifestStaticFilesStorage during collectstatic # This ensures the manifest file is created for production use diff --git a/src/core/views.py b/src/core/views.py index 5951f67..eb28f3d 100644 --- a/src/core/views.py +++ b/src/core/views.py @@ -19,7 +19,7 @@ def _resolve_sorting(request): """Return validated sorting info: selected field, sort string (with sign), and ordering.""" - default_field = "created_at" + default_field = "review_date" sort = request.GET.get("sort") or request.GET.get("order_by") or f"-{default_field}" raw_field = sort.lstrip("-") @@ -51,6 +51,15 @@ def _extract_filters(request): filters["review_to"], ] ) + + # Add display names for active filters + if filters["type"]: + filters["type_display"] = dict(Media.media_type.field.choices).get(filters["type"], filters["type"]) + if filters["status"]: + filters["status_display"] = dict(Media.status.field.choices).get(filters["status"], filters["status"]) + if filters["score"] and filters["score"] != "none": + filters["score_display"] = dict(Media.score.field.choices).get(int(filters["score"]), filters["score"]) + return filters @@ -100,7 +109,7 @@ def _apply_filters(queryset, filters): def index(request): """Main view for displaying media list.""" # Get query parameters - view_mode = request.GET.get("view_mode", "list") # 'list' or 'grid' + view_mode = request.GET.get("view_mode", "grid") # 'list' or 'grid' sort_field, sort, ordering = _resolve_sorting(request) filters = _extract_filters(request) @@ -193,7 +202,7 @@ def media_delete(request, pk): @login_required def load_more_media(request): """HTMX view: load next page of media items for infinite scrolling.""" - view_mode = request.GET.get("view_mode", "list") + view_mode = request.GET.get("view_mode", "grid") sort_field, sort, ordering = _resolve_sorting(request) filters = _extract_filters(request) query = request.GET.get("search", "") @@ -228,7 +237,7 @@ def load_more_media(request): @login_required def search_media(request): query = request.GET.get("search", "") - view_mode = request.GET.get("view_mode", "list") + view_mode = request.GET.get("view_mode", "grid") sort_field, sort, ordering = _resolve_sorting(request) filters = _extract_filters(request) diff --git a/src/locale/fr/LC_MESSAGES/django.po b/src/locale/fr/LC_MESSAGES/django.po index 9ef62bf..1015e27 100644 --- a/src/locale/fr/LC_MESSAGES/django.po +++ b/src/locale/fr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-01-04 14:32+0100\n" +"POT-Creation-Date: 2026-01-04 15:45+0100\n" "PO-Revision-Date: 2026-01-04 10:45+0100\n" "Last-Translator: Pascal Repond \n" "Language-Team: LANGUAGE \n" @@ -124,23 +124,23 @@ msgstr "" msgid "Status" msgstr "Statut" -#: src/core/models.py:152 +#: src/core/models.py:152 src/templates/partials/sidebar-nav.html:23 msgid "Planned" msgstr "Prévu" -#: src/core/models.py:153 +#: src/core/models.py:153 src/templates/partials/sidebar-nav.html:31 msgid "In progress" msgstr "En cours" -#: src/core/models.py:154 +#: src/core/models.py:154 src/templates/partials/sidebar-nav.html:39 msgid "Completed" msgstr "Terminé" -#: src/core/models.py:155 +#: src/core/models.py:155 src/templates/partials/sidebar-nav.html:47 msgid "Paused" msgstr "En pause" -#: src/core/models.py:156 +#: src/core/models.py:156 src/templates/partials/sidebar-nav.html:55 msgid "Did not finish" msgstr "Pas fini" @@ -267,7 +267,7 @@ msgid "Backup import failed: %(error)s" msgstr "Échec de l'importation du backup : %(error)s" #: src/templates/accounts/profile_edit.html:4 -#: src/templates/accounts/profile_edit.html:8 src/templates/base.html:78 +#: src/templates/accounts/profile_edit.html:8 msgid "Edit Profile" msgstr "Modifier le profil" @@ -461,9 +461,8 @@ msgid "" "This action will DELETE ALL your current data and replace it with the backup " "data. Are you absolutely sure you want to continue?" msgstr "" -"Cette action va SUPPRIMER TOUTES vos données actuelles et les " -"remplacer par les données de la sauvegarde. Êtes-vous absolument sûr de " -"vouloir continuer ?" +"Cette action va SUPPRIMER TOUTES vos données actuelles et les remplacer par " +"les données de la sauvegarde. Êtes-vous absolument sûr de vouloir continuer ?" #: src/templates/backup_manage.html:155 msgid "Yes, import backup" @@ -477,27 +476,7 @@ msgstr "Échec de la création de la sauvegarde. Veuillez réessayer." msgid "Unknown error" msgstr "Erreur inconnue" -#: src/templates/base.html:40 -msgid "System" -msgstr "Système" - -#: src/templates/base.html:47 -msgid "Light" -msgstr "Clair" - -#: src/templates/base.html:54 -msgid "Dark" -msgstr "Sombre" - -#: src/templates/base.html:84 -msgid "Backups" -msgstr "Sauvegardes" - -#: src/templates/base.html:93 -msgid "Log Out" -msgstr "Se déconnecter" - -#: src/templates/media.html:3 src/templates/media.html:54 +#: src/templates/media.html:3 src/templates/media.html:55 msgid "Search" msgstr "Recherche" @@ -514,7 +493,7 @@ msgstr "Date de création" msgid "Score" msgstr "Note" -#: src/templates/media.html:65 +#: src/templates/media.html:66 msgid "Add" msgstr "Ajouter" @@ -655,18 +634,65 @@ msgstr "Note :" msgid "out of 10" msgstr "sur 10" +#: src/templates/partials/sidebar-nav.html:11 +msgid "All" +msgstr "Tout" + +#: src/templates/partials/sidebar-nav.html:16 +msgid "By status" +msgstr "Par statut" + +#: src/templates/partials/sidebar-nav.html:60 +msgid "Settings" +msgstr "Paramètres" + +#: src/templates/partials/sidebar-nav.html:66 +msgid "Profile" +msgstr "Profil" + +#: src/templates/partials/sidebar-nav.html:72 +msgid "Backups" +msgstr "Sauvegardes" + +#: src/templates/partials/sidebar-nav.html:80 +msgid "Theme" +msgstr "Thème" + +#: src/templates/partials/sidebar-nav.html:89 +#: src/templates/partials/sidebar-nav.html:91 +msgid "System" +msgstr "Système" + +#: src/templates/partials/sidebar-nav.html:99 +#: src/templates/partials/sidebar-nav.html:101 +msgid "Light" +msgstr "Clair" + +#: src/templates/partials/sidebar-nav.html:109 +#: src/templates/partials/sidebar-nav.html:111 +msgid "Dark" +msgstr "Sombre" + +#: src/templates/partials/sidebar-nav.html:123 +msgid "Logout" +msgstr "Déconnexion" + +#: src/templates/partials/sidebar-nav.html:129 +msgid "Login" +msgstr "Se connecter" + #: src/templates/partials/spinner.html:17 msgid "Loading..." msgstr "Chargement..." -#: src/templates/partials/view-mode-toggle.html:15 -msgid "List" -msgstr "Liste" - -#: src/templates/partials/view-mode-toggle.html:24 +#: src/templates/partials/view-mode-toggle.html:14 msgid "Grid" msgstr "Grille" +#: src/templates/partials/view-mode-toggle.html:21 +msgid "List" +msgstr "Liste" + #: src/templates/registration/login.html:4 #: src/templates/registration/login.html:11 #: src/templates/registration/login.html:24 @@ -676,3 +702,6 @@ msgstr "Se connecter" #: src/templates/registration/login.html:21 msgid "Password" msgstr "Mot de passe" + +#~ msgid "Log Out" +#~ msgstr "Se déconnecter" diff --git a/src/static/images/bookshelf.png b/src/static/images/bookshelf.png new file mode 100644 index 0000000000000000000000000000000000000000..595076944742ab868289ab250b03105bf9f09418 GIT binary patch literal 21604 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 literal 0 HcmV?d00001 diff --git a/src/static/js/base.js b/src/static/js/base.js index ed38ee3..4eb025d 100644 --- a/src/static/js/base.js +++ b/src/static/js/base.js @@ -1,7 +1,7 @@ // THEME SWITCHER document.addEventListener("DOMContentLoaded", () => { const htmlElement = document.documentElement; - const themeRadios = document.querySelectorAll('input[name="theme-dropdown"]'); + const themeRadios = document.querySelectorAll('input[name="theme-sidebar"]'); const applyTheme = (theme) => { if (theme === "default") { @@ -13,21 +13,21 @@ document.addEventListener("DOMContentLoaded", () => { } }; - // initialise theme + // Initialize theme const currentTheme = localStorage.getItem("theme") || "default"; applyTheme(currentTheme); - // activate the menu item of the current theme - const currentRadio = document.querySelector(`input[value="${currentTheme}"]`); + // Activate the radio button of the current theme + const currentRadio = document.querySelector(`input[name="theme-sidebar"][value="${currentTheme}"]`); if (currentRadio) { currentRadio.checked = true; } - // add an event listener to each menu item + // Add event listener to each radio button themeRadios.forEach((radio) => { radio.addEventListener("change", (event) => { - const selectedTheme = event.target.value; - applyTheme(selectedTheme); + const selectedTheme = event.target.value; + applyTheme(selectedTheme); }); }); }); @@ -35,8 +35,8 @@ document.addEventListener("DOMContentLoaded", () => { // CLEAN URL - Remove default/empty parameters from URL // Default values that should not appear in URL const DEFAULT_PARAMS = { - 'view_mode': 'list', - 'sort': '-created_at', + 'view_mode': 'grid', + 'sort': '-review_date', }; // Remove empty and default parameters before HTMX sends the request diff --git a/src/templates/accounts/profile_edit.html b/src/templates/accounts/profile_edit.html index 534764f..bb231af 100644 --- a/src/templates/accounts/profile_edit.html +++ b/src/templates/accounts/profile_edit.html @@ -37,7 +37,9 @@

{% translate "Profile Information" %}

{{ profile_form.email }}
@@ -72,7 +74,9 @@

{% translate "Profile Information" %}

{% translate "Language Preference" %}

-
+ {% csrf_token %}
diff --git a/src/templates/backup_manage.html b/src/templates/backup_manage.html index 8b5b041..bb3fe0e 100644 --- a/src/templates/backup_manage.html +++ b/src/templates/backup_manage.html @@ -12,7 +12,7 @@

{% translate "Backup Management" %}

{% for message in messages %} {% endfor %} diff --git a/src/templates/base.html b/src/templates/base.html index b2ce5ad..099b146 100644 --- a/src/templates/base.html +++ b/src/templates/base.html @@ -1,7 +1,6 @@ {% load static tailwind_tags %} {% load django_htmx %} {% load i18n %} -{% load static %} @@ -16,96 +15,58 @@ + {% tailwind_css %} {% htmx_script %} - {% block extra_css %}{% endblock extra_css %} + {% block extra_css %} + {% endblock extra_css %} - -
- {% block navbar %} -