From 0732f89274bea5abcb031a7e436d52ed78735222 Mon Sep 17 00:00:00 2001 From: kdeterme Date: Sat, 10 Oct 2026 14:39:40 +0200 Subject: [PATCH] perf(contracts): optimize queries, add server-side pagination, search, thematic/contract filters and redesign UI --- .../contracts/locale/en/LC_MESSAGES/django.mo | Bin 35684 -> 37554 bytes .../contracts/locale/en/LC_MESSAGES/django.po | 90 ++ .../contracts/locale/fr/LC_MESSAGES/django.mo | Bin 42859 -> 44909 bytes .../contracts/locale/fr/LC_MESSAGES/django.po | 90 ++ .../contracts/locale/nl/LC_MESSAGES/django.mo | Bin 37103 -> 39102 bytes .../contracts/locale/nl/LC_MESSAGES/django.po | 90 ++ .../static/contracts/css/contracts_index.css | 831 ++++++++++++++++++ .../static/contracts/js/contracts_index.js | 155 ++++ .../templates/contracts/contracts_index.html | 762 ++++++++++------ loko/contracts/tests.py | 115 +++ loko/contracts/views.py | 244 ++++- 11 files changed, 2088 insertions(+), 289 deletions(-) create mode 100644 loko/contracts/static/contracts/css/contracts_index.css create mode 100644 loko/contracts/static/contracts/js/contracts_index.js diff --git a/loko/contracts/locale/en/LC_MESSAGES/django.mo b/loko/contracts/locale/en/LC_MESSAGES/django.mo index d61ce0c3add243419fb35496125bfcf572449c7a..de1f0d44c89e39e69ad8edf6172a178abc56cf89 100644 GIT binary patch delta 12353 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 delta 10596 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 diff --git a/loko/contracts/locale/en/LC_MESSAGES/django.po b/loko/contracts/locale/en/LC_MESSAGES/django.po index bd89c9a..6629525 100644 --- a/loko/contracts/locale/en/LC_MESSAGES/django.po +++ b/loko/contracts/locale/en/LC_MESSAGES/django.po @@ -2399,3 +2399,93 @@ msgstr "Map color" msgid "Couleur d'affichage du lot sur la carte (code hexadécimal, ex: #28a745)." msgstr "Display color of the lot on the map (hexadecimal code, e.g. #28a745)." +#: contracts/templates/contracts/contracts_index.html +msgid "Filtrer les commandes et marchés" +msgstr "Filter orders and contracts" + +#: contracts/templates/contracts/contracts_index.html +msgid "Sélectionnez les critères de recherche" +msgstr "Select search criteria" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucun" +msgstr "None" + +#: contracts/templates/contracts/contracts_index.html +msgid "Marchés" +msgstr "Contracts" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtrer la liste des marchés..." +msgstr "Filter contract list..." + +#: contracts/templates/contracts/contracts_index.html +msgid "Période de commande" +msgstr "Order period" + +#: contracts/templates/contracts/contracts_index.html +msgid "Rechercher une commande, un marché, une description, un prestataire..." +msgstr "Search order, contract, description, provider..." + +#: contracts/templates/contracts/contracts_index.html +msgid "Effacer la recherche" +msgstr "Clear search" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtres" +msgstr "Filters" + +#: contracts/templates/contracts/contracts_index.html +msgid "Afficher par" +msgstr "Show by" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtres actifs" +msgstr "Active filters" + +#: contracts/templates/contracts/contracts_index.html +msgid "Supprimer ce critère" +msgstr "Remove this filter" + +#: contracts/templates/contracts/contracts_index.html +msgid "Tout effacer" +msgstr "Clear all" + +#: contracts/templates/contracts/contracts_index.html +msgid "Télécharger le bon de commande" +msgstr "Download order document" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucune commande ne correspond à vos critères de recherche actuels." +msgstr "No orders match your current search criteria." + +#: contracts/templates/contracts/contracts_index.html +msgid "Réinitialiser les filtres" +msgstr "Reset filters" + +#: contracts/templates/contracts/contracts_index.html +msgid "Affichage de %(start)s à %(end)s sur %(total)s commande(s)" +msgstr "Showing %(start)s to %(end)s of %(total)s order(s)" + +#: contracts/templates/contracts/contracts_index.html +msgid "Pagination des commandes" +msgstr "Orders pagination" + +#: contracts/templates/contracts/contracts_index.html +msgid "Détail du contrat" +msgstr "Contract details" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucun marché ne correspond à vos critères de recherche actuels." +msgstr "No contracts match your current search criteria." + +#: contracts/templates/contracts/contracts_index.html +msgid "Affichage de %(start)s à %(end)s sur %(total)s marché(s)" +msgstr "Showing %(start)s to %(end)s of %(total)s contract(s)" + +#: contracts/templates/contracts/contracts_index.html +msgid "Pagination des marchés" +msgstr "Contracts pagination" + + + diff --git a/loko/contracts/locale/fr/LC_MESSAGES/django.mo b/loko/contracts/locale/fr/LC_MESSAGES/django.mo index 4c62d55571b735eb3db34084d92f466a80f00b64..751b3c446828d90da3a6e3a8111c82f0eecb9772 100644 GIT binary patch literal 44909 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 ae?-}@LZTGJK5kL|Hbwc{6kq+@6#oZYk6ru# delta 10987 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 diff --git a/loko/contracts/locale/fr/LC_MESSAGES/django.po b/loko/contracts/locale/fr/LC_MESSAGES/django.po index 417a16d..d40a097 100644 --- a/loko/contracts/locale/fr/LC_MESSAGES/django.po +++ b/loko/contracts/locale/fr/LC_MESSAGES/django.po @@ -2449,3 +2449,93 @@ msgstr "Couleur cartographique" msgid "Couleur d'affichage du lot sur la carte (code hexadécimal, ex: #28a745)." msgstr "Couleur d'affichage du lot sur la carte (code hexadécimal, ex: #28a745)." +#: contracts/templates/contracts/contracts_index.html +msgid "Filtrer les commandes et marchés" +msgstr "Filtrer les commandes et marchés" + +#: contracts/templates/contracts/contracts_index.html +msgid "Sélectionnez les critères de recherche" +msgstr "Sélectionnez les critères de recherche" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucun" +msgstr "Aucun" + +#: contracts/templates/contracts/contracts_index.html +msgid "Marchés" +msgstr "Marchés" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtrer la liste des marchés..." +msgstr "Filtrer la liste des marchés..." + +#: contracts/templates/contracts/contracts_index.html +msgid "Période de commande" +msgstr "Période de commande" + +#: contracts/templates/contracts/contracts_index.html +msgid "Rechercher une commande, un marché, une description, un prestataire..." +msgstr "Rechercher une commande, un marché, une description, un prestataire..." + +#: contracts/templates/contracts/contracts_index.html +msgid "Effacer la recherche" +msgstr "Effacer la recherche" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtres" +msgstr "Filtres" + +#: contracts/templates/contracts/contracts_index.html +msgid "Afficher par" +msgstr "Afficher par" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtres actifs" +msgstr "Filtres actifs" + +#: contracts/templates/contracts/contracts_index.html +msgid "Supprimer ce critère" +msgstr "Supprimer ce critère" + +#: contracts/templates/contracts/contracts_index.html +msgid "Tout effacer" +msgstr "Tout effacer" + +#: contracts/templates/contracts/contracts_index.html +msgid "Télécharger le bon de commande" +msgstr "Télécharger le bon de commande" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucune commande ne correspond à vos critères de recherche actuels." +msgstr "Aucune commande ne correspond à vos critères de recherche actuels." + +#: contracts/templates/contracts/contracts_index.html +msgid "Réinitialiser les filtres" +msgstr "Réinitialiser les filtres" + +#: contracts/templates/contracts/contracts_index.html +msgid "Affichage de %(start)s à %(end)s sur %(total)s commande(s)" +msgstr "Affichage de %(start)s à %(end)s sur %(total)s commande(s)" + +#: contracts/templates/contracts/contracts_index.html +msgid "Pagination des commandes" +msgstr "Pagination des commandes" + +#: contracts/templates/contracts/contracts_index.html +msgid "Détail du contrat" +msgstr "Détail du contrat" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucun marché ne correspond à vos critères de recherche actuels." +msgstr "Aucun marché ne correspond à vos critères de recherche actuels." + +#: contracts/templates/contracts/contracts_index.html +msgid "Affichage de %(start)s à %(end)s sur %(total)s marché(s)" +msgstr "Affichage de %(start)s à %(end)s sur %(total)s marché(s)" + +#: contracts/templates/contracts/contracts_index.html +msgid "Pagination des marchés" +msgstr "Pagination des marchés" + + + diff --git a/loko/contracts/locale/nl/LC_MESSAGES/django.mo b/loko/contracts/locale/nl/LC_MESSAGES/django.mo index c738f01314dab012b7c401dc96e9fcc591579683..0f988ebf7a287ad6b549886fd865eeede06f1645 100644 GIT binary patch delta 12497 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 delta 10606 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 diff --git a/loko/contracts/locale/nl/LC_MESSAGES/django.po b/loko/contracts/locale/nl/LC_MESSAGES/django.po index 1433fbe..71d80dd 100644 --- a/loko/contracts/locale/nl/LC_MESSAGES/django.po +++ b/loko/contracts/locale/nl/LC_MESSAGES/django.po @@ -2405,3 +2405,93 @@ msgstr "Kaartkleur" msgid "Couleur d'affichage du lot sur la carte (code hexadécimal, ex: #28a745)." msgstr "Weergavekleur van het perceel op de kaart (hexadecimale code, bijv. #28a745)." +#: contracts/templates/contracts/contracts_index.html +msgid "Filtrer les commandes et marchés" +msgstr "Bestellingen en opdrachten filteren" + +#: contracts/templates/contracts/contracts_index.html +msgid "Sélectionnez les critères de recherche" +msgstr "Selecteer de zoekcriteria" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucun" +msgstr "Geen" + +#: contracts/templates/contracts/contracts_index.html +msgid "Marchés" +msgstr "Opdrachten" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtrer la liste des marchés..." +msgstr "Lijst met opdrachten filteren..." + +#: contracts/templates/contracts/contracts_index.html +msgid "Période de commande" +msgstr "Bestelperiode" + +#: contracts/templates/contracts/contracts_index.html +msgid "Rechercher une commande, un marché, une description, un prestataire..." +msgstr "Zoeken op bestelnummer, opdracht, omschrijving, dienstverlener..." + +#: contracts/templates/contracts/contracts_index.html +msgid "Effacer la recherche" +msgstr "Zoekopdracht wissen" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtres" +msgstr "Filters" + +#: contracts/templates/contracts/contracts_index.html +msgid "Afficher par" +msgstr "Weergeven per" + +#: contracts/templates/contracts/contracts_index.html +msgid "Filtres actifs" +msgstr "Actieve filters" + +#: contracts/templates/contracts/contracts_index.html +msgid "Supprimer ce critère" +msgstr "Dit criterium verwijderen" + +#: contracts/templates/contracts/contracts_index.html +msgid "Tout effacer" +msgstr "Alles wissen" + +#: contracts/templates/contracts/contracts_index.html +msgid "Télécharger le bon de commande" +msgstr "Bestelbon downloaden" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucune commande ne correspond à vos critères de recherche actuels." +msgstr "Geen enkele bestelling voldoet aan de huidige zoekcriteria." + +#: contracts/templates/contracts/contracts_index.html +msgid "Réinitialiser les filtres" +msgstr "Filters opnieuw instellen" + +#: contracts/templates/contracts/contracts_index.html +msgid "Affichage de %(start)s à %(end)s sur %(total)s commande(s)" +msgstr "Weergave van %(start)s tot %(end)s van %(total)s bestelling(en)" + +#: contracts/templates/contracts/contracts_index.html +msgid "Pagination des commandes" +msgstr "Paginering van bestellingen" + +#: contracts/templates/contracts/contracts_index.html +msgid "Détail du contrat" +msgstr "Contractdetail" + +#: contracts/templates/contracts/contracts_index.html +msgid "Aucun marché ne correspond à vos critères de recherche actuels." +msgstr "Geen enkele opdracht voldoet aan de huidige zoekcriteria." + +#: contracts/templates/contracts/contracts_index.html +msgid "Affichage de %(start)s à %(end)s sur %(total)s marché(s)" +msgstr "Weergave van %(start)s tot %(end)s van %(total)s opdracht(en)" + +#: contracts/templates/contracts/contracts_index.html +msgid "Pagination des marchés" +msgstr "Paginering van opdrachten" + + + diff --git a/loko/contracts/static/contracts/css/contracts_index.css b/loko/contracts/static/contracts/css/contracts_index.css new file mode 100644 index 0000000..0c29e8c --- /dev/null +++ b/loko/contracts/static/contracts/css/contracts_index.css @@ -0,0 +1,831 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@500;600&display=swap'); + +/* Main Page Container */ +.contracts-page-container { + max-width: 1440px; + margin: 1.5rem auto 3rem auto; + padding: 0 1.25rem; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; +} + +/* Page Header */ +.contracts-header { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 1rem; + margin-bottom: 1.25rem; +} + +.contracts-tabs { + border-bottom: 2px solid #e2e8f0; + margin-bottom: 0; +} + +.contracts-tabs .nav-link { + font-size: 0.95rem; + font-weight: 600; + color: #64748b; + border: none; + border-bottom: 2px solid transparent; + margin-bottom: -2px; + padding: 0.65rem 1.25rem; + background: transparent; + transition: all 0.15s ease; + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.contracts-tabs .nav-link:hover { + color: #0f172a; + border-color: #cbd5e1; +} + +.contracts-tabs .nav-link.active { + color: #0f172a; + border-bottom-color: #0f172a; + background: transparent; +} + +.tab-counter-badge { + font-size: 0.75rem; + font-weight: 600; + padding: 2px 7px; + border-radius: 9999px; + background-color: #f1f5f9; + color: #475569; + border: 1px solid #e2e8f0; +} + +.contracts-tabs .nav-link.active .tab-counter-badge { + background-color: #0f172a; + color: #ffffff; + border-color: #0f172a; +} + +/* Primary Action Button */ +.btn-new-order { + background-color: #0f172a; + color: #ffffff; + border: 1px solid #0f172a; + border-radius: 9px; + padding: 0.5rem 1rem; + font-size: 0.88rem; + font-weight: 600; + display: inline-flex; + align-items: center; + gap: 0.5rem; + transition: all 0.15s ease; + text-decoration: none; + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08); +} + +.btn-new-order:hover { + background-color: #1e293b; + color: #ffffff; + border-color: #1e293b; + transform: translateY(-1px); + box-shadow: 0 4px 6px -1px rgba(15, 23, 42, 0.12); +} + +/* Toolbar: Search, Filters & Settings */ +.contracts-toolbar { + background-color: #ffffff; + border: 1px solid #e2e8f0; + border-radius: 12px; + padding: 0.85rem 1.15rem; + margin-bottom: 1rem; + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + gap: 0.85rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02); +} + +.search-widget { + position: relative; + flex: 1 1 360px; + max-width: 550px; +} + +.search-input-wrapper { + position: relative; + display: flex; + align-items: center; + width: 100%; +} + +.search-icon-left { + position: absolute; + left: 0.85rem; + color: #94a3b8; + font-size: 0.95rem; + pointer-events: none; +} + +.search-input { + width: 100%; + padding: 0.5rem 2.25rem 0.5rem 2.35rem; + font-size: 0.88rem; + border: 1.5px solid #e2e8f0; + border-radius: 9999px; + background-color: #f8fafc; + color: #0f172a; + transition: all 0.15s ease; +} + +.search-input:focus { + outline: none; + background-color: #ffffff; + border-color: #2563eb; + box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); +} + +.search-clear-btn { + position: absolute; + right: 0.75rem; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + color: #94a3b8; + padding: 2px 4px; + cursor: pointer; + font-size: 0.8rem; + line-height: 1; + display: none; + transition: color 0.15s ease; +} + +.search-clear-btn:hover { + color: #0f172a; +} + +.toolbar-actions { + display: flex; + align-items: center; + gap: 0.65rem; +} + +.filter-trigger-btn { + background-color: #ffffff; + border: 1.5px solid #e2e8f0; + border-radius: 9999px; + padding: 0.45rem 1rem; + font-size: 0.85rem; + font-weight: 600; + color: #334155; + display: inline-flex; + align-items: center; + gap: 0.45rem; + transition: all 0.15s ease; +} + +.filter-trigger-btn:hover { + background-color: #f8fafc; + border-color: #cbd5e1; + color: #0f172a; +} + +.filter-count-badge { + background-color: #0f172a; + color: #ffffff; + font-size: 0.7rem; + font-weight: 700; + border-radius: 9999px; + padding: 1px 6px; + margin-left: 2px; +} + +.page-size-selector { + display: flex; + align-items: center; + gap: 0.4rem; + font-size: 0.82rem; + color: #64748b; +} + +.page-size-select { + padding: 0.35rem 0.65rem; + font-size: 0.82rem; + border: 1.5px solid #e2e8f0; + border-radius: 7px; + background-color: #ffffff; + color: #334155; + cursor: pointer; + font-weight: 500; +} + +.page-size-select:focus { + outline: none; + border-color: #2563eb; +} + +/* Active Filters Pills */ +.active-filters-bar { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; + margin-bottom: 1rem; + padding: 0 0.25rem; +} + +.active-filter-label { + font-size: 0.78rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.04em; + color: #94a3b8; + margin-right: 0.25rem; +} + +.active-filter-chip { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.25rem 0.65rem; + font-size: 0.78rem; + font-weight: 500; + border-radius: 9999px; + background-color: #f1f5f9; + border: 1px solid #e2e8f0; + color: #334155; + transition: all 0.12s ease; +} + +.active-filter-chip .remove-filter-btn { + border: none; + background: none; + padding: 0; + margin-left: 2px; + color: #94a3b8; + cursor: pointer; + display: inline-flex; + align-items: center; + font-size: 0.75rem; + line-height: 1; +} + +.active-filter-chip .remove-filter-btn:hover { + color: #dc2626; +} + +.btn-clear-all-filters { + font-size: 0.78rem; + color: #dc2626; + text-decoration: none; + font-weight: 600; + padding: 0.25rem 0.5rem; + border-radius: 6px; + transition: background-color 0.12s ease; +} + +.btn-clear-all-filters:hover { + background-color: #fef2f2; + color: #b91c1c; +} + +/* Table Container & Design */ +.contracts-table-card { + background-color: #ffffff; + border: 1px solid #e2e8f0; + border-radius: 14px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03); + overflow: hidden; +} + +.table-responsive { + margin-bottom: 0; +} + +.contracts-table { + width: 100%; + margin-bottom: 0; + border-collapse: separate; + border-spacing: 0; +} + +.contracts-table thead th { + background-color: #f8fafc; + color: #475569; + font-size: 0.74rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.04em; + padding: 0.75rem 1rem; + border-bottom: 1.5px solid #e2e8f0; + vertical-align: middle; + white-space: nowrap; +} + +.contracts-table thead th.sortable { + cursor: pointer; + user-select: none; + transition: background-color 0.12s ease; +} + +.contracts-table thead th.sortable:hover { + background-color: #f1f5f9; + color: #0f172a; +} + +.sort-link { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + text-decoration: none; + color: inherit; +} + +.contracts-table tbody tr { + transition: background-color 0.12s ease; +} + +.contracts-table tbody tr:hover { + background-color: #f8fafc; +} + +.contracts-table tbody td { + padding: 0.65rem 1rem; + font-size: 0.85rem; + color: #334155; + border-bottom: 1px solid #f1f5f9; + vertical-align: middle; +} + +.contracts-table tbody tr:last-child td { + border-bottom: none; +} + +/* Code Link Badge */ +.table-code-link { + font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; + font-size: 0.82rem !important; + font-weight: 600 !important; + color: #0f172a !important; + text-decoration: none !important; + white-space: nowrap !important; + display: inline-block; + padding: 3px 8px; + border-radius: 6px; + background-color: #f8fafc; + border: 1px solid #e2e8f0; + transition: all 0.15s ease; +} + +.table-code-link:hover { + color: #2563eb !important; + border-color: #93c5fd; + background-color: #eff6ff; +} + +/* Table Action Button */ +.table-action-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 8px; + color: #64748b; + background-color: transparent; + border: 1px solid transparent; + transition: all 0.15s ease; + text-decoration: none; +} + +.table-action-btn:hover { + color: #0f172a; + background-color: #f1f5f9; + border-color: #cbd5e1; +} + +/* Status Badges */ +.status-badge { + font-size: 0.74rem; + font-weight: 600; + padding: 0.32rem 0.7rem; + border-radius: 9999px; + display: inline-flex; + align-items: center; + gap: 0.3rem; + border: 1px solid transparent; + white-space: nowrap; +} + +.status-badge.pending { + background-color: #fffbeb; + color: #b45309; + border-color: #fde68a; +} + +.status-badge.sent { + background-color: #f0f9ff; + color: #0284c7; + border-color: #bae6fd; +} + +.status-badge.completed { + background-color: #f0fdf4; + color: #16a34a; + border-color: #bbf7d0; +} + +.status-badge.invoiced { + background-color: #faf5ff; + color: #7c3aed; + border-color: #e9d5ff; +} + +.status-badge.paid { + background-color: #ecfdf5; + color: #059669; + border-color: #a7f3d0; +} + +.status-badge.cancelled { + background-color: #fef2f2; + color: #dc2626; + border-color: #fecaca; +} + +/* File Icon Link */ +.file-download-btn { + color: #dc2626; + font-size: 1.15rem; + display: inline-flex; + align-items: center; + justify-content: center; + width: 30px; + height: 30px; + border-radius: 6px; + transition: all 0.15s ease; +} + +.file-download-btn:hover { + color: #b91c1c; + background-color: #fef2f2; +} + +/* Empty State */ +.table-empty-state { + padding: 4rem 1.5rem; + text-align: center; + color: #64748b; +} + +.empty-icon { + font-size: 3rem; + color: #cbd5e1; + margin-bottom: 1rem; +} + +.empty-title { + font-size: 1.1rem; + font-weight: 700; + color: #0f172a; + margin-bottom: 0.35rem; +} + +.empty-desc { + font-size: 0.88rem; + max-width: 420px; + margin: 0 auto 1.25rem auto; +} + +/* Pagination Bar */ +.contracts-pagination-bar { + padding: 0.85rem 1.25rem; + background-color: #ffffff; + border-top: 1px solid #f1f5f9; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 1rem; +} + +.pagination-info { + font-size: 0.85rem; + color: #64748b; +} + +.pagination-nav .pagination { + margin-bottom: 0; + gap: 3px; +} + +.pagination-nav .page-link { + border-radius: 7px; + border: 1px solid #e2e8f0; + color: #334155; + font-size: 0.82rem; + font-weight: 500; + padding: 0.35rem 0.65rem; + min-width: 32px; + text-align: center; + transition: all 0.15s ease; +} + +.pagination-nav .page-link:hover { + background-color: #f1f5f9; + color: #0f172a; + border-color: #cbd5e1; +} + +.pagination-nav .page-item.active .page-link { + background-color: #0f172a; + border-color: #0f172a; + color: #ffffff; + font-weight: 600; +} + +.pagination-nav .page-item.disabled .page-link { + color: #94a3b8; + background-color: #f8fafc; + border-color: #e2e8f0; +} + +/* ─── Airbnb-style Modern Filter Modal ──────────────────── */ +#filterModal .modal-dialog { + max-width: 820px; + margin: 1.5rem auto; +} + +#filterModal .modal-content { + border: 1px solid #e2e8f0; + border-radius: 18px; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + display: flex; + flex-direction: column; + max-height: 88vh; + overflow: hidden; + background-color: #ffffff; +} + +#filterModal .modal-header { + padding: 1.25rem 1.5rem; + border-bottom: 1px solid #f1f5f9; + background-color: #ffffff; +} + +#filterModal .modal-title { + font-size: 1.25rem; + font-weight: 700; + color: #0f172a; + letter-spacing: -0.02em; +} + +#filterModal .btn-close { + font-size: 0.85rem; + padding: 0.5rem; + opacity: 0.5; + transition: opacity 0.15s ease; +} + +#filterModal .btn-close:hover { + opacity: 1; +} + +#filterModal .modal-body { + padding: 1.5rem; + background-color: #f8fafc; + flex: 1; + overflow-y: auto; +} + +#filterModal .modal-footer { + padding: 1rem 1.5rem; + background-color: #ffffff; + border-top: 1px solid #f1f5f9; + flex-shrink: 0; + display: flex; + justify-content: space-between; + align-items: center; +} + +/* Filter Sections */ +.filter-section { + background-color: #ffffff; + border: 1px solid #e2e8f0; + border-radius: 14px; + padding: 1.15rem; + margin-bottom: 1rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02); + transition: border-color 0.15s ease, box-shadow 0.15s ease; +} + +.filter-section:hover { + border-color: #cbd5e1; +} + +.filter-section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.85rem; + gap: 1rem; +} + +.filter-section-header label, +.filter-section-header .section-title { + font-size: 0.95rem; + font-weight: 700; + color: #0f172a; + margin: 0; + letter-spacing: -0.01em; +} + +.filter-section-buttons { + display: flex; + gap: 0.35rem; + margin-left: auto; +} + +.filter-section-buttons button { + padding: 0.25rem 0.65rem; + font-size: 0.75rem; + font-weight: 500; + border-radius: 6px; + border: 1px solid #e2e8f0; + background-color: #ffffff; + color: #64748b; + transition: all 0.15s ease; +} + +.filter-section-buttons button:hover { + background-color: #f1f5f9; + color: #0f172a; + border-color: #cbd5e1; +} + +/* Filter Chips */ +.filter-options { + display: flex; + flex-wrap: wrap; + gap: 0.45rem; +} + +.filter-option { + display: inline-flex; + align-items: center; +} + +.filter-option input[type="checkbox"] { + position: absolute; + opacity: 0; + width: 0; + height: 0; + pointer-events: none; +} + +.filter-option label { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.4rem 0.85rem; + font-size: 0.82rem; + font-weight: 500; + color: #334155; + background-color: #ffffff; + border: 1.5px solid #e2e8f0; + border-radius: 9999px; + cursor: pointer; + transition: all 0.15s ease; + user-select: none; + white-space: nowrap; + margin: 0; +} + +.filter-option label:hover { + background-color: #f8fafc; + border-color: #94a3b8; + color: #0f172a; +} + +/* Default Chips Checked (Thematics) */ +.filter-option input[type="checkbox"]:checked + label:not(.context-badge) { + background-color: #0f172a !important; + border-color: #0f172a !important; + color: #ffffff !important; + font-weight: 600; + box-shadow: 0 2px 6px rgba(15, 23, 42, 0.16); +} + +/* Contextual Status Badges (Filter Modal) */ +.filter-option label.context-badge { + background-color: #ffffff; + border-width: 1.5px; + border-style: solid; + font-weight: 600; +} + +.filter-option label.context-badge.pending { border-color: #f59e0b; color: #d97706; } +.filter-option label.context-badge.sent { border-color: #0284c7; color: #0284c7; } +.filter-option label.context-badge.completed { border-color: #16a34a; color: #16a34a; } +.filter-option label.context-badge.invoiced { border-color: #7c3aed; color: #7c3aed; } +.filter-option label.context-badge.paid { border-color: #059669; color: #059669; } +.filter-option label.context-badge.cancelled { border-color: #dc2626; color: #dc2626; } + +.filter-option input[type="checkbox"]:not(:checked):hover + label.context-badge.pending { background-color: #fffbeb; } +.filter-option input[type="checkbox"]:not(:checked):hover + label.context-badge.sent { background-color: #f0f9ff; } +.filter-option input[type="checkbox"]:not(:checked):hover + label.context-badge.completed { background-color: #f0fdf4; } +.filter-option input[type="checkbox"]:not(:checked):hover + label.context-badge.invoiced { background-color: #faf5ff; } +.filter-option input[type="checkbox"]:not(:checked):hover + label.context-badge.paid { background-color: #ecfdf5; } +.filter-option input[type="checkbox"]:not(:checked):hover + label.context-badge.cancelled { background-color: #fef2f2; } + +.filter-option input[type="checkbox"]:checked + label.context-badge { + color: #ffffff !important; + font-weight: 600; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12); +} + +.filter-option input[type="checkbox"]:checked + label.context-badge.pending { background-color: #f59e0b !important; border-color: #f59e0b !important; } +.filter-option input[type="checkbox"]:checked + label.context-badge.sent { background-color: #0284c7 !important; border-color: #0284c7 !important; } +.filter-option input[type="checkbox"]:checked + label.context-badge.completed { background-color: #16a34a !important; border-color: #16a34a !important; } +.filter-option input[type="checkbox"]:checked + label.context-badge.invoiced { background-color: #7c3aed !important; border-color: #7c3aed !important; } +.filter-option input[type="checkbox"]:checked + label.context-badge.paid { background-color: #059669 !important; border-color: #059669 !important; } +.filter-option input[type="checkbox"]:checked + label.context-badge.cancelled { background-color: #dc2626 !important; border-color: #dc2626 !important; } + +/* Contracts scrollable list in Filter Modal */ +.contracts-filter-container { + background-color: #ffffff; + border: 1.5px solid #e2e8f0; + border-radius: 10px; + padding: 0.5rem; +} + +.contracts-filter-search-box { + position: relative; + margin-bottom: 0.5rem; +} + +.contracts-filter-search-box input { + padding-left: 2rem; + font-size: 0.82rem; + border-radius: 7px; + border-color: #e2e8f0; +} + +.contracts-filter-search-box .search-icon { + position: absolute; + left: 0.65rem; + top: 50%; + transform: translateY(-50%); + color: #94a3b8; + font-size: 0.82rem; +} + +.contracts-filter-scroll { + max-height: 200px; + overflow-y: auto; + padding-right: 0.25rem; +} + +.contract-filter-item { + padding: 0.35rem 0.5rem; + border-radius: 6px; + transition: background-color 0.12s ease; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.contract-filter-item:hover { + background-color: #f8fafc; +} + +.contract-filter-item label { + margin-bottom: 0; + font-size: 0.84rem; + color: #334155; + cursor: pointer; + width: 100%; +} + +@media (max-width: 768px) { + .contracts-header { + flex-direction: column; + align-items: stretch; + } + + .toolbar-actions { + width: 100%; + justify-content: space-between; + } + + .search-widget { + max-width: 100%; + } + + .contracts-pagination-bar { + flex-direction: column; + align-items: center; + text-align: center; + } +} diff --git a/loko/contracts/static/contracts/js/contracts_index.js b/loko/contracts/static/contracts/js/contracts_index.js new file mode 100644 index 0000000..5231145 --- /dev/null +++ b/loko/contracts/static/contracts/js/contracts_index.js @@ -0,0 +1,155 @@ +document.addEventListener('DOMContentLoaded', function() { + // ─── Recherche principale ─── + const searchInput = document.getElementById('main-search-input'); + const searchClearBtn = document.getElementById('main-search-clear'); + const searchBtn = document.getElementById('main-search-btn'); + + function toggleClearBtn() { + if (!searchClearBtn) return; + if (searchInput && searchInput.value.trim().length > 0) { + searchClearBtn.style.display = 'block'; + } else { + searchClearBtn.style.display = 'none'; + } + } + + if (searchInput) { + toggleClearBtn(); + searchInput.addEventListener('input', toggleClearBtn); + + searchInput.addEventListener('keydown', function(e) { + if (e.key === 'Enter') { + e.preventDefault(); + executeSearch(searchInput.value.trim()); + } + }); + } + + if (searchBtn && searchInput) { + searchBtn.addEventListener('click', function() { + executeSearch(searchInput.value.trim()); + }); + } + + if (searchClearBtn) { + searchClearBtn.addEventListener('click', function() { + if (searchInput) { + searchInput.value = ''; + toggleClearBtn(); + } + executeSearch(''); + }); + } + + function executeSearch(query) { + const url = new URL(window.location.href); + if (query) { + url.searchParams.set('search', query); + } else { + url.searchParams.delete('search'); + } + url.searchParams.delete('page'); + url.searchParams.delete('contracts_page'); + window.location.href = url.toString(); + } + + // ─── Sélecteur de taille de page ─── + const pageSizeSelect = document.getElementById('page-size-select'); + if (pageSizeSelect) { + pageSizeSelect.addEventListener('change', function() { + const url = new URL(window.location.href); + url.searchParams.set('page_size', this.value); + url.searchParams.delete('page'); + window.location.href = url.toString(); + }); + } + + // ─── Suppression rapide des filtres actifs (chips) ─── + document.querySelectorAll('.remove-filter-btn').forEach(function(btn) { + btn.addEventListener('click', function(e) { + e.preventDefault(); + const param = this.dataset.param; + const val = this.dataset.val; + const url = new URL(window.location.href); + + if (param === 'search' || param === 'date_from' || param === 'date_to') { + url.searchParams.delete(param); + } else { + const remaining = url.searchParams.getAll(param).filter(v => v !== val); + url.searchParams.delete(param); + remaining.forEach(v => url.searchParams.append(param, v)); + } + + url.searchParams.delete('page'); + url.searchParams.delete('contracts_page'); + window.location.href = url.toString(); + }); + }); + + // ─── Modal de Filtres : Boutons "Tous" / "Aucun" ─── + document.querySelectorAll('.select-all-btn').forEach(function(btn) { + btn.addEventListener('click', function() { + const section = this.closest('.filter-section'); + if (section) { + section.querySelectorAll('input[type="checkbox"]').forEach(function(cb) { + cb.checked = true; + }); + } + }); + }); + + document.querySelectorAll('.deselect-all-btn').forEach(function(btn) { + btn.addEventListener('click', function() { + const section = this.closest('.filter-section'); + if (section) { + section.querySelectorAll('input[type="checkbox"]').forEach(function(cb) { + cb.checked = false; + }); + } + }); + }); + + // ─── Filtrage rapide dans la liste des marchés dans la modale ─── + const contractSearchInput = document.getElementById('contract-filter-search'); + if (contractSearchInput) { + contractSearchInput.addEventListener('input', function() { + const term = this.value.toLowerCase().trim(); + document.querySelectorAll('.contract-filter-item').forEach(function(item) { + const text = item.textContent.toLowerCase(); + if (!term || text.includes(term)) { + item.style.display = 'flex'; + } else { + item.style.display = 'none'; + } + }); + }); + } + + // ─── Synchronisation de l'onglet actif ─── + const tabButtons = document.querySelectorAll('button[data-bs-toggle="tab"]'); + const filterTabInput = document.getElementById('filter-tab-input'); + + tabButtons.forEach(function(btn) { + btn.addEventListener('shown.bs.tab', function(e) { + const targetId = e.target.getAttribute('data-bs-target'); + const tabName = targetId === '#contracts-content' ? 'contracts' : 'orders'; + + if (filterTabInput) { + filterTabInput.value = tabName; + } + + const url = new URL(window.location.href); + url.searchParams.set('tab', tabName); + window.history.replaceState({}, '', url); + }); + }); + + // Restaurer l'onglet actif si spécifié dans l'URL + const currentTabParam = new URLSearchParams(window.location.search).get('tab'); + if (currentTabParam === 'contracts') { + const contractsTabBtn = document.getElementById('contracts-tab'); + if (contractsTabBtn && window.bootstrap && bootstrap.Tab) { + bootstrap.Tab.getOrCreateInstance(contractsTabBtn).show(); + } + } +}); diff --git a/loko/contracts/templates/contracts/contracts_index.html b/loko/contracts/templates/contracts/contracts_index.html index 9e71896..d5de0b6 100644 --- a/loko/contracts/templates/contracts/contracts_index.html +++ b/loko/contracts/templates/contracts/contracts_index.html @@ -3,298 +3,512 @@ {% load i18n %} {% block head %} - - - + {% endblock head %} - {% block content %} -
-
- {% if is_add_order_allowed == True %} - - {% translate "Nouvelle commande" %} - - {% endif %} -
- -
-
- -
-
-
- -
- -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
+ +