Commit Graph

307 Commits

Author SHA1 Message Date
caeb9f989f fix: conserver le focus du champ de recherche après navigation
Le form ne remount plus lors de nos propres navigations (recherche,
filtres, clear) — le focus est préservé. Le remount ne se fait que
lors de navigations externes (back/forward du navigateur) pour syncer
les valeurs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 18:08:25 +02:00
69de2ae237 feat: loader discret dans la barre de recherche pendant la navigation
Utilise useTransition pour wrapper les router.replace dans LiveSearchForm.
Affiche un petit spinner à droite du champ de recherche pendant que les
résultats se chargent (books, series, authors).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 18:06:12 +02:00
3998d65694 fix: aligner la page livre sur le layout de la page série
- Cover w-48 → w-40 (cohérent avec la page série)
- Titre séparé, auteur + série + statut de lecture regroupés en badges
- Métadonnées (format, pages, langue, ISBN, date) en ligne texte
  au lieu de pills (style série)
- Toolbar d'actions groupée en bas (Edit, MarkRead, Convert, Delete)
- Tous les boutons d'action (MarkBookRead, Convert, Delete) alignés en
  py-1.5 au lieu de Button size=sm (h-9)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 18:03:38 +02:00
5757517d84 fix: harmoniser la hauteur des boutons dans la toolbar série
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 45s
- ProwlarrSearchModal: py-2 → py-1.5, gap-2 → gap-1.5 (aligné avec les autres)
- DeleteSeriesButton: remplace Button size=sm (h-9) par bouton inline
  avec py-1.5 cohérent avec le reste de la toolbar

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:58:13 +02:00
bedb588f50 fix: envoyer expected_volumes lors d'un replace pour tracker le download
Quand on fait un replace sans volumes manquants, expected_volumes n'était
pas envoyé → is_managed=false → pas d'insertion dans torrent_downloads
→ le torrent n'apparaissait pas dans la page downloads.

Maintenant un replace avec libraryId envoie toujours expected_volumes
(même vide) pour garantir le tracking.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:52:16 +02:00
ad0e9e5fa4 chore: bump version to 2.18.0 2026-03-29 17:52:07 +02:00
0cce4e50a7 fix: toujours afficher le bouton replace dans la modale Prowlarr
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
alwaysShowReplace suffit maintenant à montrer le bouton replace,
même quand allVolumes est vide (série complète sans volumes manquants).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:36:37 +02:00
25355d6827 chore: bump version to 2.17.0 2026-03-29 17:33:41 +02:00
2d44885826 feat: suppression de série entière (dossier + livres + métadonnées)
Backend:
- Ajoute DELETE /libraries/:id/series/:name dans series.rs
- Supprime tous les fichiers physiques des livres de la série
- Supprime le dossier de la série (remove_dir_all)
- Nettoie en DB : books, series_metadata, external_metadata_links,
  anilist_series_links, available_downloads
- Queue un scan job pour cohérence

Frontend:
- Crée DeleteSeriesButton.tsx avec modale de confirmation
- Ajouté dans la toolbar de la page détail série
- i18n fr/en pour les textes de confirmation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:33:40 +02:00
3e4c9e888a chore: bump version to 2.16.0
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 49s
2026-03-29 17:25:41 +02:00
e4df93456d fix: retirer le terme "manquant" des badges de volumes dans les résultats Prowlarr
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:23:28 +02:00
3d2c8c78bf feat: regroupement des releases par titre identique dans la UI
- Prowlarr search modal : les releases avec le même titre sont groupées
  avec rowSpan sur la colonne titre, sources listées en sous-lignes
- Downloads page : même logique, titre + volumes affichés une seule fois,
  sources (indexer, seeders, taille, boutons) en lignes compactes
- Fonction utilitaire groupReleasesByTitle() dans les deux composants

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:17:24 +02:00
f8f2e9fe71 chore: bump version to 2.15.0 2026-03-29 17:08:29 +02:00
e34d7a671a refactor: Phase E — types de réponses API standardisés + SVGs inline → Icon
E1 - API responses:
- Crée responses.rs avec OkResponse, DeletedResponse, UpdatedResponse,
  RevokedResponse, UnlinkedResponse, StatusResponse (6 tests de sérialisation)
