FEATURE ibntroducing the story timeline blocks
This commit is contained in:
parent
61503f2753
commit
d99a296280
28
plugins/carhop-blocks/src/story-timeline-step/block.json
Normal file
28
plugins/carhop-blocks/src/story-timeline-step/block.json
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://schemas.wp.org/trunk/block.json",
|
||||||
|
"apiVersion": 3,
|
||||||
|
"name": "carhop-blocks/story-timeline-step",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"title": "Étape de timeline",
|
||||||
|
"category": "carhop-blocks",
|
||||||
|
"icon": "calendar",
|
||||||
|
"description": "Étape de timeline pour la mise en forme d'une étape de timeline",
|
||||||
|
"example": {},
|
||||||
|
"parent": [
|
||||||
|
"carhop-blocks/story-timeline"
|
||||||
|
],
|
||||||
|
"supports": {
|
||||||
|
"html": false
|
||||||
|
},
|
||||||
|
"textdomain": "carhop-blocks",
|
||||||
|
"editorScript": "file:./index.js",
|
||||||
|
"editorStyle": "file:./index.css",
|
||||||
|
"style": "file:./style-index.css",
|
||||||
|
"viewScript": "file:./view.js",
|
||||||
|
"attributes": {
|
||||||
|
"year": {
|
||||||
|
"type": "number",
|
||||||
|
"default": 2025
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
77
plugins/carhop-blocks/src/story-timeline-step/edit.js
Normal file
77
plugins/carhop-blocks/src/story-timeline-step/edit.js
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
import { __ } from "@wordpress/i18n";
|
||||||
|
import { useBlockProps, InnerBlocks } from "@wordpress/block-editor";
|
||||||
|
import "./editor.scss";
|
||||||
|
import {
|
||||||
|
PanelBody,
|
||||||
|
Card,
|
||||||
|
CardBody,
|
||||||
|
CardHeader,
|
||||||
|
TextControl,
|
||||||
|
Button,
|
||||||
|
__experimentalNumberControl as NumberControl,
|
||||||
|
} from "@wordpress/components";
|
||||||
|
import { InspectorControls } from "@wordpress/block-editor";
|
||||||
|
|
||||||
|
import { RichText } from "@wordpress/block-editor";
|
||||||
|
|
||||||
|
export default function Edit({ attributes, setAttributes, ...props }) {
|
||||||
|
const { year } = attributes;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<InspectorControls>
|
||||||
|
<PanelBody title={__("Étape de timeline", "carhop-blocks")}>
|
||||||
|
<NumberControl
|
||||||
|
label={__("Année", "carhop-blocks")}
|
||||||
|
value={year}
|
||||||
|
onChange={(value) => {
|
||||||
|
const n = parseInt(value, 10);
|
||||||
|
setAttributes({ year: Number.isFinite(n) ? n : undefined });
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</PanelBody>
|
||||||
|
</InspectorControls>
|
||||||
|
<div
|
||||||
|
{...useBlockProps({
|
||||||
|
className: `story-timeline-step`,
|
||||||
|
id: `year-${year}`,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<p className="story-timeline-step__year">{year}</p>
|
||||||
|
<div className="story-timeline-step__innerblocks">
|
||||||
|
<InnerBlocks
|
||||||
|
allowedBlocks={[
|
||||||
|
"core/heading",
|
||||||
|
"core/paragraph",
|
||||||
|
"core/group",
|
||||||
|
"core/list",
|
||||||
|
"core/button",
|
||||||
|
"core/image",
|
||||||
|
"core/buttons",
|
||||||
|
"core/columns",
|
||||||
|
"core/post-title",
|
||||||
|
"core/embed",
|
||||||
|
"core/quote",
|
||||||
|
"core/pullquote",
|
||||||
|
"core/media-text",
|
||||||
|
"core/table",
|
||||||
|
"carhop-blocks/image-stack",
|
||||||
|
"carhop-blocks/heading",
|
||||||
|
"carhop-blocks/decorative-shapes",
|
||||||
|
"carhop-blocks/scroll-story-block",
|
||||||
|
"carhop-blocks/cta-group",
|
||||||
|
"carhop-blocks/audio-player",
|
||||||
|
"carhop-blocks/localisation-map",
|
||||||
|
"carhop-blocks/notice-panel",
|
||||||
|
"acf/statistics-datas",
|
||||||
|
"ninja-forms/form",
|
||||||
|
"gravityforms/form",
|
||||||
|
"dynamiques-blocks/sitemap",
|
||||||
|
"mailpoet/subscription-form-block",
|
||||||
|
"shortcode",
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
|
||||||
24
plugins/carhop-blocks/src/story-timeline-step/index.js
Normal file
24
plugins/carhop-blocks/src/story-timeline-step/index.js
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { registerBlockType } from "@wordpress/blocks";
|
||||||
|
import "./style.scss";
|
||||||
|
|
||||||
|
import Edit from "./edit";
|
||||||
|
import save from "./save";
|
||||||
|
import metadata from "./block.json";
|
||||||
|
|
||||||
|
registerBlockType(metadata.name, {
|
||||||
|
icon: {
|
||||||
|
foreground: "#136f63",
|
||||||
|
src: (
|
||||||
|
<svg width="100" height="100" viewBox="0 0 100 100">
|
||||||
|
<g stroke="null" id="svg_10" class="fills">
|
||||||
|
<path
|
||||||
|
stroke="null"
|
||||||
|
d="m3.74998,19.74151c0,-8.82607 7.16546,-15.99153 15.99153,-15.99153l60.51698,0c8.82607,0 15.99153,7.16546 15.99153,15.99153l0,60.51698c0,8.82607 -7.16546,15.99153 -15.99153,15.99153l-60.51698,0c-8.82607,0 -15.99153,-7.16546 -15.99153,-15.99153l0,-60.51698zm22.57628,3.44915l0,53.61867l23.67374,-18.7148l23.67374,18.7148l0,-53.61867l-47.34748,0z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
edit: Edit,
|
||||||
|
save,
|
||||||
|
});
|
||||||
18
plugins/carhop-blocks/src/story-timeline-step/save.js
Normal file
18
plugins/carhop-blocks/src/story-timeline-step/save.js
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { useBlockProps, InnerBlocks } from "@wordpress/block-editor";
|
||||||
|
|
||||||
|
export default function save({ attributes }) {
|
||||||
|
const { year } = attributes;
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
{...useBlockProps.save({
|
||||||
|
className: `story-timeline-step`,
|
||||||
|
id: `year-${year}`,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<p className="story-timeline-step__year">{year}</p>
|
||||||
|
<div className="story-timeline-step__innerblocks">
|
||||||
|
<InnerBlocks.Content />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
20
plugins/carhop-blocks/src/story-timeline/block.json
Normal file
20
plugins/carhop-blocks/src/story-timeline/block.json
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://schemas.wp.org/trunk/block.json",
|
||||||
|
"apiVersion": 3,
|
||||||
|
"name": "carhop-blocks/story-timeline",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"title": "Timeline",
|
||||||
|
"category": "carhop-blocks",
|
||||||
|
"icon": "calendar-alt",
|
||||||
|
"description": "Boite de timeline pour la mise en forme d'une timeline",
|
||||||
|
"example": {},
|
||||||
|
"supports": {
|
||||||
|
"html": false
|
||||||
|
},
|
||||||
|
"textdomain": "carhop-blocks",
|
||||||
|
"editorScript": "file:./index.js",
|
||||||
|
"editorStyle": "file:./index.css",
|
||||||
|
"style": "file:./style-index.css",
|
||||||
|
"viewScript": "file:./view.js",
|
||||||
|
"render": "file:./render.php"
|
||||||
|
}
|
||||||
40
plugins/carhop-blocks/src/story-timeline/edit.js
Normal file
40
plugins/carhop-blocks/src/story-timeline/edit.js
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
import { __ } from "@wordpress/i18n";
|
||||||
|
import { useBlockProps, InnerBlocks } from "@wordpress/block-editor";
|
||||||
|
import { useSelect } from "@wordpress/data";
|
||||||
|
import "./editor.scss";
|
||||||
|
|
||||||
|
export default function Edit({ attributes, setAttributes, ...props }) {
|
||||||
|
const years = useSelect(
|
||||||
|
(select) => {
|
||||||
|
const { getBlocks } = select("core/block-editor");
|
||||||
|
const childBlocks = getBlocks(props.clientId) || [];
|
||||||
|
return childBlocks
|
||||||
|
.filter((b) => b.name === "carhop-blocks/story-timeline-step")
|
||||||
|
.map((b) => b.attributes?.year)
|
||||||
|
.filter((y) => y !== undefined && y !== null && y !== "");
|
||||||
|
},
|
||||||
|
[props.clientId]
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section
|
||||||
|
{...useBlockProps({
|
||||||
|
className: `story-timeline`,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<aside className="story-timeline__years">
|
||||||
|
<ul>
|
||||||
|
{years.map((y, idx) => (
|
||||||
|
<li key={idx} className="story-timeline__year">
|
||||||
|
{y}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<div className="story-timeline__innerblocks">
|
||||||
|
<InnerBlocks allowedBlocks={["carhop-blocks/story-timeline-step"]} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
1
plugins/carhop-blocks/src/story-timeline/editor.scss
Normal file
1
plugins/carhop-blocks/src/story-timeline/editor.scss
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
|
||||||
24
plugins/carhop-blocks/src/story-timeline/index.js
Normal file
24
plugins/carhop-blocks/src/story-timeline/index.js
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { registerBlockType } from "@wordpress/blocks";
|
||||||
|
import "./style.scss";
|
||||||
|
|
||||||
|
import Edit from "./edit";
|
||||||
|
import save from "./save";
|
||||||
|
import metadata from "./block.json";
|
||||||
|
|
||||||
|
registerBlockType(metadata.name, {
|
||||||
|
icon: {
|
||||||
|
foreground: "#136f63",
|
||||||
|
src: (
|
||||||
|
<svg width="100" height="100" viewBox="0 0 100 100">
|
||||||
|
<g stroke="null" id="svg_10" class="fills">
|
||||||
|
<path
|
||||||
|
stroke="null"
|
||||||
|
d="m3.74998,19.74151c0,-8.82607 7.16546,-15.99153 15.99153,-15.99153l60.51698,0c8.82607,0 15.99153,7.16546 15.99153,15.99153l0,60.51698c0,8.82607 -7.16546,15.99153 -15.99153,15.99153l-60.51698,0c-8.82607,0 -15.99153,-7.16546 -15.99153,-15.99153l0,-60.51698zm22.57628,3.44915l0,53.61867l23.67374,-18.7148l23.67374,18.7148l0,-53.61867l-47.34748,0z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
edit: Edit,
|
||||||
|
save,
|
||||||
|
});
|
||||||
28
plugins/carhop-blocks/src/story-timeline/render.php
Normal file
28
plugins/carhop-blocks/src/story-timeline/render.php
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?php
|
||||||
|
$wrapper_attributes = get_block_wrapper_attributes(array('class' => 'story-timeline'));
|
||||||
|
|
||||||
|
$years = array();
|
||||||
|
if (isset($block) && is_object($block) && ! empty($block->inner_blocks)) {
|
||||||
|
foreach ($block->inner_blocks as $inner_block) {
|
||||||
|
if (isset($inner_block->name) && $inner_block->name === 'carhop-blocks/story-timeline-step') {
|
||||||
|
$y = isset($inner_block->attributes['year']) ? $inner_block->attributes['year'] : null;
|
||||||
|
if ($y !== null && $y !== '') {
|
||||||
|
$years[] = $y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<section <?php echo $wrapper_attributes; ?>>
|
||||||
|
<aside class="story-timeline__years">
|
||||||
|
<ul>
|
||||||
|
<?php foreach ($years as $y) : ?>
|
||||||
|
<li class="story-timeline__year"><a href="#year-<?php echo esc_attr($y); ?>"><?php echo esc_html($y); ?></a></li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
<div class="story-timeline__innerblocks" id="<?php echo esc_attr($years[0]); ?>">
|
||||||
|
<?php echo $content; ?>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
5
plugins/carhop-blocks/src/story-timeline/save.js
Normal file
5
plugins/carhop-blocks/src/story-timeline/save.js
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
import { useBlockProps, InnerBlocks } from "@wordpress/block-editor";
|
||||||
|
|
||||||
|
export default function save({ attributes }) {
|
||||||
|
return <InnerBlocks.Content />;
|
||||||
|
}
|
||||||
0
plugins/carhop-blocks/src/story-timeline/style.scss
Normal file
0
plugins/carhop-blocks/src/story-timeline/style.scss
Normal file
67
plugins/carhop-blocks/src/story-timeline/view.js
Normal file
67
plugins/carhop-blocks/src/story-timeline/view.js
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
const timeline = document.querySelector(
|
||||||
|
".wp-block-carhop-blocks-story-timeline"
|
||||||
|
);
|
||||||
|
if (!timeline) return;
|
||||||
|
|
||||||
|
function initBlock() {
|
||||||
|
const years = timeline.querySelectorAll(".story-timeline__year");
|
||||||
|
years.forEach((year, index) => {
|
||||||
|
year.setAttribute("data-active", index === 0 ? "true" : "false");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function removePreviousActiveLinkInSidebar() {
|
||||||
|
const activeSidebarLinks = document.querySelectorAll(
|
||||||
|
`.story-timeline__years .story-timeline__year[data-active="true"]`
|
||||||
|
);
|
||||||
|
|
||||||
|
activeSidebarLinks.forEach((sidebarLink) => {
|
||||||
|
sidebarLink.setAttribute("data-active", "false");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const timelineStepsProgressionObserver = new IntersectionObserver(
|
||||||
|
(entries) => {
|
||||||
|
// Ne pas traiter les entrées si l'observer est en pause (pendant un clic)
|
||||||
|
// const isIntersetionObserverPaused = getChapterObserverPausedState();
|
||||||
|
// if (isIntersetionObserverPaused) return;
|
||||||
|
|
||||||
|
entries.forEach((entry) => {
|
||||||
|
const blockId = entry.target.getAttribute("id");
|
||||||
|
const relatedStepLink = document.querySelector(`a[href="#${blockId}"]`);
|
||||||
|
console.log(relatedStepLink);
|
||||||
|
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
removePreviousActiveLinkInSidebar();
|
||||||
|
// setActiveLinkInSidebar();
|
||||||
|
|
||||||
|
entry.target.setAttribute("active", "true");
|
||||||
|
relatedStepLink?.parentElement?.setAttribute("data-active", "true");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rootMargin: "-10% 0px -50% 0px",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const timelineSteps = document.querySelectorAll(
|
||||||
|
".story-timeline__innerblocks .wp-block-carhop-blocks-story-timeline-step"
|
||||||
|
);
|
||||||
|
console.log(timelineSteps);
|
||||||
|
timelineSteps.forEach((step) => {
|
||||||
|
timelineStepsProgressionObserver.observe(step);
|
||||||
|
});
|
||||||
|
|
||||||
|
initBlock();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialiser les écouteurs de liens
|
||||||
|
// observeChapterLinks();
|
||||||
|
|
||||||
|
// // Observer tous les titres h2 de l'article
|
||||||
|
// const titlesBlocks = document.querySelectorAll('.article-content h2');
|
||||||
|
// titlesBlocks.forEach((block) => {
|
||||||
|
// chapterProgressionObserver.observe(block);
|
||||||
|
// });
|
||||||
Loading…
Reference in New Issue
Block a user