UNPKG

@wordpress/block-library

Version:
108 lines (101 loc) 3.96 kB
import { createElement, Fragment } from "@wordpress/element"; /** * External dependencies */ import classnames from 'classnames'; /** * WordPress dependencies */ import { useEntityProp } from '@wordpress/core-data'; import { useMemo } from '@wordpress/element'; import { AlignmentToolbar, BlockControls, InspectorControls, RichText, Warning, useBlockProps } from '@wordpress/block-editor'; import { PanelBody, ToggleControl } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ import { useCanEditEntity } from '../utils/hooks'; export default function PostExcerptEditor(_ref) { let { attributes: { textAlign, moreText, showMoreOnNewLine }, setAttributes, isSelected, context: { postId, postType, queryId } } = _ref; const isDescendentOfQueryLoop = Number.isFinite(queryId); const userCanEdit = useCanEditEntity('postType', postType, postId); const isEditable = userCanEdit && !isDescendentOfQueryLoop; const [rawExcerpt, setExcerpt, { rendered: renderedExcerpt, protected: isProtected } = {}] = useEntityProp('postType', postType, 'excerpt', postId); const blockProps = useBlockProps({ className: classnames({ [`has-text-align-${textAlign}`]: textAlign }) }); /** * When excerpt is editable, strip the html tags from * rendered excerpt. This will be used if the entity's * excerpt has been produced from the content. */ const strippedRenderedExcerpt = useMemo(() => { if (!renderedExcerpt) return ''; const document = new window.DOMParser().parseFromString(renderedExcerpt, 'text/html'); return document.body.textContent || document.body.innerText || ''; }, [renderedExcerpt]); if (!postType || !postId) { return createElement("div", blockProps, createElement("p", null, __('This is the Post Excerpt block, it will display the excerpt from single posts.')), createElement("p", null, __('If there are any Custom Post Types with support for excerpts, the Post Excerpt block can display the excerpts of those entries as well.'))); } if (isProtected && !userCanEdit) { return createElement("div", blockProps, createElement(Warning, null, __('There is no excerpt because this is a protected post.'))); } const readMoreLink = createElement(RichText, { className: "wp-block-post-excerpt__more-link", tagName: "a", "aria-label": __('“Read more” link text'), placeholder: __('Add "read more" link text'), value: moreText, onChange: newMoreText => setAttributes({ moreText: newMoreText }), withoutInteractiveFormatting: true }); const excerptClassName = classnames('wp-block-post-excerpt__excerpt', { 'is-inline': !showMoreOnNewLine }); const excerptContent = isEditable ? createElement(RichText, { className: excerptClassName, "aria-label": __('Post excerpt text'), value: rawExcerpt || strippedRenderedExcerpt || (isSelected ? '' : __('No post excerpt found')), onChange: setExcerpt, tagName: "p" }) : createElement("p", { className: excerptClassName }, strippedRenderedExcerpt || __('No post excerpt found')); return createElement(Fragment, null, createElement(BlockControls, null, createElement(AlignmentToolbar, { value: textAlign, onChange: newAlign => setAttributes({ textAlign: newAlign }) })), createElement(InspectorControls, null, createElement(PanelBody, { title: __('Settings') }, createElement(ToggleControl, { label: __('Show link on new line'), checked: showMoreOnNewLine, onChange: newShowMoreOnNewLine => setAttributes({ showMoreOnNewLine: newShowMoreOnNewLine }) }))), createElement("div", blockProps, excerptContent, !showMoreOnNewLine && ' ', showMoreOnNewLine ? createElement("p", { className: "wp-block-post-excerpt__more-text" }, readMoreLink) : readMoreLink)); } //# sourceMappingURL=edit.js.map