- Remplace ~15 json!() inline par des types structurés dans books, libraries,
  tokens, users, handlers, anilist, metadata, download_detection, torrent_import
- Signatures de retour des handlers typées (plus de serde_json::Value)

E2 - SVGs → Icon component:
- Ajoute icon "lock" au composant Icon
- Remplace ~30 SVGs inline par <Icon> dans 9 composants
  (FolderPicker, FolderBrowser, LiveSearchForm, JobRow, LibraryActions,
  ReadingStatusModal, EditBookForm, EditSeriesForm, UserSwitcher)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:02:39 +02:00
2670969d7e refactor: Phase D — composant Modal réutilisable + utilitaire searchParams
- Crée Modal.tsx dans components/ui (backdrop, container, header sticky, close button)
- Remplace le scaffolding modal dupliqué dans EditBookForm, EditSeriesForm,
  DeleteBookButton, MetadataSearchModal (4 composants)
- Crée lib/searchParams.ts avec paramString, paramStringOr, paramInt, paramBool
- Simplifie le parsing des query params dans books, series, authors pages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 12:23:50 +02:00
b8ed77f3f2 chore: bump version to 2.14.21
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 40s
2026-03-29 07:59:36 +02:00
42c4cdfdbd chore: bump version to 2.14.20
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 21s
2026-03-29 07:51:00 +02:00
9f3b48ed62 chore: bump version to 2.14.19
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 12s
2026-03-29 07:45:52 +02:00
10a508e610 feat: suppression de livres + import insensible aux accents
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 40s
- Ajout DELETE /books/:id : supprime le fichier physique, la thumbnail,
  le book en DB et queue un scan de la lib. Bouton avec confirmation
  sur la page de détail du livre.
- L'import torrent utilise unaccent() en SQL pour matcher les séries
  indépendamment des accents (ex: "les géants" = "les geants").
- Fallback filesystem avec strip_accents pour les séries sans livre en DB.
- Migration 0069: activation de l'extension PostgreSQL unaccent.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 19:10:06 +01:00
02f85a5d7b chore: bump version to 2.14.18 2026-03-28 19:09:37 +01:00
9b04a79330 feat: suppression individuelle de releases dans les available downloads
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 39s
Ajoute DELETE /available-downloads/:id?release=N pour supprimer une
release spécifique du JSON array (supprime l'entrée série si c'est
la dernière). Bouton trash sur chaque release dans la page downloads.

Corrige aussi le parsing des ranges de volumes sans préfixe sur le
second nombre (T17-23 détecte maintenant T17 à T23).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 17:51:09 +01:00
5e6217cc30 chore: bump version to 2.14.17 2026-03-28 17:50:41 +01:00
67d4ebade9 chore: bump version to 2.14.16
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 41s
2026-03-28 17:44:15 +01:00
002bcc0acf fix: désactiver le Router Cache client pour les pages dynamiques
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
La navigation client-side (via Link) servait des pages cachées,
empêchant les recherches de fonctionner sans Ctrl+R.
staleTimes.dynamic: 0 force Next.js à toujours re-fetcher les pages
dynamiques lors de la navigation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:09:56 +01:00
5b3e4c6f8b chore: bump version to 2.14.15 2026-03-28 14:08:47 +01:00
9a3ab27886 chore: bump version to 2.14.14
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 40s
2026-03-28 13:33:08 +01:00
622fc98490 chore: bump version to 2.14.13 2026-03-28 13:32:51 +01:00
dc3b2467e1 chore: bump version to 2.14.12
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 43s
2026-03-28 13:26:45 +01:00
03e4fce5f9 feat: unifier la recherche livres via le endpoint /books avec paramètre q
La recherche utilise désormais le endpoint paginé /books avec un filtre
ILIKE sur title/series/author, ce qui permet la pagination des résultats.
Les series_hits sont toujours récupérés en parallèle via searchBooks.
Corrige aussi le remount du LiveSearchForm lors de la navigation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:23:51 +01:00
aa1a501adf chore: bump version to 2.14.11 2026-03-28 09:30:50 +01:00
ce10c3cbe4 chore: bump version to 2.14.10
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
2026-03-28 08:53:16 +01:00
0555cb85b1 chore: bump version to 2.14.9
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 57s
2026-03-28 08:50:27 +01:00
00f5564f05 feat: modale Prowlarr avec bouton remplacer + fix parseur volumes
- Modale Prowlarr (page série) : remplacé le bouton qBittorrent brut
  par QbittorrentDownloadButton avec suivi managé (libraryId,
  seriesName, expectedVolumes) et bouton "télécharger et remplacer".
