Textes projet éditables suivant Grav + écriture atomique du store
- Champ Présentation prérempli avec le texte Grav, suivi modifié/synchro (textOverride undefined = suit Grav, sinon figé ; bouton Réinitialiser) - Fix génération PDF : savePortfolio écrit en atomique (temp+rename) pour éviter la corruption de lecture par l'autosave concurrent du rendu print - Toast d'échec de génération explicite (message serveur) - Refonte architecture visuelle, fond unifié white/tint/full, dispositions couverture bandeau/colonne, instantané public complet, index 3 lignes
This commit is contained in:
@@ -8,6 +8,25 @@ export function formatProjectDate(iso?: string): string {
|
||||
return Number.isNaN(d.getTime()) ? '' : dateFormatter.format(d)
|
||||
}
|
||||
|
||||
/** Mois + année capitalisés (ex. « Juillet 2026 ») ; sans argument = aujourd'hui.
|
||||
* Sert de date par défaut de l'en-tête de couverture. */
|
||||
export function formatMonthYear(iso?: string): string {
|
||||
const d = iso ? new Date(iso) : new Date()
|
||||
if (Number.isNaN(d.getTime())) return ''
|
||||
const s = dateFormatter.format(d)
|
||||
return s.charAt(0).toUpperCase() + s.slice(1)
|
||||
}
|
||||
|
||||
/** Retire le paramètre `target=_blank` que Grav colle à chaque URL — dans une
|
||||
* URL simple comme dans une chaîne HTML (href des liens du corps de texte). */
|
||||
export function stripTargetParam(s?: string): string {
|
||||
if (!s) return ''
|
||||
return s
|
||||
.replace(/\?target=_blank&/g, '?') // seul paramètre en tête, suivi d'autres
|
||||
.replace(/&target=_blank/g, '') // paramètre en fin de chaîne de requête
|
||||
.replace(/\?target=_blank\b/g, '') // seul paramètre
|
||||
}
|
||||
|
||||
export const CATEGORY_LABELS: Record<string, string> = {
|
||||
culturelle: 'Culturelle',
|
||||
publique: 'Publique',
|
||||
|
||||
Reference in New Issue
Block a user