@wordpress/block-library
Version:
Block library for the WordPress editor.
284 lines (283 loc) • 8.27 kB
JavaScript
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
import clsx from "clsx";
import { memo, useMemo, useState } from "@wordpress/element";
import { useSelect } from "@wordpress/data";
import { __, _x } from "@wordpress/i18n";
import {
BlockControls,
BlockContextProvider,
__experimentalUseBlockPreview as useBlockPreview,
useBlockProps,
useInnerBlocksProps,
store as blockEditorStore
} from "@wordpress/block-editor";
import { Spinner, ToolbarGroup } from "@wordpress/components";
import { store as coreStore } from "@wordpress/core-data";
import { list, grid } from "@wordpress/icons";
const TEMPLATE = [
["core/post-title"],
["core/post-date"],
["core/post-excerpt"]
];
function PostTemplateInnerBlocks({ classList }) {
const innerBlocksProps = useInnerBlocksProps(
{ className: clsx("wp-block-post", classList) },
{ template: TEMPLATE, __unstableDisableLayoutClassNames: true }
);
return /* @__PURE__ */ jsx("li", { ...innerBlocksProps });
}
function PostTemplateBlockPreview({
blocks,
blockContextId,
classList,
isHidden,
setActiveBlockContextId
}) {
const blockPreviewProps = useBlockPreview({
blocks,
props: {
className: clsx("wp-block-post", classList)
}
});
const handleOnClick = () => {
setActiveBlockContextId(blockContextId);
};
const style = {
display: isHidden ? "none" : void 0
};
return /* @__PURE__ */ jsx(
"li",
{
...blockPreviewProps,
tabIndex: 0,
role: "button",
onClick: handleOnClick,
onKeyPress: handleOnClick,
style
}
);
}
const MemoizedPostTemplateBlockPreview = memo(PostTemplateBlockPreview);
function PostTemplateEdit({
setAttributes,
clientId,
context: {
query: {
perPage,
offset = 0,
postType,
order,
orderBy,
author,
search,
exclude,
sticky,
inherit,
taxQuery,
parents,
pages,
format,
// We gather extra query args to pass to the REST API call.
// This way extenders of Query Loop can add their own query args,
// and have accurate previews in the editor.
// Noting though that these args should either be supported by the
// REST API or be handled by custom REST filters like `rest_{$this->post_type}_query`.
...restQueryArgs
} = {},
templateSlug,
previewPostType
},
attributes: { layout },
__unstableLayoutClassNames
}) {
const { type: layoutType, columnCount = 3 } = layout || {};
const [activeBlockContextId, setActiveBlockContextId] = useState();
const { posts, blocks } = useSelect(
(select) => {
const { getEntityRecords, getTaxonomies } = select(coreStore);
const { getBlocks } = select(blockEditorStore);
const templateCategory = inherit && templateSlug?.startsWith("category-") && getEntityRecords("taxonomy", "category", {
context: "view",
per_page: 1,
_fields: ["id"],
slug: templateSlug.replace("category-", "")
});
const templateTag = inherit && templateSlug?.startsWith("tag-") && getEntityRecords("taxonomy", "post_tag", {
context: "view",
per_page: 1,
_fields: ["id"],
slug: templateSlug.replace("tag-", "")
});
const query = {
offset: offset || 0,
order,
orderby: orderBy
};
if (taxQuery && !inherit) {
const taxonomies = getTaxonomies({
type: postType,
per_page: -1,
context: "view"
});
const builtTaxQuery = Object.entries(taxQuery).reduce(
(accumulator, [taxonomySlug, terms]) => {
const taxonomy = taxonomies?.find(
({ slug }) => slug === taxonomySlug
);
if (taxonomy?.rest_base) {
accumulator[taxonomy?.rest_base] = terms;
}
return accumulator;
},
{}
);
if (!!Object.keys(builtTaxQuery).length) {
Object.assign(query, builtTaxQuery);
}
}
if (perPage) {
query.per_page = perPage;
}
if (author) {
query.author = author;
}
if (search) {
query.search = search;
}
if (exclude?.length) {
query.exclude = exclude;
}
if (parents?.length) {
query.parent = parents;
}
if (format?.length) {
query.format = format;
}
if (["exclude", "only"].includes(sticky)) {
query.sticky = sticky === "only";
}
if (["", "ignore"].includes(sticky)) {
delete query.sticky;
query.ignore_sticky = sticky === "ignore";
}
let currentPostType = postType;
if (inherit) {
if (templateSlug?.startsWith("archive-")) {
query.postType = templateSlug.replace("archive-", "");
currentPostType = query.postType;
} else if (templateCategory) {
query.categories = templateCategory[0]?.id;
} else if (templateTag) {
query.tags = templateTag[0]?.id;
} else if (templateSlug?.startsWith("taxonomy-post_format")) {
query.format = templateSlug.replace(
"taxonomy-post_format-post-format-",
""
);
}
}
const usedPostType = previewPostType || currentPostType;
return {
posts: getEntityRecords("postType", usedPostType, {
...query,
...restQueryArgs
}),
blocks: getBlocks(clientId)
};
},
[
perPage,
offset,
order,
orderBy,
clientId,
author,
search,
postType,
exclude,
sticky,
inherit,
templateSlug,
taxQuery,
parents,
format,
restQueryArgs,
previewPostType
]
);
const blockContexts = useMemo(
() => posts?.map((post) => ({
postType: post.type,
postId: post.id,
classList: post.class_list ?? ""
})),
[posts]
);
const blockProps = useBlockProps({
className: clsx(__unstableLayoutClassNames, {
[`columns-${columnCount}`]: layoutType === "grid" && columnCount
// Ensure column count is flagged via classname for backwards compatibility.
})
});
if (!posts) {
return /* @__PURE__ */ jsx("p", { ...blockProps, children: /* @__PURE__ */ jsx(Spinner, {}) });
}
if (!posts.length) {
return /* @__PURE__ */ jsxs("p", { ...blockProps, children: [
" ",
__("No results found.")
] });
}
const setDisplayLayout = (newDisplayLayout) => setAttributes({
layout: { ...layout, ...newDisplayLayout }
});
const displayLayoutControls = [
{
icon: list,
title: _x("List view", "Post template block display setting"),
onClick: () => setDisplayLayout({ type: "default" }),
isActive: layoutType === "default" || layoutType === "constrained"
},
{
icon: grid,
title: _x("Grid view", "Post template block display setting"),
onClick: () => setDisplayLayout({
type: "grid",
columnCount
}),
isActive: layoutType === "grid"
}
];
return /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx(BlockControls, { children: /* @__PURE__ */ jsx(ToolbarGroup, { controls: displayLayoutControls }) }),
/* @__PURE__ */ jsx("ul", { ...blockProps, children: blockContexts && blockContexts.map((blockContext) => /* @__PURE__ */ jsxs(
BlockContextProvider,
{
value: blockContext,
children: [
blockContext.postId === (activeBlockContextId || blockContexts[0]?.postId) ? /* @__PURE__ */ jsx(
PostTemplateInnerBlocks,
{
classList: blockContext.classList
}
) : null,
/* @__PURE__ */ jsx(
MemoizedPostTemplateBlockPreview,
{
blocks,
blockContextId: blockContext.postId,
classList: blockContext.classList,
setActiveBlockContextId,
isHidden: blockContext.postId === (activeBlockContextId || blockContexts[0]?.postId)
}
)
]
},
blockContext.postId
)) })
] });
}
export {
PostTemplateEdit as default
};
//# sourceMappingURL=edit.js.map