diff --git a/public/assets/svg/marker-pin.svg b/public/assets/svg/marker-pin.svg new file mode 100644 index 0000000..6df71cc --- /dev/null +++ b/public/assets/svg/marker-pin.svg @@ -0,0 +1 @@ + diff --git a/public/site/templates/narrative.json.php b/public/site/templates/narrative.json.php index e8388a8..08b067a 100644 --- a/public/site/templates/narrative.json.php +++ b/public/site/templates/narrative.json.php @@ -106,9 +106,14 @@ function parseBlocks($blocksField, $page) { break; case 'map': - $blockData['content'] = [ - 'map' => $block->map()->value() - ]; + $mapPage = $block->map()->toPages()->first(); + if ($mapPage) { + $blockData['content'] = parseCarte($mapPage); + } else { + $blockData['content'] = [ + 'map' => $block->map()->value() + ]; + } break; default: @@ -135,18 +140,40 @@ function parseChapter($chapter) { ]; } +/** + * Parse un marqueur + */ +function parseMarker($marker) { + return [ + 'title' => $marker->title()->value(), + 'cover' => resolveFileUrl($marker->cover(), $marker), + 'icon' => $marker->markerIcon()->toFile() ? $marker->markerIcon()->toFile()->url() : null, + 'iconSize' => $marker->markerIconSize()->value() ?? 40, + 'blocks' => parseBlocks($marker->text(), $marker) + ]; +} + /** * Parse une carte */ function parseCarte($carte) { + $markers = []; + foreach ($carte->children()->listed() as $child) { + if ($child->intendedTemplate()->name() === 'marker') { + $markers[] = parseMarker($child); + } + } + $staticImage = $carte->file('map-static.png'); return [ - 'id' => $carte->id(), - 'uuid' => $carte->uuid()->toString(), + 'id' => $carte->id(), + 'uuid' => $carte->uuid()->toString(), 'template' => 'carte', - 'title' => $carte->title()->value(), - 'slug' => $carte->slug(), - 'tags' => $carte->tags()->isNotEmpty() ? $carte->tags()->split() : [], - 'text' => resolveImagesInHtml($carte->text()->value(), $carte) + 'title' => $carte->title()->value(), + 'slug' => $carte->slug(), + 'tags' => $carte->tags()->isNotEmpty() ? $carte->tags()->split() : [], + 'image' => $staticImage ? $staticImage->url() : null, + 'intro' => resolveImagesInHtml($carte->text()->value(), $carte), + 'markers' => $markers ]; } @@ -154,10 +181,13 @@ function parseCarte($carte) { * Parse un geoformat */ function parseGeoformat($geoformat) { - $chapters = []; + $children = []; foreach ($geoformat->children()->listed() as $child) { - if ($child->intendedTemplate()->name() === 'chapter') { - $chapters[] = parseChapter($child); + $template = $child->intendedTemplate()->name(); + if ($template === 'chapter') { + $children[] = parseChapter($child); + } elseif ($template === 'map') { + $children[] = parseCarte($child); } } @@ -171,7 +201,7 @@ function parseGeoformat($geoformat) { 'tags' => $geoformat->tags()->isNotEmpty() ? $geoformat->tags()->split() : [], 'cover' => resolveFileUrl($geoformat->cover(), $geoformat), 'text' => resolveImagesInHtml($geoformat->text()->value(), $geoformat), - 'children' => $chapters + 'children' => $children ]; } @@ -197,7 +227,7 @@ foreach ($page->children()->listed() as $child) { if ($template === 'geoformat') { $data['children'][] = parseGeoformat($child); - } elseif ($template === 'carte') { + } elseif ($template === 'map') { $data['children'][] = parseCarte($child); } } diff --git a/src/components/PagedJsWrapper.vue b/src/components/PagedJsWrapper.vue index 8c749df..b7ef613 100644 --- a/src/components/PagedJsWrapper.vue +++ b/src/components/PagedJsWrapper.vue @@ -63,11 +63,41 @@ class="carte" :data-page-type="item.template" > -
[Carte: {{ content.map }}]