UNPKG

@wordpress/block-editor

Version:
155 lines (154 loc) 5.3 kB
// packages/block-editor/src/hooks/block-fields/index.js import { privateApis as blocksPrivateApis, getBlockType } from "@wordpress/blocks"; import { __experimentalHStack as HStack, __experimentalTruncate as Truncate } from "@wordpress/components"; import { useSelect } from "@wordpress/data"; import { DataForm } from "@wordpress/dataviews"; import { useContext, useState, useMemo } from "@wordpress/element"; import { __ } from "@wordpress/i18n"; import { store as blockEditorStore } from "../../store/index.mjs"; import { unlock } from "../../lock-unlock.mjs"; import BlockIcon from "../../components/block-icon/index.mjs"; import useBlockDisplayTitle from "../../components/block-title/use-block-display-title.mjs"; import useBlockDisplayInformation from "../../components/use-block-display-information/index.mjs"; import FieldsDropdownMenu from "./fields-dropdown-menu.mjs"; import { PrivateBlockContext } from "../../components/block-list/private-block-context.mjs"; import InspectorControls from "../../components/inspector-controls/fill.mjs"; import RichText from "./rich-text/index.mjs"; import Media from "./media/index.mjs"; import Link from "./link/index.mjs"; import { Fragment, jsx, jsxs } from "react/jsx-runtime"; var { fieldsKey, formKey } = unlock(blocksPrivateApis); function createConfiguredControl(ControlComponent, config = {}) { return function ConfiguredControl(props) { return /* @__PURE__ */ jsx(ControlComponent, { ...props, config }); }; } function BlockFields({ clientId, blockType, setAttributes, isCollapsed = false }) { const blockTitle = useBlockDisplayTitle({ clientId, context: "list-view" }); const blockInformation = useBlockDisplayInformation(clientId); const blockTypeFields = blockType?.[fieldsKey]; const attributes = useSelect( (select) => select(blockEditorStore).getBlockAttributes(clientId), [clientId] ); const computedForm = useMemo(() => { if (!isCollapsed) { return blockType?.[formKey]; } return { ...blockType?.[formKey], fields: [blockType?.[formKey]?.fields?.[0]] }; }, [blockType, isCollapsed]); const [form, setForm] = useState(computedForm); const dataFormFields = useMemo(() => { if (!blockTypeFields?.length) { return []; } return blockTypeFields.map((fieldDef) => { const field = { ...fieldDef }; if ("string" === typeof fieldDef.Edit && fieldDef.Edit === "rich-text") { field.Edit = createConfiguredControl(RichText, { clientId }); } else if ("string" === typeof fieldDef.Edit && fieldDef.Edit === "link") { field.Edit = createConfiguredControl(Link); } else if ("object" === typeof fieldDef.Edit && fieldDef.Edit.control === "media") { field.Edit = createConfiguredControl(Media, { ...fieldDef.Edit }); } return field; }); }, [blockTypeFields, clientId]); if (!blockTypeFields?.length) { return null; } const handleToggleField = (fieldId) => { setForm((prev) => { if (prev.fields?.includes(fieldId)) { return { ...prev, fields: prev.fields.filter((id) => id !== fieldId) }; } return { ...prev, fields: [...prev.fields || [], fieldId] }; }); }; return /* @__PURE__ */ jsxs("div", { className: "block-editor-block-fields__container", children: [ /* @__PURE__ */ jsx("div", { className: "block-editor-block-fields__header", children: /* @__PURE__ */ jsxs(HStack, { spacing: 1, children: [ isCollapsed && /* @__PURE__ */ jsxs(Fragment, { children: [ /* @__PURE__ */ jsx( BlockIcon, { className: "block-editor-block-fields__header-icon", icon: blockInformation?.icon } ), /* @__PURE__ */ jsx("h2", { className: "block-editor-block-fields__header-title", children: /* @__PURE__ */ jsx(Truncate, { numberOfLines: 1, children: blockTitle }) }), /* @__PURE__ */ jsx( FieldsDropdownMenu, { fields: dataFormFields, visibleFields: form.fields, onToggleField: handleToggleField } ) ] }), !isCollapsed && /* @__PURE__ */ jsx("h2", { className: "block-editor-block-fields__header-title", children: __("Content") }) ] }) }), /* @__PURE__ */ jsx( DataForm, { data: attributes, fields: dataFormFields, form, onChange: setAttributes } ) ] }); } function hasBlockFieldsSupport(blockName) { return !!(window?.__experimentalContentOnlyInspectorFields && getBlockType(blockName)?.[fieldsKey]); } function BlockFieldsPanel(props) { const { blockType, isSelectionWithinCurrentSection } = useContext(PrivateBlockContext); return /* @__PURE__ */ jsx(InspectorControls, { group: "content", children: /* @__PURE__ */ jsx( BlockFields, { ...props, blockType, isCollapsed: isSelectionWithinCurrentSection } ) }); } var block_fields_default = { edit: BlockFieldsPanel, hasSupport: hasBlockFieldsSupport, attributeKeys: [], supportsPatternEditing: true }; export { BlockFieldsPanel, block_fields_default as default }; //# sourceMappingURL=index.mjs.map