PluginProbe ʕ •ᴥ•ʔ
GenerateBlocks / 1.8.3
GenerateBlocks v1.8.3
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 / blocks / button / components / BlockControls.js
generateblocks / src / blocks / button / components Last commit date
BlockControls.js 2 years ago ButtonContentRenderer.js 3 years ago ComponentCSS.js 4 years ago ConditionalColors.js 2 years ago InspectorAdvancedControls.js 3 years ago
BlockControls.js
174 lines
1 import { ToolbarButton, ToolbarGroup, Dropdown, ToggleControl } from '@wordpress/components';
2 import { __ } from '@wordpress/i18n';
3 import { cloneBlock } from '@wordpress/blocks';
4 import { BlockControls, URLInput, AlignmentToolbar } from '@wordpress/block-editor';
5 import { useDispatch, useSelect } from '@wordpress/data';
6 import { link } from '@wordpress/icons';
7 import { applyFilters } from '@wordpress/hooks';
8 import isFlexItem from '../../../utils/is-flex-item';
9 import getAttribute from '../../../utils/get-attribute';
10 import typographyOptions from '../../../extend/inspector-control/controls/typography/options';
11 import getDeviceType from '../../../utils/get-device-type';
12 import getIcon from '../../../utils/get-icon';
13
14 export default ( props ) => {
15 const {
16 attributes,
17 clientId,
18 setAttributes,
19 } = props;
20
21 const { insertBlocks } = useDispatch( 'core/block-editor' );
22 const {
23 getBlockParentsByBlockName,
24 getBlocksByClientId,
25 } = useSelect( ( select ) => select( 'core/block-editor' ), [] );
26
27 const {
28 url,
29 target,
30 relNoFollow,
31 relSponsored,
32 useDynamicData,
33 dynamicLinkType,
34 display,
35 displayTablet,
36 displayMobile,
37 buttonType,
38 } = attributes;
39
40 const POPOVER_PROPS = {
41 className: 'block-editor-block-settings-menu__popover',
42 position: 'bottom right',
43 };
44
45 const deviceType = getDeviceType();
46 const hasDynamicLink = useDynamicData && dynamicLinkType;
47 const showAppender = applyFilters( 'generateblocks.editor.showButtonAppender', true, props );
48 const showButtonLinkControl = applyFilters( 'generateblocks.editor.showButtonLinkControl', 'link' === buttonType, props );
49 const buttonContainerId = getBlockParentsByBlockName( clientId, 'generateblocks/button-container', true )[ 0 ];
50
51 return (
52 <>
53 <BlockControls>
54 <ToolbarGroup>
55 { showAppender && buttonContainerId && // Add appender when using our deprecated button-container block.
56 <ToolbarButton
57 className="gblocks-add-new-button"
58 icon={ getIcon( 'add-button' ) }
59 label={ __( 'Add Button', 'generateblocks' ) }
60 onClick={ () => {
61 const thisBlock = getBlocksByClientId( clientId )[ 0 ];
62
63 const clonedBlock = cloneBlock(
64 thisBlock,
65 {
66 uniqueId: '',
67 }
68 );
69
70 insertBlocks( clonedBlock, undefined, buttonContainerId );
71 } }
72 showTooltip
73 />
74 }
75 </ToolbarGroup>
76
77 { ! isFlexItem( { device: deviceType, display, displayTablet, displayMobile } ) &&
78 <AlignmentToolbar
79 value={ getAttribute( 'textAlign', { attributes: attributes.typography, deviceType } ) }
80 onChange={ ( value ) => {
81 setAttributes( {
82 typography: {
83 [ getAttribute( 'textAlign', { attributes: attributes.typography, deviceType }, true ) ]: value,
84 },
85 } );
86 } }
87 alignmentControls={ typographyOptions.alignments }
88 />
89 }
90
91 <ToolbarGroup>
92 { ( ! useDynamicData || hasDynamicLink ) && showButtonLinkControl &&
93 <Dropdown
94 contentClassName="gblocks-button-link-dropdown"
95 popoverProps={ POPOVER_PROPS }
96 renderToggle={ ( { isOpen, onToggle } ) => (
97 <ToolbarButton
98 icon={ link }
99 label={ ! url ? __( 'Add Link', 'generateblocks' ) : __( 'Change Link', 'generateblocks' ) }
100 onClick={ onToggle }
101 aria-expanded={ isOpen }
102 isPressed={ !! url }
103 />
104 ) }
105 renderContent={ () => (
106 <>
107 { ! useDynamicData &&
108 <URLInput
109 className={ 'gblocks-button-link' }
110 value={ url }
111 onChange={ ( value ) => {
112 setAttributes( {
113 url: value,
114 hasUrl: !! value,
115 } );
116 } }
117 />
118 }
119
120 { !! useDynamicData &&
121 <div style={ {
122 width: '300px',
123 'font-style': 'italic',
124 'margin-bottom': ( !! dynamicLinkType ? '15px' : '0' ),
125 } }>
126 { __( 'This button is using a dynamic link.', 'generateblocks' ) }
127 </div>
128 }
129
130 { applyFilters( 'generateblocks.editor.urlInputMoreOptions', '', attributes ) }
131
132 { ( !! url || hasDynamicLink ) &&
133 <>
134 <ToggleControl
135 label={ __( 'Open link in a new tab', 'generateblocks' ) }
136 checked={ target || '' }
137 onChange={ ( value ) => {
138 setAttributes( {
139 target: value,
140 } );
141 } }
142 />
143
144 <ToggleControl
145 label={ __( 'Add rel="nofollow"', 'generateblocks' ) }
146 checked={ relNoFollow || '' }
147 onChange={ ( value ) => {
148 setAttributes( {
149 relNoFollow: value,
150 } );
151 } }
152 />
153
154 <ToggleControl
155 label={ __( 'Add rel="sponsored"', 'generateblocks' ) }
156 checked={ relSponsored || '' }
157 onChange={ ( value ) => {
158 setAttributes( {
159 relSponsored: value,
160 } );
161 } }
162 />
163 </>
164 }
165 </>
166 ) }
167 />
168 }
169 </ToolbarGroup>
170 </BlockControls>
171 </>
172 );
173 };
174