feat(spa): selection de techniques + rapport de campagne PDF#41
Merged
Conversation
Adds a per-technique checkbox in the matrix so an analyst can mark techniques observed in a real campaign. Selection state, free-form notes and the campaign metadata persist in localStorage so they survive a refresh. The header gains: - a "Campagne : N TE" chip when at least one technique is selected - "Effacer" to wipe the selection (with confirm prompt) - "Rapport" to open the report modal The Rapport modal lets the user fill in: - campaign name, observation period, global context - a per-technique observation textarea (visible alongside the matrix description in the printout) The "Imprimer / PDF" action populates a hidden printable container, toggles a body.printing-report class, and triggers window.print(). A dedicated @media print rule then hides the matrix UI and reveals the report container as a clean black-on-white A4 layout. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds an "Exporter JSON" action next to "Imprimer / PDF" in the report modal. The downloaded file is named after the campaign title (slugified) and contains: title, date, free-form notes, generation timestamp, and the full list of selected techniques with phase, tactic, description, sections and the analyst's per-technique observation. PDF and JSON share the same configurable campaign title. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes the export/import loop: the report modal gains an "Importer JSON" button that reads a previously exported campaign file, validates the shape, ignores unknown technique IDs (e.g. from a stale matrix), and restores the selection, observations, title, date and global notes. Confirms before overwriting an existing in-progress selection. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a right-aligned checkbox to each tactic header. Clicking it ticks or unticks every technique under that tactic in one go; toggling individual techniques keeps the parent box in sync (checked when all are selected, indeterminate when some are, unchecked when none). Resync also fires on Clear, on Remove from the report modal, and after importing a campaign JSON. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
BartM82
approved these changes
May 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Ajoute la capacite de marquer des techniques observees dans une campagne reelle et de generer un rapport PDF dedie.
UX
Print stylesheet dedie
Quand l'utilisateur lance l'impression depuis le rapport,
body.printing-reportest ajoute. Le@media printcorrespondant masque la matrice et le header, et affiche un container imprimable propre :Independant des autres PR
Ce PR ne touche que
docs/index.htmlet n'a pas de conflit attendu avec #40 (qui ajoute l'export PDF de la matrice complete) -- les deux features peuvent coexister.Test plan
python -m http.server -d docs 8000, ouvrir le SPAGenerated with Claude Code