Compare commits

...
Sign in to create a new pull request.

8 commits

Author SHA1 Message Date
isUnknown
02e4cc71a6 untrack claude config 2026-01-08 15:37:34 +01:00
isUnknown
32b20a9305 investigation : ajout système de routes /resume et /detail
Implémentation d'un routing personnalisé permettant d'afficher deux vues
(résumé et détail) à partir d'une seule source de données (investigation.txt).

- Ajout routes virtuelles /enquetes/:slug/resume et /detail
- Ajout controller pour redirection automatique vers /resume
- Mise à jour lien "Lire le rapport" vers page /detail
- URL de base redirige en 301 vers /resume

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-08 15:36:09 +01:00
d9409e689a investigation-summary : rendu des layouts avec blocs
- Création des snippets de blocs (text, heading, image)
- Implémentation du rendu des layouts avec colonnes
- Structure en grille pour layouts multi-colonnes

NOTE : Cette implémentation est à revoir selon la maquette finale.
Le rendu actuel utilise une structure basique en attendant les spécifications de design.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-07 17:50:44 +01:00
4a18a61148 investigation-summary : ajout gestion légendes d'images
- Création du blueprint files/cover.yml avec champs alt et caption
- Configuration uploads.template: cover pour association automatique
- Amélioration affichage légende avec condition isNotEmpty()
- Les métadonnées des images sont désormais éditables via le panel

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-07 17:35:37 +01:00
b0a5bfc4c8 investigation-summary : labels en dur et correction orthographe
- Remplacement des appels dynamiques blueprint()->field()['label'] par les valeurs en dur
- Correction orthographe: methodologys → methodologies dans le blueprint et le template
- Amélioration des performances en évitant les appels dynamiques

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-07 15:53:27 +01:00
ff9fda74c9 investigation-summary : corrections et dynamisation
- Correction des erreurs de casse des méthodes PHP (incidentLocation, incidentConsequences, keywords, methodologys, team, publicationDate)
- Ajout de la date de publication dynamique dans le header
- Remplacement de l'image en dur par le champ cover avec légende dynamique
- Remplacement du paragraphe court par le champ chapo
- Dynamisation de l'affichage des partenaires avec liens
- Remplacement de la section synthèse en dur par le champ body (layouts)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-07 15:15:08 +01:00
bd177c835a début d'intégration page enquete : arret à partners 2026-01-07 13:47:12 +01:00
a44d240b9d blueprint investigation-summary > Ajout d'un champs type entries pour les méthodologies 2026-01-06 18:09:00 +01:00
12 changed files with 351 additions and 59 deletions

View file

@ -3,7 +3,9 @@
"allow": [ "allow": [
"Bash(git add:*)", "Bash(git add:*)",
"Bash(git commit:*)", "Bash(git commit:*)",
"Bash(cat:*)" "Bash(cat:*)",
"Bash(curl:*)",
"Bash(php -l:*)"
], ],
"deny": [], "deny": [],
"ask": [] "ask": []

6
.gitignore vendored
View file

