feat(vues): bouton « Copier le lien » + lien de partage en texte stylé (#112)

- Bouton de copie explicite (icône copy.svg + « Copier le lien » + retour
  « ✓ Copié ») sur /tableau et /compte/vues, via dcc.Clipboard (children /
  copied_children), à la place de l'icône seule.
- Le lien direct s'affiche en texte (span#share-url-text) plutôt qu'un
  <input> : évite la troncature d'affichage du champ Bootstrap form-control en
  flex (zone de texte bloquée ~218px), montre tout le lien avec retour à la
  ligne, et prend la largeur du lien. Stylé comme un champ (bordure, coins
  arrondis, texte 90%).
- Instructions /compte/vues simplifiées ; E2E adapté (#share-url-text).
This commit is contained in:
Colin Maudry
2026-07-13 22:08:00 +02:00
parent 770b7cbdf8
commit e0828a7e13
5 changed files with 68 additions and 22 deletions
+25 -11
View File
@@ -411,21 +411,35 @@ layout = [
className="share-url-box d-none",
children=[
dbc.Label(
"URL directe vers cette vue :",
html_for="share-url-input",
"Lien direct vers cette vue :",
className="mb-0",
),
dcc.Input(
id="share-url-input",
type="text",
readOnly=True,
className="form-control form-control-sm",
style={"maxWidth": "420px"},
# URL affichée comme texte sélectionnable : prend exactement
# sa largeur (pas de champ pleine largeur qui encombre) et
# passe à la ligne si le lien est long (pas de troncature).
html.Span(
id="share-url-text",
className="share-url-text",
style={"wordBreak": "break-all", "minWidth": 0},
),
dcc.Clipboard(
target_id="share-url-input",
target_id="share-url-text",
title="Copier le lien vers cette vue",
style={"cursor": "pointer", "fontSize": "1.1rem"},
className="btn btn-outline-secondary btn-sm "
"d-inline-flex align-items-center",
children=[
html.Img(
src="/assets/copy.svg",
alt="",
style={
"height": "1em",
"verticalAlign": "-0.15em",
"marginRight": "0.35em",
},
),
"Copier le lien",
],
copied_children="✓ Copié",
),
],
),
@@ -714,7 +728,7 @@ _SHARE_BOX_HIDDEN = "share-url-box d-none"
@callback(
Output("share-url-box", "className"),
Output("share-url-input", "value"),
Output("share-url-text", "children"),
Input("active-view", "data"),
)
def render_share_box(active_view):