-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
Copy pathconvert-button.js
134 lines (114 loc) · 3.16 KB
/
convert-button.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
* External dependencies
*/
import { noop } from 'lodash';
/**
* WordPress dependencies
*/
import { Fragment } from '@wordpress/element';
import { MenuItem } from '@wordpress/components';
import { _x } from '@wordpress/i18n';
import { switchToBlockType } from '@wordpress/blocks';
import { withSelect, withDispatch } from '@wordpress/data';
import { compose } from '@wordpress/compose';
/**
* Internal dependencies
*/
import { Group, Ungroup } from './icons';
export function ConvertToGroupButton( {
onConvertToGroup,
onConvertFromGroup,
isGroupable = false,
isUngroupable = false,
} ) {
return (
<Fragment>
{ isGroupable && (
<MenuItem
className="editor-block-settings-menu__control block-editor-block-settings-menu__control"
icon={ Group }
onClick={ onConvertToGroup }
>
{ _x( 'Group', 'verb' ) }
</MenuItem>
) }
{ isUngroupable && (
<MenuItem
className="editor-block-settings-menu__control block-editor-block-settings-menu__control"
icon={ Ungroup }
onClick={ onConvertFromGroup }
>
{ _x( 'Ungroup', 'Ungrouping blocks from within a Group block back into individual blocks within the Editor ' ) }
</MenuItem>
) }
</Fragment>
);
}
export default compose( [
withSelect( ( select, { clientIds } ) => {
const {
getBlocksByClientId,
canInsertBlockType,
} = select( 'core/block-editor' );
const {
getGroupingBlockName,
} = select( 'core/blocks' );
const groupingBlockName = getGroupingBlockName();
const groupingBlockAvailable = canInsertBlockType( groupingBlockName );
const blocksSelection = getBlocksByClientId( clientIds );
const isSingleGroupingBlock = blocksSelection.length === 1 && blocksSelection[ 0 ] && blocksSelection[ 0 ].name === groupingBlockName;
// Do we have
// 1. Grouping block available to be inserted?
// 2. One or more blocks selected
// (we allow single Blocks to become groups unless
// they are a soltiary group block themselves)
const isGroupable = (
groupingBlockAvailable &&
blocksSelection.length &&
! isSingleGroupingBlock
);
// Do we have a single Group Block selected and does that group have inner blocks?
const isUngroupable = isSingleGroupingBlock && !! blocksSelection[ 0 ].innerBlocks.length;
return {
isGroupable,
isUngroupable,
blocksSelection,
groupingBlockName,
};
} ),
withDispatch( ( dispatch, { clientIds, onToggle = noop, blocksSelection = [], groupingBlockName } ) => {
const {
replaceBlocks,
} = dispatch( 'core/block-editor' );
return {
onConvertToGroup() {
if ( ! blocksSelection.length ) {
return;
}
// Activate the `transform` on `core/group` which does the conversion
const newBlocks = switchToBlockType( blocksSelection, groupingBlockName );
if ( newBlocks ) {
replaceBlocks(
clientIds,
newBlocks
);
}
onToggle();
},
onConvertFromGroup() {
if ( ! blocksSelection.length ) {
return;
}
const innerBlocks = blocksSelection[ 0 ].innerBlocks;
if ( ! innerBlocks.length ) {
return;
}
replaceBlocks(
clientIds,
innerBlocks
);
onToggle();
},
};
} ),
] )( ConvertToGroupButton );