@ -60,5 +60,11 @@ Icon
/vendor/* /vendor/*
# Local # Local
# ---------------
local/ local/
/local/* /local/*
# Claude config
# ---------------
.claude/
/.claude/*

View file

@ -0,0 +1,12 @@
title: Image de couverture
fields:
alt:
label: Texte alternatif
type: text
help: Description de l'image pour l'accessibilité
caption:
label: Légende
type: textarea
size: small
help: Légende affichée sous l'image

View file

@ -0,0 +1,111 @@
title: Investigation
create:
fields:
- subtitle
tabs:
contentTab:
label: Contenu
icon: page
columns:
- width: 2/6
fields:
publicationDate:
label: Date de publication
type: date
display: DD / MM / YYYY
default: today
width: 1/4
- width: 4/6
fields:
subtitle:
label: Sous-titre
type: text
chapo:
label: Chapo
type: writer
nodes: false
buttons: false
cover:
label: Visuel de couverture
type: files
multiple: false
min: 1
layout: cards
size: full
uploads:
template: cover
image:
ratio: 12/7
cover: true
body:
label: Corps
type: layout
layouts:
- "1/1"
- "1/2, 1/2"
- "1/3, 1/3, 1/3"
fieldsets:
- heading
- text
- image
metadataTab:
label: Métadonnées
icon: table
fields:
incidentDate:
label: Date de l'incident
type: date
display: DD / MM / YYYY
width: 1/3
incidentLocation:
label: Lieu de l'incident
type: text
width: 1/3
incidentConsequences:
label: Conséquence(s)
type: text
width: 1/3
keywords:
label: Mots-clés
type: tags
width: 1/2
partners:
label: Partenaire(s)
type: structure
width: 1/2
fields:
name:
label: Nom
type: text
link:
label: Lien
type: link
options:
- url
methodologies:
label: Méthodologie
type: entries
field:
type: text
line:
type: line
team:
label: Équipe
type: structure
columns:
responsability:
width: 1/2
names:
width: 1/2
fields:
responsability:
label: Responsabilité
type: text
width: 1/2
names:
label: Nom
type: entries
width: 1/2
field:
type: text

View file

View file

@ -30,5 +30,53 @@ return [
'campaign_slug' => 'soutenir-index-en-2024', 'campaign_slug' => 'soutenir-index-en-2024',
'campaign_url' => 'https://donorbox.org/soutenir-index-en-2024', 'campaign_url' => 'https://donorbox.org/soutenir-index-en-2024',
'api_base_url' => 'https://donorbox.org/api/v1' 'api_base_url' => 'https://donorbox.org/api/v1'
],
'routes' => [
// Route pour /enquetes/:slug/resume - Page virtuelle résumé
[
'pattern' => 'enquetes/(:any)/resume',
'action' => function($slug) {
$parent = page('enquetes/' . $slug);
if (!$parent) {
return false;
}
if ($parent->intendedTemplate()->name() !== 'investigation') {
return false;
}
// Créer une page virtuelle avec le template investigation-summary
return Page::factory([
'slug' => 'resume',
'template' => 'investigation-summary',
'parent' => $parent,
'content' => $parent->content()->toArray()
]);
}
],
// Route pour /enquetes/:slug/detail - Page virtuelle détail
[
'pattern' => 'enquetes/(:any)/detail',
'action' => function($slug) {
$parent = page('enquetes/' . $slug);
if (!$parent) {
return false;
}
if ($parent->intendedTemplate()->name() !== 'investigation') {
return false;
}
// Créer une page virtuelle avec le template investigation
return Page::factory([
'slug' => 'detail',
'template' => 'investigation',
'parent' => $parent,
'content' => $parent->content()->toArray()
]);
}
]
] ]
]; ];

View file

@ -0,0 +1,62 @@
<?php
/**
* Routes pour les enquêtes (investigations)
*
* Structure des URLs :
* - /enquetes/:slug redirige vers /enquetes/:slug/resume (géré par le controller)
* - /enquetes/:slug/resume affiche le résumé (template investigation-summary)
* - /enquetes/:slug/detail affiche l'enquête complète (template investigation)
*
* Note : La redirection de /enquetes/:slug vers /resume est gérée par le controller
* investigation.php, pas par une route, car les routes ne peuvent pas intercepter
* les pages existantes.
*/
return [
// Route pour /enquetes/:slug/resume - Page virtuelle résumé
[
'pattern' => 'enquetes/(:any)/resume',
'action' => function($slug) {
$parent = page('enquetes/' . $slug);
if (!$parent) {
return false;
}
if ($parent->intendedTemplate()->name() !== 'investigation') {
return false;
}
// Créer une page virtuelle avec le template investigation-summary
return Page::factory([
'slug' => 'resume',
'template' => 'investigation-summary',
'parent' => $parent,
'content' => $parent->content()->toArray()
]);
}
],
// Route pour /enquetes/:slug/detail - Page virtuelle détail
[
'pattern' => 'enquetes/(:any)/detail',
'action' => function($slug) {
$parent = page('enquetes/' . $slug);
if (!$parent) {
return false;
}
if ($parent->intendedTemplate()->name() !== 'investigation') {
return false;
}
// Créer une page virtuelle avec le template investigation
return Page::factory([
'slug' => 'detail',
'template' => 'investigation',
'parent' => $parent,
'content' => $parent->content()->toArray()
]);
}
]
];

