@wordpress/reusable-blocks 4.14.0 → 4.15.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.
- package/CHANGELOG.md +2 -0
- package/build/components/reusable-blocks-menu-items/index.js +2 -13
- package/build/components/reusable-blocks-menu-items/index.js.map +1 -1
- package/build/components/reusable-blocks-menu-items/reusable-block-convert-button.js +23 -10
- package/build/components/reusable-blocks-menu-items/reusable-block-convert-button.js.map +1 -1
- package/build/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js +18 -7
- package/build/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js.map +1 -1
- package/build/lock-unlock.js +17 -0
- package/build/lock-unlock.js.map +1 -0
- package/build/store/actions.js +3 -3
- package/build/store/actions.js.map +1 -1
- package/build-module/components/reusable-blocks-menu-items/index.js +3 -13
- package/build-module/components/reusable-blocks-menu-items/index.js.map +1 -1
- package/build-module/components/reusable-blocks-menu-items/reusable-block-convert-button.js +23 -11
- package/build-module/components/reusable-blocks-menu-items/reusable-block-convert-button.js.map +1 -1
- package/build-module/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js +18 -7
- package/build-module/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js.map +1 -1
- package/build-module/lock-unlock.js +8 -0
- package/build-module/lock-unlock.js.map +1 -0
- package/build-module/store/actions.js +3 -3
- package/build-module/store/actions.js.map +1 -1
- package/package.json +13 -12
- package/src/components/reusable-blocks-menu-items/index.js +7 -9
- package/src/components/reusable-blocks-menu-items/reusable-block-convert-button.js +39 -13
- package/src/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js +36 -25
- package/src/lock-unlock.js +9 -0
- package/src/store/actions.js +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.default =
|
|
8
|
+
exports.default = ReusableBlocksMenuItems;
|
|
9
9
|
|
|
10
10
|
var _element = require("@wordpress/element");
|
|
11
11
|
|
|
@@ -25,9 +25,9 @@ var _reusableBlocksManageButton = _interopRequireDefault(require("./reusable-blo
|
|
|
25
25
|
* Internal dependencies
|
|
26
26
|
*/
|
|
27
27
|
function ReusableBlocksMenuItems({
|
|
28
|
-
clientIds,
|
|
29
28
|
rootClientId
|
|
30
29
|
}) {
|
|
30
|
+
const clientIds = (0, _data.useSelect)(select => select(_blockEditor.store).getSelectedBlockClientIds(), []);
|
|
31
31
|
return (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_reusableBlockConvertButton.default, {
|
|
32
32
|
clientIds: clientIds,
|
|
33
33
|
rootClientId: rootClientId
|
|
@@ -35,15 +35,4 @@ function ReusableBlocksMenuItems({
|
|
|
35
35
|
clientId: clientIds[0]
|
|
36
36
|
}));
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
var _default = (0, _data.withSelect)(select => {
|
|
40
|
-
const {
|
|
41
|
-
getSelectedBlockClientIds
|
|
42
|
-
} = select(_blockEditor.store);
|
|
43
|
-
return {
|
|
44
|
-
clientIds: getSelectedBlockClientIds()
|
|
45
|
-
};
|
|
46
|
-
})(ReusableBlocksMenuItems);
|
|
47
|
-
|
|
48
|
-
exports.default = _default;
|
|
49
38
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/index.js"],"names":["ReusableBlocksMenuItems","
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/index.js"],"names":["ReusableBlocksMenuItems","rootClientId","clientIds","select","blockEditorStore","getSelectedBlockClientIds","length"],"mappings":";;;;;;;;;;;AAGA;;AACA;;AAKA;;AACA;;AAVA;AACA;AACA;;AAIA;AACA;AACA;AAIe,SAASA,uBAAT,CAAkC;AAAEC,EAAAA;AAAF,CAAlC,EAAqD;AACnE,QAAMC,SAAS,GAAG,qBACfC,MAAF,IAAcA,MAAM,CAAEC,kBAAF,CAAN,CAA2BC,yBAA3B,EADG,EAEjB,EAFiB,CAAlB;AAKA,SACC,qDACC,4BAAC,mCAAD;AACC,IAAA,SAAS,EAAGH,SADb;AAEC,IAAA,YAAY,EAAGD;AAFhB,IADD,EAKGC,SAAS,CAACI,MAAV,KAAqB,CAArB,IACD,4BAAC,mCAAD;AAA4B,IAAA,QAAQ,EAAGJ,SAAS,CAAE,CAAF;AAAhD,IANF,CADD;AAWA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport ReusableBlockConvertButton from './reusable-block-convert-button';\nimport ReusableBlocksManageButton from './reusable-blocks-manage-button';\n\nexport default function ReusableBlocksMenuItems( { rootClientId } ) {\n\tconst clientIds = useSelect(\n\t\t( select ) => select( blockEditorStore ).getSelectedBlockClientIds(),\n\t\t[]\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<ReusableBlockConvertButton\n\t\t\t\tclientIds={ clientIds }\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t/>\n\t\t\t{ clientIds.length === 1 && (\n\t\t\t\t<ReusableBlocksManageButton clientId={ clientIds[ 0 ] } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
|
|
@@ -25,6 +25,8 @@ var _coreData = require("@wordpress/core-data");
|
|
|
25
25
|
|
|
26
26
|
var _store = require("../../store");
|
|
27
27
|
|
|
28
|
+
var _lockUnlock = require("../../lock-unlock");
|
|
29
|
+
|
|
28
30
|
/**
|
|
29
31
|
* WordPress dependencies
|
|
30
32
|
*/
|
|
@@ -45,7 +47,12 @@ function ReusableBlockConvertButton({
|
|
|
45
47
|
clientIds,
|
|
46
48
|
rootClientId
|
|
47
49
|
}) {
|
|
48
|
-
const
|
|
50
|
+
const {
|
|
51
|
+
useReusableBlocksRenameHint,
|
|
52
|
+
ReusableBlocksRenameHint
|
|
53
|
+
} = (0, _lockUnlock.unlock)(_blockEditor.privateApis);
|
|
54
|
+
const showRenameHint = useReusableBlocksRenameHint();
|
|
55
|
+
const [syncType, setSyncType] = (0, _element.useState)(undefined);
|
|
49
56
|
const [isModalOpen, setIsModalOpen] = (0, _element.useState)(false);
|
|
50
57
|
const [title, setTitle] = (0, _element.useState)('');
|
|
51
58
|
const canConvert = (0, _data.useSelect)(select => {
|
|
@@ -56,14 +63,16 @@ function ReusableBlockConvertButton({
|
|
|
56
63
|
} = select(_coreData.store);
|
|
57
64
|
const {
|
|
58
65
|
getBlocksByClientId,
|
|
59
|
-
canInsertBlockType
|
|
66
|
+
canInsertBlockType,
|
|
67
|
+
getBlockRootClientId
|
|
60
68
|
} = select(_blockEditor.store);
|
|
69
|
+
const rootId = rootClientId || (clientIds.length > 0 ? getBlockRootClientId(clientIds[0]) : undefined);
|
|
61
70
|
const blocks = (_getBlocksByClientId = getBlocksByClientId(clientIds)) !== null && _getBlocksByClientId !== void 0 ? _getBlocksByClientId : [];
|
|
62
71
|
const isReusable = blocks.length === 1 && blocks[0] && (0, _blocks.isReusableBlock)(blocks[0]) && !!select(_coreData.store).getEntityRecord('postType', 'wp_block', blocks[0].attributes.ref);
|
|
63
72
|
|
|
64
73
|
const _canConvert = // Hide when this is already a reusable block.
|
|
65
74
|
!isReusable && // Hide when reusable blocks are disabled.
|
|
66
|
-
canInsertBlockType('core/block',
|
|
75
|
+
canInsertBlockType('core/block', rootId) && blocks.every(block => // Guard against the case where a regular block has *just* been converted.
|
|
67
76
|
!!block && // Hide on invalid blocks.
|
|
68
77
|
block.isValid && // Hide when block doesn't support being made reusable.
|
|
69
78
|
(0, _blocks.hasBlockSupport)(block.name, 'reusable', true)) && // Hide when current doesn't have permission to do that.
|
|
@@ -81,12 +90,16 @@ function ReusableBlockConvertButton({
|
|
|
81
90
|
const onConvert = (0, _element.useCallback)(async function (reusableBlockTitle) {
|
|
82
91
|
try {
|
|
83
92
|
await convertBlocksToReusable(clientIds, reusableBlockTitle, syncType);
|
|
84
|
-
createSuccessNotice(syncType
|
|
85
|
-
|
|
93
|
+
createSuccessNotice(!syncType ? (0, _i18n.sprintf)( // translators: %s: the name the user has given to the pattern.
|
|
94
|
+
(0, _i18n.__)('Synced Pattern created: %s'), reusableBlockTitle) : (0, _i18n.sprintf)( // translators: %s: the name the user has given to the pattern.
|
|
95
|
+
(0, _i18n.__)('Unsynced Pattern created: %s'), reusableBlockTitle), {
|
|
96
|
+
type: 'snackbar',
|
|
97
|
+
id: 'convert-to-reusable-block-success'
|
|
86
98
|
});
|
|
87
99
|
} catch (error) {
|
|
88
100
|
createErrorNotice(error.message, {
|
|
89
|
-
type: 'snackbar'
|
|
101
|
+
type: 'snackbar',
|
|
102
|
+
id: 'convert-to-reusable-block-error'
|
|
90
103
|
});
|
|
91
104
|
}
|
|
92
105
|
}, [convertBlocksToReusable, clientIds, syncType, createSuccessNotice, createErrorNotice]);
|
|
@@ -100,7 +113,7 @@ function ReusableBlockConvertButton({
|
|
|
100
113
|
}) => (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_components.MenuItem, {
|
|
101
114
|
icon: _icons.symbol,
|
|
102
115
|
onClick: () => setIsModalOpen(true)
|
|
103
|
-
}, (0, _i18n.__)('Create pattern/reusable block')), isModalOpen && (0, _element.createElement)(_components.Modal, {
|
|
116
|
+
}, showRenameHint ? (0, _i18n.__)('Create pattern/reusable block') : (0, _i18n.__)('Create pattern')), isModalOpen && (0, _element.createElement)(_components.Modal, {
|
|
104
117
|
title: (0, _i18n.__)('Create pattern'),
|
|
105
118
|
onRequestClose: () => {
|
|
106
119
|
setIsModalOpen(false);
|
|
@@ -117,7 +130,7 @@ function ReusableBlockConvertButton({
|
|
|
117
130
|
}
|
|
118
131
|
}, (0, _element.createElement)(_components.__experimentalVStack, {
|
|
119
132
|
spacing: "5"
|
|
120
|
-
}, (0, _element.createElement)(
|
|
133
|
+
}, (0, _element.createElement)(ReusableBlocksRenameHint, null), (0, _element.createElement)(_components.TextControl, {
|
|
121
134
|
__nextHasNoMarginBottom: true,
|
|
122
135
|
label: (0, _i18n.__)('Name'),
|
|
123
136
|
value: title,
|
|
@@ -126,9 +139,9 @@ function ReusableBlockConvertButton({
|
|
|
126
139
|
}), (0, _element.createElement)(_components.ToggleControl, {
|
|
127
140
|
label: (0, _i18n.__)('Synced'),
|
|
128
141
|
help: (0, _i18n.__)('Editing the pattern will update it anywhere it is used.'),
|
|
129
|
-
checked: syncType
|
|
142
|
+
checked: !syncType,
|
|
130
143
|
onChange: () => {
|
|
131
|
-
setSyncType(syncType
|
|
144
|
+
setSyncType(!syncType ? 'unsynced' : undefined);
|
|
132
145
|
}
|
|
133
146
|
}), (0, _element.createElement)(_components.__experimentalHStack, {
|
|
134
147
|
justify: "right"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-block-convert-button.js"],"names":["ReusableBlockConvertButton","clientIds","rootClientId","syncType","setSyncType","isModalOpen","setIsModalOpen","title","setTitle","canConvert","select","canUser","coreStore","getBlocksByClientId","canInsertBlockType","blockEditorStore","blocks","isReusable","length","getEntityRecord","attributes","ref","_canConvert","every","block","isValid","name","__experimentalConvertBlocksToReusable","convertBlocksToReusable","store","createSuccessNotice","createErrorNotice","noticesStore","onConvert","reusableBlockTitle","type","error","message","onClose","symbol","event","preventDefault"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';\nimport {\n\tBlockSettingsMenuControls,\n\tstore as blockEditorStore,\n\tReusableBlocksRenameHint,\n} from '@wordpress/block-editor';\nimport { useCallback, useState } from '@wordpress/element';\nimport {\n\tMenuItem,\n\tModal,\n\tButton,\n\tTextControl,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tToggleControl,\n} from '@wordpress/components';\nimport { symbol } from '@wordpress/icons';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store } from '../../store';\n\n/**\n * Menu control to convert block(s) to reusable 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 * @return {import('@wordpress/element').WPComponent} The menu control or null.\n */\nexport default function ReusableBlockConvertButton( {\n\tclientIds,\n\trootClientId,\n} ) {\n\tconst [ syncType, setSyncType ] = useState( 'unsynced' );\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst [ title, setTitle ] = useState( '' );\n\tconst canConvert = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst { getBlocksByClientId, canInsertBlockType } =\n\t\t\t\tselect( blockEditorStore );\n\n\t\t\tconst blocks = getBlocksByClientId( clientIds ) ?? [];\n\n\t\t\tconst isReusable =\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 _canConvert =\n\t\t\t\t// Hide when this is already a reusable block.\n\t\t\t\t! isReusable &&\n\t\t\t\t// Hide when reusable blocks are disabled.\n\t\t\t\tcanInsertBlockType( 'core/block', rootClientId ) &&\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 reusable.\n\t\t\t\t\t\thasBlockSupport( block.name, 'reusable', true )\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!! canUser( 'create', 'blocks' );\n\n\t\t\treturn _canConvert;\n\t\t},\n\t\t[ clientIds, rootClientId ]\n\t);\n\n\tconst { __experimentalConvertBlocksToReusable: convertBlocksToReusable } =\n\t\tuseDispatch( store );\n\n\tconst { createSuccessNotice, createErrorNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst onConvert = useCallback(\n\t\tasync function ( reusableBlockTitle ) {\n\t\t\ttry {\n\t\t\t\tawait convertBlocksToReusable(\n\t\t\t\t\tclientIds,\n\t\t\t\t\treusableBlockTitle,\n\t\t\t\t\tsyncType\n\t\t\t\t);\n\t\t\t\tcreateSuccessNotice(\n\t\t\t\t\tsyncType === 'fully'\n\t\t\t\t\t\t? __( 'Synced Pattern created.' )\n\t\t\t\t\t\t: __( 'Unsynced Pattern created.' ),\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} catch ( error ) {\n\t\t\t\tcreateErrorNotice( error.message, {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tconvertBlocksToReusable,\n\t\t\tclientIds,\n\t\t\tsyncType,\n\t\t\tcreateSuccessNotice,\n\t\t\tcreateErrorNotice,\n\t\t]\n\t);\n\n\tif ( ! canConvert ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t{ ( { onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<MenuItem\n\t\t\t\t\t\ticon={ symbol }\n\t\t\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Create pattern/reusable block' ) }\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t{ isModalOpen && (\n\t\t\t\t\t\t<Modal\n\t\t\t\t\t\t\ttitle={ __( 'Create pattern' ) }\n\t\t\t\t\t\t\tonRequestClose={ () => {\n\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\toverlayClassName=\"reusable-blocks-menu-items__convert-modal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tonConvert( title );\n\t\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<VStack spacing=\"5\">\n\t\t\t\t\t\t\t\t\t<ReusableBlocksRenameHint />\n\t\t\t\t\t\t\t\t\t<TextControl\n\t\t\t\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Name' ) }\n\t\t\t\t\t\t\t\t\t\tvalue={ title }\n\t\t\t\t\t\t\t\t\t\tonChange={ setTitle }\n\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'My pattern' ) }\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Synced' ) }\n\t\t\t\t\t\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t\t\t\t\t\t'Editing the pattern will update it anywhere it is used.'\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\tchecked={ syncType === 'fully' }\n\t\t\t\t\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\t\t\t\t\tsetSyncType(\n\t\t\t\t\t\t\t\t\t\t\t\tsyncType === 'fully'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'unsynced'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'fully'\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t\t\t\t<Button variant=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Create' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</VStack>\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t</Modal>\n\t\t\t\t\t) }\n\t\t\t\t</>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-block-convert-button.js"],"names":["ReusableBlockConvertButton","clientIds","rootClientId","useReusableBlocksRenameHint","ReusableBlocksRenameHint","blockEditorPrivateApis","showRenameHint","syncType","setSyncType","undefined","isModalOpen","setIsModalOpen","title","setTitle","canConvert","select","canUser","coreStore","getBlocksByClientId","canInsertBlockType","getBlockRootClientId","blockEditorStore","rootId","length","blocks","isReusable","getEntityRecord","attributes","ref","_canConvert","every","block","isValid","name","__experimentalConvertBlocksToReusable","convertBlocksToReusable","store","createSuccessNotice","createErrorNotice","noticesStore","onConvert","reusableBlockTitle","type","id","error","message","onClose","symbol","event","preventDefault"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';\nimport {\n\tBlockSettingsMenuControls,\n\tstore as blockEditorStore,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\nimport { useCallback, useState } from '@wordpress/element';\nimport {\n\tMenuItem,\n\tModal,\n\tButton,\n\tTextControl,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tToggleControl,\n} from '@wordpress/components';\nimport { symbol } from '@wordpress/icons';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\n/**\n * Menu control to convert block(s) to reusable 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 * @return {import('@wordpress/element').WPComponent} The menu control or null.\n */\nexport default function ReusableBlockConvertButton( {\n\tclientIds,\n\trootClientId,\n} ) {\n\tconst { useReusableBlocksRenameHint, ReusableBlocksRenameHint } = unlock(\n\t\tblockEditorPrivateApis\n\t);\n\tconst showRenameHint = useReusableBlocksRenameHint();\n\tconst [ syncType, setSyncType ] = useState( undefined );\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst [ title, setTitle ] = useState( '' );\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\tconst isReusable =\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 _canConvert =\n\t\t\t\t// Hide when this is already a reusable block.\n\t\t\t\t! isReusable &&\n\t\t\t\t// Hide when reusable blocks 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 reusable.\n\t\t\t\t\t\thasBlockSupport( block.name, 'reusable', true )\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!! canUser( 'create', 'blocks' );\n\n\t\t\treturn _canConvert;\n\t\t},\n\t\t[ clientIds, rootClientId ]\n\t);\n\n\tconst { __experimentalConvertBlocksToReusable: convertBlocksToReusable } =\n\t\tuseDispatch( store );\n\n\tconst { createSuccessNotice, createErrorNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst onConvert = useCallback(\n\t\tasync function ( reusableBlockTitle ) {\n\t\t\ttry {\n\t\t\t\tawait convertBlocksToReusable(\n\t\t\t\t\tclientIds,\n\t\t\t\t\treusableBlockTitle,\n\t\t\t\t\tsyncType\n\t\t\t\t);\n\t\t\t\tcreateSuccessNotice(\n\t\t\t\t\t! syncType\n\t\t\t\t\t\t? sprintf(\n\t\t\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t\t\t__( 'Synced Pattern created: %s' ),\n\t\t\t\t\t\t\t\treusableBlockTitle\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: sprintf(\n\t\t\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t\t\t__( 'Unsynced Pattern created: %s' ),\n\t\t\t\t\t\t\t\treusableBlockTitle\n\t\t\t\t\t\t ),\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\t\tid: 'convert-to-reusable-block-success',\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} catch ( error ) {\n\t\t\t\tcreateErrorNotice( error.message, {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\tid: 'convert-to-reusable-block-error',\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tconvertBlocksToReusable,\n\t\t\tclientIds,\n\t\t\tsyncType,\n\t\t\tcreateSuccessNotice,\n\t\t\tcreateErrorNotice,\n\t\t]\n\t);\n\n\tif ( ! canConvert ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t{ ( { onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<MenuItem\n\t\t\t\t\t\ticon={ symbol }\n\t\t\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ showRenameHint\n\t\t\t\t\t\t\t? __( 'Create pattern/reusable block' )\n\t\t\t\t\t\t\t: __( 'Create pattern' ) }\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t{ isModalOpen && (\n\t\t\t\t\t\t<Modal\n\t\t\t\t\t\t\ttitle={ __( 'Create pattern' ) }\n\t\t\t\t\t\t\tonRequestClose={ () => {\n\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\toverlayClassName=\"reusable-blocks-menu-items__convert-modal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tonConvert( title );\n\t\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<VStack spacing=\"5\">\n\t\t\t\t\t\t\t\t\t<ReusableBlocksRenameHint />\n\t\t\t\t\t\t\t\t\t<TextControl\n\t\t\t\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Name' ) }\n\t\t\t\t\t\t\t\t\t\tvalue={ title }\n\t\t\t\t\t\t\t\t\t\tonChange={ setTitle }\n\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'My pattern' ) }\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Synced' ) }\n\t\t\t\t\t\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t\t\t\t\t\t'Editing the pattern will update it anywhere it is used.'\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\tchecked={ ! syncType }\n\t\t\t\t\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\t\t\t\t\tsetSyncType(\n\t\t\t\t\t\t\t\t\t\t\t\t! syncType\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'unsynced'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t\t\t\t<Button variant=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Create' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</VStack>\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t</Modal>\n\t\t\t\t\t) }\n\t\t\t\t</>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n"]}
|
|
@@ -36,21 +36,34 @@ function ReusableBlocksManageButton({
|
|
|
36
36
|
const {
|
|
37
37
|
canRemove,
|
|
38
38
|
isVisible,
|
|
39
|
-
innerBlockCount
|
|
39
|
+
innerBlockCount,
|
|
40
|
+
managePatternsUrl
|
|
40
41
|
} = (0, _data.useSelect)(select => {
|
|
41
42
|
const {
|
|
42
43
|
getBlock,
|
|
43
44
|
canRemoveBlock,
|
|
44
|
-
getBlockCount
|
|
45
|
+
getBlockCount,
|
|
46
|
+
getSettings
|
|
45
47
|
} = select(_blockEditor.store);
|
|
46
48
|
const {
|
|
47
49
|
canUser
|
|
48
50
|
} = select(_coreData.store);
|
|
49
51
|
const reusableBlock = getBlock(clientId);
|
|
52
|
+
|
|
53
|
+
const isBlockTheme = getSettings().__unstableIsBlockBasedTheme;
|
|
54
|
+
|
|
50
55
|
return {
|
|
51
56
|
canRemove: canRemoveBlock(clientId),
|
|
52
57
|
isVisible: !!reusableBlock && (0, _blocks.isReusableBlock)(reusableBlock) && !!canUser('update', 'blocks', reusableBlock.attributes.ref),
|
|
53
|
-
innerBlockCount: getBlockCount(clientId)
|
|
58
|
+
innerBlockCount: getBlockCount(clientId),
|
|
59
|
+
// The site editor and templates both check whether the user
|
|
60
|
+
// has edit_theme_options capabilities. We can leverage that here
|
|
61
|
+
// and omit the manage patterns link if the user can't access it.
|
|
62
|
+
managePatternsUrl: isBlockTheme && canUser('read', 'templates') ? (0, _url.addQueryArgs)('site-editor.php', {
|
|
63
|
+
path: '/patterns'
|
|
64
|
+
}) : (0, _url.addQueryArgs)('edit.php', {
|
|
65
|
+
post_type: 'wp_block'
|
|
66
|
+
})
|
|
54
67
|
};
|
|
55
68
|
}, [clientId]);
|
|
56
69
|
const {
|
|
@@ -62,10 +75,8 @@ function ReusableBlocksManageButton({
|
|
|
62
75
|
}
|
|
63
76
|
|
|
64
77
|
return (0, _element.createElement)(_blockEditor.BlockSettingsMenuControls, null, (0, _element.createElement)(_components.MenuItem, {
|
|
65
|
-
href:
|
|
66
|
-
|
|
67
|
-
})
|
|
68
|
-
}, (0, _i18n.__)('Manage Patterns')), canRemove && (0, _element.createElement)(_components.MenuItem, {
|
|
78
|
+
href: managePatternsUrl
|
|
79
|
+
}, (0, _i18n.__)('Manage patterns')), canRemove && (0, _element.createElement)(_components.MenuItem, {
|
|
69
80
|
onClick: () => convertBlockToStatic(clientId)
|
|
70
81
|
}, innerBlockCount > 1 ? (0, _i18n.__)('Detach patterns') : (0, _i18n.__)('Detach pattern')));
|
|
71
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js"],"names":["ReusableBlocksManageButton","clientId","canRemove","isVisible","innerBlockCount","select","getBlock","canRemoveBlock","getBlockCount","blockEditorStore","canUser","coreStore","reusableBlock","attributes","ref","__experimentalConvertBlockToStatic","convertBlockToStatic","reusableBlocksStore"
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js"],"names":["ReusableBlocksManageButton","clientId","canRemove","isVisible","innerBlockCount","managePatternsUrl","select","getBlock","canRemoveBlock","getBlockCount","getSettings","blockEditorStore","canUser","coreStore","reusableBlock","isBlockTheme","__unstableIsBlockBasedTheme","attributes","ref","path","post_type","__experimentalConvertBlockToStatic","convertBlockToStatic","reusableBlocksStore"],"mappings":";;;;;;;;;AAGA;;AACA;;AACA;;AACA;;AACA;;AAIA;;AACA;;AAKA;;AAjBA;AACA;AACA;;AAYA;AACA;AACA;AAGA,SAASA,0BAAT,CAAqC;AAAEC,EAAAA;AAAF,CAArC,EAAoD;AACnD,QAAM;AAAEC,IAAAA,SAAF;AAAaC,IAAAA,SAAb;AAAwBC,IAAAA,eAAxB;AAAyCC,IAAAA;AAAzC,MACL,qBACGC,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,QAAF;AAAYC,MAAAA,cAAZ;AAA4BC,MAAAA,aAA5B;AAA2CC,MAAAA;AAA3C,QACLJ,MAAM,CAAEK,kBAAF,CADP;AAEA,UAAM;AAAEC,MAAAA;AAAF,QAAcN,MAAM,CAAEO,eAAF,CAA1B;AACA,UAAMC,aAAa,GAAGP,QAAQ,CAAEN,QAAF,CAA9B;;AACA,UAAMc,YAAY,GAAGL,WAAW,GAAGM,2BAAnC;;AAEA,WAAO;AACNd,MAAAA,SAAS,EAAEM,cAAc,CAAEP,QAAF,CADnB;AAENE,MAAAA,SAAS,EACR,CAAC,CAAEW,aAAH,IACA,6BAAiBA,aAAjB,CADA,IAEA,CAAC,CAAEF,OAAO,CACT,QADS,EAET,QAFS,EAGTE,aAAa,CAACG,UAAd,CAAyBC,GAHhB,CALL;AAUNd,MAAAA,eAAe,EAAEK,aAAa,CAAER,QAAF,CAVxB;AAWN;AACA;AACA;AACAI,MAAAA,iBAAiB,EAChBU,YAAY,IAAIH,OAAO,CAAE,MAAF,EAAU,WAAV,CAAvB,GACG,uBAAc,iBAAd,EAAiC;AACjCO,QAAAA,IAAI,EAAE;AAD2B,OAAjC,CADH,GAIG,uBAAc,UAAd,EAA0B;AAC1BC,QAAAA,SAAS,EAAE;AADe,OAA1B;AAnBE,KAAP;AAuBA,GA/BF,EAgCC,CAAEnB,QAAF,CAhCD,CADD;AAoCA,QAAM;AAAEoB,IAAAA,kCAAkC,EAAEC;AAAtC,MACL,uBAAaC,YAAb,CADD;;AAGA,MAAK,CAAEpB,SAAP,EAAmB;AAClB,WAAO,IAAP;AACA;;AAED,SACC,4BAAC,sCAAD,QACC,4BAAC,oBAAD;AAAU,IAAA,IAAI,EAAGE;AAAjB,KACG,cAAI,iBAAJ,CADH,CADD,EAIGH,SAAS,IACV,4BAAC,oBAAD;AAAU,IAAA,OAAO,EAAG,MAAMoB,oBAAoB,CAAErB,QAAF;AAA9C,KACGG,eAAe,GAAG,CAAlB,GACC,cAAI,iBAAJ,CADD,GAEC,cAAI,gBAAJ,CAHJ,CALF,CADD;AAcA;;eAEcJ,0B","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 {\n\tBlockSettingsMenuControls,\n\tstore as blockEditorStore,\n} 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 reusableBlocksStore } from '../../store';\n\nfunction ReusableBlocksManageButton( { clientId } ) {\n\tconst { canRemove, isVisible, innerBlockCount, managePatternsUrl } =\n\t\tuseSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst { getBlock, canRemoveBlock, getBlockCount, getSettings } =\n\t\t\t\t\tselect( blockEditorStore );\n\t\t\t\tconst { canUser } = select( coreStore );\n\t\t\t\tconst reusableBlock = getBlock( clientId );\n\t\t\t\tconst isBlockTheme = getSettings().__unstableIsBlockBasedTheme;\n\n\t\t\t\treturn {\n\t\t\t\t\tcanRemove: canRemoveBlock( clientId ),\n\t\t\t\t\tisVisible:\n\t\t\t\t\t\t!! reusableBlock &&\n\t\t\t\t\t\tisReusableBlock( reusableBlock ) &&\n\t\t\t\t\t\t!! canUser(\n\t\t\t\t\t\t\t'update',\n\t\t\t\t\t\t\t'blocks',\n\t\t\t\t\t\t\treusableBlock.attributes.ref\n\t\t\t\t\t\t),\n\t\t\t\t\tinnerBlockCount: getBlockCount( clientId ),\n\t\t\t\t\t// The site editor and templates both check whether the user\n\t\t\t\t\t// has edit_theme_options capabilities. We can leverage that here\n\t\t\t\t\t// and omit the manage patterns link if the user can't access it.\n\t\t\t\t\tmanagePatternsUrl:\n\t\t\t\t\t\tisBlockTheme && canUser( 'read', 'templates' )\n\t\t\t\t\t\t\t? addQueryArgs( 'site-editor.php', {\n\t\t\t\t\t\t\t\t\tpath: '/patterns',\n\t\t\t\t\t\t\t } )\n\t\t\t\t\t\t\t: addQueryArgs( 'edit.php', {\n\t\t\t\t\t\t\t\t\tpost_type: 'wp_block',\n\t\t\t\t\t\t\t } ),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\n\tconst { __experimentalConvertBlockToStatic: convertBlockToStatic } =\n\t\tuseDispatch( reusableBlocksStore );\n\n\tif ( ! isVisible ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t<MenuItem href={ managePatternsUrl }>\n\t\t\t\t{ __( 'Manage patterns' ) }\n\t\t\t</MenuItem>\n\t\t\t{ canRemove && (\n\t\t\t\t<MenuItem onClick={ () => convertBlockToStatic( clientId ) }>\n\t\t\t\t\t{ innerBlockCount > 1\n\t\t\t\t\t\t? __( 'Detach patterns' )\n\t\t\t\t\t\t: __( 'Detach pattern' ) }\n\t\t\t\t</MenuItem>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n\nexport default ReusableBlocksManageButton;\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.unlock = void 0;
|
|
7
|
+
|
|
8
|
+
var _privateApis = require("@wordpress/private-apis");
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* WordPress dependencies
|
|
12
|
+
*/
|
|
13
|
+
const {
|
|
14
|
+
unlock
|
|
15
|
+
} = (0, _privateApis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)('I know using unstable features means my plugin or theme will inevitably break on the next WordPress release.', '@wordpress/reusable-blocks');
|
|
16
|
+
exports.unlock = unlock;
|
|
17
|
+
//# sourceMappingURL=lock-unlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/lock-unlock.js"],"names":["unlock"],"mappings":";;;;;;;AAGA;;AAHA;AACA;AACA;AAGO,MAAM;AAAEA,EAAAA;AAAF,IAAa,mEACzB,8GADyB,EAEzB,4BAFyB,CAAnB","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';\n\nexport const { unlock } = __dangerousOptInToUnstableAPIsOnlyForCoreModules(\n\t'I know using unstable features means my plugin or theme will inevitably break on the next WordPress release.',\n\t'@wordpress/reusable-blocks'\n);\n"]}
|
package/build/store/actions.js
CHANGED
|
@@ -32,9 +32,9 @@ const __experimentalConvertBlockToStatic = clientId => ({
|
|
|
32
32
|
/**
|
|
33
33
|
* Returns a generator converting one or more static blocks into a pattern.
|
|
34
34
|
*
|
|
35
|
-
* @param {string[]}
|
|
36
|
-
* @param {string}
|
|
37
|
-
* @param {
|
|
35
|
+
* @param {string[]} clientIds The client IDs of the block to detach.
|
|
36
|
+
* @param {string} title Pattern title.
|
|
37
|
+
* @param {undefined|'unsynced'} syncType They way block is synced, current undefined (synced) and 'unsynced'.
|
|
38
38
|
*/
|
|
39
39
|
|
|
40
40
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/store/actions.js"],"names":["__experimentalConvertBlockToStatic","clientId","registry","oldBlock","select","blockEditorStore","getBlock","reusableBlock","getEditedEntityRecord","attributes","ref","newBlocks","content","dispatch","replaceBlocks","__experimentalConvertBlocksToReusable","clientIds","title","syncType","meta","wp_pattern_sync_status","undefined","getBlocksByClientId","status","updatedRecord","saveEntityRecord","newBlock","id","__experimentalSetEditingReusableBlock","__experimentalDeleteReusableBlock","allBlocks","getBlocks","associatedBlocks","filter","block","associatedBlockClientIds","map","length","removeBlocks","deleteEntityRecord","isEditing","type"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport {\n\tcreateBlock,\n\tisReusableBlock,\n\tparse,\n\tserialize,\n} from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Returns a generator converting a reusable block into a static block.\n *\n * @param {string} clientId The client ID of the block to attach.\n */\nexport const __experimentalConvertBlockToStatic =\n\t( clientId ) =>\n\t( { registry } ) => {\n\t\tconst oldBlock = registry\n\t\t\t.select( blockEditorStore )\n\t\t\t.getBlock( clientId );\n\t\tconst reusableBlock = registry\n\t\t\t.select( 'core' )\n\t\t\t.getEditedEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_block',\n\t\t\t\toldBlock.attributes.ref\n\t\t\t);\n\n\t\tconst newBlocks = parse(\n\t\t\ttypeof reusableBlock.content === 'function'\n\t\t\t\t? reusableBlock.content( reusableBlock )\n\t\t\t\t: reusableBlock.content\n\t\t);\n\t\tregistry\n\t\t\t.dispatch( blockEditorStore )\n\t\t\t.replaceBlocks( oldBlock.clientId, newBlocks );\n\t};\n\n/**\n * Returns a generator converting one or more static blocks into a pattern.\n *\n * @param {string[]}
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/store/actions.js"],"names":["__experimentalConvertBlockToStatic","clientId","registry","oldBlock","select","blockEditorStore","getBlock","reusableBlock","getEditedEntityRecord","attributes","ref","newBlocks","content","dispatch","replaceBlocks","__experimentalConvertBlocksToReusable","clientIds","title","syncType","meta","wp_pattern_sync_status","undefined","getBlocksByClientId","status","updatedRecord","saveEntityRecord","newBlock","id","__experimentalSetEditingReusableBlock","__experimentalDeleteReusableBlock","allBlocks","getBlocks","associatedBlocks","filter","block","associatedBlockClientIds","map","length","removeBlocks","deleteEntityRecord","isEditing","type"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport {\n\tcreateBlock,\n\tisReusableBlock,\n\tparse,\n\tserialize,\n} from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Returns a generator converting a reusable block into a static block.\n *\n * @param {string} clientId The client ID of the block to attach.\n */\nexport const __experimentalConvertBlockToStatic =\n\t( clientId ) =>\n\t( { registry } ) => {\n\t\tconst oldBlock = registry\n\t\t\t.select( blockEditorStore )\n\t\t\t.getBlock( clientId );\n\t\tconst reusableBlock = registry\n\t\t\t.select( 'core' )\n\t\t\t.getEditedEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_block',\n\t\t\t\toldBlock.attributes.ref\n\t\t\t);\n\n\t\tconst newBlocks = parse(\n\t\t\ttypeof reusableBlock.content === 'function'\n\t\t\t\t? reusableBlock.content( reusableBlock )\n\t\t\t\t: reusableBlock.content\n\t\t);\n\t\tregistry\n\t\t\t.dispatch( blockEditorStore )\n\t\t\t.replaceBlocks( oldBlock.clientId, newBlocks );\n\t};\n\n/**\n * Returns a generator converting one or more static blocks into a pattern.\n *\n * @param {string[]} clientIds The client IDs of the block to detach.\n * @param {string} title Pattern title.\n * @param {undefined|'unsynced'} syncType They way block is synced, current undefined (synced) and 'unsynced'.\n */\nexport const __experimentalConvertBlocksToReusable =\n\t( clientIds, title, syncType ) =>\n\tasync ( { registry, dispatch } ) => {\n\t\tconst meta =\n\t\t\tsyncType === 'unsynced'\n\t\t\t\t? {\n\t\t\t\t\t\twp_pattern_sync_status: syncType,\n\t\t\t\t }\n\t\t\t\t: undefined;\n\n\t\tconst reusableBlock = {\n\t\t\ttitle: title || __( 'Untitled Pattern block' ),\n\t\t\tcontent: serialize(\n\t\t\t\tregistry\n\t\t\t\t\t.select( blockEditorStore )\n\t\t\t\t\t.getBlocksByClientId( clientIds )\n\t\t\t),\n\t\t\tstatus: 'publish',\n\t\t\tmeta,\n\t\t};\n\n\t\tconst updatedRecord = await registry\n\t\t\t.dispatch( 'core' )\n\t\t\t.saveEntityRecord( 'postType', 'wp_block', reusableBlock );\n\n\t\tif ( syncType === 'unsynced' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newBlock = createBlock( 'core/block', {\n\t\t\tref: updatedRecord.id,\n\t\t} );\n\t\tregistry\n\t\t\t.dispatch( blockEditorStore )\n\t\t\t.replaceBlocks( clientIds, newBlock );\n\t\tdispatch.__experimentalSetEditingReusableBlock(\n\t\t\tnewBlock.clientId,\n\t\t\ttrue\n\t\t);\n\t};\n\n/**\n * Returns a generator deleting a reusable block.\n *\n * @param {string} id The ID of the reusable block to delete.\n */\nexport const __experimentalDeleteReusableBlock =\n\t( id ) =>\n\tasync ( { registry } ) => {\n\t\tconst reusableBlock = registry\n\t\t\t.select( 'core' )\n\t\t\t.getEditedEntityRecord( 'postType', 'wp_block', id );\n\n\t\t// Don't allow a reusable block with a temporary ID to be deleted.\n\t\tif ( ! reusableBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove any other blocks that reference this reusable block.\n\t\tconst allBlocks = registry.select( blockEditorStore ).getBlocks();\n\t\tconst associatedBlocks = allBlocks.filter(\n\t\t\t( block ) => isReusableBlock( block ) && block.attributes.ref === id\n\t\t);\n\t\tconst associatedBlockClientIds = associatedBlocks.map(\n\t\t\t( block ) => block.clientId\n\t\t);\n\n\t\t// Remove the parsed block.\n\t\tif ( associatedBlockClientIds.length ) {\n\t\t\tregistry\n\t\t\t\t.dispatch( blockEditorStore )\n\t\t\t\t.removeBlocks( associatedBlockClientIds );\n\t\t}\n\n\t\tawait registry\n\t\t\t.dispatch( 'core' )\n\t\t\t.deleteEntityRecord( 'postType', 'wp_block', id );\n\t};\n\n/**\n * Returns an action descriptor for SET_EDITING_REUSABLE_BLOCK action.\n *\n * @param {string} clientId The clientID of the reusable block to target.\n * @param {boolean} isEditing Whether the block should be in editing state.\n * @return {Object} Action descriptor.\n */\nexport function __experimentalSetEditingReusableBlock( clientId, isEditing ) {\n\treturn {\n\t\ttype: 'SET_EDITING_REUSABLE_BLOCK',\n\t\tclientId,\n\t\tisEditing,\n\t};\n}\n"]}
|
|
@@ -3,7 +3,7 @@ import { createElement, Fragment } from "@wordpress/element";
|
|
|
3
3
|
/**
|
|
4
4
|
* WordPress dependencies
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { useSelect } from '@wordpress/data';
|
|
7
7
|
import { store as blockEditorStore } from '@wordpress/block-editor';
|
|
8
8
|
/**
|
|
9
9
|
* Internal dependencies
|
|
@@ -11,11 +11,10 @@ import { store as blockEditorStore } from '@wordpress/block-editor';
|
|
|
11
11
|
|
|
12
12
|
import ReusableBlockConvertButton from './reusable-block-convert-button';
|
|
13
13
|
import ReusableBlocksManageButton from './reusable-blocks-manage-button';
|
|
14
|
-
|
|
15
|
-
function ReusableBlocksMenuItems({
|
|
16
|
-
clientIds,
|
|
14
|
+
export default function ReusableBlocksMenuItems({
|
|
17
15
|
rootClientId
|
|
18
16
|
}) {
|
|
17
|
+
const clientIds = useSelect(select => select(blockEditorStore).getSelectedBlockClientIds(), []);
|
|
19
18
|
return createElement(Fragment, null, createElement(ReusableBlockConvertButton, {
|
|
20
19
|
clientIds: clientIds,
|
|
21
20
|
rootClientId: rootClientId
|
|
@@ -23,13 +22,4 @@ function ReusableBlocksMenuItems({
|
|
|
23
22
|
clientId: clientIds[0]
|
|
24
23
|
}));
|
|
25
24
|
}
|
|
26
|
-
|
|
27
|
-
export default withSelect(select => {
|
|
28
|
-
const {
|
|
29
|
-
getSelectedBlockClientIds
|
|
30
|
-
} = select(blockEditorStore);
|
|
31
|
-
return {
|
|
32
|
-
clientIds: getSelectedBlockClientIds()
|
|
33
|
-
};
|
|
34
|
-
})(ReusableBlocksMenuItems);
|
|
35
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/index.js"],"names":["
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/index.js"],"names":["useSelect","store","blockEditorStore","ReusableBlockConvertButton","ReusableBlocksManageButton","ReusableBlocksMenuItems","rootClientId","clientIds","select","getSelectedBlockClientIds","length"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,SAAT,QAA0B,iBAA1B;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,yBAA1C;AAEA;AACA;AACA;;AACA,OAAOC,0BAAP,MAAuC,iCAAvC;AACA,OAAOC,0BAAP,MAAuC,iCAAvC;AAEA,eAAe,SAASC,uBAAT,CAAkC;AAAEC,EAAAA;AAAF,CAAlC,EAAqD;AACnE,QAAMC,SAAS,GAAGP,SAAS,CACxBQ,MAAF,IAAcA,MAAM,CAAEN,gBAAF,CAAN,CAA2BO,yBAA3B,EADY,EAE1B,EAF0B,CAA3B;AAKA,SACC,8BACC,cAAC,0BAAD;AACC,IAAA,SAAS,EAAGF,SADb;AAEC,IAAA,YAAY,EAAGD;AAFhB,IADD,EAKGC,SAAS,CAACG,MAAV,KAAqB,CAArB,IACD,cAAC,0BAAD;AAA4B,IAAA,QAAQ,EAAGH,SAAS,CAAE,CAAF;AAAhD,IANF,CADD;AAWA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport ReusableBlockConvertButton from './reusable-block-convert-button';\nimport ReusableBlocksManageButton from './reusable-blocks-manage-button';\n\nexport default function ReusableBlocksMenuItems( { rootClientId } ) {\n\tconst clientIds = useSelect(\n\t\t( select ) => select( blockEditorStore ).getSelectedBlockClientIds(),\n\t\t[]\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<ReusableBlockConvertButton\n\t\t\t\tclientIds={ clientIds }\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t/>\n\t\t\t{ clientIds.length === 1 && (\n\t\t\t\t<ReusableBlocksManageButton clientId={ clientIds[ 0 ] } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
|
|
@@ -4,12 +4,12 @@ import { createElement, Fragment } from "@wordpress/element";
|
|
|
4
4
|
* WordPress dependencies
|
|
5
5
|
*/
|
|
6
6
|
import { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';
|
|
7
|
-
import { BlockSettingsMenuControls, store as blockEditorStore,
|
|
7
|
+
import { BlockSettingsMenuControls, store as blockEditorStore, privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';
|
|
8
8
|
import { useCallback, useState } from '@wordpress/element';
|
|
9
9
|
import { MenuItem, Modal, Button, TextControl, __experimentalHStack as HStack, __experimentalVStack as VStack, ToggleControl } from '@wordpress/components';
|
|
10
10
|
import { symbol } from '@wordpress/icons';
|
|
11
11
|
import { useDispatch, useSelect } from '@wordpress/data';
|
|
12
|
-
import { __ } from '@wordpress/i18n';
|
|
12
|
+
import { __, sprintf } from '@wordpress/i18n';
|
|
13
13
|
import { store as noticesStore } from '@wordpress/notices';
|
|
14
14
|
import { store as coreStore } from '@wordpress/core-data';
|
|
15
15
|
/**
|
|
@@ -17,6 +17,7 @@ import { store as coreStore } from '@wordpress/core-data';
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { store } from '../../store';
|
|
20
|
+
import { unlock } from '../../lock-unlock';
|
|
20
21
|
/**
|
|
21
22
|
* Menu control to convert block(s) to reusable block.
|
|
22
23
|
*
|
|
@@ -30,7 +31,12 @@ export default function ReusableBlockConvertButton({
|
|
|
30
31
|
clientIds,
|
|
31
32
|
rootClientId
|
|
32
33
|
}) {
|
|
33
|
-
const
|
|
34
|
+
const {
|
|
35
|
+
useReusableBlocksRenameHint,
|
|
36
|
+
ReusableBlocksRenameHint
|
|
37
|
+
} = unlock(blockEditorPrivateApis);
|
|
38
|
+
const showRenameHint = useReusableBlocksRenameHint();
|
|
39
|
+
const [syncType, setSyncType] = useState(undefined);
|
|
34
40
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
35
41
|
const [title, setTitle] = useState('');
|
|
36
42
|
const canConvert = useSelect(select => {
|
|
@@ -41,14 +47,16 @@ export default function ReusableBlockConvertButton({
|
|
|
41
47
|
} = select(coreStore);
|
|
42
48
|
const {
|
|
43
49
|
getBlocksByClientId,
|
|
44
|
-
canInsertBlockType
|
|
50
|
+
canInsertBlockType,
|
|
51
|
+
getBlockRootClientId
|
|
45
52
|
} = select(blockEditorStore);
|
|
53
|
+
const rootId = rootClientId || (clientIds.length > 0 ? getBlockRootClientId(clientIds[0]) : undefined);
|
|
46
54
|
const blocks = (_getBlocksByClientId = getBlocksByClientId(clientIds)) !== null && _getBlocksByClientId !== void 0 ? _getBlocksByClientId : [];
|
|
47
55
|
const isReusable = blocks.length === 1 && blocks[0] && isReusableBlock(blocks[0]) && !!select(coreStore).getEntityRecord('postType', 'wp_block', blocks[0].attributes.ref);
|
|
48
56
|
|
|
49
57
|
const _canConvert = // Hide when this is already a reusable block.
|
|
50
58
|
!isReusable && // Hide when reusable blocks are disabled.
|
|
51
|
-
canInsertBlockType('core/block',
|
|
59
|
+
canInsertBlockType('core/block', rootId) && blocks.every(block => // Guard against the case where a regular block has *just* been converted.
|
|
52
60
|
!!block && // Hide on invalid blocks.
|
|
53
61
|
block.isValid && // Hide when block doesn't support being made reusable.
|
|
54
62
|
hasBlockSupport(block.name, 'reusable', true)) && // Hide when current doesn't have permission to do that.
|
|
@@ -66,12 +74,16 @@ export default function ReusableBlockConvertButton({
|
|
|
66
74
|
const onConvert = useCallback(async function (reusableBlockTitle) {
|
|
67
75
|
try {
|
|
68
76
|
await convertBlocksToReusable(clientIds, reusableBlockTitle, syncType);
|
|
69
|
-
createSuccessNotice(syncType
|
|
70
|
-
|
|
77
|
+
createSuccessNotice(!syncType ? sprintf( // translators: %s: the name the user has given to the pattern.
|
|
78
|
+
__('Synced Pattern created: %s'), reusableBlockTitle) : sprintf( // translators: %s: the name the user has given to the pattern.
|
|
79
|
+
__('Unsynced Pattern created: %s'), reusableBlockTitle), {
|
|
80
|
+
type: 'snackbar',
|
|
81
|
+
id: 'convert-to-reusable-block-success'
|
|
71
82
|
});
|
|
72
83
|
} catch (error) {
|
|
73
84
|
createErrorNotice(error.message, {
|
|
74
|
-
type: 'snackbar'
|
|
85
|
+
type: 'snackbar',
|
|
86
|
+
id: 'convert-to-reusable-block-error'
|
|
75
87
|
});
|
|
76
88
|
}
|
|
77
89
|
}, [convertBlocksToReusable, clientIds, syncType, createSuccessNotice, createErrorNotice]);
|
|
@@ -85,7 +97,7 @@ export default function ReusableBlockConvertButton({
|
|
|
85
97
|
}) => createElement(Fragment, null, createElement(MenuItem, {
|
|
86
98
|
icon: symbol,
|
|
87
99
|
onClick: () => setIsModalOpen(true)
|
|
88
|
-
}, __('Create pattern/reusable block')), isModalOpen && createElement(Modal, {
|
|
100
|
+
}, showRenameHint ? __('Create pattern/reusable block') : __('Create pattern')), isModalOpen && createElement(Modal, {
|
|
89
101
|
title: __('Create pattern'),
|
|
90
102
|
onRequestClose: () => {
|
|
91
103
|
setIsModalOpen(false);
|
|
@@ -111,9 +123,9 @@ export default function ReusableBlockConvertButton({
|
|
|
111
123
|
}), createElement(ToggleControl, {
|
|
112
124
|
label: __('Synced'),
|
|
113
125
|
help: __('Editing the pattern will update it anywhere it is used.'),
|
|
114
|
-
checked: syncType
|
|
126
|
+
checked: !syncType,
|
|
115
127
|
onChange: () => {
|
|
116
|
-
setSyncType(syncType
|
|
128
|
+
setSyncType(!syncType ? 'unsynced' : undefined);
|
|
117
129
|
}
|
|
118
130
|
}), createElement(HStack, {
|
|
119
131
|
justify: "right"
|
package/build-module/components/reusable-blocks-menu-items/reusable-block-convert-button.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-block-convert-button.js"],"names":["hasBlockSupport","isReusableBlock","BlockSettingsMenuControls","store","blockEditorStore","ReusableBlocksRenameHint","useCallback","useState","MenuItem","Modal","Button","TextControl","__experimentalHStack","HStack","__experimentalVStack","VStack","ToggleControl","symbol","useDispatch","useSelect","__","noticesStore","coreStore","ReusableBlockConvertButton","clientIds","rootClientId","syncType","setSyncType","isModalOpen","setIsModalOpen","title","setTitle","canConvert","select","canUser","getBlocksByClientId","canInsertBlockType","blocks","isReusable","length","getEntityRecord","attributes","ref","_canConvert","every","block","isValid","name","__experimentalConvertBlocksToReusable","convertBlocksToReusable","createSuccessNotice","createErrorNotice","onConvert","reusableBlockTitle","type","error","message","onClose","event","preventDefault"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,eAAT,EAA0BC,eAA1B,QAAiD,mBAAjD;AACA,SACCC,yBADD,EAECC,KAAK,IAAIC,gBAFV,EAGCC,wBAHD,QAIO,yBAJP;AAKA,SAASC,WAAT,EAAsBC,QAAtB,QAAsC,oBAAtC;AACA,SACCC,QADD,EAECC,KAFD,EAGCC,MAHD,EAICC,WAJD,EAKCC,oBAAoB,IAAIC,MALzB,EAMCC,oBAAoB,IAAIC,MANzB,EAOCC,aAPD,QAQO,uBARP;AASA,SAASC,MAAT,QAAuB,kBAAvB;AACA,SAASC,WAAT,EAAsBC,SAAtB,QAAuC,iBAAvC;AACA,SAASC,EAAT,QAAmB,iBAAnB;AACA,SAASjB,KAAK,IAAIkB,YAAlB,QAAsC,oBAAtC;AACA,SAASlB,KAAK,IAAImB,SAAlB,QAAmC,sBAAnC;AAEA;AACA;AACA;;AACA,SAASnB,KAAT,QAAsB,aAAtB;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASoB,0BAAT,CAAqC;AACnDC,EAAAA,SADmD;AAEnDC,EAAAA;AAFmD,CAArC,EAGX;AACH,QAAM,CAAEC,QAAF,EAAYC,WAAZ,IAA4BpB,QAAQ,CAAE,UAAF,CAA1C;AACA,QAAM,CAAEqB,WAAF,EAAeC,cAAf,IAAkCtB,QAAQ,CAAE,KAAF,CAAhD;AACA,QAAM,CAAEuB,KAAF,EAASC,QAAT,IAAsBxB,QAAQ,CAAE,EAAF,CAApC;AACA,QAAMyB,UAAU,GAAGb,SAAS,CACzBc,MAAF,IAAc;AAAA;;AACb,UAAM;AAAEC,MAAAA;AAAF,QAAcD,MAAM,CAAEX,SAAF,CAA1B;AACA,UAAM;AAAEa,MAAAA,mBAAF;AAAuBC,MAAAA;AAAvB,QACLH,MAAM,CAAE7B,gBAAF,CADP;AAGA,UAAMiC,MAAM,2BAAGF,mBAAmB,CAAEX,SAAF,CAAtB,uEAAuC,EAAnD;AAEA,UAAMc,UAAU,GACfD,MAAM,CAACE,MAAP,KAAkB,CAAlB,IACAF,MAAM,CAAE,CAAF,CADN,IAEApC,eAAe,CAAEoC,MAAM,CAAE,CAAF,CAAR,CAFf,IAGA,CAAC,CAAEJ,MAAM,CAAEX,SAAF,CAAN,CAAoBkB,eAApB,CACF,UADE,EAEF,UAFE,EAGFH,MAAM,CAAE,CAAF,CAAN,CAAYI,UAAZ,CAAuBC,GAHrB,CAJJ;;AAUA,UAAMC,WAAW,GAChB;AACA,KAAEL,UAAF,IACA;AACAF,IAAAA,kBAAkB,CAAE,YAAF,EAAgBX,YAAhB,CAFlB,IAGAY,MAAM,CAACO,KAAP,CACGC,KAAF,IACC;AACA,KAAC,CAAEA,KAAH,IACA;AACAA,IAAAA,KAAK,CAACC,OAFN,IAGA;AACA9C,IAAAA,eAAe,CAAE6C,KAAK,CAACE,IAAR,EAAc,UAAd,EAA0B,IAA1B,CAPjB,CAHA,IAYA;AACA,KAAC,CAAEb,OAAO,CAAE,QAAF,EAAY,QAAZ,CAfX;;AAiBA,WAAOS,WAAP;AACA,GApC0B,EAqC3B,CAAEnB,SAAF,EAAaC,YAAb,CArC2B,CAA5B;AAwCA,QAAM;AAAEuB,IAAAA,qCAAqC,EAAEC;AAAzC,MACL/B,WAAW,CAAEf,KAAF,CADZ;AAGA,QAAM;AAAE+C,IAAAA,mBAAF;AAAuBC,IAAAA;AAAvB,MACLjC,WAAW,CAAEG,YAAF,CADZ;AAEA,QAAM+B,SAAS,GAAG9C,WAAW,CAC5B,gBAAiB+C,kBAAjB,EAAsC;AACrC,QAAI;AACH,YAAMJ,uBAAuB,CAC5BzB,SAD4B,EAE5B6B,kBAF4B,EAG5B3B,QAH4B,CAA7B;AAKAwB,MAAAA,mBAAmB,CAClBxB,QAAQ,KAAK,OAAb,GACGN,EAAE,CAAE,yBAAF,CADL,GAEGA,EAAE,CAAE,2BAAF,CAHa,EAIlB;AACCkC,QAAAA,IAAI,EAAE;AADP,OAJkB,CAAnB;AAQA,KAdD,CAcE,OAAQC,KAAR,EAAgB;AACjBJ,MAAAA,iBAAiB,CAAEI,KAAK,CAACC,OAAR,EAAiB;AACjCF,QAAAA,IAAI,EAAE;AAD2B,OAAjB,CAAjB;AAGA;AACD,GArB2B,EAsB5B,CACCL,uBADD,EAECzB,SAFD,EAGCE,QAHD,EAICwB,mBAJD,EAKCC,iBALD,CAtB4B,CAA7B;;AA+BA,MAAK,CAAEnB,UAAP,EAAoB;AACnB,WAAO,IAAP;AACA;;AAED,SACC,cAAC,yBAAD,QACG,CAAE;AAAEyB,IAAAA;AAAF,GAAF,KACD,8BACC,cAAC,QAAD;AACC,IAAA,IAAI,EAAGxC,MADR;AAEC,IAAA,OAAO,EAAG,MAAMY,cAAc,CAAE,IAAF;AAF/B,KAIGT,EAAE,CAAE,+BAAF,CAJL,CADD,EAOGQ,WAAW,IACZ,cAAC,KAAD;AACC,IAAA,KAAK,EAAGR,EAAE,CAAE,gBAAF,CADX;AAEC,IAAA,cAAc,EAAG,MAAM;AACtBS,MAAAA,cAAc,CAAE,KAAF,CAAd;AACAE,MAAAA,QAAQ,CAAE,EAAF,CAAR;AACA,KALF;AAMC,IAAA,gBAAgB,EAAC;AANlB,KAQC;AACC,IAAA,QAAQ,EAAK2B,KAAF,IAAa;AACvBA,MAAAA,KAAK,CAACC,cAAN;AACAP,MAAAA,SAAS,CAAEtB,KAAF,CAAT;AACAD,MAAAA,cAAc,CAAE,KAAF,CAAd;AACAE,MAAAA,QAAQ,CAAE,EAAF,CAAR;AACA0B,MAAAA,OAAO;AACP;AAPF,KASC,cAAC,MAAD;AAAQ,IAAA,OAAO,EAAC;AAAhB,KACC,cAAC,wBAAD,OADD,EAEC,cAAC,WAAD;AACC,IAAA,uBAAuB,MADxB;AAEC,IAAA,KAAK,EAAGrC,EAAE,CAAE,MAAF,CAFX;AAGC,IAAA,KAAK,EAAGU,KAHT;AAIC,IAAA,QAAQ,EAAGC,QAJZ;AAKC,IAAA,WAAW,EAAGX,EAAE,CAAE,YAAF;AALjB,IAFD,EAUC,cAAC,aAAD;AACC,IAAA,KAAK,EAAGA,EAAE,CAAE,QAAF,CADX;AAEC,IAAA,IAAI,EAAGA,EAAE,CACR,yDADQ,CAFV;AAKC,IAAA,OAAO,EAAGM,QAAQ,KAAK,OALxB;AAMC,IAAA,QAAQ,EAAG,MAAM;AAChBC,MAAAA,WAAW,CACVD,QAAQ,KAAK,OAAb,GACG,UADH,GAEG,OAHO,CAAX;AAKA;AAZF,IAVD,EAwBC,cAAC,MAAD;AAAQ,IAAA,OAAO,EAAC;AAAhB,KACC,cAAC,MAAD;AACC,IAAA,OAAO,EAAC,UADT;AAEC,IAAA,OAAO,EAAG,MAAM;AACfG,MAAAA,cAAc,CAAE,KAAF,CAAd;AACAE,MAAAA,QAAQ,CAAE,EAAF,CAAR;AACA;AALF,KAOGX,EAAE,CAAE,QAAF,CAPL,CADD,EAWC,cAAC,MAAD;AAAQ,IAAA,OAAO,EAAC,SAAhB;AAA0B,IAAA,IAAI,EAAC;AAA/B,KACGA,EAAE,CAAE,QAAF,CADL,CAXD,CAxBD,CATD,CARD,CARF,CAFF,CADD;AA2EA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';\nimport {\n\tBlockSettingsMenuControls,\n\tstore as blockEditorStore,\n\tReusableBlocksRenameHint,\n} from '@wordpress/block-editor';\nimport { useCallback, useState } from '@wordpress/element';\nimport {\n\tMenuItem,\n\tModal,\n\tButton,\n\tTextControl,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tToggleControl,\n} from '@wordpress/components';\nimport { symbol } from '@wordpress/icons';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store } from '../../store';\n\n/**\n * Menu control to convert block(s) to reusable 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 * @return {import('@wordpress/element').WPComponent} The menu control or null.\n */\nexport default function ReusableBlockConvertButton( {\n\tclientIds,\n\trootClientId,\n} ) {\n\tconst [ syncType, setSyncType ] = useState( 'unsynced' );\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst [ title, setTitle ] = useState( '' );\n\tconst canConvert = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst { getBlocksByClientId, canInsertBlockType } =\n\t\t\t\tselect( blockEditorStore );\n\n\t\t\tconst blocks = getBlocksByClientId( clientIds ) ?? [];\n\n\t\t\tconst isReusable =\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 _canConvert =\n\t\t\t\t// Hide when this is already a reusable block.\n\t\t\t\t! isReusable &&\n\t\t\t\t// Hide when reusable blocks are disabled.\n\t\t\t\tcanInsertBlockType( 'core/block', rootClientId ) &&\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 reusable.\n\t\t\t\t\t\thasBlockSupport( block.name, 'reusable', true )\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!! canUser( 'create', 'blocks' );\n\n\t\t\treturn _canConvert;\n\t\t},\n\t\t[ clientIds, rootClientId ]\n\t);\n\n\tconst { __experimentalConvertBlocksToReusable: convertBlocksToReusable } =\n\t\tuseDispatch( store );\n\n\tconst { createSuccessNotice, createErrorNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst onConvert = useCallback(\n\t\tasync function ( reusableBlockTitle ) {\n\t\t\ttry {\n\t\t\t\tawait convertBlocksToReusable(\n\t\t\t\t\tclientIds,\n\t\t\t\t\treusableBlockTitle,\n\t\t\t\t\tsyncType\n\t\t\t\t);\n\t\t\t\tcreateSuccessNotice(\n\t\t\t\t\tsyncType === 'fully'\n\t\t\t\t\t\t? __( 'Synced Pattern created.' )\n\t\t\t\t\t\t: __( 'Unsynced Pattern created.' ),\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} catch ( error ) {\n\t\t\t\tcreateErrorNotice( error.message, {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tconvertBlocksToReusable,\n\t\t\tclientIds,\n\t\t\tsyncType,\n\t\t\tcreateSuccessNotice,\n\t\t\tcreateErrorNotice,\n\t\t]\n\t);\n\n\tif ( ! canConvert ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t{ ( { onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<MenuItem\n\t\t\t\t\t\ticon={ symbol }\n\t\t\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Create pattern/reusable block' ) }\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t{ isModalOpen && (\n\t\t\t\t\t\t<Modal\n\t\t\t\t\t\t\ttitle={ __( 'Create pattern' ) }\n\t\t\t\t\t\t\tonRequestClose={ () => {\n\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\toverlayClassName=\"reusable-blocks-menu-items__convert-modal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tonConvert( title );\n\t\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<VStack spacing=\"5\">\n\t\t\t\t\t\t\t\t\t<ReusableBlocksRenameHint />\n\t\t\t\t\t\t\t\t\t<TextControl\n\t\t\t\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Name' ) }\n\t\t\t\t\t\t\t\t\t\tvalue={ title }\n\t\t\t\t\t\t\t\t\t\tonChange={ setTitle }\n\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'My pattern' ) }\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Synced' ) }\n\t\t\t\t\t\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t\t\t\t\t\t'Editing the pattern will update it anywhere it is used.'\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\tchecked={ syncType === 'fully' }\n\t\t\t\t\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\t\t\t\t\tsetSyncType(\n\t\t\t\t\t\t\t\t\t\t\t\tsyncType === 'fully'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'unsynced'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'fully'\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t\t\t\t<Button variant=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Create' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</VStack>\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t</Modal>\n\t\t\t\t\t) }\n\t\t\t\t</>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-block-convert-button.js"],"names":["hasBlockSupport","isReusableBlock","BlockSettingsMenuControls","store","blockEditorStore","privateApis","blockEditorPrivateApis","useCallback","useState","MenuItem","Modal","Button","TextControl","__experimentalHStack","HStack","__experimentalVStack","VStack","ToggleControl","symbol","useDispatch","useSelect","__","sprintf","noticesStore","coreStore","unlock","ReusableBlockConvertButton","clientIds","rootClientId","useReusableBlocksRenameHint","ReusableBlocksRenameHint","showRenameHint","syncType","setSyncType","undefined","isModalOpen","setIsModalOpen","title","setTitle","canConvert","select","canUser","getBlocksByClientId","canInsertBlockType","getBlockRootClientId","rootId","length","blocks","isReusable","getEntityRecord","attributes","ref","_canConvert","every","block","isValid","name","__experimentalConvertBlocksToReusable","convertBlocksToReusable","createSuccessNotice","createErrorNotice","onConvert","reusableBlockTitle","type","id","error","message","onClose","event","preventDefault"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';\nimport {\n\tBlockSettingsMenuControls,\n\tstore as blockEditorStore,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\nimport { useCallback, useState } from '@wordpress/element';\nimport {\n\tMenuItem,\n\tModal,\n\tButton,\n\tTextControl,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tToggleControl,\n} from '@wordpress/components';\nimport { symbol } from '@wordpress/icons';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { store } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\n/**\n * Menu control to convert block(s) to reusable 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 * @return {import('@wordpress/element').WPComponent} The menu control or null.\n */\nexport default function ReusableBlockConvertButton( {\n\tclientIds,\n\trootClientId,\n} ) {\n\tconst { useReusableBlocksRenameHint, ReusableBlocksRenameHint } = unlock(\n\t\tblockEditorPrivateApis\n\t);\n\tconst showRenameHint = useReusableBlocksRenameHint();\n\tconst [ syncType, setSyncType ] = useState( undefined );\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst [ title, setTitle ] = useState( '' );\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\tconst isReusable =\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 _canConvert =\n\t\t\t\t// Hide when this is already a reusable block.\n\t\t\t\t! isReusable &&\n\t\t\t\t// Hide when reusable blocks 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 reusable.\n\t\t\t\t\t\thasBlockSupport( block.name, 'reusable', true )\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!! canUser( 'create', 'blocks' );\n\n\t\t\treturn _canConvert;\n\t\t},\n\t\t[ clientIds, rootClientId ]\n\t);\n\n\tconst { __experimentalConvertBlocksToReusable: convertBlocksToReusable } =\n\t\tuseDispatch( store );\n\n\tconst { createSuccessNotice, createErrorNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst onConvert = useCallback(\n\t\tasync function ( reusableBlockTitle ) {\n\t\t\ttry {\n\t\t\t\tawait convertBlocksToReusable(\n\t\t\t\t\tclientIds,\n\t\t\t\t\treusableBlockTitle,\n\t\t\t\t\tsyncType\n\t\t\t\t);\n\t\t\t\tcreateSuccessNotice(\n\t\t\t\t\t! syncType\n\t\t\t\t\t\t? sprintf(\n\t\t\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t\t\t__( 'Synced Pattern created: %s' ),\n\t\t\t\t\t\t\t\treusableBlockTitle\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: sprintf(\n\t\t\t\t\t\t\t\t// translators: %s: the name the user has given to the pattern.\n\t\t\t\t\t\t\t\t__( 'Unsynced Pattern created: %s' ),\n\t\t\t\t\t\t\t\treusableBlockTitle\n\t\t\t\t\t\t ),\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\t\tid: 'convert-to-reusable-block-success',\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} catch ( error ) {\n\t\t\t\tcreateErrorNotice( error.message, {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\tid: 'convert-to-reusable-block-error',\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tconvertBlocksToReusable,\n\t\t\tclientIds,\n\t\t\tsyncType,\n\t\t\tcreateSuccessNotice,\n\t\t\tcreateErrorNotice,\n\t\t]\n\t);\n\n\tif ( ! canConvert ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t{ ( { onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<MenuItem\n\t\t\t\t\t\ticon={ symbol }\n\t\t\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ showRenameHint\n\t\t\t\t\t\t\t? __( 'Create pattern/reusable block' )\n\t\t\t\t\t\t\t: __( 'Create pattern' ) }\n\t\t\t\t\t</MenuItem>\n\t\t\t\t\t{ isModalOpen && (\n\t\t\t\t\t\t<Modal\n\t\t\t\t\t\t\ttitle={ __( 'Create pattern' ) }\n\t\t\t\t\t\t\tonRequestClose={ () => {\n\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\toverlayClassName=\"reusable-blocks-menu-items__convert-modal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tonConvert( title );\n\t\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<VStack spacing=\"5\">\n\t\t\t\t\t\t\t\t\t<ReusableBlocksRenameHint />\n\t\t\t\t\t\t\t\t\t<TextControl\n\t\t\t\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Name' ) }\n\t\t\t\t\t\t\t\t\t\tvalue={ title }\n\t\t\t\t\t\t\t\t\t\tonChange={ setTitle }\n\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'My pattern' ) }\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Synced' ) }\n\t\t\t\t\t\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t\t\t\t\t\t'Editing the pattern will update it anywhere it is used.'\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\tchecked={ ! syncType }\n\t\t\t\t\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\t\t\t\t\tsetSyncType(\n\t\t\t\t\t\t\t\t\t\t\t\t! syncType\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'unsynced'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetIsModalOpen( false );\n\t\t\t\t\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t\t\t\t<Button variant=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Create' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</VStack>\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t</Modal>\n\t\t\t\t\t) }\n\t\t\t\t</>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n"]}
|
|
@@ -22,21 +22,34 @@ function ReusableBlocksManageButton({
|
|
|
22
22
|
const {
|
|
23
23
|
canRemove,
|
|
24
24
|
isVisible,
|
|
25
|
-
innerBlockCount
|
|
25
|
+
innerBlockCount,
|
|
26
|
+
managePatternsUrl
|
|
26
27
|
} = useSelect(select => {
|
|
27
28
|
const {
|
|
28
29
|
getBlock,
|
|
29
30
|
canRemoveBlock,
|
|
30
|
-
getBlockCount
|
|
31
|
+
getBlockCount,
|
|
32
|
+
getSettings
|
|
31
33
|
} = select(blockEditorStore);
|
|
32
34
|
const {
|
|
33
35
|
canUser
|
|
34
36
|
} = select(coreStore);
|
|
35
37
|
const reusableBlock = getBlock(clientId);
|
|
38
|
+
|
|
39
|
+
const isBlockTheme = getSettings().__unstableIsBlockBasedTheme;
|
|
40
|
+
|
|
36
41
|
return {
|
|
37
42
|
canRemove: canRemoveBlock(clientId),
|
|
38
43
|
isVisible: !!reusableBlock && isReusableBlock(reusableBlock) && !!canUser('update', 'blocks', reusableBlock.attributes.ref),
|
|
39
|
-
innerBlockCount: getBlockCount(clientId)
|
|
44
|
+
innerBlockCount: getBlockCount(clientId),
|
|
45
|
+
// The site editor and templates both check whether the user
|
|
46
|
+
// has edit_theme_options capabilities. We can leverage that here
|
|
47
|
+
// and omit the manage patterns link if the user can't access it.
|
|
48
|
+
managePatternsUrl: isBlockTheme && canUser('read', 'templates') ? addQueryArgs('site-editor.php', {
|
|
49
|
+
path: '/patterns'
|
|
50
|
+
}) : addQueryArgs('edit.php', {
|
|
51
|
+
post_type: 'wp_block'
|
|
52
|
+
})
|
|
40
53
|
};
|
|
41
54
|
}, [clientId]);
|
|
42
55
|
const {
|
|
@@ -48,10 +61,8 @@ function ReusableBlocksManageButton({
|
|
|
48
61
|
}
|
|
49
62
|
|
|
50
63
|
return createElement(BlockSettingsMenuControls, null, createElement(MenuItem, {
|
|
51
|
-
href:
|
|
52
|
-
|
|
53
|
-
})
|
|
54
|
-
}, __('Manage Patterns')), canRemove && createElement(MenuItem, {
|
|
64
|
+
href: managePatternsUrl
|
|
65
|
+
}, __('Manage patterns')), canRemove && createElement(MenuItem, {
|
|
55
66
|
onClick: () => convertBlockToStatic(clientId)
|
|
56
67
|
}, innerBlockCount > 1 ? __('Detach patterns') : __('Detach pattern')));
|
|
57
68
|
}
|
package/build-module/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js"],"names":["MenuItem","__","isReusableBlock","useSelect","useDispatch","BlockSettingsMenuControls","store","blockEditorStore","addQueryArgs","coreStore","reusableBlocksStore","ReusableBlocksManageButton","clientId","canRemove","isVisible","innerBlockCount","select","getBlock","canRemoveBlock","getBlockCount","canUser","reusableBlock","attributes","ref","
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js"],"names":["MenuItem","__","isReusableBlock","useSelect","useDispatch","BlockSettingsMenuControls","store","blockEditorStore","addQueryArgs","coreStore","reusableBlocksStore","ReusableBlocksManageButton","clientId","canRemove","isVisible","innerBlockCount","managePatternsUrl","select","getBlock","canRemoveBlock","getBlockCount","getSettings","canUser","reusableBlock","isBlockTheme","__unstableIsBlockBasedTheme","attributes","ref","path","post_type","__experimentalConvertBlockToStatic","convertBlockToStatic"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,QAAT,QAAyB,uBAAzB;AACA,SAASC,EAAT,QAAmB,iBAAnB;AACA,SAASC,eAAT,QAAgC,mBAAhC;AACA,SAASC,SAAT,EAAoBC,WAApB,QAAuC,iBAAvC;AACA,SACCC,yBADD,EAECC,KAAK,IAAIC,gBAFV,QAGO,yBAHP;AAIA,SAASC,YAAT,QAA6B,gBAA7B;AACA,SAASF,KAAK,IAAIG,SAAlB,QAAmC,sBAAnC;AAEA;AACA;AACA;;AACA,SAASH,KAAK,IAAII,mBAAlB,QAA6C,aAA7C;;AAEA,SAASC,0BAAT,CAAqC;AAAEC,EAAAA;AAAF,CAArC,EAAoD;AACnD,QAAM;AAAEC,IAAAA,SAAF;AAAaC,IAAAA,SAAb;AAAwBC,IAAAA,eAAxB;AAAyCC,IAAAA;AAAzC,MACLb,SAAS,CACNc,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,QAAF;AAAYC,MAAAA,cAAZ;AAA4BC,MAAAA,aAA5B;AAA2CC,MAAAA;AAA3C,QACLJ,MAAM,CAAEV,gBAAF,CADP;AAEA,UAAM;AAAEe,MAAAA;AAAF,QAAcL,MAAM,CAAER,SAAF,CAA1B;AACA,UAAMc,aAAa,GAAGL,QAAQ,CAAEN,QAAF,CAA9B;;AACA,UAAMY,YAAY,GAAGH,WAAW,GAAGI,2BAAnC;;AAEA,WAAO;AACNZ,MAAAA,SAAS,EAAEM,cAAc,CAAEP,QAAF,CADnB;AAENE,MAAAA,SAAS,EACR,CAAC,CAAES,aAAH,IACArB,eAAe,CAAEqB,aAAF,CADf,IAEA,CAAC,CAAED,OAAO,CACT,QADS,EAET,QAFS,EAGTC,aAAa,CAACG,UAAd,CAAyBC,GAHhB,CALL;AAUNZ,MAAAA,eAAe,EAAEK,aAAa,CAAER,QAAF,CAVxB;AAWN;AACA;AACA;AACAI,MAAAA,iBAAiB,EAChBQ,YAAY,IAAIF,OAAO,CAAE,MAAF,EAAU,WAAV,CAAvB,GACGd,YAAY,CAAE,iBAAF,EAAqB;AACjCoB,QAAAA,IAAI,EAAE;AAD2B,OAArB,CADf,GAIGpB,YAAY,CAAE,UAAF,EAAc;AAC1BqB,QAAAA,SAAS,EAAE;AADe,OAAd;AAnBV,KAAP;AAuBA,GA/BO,EAgCR,CAAEjB,QAAF,CAhCQ,CADV;AAoCA,QAAM;AAAEkB,IAAAA,kCAAkC,EAAEC;AAAtC,MACL3B,WAAW,CAAEM,mBAAF,CADZ;;AAGA,MAAK,CAAEI,SAAP,EAAmB;AAClB,WAAO,IAAP;AACA;;AAED,SACC,cAAC,yBAAD,QACC,cAAC,QAAD;AAAU,IAAA,IAAI,EAAGE;AAAjB,KACGf,EAAE,CAAE,iBAAF,CADL,CADD,EAIGY,SAAS,IACV,cAAC,QAAD;AAAU,IAAA,OAAO,EAAG,MAAMkB,oBAAoB,CAAEnB,QAAF;AAA9C,KACGG,eAAe,GAAG,CAAlB,GACCd,EAAE,CAAE,iBAAF,CADH,GAECA,EAAE,CAAE,gBAAF,CAHN,CALF,CADD;AAcA;;AAED,eAAeU,0BAAf","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 {\n\tBlockSettingsMenuControls,\n\tstore as blockEditorStore,\n} 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 reusableBlocksStore } from '../../store';\n\nfunction ReusableBlocksManageButton( { clientId } ) {\n\tconst { canRemove, isVisible, innerBlockCount, managePatternsUrl } =\n\t\tuseSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst { getBlock, canRemoveBlock, getBlockCount, getSettings } =\n\t\t\t\t\tselect( blockEditorStore );\n\t\t\t\tconst { canUser } = select( coreStore );\n\t\t\t\tconst reusableBlock = getBlock( clientId );\n\t\t\t\tconst isBlockTheme = getSettings().__unstableIsBlockBasedTheme;\n\n\t\t\t\treturn {\n\t\t\t\t\tcanRemove: canRemoveBlock( clientId ),\n\t\t\t\t\tisVisible:\n\t\t\t\t\t\t!! reusableBlock &&\n\t\t\t\t\t\tisReusableBlock( reusableBlock ) &&\n\t\t\t\t\t\t!! canUser(\n\t\t\t\t\t\t\t'update',\n\t\t\t\t\t\t\t'blocks',\n\t\t\t\t\t\t\treusableBlock.attributes.ref\n\t\t\t\t\t\t),\n\t\t\t\t\tinnerBlockCount: getBlockCount( clientId ),\n\t\t\t\t\t// The site editor and templates both check whether the user\n\t\t\t\t\t// has edit_theme_options capabilities. We can leverage that here\n\t\t\t\t\t// and omit the manage patterns link if the user can't access it.\n\t\t\t\t\tmanagePatternsUrl:\n\t\t\t\t\t\tisBlockTheme && canUser( 'read', 'templates' )\n\t\t\t\t\t\t\t? addQueryArgs( 'site-editor.php', {\n\t\t\t\t\t\t\t\t\tpath: '/patterns',\n\t\t\t\t\t\t\t } )\n\t\t\t\t\t\t\t: addQueryArgs( 'edit.php', {\n\t\t\t\t\t\t\t\t\tpost_type: 'wp_block',\n\t\t\t\t\t\t\t } ),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\n\tconst { __experimentalConvertBlockToStatic: convertBlockToStatic } =\n\t\tuseDispatch( reusableBlocksStore );\n\n\tif ( ! isVisible ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<BlockSettingsMenuControls>\n\t\t\t<MenuItem href={ managePatternsUrl }>\n\t\t\t\t{ __( 'Manage patterns' ) }\n\t\t\t</MenuItem>\n\t\t\t{ canRemove && (\n\t\t\t\t<MenuItem onClick={ () => convertBlockToStatic( clientId ) }>\n\t\t\t\t\t{ innerBlockCount > 1\n\t\t\t\t\t\t? __( 'Detach patterns' )\n\t\t\t\t\t\t: __( 'Detach pattern' ) }\n\t\t\t\t</MenuItem>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n\nexport default ReusableBlocksManageButton;\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';
|
|
5
|
+
export const {
|
|
6
|
+
unlock
|
|
7
|
+
} = __dangerousOptInToUnstableAPIsOnlyForCoreModules('I know using unstable features means my plugin or theme will inevitably break on the next WordPress release.', '@wordpress/reusable-blocks');
|
|
8
|
+
//# sourceMappingURL=lock-unlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/lock-unlock.js"],"names":["__dangerousOptInToUnstableAPIsOnlyForCoreModules","unlock"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,gDAAT,QAAiE,yBAAjE;AAEA,OAAO,MAAM;AAAEC,EAAAA;AAAF,IAAaD,gDAAgD,CACzE,8GADyE,EAEzE,4BAFyE,CAAnE","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';\n\nexport const { unlock } = __dangerousOptInToUnstableAPIsOnlyForCoreModules(\n\t'I know using unstable features means my plugin or theme will inevitably break on the next WordPress release.',\n\t'@wordpress/reusable-blocks'\n);\n"]}
|
|
@@ -21,9 +21,9 @@ export const __experimentalConvertBlockToStatic = clientId => ({
|
|
|
21
21
|
/**
|
|
22
22
|
* Returns a generator converting one or more static blocks into a pattern.
|
|
23
23
|
*
|
|
24
|
-
* @param {string[]}
|
|
25
|
-
* @param {string}
|
|
26
|
-
* @param {
|
|
24
|
+
* @param {string[]} clientIds The client IDs of the block to detach.
|
|
25
|
+
* @param {string} title Pattern title.
|
|
26
|
+
* @param {undefined|'unsynced'} syncType They way block is synced, current undefined (synced) and 'unsynced'.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
export const __experimentalConvertBlocksToReusable = (clientIds, title, syncType) => async ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/store/actions.js"],"names":["store","blockEditorStore","createBlock","isReusableBlock","parse","serialize","__","__experimentalConvertBlockToStatic","clientId","registry","oldBlock","select","getBlock","reusableBlock","getEditedEntityRecord","attributes","ref","newBlocks","content","dispatch","replaceBlocks","__experimentalConvertBlocksToReusable","clientIds","title","syncType","meta","wp_pattern_sync_status","undefined","getBlocksByClientId","status","updatedRecord","saveEntityRecord","newBlock","id","__experimentalSetEditingReusableBlock","__experimentalDeleteReusableBlock","allBlocks","getBlocks","associatedBlocks","filter","block","associatedBlockClientIds","map","length","removeBlocks","deleteEntityRecord","isEditing","type"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport {\n\tcreateBlock,\n\tisReusableBlock,\n\tparse,\n\tserialize,\n} from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Returns a generator converting a reusable block into a static block.\n *\n * @param {string} clientId The client ID of the block to attach.\n */\nexport const __experimentalConvertBlockToStatic =\n\t( clientId ) =>\n\t( { registry } ) => {\n\t\tconst oldBlock = registry\n\t\t\t.select( blockEditorStore )\n\t\t\t.getBlock( clientId );\n\t\tconst reusableBlock = registry\n\t\t\t.select( 'core' )\n\t\t\t.getEditedEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_block',\n\t\t\t\toldBlock.attributes.ref\n\t\t\t);\n\n\t\tconst newBlocks = parse(\n\t\t\ttypeof reusableBlock.content === 'function'\n\t\t\t\t? reusableBlock.content( reusableBlock )\n\t\t\t\t: reusableBlock.content\n\t\t);\n\t\tregistry\n\t\t\t.dispatch( blockEditorStore )\n\t\t\t.replaceBlocks( oldBlock.clientId, newBlocks );\n\t};\n\n/**\n * Returns a generator converting one or more static blocks into a pattern.\n *\n * @param {string[]}
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/store/actions.js"],"names":["store","blockEditorStore","createBlock","isReusableBlock","parse","serialize","__","__experimentalConvertBlockToStatic","clientId","registry","oldBlock","select","getBlock","reusableBlock","getEditedEntityRecord","attributes","ref","newBlocks","content","dispatch","replaceBlocks","__experimentalConvertBlocksToReusable","clientIds","title","syncType","meta","wp_pattern_sync_status","undefined","getBlocksByClientId","status","updatedRecord","saveEntityRecord","newBlock","id","__experimentalSetEditingReusableBlock","__experimentalDeleteReusableBlock","allBlocks","getBlocks","associatedBlocks","filter","block","associatedBlockClientIds","map","length","removeBlocks","deleteEntityRecord","isEditing","type"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport {\n\tcreateBlock,\n\tisReusableBlock,\n\tparse,\n\tserialize,\n} from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Returns a generator converting a reusable block into a static block.\n *\n * @param {string} clientId The client ID of the block to attach.\n */\nexport const __experimentalConvertBlockToStatic =\n\t( clientId ) =>\n\t( { registry } ) => {\n\t\tconst oldBlock = registry\n\t\t\t.select( blockEditorStore )\n\t\t\t.getBlock( clientId );\n\t\tconst reusableBlock = registry\n\t\t\t.select( 'core' )\n\t\t\t.getEditedEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_block',\n\t\t\t\toldBlock.attributes.ref\n\t\t\t);\n\n\t\tconst newBlocks = parse(\n\t\t\ttypeof reusableBlock.content === 'function'\n\t\t\t\t? reusableBlock.content( reusableBlock )\n\t\t\t\t: reusableBlock.content\n\t\t);\n\t\tregistry\n\t\t\t.dispatch( blockEditorStore )\n\t\t\t.replaceBlocks( oldBlock.clientId, newBlocks );\n\t};\n\n/**\n * Returns a generator converting one or more static blocks into a pattern.\n *\n * @param {string[]} clientIds The client IDs of the block to detach.\n * @param {string} title Pattern title.\n * @param {undefined|'unsynced'} syncType They way block is synced, current undefined (synced) and 'unsynced'.\n */\nexport const __experimentalConvertBlocksToReusable =\n\t( clientIds, title, syncType ) =>\n\tasync ( { registry, dispatch } ) => {\n\t\tconst meta =\n\t\t\tsyncType === 'unsynced'\n\t\t\t\t? {\n\t\t\t\t\t\twp_pattern_sync_status: syncType,\n\t\t\t\t }\n\t\t\t\t: undefined;\n\n\t\tconst reusableBlock = {\n\t\t\ttitle: title || __( 'Untitled Pattern block' ),\n\t\t\tcontent: serialize(\n\t\t\t\tregistry\n\t\t\t\t\t.select( blockEditorStore )\n\t\t\t\t\t.getBlocksByClientId( clientIds )\n\t\t\t),\n\t\t\tstatus: 'publish',\n\t\t\tmeta,\n\t\t};\n\n\t\tconst updatedRecord = await registry\n\t\t\t.dispatch( 'core' )\n\t\t\t.saveEntityRecord( 'postType', 'wp_block', reusableBlock );\n\n\t\tif ( syncType === 'unsynced' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newBlock = createBlock( 'core/block', {\n\t\t\tref: updatedRecord.id,\n\t\t} );\n\t\tregistry\n\t\t\t.dispatch( blockEditorStore )\n\t\t\t.replaceBlocks( clientIds, newBlock );\n\t\tdispatch.__experimentalSetEditingReusableBlock(\n\t\t\tnewBlock.clientId,\n\t\t\ttrue\n\t\t);\n\t};\n\n/**\n * Returns a generator deleting a reusable block.\n *\n * @param {string} id The ID of the reusable block to delete.\n */\nexport const __experimentalDeleteReusableBlock =\n\t( id ) =>\n\tasync ( { registry } ) => {\n\t\tconst reusableBlock = registry\n\t\t\t.select( 'core' )\n\t\t\t.getEditedEntityRecord( 'postType', 'wp_block', id );\n\n\t\t// Don't allow a reusable block with a temporary ID to be deleted.\n\t\tif ( ! reusableBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove any other blocks that reference this reusable block.\n\t\tconst allBlocks = registry.select( blockEditorStore ).getBlocks();\n\t\tconst associatedBlocks = allBlocks.filter(\n\t\t\t( block ) => isReusableBlock( block ) && block.attributes.ref === id\n\t\t);\n\t\tconst associatedBlockClientIds = associatedBlocks.map(\n\t\t\t( block ) => block.clientId\n\t\t);\n\n\t\t// Remove the parsed block.\n\t\tif ( associatedBlockClientIds.length ) {\n\t\t\tregistry\n\t\t\t\t.dispatch( blockEditorStore )\n\t\t\t\t.removeBlocks( associatedBlockClientIds );\n\t\t}\n\n\t\tawait registry\n\t\t\t.dispatch( 'core' )\n\t\t\t.deleteEntityRecord( 'postType', 'wp_block', id );\n\t};\n\n/**\n * Returns an action descriptor for SET_EDITING_REUSABLE_BLOCK action.\n *\n * @param {string} clientId The clientID of the reusable block to target.\n * @param {boolean} isEditing Whether the block should be in editing state.\n * @return {Object} Action descriptor.\n */\nexport function __experimentalSetEditingReusableBlock( clientId, isEditing ) {\n\treturn {\n\t\ttype: 'SET_EDITING_REUSABLE_BLOCK',\n\t\tclientId,\n\t\tisEditing,\n\t};\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wordpress/reusable-blocks",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.15.0",
|
|
4
4
|
"description": "Reusable blocks utilities.",
|
|
5
5
|
"author": "The WordPress Contributors",
|
|
6
6
|
"license": "GPL-2.0-or-later",
|
|
@@ -28,16 +28,17 @@
|
|
|
28
28
|
"{src,build,build-module}/{index.js,store/index.js}"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@wordpress/block-editor": "^12.
|
|
32
|
-
"@wordpress/blocks": "^12.
|
|
33
|
-
"@wordpress/components": "^25.
|
|
34
|
-
"@wordpress/core-data": "^6.
|
|
35
|
-
"@wordpress/data": "^9.
|
|
36
|
-
"@wordpress/element": "^5.
|
|
37
|
-
"@wordpress/i18n": "^4.
|
|
38
|
-
"@wordpress/icons": "^9.
|
|
39
|
-
"@wordpress/notices": "^4.
|
|
40
|
-
"@wordpress/
|
|
31
|
+
"@wordpress/block-editor": "^12.6.0",
|
|
32
|
+
"@wordpress/blocks": "^12.15.0",
|
|
33
|
+
"@wordpress/components": "^25.4.0",
|
|
34
|
+
"@wordpress/core-data": "^6.15.0",
|
|
35
|
+
"@wordpress/data": "^9.8.0",
|
|
36
|
+
"@wordpress/element": "^5.15.0",
|
|
37
|
+
"@wordpress/i18n": "^4.38.0",
|
|
38
|
+
"@wordpress/icons": "^9.29.0",
|
|
39
|
+
"@wordpress/notices": "^4.6.0",
|
|
40
|
+
"@wordpress/private-apis": "^0.20.0",
|
|
41
|
+
"@wordpress/url": "^3.39.0"
|
|
41
42
|
},
|
|
42
43
|
"peerDependencies": {
|
|
43
44
|
"react": "^18.0.0",
|
|
@@ -46,5 +47,5 @@
|
|
|
46
47
|
"publishConfig": {
|
|
47
48
|
"access": "public"
|
|
48
49
|
},
|
|
49
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "6f14d11ed4cb59df110a28ebaa23ecba95eb673a"
|
|
50
51
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WordPress dependencies
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { useSelect } from '@wordpress/data';
|
|
5
5
|
import { store as blockEditorStore } from '@wordpress/block-editor';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -10,7 +10,12 @@ import { store as blockEditorStore } from '@wordpress/block-editor';
|
|
|
10
10
|
import ReusableBlockConvertButton from './reusable-block-convert-button';
|
|
11
11
|
import ReusableBlocksManageButton from './reusable-blocks-manage-button';
|
|
12
12
|
|
|
13
|
-
function ReusableBlocksMenuItems( {
|
|
13
|
+
export default function ReusableBlocksMenuItems( { rootClientId } ) {
|
|
14
|
+
const clientIds = useSelect(
|
|
15
|
+
( select ) => select( blockEditorStore ).getSelectedBlockClientIds(),
|
|
16
|
+
[]
|
|
17
|
+
);
|
|
18
|
+
|
|
14
19
|
return (
|
|
15
20
|
<>
|
|
16
21
|
<ReusableBlockConvertButton
|
|
@@ -23,10 +28,3 @@ function ReusableBlocksMenuItems( { clientIds, rootClientId } ) {
|
|
|
23
28
|
</>
|
|
24
29
|
);
|
|
25
30
|
}
|
|
26
|
-
|
|
27
|
-
export default withSelect( ( select ) => {
|
|
28
|
-
const { getSelectedBlockClientIds } = select( blockEditorStore );
|
|
29
|
-
return {
|
|
30
|
-
clientIds: getSelectedBlockClientIds(),
|
|
31
|
-
};
|
|
32
|
-
} )( ReusableBlocksMenuItems );
|
|
@@ -5,7 +5,7 @@ import { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';
|
|
|
5
5
|
import {
|
|
6
6
|
BlockSettingsMenuControls,
|
|
7
7
|
store as blockEditorStore,
|
|
8
|
-
|
|
8
|
+
privateApis as blockEditorPrivateApis,
|
|
9
9
|
} from '@wordpress/block-editor';
|
|
10
10
|
import { useCallback, useState } from '@wordpress/element';
|
|
11
11
|
import {
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
} from '@wordpress/components';
|
|
20
20
|
import { symbol } from '@wordpress/icons';
|
|
21
21
|
import { useDispatch, useSelect } from '@wordpress/data';
|
|
22
|
-
import { __ } from '@wordpress/i18n';
|
|
22
|
+
import { __, sprintf } from '@wordpress/i18n';
|
|
23
23
|
import { store as noticesStore } from '@wordpress/notices';
|
|
24
24
|
import { store as coreStore } from '@wordpress/core-data';
|
|
25
25
|
|
|
@@ -27,6 +27,7 @@ import { store as coreStore } from '@wordpress/core-data';
|
|
|
27
27
|
* Internal dependencies
|
|
28
28
|
*/
|
|
29
29
|
import { store } from '../../store';
|
|
30
|
+
import { unlock } from '../../lock-unlock';
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
33
|
* Menu control to convert block(s) to reusable block.
|
|
@@ -40,14 +41,27 @@ export default function ReusableBlockConvertButton( {
|
|
|
40
41
|
clientIds,
|
|
41
42
|
rootClientId,
|
|
42
43
|
} ) {
|
|
43
|
-
const
|
|
44
|
+
const { useReusableBlocksRenameHint, ReusableBlocksRenameHint } = unlock(
|
|
45
|
+
blockEditorPrivateApis
|
|
46
|
+
);
|
|
47
|
+
const showRenameHint = useReusableBlocksRenameHint();
|
|
48
|
+
const [ syncType, setSyncType ] = useState( undefined );
|
|
44
49
|
const [ isModalOpen, setIsModalOpen ] = useState( false );
|
|
45
50
|
const [ title, setTitle ] = useState( '' );
|
|
46
51
|
const canConvert = useSelect(
|
|
47
52
|
( select ) => {
|
|
48
53
|
const { canUser } = select( coreStore );
|
|
49
|
-
const {
|
|
50
|
-
|
|
54
|
+
const {
|
|
55
|
+
getBlocksByClientId,
|
|
56
|
+
canInsertBlockType,
|
|
57
|
+
getBlockRootClientId,
|
|
58
|
+
} = select( blockEditorStore );
|
|
59
|
+
|
|
60
|
+
const rootId =
|
|
61
|
+
rootClientId ||
|
|
62
|
+
( clientIds.length > 0
|
|
63
|
+
? getBlockRootClientId( clientIds[ 0 ] )
|
|
64
|
+
: undefined );
|
|
51
65
|
|
|
52
66
|
const blocks = getBlocksByClientId( clientIds ) ?? [];
|
|
53
67
|
|
|
@@ -65,7 +79,7 @@ export default function ReusableBlockConvertButton( {
|
|
|
65
79
|
// Hide when this is already a reusable block.
|
|
66
80
|
! isReusable &&
|
|
67
81
|
// Hide when reusable blocks are disabled.
|
|
68
|
-
canInsertBlockType( 'core/block',
|
|
82
|
+
canInsertBlockType( 'core/block', rootId ) &&
|
|
69
83
|
blocks.every(
|
|
70
84
|
( block ) =>
|
|
71
85
|
// Guard against the case where a regular block has *just* been converted.
|
|
@@ -97,16 +111,26 @@ export default function ReusableBlockConvertButton( {
|
|
|
97
111
|
syncType
|
|
98
112
|
);
|
|
99
113
|
createSuccessNotice(
|
|
100
|
-
syncType
|
|
101
|
-
?
|
|
102
|
-
|
|
114
|
+
! syncType
|
|
115
|
+
? sprintf(
|
|
116
|
+
// translators: %s: the name the user has given to the pattern.
|
|
117
|
+
__( 'Synced Pattern created: %s' ),
|
|
118
|
+
reusableBlockTitle
|
|
119
|
+
)
|
|
120
|
+
: sprintf(
|
|
121
|
+
// translators: %s: the name the user has given to the pattern.
|
|
122
|
+
__( 'Unsynced Pattern created: %s' ),
|
|
123
|
+
reusableBlockTitle
|
|
124
|
+
),
|
|
103
125
|
{
|
|
104
126
|
type: 'snackbar',
|
|
127
|
+
id: 'convert-to-reusable-block-success',
|
|
105
128
|
}
|
|
106
129
|
);
|
|
107
130
|
} catch ( error ) {
|
|
108
131
|
createErrorNotice( error.message, {
|
|
109
132
|
type: 'snackbar',
|
|
133
|
+
id: 'convert-to-reusable-block-error',
|
|
110
134
|
} );
|
|
111
135
|
}
|
|
112
136
|
},
|
|
@@ -131,7 +155,9 @@ export default function ReusableBlockConvertButton( {
|
|
|
131
155
|
icon={ symbol }
|
|
132
156
|
onClick={ () => setIsModalOpen( true ) }
|
|
133
157
|
>
|
|
134
|
-
{
|
|
158
|
+
{ showRenameHint
|
|
159
|
+
? __( 'Create pattern/reusable block' )
|
|
160
|
+
: __( 'Create pattern' ) }
|
|
135
161
|
</MenuItem>
|
|
136
162
|
{ isModalOpen && (
|
|
137
163
|
<Modal
|
|
@@ -166,12 +192,12 @@ export default function ReusableBlockConvertButton( {
|
|
|
166
192
|
help={ __(
|
|
167
193
|
'Editing the pattern will update it anywhere it is used.'
|
|
168
194
|
) }
|
|
169
|
-
checked={ syncType
|
|
195
|
+
checked={ ! syncType }
|
|
170
196
|
onChange={ () => {
|
|
171
197
|
setSyncType(
|
|
172
|
-
syncType
|
|
198
|
+
! syncType
|
|
173
199
|
? 'unsynced'
|
|
174
|
-
:
|
|
200
|
+
: undefined
|
|
175
201
|
);
|
|
176
202
|
} }
|
|
177
203
|
/>
|
|
@@ -18,28 +18,41 @@ import { store as coreStore } from '@wordpress/core-data';
|
|
|
18
18
|
import { store as reusableBlocksStore } from '../../store';
|
|
19
19
|
|
|
20
20
|
function ReusableBlocksManageButton( { clientId } ) {
|
|
21
|
-
const { canRemove, isVisible, innerBlockCount } =
|
|
22
|
-
(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
const { canRemove, isVisible, innerBlockCount, managePatternsUrl } =
|
|
22
|
+
useSelect(
|
|
23
|
+
( select ) => {
|
|
24
|
+
const { getBlock, canRemoveBlock, getBlockCount, getSettings } =
|
|
25
|
+
select( blockEditorStore );
|
|
26
|
+
const { canUser } = select( coreStore );
|
|
27
|
+
const reusableBlock = getBlock( clientId );
|
|
28
|
+
const isBlockTheme = getSettings().__unstableIsBlockBasedTheme;
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
30
|
+
return {
|
|
31
|
+
canRemove: canRemoveBlock( clientId ),
|
|
32
|
+
isVisible:
|
|
33
|
+
!! reusableBlock &&
|
|
34
|
+
isReusableBlock( reusableBlock ) &&
|
|
35
|
+
!! canUser(
|
|
36
|
+
'update',
|
|
37
|
+
'blocks',
|
|
38
|
+
reusableBlock.attributes.ref
|
|
39
|
+
),
|
|
40
|
+
innerBlockCount: getBlockCount( clientId ),
|
|
41
|
+
// The site editor and templates both check whether the user
|
|
42
|
+
// has edit_theme_options capabilities. We can leverage that here
|
|
43
|
+
// and omit the manage patterns link if the user can't access it.
|
|
44
|
+
managePatternsUrl:
|
|
45
|
+
isBlockTheme && canUser( 'read', 'templates' )
|
|
46
|
+
? addQueryArgs( 'site-editor.php', {
|
|
47
|
+
path: '/patterns',
|
|
48
|
+
} )
|
|
49
|
+
: addQueryArgs( 'edit.php', {
|
|
50
|
+
post_type: 'wp_block',
|
|
51
|
+
} ),
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
[ clientId ]
|
|
55
|
+
);
|
|
43
56
|
|
|
44
57
|
const { __experimentalConvertBlockToStatic: convertBlockToStatic } =
|
|
45
58
|
useDispatch( reusableBlocksStore );
|
|
@@ -50,10 +63,8 @@ function ReusableBlocksManageButton( { clientId } ) {
|
|
|
50
63
|
|
|
51
64
|
return (
|
|
52
65
|
<BlockSettingsMenuControls>
|
|
53
|
-
<MenuItem
|
|
54
|
-
|
|
55
|
-
>
|
|
56
|
-
{ __( 'Manage Patterns' ) }
|
|
66
|
+
<MenuItem href={ managePatternsUrl }>
|
|
67
|
+
{ __( 'Manage patterns' ) }
|
|
57
68
|
</MenuItem>
|
|
58
69
|
{ canRemove && (
|
|
59
70
|
<MenuItem onClick={ () => convertBlockToStatic( clientId ) }>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';
|
|
5
|
+
|
|
6
|
+
export const { unlock } = __dangerousOptInToUnstableAPIsOnlyForCoreModules(
|
|
7
|
+
'I know using unstable features means my plugin or theme will inevitably break on the next WordPress release.',
|
|
8
|
+
'@wordpress/reusable-blocks'
|
|
9
|
+
);
|
package/src/store/actions.js
CHANGED
|
@@ -42,9 +42,9 @@ export const __experimentalConvertBlockToStatic =
|
|
|
42
42
|
/**
|
|
43
43
|
* Returns a generator converting one or more static blocks into a pattern.
|
|
44
44
|
*
|
|
45
|
-
* @param {string[]}
|
|
46
|
-
* @param {string}
|
|
47
|
-
* @param {
|
|
45
|
+
* @param {string[]} clientIds The client IDs of the block to detach.
|
|
46
|
+
* @param {string} title Pattern title.
|
|
47
|
+
* @param {undefined|'unsynced'} syncType They way block is synced, current undefined (synced) and 'unsynced'.
|
|
48
48
|
*/
|
|
49
49
|
export const __experimentalConvertBlocksToReusable =
|
|
50
50
|
( clientIds, title, syncType ) =>
|