Skip to content

Latest commit

 

History

History
1266 lines (892 loc) · 24.7 KB

File metadata and controls

1266 lines (892 loc) · 24.7 KB

Documentation Complète des APIs et Fonctions - Notepad+

Table des Matières

  1. APIs PHP
  2. Fonctions JavaScript
  3. Structure des Données

APIs PHP

🔐 Authentification

api/auth_helper.php

Rôle : Fonctions utilitaires pour la gestion de l'authentification

Fonctions :

  • isUserAuthenticated() - Vérifie si l'utilisateur est connecté (vérifie les cookies)
  • getCurrentUserId() - Récupère l'ID de l'utilisateur actuel
  • getCurrentUserPseudo() - Récupère le pseudo de l'utilisateur actuel
  • requireAuth($redirect = true) - Vérifie l'authentification et redirige vers login si nécessaire

api/connect.php

Rôle : Connexion à la base de données MySQL

Configuration :

  • Host: localhost:3306
  • Database: notpad
  • User: root
  • Charset: utf8
  • Retourne: Objet PDO $con

api/login.php

Rôle : Authentifier un utilisateur via nom d'utilisateur et mot de passe

Méthode : POST

Paramètres (JSON) :

{
  "nom": "string (pseudo utilisateur)",
  "password": "string (mot de passe)"
}

Réponse (JSON) :

{
  "status": "success|error",
  "message": "string",
  "user_id": "string (si succès)",
  "user_pseudo": "string (si succès)"
}

Processus :

  1. Valide que le pseudo et le mot de passe sont fournis
  2. Cherche l'utilisateur dans la table users
  3. Vérifie le mot de passe avec password_verify()
  4. Crée des cookies user_id et user_pseudo (valides 30 jours)
  5. Retourne les données utilisateur

api/logout.php

Rôle : Déconnecter l'utilisateur

Processus :

  1. Supprime les cookies user_id et user_pseudo
  2. Redirige vers /Notepad+/login.php

📝 Gestion des Notes

api/create_note.php

Rôle : Créer une nouvelle note dans un dossier

Méthode : POST

Paramètres (JSON) :

{
  "nom_note": "string (titre)",
  "content_note": "string (contenu HTML Quill)",
  "id_folder": "string (ID du dossier destination)"
}

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "id_note": "string (si succès)"
}

Validations :

  • nom_note et content_note requis
  • nom_note ne doit pas être vide
  • id_folder doit être spécifié

Base Données :

  • Génère un ID unique : note_ + 14 caractères hex
  • Insère dans table note (id_note, nom_note, content_note, folder_note)

api/open_note.php

Rôle : Récupérer le contenu d'une note par son ID

Méthode : GET

Paramètres :

  • note_id (query string) - ID de la note

Réponse (JSON) :

{
  "success": true|false,
  "data": [{ id_note, nom_note, content_note, folder_note }]
}

Limite : Retourne max 40 résultats (limit 40)


api/update_note.php

Rôle : Mettre à jour le contenu d'une note existante

Méthode : POST

Paramètres (JSON) :

{
  "id_note": "string",
  "content_note": "string (contenu HTML Quill)",
  "content_text": "string (optionnel, texte brut)"
}

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "id_note": "string"
}

Validations :

  • id_note et content_note requis
  • Vérifie que la note existe avant de mettre à jour
  • Trim les espaces inutiles

📁 Gestion des Dossiers

api/create_folder.php

Rôle : Créer un nouveau dossier

Méthode : POST

Paramètres (JSON) :

{
  "nom_folder": "string (nom du dossier)",
  "id_folder": "string (ID fourni par le frontend)"
}

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "id_folder": "string (si succès)"
}

Validations :

  • nom_folder ne doit pas être vide
  • id_folder doit être fourni (ID généré au frontend)

api/folder_api.php

Rôle : Récupérer toutes les notes d'un dossier

Méthode : GET

Paramètres :

  • folder_id (query string) - ID du dossier

Réponse (JSON) :

{
  "success": true|false,
  "data": [{ id_note, nom_note, content_note, folder_note }]
}

Limite : Retourne max 40 notes


api/update_folder.php

Rôle : Mettre à jour le nom d'un dossier

Méthode : POST

