@wordpress/reusable-blocks 4.11.0 → 4.12.1
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 +4 -5
- package/build/components/reusable-blocks-menu-items/index.js.map +1 -1
- package/build/components/reusable-blocks-menu-items/reusable-block-convert-button.js +55 -53
- 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 +4 -5
- package/build/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js.map +1 -1
- package/build/store/actions.js +25 -18
- package/build/store/actions.js.map +1 -1
- package/build/store/reducer.js +2 -5
- package/build/store/reducer.js.map +1 -1
- package/build-module/components/reusable-blocks-menu-items/index.js +4 -5
- 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 +56 -54
- 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 +4 -5
- package/build-module/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js.map +1 -1
- package/build-module/store/actions.js +25 -18
- package/build-module/store/actions.js.map +1 -1
- package/build-module/store/reducer.js +2 -5
- package/build-module/store/reducer.js.map +1 -1
- package/package.json +12 -12
- package/src/components/reusable-blocks-menu-items/reusable-block-convert-button.js +43 -11
- package/src/components/reusable-blocks-menu-items/reusable-blocks-manage-button.js +1 -1
- package/src/store/actions.js +18 -5
package/CHANGELOG.md
CHANGED
|
@@ -24,11 +24,10 @@ var _reusableBlocksManageButton = _interopRequireDefault(require("./reusable-blo
|
|
|
24
24
|
/**
|
|
25
25
|
* Internal dependencies
|
|
26
26
|
*/
|
|
27
|
-
function ReusableBlocksMenuItems(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
} = _ref;
|
|
27
|
+
function ReusableBlocksMenuItems({
|
|
28
|
+
clientIds,
|
|
29
|
+
rootClientId
|
|
30
|
+
}) {
|
|
32
31
|
return (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_reusableBlockConvertButton.default, {
|
|
33
32
|
clientIds: clientIds,
|
|
34
33
|
rootClientId: rootClientId
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/index.js"],"names":["ReusableBlocksMenuItems","clientIds","rootClientId","length","select","getSelectedBlockClientIds","blockEditorStore"],"mappings":";;;;;;;;;;;AAGA;;AACA;;AAKA;;AACA;;AAVA;AACA;AACA;;AAIA;AACA;AACA;AAIA,SAASA,uBAAT,
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/index.js"],"names":["ReusableBlocksMenuItems","clientIds","rootClientId","length","select","getSelectedBlockClientIds","blockEditorStore"],"mappings":";;;;;;;;;;;AAGA;;AACA;;AAKA;;AACA;;AAVA;AACA;AACA;;AAIA;AACA;AACA;AAIA,SAASA,uBAAT,CAAkC;AAAEC,EAAAA,SAAF;AAAaC,EAAAA;AAAb,CAAlC,EAAgE;AAC/D,SACC,qDACC,4BAAC,mCAAD;AACC,IAAA,SAAS,EAAGD,SADb;AAEC,IAAA,YAAY,EAAGC;AAFhB,IADD,EAKGD,SAAS,CAACE,MAAV,KAAqB,CAArB,IACD,4BAAC,mCAAD;AAA4B,IAAA,QAAQ,EAAGF,SAAS,CAAE,CAAF;AAAhD,IANF,CADD;AAWA;;eAEc,sBAAcG,MAAF,IAAc;AACxC,QAAM;AAAEC,IAAAA;AAAF,MAAgCD,MAAM,CAAEE,kBAAF,CAA5C;AACA,SAAO;AACNL,IAAAA,SAAS,EAAEI,yBAAyB;AAD9B,GAAP;AAGA,CALc,EAKVL,uBALU,C","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { withSelect } 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\nfunction ReusableBlocksMenuItems( { clientIds, rootClientId } ) {\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\nexport default withSelect( ( select ) => {\n\tconst { getSelectedBlockClientIds } = select( blockEditorStore );\n\treturn {\n\t\tclientIds: getSelectedBlockClientIds(),\n\t};\n} )( ReusableBlocksMenuItems );\n"]}
|
|
@@ -41,11 +41,11 @@ var _store = require("../../store");
|
|
|
41
41
|
* @param {string} props.rootClientId ID of the currently selected top-level block.
|
|
42
42
|
* @return {import('@wordpress/element').WPComponent} The menu control or null.
|
|
43
43
|
*/
|
|
44
|
-
function ReusableBlockConvertButton(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
function ReusableBlockConvertButton({
|
|
45
|
+
clientIds,
|
|
46
|
+
rootClientId
|
|
47
|
+
}) {
|
|
48
|
+
const [syncType, setSyncType] = (0, _element.useState)('unsynced');
|
|
49
49
|
const [isModalOpen, setIsModalOpen] = (0, _element.useState)(false);
|
|
50
50
|
const [title, setTitle] = (0, _element.useState)('');
|
|
51
51
|
const canConvert = (0, _data.useSelect)(select => {
|
|
@@ -70,7 +70,7 @@ function ReusableBlockConvertButton(_ref) {
|
|
|
70
70
|
!!canUser('create', 'blocks');
|
|
71
71
|
|
|
72
72
|
return _canConvert;
|
|
73
|
-
}, [clientIds]);
|
|
73
|
+
}, [clientIds, rootClientId]);
|
|
74
74
|
const {
|
|
75
75
|
__experimentalConvertBlocksToReusable: convertBlocksToReusable
|
|
76
76
|
} = (0, _data.useDispatch)(_store.store);
|
|
@@ -80,8 +80,8 @@ function ReusableBlockConvertButton(_ref) {
|
|
|
80
80
|
} = (0, _data.useDispatch)(_notices.store);
|
|
81
81
|
const onConvert = (0, _element.useCallback)(async function (reusableBlockTitle) {
|
|
82
82
|
try {
|
|
83
|
-
await convertBlocksToReusable(clientIds, reusableBlockTitle);
|
|
84
|
-
createSuccessNotice((0, _i18n.__)('
|
|
83
|
+
await convertBlocksToReusable(clientIds, reusableBlockTitle, syncType);
|
|
84
|
+
createSuccessNotice(syncType === 'fully' ? (0, _i18n.__)('Synced Pattern created.') : (0, _i18n.__)('Unsynced Pattern created.'), {
|
|
85
85
|
type: 'snackbar'
|
|
86
86
|
});
|
|
87
87
|
} catch (error) {
|
|
@@ -89,55 +89,57 @@ function ReusableBlockConvertButton(_ref) {
|
|
|
89
89
|
type: 'snackbar'
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
|
-
}, [clientIds]);
|
|
92
|
+
}, [convertBlocksToReusable, clientIds, syncType, createSuccessNotice, createErrorNotice]);
|
|
93
93
|
|
|
94
94
|
if (!canConvert) {
|
|
95
95
|
return null;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
return (0, _element.createElement)(_blockEditor.BlockSettingsMenuControls, null,
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
98
|
+
return (0, _element.createElement)(_blockEditor.BlockSettingsMenuControls, null, ({
|
|
99
|
+
onClose
|
|
100
|
+
}) => (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_components.MenuItem, {
|
|
101
|
+
icon: _icons.symbol,
|
|
102
|
+
onClick: () => setIsModalOpen(true)
|
|
103
|
+
}, (0, _i18n.__)('Create pattern')), isModalOpen && (0, _element.createElement)(_components.Modal, {
|
|
104
|
+
title: (0, _i18n.__)('Create pattern'),
|
|
105
|
+
onRequestClose: () => {
|
|
106
|
+
setIsModalOpen(false);
|
|
107
|
+
setTitle('');
|
|
108
|
+
},
|
|
109
|
+
overlayClassName: "reusable-blocks-menu-items__convert-modal"
|
|
110
|
+
}, (0, _element.createElement)("form", {
|
|
111
|
+
onSubmit: event => {
|
|
112
|
+
event.preventDefault();
|
|
113
|
+
onConvert(title);
|
|
114
|
+
setIsModalOpen(false);
|
|
115
|
+
setTitle('');
|
|
116
|
+
onClose();
|
|
117
|
+
}
|
|
118
|
+
}, (0, _element.createElement)(_components.__experimentalVStack, {
|
|
119
|
+
spacing: "5"
|
|
120
|
+
}, (0, _element.createElement)(_components.TextControl, {
|
|
121
|
+
__nextHasNoMarginBottom: true,
|
|
122
|
+
label: (0, _i18n.__)('Name'),
|
|
123
|
+
value: title,
|
|
124
|
+
onChange: setTitle
|
|
125
|
+
}), (0, _element.createElement)(_components.ToggleControl, {
|
|
126
|
+
label: (0, _i18n.__)('Keep all pattern instances in sync'),
|
|
127
|
+
help: (0, _i18n.__)('Editing the original pattern will also update anywhere the pattern is used.'),
|
|
128
|
+
checked: syncType === 'fully',
|
|
129
|
+
onChange: () => {
|
|
130
|
+
setSyncType(syncType === 'fully' ? 'unsynced' : 'fully');
|
|
131
|
+
}
|
|
132
|
+
}), (0, _element.createElement)(_components.__experimentalHStack, {
|
|
133
|
+
justify: "right"
|
|
134
|
+
}, (0, _element.createElement)(_components.Button, {
|
|
135
|
+
variant: "tertiary",
|
|
136
|
+
onClick: () => {
|
|
137
|
+
setIsModalOpen(false);
|
|
138
|
+
setTitle('');
|
|
139
|
+
}
|
|
140
|
+
}, (0, _i18n.__)('Cancel')), (0, _element.createElement)(_components.Button, {
|
|
141
|
+
variant: "primary",
|
|
142
|
+
type: "submit"
|
|
143
|
+
}, (0, _i18n.__)('Save'))))))));
|
|
142
144
|
}
|
|
143
145
|
//# sourceMappingURL=reusable-block-convert-button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/reusable-block-convert-button.js"],"names":["ReusableBlockConvertButton","clientIds","rootClientId","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} 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} 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 [ 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 ]\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( clientIds, reusableBlockTitle );\n\t\t\t\tcreateSuccessNotice( __( 'Reusable block created.' ), {\n\t\t\t\t\ttype: 'snackbar',\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[ clientIds ]\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={ () => {\n\t\t\t\t\t\t\tsetIsModalOpen( true );\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Create 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 Reusable block' ) }\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<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/>\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{ __( 'Save' ) }\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","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":";;;;;;;AAQA;;AALA;;AACA;;AAKA;;AASA;;AACA;;AACA;;AACA;;AACA;;AAKA;;AA3BA;AACA;AACA;;AAsBA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,0BAAT,CAAqC;AACnDC,EAAAA,SADmD;AAEnDC,EAAAA;AAFmD,CAArC,EAGX;AACH,QAAM,CAAEC,QAAF,EAAYC,WAAZ,IAA4B,uBAAU,UAAV,CAAlC;AACA,QAAM,CAAEC,WAAF,EAAeC,cAAf,IAAkC,uBAAU,KAAV,CAAxC;AACA,QAAM,CAAEC,KAAF,EAASC,QAAT,IAAsB,uBAAU,EAAV,CAA5B;AACA,QAAMC,UAAU,GAAG,qBAChBC,MAAF,IAAc;AAAA;;AACb,UAAM;AAAEC,MAAAA;AAAF,QAAcD,MAAM,CAAEE,eAAF,CAA1B;AACA,UAAM;AAAEC,MAAAA,mBAAF;AAAuBC,MAAAA;AAAvB,QACLJ,MAAM,CAAEK,kBAAF,CADP;AAGA,UAAMC,MAAM,2BAAGH,mBAAmB,CAAEZ,SAAF,CAAtB,uEAAuC,EAAnD;AAEA,UAAMgB,UAAU,GACfD,MAAM,CAACE,MAAP,KAAkB,CAAlB,IACAF,MAAM,CAAE,CAAF,CADN,IAEA,6BAAiBA,MAAM,CAAE,CAAF,CAAvB,CAFA,IAGA,CAAC,CAAEN,MAAM,CAAEE,eAAF,CAAN,CAAoBO,eAApB,CACF,UADE,EAEF,UAFE,EAGFH,MAAM,CAAE,CAAF,CAAN,CAAYI,UAAZ,CAAuBC,GAHrB,CAJJ;;AAUA,UAAMC,WAAW,GAChB;AACA,KAAEL,UAAF,IACA;AACAH,IAAAA,kBAAkB,CAAE,YAAF,EAAgBZ,YAAhB,CAFlB,IAGAc,MAAM,CAACO,KAAP,CACGC,KAAF,IACC;AACA,KAAC,CAAEA,KAAH,IACA;AACAA,IAAAA,KAAK,CAACC,OAFN,IAGA;AACA,iCAAiBD,KAAK,CAACE,IAAvB,EAA6B,UAA7B,EAAyC,IAAzC,CAPF,CAHA,IAYA;AACA,KAAC,CAAEf,OAAO,CAAE,QAAF,EAAY,QAAZ,CAfX;;AAiBA,WAAOW,WAAP;AACA,GApCiB,EAqClB,CAAErB,SAAF,EAAaC,YAAb,CArCkB,CAAnB;AAwCA,QAAM;AAAEyB,IAAAA,qCAAqC,EAAEC;AAAzC,MACL,uBAAaC,YAAb,CADD;AAGA,QAAM;AAAEC,IAAAA,mBAAF;AAAuBC,IAAAA;AAAvB,MACL,uBAAaC,cAAb,CADD;AAEA,QAAMC,SAAS,GAAG,0BACjB,gBAAiBC,kBAAjB,EAAsC;AACrC,QAAI;AACH,YAAMN,uBAAuB,CAC5B3B,SAD4B,EAE5BiC,kBAF4B,EAG5B/B,QAH4B,CAA7B;AAKA2B,MAAAA,mBAAmB,CAClB3B,QAAQ,KAAK,OAAb,GACG,cAAI,yBAAJ,CADH,GAEG,cAAI,2BAAJ,CAHe,EAIlB;AACCgC,QAAAA,IAAI,EAAE;AADP,OAJkB,CAAnB;AAQA,KAdD,CAcE,OAAQC,KAAR,EAAgB;AACjBL,MAAAA,iBAAiB,CAAEK,KAAK,CAACC,OAAR,EAAiB;AACjCF,QAAAA,IAAI,EAAE;AAD2B,OAAjB,CAAjB;AAGA;AACD,GArBgB,EAsBjB,CACCP,uBADD,EAEC3B,SAFD,EAGCE,QAHD,EAIC2B,mBAJD,EAKCC,iBALD,CAtBiB,CAAlB;;AA+BA,MAAK,CAAEtB,UAAP,EAAoB;AACnB,WAAO,IAAP;AACA;;AAED,SACC,4BAAC,sCAAD,QACG,CAAE;AAAE6B,IAAAA;AAAF,GAAF,KACD,qDACC,4BAAC,oBAAD;AACC,IAAA,IAAI,EAAGC,aADR;AAEC,IAAA,OAAO,EAAG,MAAMjC,cAAc,CAAE,IAAF;AAF/B,KAIG,cAAI,gBAAJ,CAJH,CADD,EAOGD,WAAW,IACZ,4BAAC,iBAAD;AACC,IAAA,KAAK,EAAG,cAAI,gBAAJ,CADT;AAEC,IAAA,cAAc,EAAG,MAAM;AACtBC,MAAAA,cAAc,CAAE,KAAF,CAAd;AACAE,MAAAA,QAAQ,CAAE,EAAF,CAAR;AACA,KALF;AAMC,IAAA,gBAAgB,EAAC;AANlB,KAQC;AACC,IAAA,QAAQ,EAAKgC,KAAF,IAAa;AACvBA,MAAAA,KAAK,CAACC,cAAN;AACAR,MAAAA,SAAS,CAAE1B,KAAF,CAAT;AACAD,MAAAA,cAAc,CAAE,KAAF,CAAd;AACAE,MAAAA,QAAQ,CAAE,EAAF,CAAR;AACA8B,MAAAA,OAAO;AACP;AAPF,KASC,4BAAC,gCAAD;AAAQ,IAAA,OAAO,EAAC;AAAhB,KACC,4BAAC,uBAAD;AACC,IAAA,uBAAuB,MADxB;AAEC,IAAA,KAAK,EAAG,cAAI,MAAJ,CAFT;AAGC,IAAA,KAAK,EAAG/B,KAHT;AAIC,IAAA,QAAQ,EAAGC;AAJZ,IADD,EAQC,4BAAC,yBAAD;AACC,IAAA,KAAK,EAAG,cACP,oCADO,CADT;AAIC,IAAA,IAAI,EAAG,cACN,6EADM,CAJR;AAOC,IAAA,OAAO,EAAGL,QAAQ,KAAK,OAPxB;AAQC,IAAA,QAAQ,EAAG,MAAM;AAChBC,MAAAA,WAAW,CACVD,QAAQ,KAAK,OAAb,GACG,UADH,GAEG,OAHO,CAAX;AAKA;AAdF,IARD,EAwBC,4BAAC,gCAAD;AAAQ,IAAA,OAAO,EAAC;AAAhB,KACC,4BAAC,kBAAD;AACC,IAAA,OAAO,EAAC,UADT;AAEC,IAAA,OAAO,EAAG,MAAM;AACfG,MAAAA,cAAc,CAAE,KAAF,CAAd;AACAE,MAAAA,QAAQ,CAAE,EAAF,CAAR;AACA;AALF,KAOG,cAAI,QAAJ,CAPH,CADD,EAWC,4BAAC,kBAAD;AAAQ,IAAA,OAAO,EAAC,SAAhB;AAA0B,IAAA,IAAI,EAAC;AAA/B,KACG,cAAI,MAAJ,CADH,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} 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' ) }\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<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/>\n\n\t\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\t\tlabel={ __(\n\t\t\t\t\t\t\t\t\t\t\t'Keep all pattern instances in sync'\n\t\t\t\t\t\t\t\t\t\t) }\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 original pattern will also update anywhere the pattern 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{ __( 'Save' ) }\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"]}
|
|
@@ -30,10 +30,9 @@ var _store = require("../../store");
|
|
|
30
30
|
/**
|
|
31
31
|
* Internal dependencies
|
|
32
32
|
*/
|
|
33
|
-
function ReusableBlocksManageButton(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
} = _ref;
|
|
33
|
+
function ReusableBlocksManageButton({
|
|
34
|
+
clientId
|
|
35
|
+
}) {
|
|
37
36
|
const {
|
|
38
37
|
canRemove,
|
|
39
38
|
isVisible,
|
|
@@ -66,7 +65,7 @@ function ReusableBlocksManageButton(_ref) {
|
|
|
66
65
|
href: (0, _url.addQueryArgs)('edit.php', {
|
|
67
66
|
post_type: 'wp_block'
|
|
68
67
|
})
|
|
69
|
-
}, (0, _i18n.__)('Manage
|
|
68
|
+
}, (0, _i18n.__)('Manage Patterns')), canRemove && (0, _element.createElement)(_components.MenuItem, {
|
|
70
69
|
onClick: () => convertBlockToStatic(clientId)
|
|
71
70
|
}, innerBlockCount > 1 ? (0, _i18n.__)('Convert to regular blocks') : (0, _i18n.__)('Convert to regular block')));
|
|
72
71
|
}
|
|
@@ -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","post_type"],"mappings":";;;;;;;;;AAGA;;AACA;;AACA;;AACA;;AACA;;AAIA;;AACA;;AAKA;;AAjBA;AACA;AACA;;AAYA;AACA;AACA;AAGA,SAASA,0BAAT,
|
|
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","post_type"],"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;AAAxB,MAA4C,qBAC/CC,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,QAAF;AAAYC,MAAAA,cAAZ;AAA4BC,MAAAA;AAA5B,QACLH,MAAM,CAAEI,kBAAF,CADP;AAEA,UAAM;AAAEC,MAAAA;AAAF,QAAcL,MAAM,CAAEM,eAAF,CAA1B;AACA,UAAMC,aAAa,GAAGN,QAAQ,CAAEL,QAAF,CAA9B;AAEA,WAAO;AACNC,MAAAA,SAAS,EAAEK,cAAc,CAAEN,QAAF,CADnB;AAENE,MAAAA,SAAS,EACR,CAAC,CAAES,aAAH,IACA,6BAAiBA,aAAjB,CADA,IAEA,CAAC,CAAEF,OAAO,CACT,QADS,EAET,QAFS,EAGTE,aAAa,CAACC,UAAd,CAAyBC,GAHhB,CALL;AAUNV,MAAAA,eAAe,EAAEI,aAAa,CAAEP,QAAF;AAVxB,KAAP;AAYA,GAnBgD,EAoBjD,CAAEA,QAAF,CApBiD,CAAlD;AAuBA,QAAM;AAAEc,IAAAA,kCAAkC,EAAEC;AAAtC,MACL,uBAAaC,YAAb,CADD;;AAGA,MAAK,CAAEd,SAAP,EAAmB;AAClB,WAAO,IAAP;AACA;;AAED,SACC,4BAAC,sCAAD,QACC,4BAAC,oBAAD;AACC,IAAA,IAAI,EAAG,uBAAc,UAAd,EAA0B;AAAEe,MAAAA,SAAS,EAAE;AAAb,KAA1B;AADR,KAGG,cAAI,iBAAJ,CAHH,CADD,EAMGhB,SAAS,IACV,4BAAC,oBAAD;AAAU,IAAA,OAAO,EAAG,MAAMc,oBAAoB,CAAEf,QAAF;AAA9C,KACGG,eAAe,GAAG,CAAlB,GACC,cAAI,2BAAJ,CADD,GAEC,cAAI,0BAAJ,CAHJ,CAPF,CADD;AAgBA;;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 } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlock, canRemoveBlock, getBlockCount } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst reusableBlock = getBlock( clientId );\n\n\t\t\treturn {\n\t\t\t\tcanRemove: canRemoveBlock( clientId ),\n\t\t\t\tisVisible:\n\t\t\t\t\t!! reusableBlock &&\n\t\t\t\t\tisReusableBlock( reusableBlock ) &&\n\t\t\t\t\t!! canUser(\n\t\t\t\t\t\t'update',\n\t\t\t\t\t\t'blocks',\n\t\t\t\t\t\treusableBlock.attributes.ref\n\t\t\t\t\t),\n\t\t\t\tinnerBlockCount: getBlockCount( clientId ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\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\n\t\t\t\thref={ addQueryArgs( 'edit.php', { post_type: 'wp_block' } ) }\n\t\t\t>\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? __( 'Convert to regular blocks' )\n\t\t\t\t\t\t: __( 'Convert to regular block' ) }\n\t\t\t\t</MenuItem>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n\nexport default ReusableBlocksManageButton;\n"]}
|
package/build/store/actions.js
CHANGED
|
@@ -21,36 +21,44 @@ var _i18n = require("@wordpress/i18n");
|
|
|
21
21
|
*
|
|
22
22
|
* @param {string} clientId The client ID of the block to attach.
|
|
23
23
|
*/
|
|
24
|
-
const __experimentalConvertBlockToStatic = clientId =>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
} = _ref;
|
|
24
|
+
const __experimentalConvertBlockToStatic = clientId => ({
|
|
25
|
+
registry
|
|
26
|
+
}) => {
|
|
28
27
|
const oldBlock = registry.select(_blockEditor.store).getBlock(clientId);
|
|
29
28
|
const reusableBlock = registry.select('core').getEditedEntityRecord('postType', 'wp_block', oldBlock.attributes.ref);
|
|
30
29
|
const newBlocks = (0, _blocks.parse)(typeof reusableBlock.content === 'function' ? reusableBlock.content(reusableBlock) : reusableBlock.content);
|
|
31
30
|
registry.dispatch(_blockEditor.store).replaceBlocks(oldBlock.clientId, newBlocks);
|
|
32
31
|
};
|
|
33
32
|
/**
|
|
34
|
-
* Returns a generator converting one or more static blocks into a
|
|
33
|
+
* Returns a generator converting one or more static blocks into a pattern.
|
|
35
34
|
*
|
|
36
|
-
* @param {string[]}
|
|
37
|
-
* @param {string}
|
|
35
|
+
* @param {string[]} clientIds The client IDs of the block to detach.
|
|
36
|
+
* @param {string} title Pattern title.
|
|
37
|
+
* @param {'fully'|'unsynced'} syncType They way block is synced, current 'fully' and 'unsynced'.
|
|
38
38
|
*/
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
exports.__experimentalConvertBlockToStatic = __experimentalConvertBlockToStatic;
|
|
42
42
|
|
|
43
|
-
const __experimentalConvertBlocksToReusable = (clientIds, title) => async
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
const __experimentalConvertBlocksToReusable = (clientIds, title, syncType) => async ({
|
|
44
|
+
registry,
|
|
45
|
+
dispatch
|
|
46
|
+
}) => {
|
|
47
|
+
const meta = syncType === 'unsynced' ? {
|
|
48
|
+
sync_status: syncType
|
|
49
|
+
} : undefined;
|
|
48
50
|
const reusableBlock = {
|
|
49
|
-
title: title || (0, _i18n.__)('Untitled
|
|
51
|
+
title: title || (0, _i18n.__)('Untitled Pattern block'),
|
|
50
52
|
content: (0, _blocks.serialize)(registry.select(_blockEditor.store).getBlocksByClientId(clientIds)),
|
|
51
|
-
status: 'publish'
|
|
53
|
+
status: 'publish',
|
|
54
|
+
meta
|
|
52
55
|
};
|
|
53
56
|
const updatedRecord = await registry.dispatch('core').saveEntityRecord('postType', 'wp_block', reusableBlock);
|
|
57
|
+
|
|
58
|
+
if (syncType === 'unsynced') {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
54
62
|
const newBlock = (0, _blocks.createBlock)('core/block', {
|
|
55
63
|
ref: updatedRecord.id
|
|
56
64
|
});
|
|
@@ -67,10 +75,9 @@ const __experimentalConvertBlocksToReusable = (clientIds, title) => async _ref2
|
|
|
67
75
|
|
|
68
76
|
exports.__experimentalConvertBlocksToReusable = __experimentalConvertBlocksToReusable;
|
|
69
77
|
|
|
70
|
-
const __experimentalDeleteReusableBlock = id => async
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
} = _ref3;
|
|
78
|
+
const __experimentalDeleteReusableBlock = id => async ({
|
|
79
|
+
registry
|
|
80
|
+
}) => {
|
|
74
81
|
const reusableBlock = registry.select('core').getEditedEntityRecord('postType', 'wp_block', id); // Don't allow a reusable block with a temporary ID to be deleted.
|
|
75
82
|
|
|
76
83
|
if (!reusableBlock) {
|
|
@@ -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","getBlocksByClientId","status","updatedRecord","saveEntityRecord","newBlock","id","__experimentalSetEditingReusableBlock","__experimentalDeleteReusableBlock","allBlocks","getBlocks","associatedBlocks","filter","block","associatedBlockClientIds","map","length","removeBlocks","deleteEntityRecord","isEditing","type"],"mappings":";;;;;;;;AAGA;;AACA;;AAMA;;AAVA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACO,MAAMA,kCAAkC,GAC5CC,QAAF,IACA,
|
|
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","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 {'fully'|'unsynced'} syncType They way block is synced, current 'fully' 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\tsync_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/build/store/reducer.js
CHANGED
|
@@ -11,11 +11,8 @@ var _data = require("@wordpress/data");
|
|
|
11
11
|
/**
|
|
12
12
|
* WordPress dependencies
|
|
13
13
|
*/
|
|
14
|
-
function isEditingReusableBlock() {
|
|
15
|
-
|
|
16
|
-
let action = arguments.length > 1 ? arguments[1] : undefined;
|
|
17
|
-
|
|
18
|
-
if ((action === null || action === void 0 ? void 0 : action.type) === 'SET_EDITING_REUSABLE_BLOCK') {
|
|
14
|
+
function isEditingReusableBlock(state = {}, action) {
|
|
15
|
+
if (action?.type === 'SET_EDITING_REUSABLE_BLOCK') {
|
|
19
16
|
return { ...state,
|
|
20
17
|
[action.clientId]: action.isEditing
|
|
21
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/store/reducer.js"],"names":["isEditingReusableBlock","state","action","type","clientId","isEditing"],"mappings":";;;;;;;;AAGA;;AAHA;AACA;AACA;AAGO,SAASA,sBAAT,
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/store/reducer.js"],"names":["isEditingReusableBlock","state","action","type","clientId","isEditing"],"mappings":";;;;;;;;AAGA;;AAHA;AACA;AACA;AAGO,SAASA,sBAAT,CAAiCC,KAAK,GAAG,EAAzC,EAA6CC,MAA7C,EAAsD;AAC5D,MAAKA,MAAM,EAAEC,IAAR,KAAiB,4BAAtB,EAAqD;AACpD,WAAO,EACN,GAAGF,KADG;AAEN,OAAEC,MAAM,CAACE,QAAT,GAAqBF,MAAM,CAACG;AAFtB,KAAP;AAIA;;AAED,SAAOJ,KAAP;AACA;;eAEc,2BAAiB;AAC/BD,EAAAA;AAD+B,CAAjB,C","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { combineReducers } from '@wordpress/data';\n\nexport function isEditingReusableBlock( state = {}, action ) {\n\tif ( action?.type === 'SET_EDITING_REUSABLE_BLOCK' ) {\n\t\treturn {\n\t\t\t...state,\n\t\t\t[ action.clientId ]: action.isEditing,\n\t\t};\n\t}\n\n\treturn state;\n}\n\nexport default combineReducers( {\n\tisEditingReusableBlock,\n} );\n"]}
|
|
@@ -12,11 +12,10 @@ import { store as blockEditorStore } from '@wordpress/block-editor';
|
|
|
12
12
|
import ReusableBlockConvertButton from './reusable-block-convert-button';
|
|
13
13
|
import ReusableBlocksManageButton from './reusable-blocks-manage-button';
|
|
14
14
|
|
|
15
|
-
function ReusableBlocksMenuItems(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
} = _ref;
|
|
15
|
+
function ReusableBlocksMenuItems({
|
|
16
|
+
clientIds,
|
|
17
|
+
rootClientId
|
|
18
|
+
}) {
|
|
20
19
|
return createElement(Fragment, null, createElement(ReusableBlockConvertButton, {
|
|
21
20
|
clientIds: clientIds,
|
|
22
21
|
rootClientId: rootClientId
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/index.js"],"names":["withSelect","store","blockEditorStore","ReusableBlockConvertButton","ReusableBlocksManageButton","ReusableBlocksMenuItems","clientIds","rootClientId","length","select","getSelectedBlockClientIds"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,UAAT,QAA2B,iBAA3B;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,yBAA1C;AAEA;AACA;AACA;;AACA,OAAOC,0BAAP,MAAuC,iCAAvC;AACA,OAAOC,0BAAP,MAAuC,iCAAvC;;AAEA,SAASC,uBAAT,
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/components/reusable-blocks-menu-items/index.js"],"names":["withSelect","store","blockEditorStore","ReusableBlockConvertButton","ReusableBlocksManageButton","ReusableBlocksMenuItems","clientIds","rootClientId","length","select","getSelectedBlockClientIds"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,UAAT,QAA2B,iBAA3B;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,yBAA1C;AAEA;AACA;AACA;;AACA,OAAOC,0BAAP,MAAuC,iCAAvC;AACA,OAAOC,0BAAP,MAAuC,iCAAvC;;AAEA,SAASC,uBAAT,CAAkC;AAAEC,EAAAA,SAAF;AAAaC,EAAAA;AAAb,CAAlC,EAAgE;AAC/D,SACC,8BACC,cAAC,0BAAD;AACC,IAAA,SAAS,EAAGD,SADb;AAEC,IAAA,YAAY,EAAGC;AAFhB,IADD,EAKGD,SAAS,CAACE,MAAV,KAAqB,CAArB,IACD,cAAC,0BAAD;AAA4B,IAAA,QAAQ,EAAGF,SAAS,CAAE,CAAF;AAAhD,IANF,CADD;AAWA;;AAED,eAAeN,UAAU,CAAIS,MAAF,IAAc;AACxC,QAAM;AAAEC,IAAAA;AAAF,MAAgCD,MAAM,CAAEP,gBAAF,CAA5C;AACA,SAAO;AACNI,IAAAA,SAAS,EAAEI,yBAAyB;AAD9B,GAAP;AAGA,CALwB,CAAV,CAKVL,uBALU,CAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { withSelect } 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\nfunction ReusableBlocksMenuItems( { clientIds, rootClientId } ) {\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\nexport default withSelect( ( select ) => {\n\tconst { getSelectedBlockClientIds } = select( blockEditorStore );\n\treturn {\n\t\tclientIds: getSelectedBlockClientIds(),\n\t};\n} )( ReusableBlocksMenuItems );\n"]}
|
|
@@ -6,7 +6,7 @@ import { createElement, Fragment } from "@wordpress/element";
|
|
|
6
6
|
import { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';
|
|
7
7
|
import { BlockSettingsMenuControls, store as blockEditorStore } from '@wordpress/block-editor';
|
|
8
8
|
import { useCallback, useState } from '@wordpress/element';
|
|
9
|
-
import { MenuItem, Modal, Button, TextControl, __experimentalHStack as HStack, __experimentalVStack as VStack } from '@wordpress/components';
|
|
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
12
|
import { __ } from '@wordpress/i18n';
|
|
@@ -26,11 +26,11 @@ import { store } from '../../store';
|
|
|
26
26
|
* @return {import('@wordpress/element').WPComponent} The menu control or null.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
export default function ReusableBlockConvertButton(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
export default function ReusableBlockConvertButton({
|
|
30
|
+
clientIds,
|
|
31
|
+
rootClientId
|
|
32
|
+
}) {
|
|
33
|
+
const [syncType, setSyncType] = useState('unsynced');
|
|
34
34
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
35
35
|
const [title, setTitle] = useState('');
|
|
36
36
|
const canConvert = useSelect(select => {
|
|
@@ -55,7 +55,7 @@ export default function ReusableBlockConvertButton(_ref) {
|
|
|
55
55
|
!!canUser('create', 'blocks');
|
|
56
56
|
|
|
57
57
|
return _canConvert;
|
|
58
|
-
}, [clientIds]);
|
|
58
|
+
}, [clientIds, rootClientId]);
|
|
59
59
|
const {
|
|
60
60
|
__experimentalConvertBlocksToReusable: convertBlocksToReusable
|
|
61
61
|
} = useDispatch(store);
|
|
@@ -65,8 +65,8 @@ export default function ReusableBlockConvertButton(_ref) {
|
|
|
65
65
|
} = useDispatch(noticesStore);
|
|
66
66
|
const onConvert = useCallback(async function (reusableBlockTitle) {
|
|
67
67
|
try {
|
|
68
|
-
await convertBlocksToReusable(clientIds, reusableBlockTitle);
|
|
69
|
-
createSuccessNotice(__('
|
|
68
|
+
await convertBlocksToReusable(clientIds, reusableBlockTitle, syncType);
|
|
69
|
+
createSuccessNotice(syncType === 'fully' ? __('Synced Pattern created.') : __('Unsynced Pattern created.'), {
|
|
70
70
|
type: 'snackbar'
|
|
71
71
|
});
|
|
72
72
|
} catch (error) {
|
|
@@ -74,55 +74,57 @@ export default function ReusableBlockConvertButton(_ref) {
|
|
|
74
74
|
type: 'snackbar'
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
|
-
}, [clientIds]);
|
|
77
|
+
}, [convertBlocksToReusable, clientIds, syncType, createSuccessNotice, createErrorNotice]);
|
|
78
78
|
|
|
79
79
|
if (!canConvert) {
|
|
80
80
|
return null;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
return createElement(BlockSettingsMenuControls, null,
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
83
|
+
return createElement(BlockSettingsMenuControls, null, ({
|
|
84
|
+
onClose
|
|
85
|
+
}) => createElement(Fragment, null, createElement(MenuItem, {
|
|
86
|
+
icon: symbol,
|
|
87
|
+
onClick: () => setIsModalOpen(true)
|
|
88
|
+
}, __('Create pattern')), isModalOpen && createElement(Modal, {
|
|
89
|
+
title: __('Create pattern'),
|
|
90
|
+
onRequestClose: () => {
|
|
91
|
+
setIsModalOpen(false);
|
|
92
|
+
setTitle('');
|
|
93
|
+
},
|
|
94
|
+
overlayClassName: "reusable-blocks-menu-items__convert-modal"
|
|
95
|
+
}, createElement("form", {
|
|
96
|
+
onSubmit: event => {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
onConvert(title);
|
|
99
|
+
setIsModalOpen(false);
|
|
100
|
+
setTitle('');
|
|
101
|
+
onClose();
|
|
102
|
+
}
|
|
103
|
+
}, createElement(VStack, {
|
|
104
|
+
spacing: "5"
|
|
105
|
+
}, createElement(TextControl, {
|
|
106
|
+
__nextHasNoMarginBottom: true,
|
|
107
|
+
label: __('Name'),
|
|
108
|
+
value: title,
|
|
109
|
+
onChange: setTitle
|
|
110
|
+
}), createElement(ToggleControl, {
|
|
111
|
+
label: __('Keep all pattern instances in sync'),
|
|
112
|
+
help: __('Editing the original pattern will also update anywhere the pattern is used.'),
|
|
113
|
+
checked: syncType === 'fully',
|
|
114
|
+
onChange: () => {
|
|
115
|
+
setSyncType(syncType === 'fully' ? 'unsynced' : 'fully');
|
|
116
|
+
}
|
|
117
|
+
}), createElement(HStack, {
|
|
118
|
+
justify: "right"
|
|
119
|
+
}, createElement(Button, {
|
|
120
|
+
variant: "tertiary",
|
|
121
|
+
onClick: () => {
|
|
122
|
+
setIsModalOpen(false);
|
|
123
|
+
setTitle('');
|
|
124
|
+
}
|
|
125
|
+
}, __('Cancel')), createElement(Button, {
|
|
126
|
+
variant: "primary",
|
|
127
|
+
type: "submit"
|
|
128
|
+
}, __('Save'))))))));
|
|
127
129
|
}
|
|
128
130
|
//# sourceMappingURL=reusable-block-convert-button.js.map
|
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","useCallback","useState","MenuItem","Modal","Button","TextControl","__experimentalHStack","HStack","__experimentalVStack","VStack","symbol","useDispatch","useSelect","__","noticesStore","coreStore","ReusableBlockConvertButton","clientIds","rootClientId","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":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';\nimport {\n\tBlockSettingsMenuControls,\n\tstore as blockEditorStore,\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} 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 [ 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 ]\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( clientIds, reusableBlockTitle );\n\t\t\t\tcreateSuccessNotice( __( 'Reusable block created.' ), {\n\t\t\t\t\ttype: 'snackbar',\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[ clientIds ]\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={ () => {\n\t\t\t\t\t\t\tsetIsModalOpen( true );\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Create 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 Reusable block' ) }\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<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/>\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{ __( 'Save' ) }\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","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":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { hasBlockSupport, isReusableBlock } from '@wordpress/blocks';\nimport {\n\tBlockSettingsMenuControls,\n\tstore as blockEditorStore,\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' ) }\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<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/>\n\n\t\t\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\t\t\tlabel={ __(\n\t\t\t\t\t\t\t\t\t\t\t'Keep all pattern instances in sync'\n\t\t\t\t\t\t\t\t\t\t) }\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 original pattern will also update anywhere the pattern 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{ __( 'Save' ) }\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"]}
|
|
@@ -16,10 +16,9 @@ import { store as coreStore } from '@wordpress/core-data';
|
|
|
16
16
|
|
|
17
17
|
import { store as reusableBlocksStore } from '../../store';
|
|
18
18
|
|
|
19
|
-
function ReusableBlocksManageButton(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
} = _ref;
|
|
19
|
+
function ReusableBlocksManageButton({
|
|
20
|
+
clientId
|
|
21
|
+
}) {
|
|
23
22
|
const {
|
|
24
23
|
canRemove,
|
|
25
24
|
isVisible,
|
|
@@ -52,7 +51,7 @@ function ReusableBlocksManageButton(_ref) {
|
|
|
52
51
|
href: addQueryArgs('edit.php', {
|
|
53
52
|
post_type: 'wp_block'
|
|
54
53
|
})
|
|
55
|
-
}, __('Manage
|
|
54
|
+
}, __('Manage Patterns')), canRemove && createElement(MenuItem, {
|
|
56
55
|
onClick: () => convertBlockToStatic(clientId)
|
|
57
56
|
}, innerBlockCount > 1 ? __('Convert to regular blocks') : __('Convert to regular block')));
|
|
58
57
|
}
|
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","__experimentalConvertBlockToStatic","convertBlockToStatic","post_type"],"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,
|
|
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","__experimentalConvertBlockToStatic","convertBlockToStatic","post_type"],"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;AAAxB,MAA4CZ,SAAS,CACxDa,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,QAAF;AAAYC,MAAAA,cAAZ;AAA4BC,MAAAA;AAA5B,QACLH,MAAM,CAAET,gBAAF,CADP;AAEA,UAAM;AAAEa,MAAAA;AAAF,QAAcJ,MAAM,CAAEP,SAAF,CAA1B;AACA,UAAMY,aAAa,GAAGJ,QAAQ,CAAEL,QAAF,CAA9B;AAEA,WAAO;AACNC,MAAAA,SAAS,EAAEK,cAAc,CAAEN,QAAF,CADnB;AAENE,MAAAA,SAAS,EACR,CAAC,CAAEO,aAAH,IACAnB,eAAe,CAAEmB,aAAF,CADf,IAEA,CAAC,CAAED,OAAO,CACT,QADS,EAET,QAFS,EAGTC,aAAa,CAACC,UAAd,CAAyBC,GAHhB,CALL;AAUNR,MAAAA,eAAe,EAAEI,aAAa,CAAEP,QAAF;AAVxB,KAAP;AAYA,GAnByD,EAoB1D,CAAEA,QAAF,CApB0D,CAA3D;AAuBA,QAAM;AAAEY,IAAAA,kCAAkC,EAAEC;AAAtC,MACLrB,WAAW,CAAEM,mBAAF,CADZ;;AAGA,MAAK,CAAEI,SAAP,EAAmB;AAClB,WAAO,IAAP;AACA;;AAED,SACC,cAAC,yBAAD,QACC,cAAC,QAAD;AACC,IAAA,IAAI,EAAGN,YAAY,CAAE,UAAF,EAAc;AAAEkB,MAAAA,SAAS,EAAE;AAAb,KAAd;AADpB,KAGGzB,EAAE,CAAE,iBAAF,CAHL,CADD,EAMGY,SAAS,IACV,cAAC,QAAD;AAAU,IAAA,OAAO,EAAG,MAAMY,oBAAoB,CAAEb,QAAF;AAA9C,KACGG,eAAe,GAAG,CAAlB,GACCd,EAAE,CAAE,2BAAF,CADH,GAECA,EAAE,CAAE,0BAAF,CAHN,CAPF,CADD;AAgBA;;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 } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlock, canRemoveBlock, getBlockCount } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst { canUser } = select( coreStore );\n\t\t\tconst reusableBlock = getBlock( clientId );\n\n\t\t\treturn {\n\t\t\t\tcanRemove: canRemoveBlock( clientId ),\n\t\t\t\tisVisible:\n\t\t\t\t\t!! reusableBlock &&\n\t\t\t\t\tisReusableBlock( reusableBlock ) &&\n\t\t\t\t\t!! canUser(\n\t\t\t\t\t\t'update',\n\t\t\t\t\t\t'blocks',\n\t\t\t\t\t\treusableBlock.attributes.ref\n\t\t\t\t\t),\n\t\t\t\tinnerBlockCount: getBlockCount( clientId ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\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\n\t\t\t\thref={ addQueryArgs( 'edit.php', { post_type: 'wp_block' } ) }\n\t\t\t>\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? __( 'Convert to regular blocks' )\n\t\t\t\t\t\t: __( 'Convert to regular block' ) }\n\t\t\t\t</MenuItem>\n\t\t\t) }\n\t\t</BlockSettingsMenuControls>\n\t);\n}\n\nexport default ReusableBlocksManageButton;\n"]}
|
|
@@ -10,33 +10,41 @@ import { __ } from '@wordpress/i18n';
|
|
|
10
10
|
* @param {string} clientId The client ID of the block to attach.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
export const __experimentalConvertBlockToStatic = clientId =>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
} = _ref;
|
|
13
|
+
export const __experimentalConvertBlockToStatic = clientId => ({
|
|
14
|
+
registry
|
|
15
|
+
}) => {
|
|
17
16
|
const oldBlock = registry.select(blockEditorStore).getBlock(clientId);
|
|
18
17
|
const reusableBlock = registry.select('core').getEditedEntityRecord('postType', 'wp_block', oldBlock.attributes.ref);
|
|
19
18
|
const newBlocks = parse(typeof reusableBlock.content === 'function' ? reusableBlock.content(reusableBlock) : reusableBlock.content);
|
|
20
19
|
registry.dispatch(blockEditorStore).replaceBlocks(oldBlock.clientId, newBlocks);
|
|
21
20
|
};
|
|
22
21
|
/**
|
|
23
|
-
* Returns a generator converting one or more static blocks into a
|
|
22
|
+
* Returns a generator converting one or more static blocks into a pattern.
|
|
24
23
|
*
|
|
25
|
-
* @param {string[]}
|
|
26
|
-
* @param {string}
|
|
24
|
+
* @param {string[]} clientIds The client IDs of the block to detach.
|
|
25
|
+
* @param {string} title Pattern title.
|
|
26
|
+
* @param {'fully'|'unsynced'} syncType They way block is synced, current 'fully' and 'unsynced'.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
export const __experimentalConvertBlocksToReusable = (clientIds, title) => async
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
export const __experimentalConvertBlocksToReusable = (clientIds, title, syncType) => async ({
|
|
30
|
+
registry,
|
|
31
|
+
dispatch
|
|
32
|
+
}) => {
|
|
33
|
+
const meta = syncType === 'unsynced' ? {
|
|
34
|
+
sync_status: syncType
|
|
35
|
+
} : undefined;
|
|
34
36
|
const reusableBlock = {
|
|
35
|
-
title: title || __('Untitled
|
|
37
|
+
title: title || __('Untitled Pattern block'),
|
|
36
38
|
content: serialize(registry.select(blockEditorStore).getBlocksByClientId(clientIds)),
|
|
37
|
-
status: 'publish'
|
|
39
|
+
status: 'publish',
|
|
40
|
+
meta
|
|
38
41
|
};
|
|
39
42
|
const updatedRecord = await registry.dispatch('core').saveEntityRecord('postType', 'wp_block', reusableBlock);
|
|
43
|
+
|
|
44
|
+
if (syncType === 'unsynced') {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
40
48
|
const newBlock = createBlock('core/block', {
|
|
41
49
|
ref: updatedRecord.id
|
|
42
50
|
});
|
|
@@ -50,10 +58,9 @@ export const __experimentalConvertBlocksToReusable = (clientIds, title) => async
|
|
|
50
58
|
* @param {string} id The ID of the reusable block to delete.
|
|
51
59
|
*/
|
|
52
60
|
|
|
53
|
-
export const __experimentalDeleteReusableBlock = id => async
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
} = _ref3;
|
|
61
|
+
export const __experimentalDeleteReusableBlock = id => async ({
|
|
62
|
+
registry
|
|
63
|
+
}) => {
|
|
57
64
|
const reusableBlock = registry.select('core').getEditedEntityRecord('postType', 'wp_block', id); // Don't allow a reusable block with a temporary ID to be deleted.
|
|
58
65
|
|
|
59
66
|
if (!reusableBlock) {
|
|
@@ -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","getBlocksByClientId","status","updatedRecord","saveEntityRecord","newBlock","id","__experimentalSetEditingReusableBlock","__experimentalDeleteReusableBlock","allBlocks","getBlocks","associatedBlocks","filter","block","associatedBlockClientIds","map","length","removeBlocks","deleteEntityRecord","isEditing","type"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,KAAK,IAAIC,gBAAlB,QAA0C,yBAA1C;AACA,SACCC,WADD,EAECC,eAFD,EAGCC,KAHD,EAICC,SAJD,QAKO,mBALP;AAMA,SAASC,EAAT,QAAmB,iBAAnB;AAEA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMC,kCAAkC,GAC5CC,QAAF,IACA,
|
|
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","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 {'fully'|'unsynced'} syncType They way block is synced, current 'fully' 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\tsync_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"]}
|
|
@@ -2,11 +2,8 @@
|
|
|
2
2
|
* WordPress dependencies
|
|
3
3
|
*/
|
|
4
4
|
import { combineReducers } from '@wordpress/data';
|
|
5
|
-
export function isEditingReusableBlock() {
|
|
6
|
-
|
|
7
|
-
let action = arguments.length > 1 ? arguments[1] : undefined;
|
|
8
|
-
|
|
9
|
-
if ((action === null || action === void 0 ? void 0 : action.type) === 'SET_EDITING_REUSABLE_BLOCK') {
|
|
5
|
+
export function isEditingReusableBlock(state = {}, action) {
|
|
6
|
+
if (action?.type === 'SET_EDITING_REUSABLE_BLOCK') {
|
|
10
7
|
return { ...state,
|
|
11
8
|
[action.clientId]: action.isEditing
|
|
12
9
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/reusable-blocks/src/store/reducer.js"],"names":["combineReducers","isEditingReusableBlock","state","action","type","clientId","isEditing"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,eAAT,QAAgC,iBAAhC;AAEA,OAAO,SAASC,sBAAT,
|
|
1
|
+
{"version":3,"sources":["@wordpress/reusable-blocks/src/store/reducer.js"],"names":["combineReducers","isEditingReusableBlock","state","action","type","clientId","isEditing"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,eAAT,QAAgC,iBAAhC;AAEA,OAAO,SAASC,sBAAT,CAAiCC,KAAK,GAAG,EAAzC,EAA6CC,MAA7C,EAAsD;AAC5D,MAAKA,MAAM,EAAEC,IAAR,KAAiB,4BAAtB,EAAqD;AACpD,WAAO,EACN,GAAGF,KADG;AAEN,OAAEC,MAAM,CAACE,QAAT,GAAqBF,MAAM,CAACG;AAFtB,KAAP;AAIA;;AAED,SAAOJ,KAAP;AACA;AAED,eAAeF,eAAe,CAAE;AAC/BC,EAAAA;AAD+B,CAAF,CAA9B","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { combineReducers } from '@wordpress/data';\n\nexport function isEditingReusableBlock( state = {}, action ) {\n\tif ( action?.type === 'SET_EDITING_REUSABLE_BLOCK' ) {\n\t\treturn {\n\t\t\t...state,\n\t\t\t[ action.clientId ]: action.isEditing,\n\t\t};\n\t}\n\n\treturn state;\n}\n\nexport default combineReducers( {\n\tisEditingReusableBlock,\n} );\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wordpress/reusable-blocks",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.12.1",
|
|
4
4
|
"description": "Reusable blocks utilities.",
|
|
5
5
|
"author": "The WordPress Contributors",
|
|
6
6
|
"license": "GPL-2.0-or-later",
|
|
@@ -28,16 +28,16 @@
|
|
|
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/url": "^3.
|
|
31
|
+
"@wordpress/block-editor": "^12.3.1",
|
|
32
|
+
"@wordpress/blocks": "^12.12.1",
|
|
33
|
+
"@wordpress/components": "^25.1.1",
|
|
34
|
+
"@wordpress/core-data": "^6.12.1",
|
|
35
|
+
"@wordpress/data": "^9.5.1",
|
|
36
|
+
"@wordpress/element": "^5.12.1",
|
|
37
|
+
"@wordpress/i18n": "^4.35.1",
|
|
38
|
+
"@wordpress/icons": "^9.26.1",
|
|
39
|
+
"@wordpress/notices": "^4.3.1",
|
|
40
|
+
"@wordpress/url": "^3.36.1"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"react": "^18.0.0",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"publishConfig": {
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "ce5639111c30763dbdf07f40eeb136ea6030ecf1"
|
|
50
50
|
}
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
TextControl,
|
|
15
15
|
__experimentalHStack as HStack,
|
|
16
16
|
__experimentalVStack as VStack,
|
|
17
|
+
ToggleControl,
|
|
17
18
|
} from '@wordpress/components';
|
|
18
19
|
import { symbol } from '@wordpress/icons';
|
|
19
20
|
import { useDispatch, useSelect } from '@wordpress/data';
|
|
@@ -38,6 +39,7 @@ export default function ReusableBlockConvertButton( {
|
|
|
38
39
|
clientIds,
|
|
39
40
|
rootClientId,
|
|
40
41
|
} ) {
|
|
42
|
+
const [ syncType, setSyncType ] = useState( 'unsynced' );
|
|
41
43
|
const [ isModalOpen, setIsModalOpen ] = useState( false );
|
|
42
44
|
const [ title, setTitle ] = useState( '' );
|
|
43
45
|
const canConvert = useSelect(
|
|
@@ -77,7 +79,7 @@ export default function ReusableBlockConvertButton( {
|
|
|
77
79
|
|
|
78
80
|
return _canConvert;
|
|
79
81
|
},
|
|
80
|
-
[ clientIds ]
|
|
82
|
+
[ clientIds, rootClientId ]
|
|
81
83
|
);
|
|
82
84
|
|
|
83
85
|
const { __experimentalConvertBlocksToReusable: convertBlocksToReusable } =
|
|
@@ -88,17 +90,32 @@ export default function ReusableBlockConvertButton( {
|
|
|
88
90
|
const onConvert = useCallback(
|
|
89
91
|
async function ( reusableBlockTitle ) {
|
|
90
92
|
try {
|
|
91
|
-
await convertBlocksToReusable(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
await convertBlocksToReusable(
|
|
94
|
+
clientIds,
|
|
95
|
+
reusableBlockTitle,
|
|
96
|
+
syncType
|
|
97
|
+
);
|
|
98
|
+
createSuccessNotice(
|
|
99
|
+
syncType === 'fully'
|
|
100
|
+
? __( 'Synced Pattern created.' )
|
|
101
|
+
: __( 'Unsynced Pattern created.' ),
|
|
102
|
+
{
|
|
103
|
+
type: 'snackbar',
|
|
104
|
+
}
|
|
105
|
+
);
|
|
95
106
|
} catch ( error ) {
|
|
96
107
|
createErrorNotice( error.message, {
|
|
97
108
|
type: 'snackbar',
|
|
98
109
|
} );
|
|
99
110
|
}
|
|
100
111
|
},
|
|
101
|
-
[
|
|
112
|
+
[
|
|
113
|
+
convertBlocksToReusable,
|
|
114
|
+
clientIds,
|
|
115
|
+
syncType,
|
|
116
|
+
createSuccessNotice,
|
|
117
|
+
createErrorNotice,
|
|
118
|
+
]
|
|
102
119
|
);
|
|
103
120
|
|
|
104
121
|
if ( ! canConvert ) {
|
|
@@ -111,15 +128,13 @@ export default function ReusableBlockConvertButton( {
|
|
|
111
128
|
<>
|
|
112
129
|
<MenuItem
|
|
113
130
|
icon={ symbol }
|
|
114
|
-
onClick={ () =>
|
|
115
|
-
setIsModalOpen( true );
|
|
116
|
-
} }
|
|
131
|
+
onClick={ () => setIsModalOpen( true ) }
|
|
117
132
|
>
|
|
118
|
-
{ __( 'Create
|
|
133
|
+
{ __( 'Create pattern' ) }
|
|
119
134
|
</MenuItem>
|
|
120
135
|
{ isModalOpen && (
|
|
121
136
|
<Modal
|
|
122
|
-
title={ __( 'Create
|
|
137
|
+
title={ __( 'Create pattern' ) }
|
|
123
138
|
onRequestClose={ () => {
|
|
124
139
|
setIsModalOpen( false );
|
|
125
140
|
setTitle( '' );
|
|
@@ -142,6 +157,23 @@ export default function ReusableBlockConvertButton( {
|
|
|
142
157
|
value={ title }
|
|
143
158
|
onChange={ setTitle }
|
|
144
159
|
/>
|
|
160
|
+
|
|
161
|
+
<ToggleControl
|
|
162
|
+
label={ __(
|
|
163
|
+
'Keep all pattern instances in sync'
|
|
164
|
+
) }
|
|
165
|
+
help={ __(
|
|
166
|
+
'Editing the original pattern will also update anywhere the pattern is used.'
|
|
167
|
+
) }
|
|
168
|
+
checked={ syncType === 'fully' }
|
|
169
|
+
onChange={ () => {
|
|
170
|
+
setSyncType(
|
|
171
|
+
syncType === 'fully'
|
|
172
|
+
? 'unsynced'
|
|
173
|
+
: 'fully'
|
|
174
|
+
);
|
|
175
|
+
} }
|
|
176
|
+
/>
|
|
145
177
|
<HStack justify="right">
|
|
146
178
|
<Button
|
|
147
179
|
variant="tertiary"
|
|
@@ -53,7 +53,7 @@ function ReusableBlocksManageButton( { clientId } ) {
|
|
|
53
53
|
<MenuItem
|
|
54
54
|
href={ addQueryArgs( 'edit.php', { post_type: 'wp_block' } ) }
|
|
55
55
|
>
|
|
56
|
-
{ __( 'Manage
|
|
56
|
+
{ __( 'Manage Patterns' ) }
|
|
57
57
|
</MenuItem>
|
|
58
58
|
{ canRemove && (
|
|
59
59
|
<MenuItem onClick={ () => convertBlockToStatic( clientId ) }>
|
package/src/store/actions.js
CHANGED
|
@@ -40,28 +40,41 @@ export const __experimentalConvertBlockToStatic =
|
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
|
-
* Returns a generator converting one or more static blocks into a
|
|
43
|
+
* Returns a generator converting one or more static blocks into a pattern.
|
|
44
44
|
*
|
|
45
|
-
* @param {string[]}
|
|
46
|
-
* @param {string}
|
|
45
|
+
* @param {string[]} clientIds The client IDs of the block to detach.
|
|
46
|
+
* @param {string} title Pattern title.
|
|
47
|
+
* @param {'fully'|'unsynced'} syncType They way block is synced, current 'fully' and 'unsynced'.
|
|
47
48
|
*/
|
|
48
49
|
export const __experimentalConvertBlocksToReusable =
|
|
49
|
-
( clientIds, title ) =>
|
|
50
|
+
( clientIds, title, syncType ) =>
|
|
50
51
|
async ( { registry, dispatch } ) => {
|
|
52
|
+
const meta =
|
|
53
|
+
syncType === 'unsynced'
|
|
54
|
+
? {
|
|
55
|
+
sync_status: syncType,
|
|
56
|
+
}
|
|
57
|
+
: undefined;
|
|
58
|
+
|
|
51
59
|
const reusableBlock = {
|
|
52
|
-
title: title || __( 'Untitled
|
|
60
|
+
title: title || __( 'Untitled Pattern block' ),
|
|
53
61
|
content: serialize(
|
|
54
62
|
registry
|
|
55
63
|
.select( blockEditorStore )
|
|
56
64
|
.getBlocksByClientId( clientIds )
|
|
57
65
|
),
|
|
58
66
|
status: 'publish',
|
|
67
|
+
meta,
|
|
59
68
|
};
|
|
60
69
|
|
|
61
70
|
const updatedRecord = await registry
|
|
62
71
|
.dispatch( 'core' )
|
|
63
72
|
.saveEntityRecord( 'postType', 'wp_block', reusableBlock );
|
|
64
73
|
|
|
74
|
+
if ( syncType === 'unsynced' ) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
65
78
|
const newBlock = createBlock( 'core/block', {
|
|
66
79
|
ref: updatedRecord.id,
|
|
67
80
|
} );
|