feat(compte/vues): Ouvrir via URL courte + bouton copier (#112)
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
import dash_bootstrap_components as dbc
|
import dash_bootstrap_components as dbc
|
||||||
from dash import html
|
from dash import dcc, html
|
||||||
from unidecode import unidecode
|
from unidecode import unidecode
|
||||||
|
|
||||||
from src.utils import DOMAIN_NAME
|
from src.utils import DOMAIN_NAME
|
||||||
@@ -63,19 +63,22 @@ def saved_views_items(views) -> list:
|
|||||||
|
|
||||||
def _view_row(view) -> html.Div:
|
def _view_row(view) -> html.Div:
|
||||||
view_id = view["id"]
|
view_id = view["id"]
|
||||||
|
share_url = build_view_url(view["name"], view["token"])
|
||||||
return html.Div(
|
return html.Div(
|
||||||
className="saved-view-row d-flex align-items-center gap-2 mb-2",
|
className="saved-view-row d-flex align-items-center gap-2 mb-2",
|
||||||
children=[
|
children=[
|
||||||
html.Span(view["name"], className="flex-grow-1"),
|
html.Span(view["name"], className="flex-grow-1"),
|
||||||
dbc.Button(
|
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",
|
"Ouvrir",
|
||||||
href="/tableau",
|
href=share_url,
|
||||||
color="link",
|
color="link",
|
||||||
size="sm",
|
size="sm",
|
||||||
),
|
),
|
||||||
|
dcc.Clipboard(
|
||||||
|
content=share_url,
|
||||||
|
title="Copier le lien vers cette vue",
|
||||||
|
style={"cursor": "pointer", "fontSize": "1.1rem"},
|
||||||
|
),
|
||||||
dbc.Button(
|
dbc.Button(
|
||||||
"Renommer",
|
"Renommer",
|
||||||
id={"type": "vue-rename-open", "index": view_id},
|
id={"type": "vue-rename-open", "index": view_id},
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ class _Row(dict):
|
|||||||
"""Imite un sqlite3.Row : accès par clé."""
|
"""Imite un sqlite3.Row : accès par clé."""
|
||||||
|
|
||||||
|
|
||||||
def _view(view_id, name, query):
|
def _view(view_id, name, query, token="abc123"):
|
||||||
return _Row(id=view_id, name=name, query=query)
|
return _Row(id=view_id, name=name, query=query, token=token)
|
||||||
|
|
||||||
|
|
||||||
def test_bar_style_hidden_for_non_subscriber():
|
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("abc123") == "abc123"
|
||||||
assert ui.token_from_vue_param("") is None
|
assert ui.token_from_vue_param("") is None
|
||||||
assert ui.token_from_vue_param(None) 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
|
||||||
|
|||||||
Reference in New Issue
Block a user