Paramètres (JSON) :

{
  "nom_folder": "string (nouveau nom)",
  "id_folder": "string (ID du dossier)"
}

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "id_folder": "string"
}

Validations :

  • nom_folder et id_folder requis
  • Les deux ne doivent pas être vides

🛣️ Gestion des Roadmaps

api/create_roadmap.php

Rôle : Créer une nouvelle roadmap avec ses nœuds et arêtes

Méthode : POST

Authentification : Requiert utilisateur connecté

Paramètres (JSON) :

{
  "titre": "string (optionnel, défaut: 'Roadmap sans titre')",
  "description": "string (optionnel)",
  "nodes": [
    {
      "id": number,
      "type": "pill|rect|circle|diamond|note",
      "x": number,
      "y": number,
      "label": "string",
      "description": "string",
      "status": "planned|in_progress|done|blocked",
      "color": "blue|teal|amber|red|green|gray",
      "tags": "string",
      "date": "string"
    }
  ],
  "edges": [
    {
      "id": number,
      "from": number (nodeId),
      "to": number (nodeId),
      "label": "string",
      "style": "solid|dashed"
    }
  ]
}

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "nodesCount": number,
  "edgesCount": number,
  "userId": "string",
  "roadmapId": number
}

Processus :

  1. Vérifie l'authentification
  2. Convertit nodes et edges en JSON
  3. Insère dans table roadmap avec timestamp
  4. Retourne le nombre de nœuds/arêtes créés

api/get_roadmap.php

Rôle : Récupérer une roadmap spécifique ou la plus récente de l'utilisateur

Méthode : GET

Authentification : Requiert utilisateur connecté

Paramètres :

  • id (query string, optionnel) - ID de la roadmap

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "nodes": [],
  "edges": [],
  "count": number,
  "roadmapId": number,
  "titre": "string",
  "description": "string",
  "dateCreation": "datetime"
}

Logique :

  • Si id fourni : récupère la roadmap avec cet ID
  • Sinon : récupère la plus récente de l'utilisateur (ORDER BY date_creation DESC LIMIT 1)

api/get_roadmaps.php

Rôle : Récupérer TOUTES les roadmaps de l'utilisateur connecté

Méthode : GET

Authentification : Requiert utilisateur connecté

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "roadmaps": [
    {
      "id": number,
      "titre": "string",
      "description": "string",
      "nodes": "string (JSON)",
      "edges": "string (JSON)",
      "date_creation": "datetime",
      "date_mod": "datetime"
    }
  ],
  "count": number
}

Tri : ORDER BY date_creation DESC (les plus récentes en premier)


api/update_roadmap.php

Rôle : Mettre à jour une roadmap existante (nodes, edges, titre, description)

Méthode : POST

Authentification : Requiert utilisateur connecté + propriétaire de la roadmap

Paramètres (JSON) :

{
  "id": number (ID de la roadmap),
  "titre": "string (optionnel)",
  "description": "string (optionnel)",
  "nodes": [],
  "edges": []
}

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "nodesCount": number,
  "edgesCount": number
}

Processus :

  1. Vérifie l'authentification
  2. Vérifie que l'utilisateur possède la roadmap
  3. Convertit nodes et edges en JSON
  4. Met à jour les champs fournis (dynamique)
  5. Met à jour date_mod au timestamp actuel

api/delete_roadmap.php

Rôle : Supprimer une roadmap après confirmation

Méthode : POST

Authentification : Requiert utilisateur connecté + propriétaire de la roadmap

Paramètres (JSON) :

{
  "id": number (ID de la roadmap)
}

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "roadmapId": number
}

Sécurité :

  • Vérifie que l'utilisateur est propriétaire (id_uti)
  • Retourne erreur 403 si non autorisé

🔍 Recherche et Utilitaires

api/search.php

Rôle : Rechercher des notes ET dossiers par mot-clé

Méthode : GET

Paramètres :

  • query (query string) - Terme de recherche

Réponse (JSON) :

{
  "success": true|false,
  "data": {
    "notes": [],
    "folders": []
  }
}

Processus :

  1. Cherche dans note.nom_note avec LIKE %query%
  2. Cherche dans folder.nom_folder avec LIKE %query%
  3. Retourne max 40 résultats pour chaque type

