@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
384 lines (382 loc) • 15.4 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// packages/editor/src/components/provider/use-block-editor-settings.js
var use_block_editor_settings_exports = {};
__export(use_block_editor_settings_exports, {
default: () => use_block_editor_settings_default
});
module.exports = __toCommonJS(use_block_editor_settings_exports);
var import_element = require("@wordpress/element");
var import_data = require("@wordpress/data");
var import_core_data = require("@wordpress/core-data");
var import_i18n = require("@wordpress/i18n");
var import_preferences = require("@wordpress/preferences");
var import_compose = require("@wordpress/compose");
var import_blocks = require("@wordpress/blocks");
var import_block_editor = require("@wordpress/block-editor");
var import_media_categories = __toESM(require("../media-categories/index.cjs"));
var import_utils = require("../../utils/index.cjs");
var import_on_success = __toESM(require("../../utils/media-upload/on-success.cjs"));
var import_media_sideload = __toESM(require("../../utils/media-sideload/index.cjs"));
var import_media_finalize = __toESM(require("../../utils/media-finalize/index.cjs"));
var import_store = require("../../store/index.cjs");
var import_lock_unlock = require("../../lock-unlock.cjs");
var import_global_styles_provider = require("../global-styles-provider/index.cjs");
var EMPTY_OBJECT = {};
function __experimentalReusableBlocksSelect(select) {
const { RECEIVE_INTERMEDIATE_RESULTS } = (0, import_lock_unlock.unlock)(import_core_data.privateApis);
const { getEntityRecords } = select(import_core_data.store);
return getEntityRecords("postType", "wp_block", {
per_page: -1,
[RECEIVE_INTERMEDIATE_RESULTS]: true
});
}
var BLOCK_EDITOR_SETTINGS = [
"__experimentalBlockBindingsSupportedAttributes",
"__experimentalBlockDirectory",
"__experimentalDiscussionSettings",
"__experimentalFeatures",
"__experimentalGlobalStylesBaseStyles",
"allImageSizes",
"alignWide",
"blockInspectorTabs",
"maxUploadFileSize",
"allowedMimeTypes",
"bodyPlaceholder",
"canEditCSS",
"canLockBlocks",
"canUpdateBlockBindings",
"capabilities",
"clearBlockSelection",
"codeEditingEnabled",
"colors",
"disableContentOnlyForUnsyncedPatterns",
"disableCustomColors",
"disableCustomFontSizes",
"disableCustomSpacingSizes",
"disableCustomGradients",
"disableLayoutStyles",
"enableCustomLineHeight",
"enableCustomSpacing",
"enableCustomUnits",
"enableOpenverseMediaCategory",
"fontSizes",
"gradients",
"generateAnchors",
"onNavigateToEntityRecord",
"imageDefaultSize",
"imageDimensions",
"imageEditing",
"imageSizes",
"isPreviewMode",
"isRTL",
"locale",
"maxWidth",
"postContentAttributes",
"postsPerPage",
"readOnly",
"styles",
"titlePlaceholder",
"supportsLayout",
"widgetTypesToHideFromLegacyWidgetBlock",
"__unstableHasCustomAppender",
"__unstableResolvedAssets",
"__unstableIsBlockBasedTheme"
];
var {
globalStylesDataKey,
globalStylesLinksDataKey,
selectBlockPatternsKey,
reusableBlocksSelectKey,
sectionRootClientIdKey,
mediaEditKey,
getMediaSelectKey,
isIsolatedEditorKey,
deviceTypeKey,
isNavigationOverlayContextKey,
isNavigationPostEditorKey,
mediaUploadOnSuccessKey
} = (0, import_lock_unlock.unlock)(import_block_editor.privateApis);
function useBlockEditorSettings(settings, postType, postId, renderingMode) {
const isLargeViewport = (0, import_compose.useViewportMatch)("medium");
const {
allImageSizes,
bigImageSizeThreshold,
allowRightClickOverrides,
blockTypes,
focusMode,
hasFixedToolbar,
isDistractionFree,
keepCaretInsideBlock,
hasUploadPermissions,
hiddenBlockTypes,
canUseUnfilteredHTML,
userCanCreatePages,
pageOnFront,
pageForPosts,
userPatternCategories,
restBlockPatternCategories,
sectionRootClientId,
deviceType,
isNavigationOverlayContext,
isRevisionsMode
} = (0, import_data.useSelect)(
(select) => {
const {
canUser,
getRawEntityRecord,
getEntityRecord,
getUserPatternCategories,
getBlockPatternCategories
} = select(import_core_data.store);
const { get } = select(import_preferences.store);
const { getBlockTypes } = select(import_blocks.store);
const { getDeviceType, isRevisionsMode: _isRevisionsMode } = (0, import_lock_unlock.unlock)(
select(import_store.store)
);
const { getBlocksByName, getBlockAttributes } = select(import_block_editor.store);
const siteSettings = canUser("read", {
kind: "root",
name: "site"
}) ? getEntityRecord("root", "site") : void 0;
const baseData = getEntityRecord("root", "__unstableBase");
function getSectionRootBlock() {
if (renderingMode === "template-locked") {
return getBlocksByName("core/post-content")?.[0] ?? "";
}
return getBlocksByName("core/group").find(
(clientId) => getBlockAttributes(clientId)?.tagName === "main"
) ?? "";
}
return {
allImageSizes: baseData?.image_sizes,
bigImageSizeThreshold: baseData?.image_size_threshold,
allowRightClickOverrides: get(
"core",
"allowRightClickOverrides"
),
blockTypes: getBlockTypes(),
canUseUnfilteredHTML: getRawEntityRecord(
"postType",
postType,
postId
)?._links?.hasOwnProperty("wp:action-unfiltered-html"),
focusMode: get("core", "focusMode"),
hasFixedToolbar: get("core", "fixedToolbar") || !isLargeViewport,
hiddenBlockTypes: get("core", "hiddenBlockTypes"),
isDistractionFree: get("core", "distractionFree"),
keepCaretInsideBlock: get("core", "keepCaretInsideBlock"),
hasUploadPermissions: canUser("create", {
kind: "postType",
name: "attachment"
}) ?? true,
userCanCreatePages: canUser("create", {
kind: "postType",
name: "page"
}),
pageOnFront: siteSettings?.page_on_front,
pageForPosts: siteSettings?.page_for_posts,
userPatternCategories: getUserPatternCategories(),
restBlockPatternCategories: getBlockPatternCategories(),
sectionRootClientId: getSectionRootBlock(),
deviceType: getDeviceType(),
isNavigationOverlayContext: postType === "wp_template_part" && postId ? getEntityRecord(
"postType",
"wp_template_part",
postId
)?.area === "navigation-overlay" : false,
isRevisionsMode: _isRevisionsMode()
};
},
[postType, postId, isLargeViewport, renderingMode]
);
const { merged: mergedGlobalStyles } = (0, import_global_styles_provider.useGlobalStylesContext)();
const globalStylesData = mergedGlobalStyles.styles ?? EMPTY_OBJECT;
const globalStylesLinksData = mergedGlobalStyles._links ?? EMPTY_OBJECT;
const settingsBlockPatterns = settings.__experimentalAdditionalBlockPatterns ?? // WP 6.0
settings.__experimentalBlockPatterns;
const settingsBlockPatternCategories = settings.__experimentalAdditionalBlockPatternCategories ?? // WP 6.0
settings.__experimentalBlockPatternCategories;
const blockPatterns = (0, import_element.useMemo)(
() => [...settingsBlockPatterns || []].filter(
({ postTypes }) => {
return !postTypes || Array.isArray(postTypes) && postTypes.includes(postType);
}
),
[settingsBlockPatterns, postType]
);
const blockPatternCategories = (0, import_element.useMemo)(
() => [
...settingsBlockPatternCategories || [],
...restBlockPatternCategories || []
].filter(
(x, index, arr) => index === arr.findIndex((y) => x.name === y.name)
),
[settingsBlockPatternCategories, restBlockPatternCategories]
);
const { undo, setIsInserterOpened } = (0, import_data.useDispatch)(import_store.store);
const { editMediaEntity } = (0, import_lock_unlock.unlock)((0, import_data.useDispatch)(import_core_data.store));
const { saveEntityRecord } = (0, import_data.useDispatch)(import_core_data.store);
const createPageEntity = (0, import_element.useCallback)(
(options) => {
if (!userCanCreatePages) {
return Promise.reject({
message: (0, import_i18n.__)(
"You do not have permission to create Pages."
)
});
}
return saveEntityRecord("postType", "page", options);
},
[saveEntityRecord, userCanCreatePages]
);
const allowedBlockTypes = (0, import_element.useMemo)(() => {
if (hiddenBlockTypes && hiddenBlockTypes.length > 0) {
const defaultAllowedBlockTypes = true === settings.allowedBlockTypes ? blockTypes.map(({ name }) => name) : settings.allowedBlockTypes || [];
return defaultAllowedBlockTypes.filter(
(type) => !hiddenBlockTypes.includes(type)
);
}
return settings.allowedBlockTypes;
}, [settings.allowedBlockTypes, hiddenBlockTypes, blockTypes]);
const forceDisableFocusMode = settings.focusMode === false;
return (0, import_element.useMemo)(() => {
const blockEditorSettings = {
...Object.fromEntries(
Object.entries(settings).filter(
([key]) => BLOCK_EDITOR_SETTINGS.includes(key)
)
),
[globalStylesDataKey]: globalStylesData,
[globalStylesLinksDataKey]: globalStylesLinksData,
allImageSizes,
bigImageSizeThreshold,
allowedBlockTypes,
allowRightClickOverrides,
focusMode: focusMode && !forceDisableFocusMode,
hasFixedToolbar,
isDistractionFree,
keepCaretInsideBlock,
[getMediaSelectKey]: (select, attachmentId) => {
return select(import_core_data.store).getEntityRecord(
"postType",
"attachment",
attachmentId
);
},
[mediaEditKey]: hasUploadPermissions ? editMediaEntity : void 0,
mediaUpload: hasUploadPermissions ? import_utils.mediaUpload : void 0,
[mediaUploadOnSuccessKey]: hasUploadPermissions ? import_on_success.default : void 0,
mediaSideload: hasUploadPermissions ? import_media_sideload.default : void 0,
mediaFinalize: hasUploadPermissions ? import_media_finalize.default : void 0,
__experimentalBlockPatterns: blockPatterns,
[selectBlockPatternsKey]: (select) => {
const { hasFinishedResolution, getBlockPatternsForPostType } = (0, import_lock_unlock.unlock)(select(import_core_data.store));
const patterns = getBlockPatternsForPostType(postType);
return hasFinishedResolution("getBlockPatterns") ? patterns : void 0;
},
[reusableBlocksSelectKey]: __experimentalReusableBlocksSelect,
__experimentalBlockPatternCategories: blockPatternCategories,
__experimentalUserPatternCategories: userPatternCategories,
__experimentalFetchLinkSuggestions: (search, searchOptions) => (0, import_core_data.__experimentalFetchLinkSuggestions)(search, searchOptions, settings),
inserterMediaCategories: import_media_categories.default,
__experimentalFetchRichUrlData: import_core_data.__experimentalFetchUrlData,
// Todo: This only checks the top level post, not the post within a template or any other entity that can be edited.
// This might be better as a generic "canUser" selector.
__experimentalCanUserUseUnfilteredHTML: canUseUnfilteredHTML,
//Todo: this is only needed for native and should probably be removed.
__experimentalUndo: undo,
// Check whether we want all site editor frames to have outlines
// including the navigation / pattern / parts editors.
outlineMode: !isDistractionFree && postType === "wp_template",
// Check these two properties: they were not present in the site editor.
__experimentalCreatePageEntity: createPageEntity,
__experimentalUserCanCreatePages: userCanCreatePages,
pageOnFront,
pageForPosts,
__experimentalPreferPatternsOnRoot: postType === "wp_template",
templateLock: postType === "wp_navigation" ? "insert" : settings.templateLock,
template: postType === "wp_navigation" ? [["core/navigation", {}, []]] : settings.template,
__experimentalSetIsInserterOpened: setIsInserterOpened,
[sectionRootClientIdKey]: sectionRootClientId,
editorTool: renderingMode === "post-only" && postType !== "wp_template" ? "edit" : void 0,
// When editing template parts, patterns, or navigation directly,
// we're in an isolated editing context (focused on that entity alone).
[isIsolatedEditorKey]: [
"wp_template_part",
"wp_block",
"wp_navigation"
].includes(postType),
[isNavigationPostEditorKey]: postType === "wp_navigation",
// When in template-locked mode (e.g., "Show Template" in the post editor),
// don't treat template parts as contentOnly sections.
disableContentOnlyForTemplateParts: renderingMode === "template-locked",
...deviceType ? { [deviceTypeKey]: deviceType } : {},
[isNavigationOverlayContextKey]: isNavigationOverlayContext
};
if (isRevisionsMode) {
blockEditorSettings.isPreviewMode = true;
}
return blockEditorSettings;
}, [
isRevisionsMode,
allowedBlockTypes,
allowRightClickOverrides,
focusMode,
forceDisableFocusMode,
hasFixedToolbar,
isDistractionFree,
keepCaretInsideBlock,
settings,
hasUploadPermissions,
userPatternCategories,
blockPatterns,
blockPatternCategories,
canUseUnfilteredHTML,
undo,
createPageEntity,
userCanCreatePages,
pageOnFront,
pageForPosts,
postType,
setIsInserterOpened,
sectionRootClientId,
globalStylesData,
globalStylesLinksData,
renderingMode,
editMediaEntity,
settings.onNavigateToEntityRecord,
deviceType,
allImageSizes,
bigImageSizeThreshold,
isNavigationOverlayContext
]);
}
var use_block_editor_settings_default = useBlockEditorSettings;
//# sourceMappingURL=use-block-editor-settings.cjs.map