FEATURE Update sticky column variant

This commit is contained in:
Antoine M 2026-02-04 11:12:52 +01:00
parent 6684470359
commit a492814103

View File

@ -1,23 +1,18 @@
import { registerBlockStyle } from "@wordpress/blocks"; import { registerBlockStyle } from "@wordpress/blocks";
import { addFilter } from "@wordpress/hooks"; import { addFilter } from "@wordpress/hooks";
import { import { createElement, cloneElement, Children } from "@wordpress/element";
createElement,
Fragment,
cloneElement,
Children,
} from "@wordpress/element";
import { createHigherOrderComponent } from "@wordpress/compose"; import { createHigherOrderComponent } from "@wordpress/compose";
// Enregistrement du style de bloc // Enregistrement du style de bloc
registerBlockStyle("core/column", { registerBlockStyle("core/columns", {
name: "sticky-column", name: "sticky-columns",
label: "Colonne sticky", label: "Colonnes sticky",
}); });
// Fonction pour vérifier si le style sticky-columns est appliqué // Fonction pour vérifier si le style sticky-columns est appliqué
const hasStickyColumnStyle = (attributes) => { const hasStickyColumnsStyle = (attributes) => {
const className = attributes?.className || ""; const className = attributes?.className || "";
return className.includes("is-style-sticky-column"); return className.includes("is-style-sticky-columns");
}; };
// ----------------------------- // -----------------------------
@ -28,7 +23,10 @@ addFilter(
"carhop/sticky-columns-wrapper", "carhop/sticky-columns-wrapper",
(element, blockType, attributes) => { (element, blockType, attributes) => {
// Vérifier si c'est le bloc core/columns et si le style sticky-columns est appliqué // Vérifier si c'est le bloc core/columns et si le style sticky-columns est appliqué
if (blockType.name !== "core/column" || !hasStickyColumnStyle(attributes)) { if (
blockType.name !== "core/columns" ||
!hasStickyColumnsStyle(attributes)
) {
return element; return element;
} }
@ -37,47 +35,68 @@ addFilter(
return element; return element;
} }
// Envelopper les enfants dans une div avec la classe "sticky-column-wrapper" // Envelopper chaque colonne individuellement dans une div avec la classe "test"
const wrappedChildren = createElement( const children = Children.toArray(element.props.children);
"div", const wrappedChildren = children.map((child, index) => {
{ className: "sticky-column-wrapper" }, // Si c'est un élément React (une colonne), l'envelopper dans une div
element.props.children, if (child && typeof child === "object" && child.type) {
); return createElement(
"div",
{ key: `sticky-column-wrapper-${index}`, className: "test" },
child,
);
}
// Sinon, retourner tel quel
return child;
});
// Retourner l'élément avec les enfants enveloppés // Retourner l'élément avec les enfants enveloppés
return createElement( return cloneElement(element, {
element.type, ...element.props,
{ children: wrappedChildren,
...element.props, });
children: wrappedChildren,
},
wrappedChildren,
);
}, },
); );
// ----------------------------- // -----------------------------
// 2. Modifier l'affichage dans l'éditeur pour envelopper les colonnes dans une div avec la classe "test" // 2. Modifier l'affichage dans l'éditeur pour envelopper les colonnes dans une div avec la classe "test"
// Note: Le rendu côté serveur est géré par render.php
// Pour l'éditeur, on utilise un filtre sur BlockEdit pour modifier le rendu
// ----------------------------- // -----------------------------
addFilter( addFilter(
"editor.BlockEdit", "editor.BlockEdit",
"carhop/sticky-columns-editor-wrapper", "carhop/sticky-columns-editor-wrapper",
createHigherOrderComponent((BlockEdit) => { createHigherOrderComponent((BlockEdit) => {
return (props) => { return (props) => {
// Vérifier si c'est le bloc core/column et si le style sticky-column est appliqué // Vérifier si c'est le bloc core/columns et si le style sticky-columns est appliqué
if ( if (
props.name !== "core/column" || props.name !== "core/columns" ||
!hasStickyColumnStyle(props.attributes) !hasStickyColumnsStyle(props.attributes)
) { ) {
return <BlockEdit {...props} />; return <BlockEdit {...props} />;
} }
console.log(props);
return createElement( // Récupérer le rendu du bloc
"div", const blockEditElement = <BlockEdit {...props} />;
{ className: "sticky-column-wrapper" },
<BlockEdit {...props} />, // Si l'élément a des enfants (les inner blocks), on les enveloppe dans une div avec la classe "test"
); if (
blockEditElement &&
blockEditElement.props &&
blockEditElement.props.children
) {
// Cloner l'élément et envelopper les enfants dans une div avec la classe "test"
return cloneElement(blockEditElement, {
...blockEditElement.props,
children: createElement(
"div",
{ className: "test" },
blockEditElement.props.children,
),
});
}
return blockEditElement;
}; };
}, "withStickyColumnWrapper"), }, "withStickyColumnsWrapper"),
); );