refactor: remove sidebar template logic and update document listing to default to root-level folders

This commit is contained in:
kdeterme 2026-08-21 17:24:27 +02:00
parent ce48b99a45
commit 0551e012f4
3 changed files with 5 additions and 89 deletions

View file

@ -1,88 +1,2 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n documents_tags %} {% load i18n %}
{% block head %}
{{ block.super }}
<style>
:root { --nav-h: 0px; }
/* Sidebar: visible dans le viewport, pas plus haute que l'espace dispo */
.sidebar{
height: calc(100dvh - var(--nav-h));
overflow-y: auto;
overflow-x: auto;
scrollbar-width: thin; /* Firefox */
scrollbar-color: rgba(0,0,0,.35) transparent;
}
@media (min-width: 768px) {
.sidebar {
width: 300px;
flex-shrink: 0;
}
}
/* Chrome/Edge/Safari */
.sidebar::-webkit-scrollbar{ height: 10px; }
.sidebar::-webkit-scrollbar-thumb{
background-color: rgba(0,0,0,.35);
border-radius: 8px;
border: 2px solid transparent;
}
/* garantit que le contenu peut dépasser en largeur */
.sidebar .nav{ min-width: max-content; }
.folder-tree-toggle {
border: none;
background: transparent;
padding: 0;
line-height: 1;
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.5rem;
height: 1.5rem;
color: inherit;
}
.folder-tree-toggle:focus {
outline: none;
box-shadow: none;
}
.folder-tree-toggle .bi-chevron-right {
transition: transform 0.2s ease-in-out;
}
.folder-tree-toggle[aria-expanded="true"] .bi-chevron-right {
transform: rotate(90deg);
}
</style>
{% endblock head %}
{% block sidebar %}
<a href="{% url 'documents:list' %}"
class="nav-link d-flex align-items-center p-2 {% if request.path == '/documents/' and not request.GET.folder and not active_folder_slug %}active{% endif %}">
<i class="bi bi-collection" data-bs-toggle="tooltip" data-bs-placement="right" title="{% translate 'All documents' %}"></i>
<span class="ms-2 text d-none d-md-inline">{% translate "All documents" %}</span>
</a>
<hr>
{% render_folder_tree folder_tree active_folder_slug active_trail_slugs %}
{% endblock sidebar %}
{% block script %}
<script>
(function(){
const nav = document.querySelector('.navbar');
function setNavH(){
document.documentElement.style.setProperty('--nav-h', (nav?.offsetHeight || 0) + 'px');
}
setNavH();
addEventListener('resize', setNavH);
})();
</script>
{% endblock script %}

View file

@ -513,7 +513,7 @@ class DocumentDeletionPermissionTests(TestCase):
other_doc.folders.add(root_folder) other_doc.folders.add(root_folder)
self.client.force_login(self.manager) self.client.force_login(self.manager)
response = self.client.get(reverse("documents:list")) response = self.client.get(reverse("documents:list"), {"folder": root_folder.slug})
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
delete_url = reverse("documents:delete", args=[other_doc.pk]) delete_url = reverse("documents:delete", args=[other_doc.pk])
self.assertContains(response, delete_url) self.assertContains(response, delete_url)
@ -542,7 +542,7 @@ class DocumentDeletionPermissionTests(TestCase):
other_doc.folders.add(root_folder) other_doc.folders.add(root_folder)
self.client.force_login(self.manager) self.client.force_login(self.manager)
response = self.client.get(reverse("documents:list")) response = self.client.get(reverse("documents:list"), {"folder": root_folder.slug})
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
delete_url = reverse("documents:delete", args=[other_doc.pk]) delete_url = reverse("documents:delete", args=[other_doc.pk])
self.assertNotContains(response, delete_url) self.assertNotContains(response, delete_url)

View file

@ -262,6 +262,8 @@ class DocumentListView(DocumentsAppAccessMixin, LoginRequiredMixin, ListView):
) )
else: else:
queryset = queryset.filter(folders=self.current_folder) queryset = queryset.filter(folders=self.current_folder)
elif not self.search_term and not tag and not doc_type:
queryset = queryset.filter(folders__isnull=True)
if self.search_term: if self.search_term:
queryset = queryset.filter(title__icontains=self.search_term) queryset = queryset.filter(title__icontains=self.search_term)