import { BlockControls, InspectorControls, useBlockProps, useInnerBlocksProps, } from '@wordpress/block-editor'; import { createBlock } from '@wordpress/blocks'; import { Button, PanelBody, Placeholder, ToolbarButton, ToolbarGroup, } from '@wordpress/components'; import { useDispatch, useSelect } from '@wordpress/data'; import { applyFilters } from '@wordpress/hooks'; import { __ } from '@wordpress/i18n'; import classnames from 'classnames/dedupe'; import ApplyFilters from '../../components/apply-filters'; import GapSettings from '../../components/gap-settings'; import RangeControl from '../../components/range-control'; import ToggleGroup from '../../components/toggle-group'; import getIcon from '../../utils/get-icon'; /** * Block Edit Class. * * @param props */ export default function BlockEdit(props) { const { clientId, attributes, setAttributes } = props; const { gap, gapCustom, gapVerticalCustom, verticalAlign, horizontalAlign, } = attributes; const { removeBlock, replaceInnerBlocks } = useDispatch('core/block-editor'); const { getBlocks, columnsCount } = useSelect((select) => { const { getBlockCount } = select('core/block-editor'); return { getBlocks: select('core/block-editor').getBlocks, columnsCount: getBlockCount(clientId), }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /** * Get columns sizes array from layout string * * @param {string} layout - layout data. Example: `3-6-3` * * @return {Array}. */ function getColumnsFromLayout(layout) { const result = []; const columnsData = layout.split('-'); columnsData.forEach((col) => { const colAttrs = { size: col, }; if (col === 'a') { colAttrs.size = 'auto'; } else if (col === 'g') { colAttrs.size = 'grow'; } // responsive. if (columnsData.length === 2) { colAttrs.md_size = '12'; } if (columnsData.length === 3) { colAttrs.lg_size = '12'; } if (columnsData.length === 4) { colAttrs.md_size = '12'; colAttrs.lg_size = '6'; } if (columnsData.length === 5) { colAttrs.sm_size = '12'; colAttrs.md_size = '5'; colAttrs.lg_size = '4'; } if (columnsData.length === 6) { colAttrs.sm_size = '6'; colAttrs.md_size = '4'; colAttrs.lg_size = '3'; } result.push(colAttrs); }); return result; } /** * Select predefined layout. * * @param {string} layout layout string. */ function onLayoutSelect(layout) { const columnsData = getColumnsFromLayout(layout); const newInnerBlocks = []; columnsData.forEach((colAttrs) => { newInnerBlocks.push(createBlock('ghostkit/grid-column', colAttrs)); }); replaceInnerBlocks(clientId, newInnerBlocks, false); } /** * Layouts selector when no columns selected. * * @return {jsx}. */ function LayoutsSelector() { let layouts = [ '12', '6-6', '4-4-4', '3-3-3-3', '5-7', '7-5', '3-3-6', '3-6-3', '6-3-3', '2-8-2', 'g-g-g-g-g', '2-2-2-2-2-2', ]; layouts = applyFilters('ghostkit.editor.grid.layouts', layouts, props); const templatesModal = applyFilters( 'ghostkit.editor.grid.templatesModal', '', props ); return (
{layouts.map((layout) => { const columnsData = getColumnsFromLayout(layout); return ( ); })}
{templatesModal}
); } /** * Updates the column count * * @param {number} newColumns New column count. */ function updateColumns(newColumns) { // Remove Grid block. if (newColumns < 1) { removeBlock(clientId); // Add new columns. } else if (newColumns > columnsCount) { const newCount = newColumns - columnsCount; const newInnerBlocks = [...getBlocks(clientId)]; for (let i = 1; i <= newCount; i += 1) { newInnerBlocks.push( createBlock('ghostkit/grid-column', { size: 3 }) ); } replaceInnerBlocks(clientId, newInnerBlocks, false); // Remove columns. } else if (newColumns < columnsCount) { const newInnerBlocks = [...getBlocks(clientId)]; newInnerBlocks.splice(newColumns, columnsCount - newColumns); replaceInnerBlocks(clientId, newInnerBlocks, false); } } let className = classnames( 'ghostkit-grid', `ghostkit-grid-gap-${gap}`, verticalAlign ? `ghostkit-grid-align-items-${verticalAlign}` : false, horizontalAlign ? `ghostkit-grid-justify-content-${horizontalAlign}` : false ); // background const background = applyFilters( 'ghostkit.editor.grid.background', '', props ); if (background) { className = classnames(className, 'ghostkit-grid-with-bg'); } className = applyFilters('ghostkit.editor.className', className, props); const blockProps = useBlockProps({ className, }); const { children, ...innerBlocksProps } = useInnerBlocksProps(blockProps, { allowedBlocks: ['ghostkit/grid-column'], orientation: 'horizontal', renderAppender: false, }); return (
{columnsCount > 0 ? ( setAttributes({ verticalAlign: '' })} isActive={verticalAlign === ''} /> setAttributes({ verticalAlign: 'center' }) } isActive={verticalAlign === 'center'} /> setAttributes({ verticalAlign: 'end' }) } isActive={verticalAlign === 'end'} /> ) : null} updateColumns(value)} min={1} max={12} allowCustomMax /> {columnsCount > 0 ? ( { setAttributes({ verticalAlign: value }); }} isDeselectable isAdaptiveWidth /> { setAttributes({ horizontalAlign: value }); }} isDeselectable /> { setAttributes(data); }} allowVerticalGap /> ) : null}
{columnsCount > 0 ? ( <> {background}
{children}
) : ( )}
); }