From 99456a694ff405446a6d3e7cfcbb620289b45c1e Mon Sep 17 00:00:00 2001 From: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com> Date: Wed, 12 Mar 2025 18:25:14 +1000 Subject: [PATCH 01/56] Add base form field blocks Introduces foundational form field blocks: - jetpack/input - jetpack/label - jetpack/option - jetpack/options These blocks will be reused across all field types using inner blocks. --- .../packages/forms/src/blocks/input/edit.js | 113 +++++++++++++++++ .../packages/forms/src/blocks/input/index.js | 74 +++++++++++ .../packages/forms/src/blocks/input/save.js | 1 + .../packages/forms/src/blocks/label/edit.js | 74 +++++++++++ .../packages/forms/src/blocks/label/index.js | 65 ++++++++++ .../packages/forms/src/blocks/label/save.js | 1 + .../packages/forms/src/blocks/option/edit.js | 104 +++++++++++++++ .../packages/forms/src/blocks/option/index.js | 83 ++++++++++++ .../packages/forms/src/blocks/option/save.js | 1 + .../forms/src/blocks/option/use-enter.js | 83 ++++++++++++ .../packages/forms/src/blocks/options/edit.js | 16 +++ .../forms/src/blocks/options/index.js | 26 ++++ .../packages/forms/src/blocks/options/save.js | 7 + .../use-insert-after-on-enter-key-down.js | 42 ++++++ .../shared/hooks/use-sync-style-attributes.js | 120 ++++++++++++++++++ .../forms/src/blocks/shared/util/constants.js | 44 +++++++ .../src/blocks/shared/util/get-block-style.js | 6 + 17 files changed, 860 insertions(+) create mode 100644 projects/packages/forms/src/blocks/input/edit.js create mode 100644 projects/packages/forms/src/blocks/input/index.js create mode 100644 projects/packages/forms/src/blocks/input/save.js create mode 100644 projects/packages/forms/src/blocks/label/edit.js create mode 100644 projects/packages/forms/src/blocks/label/index.js create mode 100644 projects/packages/forms/src/blocks/label/save.js create mode 100644 projects/packages/forms/src/blocks/option/edit.js create mode 100644 projects/packages/forms/src/blocks/option/index.js create mode 100644 projects/packages/forms/src/blocks/option/save.js create mode 100644 projects/packages/forms/src/blocks/option/use-enter.js create mode 100644 projects/packages/forms/src/blocks/options/edit.js create mode 100644 projects/packages/forms/src/blocks/options/index.js create mode 100644 projects/packages/forms/src/blocks/options/save.js create mode 100644 projects/packages/forms/src/blocks/shared/hooks/use-insert-after-on-enter-key-down.js create mode 100644 projects/packages/forms/src/blocks/shared/hooks/use-sync-style-attributes.js create mode 100644 projects/packages/forms/src/blocks/shared/util/constants.js create mode 100644 projects/packages/forms/src/blocks/shared/util/get-block-style.js diff --git a/projects/packages/forms/src/blocks/input/edit.js b/projects/packages/forms/src/blocks/input/edit.js new file mode 100644 index 0000000000000..116c1f1523dd8 --- /dev/null +++ b/projects/packages/forms/src/blocks/input/edit.js @@ -0,0 +1,113 @@ +import { InspectorControls, RichText, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, __experimentalNumberControl as NumberControl } from '@wordpress/components'; // eslint-disable-line @wordpress/no-unsafe-wp-apis +import { useCallback } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { clsx } from 'clsx'; +import useInsertAfterOnEnterKeyDown from '../shared/hooks/use-insert-after-on-enter-key-down'; +import useSyncStyleAttributes from '../shared/hooks/use-sync-style-attributes'; +import { ALLOWED_FORMATS } from '../shared/util/constants.js'; + +const SYNCED_ATTRIBUTES = [ + 'backgroundColor', + 'borderColor', + 'fontFamily', + 'fontSize', + 'style', + 'textColor', +]; + +const TEXT_FIELDS = [ 'number', 'text', 'email', 'url', 'tel' ]; + +const getInputClass = type => { + if ( type === 'dropdown' ) { + return 'jetpack-field-dropdown__toggle'; + } + if ( type && ! TEXT_FIELDS.includes( type ) ) { + return `jetpack-field__${ type }`; + } + return 'jetpack-field__input'; +}; + +const InputEdit = ( { attributes, clientId, isSelected, name, setAttributes } ) => { + useSyncStyleAttributes( clientId, name, 'jetpack/contact-form', SYNCED_ATTRIBUTES ); + + const { max, min, placeholder, type } = attributes; + const className = clsx( getInputClass( attributes.type ), { + inline: type === 'checkbox' || type === 'radio', + } ); + const blockProps = useBlockProps( { className } ); + const onKeyDown = useInsertAfterOnEnterKeyDown( clientId ); + + const onChange = useCallback( + event => { + setAttributes( { placeholder: event.target.value } ); + }, + [ setAttributes ] + ); + + if ( type === 'dropdown' ) { + return ( +
+ + +
+ ); + } + + if ( type === 'textarea' ) { + return