diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 07:57:26 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 07:57:26 +0000 |
commit | 30883c26bdceb9eaf32c8d4a1b0c1bce223b5226 (patch) | |
tree | 39a02e2aeb21ab5b7923c6f5757d66d55b708912 /wp-includes/js/dist/patterns.js | |
parent | Adding upstream version 6.4.3+dfsg1. (diff) | |
download | wordpress-30883c26bdceb9eaf32c8d4a1b0c1bce223b5226.tar.xz wordpress-30883c26bdceb9eaf32c8d4a1b0c1bce223b5226.zip |
Adding upstream version 6.5+dfsg1.upstream/6.5+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'wp-includes/js/dist/patterns.js')
-rw-r--r-- | wp-includes/js/dist/patterns.js | 854 |
1 files changed, 710 insertions, 144 deletions
diff --git a/wp-includes/js/dist/patterns.js b/wp-includes/js/dist/patterns.js index 98cb7e5..51de108 100644 --- a/wp-includes/js/dist/patterns.js +++ b/wp-includes/js/dist/patterns.js @@ -1,36 +1,36 @@ -/******/ (function() { // webpackBootstrap +/******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ // The require scope /******/ var __webpack_require__ = {}; /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ -/******/ !function() { +/******/ (() => { /******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = function(exports, definition) { +/******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; -/******/ }(); +/******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ -/******/ !function() { +/******/ (() => { /******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { +/******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; -/******/ }(); +/******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; @@ -39,29 +39,29 @@ __webpack_require__.r(__webpack_exports__); // EXPORTS __webpack_require__.d(__webpack_exports__, { - privateApis: function() { return /* reexport */ privateApis; }, - store: function() { return /* reexport */ store; } + privateApis: () => (/* reexport */ privateApis), + store: () => (/* reexport */ store) }); // NAMESPACE OBJECT: ./node_modules/@wordpress/patterns/build-module/store/actions.js var actions_namespaceObject = {}; __webpack_require__.r(actions_namespaceObject); __webpack_require__.d(actions_namespaceObject, { - convertSyncedPatternToStatic: function() { return convertSyncedPatternToStatic; }, - createPattern: function() { return createPattern; }, - createPatternFromFile: function() { return createPatternFromFile; }, - setEditingPattern: function() { return setEditingPattern; } + convertSyncedPatternToStatic: () => (convertSyncedPatternToStatic), + createPattern: () => (createPattern), + createPatternFromFile: () => (createPatternFromFile), + setEditingPattern: () => (setEditingPattern) }); // NAMESPACE OBJECT: ./node_modules/@wordpress/patterns/build-module/store/selectors.js var selectors_namespaceObject = {}; __webpack_require__.r(selectors_namespaceObject); __webpack_require__.d(selectors_namespaceObject, { - isEditingPattern: function() { return selectors_isEditingPattern; } + isEditingPattern: () => (selectors_isEditingPattern) }); ;// CONCATENATED MODULE: external ["wp","data"] -var external_wp_data_namespaceObject = window["wp"]["data"]; +const external_wp_data_namespaceObject = window["wp"]["data"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/store/reducer.js /** * WordPress dependencies @@ -76,16 +76,16 @@ function isEditingPattern(state = {}, action) { } return state; } -/* harmony default export */ var reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ +/* harmony default export */ const reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ isEditingPattern })); ;// CONCATENATED MODULE: external ["wp","blocks"] -var external_wp_blocks_namespaceObject = window["wp"]["blocks"]; +const external_wp_blocks_namespaceObject = window["wp"]["blocks"]; ;// CONCATENATED MODULE: external ["wp","coreData"] -var external_wp_coreData_namespaceObject = window["wp"]["coreData"]; +const external_wp_coreData_namespaceObject = window["wp"]["coreData"]; ;// CONCATENATED MODULE: external ["wp","blockEditor"] -var external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"]; +const external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/constants.js const PATTERN_TYPES = { theme: 'pattern', @@ -93,12 +93,20 @@ const PATTERN_TYPES = { }; const PATTERN_DEFAULT_CATEGORY = 'all-patterns'; const PATTERN_USER_CATEGORY = 'my-patterns'; -const PATTERN_CORE_SOURCES = ['core', 'pattern-directory/core', 'pattern-directory/featured', 'pattern-directory/theme']; +const EXCLUDED_PATTERN_SOURCES = ['core', 'pattern-directory/core', 'pattern-directory/featured']; const PATTERN_SYNC_TYPES = { full: 'fully', unsynced: 'unsynced' }; +// TODO: This should not be hardcoded. Maybe there should be a config and/or an UI. +const PARTIAL_SYNCING_SUPPORTED_BLOCKS = { + 'core/paragraph': ['content'], + 'core/heading': ['content'], + 'core/button': ['text', 'url', 'linkTarget', 'rel'], + 'core/image': ['id', 'url', 'title', 'alt'] +}; + ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/store/actions.js /** * WordPress dependencies @@ -169,10 +177,23 @@ const createPatternFromFile = (file, categories) => async ({ const convertSyncedPatternToStatic = clientId => ({ registry }) => { - const oldBlock = registry.select(external_wp_blockEditor_namespaceObject.store).getBlock(clientId); - const pattern = registry.select('core').getEditedEntityRecord('postType', 'wp_block', oldBlock.attributes.ref); - const newBlocks = (0,external_wp_blocks_namespaceObject.parse)(typeof pattern.content === 'function' ? pattern.content(pattern) : pattern.content); - registry.dispatch(external_wp_blockEditor_namespaceObject.store).replaceBlocks(oldBlock.clientId, newBlocks); + const patternBlock = registry.select(external_wp_blockEditor_namespaceObject.store).getBlock(clientId); + function cloneBlocksAndRemoveBindings(blocks) { + return blocks.map(block => { + let metadata = block.attributes.metadata; + if (metadata) { + metadata = { + ...metadata + }; + delete metadata.id; + delete metadata.bindings; + } + return (0,external_wp_blocks_namespaceObject.cloneBlock)(block, { + metadata: metadata && Object.keys(metadata).length > 0 ? metadata : undefined + }, cloneBlocksAndRemoveBindings(block.innerBlocks)); + }); + } + registry.dispatch(external_wp_blockEditor_namespaceObject.store).replaceBlocks(patternBlock.clientId, cloneBlocksAndRemoveBindings(patternBlock.innerBlocks)); }; /** @@ -209,7 +230,7 @@ function selectors_isEditingPattern(state, clientId) { } ;// CONCATENATED MODULE: external ["wp","privateApis"] -var external_wp_privateApis_namespaceObject = window["wp"]["privateApis"]; +const external_wp_privateApis_namespaceObject = window["wp"]["privateApis"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/lock-unlock.js /** * WordPress dependencies @@ -260,18 +281,20 @@ const store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, unlock(store).registerPrivateActions(actions_namespaceObject); unlock(store).registerPrivateSelectors(selectors_namespaceObject); -;// CONCATENATED MODULE: external ["wp","element"] -var external_wp_element_namespaceObject = window["wp"]["element"]; +;// CONCATENATED MODULE: external "React" +const external_React_namespaceObject = window["React"]; ;// CONCATENATED MODULE: external ["wp","components"] -var external_wp_components_namespaceObject = window["wp"]["components"]; +const external_wp_components_namespaceObject = window["wp"]["components"]; ;// CONCATENATED MODULE: external ["wp","i18n"] -var external_wp_i18n_namespaceObject = window["wp"]["i18n"]; +const external_wp_i18n_namespaceObject = window["wp"]["i18n"]; +;// CONCATENATED MODULE: external ["wp","element"] +const external_wp_element_namespaceObject = window["wp"]["element"]; ;// CONCATENATED MODULE: external ["wp","notices"] -var external_wp_notices_namespaceObject = window["wp"]["notices"]; +const external_wp_notices_namespaceObject = window["wp"]["notices"]; ;// CONCATENATED MODULE: external ["wp","compose"] -var external_wp_compose_namespaceObject = window["wp"]["compose"]; +const external_wp_compose_namespaceObject = window["wp"]["compose"]; ;// CONCATENATED MODULE: external ["wp","htmlEntities"] -var external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"]; +const external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/category-selector.js /** @@ -310,7 +333,7 @@ function CategorySelector({ }, []); onChange(uniqueTerms); } - return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.FormTokenField, { + return (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.FormTokenField, { className: "patterns-menu-items__convert-modal-categories", value: categoryTerms, suggestions: suggestions, @@ -319,12 +342,12 @@ function CategorySelector({ label: (0,external_wp_i18n_namespaceObject.__)('Categories'), tokenizeOnBlur: true, __experimentalExpandOnFocus: true, - __next40pxDefaultSize: true + __next40pxDefaultSize: true, + __nextHasNoMarginBottom: true }); } -;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/create-pattern-modal.js - +;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/private-hooks.js /** * WordPress dependencies */ @@ -332,42 +355,25 @@ function CategorySelector({ - - - /** * Internal dependencies */ /** - * Internal dependencies + * Helper hook that creates a Map with the core and user patterns categories + * and removes any duplicates. It's used when we need to create new user + * categories when creating or importing patterns. + * This hook also provides a function to find or create a pattern category. + * + * @return {Object} The merged categories map and the callback function to find or create a category. */ - - - -function CreatePatternModal({ - onSuccess, - onError, - content, - onClose, - className = 'patterns-menu-items__convert-modal' -}) { - const [syncType, setSyncType] = (0,external_wp_element_namespaceObject.useState)(PATTERN_SYNC_TYPES.full); - const [categoryTerms, setCategoryTerms] = (0,external_wp_element_namespaceObject.useState)([]); - const [title, setTitle] = (0,external_wp_element_namespaceObject.useState)(''); - const [isSaving, setIsSaving] = (0,external_wp_element_namespaceObject.useState)(false); - const { - createPattern - } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store)); +function useAddPatternCategory() { const { saveEntityRecord, invalidateResolution } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); const { - createErrorNotice - } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); - const { corePatternCategories, userPatternCategories } = (0,external_wp_data_namespaceObject.useSelect)(select => { @@ -379,26 +385,119 @@ function CreatePatternModal({ corePatternCategories: getBlockPatternCategories(), userPatternCategories: getUserPatternCategories() }; - }); + }, []); const categoryMap = (0,external_wp_element_namespaceObject.useMemo)(() => { // Merge the user and core pattern categories and remove any duplicates. const uniqueCategories = new Map(); - [...userPatternCategories, ...corePatternCategories].forEach(category => { - if (!uniqueCategories.has(category.label) && + userPatternCategories.forEach(category => { + uniqueCategories.set(category.label.toLowerCase(), { + label: category.label, + name: category.name, + id: category.id + }); + }); + corePatternCategories.forEach(category => { + if (!uniqueCategories.has(category.label.toLowerCase()) && // There are two core categories with `Post` label so explicitly remove the one with // the `query` slug to avoid any confusion. category.name !== 'query') { - // We need to store the name separately as this is used as the slug in the - // taxonomy and may vary from the label. - uniqueCategories.set(category.label, { + uniqueCategories.set(category.label.toLowerCase(), { label: category.label, - value: category.label, name: category.name }); } }); return uniqueCategories; }, [userPatternCategories, corePatternCategories]); + async function findOrCreateTerm(term) { + try { + const existingTerm = categoryMap.get(term.toLowerCase()); + if (existingTerm?.id) { + return existingTerm.id; + } + // If we have an existing core category we need to match the new user category to the + // correct slug rather than autogenerating it to prevent duplicates, eg. the core `Headers` + // category uses the singular `header` as the slug. + const termData = existingTerm ? { + name: existingTerm.label, + slug: existingTerm.name + } : { + name: term + }; + const newTerm = await saveEntityRecord('taxonomy', CATEGORY_SLUG, termData, { + throwOnError: true + }); + invalidateResolution('getUserPatternCategories'); + return newTerm.id; + } catch (error) { + if (error.code !== 'term_exists') { + throw error; + } + return error.data.term_id; + } + } + return { + categoryMap, + findOrCreateTerm + }; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/create-pattern-modal.js + +/** + * WordPress dependencies + */ + + + + + + +/** + * Internal dependencies + */ + + + + + +function CreatePatternModal({ + className = 'patterns-menu-items__convert-modal', + modalTitle = (0,external_wp_i18n_namespaceObject.__)('Create pattern'), + ...restProps +}) { + return (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Modal, { + title: modalTitle, + onRequestClose: restProps.onClose, + overlayClassName: className + }, (0,external_React_namespaceObject.createElement)(CreatePatternModalContents, { + ...restProps + })); +} +function CreatePatternModalContents({ + confirmLabel = (0,external_wp_i18n_namespaceObject.__)('Create'), + defaultCategories = [], + content, + onClose, + onError, + onSuccess, + defaultSyncType = PATTERN_SYNC_TYPES.full, + defaultTitle = '' +}) { + const [syncType, setSyncType] = (0,external_wp_element_namespaceObject.useState)(defaultSyncType); + const [categoryTerms, setCategoryTerms] = (0,external_wp_element_namespaceObject.useState)(defaultCategories); + const [title, setTitle] = (0,external_wp_element_namespaceObject.useState)(defaultTitle); + const [isSaving, setIsSaving] = (0,external_wp_element_namespaceObject.useState)(false); + const { + createPattern + } = unlock((0,external_wp_data_namespaceObject.useDispatch)(store)); + const { + createErrorNotice + } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); + const { + categoryMap, + findOrCreateTerm + } = useAddPatternCategory(); async function onCreate(patternTitle, sync) { if (!title || isSaving) { return; @@ -414,106 +513,253 @@ function CreatePatternModal({ } catch (error) { createErrorNotice(error.message, { type: 'snackbar', - id: 'convert-to-pattern-error' + id: 'pattern-create' }); - onError(); + onError?.(); } finally { setIsSaving(false); setCategoryTerms([]); setTitle(''); } } - - /** - * @param {string} term - * @return {Promise<number>} The pattern category id. - */ - async function findOrCreateTerm(term) { - try { - // We need to match any existing term to the correct slug to prevent duplicates, eg. - // the core `Headers` category uses the singular `header` as the slug. - const existingTerm = categoryMap.get(term); - const termData = existingTerm ? { - name: existingTerm.label, - slug: existingTerm.name - } : { - name: term - }; - const newTerm = await saveEntityRecord('taxonomy', CATEGORY_SLUG, termData, { - throwOnError: true - }); - invalidateResolution('getUserPatternCategories'); - return newTerm.id; - } catch (error) { - if (error.code !== 'term_exists') { - throw error; - } - return error.data.term_id; - } - } - return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Modal, { - title: (0,external_wp_i18n_namespaceObject.__)('Create pattern'), - onRequestClose: () => { - onClose(); - setTitle(''); - }, - overlayClassName: className - }, (0,external_wp_element_namespaceObject.createElement)("form", { + return (0,external_React_namespaceObject.createElement)("form", { onSubmit: event => { event.preventDefault(); onCreate(title, syncType); } - }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalVStack, { + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalVStack, { spacing: "5" - }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, { - __nextHasNoMarginBottom: true, + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, { label: (0,external_wp_i18n_namespaceObject.__)('Name'), value: title, onChange: setTitle, placeholder: (0,external_wp_i18n_namespaceObject.__)('My pattern'), - className: "patterns-create-modal__name-input" - }), (0,external_wp_element_namespaceObject.createElement)(CategorySelector, { + className: "patterns-create-modal__name-input", + __nextHasNoMarginBottom: true, + __next40pxDefaultSize: true + }), (0,external_React_namespaceObject.createElement)(CategorySelector, { categoryTerms: categoryTerms, onChange: setCategoryTerms, categoryMap: categoryMap - }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToggleControl, { + }), (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.ToggleControl, { label: (0,external_wp_i18n_namespaceObject._x)('Synced', 'Option that makes an individual pattern synchronized'), - help: (0,external_wp_i18n_namespaceObject.__)('Editing the pattern will update it anywhere it is used.'), + help: (0,external_wp_i18n_namespaceObject.__)('Sync this pattern across multiple locations.'), checked: syncType === PATTERN_SYNC_TYPES.full, onChange: () => { setSyncType(syncType === PATTERN_SYNC_TYPES.full ? PATTERN_SYNC_TYPES.unsynced : PATTERN_SYNC_TYPES.full); } - }), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalHStack, { + }), (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalHStack, { justify: "right" - }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, { + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, { + __next40pxDefaultSize: true, variant: "tertiary", onClick: () => { onClose(); setTitle(''); } - }, (0,external_wp_i18n_namespaceObject.__)('Cancel')), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, { + }, (0,external_wp_i18n_namespaceObject.__)('Cancel')), (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, { + __next40pxDefaultSize: true, variant: "primary", type: "submit", "aria-disabled": !title || isSaving, isBusy: isSaving - }, (0,external_wp_i18n_namespaceObject.__)('Create')))))); + }, confirmLabel)))); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/duplicate-pattern-modal.js + +/** + * WordPress dependencies + */ + + + + + +/** + * Internal dependencies + */ + + +function getTermLabels(pattern, categories) { + // Theme patterns rely on core pattern categories. + if (pattern.type !== PATTERN_TYPES.user) { + return categories.core?.filter(category => pattern.categories.includes(category.name)).map(category => category.label); + } + return categories.user?.filter(category => pattern.wp_pattern_category.includes(category.id)).map(category => category.label); +} +function useDuplicatePatternProps({ + pattern, + onSuccess +}) { + const { + createSuccessNotice + } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); + const categories = (0,external_wp_data_namespaceObject.useSelect)(select => { + const { + getUserPatternCategories, + getBlockPatternCategories + } = select(external_wp_coreData_namespaceObject.store); + return { + core: getBlockPatternCategories(), + user: getUserPatternCategories() + }; + }); + if (!pattern) { + return null; + } + return { + content: pattern.content, + defaultCategories: getTermLabels(pattern, categories), + defaultSyncType: pattern.type !== PATTERN_TYPES.user // Theme patterns are unsynced by default. + ? PATTERN_SYNC_TYPES.unsynced : pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES.full, + defaultTitle: (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %s: Existing pattern title */ + (0,external_wp_i18n_namespaceObject.__)('%s (Copy)'), typeof pattern.title === 'string' ? pattern.title : pattern.title.raw), + onSuccess: ({ + pattern: newPattern + }) => { + createSuccessNotice((0,external_wp_i18n_namespaceObject.sprintf)( + // translators: %s: The new pattern's title e.g. 'Call to action (copy)'. + (0,external_wp_i18n_namespaceObject.__)('"%s" duplicated.'), newPattern.title.raw), { + type: 'snackbar', + id: 'patterns-create' + }); + onSuccess?.({ + pattern: newPattern + }); + } + }; +} +function DuplicatePatternModal({ + pattern, + onClose, + onSuccess +}) { + const duplicatedProps = useDuplicatePatternProps({ + pattern, + onSuccess + }); + if (!pattern) { + return null; + } + return (0,external_React_namespaceObject.createElement)(CreatePatternModal, { + modalTitle: (0,external_wp_i18n_namespaceObject.__)('Duplicate pattern'), + confirmLabel: (0,external_wp_i18n_namespaceObject.__)('Duplicate'), + onClose: onClose, + onError: onClose, + ...duplicatedProps + }); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/rename-pattern-modal.js + +/** + * WordPress dependencies + */ + + + + + + + +function RenamePatternModal({ + onClose, + onError, + onSuccess, + pattern, + ...props +}) { + const originalName = (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(pattern.title); + const [name, setName] = (0,external_wp_element_namespaceObject.useState)(originalName); + const [isSaving, setIsSaving] = (0,external_wp_element_namespaceObject.useState)(false); + const { + editEntityRecord, + __experimentalSaveSpecifiedEntityEdits: saveSpecifiedEntityEdits + } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); + const { + createSuccessNotice, + createErrorNotice + } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); + const onRename = async event => { + event.preventDefault(); + if (!name || name === pattern.title || isSaving) { + return; + } + try { + await editEntityRecord('postType', pattern.type, pattern.id, { + title: name + }); + setIsSaving(true); + setName(''); + onClose?.(); + const savedRecord = await saveSpecifiedEntityEdits('postType', pattern.type, pattern.id, ['title'], { + throwOnError: true + }); + onSuccess?.(savedRecord); + createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Pattern renamed'), { + type: 'snackbar', + id: 'pattern-update' + }); + } catch (error) { + onError?.(); + const errorMessage = error.message && error.code !== 'unknown_error' ? error.message : (0,external_wp_i18n_namespaceObject.__)('An error occurred while renaming the pattern.'); + createErrorNotice(errorMessage, { + type: 'snackbar', + id: 'pattern-update' + }); + } finally { + setIsSaving(false); + setName(''); + } + }; + const onRequestClose = () => { + onClose?.(); + setName(''); + }; + return (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Modal, { + title: (0,external_wp_i18n_namespaceObject.__)('Rename'), + ...props, + onRequestClose: onClose + }, (0,external_React_namespaceObject.createElement)("form", { + onSubmit: onRename + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalVStack, { + spacing: "5" + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, { + __nextHasNoMarginBottom: true, + __next40pxDefaultSize: true, + label: (0,external_wp_i18n_namespaceObject.__)('Name'), + value: name, + onChange: setName, + required: true + }), (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalHStack, { + justify: "right" + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, { + __next40pxDefaultSize: true, + variant: "tertiary", + onClick: onRequestClose + }, (0,external_wp_i18n_namespaceObject.__)('Cancel')), (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, { + __next40pxDefaultSize: true, + variant: "primary", + type: "submit" + }, (0,external_wp_i18n_namespaceObject.__)('Save')))))); } ;// CONCATENATED MODULE: external ["wp","primitives"] -var external_wp_primitives_namespaceObject = window["wp"]["primitives"]; +const external_wp_primitives_namespaceObject = window["wp"]["primitives"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/symbol.js /** * WordPress dependencies */ -const symbol = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, { +const symbol = (0,external_React_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24" -}, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, { +}, (0,external_React_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, { d: "M21.3 10.8l-5.6-5.6c-.7-.7-1.8-.7-2.5 0l-5.6 5.6c-.7.7-.7 1.8 0 2.5l5.6 5.6c.3.3.8.5 1.2.5s.9-.2 1.2-.5l5.6-5.6c.8-.7.8-1.9.1-2.5zm-1 1.4l-5.6 5.6c-.1.1-.3.1-.4 0l-5.6-5.6c-.1-.1-.1-.3 0-.4l5.6-5.6s.1-.1.2-.1.1 0 .2.1l5.6 5.6c.1.1.1.3 0 .4zm-16.6-.4L10 5.5l-1-1-6.3 6.3c-.7.7-.7 1.8 0 2.5L9 19.5l1.1-1.1-6.3-6.3c-.2 0-.2-.2-.1-.3z" })); -/* harmony default export */ var library_symbol = (symbol); +/* harmony default export */ const library_symbol = (symbol); ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/pattern-convert-button.js @@ -540,14 +786,16 @@ const symbol = (0,external_wp_element_namespaceObject.createElement)(external_wp /** * Menu control to convert block(s) to a pattern block. * - * @param {Object} props Component props. - * @param {string[]} props.clientIds Client ids of selected blocks. - * @param {string} props.rootClientId ID of the currently selected top-level block. - * @return {import('@wordpress/element').WPComponent} The menu control or null. + * @param {Object} props Component props. + * @param {string[]} props.clientIds Client ids of selected blocks. + * @param {string} props.rootClientId ID of the currently selected top-level block. + * @param {()=>void} props.closeBlockSettingsMenu Callback to close the block settings menu dropdown. + * @return {import('react').ComponentType} The menu control or null. */ function PatternConvertButton({ clientIds, - rootClientId + rootClientId, + closeBlockSettingsMenu }) { const { createSuccessNotice @@ -605,6 +853,7 @@ function PatternConvertButton({ }); replaceBlocks(clientIds, newBlock); setEditingPattern(newBlock.clientId, true); + closeBlockSettingsMenu(); } createSuccessNotice(pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ? (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: the name the user has given to the pattern. @@ -616,12 +865,12 @@ function PatternConvertButton({ }); setIsModalOpen(false); }; - return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, { + return (0,external_React_namespaceObject.createElement)(external_React_namespaceObject.Fragment, null, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, { icon: library_symbol, onClick: () => setIsModalOpen(true), "aria-expanded": isModalOpen, "aria-haspopup": "dialog" - }, (0,external_wp_i18n_namespaceObject.__)('Create pattern')), isModalOpen && (0,external_wp_element_namespaceObject.createElement)(CreatePatternModal, { + }, (0,external_wp_i18n_namespaceObject.__)('Create pattern')), isModalOpen && (0,external_React_namespaceObject.createElement)(CreatePatternModal, { content: getContent, onSuccess: pattern => { handleSuccess(pattern); @@ -636,7 +885,7 @@ function PatternConvertButton({ } ;// CONCATENATED MODULE: external ["wp","url"] -var external_wp_url_namespaceObject = window["wp"]["url"]; +const external_wp_url_namespaceObject = window["wp"]["url"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/patterns-manage-button.js /** @@ -661,7 +910,6 @@ function PatternsManageButton({ const { canRemove, isVisible, - innerBlockCount, managePatternsUrl } = (0,external_wp_data_namespaceObject.useSelect)(select => { const { @@ -698,13 +946,13 @@ function PatternsManageButton({ if (!isVisible) { return null; } - return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, { - href: managePatternsUrl - }, (0,external_wp_i18n_namespaceObject.__)('Manage patterns')), canRemove && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, { + return (0,external_React_namespaceObject.createElement)(external_React_namespaceObject.Fragment, null, canRemove && (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, { onClick: () => convertSyncedPatternToStatic(clientId) - }, innerBlockCount > 1 ? (0,external_wp_i18n_namespaceObject.__)('Detach patterns') : (0,external_wp_i18n_namespaceObject.__)('Detach pattern'))); + }, (0,external_wp_i18n_namespaceObject.__)('Detach')), (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItem, { + href: managePatternsUrl + }, (0,external_wp_i18n_namespaceObject.__)('Manage patterns'))); } -/* harmony default export */ var patterns_manage_button = (PatternsManageButton); +/* harmony default export */ const patterns_manage_button = (PatternsManageButton); ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/index.js @@ -721,16 +969,319 @@ function PatternsManageButton({ function PatternsMenuItems({ rootClientId }) { - return (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockSettingsMenuControls, null, ({ - selectedClientIds - }) => (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(PatternConvertButton, { + return (0,external_React_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockSettingsMenuControls, null, ({ + selectedClientIds, + onClose + }) => (0,external_React_namespaceObject.createElement)(external_React_namespaceObject.Fragment, null, (0,external_React_namespaceObject.createElement)(PatternConvertButton, { clientIds: selectedClientIds, - rootClientId: rootClientId - }), selectedClientIds.length === 1 && (0,external_wp_element_namespaceObject.createElement)(patterns_manage_button, { + rootClientId: rootClientId, + closeBlockSettingsMenu: onClose + }), selectedClientIds.length === 1 && (0,external_React_namespaceObject.createElement)(patterns_manage_button, { clientId: selectedClientIds[0] }))); } +;// CONCATENATED MODULE: external ["wp","a11y"] +const external_wp_a11y_namespaceObject = window["wp"]["a11y"]; +;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/rename-pattern-category-modal.js + +/** + * WordPress dependencies + */ + + + + + + + + + +/** + * Internal dependencies + */ + +function RenamePatternCategoryModal({ + category, + existingCategories, + onClose, + onError, + onSuccess, + ...props +}) { + const id = (0,external_wp_element_namespaceObject.useId)(); + const textControlRef = (0,external_wp_element_namespaceObject.useRef)(); + const [name, setName] = (0,external_wp_element_namespaceObject.useState)((0,external_wp_htmlEntities_namespaceObject.decodeEntities)(category.name)); + const [isSaving, setIsSaving] = (0,external_wp_element_namespaceObject.useState)(false); + const [validationMessage, setValidationMessage] = (0,external_wp_element_namespaceObject.useState)(false); + const validationMessageId = validationMessage ? `patterns-rename-pattern-category-modal__validation-message-${id}` : undefined; + const { + saveEntityRecord, + invalidateResolution + } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_coreData_namespaceObject.store); + const { + createErrorNotice, + createSuccessNotice + } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store); + const onChange = newName => { + if (validationMessage) { + setValidationMessage(undefined); + } + setName(newName); + }; + const onSave = async event => { + event.preventDefault(); + if (isSaving) { + return; + } + if (!name || name === category.name) { + const message = (0,external_wp_i18n_namespaceObject.__)('Please enter a new name for this category.'); + (0,external_wp_a11y_namespaceObject.speak)(message, 'assertive'); + setValidationMessage(message); + textControlRef.current?.focus(); + return; + } + + // Check existing categories to avoid creating duplicates. + if (existingCategories.patternCategories.find(existingCategory => { + // Compare the id so that the we don't disallow the user changing the case of their current category + // (i.e. renaming 'test' to 'Test'). + return existingCategory.id !== category.id && existingCategory.label.toLowerCase() === name.toLowerCase(); + })) { + const message = (0,external_wp_i18n_namespaceObject.__)('This category already exists. Please use a different name.'); + (0,external_wp_a11y_namespaceObject.speak)(message, 'assertive'); + setValidationMessage(message); + textControlRef.current?.focus(); + return; + } + try { + setIsSaving(true); + + // User pattern category properties may differ as they can be + // normalized for use alongside template part areas, core pattern + // categories etc. As a result we won't just destructure the passed + // category object. + const savedRecord = await saveEntityRecord('taxonomy', CATEGORY_SLUG, { + id: category.id, + slug: category.slug, + name + }); + invalidateResolution('getUserPatternCategories'); + onSuccess?.(savedRecord); + onClose(); + createSuccessNotice((0,external_wp_i18n_namespaceObject.__)('Pattern category renamed.'), { + type: 'snackbar', + id: 'pattern-category-update' + }); + } catch (error) { + onError?.(); + createErrorNotice(error.message, { + type: 'snackbar', + id: 'pattern-category-update' + }); + } finally { + setIsSaving(false); + setName(''); + } + }; + const onRequestClose = () => { + onClose(); + setName(''); + }; + return (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Modal, { + title: (0,external_wp_i18n_namespaceObject.__)('Rename'), + onRequestClose: onRequestClose, + ...props + }, (0,external_React_namespaceObject.createElement)("form", { + onSubmit: onSave + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalVStack, { + spacing: "5" + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalVStack, { + spacing: "2" + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.TextControl, { + ref: textControlRef, + __nextHasNoMarginBottom: true, + __next40pxDefaultSize: true, + label: (0,external_wp_i18n_namespaceObject.__)('Name'), + value: name, + onChange: onChange, + "aria-describedby": validationMessageId, + required: true + }), validationMessage && (0,external_React_namespaceObject.createElement)("span", { + className: "patterns-rename-pattern-category-modal__validation-message", + id: validationMessageId + }, validationMessage)), (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.__experimentalHStack, { + justify: "right" + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, { + __next40pxDefaultSize: true, + variant: "tertiary", + onClick: onRequestClose + }, (0,external_wp_i18n_namespaceObject.__)('Cancel')), (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.Button, { + __next40pxDefaultSize: true, + variant: "primary", + type: "submit", + "aria-disabled": !name || name === category.name || isSaving, + isBusy: isSaving + }, (0,external_wp_i18n_namespaceObject.__)('Save')))))); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/use-set-pattern-bindings.js +/** + * WordPress dependencies + */ + + + + + +/** + * Internal dependencies + */ + + +function removeBindings(bindings, syncedAttributes) { + let updatedBindings = {}; + for (const attributeName of syncedAttributes) { + // Omit any pattern override bindings from the `updatedBindings` object. + if (bindings?.[attributeName]?.source !== 'core/pattern-overrides' && bindings?.[attributeName]?.source !== undefined) { + updatedBindings[attributeName] = bindings[attributeName]; + } + } + if (!Object.keys(updatedBindings).length) { + updatedBindings = undefined; + } + return updatedBindings; +} +function addBindings(bindings, syncedAttributes) { + const updatedBindings = { + ...bindings + }; + for (const attributeName of syncedAttributes) { + if (!bindings?.[attributeName]) { + updatedBindings[attributeName] = { + source: 'core/pattern-overrides' + }; + } + } + return updatedBindings; +} +function useSetPatternBindings({ + name, + attributes, + setAttributes +}, currentPostType) { + var _attributes$metadata$, _usePrevious; + const hasPatternOverridesSource = (0,external_wp_data_namespaceObject.useSelect)(select => { + const { + getBlockBindingsSource + } = unlock(select(external_wp_blocks_namespaceObject.store)); + + // For editing link to the site editor if the theme and user permissions support it. + return !!getBlockBindingsSource('core/pattern-overrides'); + }, []); + const metadataName = (_attributes$metadata$ = attributes?.metadata?.name) !== null && _attributes$metadata$ !== void 0 ? _attributes$metadata$ : ''; + const prevMetadataName = (_usePrevious = (0,external_wp_compose_namespaceObject.usePrevious)(metadataName)) !== null && _usePrevious !== void 0 ? _usePrevious : ''; + const bindings = attributes?.metadata?.bindings; + (0,external_wp_element_namespaceObject.useEffect)(() => { + // Bindings should only be created when editing a wp_block post type, + // and also when there's a change to the user-given name for the block. + // Also check that the pattern overrides source is registered. + if (!hasPatternOverridesSource || currentPostType !== 'wp_block' || metadataName === prevMetadataName) { + return; + } + const syncedAttributes = PARTIAL_SYNCING_SUPPORTED_BLOCKS[name]; + const attributeSources = syncedAttributes.map(attributeName => attributes.metadata?.bindings?.[attributeName]?.source); + const isConnectedToOtherSources = attributeSources.every(source => source && source !== 'core/pattern-overrides'); + + // Avoid overwriting other (e.g. meta) bindings. + if (isConnectedToOtherSources) { + return; + } + + // The user-given name for the block was deleted, remove the bindings. + if (!metadataName?.length && prevMetadataName?.length) { + const updatedBindings = removeBindings(bindings, syncedAttributes); + setAttributes({ + metadata: { + ...attributes.metadata, + bindings: updatedBindings + } + }); + } + + // The user-given name for the block was set, set the bindings. + if (!prevMetadataName?.length && metadataName.length) { + const updatedBindings = addBindings(bindings, syncedAttributes); + setAttributes({ + metadata: { + ...attributes.metadata, + bindings: updatedBindings + } + }); + } + }, [hasPatternOverridesSource, bindings, prevMetadataName, metadataName, currentPostType, name, attributes.metadata, setAttributes]); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/components/reset-overrides-control.js + +/** + * WordPress dependencies + */ + + + + + + +function recursivelyFindBlockWithName(blocks, name) { + for (const block of blocks) { + if (block.attributes.metadata?.name === name) { + return block; + } + const found = recursivelyFindBlockWithName(block.innerBlocks, name); + if (found) { + return found; + } + } +} +function ResetOverridesControl(props) { + const registry = (0,external_wp_data_namespaceObject.useRegistry)(); + const name = props.attributes.metadata?.name; + const patternWithOverrides = (0,external_wp_data_namespaceObject.useSelect)(select => { + if (!name) { + return undefined; + } + const { + getBlockParentsByBlockName, + getBlocksByClientId + } = select(external_wp_blockEditor_namespaceObject.store); + const patternBlock = getBlocksByClientId(getBlockParentsByBlockName(props.clientId, 'core/block'))[0]; + if (!patternBlock?.attributes.content?.[name]) { + return undefined; + } + return patternBlock; + }, [props.clientId, name]); + const resetOverrides = async () => { + var _editedRecord$blocks; + const editedRecord = await registry.resolveSelect(external_wp_coreData_namespaceObject.store).getEditedEntityRecord('postType', 'wp_block', patternWithOverrides.attributes.ref); + const blocks = (_editedRecord$blocks = editedRecord.blocks) !== null && _editedRecord$blocks !== void 0 ? _editedRecord$blocks : (0,external_wp_blocks_namespaceObject.parse)(editedRecord.content); + const block = recursivelyFindBlockWithName(blocks, name); + const newAttributes = Object.assign( + // Reset every existing attribute to undefined. + Object.fromEntries(Object.keys(props.attributes).map(key => [key, undefined])), + // Then assign the original attributes. + block.attributes); + props.setAttributes(newAttributes); + }; + return (0,external_React_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockControls, { + group: "other" + }, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_React_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, { + onClick: resetOverrides, + disabled: !patternWithOverrides, + __experimentalIsFocusable: true + }, (0,external_wp_i18n_namespaceObject.__)('Reset')))); +} + ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/private-apis.js /** * Internal dependencies @@ -739,15 +1290,30 @@ function PatternsMenuItems({ + + + + + + const privateApis = {}; lock(privateApis, { CreatePatternModal: CreatePatternModal, + CreatePatternModalContents: CreatePatternModalContents, + DuplicatePatternModal: DuplicatePatternModal, + useDuplicatePatternProps: useDuplicatePatternProps, + RenamePatternModal: RenamePatternModal, PatternsMenuItems: PatternsMenuItems, + RenamePatternCategoryModal: RenamePatternCategoryModal, + useSetPatternBindings: useSetPatternBindings, + ResetOverridesControl: ResetOverridesControl, + useAddPatternCategory: useAddPatternCategory, PATTERN_TYPES: PATTERN_TYPES, PATTERN_DEFAULT_CATEGORY: PATTERN_DEFAULT_CATEGORY, PATTERN_USER_CATEGORY: PATTERN_USER_CATEGORY, - PATTERN_CORE_SOURCES: PATTERN_CORE_SOURCES, - PATTERN_SYNC_TYPES: PATTERN_SYNC_TYPES + EXCLUDED_PATTERN_SOURCES: EXCLUDED_PATTERN_SOURCES, + PATTERN_SYNC_TYPES: PATTERN_SYNC_TYPES, + PARTIAL_SYNCING_SUPPORTED_BLOCKS: PARTIAL_SYNCING_SUPPORTED_BLOCKS }); ;// CONCATENATED MODULE: ./node_modules/@wordpress/patterns/build-module/index.js |