{# # ============================================================================ # MOLECULE: ACTION MENU # ============================================================================ # # Menu contextuel réutilisable à travers tous les produits. # Deux modes : # - Panneau seul (défaut) — positionné par JS (Slidia, Serenia) # - Avec trigger intégré — popover CSS relatif (Promptly, Castia) # # ============================================================================ # ORDRE CANONIQUE DES ENTRÉES (à respecter dans TOUS les outils) # ============================================================================ # # 1. Partager # 2. Télécharger / Exporter # 3. Ajouter à Moodia # 4. Renommer # 5. Dupliquer # ── séparateur ── # 6. Supprimer (dangerItems) # # Une entrée absente est SAUTÉE, jamais déplacée : le rang d'une action ne dépend pas des # autres. On passe d'un outil à l'autre plusieurs fois par session, et un menu dont l'ordre # change oblige à relire quatre libellés pour retrouver un geste qu'on faisait sans regarder. # # La logique du classement : ce qui SORT du produit d'abord (partager, exporter, envoyer # ailleurs) — c'est ce pour quoi on ouvre ce menu le plus souvent —, puis ce qui gère # l'élément (renommer, dupliquer), et enfin ce qui le détruit, isolé par son séparateur. # # ============================================================================ # PARAMÈTRES # ============================================================================ # # | Paramètre | Type | Défaut | Description | # |-------------|--------|--------------------|------------------------------------------| # | items | array | [] | Actions principales | # | └ label | string | (requis) | Texte du bouton | # | └ icon | string | null | Nom de l'icône | # | └ href | string | null | Si défini, rendu comme | # | └ attr | object | {} | Attributs HTML (data-action, etc.) | # | dangerItems | array | [] | Actions destructives (rouge) | # | └ ... | — | mêmes que items | | # | └ formAction | string | null | Si défini, wrappé dans un
| # | └ formMethod | string | 'post' | Méthode HTTP du form | # | └ csrfToken | string | null | Token CSRF (input hidden _token) | # | └ formAttr | object | {} | Attributs HTML sur le | # | accentHex | string | '#0C81E4' | Couleur hex du produit (tool_color_details['xxx'].primary) | # | withTrigger | bool | false | Ajoute le bouton ⋮ + wrapper popover | # | position | string | 'right-0 top-full mt-1' | Position du panneau (mode withTrigger) | # | class | string | '' | Classes additionnelles sur le panneau | # # ============================================================================ # EXEMPLES D'UTILISATION # ============================================================================ # # Mode panneau seul (Slidia — positionné par JS) : # # # Mode avec trigger intégré (Promptly, Castia — popover par shared--popover) : # {% include '_molecules/action-menu/action-menu.html.twig' with { # withTrigger: true, # items: [{label: 'Renommer', icon: 'edit', attr: {'data-action': 'click->...#rename'}}], # dangerItems: [{label: 'Supprimer', icon: 'trash', attr: {'data-action': 'click->...#delete'}}], # accentHex: tool_color_details['promptly'].primary # } only %} # # Item lien : # {label: 'Ouvrir', icon: 'arrow-right', href: path('app_...')} # # Item danger avec form POST (CSRF) : # {label: 'Supprimer', icon: 'trash', # formAction: path('app_...delete', {id: entity.id}), # csrfToken: csrf_token('delete-' ~ entity.id), # formAttr: {'data-action': 'submit->...#requestDelete', 'data-podcast-id': entity.id}} # # ============================================================================ #} {% set items = items ?? [] %} {% set dangerItems = dangerItems ?? [] %} {% set accentHex = accentHex ?? '#0C81E4' %} {% set withTrigger = withTrigger ?? false %} {% set position = position ?? 'right-0 top-full mt-1' %} {% set class = class ?? '' %} {% if withTrigger %}
{% endif %}