@wordpress/patterns 2.41.0 → 2.41.1-next.v.202603161435.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -49,7 +49,8 @@ function PatternsMenuItems({ rootClientId }) {
49
49
  selectedClientIds.length === 1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50
50
  import_patterns_manage_button.default,
51
51
  {
52
- clientId: selectedClientIds[0]
52
+ clientId: selectedClientIds[0],
53
+ onClose
53
54
  }
54
55
  )
55
56
  ] }) });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { BlockSettingsMenuControls } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport PatternConvertButton from './pattern-convert-button';\nimport PatternsManageButton from './patterns-manage-button';\n\nexport default function PatternsMenuItems( { rootClientId } ) {\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t{ ( { selectedClientIds, onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<PatternConvertButton\n\t\t\t\t\t\tclientIds={ selectedClientIds }\n\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\tcloseBlockSettingsMenu={ onClose }\n\t\t\t\t\t/>\n\t\t\t\t\t{ selectedClientIds.length === 1 && (\n\t\t\t\t\t\t<PatternsManageButton\n\t\t\t\t\t\t\tclientId={ selectedClientIds[ 0 ] }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,0BAA0C;AAK1C,oCAAiC;AACjC,oCAAiC;AAM7B;AAJW,SAAR,kBAAoC,EAAE,aAAa,GAAI;AAC7D,SACC,4CAAC,iDACE,WAAE,EAAE,mBAAmB,QAAQ,MAChC,4EACC;AAAA;AAAA,MAAC,8BAAAA;AAAA,MAAA;AAAA,QACA,WAAY;AAAA,QACZ;AAAA,QACA,wBAAyB;AAAA;AAAA,IAC1B;AAAA,IACE,kBAAkB,WAAW,KAC9B;AAAA,MAAC,8BAAAC;AAAA,MAAA;AAAA,QACA,UAAW,kBAAmB,CAAE;AAAA;AAAA,IACjC;AAAA,KAEF,GAEF;AAEF;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { BlockSettingsMenuControls } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport PatternConvertButton from './pattern-convert-button';\nimport PatternsManageButton from './patterns-manage-button';\n\nexport default function PatternsMenuItems( { rootClientId } ) {\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t{ ( { selectedClientIds, onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<PatternConvertButton\n\t\t\t\t\t\tclientIds={ selectedClientIds }\n\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\tcloseBlockSettingsMenu={ onClose }\n\t\t\t\t\t/>\n\t\t\t\t\t{ selectedClientIds.length === 1 && (\n\t\t\t\t\t\t<PatternsManageButton\n\t\t\t\t\t\t\tclientId={ selectedClientIds[ 0 ] }\n\t\t\t\t\t\t\tonClose={ onClose }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,0BAA0C;AAK1C,oCAAiC;AACjC,oCAAiC;AAM7B;AAJW,SAAR,kBAAoC,EAAE,aAAa,GAAI;AAC7D,SACC,4CAAC,iDACE,WAAE,EAAE,mBAAmB,QAAQ,MAChC,4EACC;AAAA;AAAA,MAAC,8BAAAA;AAAA,MAAA;AAAA,QACA,WAAY;AAAA,QACZ;AAAA,QACA,wBAAyB;AAAA;AAAA,IAC1B;AAAA,IACE,kBAAkB,WAAW,KAC9B;AAAA,MAAC,8BAAAC;AAAA,MAAA;AAAA,QACA,UAAW,kBAAmB,CAAE;AAAA,QAChC;AAAA;AAAA,IACD;AAAA,KAEF,GAEF;AAEF;",
6
6
  "names": ["PatternConvertButton", "PatternsManageButton"]
7
7
  }
@@ -124,7 +124,6 @@ function PatternConvertButton({
124
124
  });
125
125
  replaceBlocks(clientIds, newBlock);
126
126
  setEditingPattern(newBlock.clientId, true);
127
- closeBlockSettingsMenu();
128
127
  }
129
128
  createSuccessNotice(
130
129
  pattern.wp_pattern_sync_status === import_constants.PATTERN_SYNC_TYPES.unsynced ? (0, import_i18n.sprintf)(
@@ -142,6 +141,7 @@ function PatternConvertButton({
142
141
  }
143
142
  );
144
143
  setIsModalOpen(false);
144
+ closeBlockSettingsMenu();
145
145
  };
146
146
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
147
147
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -166,6 +166,7 @@ function PatternConvertButton({
166
166
  },
167
167
  onClose: () => {
168
168
  setIsModalOpen(false);
169
+ closeBlockSettingsMenu();
169
170
  }
170
171
  }
171
172
  )
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/pattern-convert-button.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\thasBlockSupport,\n\tisReusableBlock,\n\tcreateBlock,\n\tserialize,\n\tgetBlockType,\n} from '@wordpress/blocks';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useState, useCallback } from '@wordpress/element';\nimport { MenuItem } from '@wordpress/components';\nimport { symbol } from '@wordpress/icons';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport CreatePatternModal from './create-pattern-modal';\nimport { unlock } from '../lock-unlock';\nimport { PATTERN_SYNC_TYPES } from '../constants';\n\n/**\n * Menu control to convert block(s) to a pattern block.\n *\n * @param {Object} props Component props.\n * @param {string[]} props.clientIds Client ids of selected blocks.\n * @param {string} props.rootClientId ID of the currently selected top-level block.\n * @param {()=>void} props.closeBlockSettingsMenu Callback to close the block settings menu dropdown.\n * @return {React.ComponentType} The menu control or null.\n */\nexport default function PatternConvertButton( {\n\tclientIds,\n\trootClientId,\n\tcloseBlockSettingsMenu,\n} ) {\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst { replaceBlocks, updateBlockAttributes } =\n\t\tuseDispatch( blockEditorStore );\n\t// Ignore reason: false positive of the lint rule.\n\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\tconst { setEditingPattern } = unlock( useDispatch( patternsStore ) );\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst { getBlockAttributes } = useSelect( blockEditorStore );\n\tconst canConvert = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst {\n\t\t\t\tgetBlocksByClientId,\n\t\t\t\tcanInsertBlockType,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tconst rootId =\n\t\t\t\trootClientId ||\n\t\t\t\t( clientIds.length > 0\n\t\t\t\t\t? getBlockRootClientId( clientIds[ 0 ] )\n\t\t\t\t\t: undefined );\n\n\t\t\tconst blocks = getBlocksByClientId( clientIds ) ?? [];\n\n\t\t\t// Check if the block has reusable support defined.\n\t\t\tconst hasReusableBlockSupport = ( blockName ) => {\n\t\t\t\tconst blockType = getBlockType( blockName );\n\t\t\t\tconst hasParent = blockType && 'parent' in blockType;\n\n\t\t\t\t// If the block has a parent, check with false as default, otherwise with true.\n\t\t\t\treturn hasBlockSupport( blockName, 'reusable', ! hasParent );\n\t\t\t};\n\n\t\t\tconst isSyncedPattern =\n\t\t\t\tblocks.length === 1 &&\n\t\t\t\tblocks[ 0 ] &&\n\t\t\t\tisReusableBlock( blocks[ 0 ] ) &&\n\t\t\t\t!! select( coreStore ).getEntityRecord(\n\t\t\t\t\t'postType',\n\t\t\t\t\t'wp_block',\n\t\t\t\t\tblocks[ 0 ].attributes.ref\n\t\t\t\t);\n\n\t\t\tconst isUnsyncedPattern =\n\t\t\t\tblocks.length === 1 &&\n\t\t\t\tblocks?.[ 0 ]?.attributes?.metadata?.patternName;\n\n\t\t\tconst _canConvert =\n\t\t\t\t// Hide when this is already a pattern.\n\t\t\t\t! isUnsyncedPattern &&\n\t\t\t\t! isSyncedPattern &&\n\t\t\t\t// Hide when patterns are disabled.\n\t\t\t\tcanInsertBlockType( 'core/block', rootId ) &&\n\t\t\t\tblocks.every(\n\t\t\t\t\t( block ) =>\n\t\t\t\t\t\t// Guard against the case where a regular block has *just* been converted.\n\t\t\t\t\t\t!! block &&\n\t\t\t\t\t\t// Hide on invalid blocks.\n\t\t\t\t\t\tblock.isValid &&\n\t\t\t\t\t\t// Hide when block doesn't support being made into a pattern.\n\t\t\t\t\t\thasReusableBlockSupport( block.name )\n\t\t\t\t) &&\n\t\t\t\t// Hide when current doesn't have permission to do that.\n\t\t\t\t// Blocks refers to the wp_block post type, this checks the ability to create a post of that type.\n\t\t\t\t!! canUser( 'create', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_block',\n\t\t\t\t} );\n\n\t\t\treturn _canConvert;\n\t\t},\n\t\t[ clientIds, rootClientId ]\n\t);\n\tconst { getBlocksByClientId } = useSelect( blockEditorStore );\n\tconst getContent = useCallback(\n\t\t() => serialize( getBlocksByClientId( clientIds ) ),\n\t\t[ getBlocksByClientId, clientIds ]\n\t);\n\n\tif ( ! canConvert ) {\n\t\treturn null;\n\t}\n\n\tconst handleSuccess = ( { pattern } ) => {\n\t\tif ( pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ) {\n\t\t\tif ( clientIds?.length === 1 ) {\n\t\t\t\tconst existingAttributes = getBlockAttributes( clientIds[ 0 ] );\n\t\t\t\tupdateBlockAttributes( clientIds[ 0 ], {\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t...( existingAttributes?.metadata\n\t\t\t\t\t\t\t? existingAttributes.metadata\n\t\t\t\t\t\t\t: {} ),\n\t\t\t\t\t\tpatternName: `core/block/${ pattern.id }`,\n\t\t\t\t\t\tname: pattern.title.raw,\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\tconst newBlock = createBlock( 'core/block', {\n\t\t\t\tref: pattern.id,\n\t\t\t} );\n\n\t\t\treplaceBlocks( clientIds, newBlock );\n\t\t\tsetEditingPattern( newBlock.clientId, true );\n\t\t\tcloseBlockSettingsMenu();\n\t\t}\n\n\t\tcreateSuccessNotice(\n\t\t\tpattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced\n\t\t\t\t? sprintf(\n\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t__( 'Unsynced pattern created: %s' ),\n\t\t\t\t\t\tpattern.title.raw\n\t\t\t\t )\n\t\t\t\t: sprintf(\n\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t__( 'Synced pattern created: %s' ),\n\t\t\t\t\t\tpattern.title.raw\n\t\t\t\t ),\n\t\t\t{\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'convert-to-pattern-success',\n\t\t\t}\n\t\t);\n\t\tsetIsModalOpen( false );\n\t};\n\treturn (\n\t\t<>\n\t\t\t<MenuItem\n\t\t\t\ticon={ symbol }\n\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\taria-expanded={ isModalOpen }\n\t\t\t\taria-haspopup=\"dialog\"\n\t\t\t>\n\t\t\t\t{ __( 'Create pattern' ) }\n\t\t\t</MenuItem>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<CreatePatternModal\n\t\t\t\t\tcontent={ getContent }\n\t\t\t\t\tonSuccess={ ( pattern ) => {\n\t\t\t\t\t\thandleSuccess( pattern );\n\t\t\t\t\t} }\n\t\t\t\t\tonError={ () => {\n\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t} }\n\t\t\t\t\tonClose={ () => {\n\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\thasBlockSupport,\n\tisReusableBlock,\n\tcreateBlock,\n\tserialize,\n\tgetBlockType,\n} from '@wordpress/blocks';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useState, useCallback } from '@wordpress/element';\nimport { MenuItem } from '@wordpress/components';\nimport { symbol } from '@wordpress/icons';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport CreatePatternModal from './create-pattern-modal';\nimport { unlock } from '../lock-unlock';\nimport { PATTERN_SYNC_TYPES } from '../constants';\n\n/**\n * Menu control to convert block(s) to a pattern block.\n *\n * @param {Object} props Component props.\n * @param {string[]} props.clientIds Client ids of selected blocks.\n * @param {string} props.rootClientId ID of the currently selected top-level block.\n * @param {()=>void} props.closeBlockSettingsMenu Callback to close the block settings menu dropdown.\n * @return {React.ComponentType} The menu control or null.\n */\nexport default function PatternConvertButton( {\n\tclientIds,\n\trootClientId,\n\tcloseBlockSettingsMenu,\n} ) {\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst { replaceBlocks, updateBlockAttributes } =\n\t\tuseDispatch( blockEditorStore );\n\t// Ignore reason: false positive of the lint rule.\n\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\tconst { setEditingPattern } = unlock( useDispatch( patternsStore ) );\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst { getBlockAttributes } = useSelect( blockEditorStore );\n\tconst canConvert = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst {\n\t\t\t\tgetBlocksByClientId,\n\t\t\t\tcanInsertBlockType,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tconst rootId =\n\t\t\t\trootClientId ||\n\t\t\t\t( clientIds.length > 0\n\t\t\t\t\t? getBlockRootClientId( clientIds[ 0 ] )\n\t\t\t\t\t: undefined );\n\n\t\t\tconst blocks = getBlocksByClientId( clientIds ) ?? [];\n\n\t\t\t// Check if the block has reusable support defined.\n\t\t\tconst hasReusableBlockSupport = ( blockName ) => {\n\t\t\t\tconst blockType = getBlockType( blockName );\n\t\t\t\tconst hasParent = blockType && 'parent' in blockType;\n\n\t\t\t\t// If the block has a parent, check with false as default, otherwise with true.\n\t\t\t\treturn hasBlockSupport( blockName, 'reusable', ! hasParent );\n\t\t\t};\n\n\t\t\tconst isSyncedPattern =\n\t\t\t\tblocks.length === 1 &&\n\t\t\t\tblocks[ 0 ] &&\n\t\t\t\tisReusableBlock( blocks[ 0 ] ) &&\n\t\t\t\t!! select( coreStore ).getEntityRecord(\n\t\t\t\t\t'postType',\n\t\t\t\t\t'wp_block',\n\t\t\t\t\tblocks[ 0 ].attributes.ref\n\t\t\t\t);\n\n\t\t\tconst isUnsyncedPattern =\n\t\t\t\tblocks.length === 1 &&\n\t\t\t\tblocks?.[ 0 ]?.attributes?.metadata?.patternName;\n\n\t\t\tconst _canConvert =\n\t\t\t\t// Hide when this is already a pattern.\n\t\t\t\t! isUnsyncedPattern &&\n\t\t\t\t! isSyncedPattern &&\n\t\t\t\t// Hide when patterns are disabled.\n\t\t\t\tcanInsertBlockType( 'core/block', rootId ) &&\n\t\t\t\tblocks.every(\n\t\t\t\t\t( block ) =>\n\t\t\t\t\t\t// Guard against the case where a regular block has *just* been converted.\n\t\t\t\t\t\t!! block &&\n\t\t\t\t\t\t// Hide on invalid blocks.\n\t\t\t\t\t\tblock.isValid &&\n\t\t\t\t\t\t// Hide when block doesn't support being made into a pattern.\n\t\t\t\t\t\thasReusableBlockSupport( block.name )\n\t\t\t\t) &&\n\t\t\t\t// Hide when current doesn't have permission to do that.\n\t\t\t\t// Blocks refers to the wp_block post type, this checks the ability to create a post of that type.\n\t\t\t\t!! canUser( 'create', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_block',\n\t\t\t\t} );\n\n\t\t\treturn _canConvert;\n\t\t},\n\t\t[ clientIds, rootClientId ]\n\t);\n\tconst { getBlocksByClientId } = useSelect( blockEditorStore );\n\tconst getContent = useCallback(\n\t\t() => serialize( getBlocksByClientId( clientIds ) ),\n\t\t[ getBlocksByClientId, clientIds ]\n\t);\n\n\tif ( ! canConvert ) {\n\t\treturn null;\n\t}\n\n\tconst handleSuccess = ( { pattern } ) => {\n\t\tif ( pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ) {\n\t\t\tif ( clientIds?.length === 1 ) {\n\t\t\t\tconst existingAttributes = getBlockAttributes( clientIds[ 0 ] );\n\t\t\t\tupdateBlockAttributes( clientIds[ 0 ], {\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t...( existingAttributes?.metadata\n\t\t\t\t\t\t\t? existingAttributes.metadata\n\t\t\t\t\t\t\t: {} ),\n\t\t\t\t\t\tpatternName: `core/block/${ pattern.id }`,\n\t\t\t\t\t\tname: pattern.title.raw,\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\tconst newBlock = createBlock( 'core/block', {\n\t\t\t\tref: pattern.id,\n\t\t\t} );\n\n\t\t\treplaceBlocks( clientIds, newBlock );\n\t\t\tsetEditingPattern( newBlock.clientId, true );\n\t\t}\n\n\t\tcreateSuccessNotice(\n\t\t\tpattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced\n\t\t\t\t? sprintf(\n\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t__( 'Unsynced pattern created: %s' ),\n\t\t\t\t\t\tpattern.title.raw\n\t\t\t\t )\n\t\t\t\t: sprintf(\n\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t__( 'Synced pattern created: %s' ),\n\t\t\t\t\t\tpattern.title.raw\n\t\t\t\t ),\n\t\t\t{\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'convert-to-pattern-success',\n\t\t\t}\n\t\t);\n\t\tsetIsModalOpen( false );\n\t\tcloseBlockSettingsMenu();\n\t};\n\treturn (\n\t\t<>\n\t\t\t<MenuItem\n\t\t\t\ticon={ symbol }\n\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\taria-expanded={ isModalOpen }\n\t\t\t\taria-haspopup=\"dialog\"\n\t\t\t>\n\t\t\t\t{ __( 'Create pattern' ) }\n\t\t\t</MenuItem>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<CreatePatternModal\n\t\t\t\t\tcontent={ getContent }\n\t\t\t\t\tonSuccess={ ( pattern ) => {\n\t\t\t\t\t\thandleSuccess( pattern );\n\t\t\t\t\t} }\n\t\t\t\t\tonError={ () => {\n\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t} }\n\t\t\t\t\tonClose={ () => {\n\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\tcloseBlockSettingsMenu();\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["noticesStore", "blockEditorStore", "patternsStore", "coreStore", "getBlocksByClientId", "CreatePatternModal"]
7
7
  }
@@ -26,13 +26,15 @@ var import_components = require("@wordpress/components");
26
26
  var import_i18n = require("@wordpress/i18n");
27
27
  var import_blocks = require("@wordpress/blocks");
28
28
  var import_data = require("@wordpress/data");
29
+ var import_element = require("@wordpress/element");
29
30
  var import_block_editor = require("@wordpress/block-editor");
30
31
  var import_url = require("@wordpress/url");
31
32
  var import_core_data = require("@wordpress/core-data");
32
33
  var import_store = require("../store/index.cjs");
33
34
  var import_lock_unlock = require("../lock-unlock.cjs");
34
35
  var import_jsx_runtime = require("react/jsx-runtime");
35
- function PatternsManageButton({ clientId }) {
36
+ function PatternsManageButton({ clientId, onClose }) {
37
+ const [showConfirmDialog, setShowConfirmDialog] = (0, import_element.useState)(false);
36
38
  const {
37
39
  attributes,
38
40
  canDetach,
@@ -84,27 +86,40 @@ function PatternsManageButton({ clientId }) {
84
86
  if (!isVisible || !canEdit) {
85
87
  return null;
86
88
  }
89
+ const handleDetach = () => {
90
+ if (isSyncedPattern) {
91
+ convertSyncedPatternToStatic(clientId);
92
+ }
93
+ if (isUnsyncedPattern) {
94
+ const { patternName, ...attributesWithoutPatternName } = attributes?.metadata ?? {};
95
+ updateBlockAttributes(clientId, {
96
+ metadata: attributesWithoutPatternName
97
+ });
98
+ }
99
+ onClose?.();
100
+ setShowConfirmDialog(false);
101
+ };
87
102
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
88
- canDetach && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
89
- import_components.MenuItem,
90
- {
91
- onClick: () => {
92
- if (isSyncedPattern) {
93
- convertSyncedPatternToStatic(clientId);
94
- }
95
- if (isUnsyncedPattern) {
96
- const {
97
- patternName,
98
- ...attributesWithoutPatternName
99
- } = attributes?.metadata ?? {};
100
- updateBlockAttributes(clientId, {
101
- metadata: attributesWithoutPatternName
102
- });
103
- }
104
- },
105
- children: isSyncedPattern ? (0, import_i18n.__)("Disconnect pattern") : (0, import_i18n.__)("Detach pattern")
106
- }
107
- ),
103
+ canDetach && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
104
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.MenuItem, { onClick: () => setShowConfirmDialog(true), children: isSyncedPattern ? (0, import_i18n.__)("Disconnect pattern") : (0, import_i18n.__)("Detach pattern") }),
105
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
106
+ import_components.__experimentalConfirmDialog,
107
+ {
108
+ isOpen: showConfirmDialog,
109
+ onConfirm: handleDetach,
110
+ onCancel: () => setShowConfirmDialog(false),
111
+ confirmButtonText: isSyncedPattern ? (0, import_i18n.__)("Disconnect") : (0, import_i18n.__)("Detach"),
112
+ size: "medium",
113
+ title: isSyncedPattern ? (0, import_i18n.__)("Disconnect pattern?") : (0, import_i18n.__)("Detach pattern?"),
114
+ __experimentalHideHeader: false,
115
+ children: isSyncedPattern ? (0, import_i18n.__)(
116
+ "The blocks will be separated from the original pattern and will be fully editable. Future changes to the pattern will not apply here."
117
+ ) : (0, import_i18n.__)(
118
+ "Blocks will no longer be associated with this pattern and will be fully editable."
119
+ )
120
+ }
121
+ )
122
+ ] }),
108
123
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.MenuItem, { href: managePatternsUrl, children: (0, import_i18n.__)("Manage patterns") })
109
124
  ] });
110
125
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/patterns-manage-button.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { MenuItem } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { isReusableBlock } from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { addQueryArgs } from '@wordpress/url';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport { unlock } from '../lock-unlock';\n\nfunction PatternsManageButton( { clientId } ) {\n\tconst {\n\t\tattributes,\n\t\tcanDetach,\n\t\tisVisible,\n\t\tmanagePatternsUrl,\n\t\tisSyncedPattern,\n\t\tisUnsyncedPattern,\n\t\tcanEdit,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canRemoveBlock, getBlock, canEditBlock } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst block = getBlock( clientId );\n\n\t\t\tconst _isUnsyncedPattern =\n\t\t\t\t!! block?.attributes?.metadata?.patternName;\n\n\t\t\tconst _isSyncedPattern =\n\t\t\t\t!! block &&\n\t\t\t\tisReusableBlock( block ) &&\n\t\t\t\t!! canUser( 'update', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_block',\n\t\t\t\t\tid: block.attributes.ref,\n\t\t\t\t} );\n\n\t\t\treturn {\n\t\t\t\tattributes: block.attributes,\n\t\t\t\tcanEdit: canEditBlock( clientId ),\n\t\t\t\t// For unsynced patterns, detaching is simply removing the `patternName` attribute.\n\t\t\t\t// For synced patterns, the `core:block` block is replaced with its inner blocks,\n\t\t\t\t// so checking whether `canRemoveBlock` is possible is required.\n\t\t\t\tcanDetach:\n\t\t\t\t\t_isUnsyncedPattern ||\n\t\t\t\t\t( _isSyncedPattern && canRemoveBlock( clientId ) ),\n\t\t\t\tisUnsyncedPattern: _isUnsyncedPattern,\n\t\t\t\tisSyncedPattern: _isSyncedPattern,\n\t\t\t\tisVisible: _isUnsyncedPattern || _isSyncedPattern,\n\t\t\t\t// The site editor and templates both check whether the user\n\t\t\t\t// has edit_theme_options capabilities. We can leverage that here\n\t\t\t\t// and omit the manage patterns link if the user can't access it.\n\t\t\t\tmanagePatternsUrl: canUser( 'create', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_template',\n\t\t\t\t} )\n\t\t\t\t\t? addQueryArgs( 'site-editor.php', {\n\t\t\t\t\t\t\tp: '/pattern',\n\t\t\t\t\t } )\n\t\t\t\t\t: addQueryArgs( 'edit.php', {\n\t\t\t\t\t\t\tpost_type: 'wp_block',\n\t\t\t\t\t } ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\t// Ignore reason: false positive of the lint rule.\n\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\tconst { convertSyncedPatternToStatic } = unlock(\n\t\tuseDispatch( patternsStore )\n\t);\n\n\tif ( ! isVisible || ! canEdit ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ canDetach && (\n\t\t\t\t<MenuItem\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tif ( isSyncedPattern ) {\n\t\t\t\t\t\t\tconvertSyncedPatternToStatic( clientId );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isUnsyncedPattern ) {\n\t\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\t\tpatternName,\n\t\t\t\t\t\t\t\t...attributesWithoutPatternName\n\t\t\t\t\t\t\t} = attributes?.metadata ?? {};\n\t\t\t\t\t\t\tupdateBlockAttributes( clientId, {\n\t\t\t\t\t\t\t\tmetadata: attributesWithoutPatternName,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t{ isSyncedPattern\n\t\t\t\t\t\t? __( 'Disconnect pattern' )\n\t\t\t\t\t\t: __( 'Detach pattern' ) }\n\t\t\t\t</MenuItem>\n\t\t\t) }\n\t\t\t<MenuItem href={ managePatternsUrl }>\n\t\t\t\t{ __( 'Manage patterns' ) }\n\t\t\t</MenuItem>\n\t\t</>\n\t);\n}\n\nexport default PatternsManageButton;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAAyB;AACzB,kBAAmB;AACnB,oBAAgC;AAChC,kBAAuC;AACvC,0BAA0C;AAC1C,iBAA6B;AAC7B,uBAAmC;AAKnC,mBAAuC;AACvC,yBAAuB;AAyErB;AAvEF,SAAS,qBAAsB,EAAE,SAAS,GAAI;AAC7C,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,QAAI;AAAA,IACH,CAAE,WAAY;AACb,YAAM,EAAE,gBAAgB,UAAU,aAAa,IAC9C,OAAQ,oBAAAA,KAAiB;AAC1B,YAAM,EAAE,QAAQ,IAAI,OAAQ,iBAAAC,KAAU;AACtC,YAAM,QAAQ,SAAU,QAAS;AAEjC,YAAM,qBACL,CAAC,CAAE,OAAO,YAAY,UAAU;AAEjC,YAAM,mBACL,CAAC,CAAE,aACH,+BAAiB,KAAM,KACvB,CAAC,CAAE,QAAS,UAAU;AAAA,QACrB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,MAAM,WAAW;AAAA,MACtB,CAAE;AAEH,aAAO;AAAA,QACN,YAAY,MAAM;AAAA,QAClB,SAAS,aAAc,QAAS;AAAA;AAAA;AAAA;AAAA,QAIhC,WACC,sBACE,oBAAoB,eAAgB,QAAS;AAAA,QAChD,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,WAAW,sBAAsB;AAAA;AAAA;AAAA;AAAA,QAIjC,mBAAmB,QAAS,UAAU;AAAA,UACrC,MAAM;AAAA,UACN,MAAM;AAAA,QACP,CAAE,QACC,yBAAc,mBAAmB;AAAA,UACjC,GAAG;AAAA,QACH,CAAE,QACF,yBAAc,YAAY;AAAA,UAC1B,WAAW;AAAA,QACX,CAAE;AAAA,MACN;AAAA,IACD;AAAA,IACA,CAAE,QAAS;AAAA,EACZ;AAEA,QAAM,EAAE,sBAAsB,QAAI,yBAAa,oBAAAD,KAAiB;AAIhE,QAAM,EAAE,6BAA6B,QAAI;AAAA,QACxC,yBAAa,aAAAE,KAAc;AAAA,EAC5B;AAEA,MAAK,CAAE,aAAa,CAAE,SAAU;AAC/B,WAAO;AAAA,EACR;AAEA,SACC,4EACG;AAAA,iBACD;AAAA,MAAC;AAAA;AAAA,QACA,SAAU,MAAM;AACf,cAAK,iBAAkB;AACtB,yCAA8B,QAAS;AAAA,UACxC;AAEA,cAAK,mBAAoB;AACxB,kBAAM;AAAA,cACL;AAAA,cACA,GAAG;AAAA,YACJ,IAAI,YAAY,YAAY,CAAC;AAC7B,kCAAuB,UAAU;AAAA,cAChC,UAAU;AAAA,YACX,CAAE;AAAA,UACH;AAAA,QACD;AAAA,QAEE,gCACC,gBAAI,oBAAqB,QACzB,gBAAI,gBAAiB;AAAA;AAAA,IACzB;AAAA,IAED,4CAAC,8BAAS,MAAO,mBACd,8BAAI,iBAAkB,GACzB;AAAA,KACD;AAEF;AAEA,IAAO,iCAAQ;",
6
- "names": ["blockEditorStore", "coreStore", "patternsStore"]
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tMenuItem,\n\t__experimentalConfirmDialog as ConfirmDialog,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { isReusableBlock } from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useState } from '@wordpress/element';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { addQueryArgs } from '@wordpress/url';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport { unlock } from '../lock-unlock';\n\nfunction PatternsManageButton( { clientId, onClose } ) {\n\tconst [ showConfirmDialog, setShowConfirmDialog ] = useState( false );\n\n\tconst {\n\t\tattributes,\n\t\tcanDetach,\n\t\tisVisible,\n\t\tmanagePatternsUrl,\n\t\tisSyncedPattern,\n\t\tisUnsyncedPattern,\n\t\tcanEdit,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canRemoveBlock, getBlock, canEditBlock } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst block = getBlock( clientId );\n\n\t\t\tconst _isUnsyncedPattern =\n\t\t\t\t!! block?.attributes?.metadata?.patternName;\n\n\t\t\tconst _isSyncedPattern =\n\t\t\t\t!! block &&\n\t\t\t\tisReusableBlock( block ) &&\n\t\t\t\t!! canUser( 'update', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_block',\n\t\t\t\t\tid: block.attributes.ref,\n\t\t\t\t} );\n\n\t\t\treturn {\n\t\t\t\tattributes: block.attributes,\n\t\t\t\tcanEdit: canEditBlock( clientId ),\n\t\t\t\t// For unsynced patterns, detaching is simply removing the `patternName` attribute.\n\t\t\t\t// For synced patterns, the `core:block` block is replaced with its inner blocks,\n\t\t\t\t// so checking whether `canRemoveBlock` is possible is required.\n\t\t\t\tcanDetach:\n\t\t\t\t\t_isUnsyncedPattern ||\n\t\t\t\t\t( _isSyncedPattern && canRemoveBlock( clientId ) ),\n\t\t\t\tisUnsyncedPattern: _isUnsyncedPattern,\n\t\t\t\tisSyncedPattern: _isSyncedPattern,\n\t\t\t\tisVisible: _isUnsyncedPattern || _isSyncedPattern,\n\t\t\t\t// The site editor and templates both check whether the user\n\t\t\t\t// has edit_theme_options capabilities. We can leverage that here\n\t\t\t\t// and omit the manage patterns link if the user can't access it.\n\t\t\t\tmanagePatternsUrl: canUser( 'create', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_template',\n\t\t\t\t} )\n\t\t\t\t\t? addQueryArgs( 'site-editor.php', {\n\t\t\t\t\t\t\tp: '/pattern',\n\t\t\t\t\t } )\n\t\t\t\t\t: addQueryArgs( 'edit.php', {\n\t\t\t\t\t\t\tpost_type: 'wp_block',\n\t\t\t\t\t } ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\t// Ignore reason: false positive of the lint rule.\n\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\tconst { convertSyncedPatternToStatic } = unlock(\n\t\tuseDispatch( patternsStore )\n\t);\n\n\tif ( ! isVisible || ! canEdit ) {\n\t\treturn null;\n\t}\n\n\tconst handleDetach = () => {\n\t\tif ( isSyncedPattern ) {\n\t\t\tconvertSyncedPatternToStatic( clientId );\n\t\t}\n\n\t\tif ( isUnsyncedPattern ) {\n\t\t\tconst { patternName, ...attributesWithoutPatternName } =\n\t\t\t\tattributes?.metadata ?? {};\n\t\t\tupdateBlockAttributes( clientId, {\n\t\t\t\tmetadata: attributesWithoutPatternName,\n\t\t\t} );\n\t\t}\n\t\tonClose?.();\n\t\tsetShowConfirmDialog( false );\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{ canDetach && (\n\t\t\t\t<>\n\t\t\t\t\t<MenuItem onClick={ () => setShowConfirmDialog( true ) }>\n\t\t\t\t\t\t{ isSyncedPattern\n\t\t\t\t\t\t\t? __( 'Disconnect pattern' )\n\t\t\t\t\t\t\t: __( 'Detach pattern' ) }\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t<ConfirmDialog\n\t\t\t\t\t\tisOpen={ showConfirmDialog }\n\t\t\t\t\t\tonConfirm={ handleDetach }\n\t\t\t\t\t\tonCancel={ () => setShowConfirmDialog( false ) }\n\t\t\t\t\t\tconfirmButtonText={\n\t\t\t\t\t\t\tisSyncedPattern\n\t\t\t\t\t\t\t\t? __( 'Disconnect' )\n\t\t\t\t\t\t\t\t: __( 'Detach' )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\tisSyncedPattern\n\t\t\t\t\t\t\t\t? __( 'Disconnect pattern?' )\n\t\t\t\t\t\t\t\t: __( 'Detach pattern?' )\n\t\t\t\t\t\t}\n\t\t\t\t\t\t__experimentalHideHeader={ false }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ isSyncedPattern\n\t\t\t\t\t\t\t? __(\n\t\t\t\t\t\t\t\t\t'The blocks will be separated from the original pattern and will be fully editable. Future changes to the pattern will not apply here.'\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: __(\n\t\t\t\t\t\t\t\t\t'Blocks will no longer be associated with this pattern and will be fully editable.'\n\t\t\t\t\t\t\t ) }\n\t\t\t\t\t</ConfirmDialog>\n\t\t\t\t</>\n\t\t\t) }\n\t\t\t<MenuItem href={ managePatternsUrl }>\n\t\t\t\t{ __( 'Manage patterns' ) }\n\t\t\t</MenuItem>\n\t\t</>\n\t);\n}\n\nexport default PatternsManageButton;\n"],
5
+ "mappings": "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",
6
+ "names": ["blockEditorStore", "coreStore", "patternsStore", "ConfirmDialog"]
7
7
  }
@@ -16,7 +16,8 @@ function PatternsMenuItems({ rootClientId }) {
16
16
  selectedClientIds.length === 1 && /* @__PURE__ */ jsx(
17
17
  PatternsManageButton,
18
18
  {
19
- clientId: selectedClientIds[0]
19
+ clientId: selectedClientIds[0],
20
+ onClose
20
21
  }
21
22
  )
22
23
  ] }) });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { BlockSettingsMenuControls } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport PatternConvertButton from './pattern-convert-button';\nimport PatternsManageButton from './patterns-manage-button';\n\nexport default function PatternsMenuItems( { rootClientId } ) {\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t{ ( { selectedClientIds, onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<PatternConvertButton\n\t\t\t\t\t\tclientIds={ selectedClientIds }\n\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\tcloseBlockSettingsMenu={ onClose }\n\t\t\t\t\t/>\n\t\t\t\t\t{ selectedClientIds.length === 1 && (\n\t\t\t\t\t\t<PatternsManageButton\n\t\t\t\t\t\t\tclientId={ selectedClientIds[ 0 ] }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n"],
5
- "mappings": ";AAGA,SAAS,iCAAiC;AAK1C,OAAO,0BAA0B;AACjC,OAAO,0BAA0B;AAM7B,mBACC,KADD;AAJW,SAAR,kBAAoC,EAAE,aAAa,GAAI;AAC7D,SACC,oBAAC,6BACE,WAAE,EAAE,mBAAmB,QAAQ,MAChC,iCACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,WAAY;AAAA,QACZ;AAAA,QACA,wBAAyB;AAAA;AAAA,IAC1B;AAAA,IACE,kBAAkB,WAAW,KAC9B;AAAA,MAAC;AAAA;AAAA,QACA,UAAW,kBAAmB,CAAE;AAAA;AAAA,IACjC;AAAA,KAEF,GAEF;AAEF;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { BlockSettingsMenuControls } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport PatternConvertButton from './pattern-convert-button';\nimport PatternsManageButton from './patterns-manage-button';\n\nexport default function PatternsMenuItems( { rootClientId } ) {\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t{ ( { selectedClientIds, onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<PatternConvertButton\n\t\t\t\t\t\tclientIds={ selectedClientIds }\n\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\tcloseBlockSettingsMenu={ onClose }\n\t\t\t\t\t/>\n\t\t\t\t\t{ selectedClientIds.length === 1 && (\n\t\t\t\t\t\t<PatternsManageButton\n\t\t\t\t\t\t\tclientId={ selectedClientIds[ 0 ] }\n\t\t\t\t\t\t\tonClose={ onClose }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n"],
5
+ "mappings": ";AAGA,SAAS,iCAAiC;AAK1C,OAAO,0BAA0B;AACjC,OAAO,0BAA0B;AAM7B,mBACC,KADD;AAJW,SAAR,kBAAoC,EAAE,aAAa,GAAI;AAC7D,SACC,oBAAC,6BACE,WAAE,EAAE,mBAAmB,QAAQ,MAChC,iCACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,WAAY;AAAA,QACZ;AAAA,QACA,wBAAyB;AAAA;AAAA,IAC1B;AAAA,IACE,kBAAkB,WAAW,KAC9B;AAAA,MAAC;AAAA;AAAA,QACA,UAAW,kBAAmB,CAAE;AAAA,QAChC;AAAA;AAAA,IACD;AAAA,KAEF,GAEF;AAEF;",
6
6
  "names": []
7
7
  }
@@ -97,7 +97,6 @@ function PatternConvertButton({
97
97
  });
98
98
  replaceBlocks(clientIds, newBlock);
99
99
  setEditingPattern(newBlock.clientId, true);
100
- closeBlockSettingsMenu();
101
100
  }
102
101
  createSuccessNotice(
103
102
  pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ? sprintf(
@@ -115,6 +114,7 @@ function PatternConvertButton({
115
114
  }
116
115
  );
117
116
  setIsModalOpen(false);
117
+ closeBlockSettingsMenu();
118
118
  };
119
119
  return /* @__PURE__ */ jsxs(Fragment, { children: [
120
120
  /* @__PURE__ */ jsx(
@@ -139,6 +139,7 @@ function PatternConvertButton({
139
139
  },
140
140
  onClose: () => {
141
141
  setIsModalOpen(false);
142
+ closeBlockSettingsMenu();
142
143
  }
143
144
  }
144
145
  )
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/pattern-convert-button.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\thasBlockSupport,\n\tisReusableBlock,\n\tcreateBlock,\n\tserialize,\n\tgetBlockType,\n} from '@wordpress/blocks';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useState, useCallback } from '@wordpress/element';\nimport { MenuItem } from '@wordpress/components';\nimport { symbol } from '@wordpress/icons';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport CreatePatternModal from './create-pattern-modal';\nimport { unlock } from '../lock-unlock';\nimport { PATTERN_SYNC_TYPES } from '../constants';\n\n/**\n * Menu control to convert block(s) to a pattern block.\n *\n * @param {Object} props Component props.\n * @param {string[]} props.clientIds Client ids of selected blocks.\n * @param {string} props.rootClientId ID of the currently selected top-level block.\n * @param {()=>void} props.closeBlockSettingsMenu Callback to close the block settings menu dropdown.\n * @return {React.ComponentType} The menu control or null.\n */\nexport default function PatternConvertButton( {\n\tclientIds,\n\trootClientId,\n\tcloseBlockSettingsMenu,\n} ) {\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst { replaceBlocks, updateBlockAttributes } =\n\t\tuseDispatch( blockEditorStore );\n\t// Ignore reason: false positive of the lint rule.\n\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\tconst { setEditingPattern } = unlock( useDispatch( patternsStore ) );\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst { getBlockAttributes } = useSelect( blockEditorStore );\n\tconst canConvert = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst {\n\t\t\t\tgetBlocksByClientId,\n\t\t\t\tcanInsertBlockType,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tconst rootId =\n\t\t\t\trootClientId ||\n\t\t\t\t( clientIds.length > 0\n\t\t\t\t\t? getBlockRootClientId( clientIds[ 0 ] )\n\t\t\t\t\t: undefined );\n\n\t\t\tconst blocks = getBlocksByClientId( clientIds ) ?? [];\n\n\t\t\t// Check if the block has reusable support defined.\n\t\t\tconst hasReusableBlockSupport = ( blockName ) => {\n\t\t\t\tconst blockType = getBlockType( blockName );\n\t\t\t\tconst hasParent = blockType && 'parent' in blockType;\n\n\t\t\t\t// If the block has a parent, check with false as default, otherwise with true.\n\t\t\t\treturn hasBlockSupport( blockName, 'reusable', ! hasParent );\n\t\t\t};\n\n\t\t\tconst isSyncedPattern =\n\t\t\t\tblocks.length === 1 &&\n\t\t\t\tblocks[ 0 ] &&\n\t\t\t\tisReusableBlock( blocks[ 0 ] ) &&\n\t\t\t\t!! select( coreStore ).getEntityRecord(\n\t\t\t\t\t'postType',\n\t\t\t\t\t'wp_block',\n\t\t\t\t\tblocks[ 0 ].attributes.ref\n\t\t\t\t);\n\n\t\t\tconst isUnsyncedPattern =\n\t\t\t\tblocks.length === 1 &&\n\t\t\t\tblocks?.[ 0 ]?.attributes?.metadata?.patternName;\n\n\t\t\tconst _canConvert =\n\t\t\t\t// Hide when this is already a pattern.\n\t\t\t\t! isUnsyncedPattern &&\n\t\t\t\t! isSyncedPattern &&\n\t\t\t\t// Hide when patterns are disabled.\n\t\t\t\tcanInsertBlockType( 'core/block', rootId ) &&\n\t\t\t\tblocks.every(\n\t\t\t\t\t( block ) =>\n\t\t\t\t\t\t// Guard against the case where a regular block has *just* been converted.\n\t\t\t\t\t\t!! block &&\n\t\t\t\t\t\t// Hide on invalid blocks.\n\t\t\t\t\t\tblock.isValid &&\n\t\t\t\t\t\t// Hide when block doesn't support being made into a pattern.\n\t\t\t\t\t\thasReusableBlockSupport( block.name )\n\t\t\t\t) &&\n\t\t\t\t// Hide when current doesn't have permission to do that.\n\t\t\t\t// Blocks refers to the wp_block post type, this checks the ability to create a post of that type.\n\t\t\t\t!! canUser( 'create', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_block',\n\t\t\t\t} );\n\n\t\t\treturn _canConvert;\n\t\t},\n\t\t[ clientIds, rootClientId ]\n\t);\n\tconst { getBlocksByClientId } = useSelect( blockEditorStore );\n\tconst getContent = useCallback(\n\t\t() => serialize( getBlocksByClientId( clientIds ) ),\n\t\t[ getBlocksByClientId, clientIds ]\n\t);\n\n\tif ( ! canConvert ) {\n\t\treturn null;\n\t}\n\n\tconst handleSuccess = ( { pattern } ) => {\n\t\tif ( pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ) {\n\t\t\tif ( clientIds?.length === 1 ) {\n\t\t\t\tconst existingAttributes = getBlockAttributes( clientIds[ 0 ] );\n\t\t\t\tupdateBlockAttributes( clientIds[ 0 ], {\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t...( existingAttributes?.metadata\n\t\t\t\t\t\t\t? existingAttributes.metadata\n\t\t\t\t\t\t\t: {} ),\n\t\t\t\t\t\tpatternName: `core/block/${ pattern.id }`,\n\t\t\t\t\t\tname: pattern.title.raw,\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\tconst newBlock = createBlock( 'core/block', {\n\t\t\t\tref: pattern.id,\n\t\t\t} );\n\n\t\t\treplaceBlocks( clientIds, newBlock );\n\t\t\tsetEditingPattern( newBlock.clientId, true );\n\t\t\tcloseBlockSettingsMenu();\n\t\t}\n\n\t\tcreateSuccessNotice(\n\t\t\tpattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced\n\t\t\t\t? sprintf(\n\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t__( 'Unsynced pattern created: %s' ),\n\t\t\t\t\t\tpattern.title.raw\n\t\t\t\t )\n\t\t\t\t: sprintf(\n\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t__( 'Synced pattern created: %s' ),\n\t\t\t\t\t\tpattern.title.raw\n\t\t\t\t ),\n\t\t\t{\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'convert-to-pattern-success',\n\t\t\t}\n\t\t);\n\t\tsetIsModalOpen( false );\n\t};\n\treturn (\n\t\t<>\n\t\t\t<MenuItem\n\t\t\t\ticon={ symbol }\n\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\taria-expanded={ isModalOpen }\n\t\t\t\taria-haspopup=\"dialog\"\n\t\t\t>\n\t\t\t\t{ __( 'Create pattern' ) }\n\t\t\t</MenuItem>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<CreatePatternModal\n\t\t\t\t\tcontent={ getContent }\n\t\t\t\t\tonSuccess={ ( pattern ) => {\n\t\t\t\t\t\thandleSuccess( pattern );\n\t\t\t\t\t} }\n\t\t\t\t\tonError={ () => {\n\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t} }\n\t\t\t\t\tonClose={ () => {\n\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\thasBlockSupport,\n\tisReusableBlock,\n\tcreateBlock,\n\tserialize,\n\tgetBlockType,\n} from '@wordpress/blocks';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { useState, useCallback } from '@wordpress/element';\nimport { MenuItem } from '@wordpress/components';\nimport { symbol } from '@wordpress/icons';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport CreatePatternModal from './create-pattern-modal';\nimport { unlock } from '../lock-unlock';\nimport { PATTERN_SYNC_TYPES } from '../constants';\n\n/**\n * Menu control to convert block(s) to a pattern block.\n *\n * @param {Object} props Component props.\n * @param {string[]} props.clientIds Client ids of selected blocks.\n * @param {string} props.rootClientId ID of the currently selected top-level block.\n * @param {()=>void} props.closeBlockSettingsMenu Callback to close the block settings menu dropdown.\n * @return {React.ComponentType} The menu control or null.\n */\nexport default function PatternConvertButton( {\n\tclientIds,\n\trootClientId,\n\tcloseBlockSettingsMenu,\n} ) {\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst { replaceBlocks, updateBlockAttributes } =\n\t\tuseDispatch( blockEditorStore );\n\t// Ignore reason: false positive of the lint rule.\n\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\tconst { setEditingPattern } = unlock( useDispatch( patternsStore ) );\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst { getBlockAttributes } = useSelect( blockEditorStore );\n\tconst canConvert = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst {\n\t\t\t\tgetBlocksByClientId,\n\t\t\t\tcanInsertBlockType,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tconst rootId =\n\t\t\t\trootClientId ||\n\t\t\t\t( clientIds.length > 0\n\t\t\t\t\t? getBlockRootClientId( clientIds[ 0 ] )\n\t\t\t\t\t: undefined );\n\n\t\t\tconst blocks = getBlocksByClientId( clientIds ) ?? [];\n\n\t\t\t// Check if the block has reusable support defined.\n\t\t\tconst hasReusableBlockSupport = ( blockName ) => {\n\t\t\t\tconst blockType = getBlockType( blockName );\n\t\t\t\tconst hasParent = blockType && 'parent' in blockType;\n\n\t\t\t\t// If the block has a parent, check with false as default, otherwise with true.\n\t\t\t\treturn hasBlockSupport( blockName, 'reusable', ! hasParent );\n\t\t\t};\n\n\t\t\tconst isSyncedPattern =\n\t\t\t\tblocks.length === 1 &&\n\t\t\t\tblocks[ 0 ] &&\n\t\t\t\tisReusableBlock( blocks[ 0 ] ) &&\n\t\t\t\t!! select( coreStore ).getEntityRecord(\n\t\t\t\t\t'postType',\n\t\t\t\t\t'wp_block',\n\t\t\t\t\tblocks[ 0 ].attributes.ref\n\t\t\t\t);\n\n\t\t\tconst isUnsyncedPattern =\n\t\t\t\tblocks.length === 1 &&\n\t\t\t\tblocks?.[ 0 ]?.attributes?.metadata?.patternName;\n\n\t\t\tconst _canConvert =\n\t\t\t\t// Hide when this is already a pattern.\n\t\t\t\t! isUnsyncedPattern &&\n\t\t\t\t! isSyncedPattern &&\n\t\t\t\t// Hide when patterns are disabled.\n\t\t\t\tcanInsertBlockType( 'core/block', rootId ) &&\n\t\t\t\tblocks.every(\n\t\t\t\t\t( block ) =>\n\t\t\t\t\t\t// Guard against the case where a regular block has *just* been converted.\n\t\t\t\t\t\t!! block &&\n\t\t\t\t\t\t// Hide on invalid blocks.\n\t\t\t\t\t\tblock.isValid &&\n\t\t\t\t\t\t// Hide when block doesn't support being made into a pattern.\n\t\t\t\t\t\thasReusableBlockSupport( block.name )\n\t\t\t\t) &&\n\t\t\t\t// Hide when current doesn't have permission to do that.\n\t\t\t\t// Blocks refers to the wp_block post type, this checks the ability to create a post of that type.\n\t\t\t\t!! canUser( 'create', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_block',\n\t\t\t\t} );\n\n\t\t\treturn _canConvert;\n\t\t},\n\t\t[ clientIds, rootClientId ]\n\t);\n\tconst { getBlocksByClientId } = useSelect( blockEditorStore );\n\tconst getContent = useCallback(\n\t\t() => serialize( getBlocksByClientId( clientIds ) ),\n\t\t[ getBlocksByClientId, clientIds ]\n\t);\n\n\tif ( ! canConvert ) {\n\t\treturn null;\n\t}\n\n\tconst handleSuccess = ( { pattern } ) => {\n\t\tif ( pattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced ) {\n\t\t\tif ( clientIds?.length === 1 ) {\n\t\t\t\tconst existingAttributes = getBlockAttributes( clientIds[ 0 ] );\n\t\t\t\tupdateBlockAttributes( clientIds[ 0 ], {\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t...( existingAttributes?.metadata\n\t\t\t\t\t\t\t? existingAttributes.metadata\n\t\t\t\t\t\t\t: {} ),\n\t\t\t\t\t\tpatternName: `core/block/${ pattern.id }`,\n\t\t\t\t\t\tname: pattern.title.raw,\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\tconst newBlock = createBlock( 'core/block', {\n\t\t\t\tref: pattern.id,\n\t\t\t} );\n\n\t\t\treplaceBlocks( clientIds, newBlock );\n\t\t\tsetEditingPattern( newBlock.clientId, true );\n\t\t}\n\n\t\tcreateSuccessNotice(\n\t\t\tpattern.wp_pattern_sync_status === PATTERN_SYNC_TYPES.unsynced\n\t\t\t\t? sprintf(\n\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t__( 'Unsynced pattern created: %s' ),\n\t\t\t\t\t\tpattern.title.raw\n\t\t\t\t )\n\t\t\t\t: sprintf(\n\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t__( 'Synced pattern created: %s' ),\n\t\t\t\t\t\tpattern.title.raw\n\t\t\t\t ),\n\t\t\t{\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'convert-to-pattern-success',\n\t\t\t}\n\t\t);\n\t\tsetIsModalOpen( false );\n\t\tcloseBlockSettingsMenu();\n\t};\n\treturn (\n\t\t<>\n\t\t\t<MenuItem\n\t\t\t\ticon={ symbol }\n\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\taria-expanded={ isModalOpen }\n\t\t\t\taria-haspopup=\"dialog\"\n\t\t\t>\n\t\t\t\t{ __( 'Create pattern' ) }\n\t\t\t</MenuItem>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<CreatePatternModal\n\t\t\t\t\tcontent={ getContent }\n\t\t\t\t\tonSuccess={ ( pattern ) => {\n\t\t\t\t\t\thandleSuccess( pattern );\n\t\t\t\t\t} }\n\t\t\t\t\tonError={ () => {\n\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t} }\n\t\t\t\t\tonClose={ () => {\n\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\tcloseBlockSettingsMenu();\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["getBlocksByClientId"]
7
7
  }
@@ -1,15 +1,20 @@
1
1
  // packages/patterns/src/components/patterns-manage-button.js
2
- import { MenuItem } from "@wordpress/components";
2
+ import {
3
+ MenuItem,
4
+ __experimentalConfirmDialog as ConfirmDialog
5
+ } from "@wordpress/components";
3
6
  import { __ } from "@wordpress/i18n";
4
7
  import { isReusableBlock } from "@wordpress/blocks";
5
8
  import { useSelect, useDispatch } from "@wordpress/data";
9
+ import { useState } from "@wordpress/element";
6
10
  import { store as blockEditorStore } from "@wordpress/block-editor";
7
11
  import { addQueryArgs } from "@wordpress/url";
8
12
  import { store as coreStore } from "@wordpress/core-data";
9
13
  import { store as patternsStore } from "../store/index.mjs";
10
14
  import { unlock } from "../lock-unlock.mjs";
11
15
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
- function PatternsManageButton({ clientId }) {
16
+ function PatternsManageButton({ clientId, onClose }) {
17
+ const [showConfirmDialog, setShowConfirmDialog] = useState(false);
13
18
  const {
14
19
  attributes,
15
20
  canDetach,
@@ -61,27 +66,40 @@ function PatternsManageButton({ clientId }) {
61
66
  if (!isVisible || !canEdit) {
62
67
  return null;
63
68
  }
69
+ const handleDetach = () => {
70
+ if (isSyncedPattern) {
71
+ convertSyncedPatternToStatic(clientId);
72
+ }
73
+ if (isUnsyncedPattern) {
74
+ const { patternName, ...attributesWithoutPatternName } = attributes?.metadata ?? {};
75
+ updateBlockAttributes(clientId, {
76
+ metadata: attributesWithoutPatternName
77
+ });
78
+ }
79
+ onClose?.();
80
+ setShowConfirmDialog(false);
81
+ };
64
82
  return /* @__PURE__ */ jsxs(Fragment, { children: [
65
- canDetach && /* @__PURE__ */ jsx(
66
- MenuItem,
67
- {
68
- onClick: () => {
69
- if (isSyncedPattern) {
70
- convertSyncedPatternToStatic(clientId);
71
- }
72
- if (isUnsyncedPattern) {
73
- const {
74
- patternName,
75
- ...attributesWithoutPatternName
76
- } = attributes?.metadata ?? {};
77
- updateBlockAttributes(clientId, {
78
- metadata: attributesWithoutPatternName
79
- });
80
- }
81
- },
82
- children: isSyncedPattern ? __("Disconnect pattern") : __("Detach pattern")
83
- }
84
- ),
83
+ canDetach && /* @__PURE__ */ jsxs(Fragment, { children: [
84
+ /* @__PURE__ */ jsx(MenuItem, { onClick: () => setShowConfirmDialog(true), children: isSyncedPattern ? __("Disconnect pattern") : __("Detach pattern") }),
85
+ /* @__PURE__ */ jsx(
86
+ ConfirmDialog,
87
+ {
88
+ isOpen: showConfirmDialog,
89
+ onConfirm: handleDetach,
90
+ onCancel: () => setShowConfirmDialog(false),
91
+ confirmButtonText: isSyncedPattern ? __("Disconnect") : __("Detach"),
92
+ size: "medium",
93
+ title: isSyncedPattern ? __("Disconnect pattern?") : __("Detach pattern?"),
94
+ __experimentalHideHeader: false,
95
+ children: isSyncedPattern ? __(
96
+ "The blocks will be separated from the original pattern and will be fully editable. Future changes to the pattern will not apply here."
97
+ ) : __(
98
+ "Blocks will no longer be associated with this pattern and will be fully editable."
99
+ )
100
+ }
101
+ )
102
+ ] }),
85
103
  /* @__PURE__ */ jsx(MenuItem, { href: managePatternsUrl, children: __("Manage patterns") })
86
104
  ] });
87
105
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/patterns-manage-button.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { MenuItem } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { isReusableBlock } from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { addQueryArgs } from '@wordpress/url';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport { unlock } from '../lock-unlock';\n\nfunction PatternsManageButton( { clientId } ) {\n\tconst {\n\t\tattributes,\n\t\tcanDetach,\n\t\tisVisible,\n\t\tmanagePatternsUrl,\n\t\tisSyncedPattern,\n\t\tisUnsyncedPattern,\n\t\tcanEdit,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canRemoveBlock, getBlock, canEditBlock } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst block = getBlock( clientId );\n\n\t\t\tconst _isUnsyncedPattern =\n\t\t\t\t!! block?.attributes?.metadata?.patternName;\n\n\t\t\tconst _isSyncedPattern =\n\t\t\t\t!! block &&\n\t\t\t\tisReusableBlock( block ) &&\n\t\t\t\t!! canUser( 'update', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_block',\n\t\t\t\t\tid: block.attributes.ref,\n\t\t\t\t} );\n\n\t\t\treturn {\n\t\t\t\tattributes: block.attributes,\n\t\t\t\tcanEdit: canEditBlock( clientId ),\n\t\t\t\t// For unsynced patterns, detaching is simply removing the `patternName` attribute.\n\t\t\t\t// For synced patterns, the `core:block` block is replaced with its inner blocks,\n\t\t\t\t// so checking whether `canRemoveBlock` is possible is required.\n\t\t\t\tcanDetach:\n\t\t\t\t\t_isUnsyncedPattern ||\n\t\t\t\t\t( _isSyncedPattern && canRemoveBlock( clientId ) ),\n\t\t\t\tisUnsyncedPattern: _isUnsyncedPattern,\n\t\t\t\tisSyncedPattern: _isSyncedPattern,\n\t\t\t\tisVisible: _isUnsyncedPattern || _isSyncedPattern,\n\t\t\t\t// The site editor and templates both check whether the user\n\t\t\t\t// has edit_theme_options capabilities. We can leverage that here\n\t\t\t\t// and omit the manage patterns link if the user can't access it.\n\t\t\t\tmanagePatternsUrl: canUser( 'create', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_template',\n\t\t\t\t} )\n\t\t\t\t\t? addQueryArgs( 'site-editor.php', {\n\t\t\t\t\t\t\tp: '/pattern',\n\t\t\t\t\t } )\n\t\t\t\t\t: addQueryArgs( 'edit.php', {\n\t\t\t\t\t\t\tpost_type: 'wp_block',\n\t\t\t\t\t } ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\t// Ignore reason: false positive of the lint rule.\n\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\tconst { convertSyncedPatternToStatic } = unlock(\n\t\tuseDispatch( patternsStore )\n\t);\n\n\tif ( ! isVisible || ! canEdit ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ canDetach && (\n\t\t\t\t<MenuItem\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tif ( isSyncedPattern ) {\n\t\t\t\t\t\t\tconvertSyncedPatternToStatic( clientId );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isUnsyncedPattern ) {\n\t\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\t\tpatternName,\n\t\t\t\t\t\t\t\t...attributesWithoutPatternName\n\t\t\t\t\t\t\t} = attributes?.metadata ?? {};\n\t\t\t\t\t\t\tupdateBlockAttributes( clientId, {\n\t\t\t\t\t\t\t\tmetadata: attributesWithoutPatternName,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t{ isSyncedPattern\n\t\t\t\t\t\t? __( 'Disconnect pattern' )\n\t\t\t\t\t\t: __( 'Detach pattern' ) }\n\t\t\t\t</MenuItem>\n\t\t\t) }\n\t\t\t<MenuItem href={ managePatternsUrl }>\n\t\t\t\t{ __( 'Manage patterns' ) }\n\t\t\t</MenuItem>\n\t\t</>\n\t);\n}\n\nexport default PatternsManageButton;\n"],
5
- "mappings": ";AAGA,SAAS,gBAAgB;AACzB,SAAS,UAAU;AACnB,SAAS,uBAAuB;AAChC,SAAS,WAAW,mBAAmB;AACvC,SAAS,SAAS,wBAAwB;AAC1C,SAAS,oBAAoB;AAC7B,SAAS,SAAS,iBAAiB;AAKnC,SAAS,SAAS,qBAAqB;AACvC,SAAS,cAAc;AAyErB,mBAEE,KAFF;AAvEF,SAAS,qBAAsB,EAAE,SAAS,GAAI;AAC7C,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAAA,IACH,CAAE,WAAY;AACb,YAAM,EAAE,gBAAgB,UAAU,aAAa,IAC9C,OAAQ,gBAAiB;AAC1B,YAAM,EAAE,QAAQ,IAAI,OAAQ,SAAU;AACtC,YAAM,QAAQ,SAAU,QAAS;AAEjC,YAAM,qBACL,CAAC,CAAE,OAAO,YAAY,UAAU;AAEjC,YAAM,mBACL,CAAC,CAAE,SACH,gBAAiB,KAAM,KACvB,CAAC,CAAE,QAAS,UAAU;AAAA,QACrB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI,MAAM,WAAW;AAAA,MACtB,CAAE;AAEH,aAAO;AAAA,QACN,YAAY,MAAM;AAAA,QAClB,SAAS,aAAc,QAAS;AAAA;AAAA;AAAA;AAAA,QAIhC,WACC,sBACE,oBAAoB,eAAgB,QAAS;AAAA,QAChD,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,WAAW,sBAAsB;AAAA;AAAA;AAAA;AAAA,QAIjC,mBAAmB,QAAS,UAAU;AAAA,UACrC,MAAM;AAAA,UACN,MAAM;AAAA,QACP,CAAE,IACC,aAAc,mBAAmB;AAAA,UACjC,GAAG;AAAA,QACH,CAAE,IACF,aAAc,YAAY;AAAA,UAC1B,WAAW;AAAA,QACX,CAAE;AAAA,MACN;AAAA,IACD;AAAA,IACA,CAAE,QAAS;AAAA,EACZ;AAEA,QAAM,EAAE,sBAAsB,IAAI,YAAa,gBAAiB;AAIhE,QAAM,EAAE,6BAA6B,IAAI;AAAA,IACxC,YAAa,aAAc;AAAA,EAC5B;AAEA,MAAK,CAAE,aAAa,CAAE,SAAU;AAC/B,WAAO;AAAA,EACR;AAEA,SACC,iCACG;AAAA,iBACD;AAAA,MAAC;AAAA;AAAA,QACA,SAAU,MAAM;AACf,cAAK,iBAAkB;AACtB,yCAA8B,QAAS;AAAA,UACxC;AAEA,cAAK,mBAAoB;AACxB,kBAAM;AAAA,cACL;AAAA,cACA,GAAG;AAAA,YACJ,IAAI,YAAY,YAAY,CAAC;AAC7B,kCAAuB,UAAU;AAAA,cAChC,UAAU;AAAA,YACX,CAAE;AAAA,UACH;AAAA,QACD;AAAA,QAEE,4BACC,GAAI,oBAAqB,IACzB,GAAI,gBAAiB;AAAA;AAAA,IACzB;AAAA,IAED,oBAAC,YAAS,MAAO,mBACd,aAAI,iBAAkB,GACzB;AAAA,KACD;AAEF;AAEA,IAAO,iCAAQ;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tMenuItem,\n\t__experimentalConfirmDialog as ConfirmDialog,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { isReusableBlock } from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useState } from '@wordpress/element';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { addQueryArgs } from '@wordpress/url';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport { unlock } from '../lock-unlock';\n\nfunction PatternsManageButton( { clientId, onClose } ) {\n\tconst [ showConfirmDialog, setShowConfirmDialog ] = useState( false );\n\n\tconst {\n\t\tattributes,\n\t\tcanDetach,\n\t\tisVisible,\n\t\tmanagePatternsUrl,\n\t\tisSyncedPattern,\n\t\tisUnsyncedPattern,\n\t\tcanEdit,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canRemoveBlock, getBlock, canEditBlock } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst block = getBlock( clientId );\n\n\t\t\tconst _isUnsyncedPattern =\n\t\t\t\t!! block?.attributes?.metadata?.patternName;\n\n\t\t\tconst _isSyncedPattern =\n\t\t\t\t!! block &&\n\t\t\t\tisReusableBlock( block ) &&\n\t\t\t\t!! canUser( 'update', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_block',\n\t\t\t\t\tid: block.attributes.ref,\n\t\t\t\t} );\n\n\t\t\treturn {\n\t\t\t\tattributes: block.attributes,\n\t\t\t\tcanEdit: canEditBlock( clientId ),\n\t\t\t\t// For unsynced patterns, detaching is simply removing the `patternName` attribute.\n\t\t\t\t// For synced patterns, the `core:block` block is replaced with its inner blocks,\n\t\t\t\t// so checking whether `canRemoveBlock` is possible is required.\n\t\t\t\tcanDetach:\n\t\t\t\t\t_isUnsyncedPattern ||\n\t\t\t\t\t( _isSyncedPattern && canRemoveBlock( clientId ) ),\n\t\t\t\tisUnsyncedPattern: _isUnsyncedPattern,\n\t\t\t\tisSyncedPattern: _isSyncedPattern,\n\t\t\t\tisVisible: _isUnsyncedPattern || _isSyncedPattern,\n\t\t\t\t// The site editor and templates both check whether the user\n\t\t\t\t// has edit_theme_options capabilities. We can leverage that here\n\t\t\t\t// and omit the manage patterns link if the user can't access it.\n\t\t\t\tmanagePatternsUrl: canUser( 'create', {\n\t\t\t\t\tkind: 'postType',\n\t\t\t\t\tname: 'wp_template',\n\t\t\t\t} )\n\t\t\t\t\t? addQueryArgs( 'site-editor.php', {\n\t\t\t\t\t\t\tp: '/pattern',\n\t\t\t\t\t } )\n\t\t\t\t\t: addQueryArgs( 'edit.php', {\n\t\t\t\t\t\t\tpost_type: 'wp_block',\n\t\t\t\t\t } ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\t// Ignore reason: false positive of the lint rule.\n\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\tconst { convertSyncedPatternToStatic } = unlock(\n\t\tuseDispatch( patternsStore )\n\t);\n\n\tif ( ! isVisible || ! canEdit ) {\n\t\treturn null;\n\t}\n\n\tconst handleDetach = () => {\n\t\tif ( isSyncedPattern ) {\n\t\t\tconvertSyncedPatternToStatic( clientId );\n\t\t}\n\n\t\tif ( isUnsyncedPattern ) {\n\t\t\tconst { patternName, ...attributesWithoutPatternName } =\n\t\t\t\tattributes?.metadata ?? {};\n\t\t\tupdateBlockAttributes( clientId, {\n\t\t\t\tmetadata: attributesWithoutPatternName,\n\t\t\t} );\n\t\t}\n\t\tonClose?.();\n\t\tsetShowConfirmDialog( false );\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{ canDetach && (\n\t\t\t\t<>\n\t\t\t\t\t<MenuItem onClick={ () => setShowConfirmDialog( true ) }>\n\t\t\t\t\t\t{ isSyncedPattern\n\t\t\t\t\t\t\t? __( 'Disconnect pattern' )\n\t\t\t\t\t\t\t: __( 'Detach pattern' ) }\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t<ConfirmDialog\n\t\t\t\t\t\tisOpen={ showConfirmDialog }\n\t\t\t\t\t\tonConfirm={ handleDetach }\n\t\t\t\t\t\tonCancel={ () => setShowConfirmDialog( false ) }\n\t\t\t\t\t\tconfirmButtonText={\n\t\t\t\t\t\t\tisSyncedPattern\n\t\t\t\t\t\t\t\t? __( 'Disconnect' )\n\t\t\t\t\t\t\t\t: __( 'Detach' )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\tisSyncedPattern\n\t\t\t\t\t\t\t\t? __( 'Disconnect pattern?' )\n\t\t\t\t\t\t\t\t: __( 'Detach pattern?' )\n\t\t\t\t\t\t}\n\t\t\t\t\t\t__experimentalHideHeader={ false }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ isSyncedPattern\n\t\t\t\t\t\t\t? __(\n\t\t\t\t\t\t\t\t\t'The blocks will be separated from the original pattern and will be fully editable. Future changes to the pattern will not apply here.'\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: __(\n\t\t\t\t\t\t\t\t\t'Blocks will no longer be associated with this pattern and will be fully editable.'\n\t\t\t\t\t\t\t ) }\n\t\t\t\t\t</ConfirmDialog>\n\t\t\t\t</>\n\t\t\t) }\n\t\t\t<MenuItem href={ managePatternsUrl }>\n\t\t\t\t{ __( 'Manage patterns' ) }\n\t\t\t</MenuItem>\n\t\t</>\n\t);\n}\n\nexport default PatternsManageButton;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/patterns",
3
- "version": "2.41.0",
3
+ "version": "2.41.1-next.v.202603161435.0+ab4981c4f",
4
4
  "description": "Management of user pattern editing.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -52,21 +52,21 @@
52
52
  "build-module/store/index.mjs"
53
53
  ],
54
54
  "dependencies": {
55
- "@wordpress/a11y": "^4.41.0",
56
- "@wordpress/base-styles": "^6.17.0",
57
- "@wordpress/block-editor": "^15.14.0",
58
- "@wordpress/blocks": "^15.14.0",
59
- "@wordpress/components": "^32.3.0",
60
- "@wordpress/compose": "^7.41.0",
61
- "@wordpress/core-data": "^7.41.0",
62
- "@wordpress/data": "^10.41.0",
63
- "@wordpress/element": "^6.41.0",
64
- "@wordpress/html-entities": "^4.41.0",
65
- "@wordpress/i18n": "^6.14.0",
66
- "@wordpress/icons": "^11.8.0",
67
- "@wordpress/notices": "^5.41.0",
68
- "@wordpress/private-apis": "^1.41.0",
69
- "@wordpress/url": "^4.41.0"
55
+ "@wordpress/a11y": "^4.41.1-next.v.202603161435.0+ab4981c4f",
56
+ "@wordpress/base-styles": "^6.17.1-next.v.202603161435.0+ab4981c4f",
57
+ "@wordpress/block-editor": "^15.14.1-next.v.202603161435.0+ab4981c4f",
58
+ "@wordpress/blocks": "^15.14.1-next.v.202603161435.0+ab4981c4f",
59
+ "@wordpress/components": "^32.4.1-next.v.202603161435.0+ab4981c4f",
60
+ "@wordpress/compose": "^7.41.1-next.v.202603161435.0+ab4981c4f",
61
+ "@wordpress/core-data": "^7.41.2-next.v.202603161435.0+ab4981c4f",
62
+ "@wordpress/data": "^10.41.1-next.v.202603161435.0+ab4981c4f",
63
+ "@wordpress/element": "^6.41.1-next.v.202603161435.0+ab4981c4f",
64
+ "@wordpress/html-entities": "^4.41.1-next.v.202603161435.0+ab4981c4f",
65
+ "@wordpress/i18n": "^6.14.1-next.v.202603161435.0+ab4981c4f",
66
+ "@wordpress/icons": "^12.0.1-next.v.202603161435.0+ab4981c4f",
67
+ "@wordpress/notices": "^5.41.1-next.v.202603161435.0+ab4981c4f",
68
+ "@wordpress/private-apis": "^1.41.1-next.v.202603161435.0+ab4981c4f",
69
+ "@wordpress/url": "^4.41.1-next.v.202603161435.0+ab4981c4f"
70
70
  },
71
71
  "peerDependencies": {
72
72
  "react": "^18.0.0",
@@ -75,5 +75,5 @@
75
75
  "publishConfig": {
76
76
  "access": "public"
77
77
  },
78
- "gitHead": "8bfc179b9aed74c0a6dd6e8edf7a49e40e4f87cc"
78
+ "gitHead": "748f4e4564fcc0e6ae90200d90bb993a3cef5828"
79
79
  }
@@ -22,6 +22,7 @@ export default function PatternsMenuItems( { rootClientId } ) {
22
22
  { selectedClientIds.length === 1 && (
23
23
  <PatternsManageButton
24
24
  clientId={ selectedClientIds[ 0 ] }
25
+ onClose={ onClose }
25
26
  />
26
27
  ) }
27
28
  </>
@@ -143,7 +143,6 @@ export default function PatternConvertButton( {
143
143
 
144
144
  replaceBlocks( clientIds, newBlock );
145
145
  setEditingPattern( newBlock.clientId, true );
146
- closeBlockSettingsMenu();
147
146
  }
148
147
 
149
148
  createSuccessNotice(
@@ -164,6 +163,7 @@ export default function PatternConvertButton( {
164
163
  }
165
164
  );
166
165
  setIsModalOpen( false );
166
+ closeBlockSettingsMenu();
167
167
  };
168
168
  return (
169
169
  <>
@@ -186,6 +186,7 @@ export default function PatternConvertButton( {
186
186
  } }
187
187
  onClose={ () => {
188
188
  setIsModalOpen( false );
189
+ closeBlockSettingsMenu();
189
190
  } }
190
191
  />
191
192
  ) }
@@ -1,10 +1,14 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { MenuItem } from '@wordpress/components';
4
+ import {
5
+ MenuItem,
6
+ __experimentalConfirmDialog as ConfirmDialog,
7
+ } from '@wordpress/components';
5
8
  import { __ } from '@wordpress/i18n';
6
9
  import { isReusableBlock } from '@wordpress/blocks';
7
10
  import { useSelect, useDispatch } from '@wordpress/data';
11
+ import { useState } from '@wordpress/element';
8
12
  import { store as blockEditorStore } from '@wordpress/block-editor';
9
13
  import { addQueryArgs } from '@wordpress/url';
10
14
  import { store as coreStore } from '@wordpress/core-data';
@@ -15,7 +19,9 @@ import { store as coreStore } from '@wordpress/core-data';
15
19
  import { store as patternsStore } from '../store';
16
20
  import { unlock } from '../lock-unlock';
17
21
 
18
- function PatternsManageButton( { clientId } ) {
22
+ function PatternsManageButton( { clientId, onClose } ) {
23
+ const [ showConfirmDialog, setShowConfirmDialog ] = useState( false );
24
+
19
25
  const {
20
26
  attributes,
21
27
  canDetach,
@@ -85,30 +91,57 @@ function PatternsManageButton( { clientId } ) {
85
91
  return null;
86
92
  }
87
93
 
94
+ const handleDetach = () => {
95
+ if ( isSyncedPattern ) {
96
+ convertSyncedPatternToStatic( clientId );
97
+ }
98
+
99
+ if ( isUnsyncedPattern ) {
100
+ const { patternName, ...attributesWithoutPatternName } =
101
+ attributes?.metadata ?? {};
102
+ updateBlockAttributes( clientId, {
103
+ metadata: attributesWithoutPatternName,
104
+ } );
105
+ }
106
+ onClose?.();
107
+ setShowConfirmDialog( false );
108
+ };
109
+
88
110
  return (
89
111
  <>
90
112
  { canDetach && (
91
- <MenuItem
92
- onClick={ () => {
93
- if ( isSyncedPattern ) {
94
- convertSyncedPatternToStatic( clientId );
113
+ <>
114
+ <MenuItem onClick={ () => setShowConfirmDialog( true ) }>
115
+ { isSyncedPattern
116
+ ? __( 'Disconnect pattern' )
117
+ : __( 'Detach pattern' ) }
118
+ </MenuItem>
119
+ <ConfirmDialog
120
+ isOpen={ showConfirmDialog }
121
+ onConfirm={ handleDetach }
122
+ onCancel={ () => setShowConfirmDialog( false ) }
123
+ confirmButtonText={
124
+ isSyncedPattern
125
+ ? __( 'Disconnect' )
126
+ : __( 'Detach' )
95
127
  }
96
-
97
- if ( isUnsyncedPattern ) {
98
- const {
99
- patternName,
100
- ...attributesWithoutPatternName
101
- } = attributes?.metadata ?? {};
102
- updateBlockAttributes( clientId, {
103
- metadata: attributesWithoutPatternName,
104
- } );
128
+ size="medium"
129
+ title={
130
+ isSyncedPattern
131
+ ? __( 'Disconnect pattern?' )
132
+ : __( 'Detach pattern?' )
105
133
  }
106
- } }
107
- >
108
- { isSyncedPattern
109
- ? __( 'Disconnect pattern' )
110
- : __( 'Detach pattern' ) }
111
- </MenuItem>
134
+ __experimentalHideHeader={ false }
135
+ >
136
+ { isSyncedPattern
137
+ ? __(
138
+ 'The blocks will be separated from the original pattern and will be fully editable. Future changes to the pattern will not apply here.'
139
+ )
140
+ : __(
141
+ 'Blocks will no longer be associated with this pattern and will be fully editable.'
142
+ ) }
143
+ </ConfirmDialog>
144
+ </>
112
145
  ) }
113
146
  <MenuItem href={ managePatternsUrl }>
114
147
  { __( 'Manage patterns' ) }