- Ajout de alwaysShowReplace pour la modale Prowlarr (toujours montrer
  le bouton remplacer) vs la page downloads (seulement si allVolumes >
  expectedVolumes).
- Fix parseur : les tags de version entre crochets [V2], [V3] ne sont
  plus extraits comme volumes (le préfixe "v" est ignoré après "[").
- Progression qBittorrent : utilise directement le champ progress
  (completed et amount_left sont non-fiables sur qBittorrent 4.3.2).
- Référence import : ne plus exclure les volumes attendus de la
  recherche de référence (corrige le mauvais dossier/nommage quand
  tous les volumes sont dans expected_volumes).
- allVolumes ajouté à ProwlarrRelease (backend + frontend).
- flex-wrap sur les pastilles volumes dans la modale Prowlarr.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 17:27:34 +01:00
8d48b7669f chore: bump version to 2.14.8
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 47s
2026-03-27 17:04:24 +01:00
733d3f981e chore: bump version to 2.14.7
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 41s
2026-03-27 16:47:41 +01:00
9a6b74604f chore: bump version to 2.14.6
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 43s
2026-03-27 16:37:17 +01:00
152e0a06e5 chore: bump version to 2.14.5 2026-03-27 16:26:30 +01:00
da966ce59a chore: bump version to 2.14.4
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 44s
2026-03-27 16:09:56 +01:00
eabb88eb9d feat: bouton télécharger et remplacer + fix extraction volumes UTF-8
- Ajout d'un bouton "télécharger et remplacer" avec popup de
  confirmation, qui passe tous les volumes du pack (pas seulement
  les manquants) et replace_existing=true à l'API.
- Nouvelle colonne replace_existing dans torrent_downloads.
- Fix critique du parseur de volumes : le pass 2 mélangeait les
  indices d'octets (String::find) avec les indices de caractères
  (Vec<char>), causant un décalage quand le titre contenait des
  caractères multi-octets (é, à...). "Tome #097" extrayait 9
  au lieu de 97. Réécrit en indexation char pure.
- Le préfixe "tome" skip désormais "#" (tome #097 → 97).
- Protection intra-batch : si une destination est déjà utilisée,
  le fichier garde son nom original au lieu d'écraser.
- Alerte WARN si N fichiers source donnent N/3 volumes uniques.
- Nettoyage du répertoire sl-{id} et de la catégorie qBittorrent
  après import.
- Badges volumes en flex-wrap dans la page downloads.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 16:01:08 +01:00
9c18802864 chore: bump version to 2.14.3
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 46s
2026-03-27 15:51:59 +01:00
c94a4d4407 chore: bump version to 2.14.2
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 44s
2026-03-27 15:34:22 +01:00
c3bdbc32d1 chore: bump version to 2.14.1
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
2026-03-27 15:08:44 +01:00
4a706f6b52 chore: bump version to 2.14.0
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 49s
2026-03-27 14:10:34 +01:00
4ca0d1980c chore: bump version to 2.13.3
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
2026-03-27 13:54:04 +01:00
b748c41ba4 chore: bump version to 2.13.2
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 43s
2026-03-27 13:49:26 +01:00
ac6358437a fix: réinitialiser le bouton de téléchargement après 5 secondes
Le bouton revient à son état initial après l'icône verte de
confirmation, permettant de relancer un téléchargement si besoin.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 13:49:18 +01:00
336ffa759b fix: rafraîchir la liste des téléchargements disponibles côté client
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 47s
La section "available downloads" n'était jamais mise à jour après le
chargement initial car seuls les torrent downloads étaient rafraîchis.
Stocke latestFound en state React et le rafraîchit en parallèle.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 13:11:05 +01:00
fc3810e9c3 chore: bump version to 2.13.1 2026-03-27 13:09:55 +01:00
d86396e395 feat: lien vers la série sur les noms dans la liste des téléchargements
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 50s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 13:01:09 +01:00
f580df85eb chore: bump version to 2.13.0 2026-03-27 13:00:10 +01:00