• smeedijzeronline

    (@smeedijzeronline)


    Hi,

    I’m new to building and extending Gutenberg blocks. I try to extend the core/quote block of Gutenberg by adding an extra color panel for the quote style: ‘large’. This to control the color of a quote symbol I added by a css pseudo selector:

    blockquote.wp-block-quote.is-style-large::before {
        display: inline-block;
        font-size: 4rem;
        line-height: 1;
        content: '"';
        position: relative;
    }
    // Adding this by selected color:
    .has-green-quote-color::before {
        color: #00AA78;
    }

    Below is the code I have now. The probleem is that it doesn’t correctly update the quote color in the editor. Any idea how to fix this? And How to better organize this code?

    /**
     * External Dependencies
     */
    import {assign} from 'lodash';
    
    /**
     * WordPress Dependencies
     */
    import {__} from '@wordpress/i18n';
    import {addFilter} from '@wordpress/hooks';
    import {createHigherOrderComponent} from '@wordpress/compose';
    import {Fragment} from '@wordpress/element';
    import {PanelBody} from '@wordpress/components';
    
    import {
        getColorClassName,
        InspectorControls,
        getColorObjectByColorValue,
        PanelColorSettings
    } from '@wordpress/editor';
    
    // Enable quote color control on the following blocks
    const enableQuoteColorControlOnBlocks = [
      'core/quote',
    ];
    
    /**
     * Add quote color control attribute to block.
     *
     * @param {object} settings Current block settings.
     * @param {string} name Name of block.
     *
     * @returns {object} Modified block settings.
     */
    const addQuoteColorControlAttribute = (settings, name) => {
      // Do nothing if it's another block
        if (!enableQuoteColorControlOnBlocks.includes(name)) {
            return settings;
        }
    
        if (typeof settings.attributes !== 'undefined') {
            settings.attributes = assign(settings.attributes, {
                quoteColor: {
                    type: 'string',
                    default: '#00aa78',
                },
            });
        }
    
        return settings;
    };
    addFilter('blocks.registerBlockType', 'smdzr-block/attribute/quoteColor', addQuoteColorControlAttribute);
    
    /**
     * add quoteColor control to inspector controls of block.
     */
    const withQuoteColorControl = createHigherOrderComponent((BlockEdit) => {
        return (props) => {
    
          // Do nothing if it's another block.
            if (!enableQuoteColorControlOnBlocks.includes(props.name)) {
                return (
                  <BlockEdit {...props} />
                );
            }
    
            const isStyle = RegExp(/is-style-large/);
    
            if (!isStyle.test(props.attributes.className)) {
                return (
                  <BlockEdit {...props} />
                );
            }
    
            const {quoteColor} = props.attributes;
    
            if (quoteColor) {
                const settings = wp.data.select('core').getThemeSupports();
                const colorObject = getColorObjectByColorValue(settings['editor-color-palette'], quoteColor);
    
                if (colorObject) {
                    lodash.assign(props.attributes, {
                        className: ('is-style-large ' + getColorClassName(
                            'quote-color',
                            colorObject.slug
                        )),
                    });
                }
            }
    
            return (
              <Fragment>
                <BlockEdit {...props} />
                <InspectorControls>
                  <PanelBody title={__('Quote')} initialOpen={true}>
                    <PanelColorSettings title={__('Kleur instellen')} colorSettings={
                        [{
                            value: props.attributes.quoteColor,
                            onChange: (color) => props.setAttributes({quoteColor: color}),
                            label: __('Kleur quote symbool'),
                        },]
                      }/>
                  </PanelBody>
                </InspectorControls>
              </Fragment>
          );
        };
    }, 'withQuoteColorControl');
    
    addFilter('editor.BlockEdit', 'smdzr-block/with-quoteColor-control', withQuoteColorControl);
  • The topic ‘How to properly extend Gutenberg block core/quote block?’ is closed to new replies.