From 0e0fb322228a4075f27869e06010b3a9faacb9d0 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Mon, 13 Jul 2026 17:35:53 +0200 Subject: [PATCH] feat(compte/vues): Ouvrir via URL courte + bouton copier (#112) --- src/saved_views/ui.py | 13 ++++++++----- tests/saved_views/test_ui.py | 19 +++++++++++++++++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/saved_views/ui.py b/src/saved_views/ui.py index 68dcafb..063d1dc 100644 --- a/src/saved_views/ui.py +++ b/src/saved_views/ui.py @@ -1,7 +1,7 @@ import re import dash_bootstrap_components as dbc -from dash import html +from dash import dcc, html from unidecode import unidecode from src.utils import DOMAIN_NAME @@ -63,19 +63,22 @@ def saved_views_items(views) -> list: def _view_row(view) -> html.Div: view_id = view["id"] + share_url = build_view_url(view["name"], view["token"]) return html.Div( className="saved-view-row d-flex align-items-center gap-2 mb-2", children=[ html.Span(view["name"], className="flex-grow-1"), dbc.Button( - # Limitation connue : la vue n'est pas appliquée automatiquement - # en arrivant sur /tableau depuis cette page. Le mécanisme de - # rappel multi-page reste à faire (voir tableau.py `apply_saved_view`). "Ouvrir", - href="/tableau", + href=share_url, color="link", size="sm", ), + dcc.Clipboard( + content=share_url, + title="Copier le lien vers cette vue", + style={"cursor": "pointer", "fontSize": "1.1rem"}, + ), dbc.Button( "Renommer", id={"type": "vue-rename-open", "index": view_id}, diff --git a/tests/saved_views/test_ui.py b/tests/saved_views/test_ui.py index 5c062ea..187811b 100644 --- a/tests/saved_views/test_ui.py +++ b/tests/saved_views/test_ui.py @@ -5,8 +5,8 @@ class _Row(dict): """Imite un sqlite3.Row : accès par clé.""" -def _view(view_id, name, query): - return _Row(id=view_id, name=name, query=query) +def _view(view_id, name, query, token="abc123"): + return _Row(id=view_id, name=name, query=query, token=token) def test_bar_style_hidden_for_non_subscriber(): @@ -96,3 +96,18 @@ def test_token_from_vue_param(): assert ui.token_from_vue_param("abc123") == "abc123" assert ui.token_from_vue_param("") is None assert ui.token_from_vue_param(None) is None + + +def test_view_row_open_uses_short_url(monkeypatch): + monkeypatch.setattr(ui, "DOMAIN_NAME", "test.colibre.fr") + row = ui._view_row(_view(1, "Mes Marchés", "q", token="tok123")) + text = str(row) + assert "https://test.colibre.fr/tableau?vue=mes-marches_tok123" in text + + +def test_view_row_has_clipboard_with_url(monkeypatch): + monkeypatch.setattr(ui, "DOMAIN_NAME", "test.colibre.fr") + row = ui._view_row(_view(1, "Mes Marchés", "q", token="tok123")) + text = str(row) + assert "Clipboard" in text + assert "Copier le lien" in text