View file

@ -0,0 +1,19 @@
<?php
/**
* Controller pour le template investigation
* Redirige automatiquement vers la page /resume
* SAUF si c'est une page virtuelle (resume/detail)
*/
return function ($page) {
// Ne rediriger que si c'est la page "réelle" (pas une page virtuelle)
// Les pages virtuelles ont un slug 'resume' ou 'detail'
if ($page->slug() !== 'resume' && $page->slug() !== 'detail') {
// Redirection 301 vers la page résumé
go($page->url() . '/resume', 301);
}
// Si c'est une page virtuelle, laisser le template s'afficher normalement
return compact('page');
};

View file

@ -0,0 +1,4 @@
<?php
$level = $block->level()->or('h2');
?>
<<?= $level ?>><?= $block->text() ?></<?= $level ?>>

View file

@ -0,0 +1,8 @@
<?php if ($image = $block->image()->toFile()): ?>
<figure>
<img src="<?= $image->url() ?>" alt="<?= $block->alt()->or($image->alt()) ?>">
<?php if ($block->caption()->isNotEmpty()): ?>
<figcaption><?= $block->caption() ?></figcaption>
<?php endif; ?>
</figure>
<?php endif; ?>

View file

@ -0,0 +1 @@
<?= $block->text() ?>

View file

