homegrade_blocks_production/blocks/timeline/src/edit.js

355 lines
8.9 KiB
JavaScript

import { __ } from "@wordpress/i18n";
import "./editor.scss";
import "./timeline-step";
import {
useBlockProps,
RichText,
InnerBlocks,
InspectorControls,
MediaReplaceFlow,
MediaPlaceholder,
BlockControls,
} from "@wordpress/block-editor";
import { useEffect } from "@wordpress/element";
import { useSelect, dispatch } from "@wordpress/data";
import {
PanelBody,
PanelRow,
Button,
RadioControl,
ToggleControl,
ToolbarGroup,
ToolbarButton,
__experimentalToggleGroupControl as ToggleGroupControl,
__experimentalToggleGroupControlOption as ToggleGroupControlOption,
} from "@wordpress/components";
import { trash } from "@wordpress/icons";
import {
headingLevel1,
headingLevel2,
headingLevel3,
headingLevel4,
headingLevel5,
} from "@wordpress/icons";
export default function Edit({ attributes, setAttributes, clientId }) {
let {
hasStepPictures,
lateralPicturesFormat,
hasStepIcons,
hasLateralCover,
lateralCoverId,
lateralCoverAlt,
lateralCoverUrl,
lateralCoverDescription,
lateralCoverCaption,
blockTitle,
blockSubtitle,
hasTitle,
headingLevel,
} = attributes;
let children = useSelect(
(select) =>
select("core/block-editor").getBlocksByClientId(clientId)[0].innerBlocks,
);
function onChangeBlockTitle(blockTitle) {
setAttributes({ blockTitle });
}
function onChangeBlockSubtitle(blockSubtitle) {
setAttributes({ blockSubtitle });
}
function onChangeHeadingLevel(newHeadingLevel) {
setAttributes({ headingLevel: newHeadingLevel });
}
function onChangeImagesDispositionType(disposition) {
if (disposition === "hasStepPictures") {
setAttributes({ hasStepPictures: true, hasLateralCover: false });
removeLateralCoverAttributes();
}
if (disposition === "hasLateralCover") {
setAttributes({ hasStepPictures: false, hasLateralCover: true });
}
}
function handlelateralPicturesFormatChange(lateralPicturesFormat) {
setAttributes({ lateralPicturesFormat });
}
function onChangehasStepIcons() {
setAttributes({ hasStepIcons: !hasStepIcons });
}
function onChangeHasTitle(newHasTitle) {
setAttributes({ hasTitle: !hasTitle });
if (!newHasTitle) {
setAttributes({ blockTitle: "", blockSubtitle: "" });
}
}
function setLateralCoverAttributes(cover) {
console.log(cover);
setAttributes({
lateralCoverId: cover.id,
lateralCoverAlt: cover.alt,
lateralCoverUrl: cover.url,
lateralCoverCaption: cover?.caption,
lateralCoverDescription: cover?.description,
});
}
function removeLateralCoverAttributes() {
setAttributes({
lateralCoverId: null,
lateralCoverAlt: null,
lateralCoverUrl: null,
lateralCoverCaption: null,
lateralCoverDescription: null,
});
}
function updateChildrensProps(children) {
children.forEach((child) => {
dispatch("core/block-editor").updateBlockAttributes(child.clientId, {
hasStepIcon: hasStepIcons,
hasStepPicture: hasStepPictures,
});
});
}
useEffect(() => {
if (children && children.length > 0) {
updateChildrensProps(children);
}
}, [children, hasStepPictures, hasStepIcons]);
const TEMPLATE = [
[
"homegrade-content-blocks/timeline-step",
{
timelineStepTitle: "Etape 1",
timelineStepSubtitle: "sous titre",
},
],
[
"homegrade-content-blocks/timeline-step",
{
timelineStepTitle: "Etape 2",
timelineStepSubtitle: "sous titre",
},
],
];
return (
<>
<InspectorControls>
<PanelBody
title={__("Variantes de Timeline", "homegrade-blocks")}
className={
"homegrade-blocks-timeline__panel-body homegrade-blocks-components-image__panel-body"
}
>
<PanelRow>
<ToggleControl
label={__("Titre de bloc", "homegrade-blocks")}
help={
hasTitle ? "Titre de bloc." : "Ne pas afficher de bloc titrage"
}
checked={hasTitle}
onChange={onChangeHasTitle}
/>
</PanelRow>
<PanelRow>
<ToggleControl
label={__("Icones", "homegrade-blocks__texte-backoffice")}
help={
hasStepIcons
? "Afficher des icones pour chaque ligne"
: "Ne pas afficher d'icones"
}
checked={hasStepIcons}
onChange={onChangehasStepIcons}
/>
</PanelRow>
<PanelRow>
<ToggleGroupControl
label="Type d'image Latérale"
className="homegrade-blocks-components-image__ratio-selector"
isBlock
onChange={onChangeImagesDispositionType}
value={hasStepPictures ? "hasStepPictures" : "hasLateralCover"}
>
<ToggleGroupControlOption
variant="hasStepPictures"
label="image par ligne de timeline"
value="hasStepPictures"
/>
<ToggleGroupControlOption
variant="lateralCover"
label=" Image latérale unique"
value="hasLateralCover"
/>
</ToggleGroupControl>
</PanelRow>
<PanelRow>
<RadioControl
label={__("Format d'image(s) latérale(s)", "textdomain")}
selected={lateralPicturesFormat}
options={[
{ label: "Carré", value: "squared" },
{ label: "Moyenne", value: "md" },
{ label: "Hauteur originale", value: "xl" },
{ label: "Illustration", value: "illustration" },
]}
onChange={handlelateralPicturesFormatChange}
/>
</PanelRow>
{lateralCoverUrl && (
<img src={lateralCoverUrl} alt={lateralCoverAlt} />
)}
{hasLateralCover && (
<div className="media-replace-container">
<MediaReplaceFlow
mediaId={lateralCoverId}
mediaUrl={lateralCoverUrl}
allowedTypes={["image"]}
accept="image/*"
onSelect={setLateralCoverAttributes}
name={
!lateralCoverUrl
? __("Ajouter", "homegrade-blocks__texte-backoffice")
: __("Remplacer", "homegrade-blocks__texte-backoffice")
}
/>
{lateralCoverUrl && (
<>
<Button
className="custom-flow-button"
variant="primary"
icon={trash}
label="Supprimer"
onClick={removeLateralCoverAttributes}
/>
</>
)}
</div>
)}
</PanelBody>
</InspectorControls>
<BlockControls>
<ToolbarGroup>
<ToolbarButton
isActive={headingLevel === "h1"}
icon={headingLevel1}
onClick={() => {
onChangeHeadingLevel("h1");
}}
/>
<ToolbarButton
isActive={headingLevel === "h2"}
icon={headingLevel2}
onClick={() => {
onChangeHeadingLevel("h2");
}}
/>
<ToolbarButton
isActive={headingLevel === "h3"}
icon={headingLevel3}
onClick={() => {
onChangeHeadingLevel("h3");
}}
/>
<ToolbarButton
isActive={headingLevel === "h4"}
icon={headingLevel4}
onClick={() => {
onChangeHeadingLevel("h4");
}}
/>
<ToolbarButton
isActive={headingLevel === "h5"}
icon={headingLevel5}
onClick={() => {
onChangeHeadingLevel("h5");
}}
/>
</ToolbarGroup>
</BlockControls>
<section
{...useBlockProps({
className: `homegrade-blocks-timeline ${
hasStepIcons ? "homegrade-blocks-timeline--has-step-icons" : ""
}
${hasLateralCover ? "homegrade-blocks-timeline--has-lateral-cover" : ""}`,
})}
>
<div className="section_titling section_titling--center">
{hasTitle && (
<>
<RichText
value={blockTitle}
tagName={headingLevel}
className="section_titling__title"
placeholder={__(
"Ajouter ici le Titre de la liste de membres",
"homegrade",
)}
onChange={onChangeBlockTitle}
/>
<RichText
value={blockSubtitle}
tagName="p"
className="section_titling__subtitle"
placeholder={__(
"Ajouter ici le Sous-titre de la liste de membres",
"homegrade",
)}
onChange={onChangeBlockSubtitle}
/>
</>
)}
</div>
<div className="homegrade-blocks-timeline__container">
{hasLateralCover && !lateralCoverUrl && (
<MediaPlaceholder
accept="image/*"
allowedTypes={["image"]}
onSelect={setLateralCoverAttributes}
multiple={false}
handleUpload={true}
/>
)}
{hasLateralCover && lateralCoverUrl && (
<figure
className={`homegrade-blocks-timeline__lateral-cover homegrade-blocks-timeline__lateral-cover--${lateralPicturesFormat}`}
>
<img src={lateralCoverUrl} alt={lateralCoverAlt} />
{(lateralCoverDescription || lateralCoverCaption) && (
<figcaption>
{lateralCoverDescription && (
<p className="description">{lateralCoverDescription}</p>
)}
{lateralCoverCaption && (
<p className="caption">{lateralCoverCaption}</p>
)}
</figcaption>
)}
</figure>
)}
<InnerBlocks
allowedBlocks={["homegrade-content-blocks/timeline-step"]}
template={TEMPLATE}
/>
</div>
</section>
</>
);
}