PluginProbe
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce / 3.3.0
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce v3.3.0
3.3.0 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.1 trunk 1.0.4 1.1.0 1.1.0.1 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 All 162 releases
cartflows / modules / gutenberg / src / components / spacing-control / index.js

index.js in CartFlows – Funnel Builder & Checkout Plugin for WooCommerce 3.3.0, at modules/gutenberg/src/components/spacing-control/index.js

529 lines 15.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * External dependencies
3 */
4 import styles from './editor.lazy.scss';
5 import React, { useLayoutEffect } from 'react';
6 import { __, sprintf } from '@wordpress/i18n';
7 import { ButtonGroup, Button, Tooltip } from '@wordpress/components';
8 import { useDeviceType } from '@Controls/getPreviewType';
9 import ResponsiveToggle from '../responsive-toggle';
10 import UAGReset from '../reset';
11
12 const SpacingControl = ( props ) => {
13 // Add and remove the CSS on the drop and remove of the component.
14 useLayoutEffect( () => {
15 styles.use();
16 return () => {
17 styles.unuse();
18 };
19 }, [] );
20
21 const deviceType = useDeviceType();
22 const responsive = true;
23
24 const {
25 label,
26 unit,
27 mUnit,
28 tUnit,
29 disableUnits,
30 valueBottom,
31 valueLeft,
32 valueRight,
33 valueTop,
34 valueBottomTablet,
35 valueLeftTablet,
36 valueRightTablet,
37 valueTopTablet,
38 valueBottomMobile,
39 valueLeftMobile,
40 valueRightMobile,
41 valueTopMobile,
42 link,
43 setAttributes,
44 } = props;
45
46 const onChangeUnits = ( value ) => {
47 if ( 'Mobile' === deviceType ) {
48 setAttributes( { [ mUnit.label ]: value.unitValue } );
49 } else if ( 'Tablet' === deviceType ) {
50 setAttributes( { [ tUnit.label ]: value.unitValue } );
51 } else {
52 setAttributes( { [ unit.label ]: value.unitValue } );
53 }
54 };
55 const changeLinkedValues = ( newValue, device ) => {
56 switch ( device ) {
57 case 'desktop':
58 // code block
59 setAttributes( { [ valueTop.label ]: newValue } );
60 setAttributes( { [ valueRight.label ]: newValue } );
61 setAttributes( { [ valueBottom.label ]: newValue } );
62 setAttributes( { [ valueLeft.label ]: newValue } );
63 break;
64 case 'tablet':
65 // code block
66 setAttributes( { [ valueTopTablet.label ]: newValue } );
67 setAttributes( { [ valueRightTablet.label ]: newValue } );
68 setAttributes( { [ valueBottomTablet.label ]: newValue } );
69 setAttributes( { [ valueLeftTablet.label ]: newValue } );
70 break;
71 case 'mobile':
72 // code block
73 setAttributes( { [ valueTopMobile.label ]: newValue } );
74 setAttributes( { [ valueRightMobile.label ]: newValue } );
75 setAttributes( { [ valueBottomMobile.label ]: newValue } );
76 setAttributes( { [ valueLeftMobile.label ]: newValue } );
77 break;
78 }
79 };
80 const onChangeTopValue = ( event, device, value = '', resetLink = false ) => {
81 let newValue = value;
82 if ( '' === value && '' !== event ) {
83
84 newValue =
85 event.target.value === ''
86 ? 0
87 : Number( event.target.value );
88 }
89
90 if ( ! resetLink ) {
91 if ( link.value ) {
92 changeLinkedValues( newValue, device );
93 } else{
94 changedUnLinkedValues( device );
95 }
96 }
97
98 switch ( device ) {
99 case 'desktop':
100 setAttributes( { [ valueTop.label ]: newValue } );
101 break;
102 case 'tablet':
103 setAttributes( { [ valueTopTablet.label ]: newValue } );
104 break;
105 case 'mobile':
106 setAttributes( { [ valueTopMobile.label ]: newValue } );
107 break;
108 }
109
110 };
111 const changedUnLinkedValues = ( device ) => {
112
113 switch ( device ) {
114 case 'desktop':
115 // code block
116 setAttributes( { [ valueTop.label ]: ( '' === valueTop.value || undefined === valueTop.value ) ? 0 : valueTop.value } );
117 setAttributes( { [ valueRight.label ]: ( '' === valueRight.value || undefined === valueRight.value ) ? 0 : valueRight.value } );
118 setAttributes( { [ valueBottom.label ]: ( '' === valueBottom.value || undefined === valueBottom.value ) ? 0 : valueBottom.value } );
119 setAttributes( { [ valueLeft.label ]: ( '' === valueLeft.value || undefined === valueLeft.value ) ? 0 : valueLeft.value } );
120 break;
121 case 'tablet':
122 // code block
123 setAttributes( { [ valueTopTablet.label ]: ( undefined === valueTopTablet.value || '' === valueTopTablet.value ) ? 0 : valueTopTablet.value } );
124 setAttributes( { [ valueRightTablet.label ]: ( undefined === valueRightTablet.value || '' === valueRightTablet.value ) ? 0 : valueRightTablet.value } );
125 setAttributes( { [ valueBottomTablet.label ]: ( undefined === valueBottomTablet.value || '' === valueBottomTablet.value ) ? 0 : valueBottomTablet.value } );
126 setAttributes( { [ valueLeftTablet.label ]: ( undefined === valueLeftTablet.value || '' === valueLeftTablet.value ) ? 0 : valueLeftTablet.value } );
127 break;
128 case 'mobile':
129 // code block
130 setAttributes( { [ valueTopMobile.label ]: ( '' === valueTopMobile.value || undefined === valueTopMobile.value ) ? 0 : valueTopMobile.value } );
131 setAttributes( { [ valueRightMobile.label ]: ( '' === valueRightMobile.value || undefined === valueRightMobile.value ) ? 0 : valueRightMobile.value } );
132 setAttributes( { [ valueBottomMobile.label ]: ( '' === valueBottomMobile.value || undefined === valueBottomMobile.value ) ? 0 : valueBottomMobile.value } );
133 setAttributes( { [ valueLeftMobile.label ]: ( '' === valueLeftMobile.value || undefined === valueLeftMobile.value ) ? 0 : valueLeftMobile.value } );
134 break;
135 }
136
137 };
138 const onChangeRightValue = ( event, device, value = '', resetLink = false ) => {
139 let newValue = value;
140
141 if ( '' === value && '' !== event ) {
142 newValue =
143 event.target.value === ''
144 ? 0
145 : Number( event.target.value );
146 }
147 if ( ! resetLink ) {
148 if ( link.value ) {
149 changeLinkedValues( newValue, device );
150 }else {
151 changedUnLinkedValues( device );
152 }
153 }
154
155 switch ( device ) {
156 case 'desktop':
157 setAttributes( { [ valueRight.label ]: newValue } );
158 break;
159 case 'tablet':
160 setAttributes( { [ valueRightTablet.label ]: newValue } );
161 break;
162 case 'mobile':
163 setAttributes( { [ valueRightMobile.label ]: newValue } );
164 break;
165 }
166 };
167
168 const onChangeBottomValue = ( event, device, value = '', resetLink = false ) => {
169 let newValue = value;
170
171 if ( '' === value && '' !== event ) {
172 newValue =
173 event.target.value === ''
174 ? 0
175 : Number( event.target.value );
176 }
177 if ( ! resetLink ) {
178 if ( link.value ) {
179 changeLinkedValues( newValue, device );
180 }else {
181 changedUnLinkedValues( deviceType );
182 }
183 }
184
185 switch ( device ) {
186 case 'desktop':
187 setAttributes( { [ valueBottom.label ]: newValue } );
188 break;
189 case 'tablet':
190 setAttributes( { [ valueBottomTablet.label ]: newValue } );
191 break;
192 case 'mobile':
193 setAttributes( { [ valueBottomMobile.label ]: newValue } );
194 break;
195 }
196 };
197
198 const onChangeLeftValue = ( event, device, value = '', resetLink = false ) => {
199 let newValue = value;
200
201 if ( '' === value && '' !== event ) {
202 newValue =
203 event.target.value === ''
204 ? 0
205 : Number( event.target.value );
206 }
207 if ( ! resetLink ) {
208 if ( link.value && ! resetLink ) {
209 changeLinkedValues( newValue, device );
210 }else {
211 changedUnLinkedValues( deviceType );
212 }
213 }
214
215 switch ( device ) {
216 case 'desktop':
217 setAttributes( { [ valueLeft.label ]: newValue } );
218 break;
219 case 'tablet':
220 setAttributes( { [ valueLeftTablet.label ]: newValue } );
221 break;
222 case 'mobile':
223 setAttributes( { [ valueLeftMobile.label ]: newValue } );
224 break;
225 }
226 };
227
228 let unitSizes = [
229 {
230 name: __( 'Pixel', 'ultimate-addons-for-gutenberg' ),
231 unitValue: 'px',
232 },
233 {
234 name: __( 'Em', 'ultimate-addons-for-gutenberg' ),
235 unitValue: 'em',
236 },
237 {
238 name: __( '%', 'ultimate-addons-for-gutenberg' ),
239 unitValue: '%',
240 },
241 ];
242 if ( props.units ) {
243 unitSizes = props.units;
244 }
245
246 const onUnitSizeClick = ( uSizes ) => {
247 const items = [];
248 uSizes.map( ( key ) =>
249 items.push(
250 <Tooltip
251 text={ sprintf(
252 /* translators: abbreviation for units */
253 __( '%s units', 'ultimate-addons-for-gutenberg' ),
254 key.name
255 ) }
256 >
257 <Button
258 key={ key.unitValue }
259 className={ 'uagb-range-control__units--' + key.name }
260 isSmall
261 isPrimary={
262 ( 'Desktop' === deviceType &&
263 unit.value === key.unitValue ) ||
264 ( 'Mobile' === deviceType &&
265 mUnit.value === key.unitValue ) ||
266 ( 'Tablet' === deviceType &&
267 tUnit.value === key.unitValue )
268 }
269 isSecondary={
270 unit.value !== key.unitValue ||
271 mUnit.value !== key.unitValue ||
272 tUnit.value !== key.unitValue
273 }
274 aria-pressed={
275 ( 'Desktop' === deviceType &&
276 unit.value === key.unitValue ) ||
277 ( 'Mobile' === deviceType &&
278 mUnit.value === key.unitValue ) ||
279 ( 'Tablet' === deviceType &&
280 tUnit.value === key.unitValue )
281 }
282 data-device-type={ deviceType }
283 aria-label={ sprintf(
284 /* translators: abbreviation for units */
285 __( '%s units', 'ultimate-addons-for-gutenberg' ),
286 key.name
287 ) }
288 onClick={ () => onChangeUnits( key ) }
289 >
290 { key.unitValue }
291 </Button>
292 </Tooltip>
293 )
294 );
295
296 return items;
297 };
298
299 let linkHtml = '';
300
301 if ( link ) {
302 linkHtml = (
303 <span // eslint-disable-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
304 className="uagb-spacing-control__link uagb-spacing-control-connected dashicons dashicons-admin-links "
305 onClick={ () => {
306 changedUnLinkedValues( deviceType.toLowerCase() );
307 setAttributes( { [ link.label ]: false } );
308 } }
309 ></span>
310 );
311
312 if ( ! link.value ) {
313 linkHtml = (
314 <span // eslint-disable-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
315 className="uagb-spacing-control__link uagb-spacing-control-disconnected dashicons dashicons-editor-unlink"
316 onClick={ () => {
317 onLinkClickHandler();
318 setAttributes( { [ link.label ]: true } );
319 } }
320 ></span>
321 );
322 }
323 }
324 const onLinkClickHandler = () => {
325 let linkValue;
326 const device = deviceType.toLowerCase();
327
328 switch ( device ) {
329 case 'desktop':
330 linkValue = valueTop.value;
331 break;
332 case 'tablet':
333 linkValue = valueTopTablet.value;
334 break;
335 case 'mobile':
336 linkValue = valueTopMobile.value;
337 break;
338 }
339 changeLinkedValues( linkValue, device );
340 };
341 const output = {};
342 output.Desktop = (
343 <>
344 <div className="uagb-spacing-control__inputs">
345 <input
346 className="uagb-spacing-control__number"
347 type="number"
348 onChange={ ( e ) => onChangeTopValue( e, 'desktop' ) }
349 value={ ( undefined !== valueTop.value ) ? valueTop.value : '' }
350 />
351 <input
352 className="uagb-spacing-control__number"
353 type="number"
354 onChange={ ( e ) => onChangeRightValue( e, 'desktop' ) }
355 value={ ( undefined !== valueRight.value ) ? valueRight.value : '' }
356 />
357 <input
358 className="uagb-spacing-control__number"
359 type="number"
360 onChange={ ( e ) => onChangeBottomValue( e, 'desktop' ) }
361 value={ ( undefined !== valueBottom.value ) ? valueBottom.value : '' }
362 />
363 <input
364 className="uagb-spacing-control__number"
365 type="number"
366 onChange={ ( e ) => onChangeLeftValue( e, 'desktop' ) }
367 value={ ( undefined !== valueLeft.value ) ? valueLeft.value : '' }
368 />
369 { linkHtml }
370 </div>
371 </>
372 );
373 output.Tablet = (
374 <>
375 <div className="uagb-spacing-control__inputs">
376 <input
377 className="uagb-spacing-control__number"
378 type="number"
379 onChange={ ( e ) => onChangeTopValue( e, 'tablet' ) }
380 value={ ( undefined !== valueTopTablet.value ) ? valueTopTablet.value : '' }
381 />
382 <input
383 className="uagb-spacing-control__number"
384 type="number"
385 onChange={ ( e ) => onChangeRightValue( e, 'tablet' ) }
386 value={ ( undefined !== valueRightTablet.value ) ? valueRightTablet.value : '' }
387 />
388 <input
389 className="uagb-spacing-control__number"
390 type="number"
391 onChange={ ( e ) => onChangeBottomValue( e, 'tablet' ) }
392 value={ ( undefined !== valueBottomTablet.value ) ? valueBottomTablet.value : '' }
393 />
394 <input
395 className="uagb-spacing-control__number"
396 type="number"
397 onChange={ ( e ) => onChangeLeftValue( e, 'tablet' ) }
398 value={ ( undefined !== valueLeftTablet.value ) ? valueLeftTablet.value : '' }
399 />
400 { linkHtml }
401 </div>
402 </>
403 );
404 output.Mobile = (
405 <>
406 <div className="uagb-spacing-control__inputs">
407 <input
408 className="uagb-spacing-control__number"
409 type="number"
410 onChange={ ( e ) => onChangeTopValue( e, 'mobile' ) }
411 value={ ( undefined !== valueTopMobile.value ) ? valueTopMobile.value : '' }
412 />
413 <input
414 className="uagb-spacing-control__number"
415 type="number"
416 onChange={ ( e ) => onChangeRightValue( e, 'mobile' ) }
417 value={ ( undefined !== valueRightMobile.value ) ? valueRightMobile.value : '' }
418 />
419 <input
420 className="uagb-spacing-control__number"
421 type="number"
422 onChange={ ( e ) => onChangeBottomValue( e, 'mobile' ) }
423 value={ ( undefined !== valueBottomMobile.value ) ? valueBottomMobile.value : '' }
424 />
425 <input
426 className="uagb-spacing-control__number"
427 type="number"
428 onChange={ ( e ) => onChangeLeftValue( e, 'mobile' ) }
429 value={ ( undefined !== valueLeftMobile.value ) ? valueLeftMobile.value : '' }
430 />
431 { linkHtml }
432 </div>
433 </>
434 );
435
436 const resetValues = ( defaultValues ) => {
437 const device = deviceType.toLowerCase();
438
439 switch ( device ) {
440 case 'desktop':
441 onChangeTopValue( '', 'desktop', defaultValues[valueTop.label], true );
442 onChangeRightValue( '', 'desktop', defaultValues[valueRight.label], true );
443 onChangeBottomValue( '', 'desktop', defaultValues[valueBottom.label], true );
444 onChangeLeftValue( '', 'desktop', defaultValues[valueLeft.label], true );
445 setAttributes( { [ unit?.label ]: defaultValues[unit?.label] } );
446 break;
447 case 'tablet':
448 onChangeTopValue( '', 'tablet', defaultValues[valueTopTablet.label], true );
449 onChangeRightValue( '', 'tablet', defaultValues[valueRightTablet.label], true );
450 onChangeBottomValue( '', 'tablet', defaultValues[valueBottomTablet.label], true );
451 onChangeLeftValue( '', 'tablet', defaultValues[valueLeftTablet.label], true );
452 setAttributes( { [ tUnit?.label ]: defaultValues[tUnit?.label] } );
453 break;
454 case 'mobile':
455 onChangeTopValue( '', 'mobile', defaultValues[valueTopMobile.label], true );
456 onChangeRightValue( '', 'mobile', defaultValues[valueRightMobile.label], true );
457 onChangeBottomValue( '', 'mobile', defaultValues[valueBottomMobile.label], true );
458 onChangeLeftValue( '', 'mobile', defaultValues[valueLeftMobile.label], true );
459 setAttributes( { [ mUnit?.label ]: defaultValues[mUnit?.label] } );
460 break;
461 }
462 };
463 return (
464 <div className="components-base-control uagb-spacing-control">
465 <div className="uagb-size-type-field-tabs">
466 <div className="uagb-control__header">
467 <ResponsiveToggle
468 label= { label }
469 responsive= { responsive }
470 />
471 <div className="uagb-control__actions">
472 <UAGReset
473 onReset={resetValues}
474 attributeNames = {[
475 valueTop?.label,
476 valueRight?.label,
477 valueBottom?.label,
478 valueLeft?.label,
479 valueTopTablet?.label,
480 valueRightTablet?.label,
481 valueBottomTablet?.label,
482 valueLeftTablet?.label,
483 valueTopMobile?.label,
484 valueRightMobile?.label,
485 valueBottomMobile?.label,
486 valueLeftMobile?.label,
487 unit?.label,
488 tUnit?.label,
489 mUnit?.label
490 ]}
491 />
492 <ButtonGroup
493 className="uagb-control__units"
494 aria-label={ __(
495 'Select Units',
496 'ultimate-addons-for-gutenberg'
497 ) }
498 >
499 { !disableUnits && onUnitSizeClick( unitSizes ) }
500 </ButtonGroup>
501 </div>
502 </div>
503 { output[ deviceType ] ? output[ deviceType ] : output.Desktop }
504 <div className="uagb-spacing-control__input-labels">
505 <span className="uagb-spacing-control__number-label">
506 { __( 'Top', 'ultimate-addons-for-gutenberg' ) }
507 </span>
508 <span className="uagb-spacing-control__number-label">
509 { __( 'Right', 'ultimate-addons-for-gutenberg' ) }
510 </span>
511 <span className="uagb-spacing-control__number-label">
512 { __( 'Bottom', 'ultimate-addons-for-gutenberg' ) }
513 </span>
514 <span className="uagb-spacing-control__number-label">
515 { __( 'Left', 'ultimate-addons-for-gutenberg' ) }
516 </span>
517 <span className="uagb-spacing-control__number-label uagb-spacing-control__link-label"></span>
518 </div>
519 </div>
520 { props.help && (
521 <p className="uag-control-help-notice">{ props.help }</p>
522 ) }
523 </div>
524 );
525
526 };
527
528 export default SpacingControl;
529