PluginProbe ʕ •ᴥ•ʔ
GenerateBlocks / 1.9.0
GenerateBlocks v1.9.0
2.4.1 2.4.0 trunk 1.0 1.0.1 1.0.2 1.1.0 1.1.1 1.1.2 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.7.0 1.7.1 1.7.2 1.7.3 1.8.0 1.8.1 1.8.2 1.8.3 1.9.0 1.9.1 2.0.0 2.0.1 2.0.2 2.1.0 2.1.1 2.1.2 2.2.0 2.2.1 2.3.0
generateblocks / src / extend / block-controls / toolbar-appenders / index.js
generateblocks / src / extend / block-controls / toolbar-appenders Last commit date
index.js 3 years ago
index.js
162 lines
1 import { ToolbarGroup, ToolbarButton } from '@wordpress/components';
2 import { addFilter } from '@wordpress/hooks';
3 import { __ } from '@wordpress/i18n';
4 import { useSelect, useDispatch } from '@wordpress/data';
5 import { createBlock } from '@wordpress/blocks';
6 import { createHigherOrderComponent } from '@wordpress/compose';
7 import { BlockControls } from '@wordpress/block-editor';
8 import getIcon from '../../../utils/get-icon';
9 import useInnerBlocksCount from '../../../hooks/useInnerBlocksCount';
10 import InsertInnerContainerOnboard from '../../../components/onboard-popover/onboards/insert-inner-container-onboard';
11 import { isEmpty } from 'lodash';
12
13 const withToolbarAppenders = createHigherOrderComponent( ( BlockEdit ) => {
14 return ( props ) => {
15 const {
16 name,
17 attributes,
18 } = props;
19
20 const {
21 variantRole,
22 useInnerContainer,
23 } = attributes;
24
25 const {
26 getBlocksByClientId,
27 getSelectedBlockClientIds,
28 getBlockRootClientId,
29 } = useSelect( ( select ) => select( 'core/block-editor' ), [] );
30
31 const {
32 replaceBlocks,
33 insertBlocks,
34 } = useDispatch( 'core/block-editor' );
35
36 const clientIds = getSelectedBlockClientIds();
37 const clientId = clientIds.length ? clientIds[ 0 ] : props.clientId;
38 const innerBlocksCount = useInnerBlocksCount( clientId );
39 const blocksSelection = getBlocksByClientId( clientIds );
40 const hasParentBlock = getBlockRootClientId( clientId );
41
42 const onConvertToContainer = ( layout = '' ) => {
43 if ( ! blocksSelection.length ) {
44 return;
45 }
46
47 const newChildBlocks = blocksSelection.map( ( block ) => {
48 return createBlock(
49 block.name,
50 block.attributes,
51 block.innerBlocks
52 );
53 } );
54
55 const containerAttributes = {};
56
57 if ( 'row' === layout ) {
58 containerAttributes.display = 'flex';
59 containerAttributes.flexDirection = 'row';
60 }
61
62 if ( 'stack' === layout ) {
63 containerAttributes.display = 'flex';
64 containerAttributes.flexDirection = 'column';
65 }
66
67 const newBlocks = createBlock(
68 'generateblocks/container',
69 containerAttributes,
70 newChildBlocks
71 );
72
73 if ( ! isEmpty( newBlocks ) ) {
74 replaceBlocks( clientIds, newBlocks );
75 }
76 };
77
78 let buttons = '';
79
80 if (
81 'generateblocks/container' === name &&
82 ! hasParentBlock &&
83 0 === innerBlocksCount &&
84 '' === variantRole &&
85 ! useInnerContainer &&
86 1 === clientIds.length
87 ) {
88 buttons = <>
89 { buttons }
90 <ToolbarButton
91 icon={ getIcon( 'section' ) }
92 label={ __( 'Add Inner Container', 'generateblocks' ) }
93 onClick={ () => {
94 insertBlocks(
95 createBlock( 'generateblocks/container', {
96 useGlobalMaxWidth: true,
97 marginLeft: 'auto',
98 marginRight: 'auto',
99 } ),
100 undefined,
101 clientId
102 );
103 } }
104 showTooltip
105 />
106 <InsertInnerContainerOnboard />
107 </>;
108 }
109
110 buttons = <>
111 { buttons }
112 <ToolbarButton
113 icon={ getIcon( 'add-to-container' ) }
114 label={ __( 'Add to Container', 'generateblocks' ) }
115 onClick={ () => onConvertToContainer( '' ) }
116 />
117 </>;
118
119 if ( blocksSelection.length > 1 ) {
120 buttons = <>
121 { buttons }
122 <ToolbarButton
123 icon={ getIcon( 'add-to-row' ) }
124 label={ __( 'Add to Row', 'generateblocks' ) }
125 onClick={ () => onConvertToContainer( 'row' ) }
126 />
127 </>;
128 }
129
130 if ( blocksSelection.length > 1 ) {
131 buttons = <>
132 { buttons }
133 <ToolbarButton
134 icon={ getIcon( 'add-to-stack' ) }
135 label={ __( 'Add to Stack', 'generateblocks' ) }
136 onClick={ () => onConvertToContainer( 'stack' ) }
137 />
138 </>;
139 }
140
141 return (
142 <>
143 { !! buttons &&
144 <BlockControls group="parent">
145 <ToolbarGroup>
146 { buttons }
147 </ToolbarGroup>
148 </BlockControls>
149 }
150
151 <BlockEdit { ...props } />
152 </>
153 );
154 };
155 }, 'withToolbarAppenders' );
156
157 addFilter(
158 'editor.BlockEdit',
159 'generateblocks/blockControls/toolbarAppenders',
160 withToolbarAppenders
161 );
162