api/paste_notes.php

Rôle : Copier ou déplacer (couper) des notes vers un autre dossier

Méthode : POST

Paramètres (JSON) :

{
  "note_ids": ["note_id1", "note_id2"],
  "target_folder_id": "string",
  "is_cut": true|false
}

Réponse (JSON) :

{
  "success": true|false,
  "message": "string",
  "success_count": number,
  "error_count": number
}

Logique :

  • Si is_cut: true : UPDATE folder_note pour chaque note
  • Si is_cut: false : INSERT nouvelle note avec ID unique copié

api/delete_all.php

Rôle : Supprimer toutes les notes (probablement pour reset/nettoyage)



Fonctions JavaScript

🎨 Interface Utilisateur - Affichage des Sections

cleanUri()

Rôle : Nettoie l'URL et charge la section appropriée selon l'hash

Utilisation : Appelée au chargement et lors de changements d'URL


affiErreurPage()

Rôle : Affiche une page d'erreur 404 ou erreur générale


affidash()

Rôle : Affiche le dashboard principal (vue d'accueil)


affiNote()

Rôle : Affiche la section des notes (liste des notes)


affiprog()

Rôle : Affiche la section "Programme"


afficate()

Rôle : Affiche la section des catégories


affipara()

Rôle : Affiche les paramètres de l'utilisateur


affiroad()

Rôle : Affiche la section des roadmaps


updateResponsiveLayout()

Rôle : Gère la mise en page responsive (mobile/desktop) et adapte l'interface


📋 Gestion des Notes

openNote(id, folder_Id)

Rôle : Ouvre une note pour la lire/éditer

Paramètres :

  • id - ID de la note (note_XXXX)
  • folder_Id - ID du dossier parent

Processus :

  1. Appelle /api/open_note.php?note_id=id
  2. Charge le contenu dans Quill Editor
  3. Affiche un preview côté droit
  4. Active le mode édition

closeNote()

Rôle : Ferme la note actuelle et retourne à la liste


displayNotePreview(noteHtml)

Rôle : Affiche un aperçu du rendu HTML de la note dans le panneau droit


toggleNotePreview(show = true)

Rôle : Affiche/masque le panneau de preview côté droit


loadNoteContentIntoQuill(quillInstance, noteHtml)

Rôle : Charge le contenu HTML d'une note dans l'éditeur Quill


switchToEditMode()

Rôle : Bascule l'interface en mode édition (cache preview, active Quill)


updatePreviewStats(noteHtml)

Rôle : Met à jour les statistiques affichées en bas du preview (caractères, mots, etc.)


getEditorContentForDB()

Rôle : Récupère le contenu HTML et texte brut de Quill pour sauvegarde en DB

Retour : { html, text }


saveEditorContent()

Rôle : Sauvegarde le contenu actuel en DB

Appelle : /api/update_note.php via POST


refreshNoteDisplay()

Rôle : Actualise l'affichage de la note après une modification


updateStats()

Rôle : Met à jour les statistiques globales (nombre de notes, mots, caractères)


openCreateNoteModal()

Rôle : Ouvre le modal pour créer une nouvelle note


closeCreateNoteModal()

Rôle : Ferme le modal de création de note


submitNote()

Rôle : Soumet la création d'une nouvelle note

Appelle : /api/create_note.php


📁 Gestion des Dossiers

openFolder(folderId)

Rôle : Ouvre un dossier et affiche ses notes

Paramètres :

  • folderId - ID du dossier

Appelle : /api/folder_api.php?folder_id=folderId


closeFolder(folderId)

Rôle : Ferme un dossier (le masque dans l'arborescence)


generateFolderId()

Rôle : Génère un ID unique pour un nouveau dossier

Format : folder_ + 14 caractères hex


openCreateFolderModal()

Rôle : Ouvre le modal pour créer un nouveau dossier


closeCreateFolderModal()

Rôle : Ferme le modal de création de dossier


submitFolder()

Rôle : Soumet la création d'un nouveau dossier

Appelle : /api/create_folder.php


openUpdateFolderModal()

Rôle : Ouvre le modal pour renommer un dossier


closeUpdateFolderModal()

Rôle : Ferme le modal de mise à jour du dossier


updade_folder()

Rôle : Prépare les données pour la mise à jour d'un dossier


submitUpdateFolder()

Rôle : Soumet la mise à jour du nom du dossier

Appelle : /api/update_folder.php


clickFolders()

Rôle : Gère la sélection/déselection des dossiers


deleteFolder(folderId)

Rôle : Supprime un dossier (après confirmation)


📝 Gestion du Contenu (Notes et Sélections)

clickNote()

Rôle : Gère la sélection des notes


DeselectAll()

Rôle : Désélectionne tous les dossiers sélectionnés


DeselectAllNotes()

Rôle : Désélectionne toutes les notes sélectionnées


copyNotes()

Rôle : Copie les notes sélectionnées dans un dossier

Stocke : { selectedNotes, isCut: false }


cutNotes()

Rôle : Coupe les notes sélectionnées pour les déplacer

Stocke : { selectedNotes, isCut: true }


pasteNotes()

Rôle : Colle les notes copié vers le dossier actuel

Appelle : /api/paste_notes.php


deleteNote(noteId)

Rôle : Supprime une note après confirmation


searchAll(param)

Rôle : Effectue une recherche globale dans notes et dossiers

Appelle : /api/search.php?query=param


showDeleteConfirmationModal(type, itemName)

Rôle : Affiche un modal de confirmation avant suppression

Paramètres :

  • type - Type d'élément ("note" ou "folder")
  • itemName - Nom de l'élément à supprimer

closeDeleteConfirmationModal()

Rôle : Ferme le modal de confirmation


confirmDelete()

Rôle : Confirme et exécute la suppression


deleteElement()

Rôle : Supprime l'élément sélectionné (routing vers deleteNote ou deleteFolder)


📊 Gestion des Roadmaps

loadRoadmapsFromDB()

Rôle : Charge TOUTES les roadmaps de l'utilisateur depuis la DB

Appelle : /api/get_roadmaps.php

Retour : Tableaux de roadmaps


displayRoadmaps(roadmaps)

Rôle : Affiche les roadmaps sous forme de cartes (cards) dans une grille

Affiche pour chaque : titre, description, nombre de nœuds/arêtes, date de création


loadRoadmapFromDB()

Rôle : Charge une roadmap spécifique par son ID et l'initialise dans l'éditeur

Appelle : /api/get_roadmap.php?id=roadmapId


createNewRoadmap()

Rôle : Crée une nouvelle roadmap vierge

Processus :

  1. Reset nodes et edges
  2. Affiche l'éditeur (cache la liste)
  3. Demande le titre et description via modals

createRoadmap()

Rôle : Enregistre une nouvelle roadmap en DB

Appelle : /api/create_roadmap.php


editRoadmap(roadmapId)

Rôle : Charge une roadmap existante pour l'éditer

Processus :

  1. Appelle loadRoadmapFromDB()
  2. Affiche l'éditeur
  3. Initialise le canvas avec les nœuds/arêtes

saveRoadmapToDB()

Rôle : Sauvegarde les modifications d'une roadmap existante

Appelle : /api/update_roadmap.php


deleteRoadmap(roadmapId)

Rôle : Supprime une roadmap après confirmation

Appelle : /api/delete_roadmap.php


showRoadmapList()

Rôle : Affiche la vue liste de toutes les roadmaps


showRoadmapEditor()

Rôle : Affiche la vue éditeur de roadmap


🎨 Éditeur Canvas (Roadmap)

render()

Rôle : Re-render du canvas avec les nœuds et arêtes actuels


renderProps()

Rôle : Met à jour le panneau de propriétés du nœud sélectionné


renderPreview()

Rôle : Génère une aperçu visuelle complète de la roadmap (pv-stage)

Crée :

  • SVG pour les arêtes avec flèches
  • HTML pour les nœuds (cartes) avec styling
  • Dimensions adaptées au contenu

openPreview()

Rôle : Affiche l'aperçu


closePreview()

Rôle : Ferme l'aperçu


onNodeDown(e)

Rôle : Gère le clic sur un nœud (sélection, déplacement)


onEdgeClick(e)

Rôle : Gère le clic sur une arête (sélection + édition)


startPalDrag(e, shape)

Rôle : Démarre le drag-and-drop depuis la palette (palette → canvas)

Paramètres :

  • shape - Type de forme ("pill", "rect", "circle", "diamond", "note")

addNode(type, x, y, extra)

Rôle : Ajoute un nouveau nœud au canvas

Paramètres :

  • type - Type du nœud
  • x, y - Coordonnées
  • extra - Propriétés optionnelles

setMode(m)

Rôle : Change le mode du canvas ("select", "connect", "delete")


setDefColor(c)

Rôle : Définit la couleur par défaut pour les nouveaux nœuds


sp(k, v)

Rôle : Set Property - Modifie une propriété du nœud sélectionné

Paramètres :

  • k - Clé de propriété (label, color, status, etc.)
  • v - Nouvelles valeur

sep2(k, v)

Rôle : Set Edge Property - Modifie une propriété de l'arête sélectionnée


delSel()

Rôle : Supprime l'élément sélectionné (nœud ou arête)


📤 Export (SVG/PNG)

buildExportSVG()

Rôle : Construit un document SVG complet de la roadmap

Crée :

  • Background blanc
  • Marker de flèches SVG
  • Toutes les arêtes avec connecteurs
  • Tous les nœuds avec styling (couleurs, texte, badges)
  • Ombres et détails visuels

Retour : { svg, W, H } - Élément SVG + dimensions


svgText(parent, content, x, y, size, weight, fill, anchor, ns)

Rôle : Helper pour ajouter un élément <text> SVG avec styling


truncSVG(s, n)

Rôle : Tronque un texte avec "…" s'il dépasse n caractères (pour SVG)


doExportSVG()

Rôle : Exporte la roadmap en fichier SVG avec styles du preview

Processus :

  1. Si html2canvas disponible : capture le preview + convertit en PNG embedé
  2. Sinon : fallback sur buildExportSVG()
  3. Télécharge le fichier roadmap.svg

fallbackExportSVG()

Rôle : Fallback SVG sans html2canvas

Utilise : buildExportSVG() directement


doExportPNG()

Rôle : Exporte la roadmap en fichier PNG avec styles du preview

Processus :

  1. Si html2canvas disponible : capture le preview détectement
  2. Sinon : fallback sur canvas drawing
  3. Télécharge le fichier roadmap.png

fallbackExportPNG()

Rôle : Fallback PNG sans html2canvas

Processus :

  1. Convertit SVG en image
  2. Dessine sur canvas (scale 2x)
  3. Exporte en PNG

drawRoadmapToCanvas(ctx, width, height)

Rôle : Helper pour dessiner directement sur un canvas 2D

Dessine :

  1. Toutes les arêtes (lignes)
  2. Toutes les cartes (rectangles + texte)

Récupère styles des éléments DOM


downloadCanvasAsPNG(canvas)

Rôle : Convertit un canvas en Blob PNG et déclenche le téléchargement


🎯 Utilitaires et Helpers

cardH(n)

Rôle : Calcule la hauteur d'une carte (nœud) basée sur son contenu


ccx(n)

Rôle : Retourne la coordonnée X du centre d'un nœud


ccy(n)

Rôle : Retourne la coordonnée Y du centre d'un nœud


ctr(n)

Rôle : Retourne le centre (x, y) d'un nœud : { x, y }


epts(fn, tn)

Rôle : Calcule les points d'entrée/sortie entre deux nœuds pour les arêtes


svgXY(e)

Rôle : Convertit les coordonnées souris en coordonnées canvas SVG

Retour : { x, y } relatives au canvas


trunc(s, n)

Rôle : Tronque un texte avec "…" s'il dépasse n caractères


truncSVG(s, n)

Rôle : Variant SVG de trunc()


esc(s)

Rôle : Échappe les caractères HTML spéciaux (&, <, >, ")


nodeHTML(n)

Rôle : Génère l'HTML d'un nœud pour l'affichage en preview


edgeHTML(e)

Rôle : Génère l'HTML d'une arête pour l'affichage en preview


alignLine()

Rôle : Aligne les éléments sélectionnés en ligne (horizontalement)


alignGrand()

Rôle : Aligne les éléments sélectionnés en grille


applyDisplayPreferences()

Rôle : Applique les préférences d'affichage de l'utilisateur (thème, etc.)


GetPreference(PrefVal)

Rôle : Récupère une préférence utilisateur stockée


switchTab(tab, el)

Rôle : Bascule entre onglets de l'interface


clearAll()

Rôle : Vide complètement la roadmap (nodes=[], edges=[])


logout()

Rôle : Déconnecte l'utilisateur

Appelle : /api/logout.php



Structure des Données

📊 Nœud (Node)

{
  id: number,                    // ID unique
  type: "pill|rect|circle|diamond|note",
  x: number,                     // Position X
  y: number,                     // Position Y
  label: "string",              // Titre/Nom
  description: "string",        // Description optionnelle
  status: "planned|in_progress|done|blocked",
  color: "blue|teal|amber|red|green|gray",
  tags: "string",               // Tags séparés par virgules
  date: "YYYY-MM-DD"           // Date optionnelle
}

🔗 Arête (Edge)

{
  id: number,
  from: number,                 // ID du nœud source
  to: number,                   // ID du nœud destination
  label: "string",             // Label de la relation
  style: "solid|dashed"        // Style de la ligne
}

📝 Note (Database)

{
  id_note: "note_XXXXXXXXXXXXXXXX",
  nom_note: "string",
  content_note: "string (HTML Quill)",
  folder_note: "folder_XXXXXXXXXXXXXXXX"
}

📁 Dossier (Folder - Database)

{
  id_folder: "folder_XXXXXXXXXXXXXXXX",
  nom_folder: "string"
}

🛣️ Roadmap (Database)

{
  id: number,
  titre: "string",
  description: "string",
  nodes: "JSON string",
  edges: "JSON string",
  date_creation: "datetime",
  date_mod: "datetime",
  id_uti: "user_id"
}

👤 Utilisateur (User - Database)

{
  id_uti: "string",
  pseudo: "string",
  password: "string (hashed)",
  email: "string"
}

Constantes Globales

C - Palette de Couleurs

{
  blue: { f: "#dbeafe", s: "#3b82f6", t: "#1e3a8a" },
  teal: { f: "#ccfbf1", s: "#14b8a6", t: "#134e4a" },
  amber: { f: "#fef3c7", s: "#f59e0b", t: "#78350f" },
  red: { f: "#fee2e2", s: "#ef4444", t: "#7f1d1d" },
  green: { f: "#dcfce7", s: "#22c55e", t: "#064e3b" },
  gray: { f: "#f3f4f6", s: "#6b7280", t: "#1f2937" }
}
  • f : fill (fond)
  • s : stroke (bordure)
  • t : text (texte)

BAR - Couleurs de Barre

ST_L - Labels de Statut

{
  planned: "Planifié",
  in_progress: "En cours",
  done: "Fait",
  blocked: "Bloqué"
}

DIMS - Dimensions des Nœuds

{
  pill: { w: 200, h: 48 },
  rect: { w: 200, h: "dynamic" },
  circle: { w: 64, h: 64 },
  diamond: { w: 130, h: 130 },
  note: { w: 200, h: "dynamic" }
}

Flux d'Utilisation Principal

Création de Roadmap

  1. Utilisateur clique "Nouvelle Roadmap"
  2. createNewRoadmap() demande titre + description via modal
  3. createRoadmap() appelle /api/create_roadmap.php
  4. Canvas s'affiche vierge
  5. Utilisateur ajoute nœuds via drag-drop palette
  6. Utilisateur crée arêtes en mode "connect"
  7. saveRoadmapToDB() sauvegarde via /api/update_roadmap.php

Édition de Roadmap

  1. Utilisateur clique sur une roadmap dans la liste
  2. editRoadmap(id) appelle /api/get_roadmap.php
  3. Nœuds et arêtes sont parsés depuis JSON
  4. Canvas affiche la roadmap
  5. Modification des propriétés via panneau droit
  6. saveRoadmapToDB() sauvegarde les changements

Export de Roadmap

  1. Utilisateur clique "Aperçu"
  2. openPreview() affiche le rendu complet en plein écran
  3. Utilisateur clique "SVG" ou "PNG"
  4. doExportSVG() ou doExportPNG() utilise html2canvas
  5. Fichier est généré et téléchargé

Dernière mise à jour : 2026-04-01