From 8d8ccedbf2d3c784da437c6a98ec96877d9a7c17 Mon Sep 17 00:00:00 2001 From: Steve Ross Date: Sat, 3 Jan 2026 10:31:24 +0000 Subject: [PATCH] basic article block backend working --- app/blocks.php | 8 ++++ .../components}/AttachmentImage.jsx | 0 .../js/blocks/components/BackgroundImage.jsx | 33 ++++++++++++++ .../js/blocks/components/BlockSettings.jsx | 23 ++++++++++ .../{lib/blocks => blocks/lib}/classNames.js | 5 ++- resources/js/lib/blocks/BlockSettings.jsx | 43 ------------------- resources/views/blocks/article/index.jsx | 39 +++++++++-------- 7 files changed, 89 insertions(+), 62 deletions(-) rename resources/js/{lib/blocks => blocks/components}/AttachmentImage.jsx (100%) create mode 100644 resources/js/blocks/components/BackgroundImage.jsx create mode 100644 resources/js/blocks/components/BlockSettings.jsx rename resources/js/{lib/blocks => blocks/lib}/classNames.js (87%) delete mode 100644 resources/js/lib/blocks/BlockSettings.jsx diff --git a/app/blocks.php b/app/blocks.php index 5f1e190..6a9d961 100644 --- a/app/blocks.php +++ b/app/blocks.php @@ -147,6 +147,14 @@ add_action('init', function () { 'type' => 'string', 'default' => '', ], + 'background_fixed' => [ + 'type' => 'boolean', + 'default' => false, + ], + 'background_contrast' => [ + 'type' => 'boolean', + 'default' => false, + ], ], ]; diff --git a/resources/js/lib/blocks/AttachmentImage.jsx b/resources/js/blocks/components/AttachmentImage.jsx similarity index 100% rename from resources/js/lib/blocks/AttachmentImage.jsx rename to resources/js/blocks/components/AttachmentImage.jsx diff --git a/resources/js/blocks/components/BackgroundImage.jsx b/resources/js/blocks/components/BackgroundImage.jsx new file mode 100644 index 0000000..46bae7b --- /dev/null +++ b/resources/js/blocks/components/BackgroundImage.jsx @@ -0,0 +1,33 @@ +import { useSelect } from '@wordpress/data'; + +/** + * BackgroundImage + * + * This component is used to display a background image for a block based on its attributes. + * + * @param {object} props + * @param {string} props.background_image The url of the background image. + * @param {string} props.background_position The background-position property. + * @param {boolean} props.background_fixed Toggle for background-attachment: fixed. + * @param {number} props.background_opacity The opacity value applied to the image. + * @returns {*} React JSX + */ +export default function BackgroundImage({ background_url, background_position = 'center', background_fixed = false, background_opacity = 70 }) { + + return ( + <> + {background_url && ( +
+ )} + + ) +} diff --git a/resources/js/blocks/components/BlockSettings.jsx b/resources/js/blocks/components/BlockSettings.jsx new file mode 100644 index 0000000..7ed5aa1 --- /dev/null +++ b/resources/js/blocks/components/BlockSettings.jsx @@ -0,0 +1,23 @@ +import { useSelect } from '@wordpress/data'; + +/** + * BlockSettings + * + * Bundles the used for several blocks + * * + * @param {object} props + * @param {number} props.imageId The ID of the image to display. + * @param {string} props.size The size of the image to display. Defaults to 'full'. + * @returns {*} React JSX + */ +export default function BlockSettings(props) { + + + + return ( + <> + + + + ) +} diff --git a/resources/js/lib/blocks/classNames.js b/resources/js/blocks/lib/classNames.js similarity index 87% rename from resources/js/lib/blocks/classNames.js rename to resources/js/blocks/lib/classNames.js index dd73d16..0dcb496 100644 --- a/resources/js/lib/blocks/classNames.js +++ b/resources/js/blocks/lib/classNames.js @@ -42,9 +42,12 @@ export function sectionClassNames(attributes, defaultClasses, extraClasses = []) classNames.push(bg); } - if('background_image'in attributes && attributes.background_image != '0') + if('background_image' in attributes && attributes.background_image != '0') classNames.push('has-bg-image'); + if('background_contrast' in attributes && attributes.background_contrast) + classNames.push('knockout'); + // combine arrays classNames = classNames.concat(defaultClasses).concat(extraClasses); diff --git a/resources/js/lib/blocks/BlockSettings.jsx b/resources/js/lib/blocks/BlockSettings.jsx deleted file mode 100644 index 4cbbfd2..0000000 --- a/resources/js/lib/blocks/BlockSettings.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import { useSelect } from '@wordpress/data'; - -/** - * BlockSettings - * - * Bundles the used for several blocks - * * - * @param {object} props - * @param {number} props.imageId The ID of the image to display. - * @param {string} props.size The size of the image to display. Defaults to 'full'. - * @returns {*} React JSX - */ -export default function BlockSettings({ imageId, size = 'full' }) { - - const { image } = useSelect((select) => ({ - image: select('core').getEntityRecord('postType', 'attachment', imageId), - })); - - const imageAttributes = () =>{ - let attributes = { - src: image.source_url, - alt: image.alt_text, - className: `attachment-${size} size-${size}`, - width: image.media_details.width, - height: image.media_details.height, - }; - if (image.media_details && image.media_details.sizes && image.media_details.sizes[size]) { - attributes.src = image.media_details.sizes[size].source_url; - attributes.width = image.media_details.sizes[size].width; - attributes.height = image.media_details.sizes[size].height; - } - - return attributes; - }; - - return ( - <> - {image && ( - - )} - - ) -} diff --git a/resources/views/blocks/article/index.jsx b/resources/views/blocks/article/index.jsx index 3c9bf8f..57e2427 100644 --- a/resources/views/blocks/article/index.jsx +++ b/resources/views/blocks/article/index.jsx @@ -30,8 +30,9 @@ import { import { useState, useEffect } from '@wordpress/element'; import metadata from './block.json'; import allowedBlocks from '../../../json/core-block-whitelist.json'; -import { containerClassNames, sectionClassNames } from '../../../js/lib/blocks/classNames'; -import AttachmentImage from '../../../js/lib/blocks/AttachmentImage'; +import { containerClassNames, sectionClassNames } from '../../../js/blocks/lib/classNames'; +import AttachmentImage from '../../../js/blocks/components/AttachmentImage'; +import BackgroundImage from '../../../js/blocks/components/BackgroundImage'; import apiFetch from '@wordpress/api-fetch'; @@ -52,6 +53,8 @@ registerBlockType(metadata.name, { background_url, background_position, background_opacity, + background_contrast, + background_fixed, } = attributes; const [ @@ -111,10 +114,7 @@ registerBlockType(metadata.name, { __nextHasNoMarginBottom /> - +

{ __('Colour', 'badegg') }

@@ -160,9 +160,21 @@ registerBlockType(metadata.name, { { background_image != 0 && ( <> - */} + setAttributes({ background_contrast: value }) } + __nextHasNoMarginBottom + /> + setAttributes({ background_fixed: value }) } + __nextHasNoMarginBottom />
- { attributes.background_image != 0 && ( -
- ) } +
); @@ -243,7 +246,7 @@ registerBlockType(metadata.name, { save({ attributes }) { return (
-
+