FEATURE Update sticky column variant
This commit is contained in:
parent
6684470359
commit
a492814103
|
|
@ -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"),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user