@ -3,29 +3,35 @@
<header> <header>
<p class="page-type">Enquête</p> <p class="page-type">Enquête</p>
<h2>Lexécution de Nidal et Khaled Amirah à Naplouse</h2> <h2><?= $page->title() ?></h2>
<p class="date-publish"></p> <p class="date-publish"><time datetime="<?= $page->publicationDate() ?>"><?= $page->publicationDate()->toDate('d M Y') ?></time></p>
</header> </header>
<div id="hero" class="hero-video"> <div id="hero" class="hero-video">
<figure> <figure>
<img src="/assets/images/Nidal-Khaled-Amirah.png"> <?php if ($cover = $page->cover()->toFile()): ?>
<img src="<?= $cover->url() ?>" alt="<?= $cover->alt() ?>">
<?php endif; ?>
</figure> </figure>
<figcaption>Ici la légende de limage. À partir dimages exclusives, lanalyse conjointe de BTselem et Index démontre que les deux hommes ont été abattus par des soldats israéliens alors quils ne présentaient aucun danger.</figcaption> <?php if ($cover = $page->cover()->toFile()): ?>
<?php if ($cover->caption()->isNotEmpty()): ?>
<figcaption><?= $cover->caption() ?></figcaption>
<?php endif; ?>
<?php endif; ?>
</div> </div>
<div id="banner--page"> <div id="banner--page">
<nav id="nav--page"> <nav id="nav--page">
<ul> <ul>
<li><a href="#">Vidéo</a></li> <li><a href="#hero">Vidéo</a></li>
<li><a href="#">Synthèse</a></li> <li><a href="#section__synthese">Synthèse</a></li>
<li><a href="#">Impacts</a></li> <li><a href="#section__impacts">Impacts</a></li>
<li><a href="#">En lien</a></li> <li><a href="#section__en-lien">En lien</a></li>
</ul> </ul>
</nav> </nav>
<div class="btn--group"> <div class="btn--group">
<button class="btn--bold"><a href="#">Lire le rapport</a></button> <button class="btn--bold"><a href="<?= $page->parent()->url() ?>/detail">Lire le rapport</a></button>
<label for="share-banner__desktop" class="btn--bold-inline no-link">Partager</label> <label for="share-banner__desktop" class="btn--bold-inline no-link">Partager</label>
</div> </div>
@ -35,32 +41,32 @@
</div> </div>
<p class="section__article" id="section__short">À partir dimages exclusives, lanalyse conjointe de BTselem et Index démontre que les deux hommes ont été abattus par des soldats israéliens alors quils ne présentaient aucun danger.</p> <?php if ($page->chapo()->isNotEmpty()): ?>
<div class="section__article" id="section__short"><?= $page->chapo() ?></div>
<?php endif; ?>
<dl class="section__article" id="section__dl"> <dl class="section__article" id="section__dl">
<div class="dl__group"> <div class="dl__group">
<dt>Date de lincident</dt> <dt>Date de l'incident</dt>
<dd><time datetime="2025-06-10">10 juin 2025</time></dd> <dd><time datetime="<?= $page->incidentDate() ?>"><?= $page->incidentDate()->toDate('d M Y') ?></time></dd>
</div> </div>
<div class="dl__group"> <div class="dl__group">
<dt>Lieu de lincident</dt> <dt>Lieu de l'incident</dt>
<dd>Naplouse, Cisjordanie occupée, Palestine</dd> <dd><?= $page->incidentLocation() ?></dd>
</div> </div>
<div class="dl__group"> <div class="dl__group">
<dt>Conséquences</dt> <dt>Conséquence(s)</dt>
<dd>Mort</dd> <dd><?= $page->incidentConsequences() ?></dd>
</div> </div>
<div class="dl__group dl__group__keywords"> <div class="dl__group dl__group__keywords">
<dt>Mots-clés</dt> <dt>Mots-clés</dt>
<dd> <dd>
<ul class="keywords"> <ul class="keywords">
<li><a href="#" target="_blank">Occupation</a></li> <?php foreach ($page->keywords()->split() as $keyword): ?>
<li><a href="#" target="_blank">Colonialité</a></li> <li><a href="#" target="_blank"><?php echo $keyword ?></a></li>
<li><a href="#" target="_blank">Forces armées</a></li> <?php endforeach; ?>
<li><a href="#" target="_blank">Colonialité</a></li>
</ul> </ul>
</dd> </dd>
</div> </div>
@ -68,45 +74,63 @@
<dt>Méthodologie</dt> <dt>Méthodologie</dt>
<dd> <dd>
<ul> <ul>
<li>Reconstitution 3D</li> <?php foreach ($page->methodologies()->toEntries() as $methodology): ?>
<li>Frame-match</li> <li><?php echo $methodology ?></li>
<li>Analyse audiovisuelle</li> <?php endforeach; ?>
</ul> </ul>
</dd> </dd>
</div> </div>
<div class="dl__group"> <div class="dl__group">
<dt>Équipe</dt> <dt>Équipe</dt>
<dd>Nadav Joffe, Basile Trouillet, Francesco Sebregondi, Basile Trouillet, Francesco Sebregondi</dd> <dd>
<?php
$namesList = [];
foreach ($page->team()->toStructure() as $row) {
foreach ($row->names()->toEntries() as $name) {
$namesList[] = $name;
}
}
echo implode(', ', $namesList);
?>
</dd>
</div> </div>
<div class="dl__group"> <div class="dl__group">
<dt>Partenaire(s)</dt> <dt>Partenaire(s)</dt>
<dd><a href="#" target="_blank">BTselem</a></dd> <dd>
<?php
$partnersList = [];
foreach ($page->partners()->toStructure() as $partner) {
if ($partner->link()->isNotEmpty()) {
$partnersList[] = '<a href="' . $partner->link() . '" target="_blank">' . $partner->name() . '</a>';
} else {
$partnersList[] = $partner->name();
}
}
echo implode(', ', $partnersList);
?>
</dd>
</div> </div>
<div class="dl__group"> <div class="dl__group">
<dt>Date de publication</dt> <dt>Date de publication</dt>
<dd><time datetime="2025-12-09">09 dec 2025</time></dd> <dd><time datetime="<?= $page->publicationDate() ?>"><?= $page->publicationDate()->toDate('d M Y') ?></time></dd>
</div> </div>
</dl> </dl>
<?php if ($page->body()->isNotEmpty()): ?>
<div class="section__article" id="section__synthese"> <div class="section__article" id="section__synthese">
<h3 class="section__title">Synthèse</h3> <h3 class="section__title">Synthèse</h3>
<?php foreach ($page->body()->toLayouts() as $layout): ?>
<p>Le 10 juin 2025, lors dun raid de grande envergure dans la vieille ville de Naplouse, les forces armées israéliennes ont tué deux Palestiniens : les frères Nidal et Khaled Amirah. <div class="grid" data-columns="<?= $layout->columns()->count() ?>">
</p> <?php foreach ($layout->columns() as $column): ?>
<p> <div class="column" style="--columns: <?= $column->span() ?>">
Suite à lincident, larmée israélienne a affirmé dans un communiqué que les hommes étaient des « terroristes » qui avaient essayé de semparer de larme dun soldat et en avaient blessé quatre autres. Les soldats auraient alors riposté en tirant sur les deux hommes, les tuant tous les deux. <?= $column->blocks() ?>
</p>
<p>
Cependant, lanalyse vidéo et les témoignages recueillis contredisent cette version des faits. Une enquête menée conjointement par BTselem et Index révèle que les frères Amirah nont à aucun moment posé de danger pour les soldats impliqués. Pourtant, Khaled a été exécuté à bout portant alors quil était maintenu au sol par plusieurs soldats armés, tandis que son frère Nidal a été abattu par un tir dans le dos. Les soldats ont également empêché les secouristes présents de leur prêter assistance.
</p>
<h4>Un sous-titre ici pour tester</h4>
<p>
Les corps de Nidal et de Khaled Amirah sont toujours détenus par les forces armées israéliennes.
</p>
<p>
À Naplouse comme à Jénine des soldats ont été filmés le mois dernier en train dexécuter deux Palestiniens qui sétaient rendus ces images révèlent une politique de “tir à vue”, qui permet à larmée israélienne de faire un usage sans aucun frein de la force létale contre les Palestiniens. Depuis octobre 2023, Israël a tué plus de 1 000 Palestiniens en Cisjordanie occupée.
</p>
</div> </div>
<?php endforeach; ?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<div class="section__article" id="section__impacts"> <div class="section__article" id="section__impacts">
@ -130,7 +154,7 @@
<p class="tag">Judiciaire</p> <p class="tag">Judiciaire</p>
<p class="date">12 Dec 2025</p> <p class="date">12 Dec 2025</p>
<div class="content"> <div class="content">
<p >La justice israélienne déclare ouvrir une enquête sur “les circonstances de la mort de Nidal et Khaled Amirah”. <p >La justice israélienne déclare ouvrir une enquête sur "les circonstances de la mort de Nidal et Khaled Amirah".
</p> </p>
</div> </div>
</div> </div>
@ -139,7 +163,7 @@
<p class="tag">Judiciaire</p> <p class="tag">Judiciaire</p>
<p class="date">12 Dec 2025</p> <p class="date">12 Dec 2025</p>
<div class="content"> <div class="content">
<p >La justice israélienne déclare ouvrir une enquête sur “les circonstances de la mort de Nidal et Khaled Amirah” <p >La justice israélienne déclare ouvrir une enquête sur "les circonstances de la mort de Nidal et Khaled Amirah"
</p> </p>
</div> </div>
@ -149,7 +173,7 @@
<p class="tag">Judiciaire</p> <p class="tag">Judiciaire</p>
<p class="date">12 Dec 2025</p> <p class="date">12 Dec 2025</p>
<div class="content"> <div class="content">
<p>Index présente une série denquêtes récentes au Festival du Réel 2025. <a class="see-more" href="#">Voir plus</a> <p>Index présente une série d'enquêtes récentes au Festival du Réel 2025. <a class="see-more" href="#">Voir plus</a>
</p> </p>
</div> </div>
</div> </div>
@ -164,7 +188,7 @@
<img src="/assets/images/Nahel-visuel1.png"> <img src="/assets/images/Nahel-visuel1.png">
</figure> </figure>
<div class="content"> <div class="content">
<h4 class="title"><a href="/enquetes/l-execution-de-nidal-et-khaled-amirah-a-naplouse" target="_blank">Lhomicide de Nahel Merzouk</a></h4> <h4 class="title"><a href="/enquetes/l-execution-de-nidal-et-khaled-amirah-a-naplouse" target="_blank">L'homicide de Nahel Merzouk</a></h4>
<time datetime="2024-06-27">27 Jun 2024</time> <time datetime="2024-06-27">27 Jun 2024</time>
<ul class="keywords"> <ul class="keywords">
<li><a href="#" target="_blank">Occupation</a></li> <li><a href="#" target="_blank">Occupation</a></li>
@ -216,9 +240,4 @@
<?php snippet('footer') ?> <?php snippet('footer') ?>