@wordpress/block-library 8.12.12 → 8.12.14

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.
@@ -11,9 +11,9 @@ import { v4 as createId } from 'uuid';
11
11
  import { __ } from '@wordpress/i18n';
12
12
  import { formatListNumbered as icon } from '@wordpress/icons';
13
13
  import { insertObject } from '@wordpress/rich-text';
14
- import { RichTextToolbarButton, store as blockEditorStore } from '@wordpress/block-editor';
14
+ import { RichTextToolbarButton, store as blockEditorStore, privateApis } from '@wordpress/block-editor';
15
15
  import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
16
- import { createBlock } from '@wordpress/blocks';
16
+ import { createBlock, store as blocksStore } from '@wordpress/blocks';
17
17
  /**
18
18
  * Internal dependencies
19
19
  */
@@ -37,7 +37,13 @@ const {
37
37
  },
38
38
  style: "wp-block-footnotes"
39
39
  };
40
+ import { unlock } from '../lock-unlock';
41
+ const {
42
+ usesContextKey
43
+ } = unlock(privateApis);
40
44
  export const formatName = 'core/footnote';
45
+ const POST_CONTENT_BLOCK_NAME = 'core/post-content';
46
+ const SYNCED_PATTERN_BLOCK_NAME = 'core/block';
41
47
  export const format = {
42
48
  title: __('Footnote'),
43
49
  tagName: 'sup',
@@ -46,23 +52,57 @@ export const format = {
46
52
  'data-fn': 'data-fn'
47
53
  },
48
54
  contentEditable: false,
55
+ [usesContextKey]: ['postType'],
49
56
  edit: function Edit({
50
57
  value,
51
58
  onChange,
52
- isObjectActive
59
+ isObjectActive,
60
+ context: {
61
+ postType
62
+ }
53
63
  }) {
54
64
  const registry = useRegistry();
55
65
  const {
56
66
  getSelectedBlockClientId,
67
+ getBlocks,
57
68
  getBlockRootClientId,
58
69
  getBlockName,
59
- getBlocks
70
+ getBlockParentsByBlockName
60
71
  } = useSelect(blockEditorStore);
72
+ const footnotesBlockType = useSelect(select => select(blocksStore).getBlockType(name));
73
+ /*
74
+ * This useSelect exists because we need to use its return value
75
+ * outside the event callback.
76
+ */
77
+
78
+ const isBlockWithinPattern = useSelect(select => {
79
+ const {
80
+ getBlockParentsByBlockName: _getBlockParentsByBlockName,
81
+ getSelectedBlockClientId: _getSelectedBlockClientId
82
+ } = select(blockEditorStore);
83
+
84
+ const parentCoreBlocks = _getBlockParentsByBlockName(_getSelectedBlockClientId(), SYNCED_PATTERN_BLOCK_NAME);
85
+
86
+ return parentCoreBlocks && parentCoreBlocks.length > 0;
87
+ }, []);
61
88
  const {
62
89
  selectionChange,
63
90
  insertBlock
64
91
  } = useDispatch(blockEditorStore);
65
92
 
93
+ if (!footnotesBlockType) {
94
+ return null;
95
+ }
96
+
97
+ if (postType !== 'post' && postType !== 'page') {
98
+ return null;
99
+ } // Checks if the selected block lives within a pattern.
100
+
101
+
102
+ if (isBlockWithinPattern) {
103
+ return null;
104
+ }
105
+
66
106
  function onClick() {
67
107
  registry.batch(() => {
68
108
  let id;
@@ -81,12 +121,22 @@ export const format = {
81
121
  }, value.end, value.end);
82
122
  newValue.start = newValue.end - 1;
83
123
  onChange(newValue);
84
- } // BFS search to find the first footnote block.
124
+ }
125
+
126
+ const selectedClientId = getSelectedBlockClientId();
127
+ /*
128
+ * Attempts to find a common parent post content block.
129
+ * This allows for locating blocks within a page edited in the site editor.
130
+ */
131
+
132
+ const parentPostContent = getBlockParentsByBlockName(selectedClientId, POST_CONTENT_BLOCK_NAME); // When called with a post content block, getBlocks will return
133
+ // the block with controlled inner blocks included.
85
134
 
135
+ const blocks = parentPostContent.length ? getBlocks(parentPostContent[0]) : getBlocks(); // BFS search to find the first footnote block.
86
136
 
87
137
  let fnBlock = null;
88
138
  {
89
- const queue = [...getBlocks()];
139
+ const queue = [...blocks];
90
140
 
91
141
  while (queue.length) {
92
142
  const block = queue.shift();
@@ -103,10 +153,9 @@ export const format = {
103
153
  // insert it at the bottom.
104
154
 
105
155
  if (!fnBlock) {
106
- const clientId = getSelectedBlockClientId();
107
- let rootClientId = getBlockRootClientId(clientId);
156
+ let rootClientId = getBlockRootClientId(selectedClientId);
108
157
 
109
- while (rootClientId && getBlockName(rootClientId) !== 'core/post-content') {
158
+ while (rootClientId && getBlockName(rootClientId) !== POST_CONTENT_BLOCK_NAME) {
110
159
  rootClientId = getBlockRootClientId(rootClientId);
111
160
  }
112
161
 
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/footnotes/format.js"],"names":["v4","createId","__","formatListNumbered","icon","insertObject","RichTextToolbarButton","store","blockEditorStore","useSelect","useDispatch","useRegistry","createBlock","formatName","format","title","tagName","className","attributes","contentEditable","edit","Edit","value","onChange","isObjectActive","registry","getSelectedBlockClientId","getBlockRootClientId","getBlockName","getBlocks","selectionChange","insertBlock","onClick","batch","id","object","replacements","start","newValue","type","innerHTML","end","fnBlock","queue","length","block","shift","name","push","innerBlocks","clientId","rootClientId","undefined"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { v4 as createId } from 'uuid';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { formatListNumbered as icon } from '@wordpress/icons';\nimport { insertObject } from '@wordpress/rich-text';\nimport {\n\tRichTextToolbarButton,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport { useSelect, useDispatch, useRegistry } from '@wordpress/data';\nimport { createBlock } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { name } from './block.json';\n\nexport const formatName = 'core/footnote';\nexport const format = {\n\ttitle: __( 'Footnote' ),\n\ttagName: 'sup',\n\tclassName: 'fn',\n\tattributes: {\n\t\t'data-fn': 'data-fn',\n\t},\n\tcontentEditable: false,\n\tedit: function Edit( { value, onChange, isObjectActive } ) {\n\t\tconst registry = useRegistry();\n\t\tconst {\n\t\t\tgetSelectedBlockClientId,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetBlockName,\n\t\t\tgetBlocks,\n\t\t} = useSelect( blockEditorStore );\n\t\tconst { selectionChange, insertBlock } =\n\t\t\tuseDispatch( blockEditorStore );\n\n\t\tfunction onClick() {\n\t\t\tregistry.batch( () => {\n\t\t\t\tlet id;\n\t\t\t\tif ( isObjectActive ) {\n\t\t\t\t\tconst object = value.replacements[ value.start ];\n\t\t\t\t\tid = object?.attributes?.[ 'data-fn' ];\n\t\t\t\t} else {\n\t\t\t\t\tid = createId();\n\t\t\t\t\tconst newValue = insertObject(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: formatName,\n\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t'data-fn': id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tinnerHTML: `<a href=\"#${ id }\" id=\"${ id }-link\">*</a>`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvalue.end,\n\t\t\t\t\t\tvalue.end\n\t\t\t\t\t);\n\t\t\t\t\tnewValue.start = newValue.end - 1;\n\t\t\t\t\tonChange( newValue );\n\t\t\t\t}\n\n\t\t\t\t// BFS search to find the first footnote block.\n\t\t\t\tlet fnBlock = null;\n\t\t\t\t{\n\t\t\t\t\tconst queue = [ ...getBlocks() ];\n\t\t\t\t\twhile ( queue.length ) {\n\t\t\t\t\t\tconst block = queue.shift();\n\t\t\t\t\t\tif ( block.name === name ) {\n\t\t\t\t\t\t\tfnBlock = block;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqueue.push( ...block.innerBlocks );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Maybe this should all also be moved to the entity provider.\n\t\t\t\t// When there is no footnotes block in the post, create one and\n\t\t\t\t// insert it at the bottom.\n\t\t\t\tif ( ! fnBlock ) {\n\t\t\t\t\tconst clientId = getSelectedBlockClientId();\n\t\t\t\t\tlet rootClientId = getBlockRootClientId( clientId );\n\n\t\t\t\t\twhile (\n\t\t\t\t\t\trootClientId &&\n\t\t\t\t\t\tgetBlockName( rootClientId ) !== 'core/post-content'\n\t\t\t\t\t) {\n\t\t\t\t\t\trootClientId = getBlockRootClientId( rootClientId );\n\t\t\t\t\t}\n\n\t\t\t\t\tfnBlock = createBlock( name );\n\n\t\t\t\t\tinsertBlock( fnBlock, undefined, rootClientId );\n\t\t\t\t}\n\n\t\t\t\tselectionChange( fnBlock.clientId, id, 0, 0 );\n\t\t\t} );\n\t\t}\n\n\t\treturn (\n\t\t\t<RichTextToolbarButton\n\t\t\t\ticon={ icon }\n\t\t\t\ttitle={ __( 'Footnote' ) }\n\t\t\t\tonClick={ onClick }\n\t\t\t\tisActive={ isObjectActive }\n\t\t\t/>\n\t\t);\n\t},\n};\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/footnotes/format.js"],"names":["v4","createId","__","formatListNumbered","icon","insertObject","RichTextToolbarButton","store","blockEditorStore","privateApis","useSelect","useDispatch","useRegistry","createBlock","blocksStore","unlock","usesContextKey","formatName","POST_CONTENT_BLOCK_NAME","SYNCED_PATTERN_BLOCK_NAME","format","title","tagName","className","attributes","contentEditable","edit","Edit","value","onChange","isObjectActive","context","postType","registry","getSelectedBlockClientId","getBlocks","getBlockRootClientId","getBlockName","getBlockParentsByBlockName","footnotesBlockType","select","getBlockType","name","isBlockWithinPattern","_getBlockParentsByBlockName","_getSelectedBlockClientId","parentCoreBlocks","length","selectionChange","insertBlock","onClick","batch","id","object","replacements","start","newValue","type","innerHTML","end","selectedClientId","parentPostContent","blocks","fnBlock","queue","block","shift","push","innerBlocks","rootClientId","undefined","clientId"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { v4 as createId } from 'uuid';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { formatListNumbered as icon } from '@wordpress/icons';\nimport { insertObject } from '@wordpress/rich-text';\nimport {\n\tRichTextToolbarButton,\n\tstore as blockEditorStore,\n\tprivateApis,\n} from '@wordpress/block-editor';\nimport { useSelect, useDispatch, useRegistry } from '@wordpress/data';\nimport { createBlock, store as blocksStore } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { name } from './block.json';\nimport { unlock } from '../lock-unlock';\n\nconst { usesContextKey } = unlock( privateApis );\n\nexport const formatName = 'core/footnote';\n\nconst POST_CONTENT_BLOCK_NAME = 'core/post-content';\nconst SYNCED_PATTERN_BLOCK_NAME = 'core/block';\n\nexport const format = {\n\ttitle: __( 'Footnote' ),\n\ttagName: 'sup',\n\tclassName: 'fn',\n\tattributes: {\n\t\t'data-fn': 'data-fn',\n\t},\n\tcontentEditable: false,\n\t[ usesContextKey ]: [ 'postType' ],\n\tedit: function Edit( {\n\t\tvalue,\n\t\tonChange,\n\t\tisObjectActive,\n\t\tcontext: { postType },\n\t} ) {\n\t\tconst registry = useRegistry();\n\t\tconst {\n\t\t\tgetSelectedBlockClientId,\n\t\t\tgetBlocks,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetBlockName,\n\t\t\tgetBlockParentsByBlockName,\n\t\t} = useSelect( blockEditorStore );\n\t\tconst footnotesBlockType = useSelect( ( select ) =>\n\t\t\tselect( blocksStore ).getBlockType( name )\n\t\t);\n\t\t/*\n\t\t * This useSelect exists because we need to use its return value\n\t\t * outside the event callback.\n\t\t */\n\t\tconst isBlockWithinPattern = useSelect( ( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockParentsByBlockName: _getBlockParentsByBlockName,\n\t\t\t\tgetSelectedBlockClientId: _getSelectedBlockClientId,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst parentCoreBlocks = _getBlockParentsByBlockName(\n\t\t\t\t_getSelectedBlockClientId(),\n\t\t\t\tSYNCED_PATTERN_BLOCK_NAME\n\t\t\t);\n\t\t\treturn parentCoreBlocks && parentCoreBlocks.length > 0;\n\t\t}, [] );\n\n\t\tconst { selectionChange, insertBlock } =\n\t\t\tuseDispatch( blockEditorStore );\n\n\t\tif ( ! footnotesBlockType ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( postType !== 'post' && postType !== 'page' ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Checks if the selected block lives within a pattern.\n\t\tif ( isBlockWithinPattern ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfunction onClick() {\n\t\t\tregistry.batch( () => {\n\t\t\t\tlet id;\n\t\t\t\tif ( isObjectActive ) {\n\t\t\t\t\tconst object = value.replacements[ value.start ];\n\t\t\t\t\tid = object?.attributes?.[ 'data-fn' ];\n\t\t\t\t} else {\n\t\t\t\t\tid = createId();\n\t\t\t\t\tconst newValue = insertObject(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: formatName,\n\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t'data-fn': id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tinnerHTML: `<a href=\"#${ id }\" id=\"${ id }-link\">*</a>`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvalue.end,\n\t\t\t\t\t\tvalue.end\n\t\t\t\t\t);\n\t\t\t\t\tnewValue.start = newValue.end - 1;\n\t\t\t\t\tonChange( newValue );\n\t\t\t\t}\n\n\t\t\t\tconst selectedClientId = getSelectedBlockClientId();\n\n\t\t\t\t/*\n\t\t\t\t * Attempts to find a common parent post content block.\n\t\t\t\t * This allows for locating blocks within a page edited in the site editor.\n\t\t\t\t */\n\t\t\t\tconst parentPostContent = getBlockParentsByBlockName(\n\t\t\t\t\tselectedClientId,\n\t\t\t\t\tPOST_CONTENT_BLOCK_NAME\n\t\t\t\t);\n\n\t\t\t\t// When called with a post content block, getBlocks will return\n\t\t\t\t// the block with controlled inner blocks included.\n\t\t\t\tconst blocks = parentPostContent.length\n\t\t\t\t\t? getBlocks( parentPostContent[ 0 ] )\n\t\t\t\t\t: getBlocks();\n\n\t\t\t\t// BFS search to find the first footnote block.\n\t\t\t\tlet fnBlock = null;\n\t\t\t\t{\n\t\t\t\t\tconst queue = [ ...blocks ];\n\t\t\t\t\twhile ( queue.length ) {\n\t\t\t\t\t\tconst block = queue.shift();\n\t\t\t\t\t\tif ( block.name === name ) {\n\t\t\t\t\t\t\tfnBlock = block;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqueue.push( ...block.innerBlocks );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Maybe this should all also be moved to the entity provider.\n\t\t\t\t// When there is no footnotes block in the post, create one and\n\t\t\t\t// insert it at the bottom.\n\t\t\t\tif ( ! fnBlock ) {\n\t\t\t\t\tlet rootClientId = getBlockRootClientId( selectedClientId );\n\n\t\t\t\t\twhile (\n\t\t\t\t\t\trootClientId &&\n\t\t\t\t\t\tgetBlockName( rootClientId ) !== POST_CONTENT_BLOCK_NAME\n\t\t\t\t\t) {\n\t\t\t\t\t\trootClientId = getBlockRootClientId( rootClientId );\n\t\t\t\t\t}\n\n\t\t\t\t\tfnBlock = createBlock( name );\n\n\t\t\t\t\tinsertBlock( fnBlock, undefined, rootClientId );\n\t\t\t\t}\n\n\t\t\t\tselectionChange( fnBlock.clientId, id, 0, 0 );\n\t\t\t} );\n\t\t}\n\n\t\treturn (\n\t\t\t<RichTextToolbarButton\n\t\t\t\ticon={ icon }\n\t\t\t\ttitle={ __( 'Footnote' ) }\n\t\t\t\tonClick={ onClick }\n\t\t\t\tisActive={ isObjectActive }\n\t\t\t/>\n\t\t);\n\t},\n};\n"]}
@@ -34,8 +34,7 @@ export { metadata, name };
34
34
  export const settings = {
35
35
  icon,
36
36
  edit
37
- }; // Would be good to remove the format and HoR if the block is unregistered.
38
-
37
+ };
39
38
  registerFormatType(formatName, format);
40
39
  export const init = () => {
41
40
  initBlock({
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/footnotes/index.js"],"names":["formatListNumbered","icon","registerFormatType","initBlock","edit","formatName","format","name","metadata","settings","init"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,kBAAkB,IAAIC,IAA/B,QAA2C,kBAA3C;AACA,SAASC,kBAAT,QAAmC,sBAAnC;AAEA;AACA;AACA;;AACA,OAAOC,SAAP,MAAsB,qBAAtB;AACA,OAAOC,IAAP,MAAiB,QAAjB;;;;;;;;;;;;;;;;;;AAEA,SAASC,UAAT,EAAqBC,MAArB,QAAmC,UAAnC;AAEA,MAAM;AAAEC,EAAAA;AAAF,IAAWC,QAAjB;AAEA,SAASA,QAAT,EAAmBD,IAAnB;AAEA,OAAO,MAAME,QAAQ,GAAG;AACvBR,EAAAA,IADuB;AAEvBG,EAAAA;AAFuB,CAAjB,C,CAKP;;AACAF,kBAAkB,CAAEG,UAAF,EAAcC,MAAd,CAAlB;AAEA,OAAO,MAAMI,IAAI,GAAG,MAAM;AACzBP,EAAAA,SAAS,CAAE;AAAEI,IAAAA,IAAF;AAAQC,IAAAA,QAAR;AAAkBC,IAAAA;AAAlB,GAAF,CAAT;AACA,CAFM","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { formatListNumbered as icon } from '@wordpress/icons';\nimport { registerFormatType } from '@wordpress/rich-text';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport edit from './edit';\nimport metadata from './block.json';\nimport { formatName, format } from './format';\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon,\n\tedit,\n};\n\n// Would be good to remove the format and HoR if the block is unregistered.\nregisterFormatType( formatName, format );\n\nexport const init = () => {\n\tinitBlock( { name, metadata, settings } );\n};\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/footnotes/index.js"],"names":["formatListNumbered","icon","registerFormatType","initBlock","edit","formatName","format","name","metadata","settings","init"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,kBAAkB,IAAIC,IAA/B,QAA2C,kBAA3C;AACA,SAASC,kBAAT,QAAmC,sBAAnC;AAEA;AACA;AACA;;AACA,OAAOC,SAAP,MAAsB,qBAAtB;AACA,OAAOC,IAAP,MAAiB,QAAjB;;;;;;;;;;;;;;;;;;AAEA,SAASC,UAAT,EAAqBC,MAArB,QAAmC,UAAnC;AAEA,MAAM;AAAEC,EAAAA;AAAF,IAAWC,QAAjB;AAEA,SAASA,QAAT,EAAmBD,IAAnB;AAEA,OAAO,MAAME,QAAQ,GAAG;AACvBR,EAAAA,IADuB;AAEvBG,EAAAA;AAFuB,CAAjB;AAKPF,kBAAkB,CAAEG,UAAF,EAAcC,MAAd,CAAlB;AAEA,OAAO,MAAMI,IAAI,GAAG,MAAM;AACzBP,EAAAA,SAAS,CAAE;AAAEI,IAAAA,IAAF;AAAQC,IAAAA,QAAR;AAAkBC,IAAAA;AAAlB,GAAF,CAAT;AACA,CAFM","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { formatListNumbered as icon } from '@wordpress/icons';\nimport { registerFormatType } from '@wordpress/rich-text';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport edit from './edit';\nimport metadata from './block.json';\nimport { formatName, format } from './format';\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon,\n\tedit,\n};\n\nregisterFormatType( formatName, format );\n\nexport const init = () => {\n\tinitBlock( { name, metadata, settings } );\n};\n"]}
@@ -449,8 +449,8 @@ export default function Image({
449
449
  ref: imageRef,
450
450
  className: borderProps.className,
451
451
  style: {
452
- width: width && height || aspectRatio ? '100%' : 'inherit',
453
- height: width && height || aspectRatio ? '100%' : 'inherit',
452
+ width: width && height || aspectRatio ? '100%' : undefined,
453
+ height: width && height || aspectRatio ? '100%' : undefined,
454
454
  objectFit: scale,
455
455
  ...borderProps.style
456
456
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/image/image.js"],"names":["isBlobURL","ExternalLink","ResizableBox","Spinner","TextareaControl","TextControl","ToolbarButton","ToolbarGroup","__experimentalToolsPanel","ToolsPanel","__experimentalToolsPanelItem","ToolsPanelItem","__experimentalUseCustomUnits","useCustomUnits","useViewportMatch","usePrevious","useSelect","useDispatch","BlockControls","InspectorControls","RichText","__experimentalImageURLInputUI","ImageURLInputUI","MediaReplaceFlow","store","blockEditorStore","BlockAlignmentControl","__experimentalImageEditor","ImageEditor","__experimentalGetElementClassName","__experimentalUseBorderProps","useBorderProps","privateApis","blockEditorPrivateApis","useEffect","useMemo","useState","useRef","useCallback","__","_x","sprintf","isRTL","getFilename","createBlock","getDefaultBlockName","switchToBlockType","crop","overlayText","upload","caption","captionIcon","noticesStore","coreStore","unlock","createUpgradedEmbedBlock","useClientWidth","isExternalImage","MIN_SIZE","ALLOWED_MEDIA_TYPES","evalAspectRatio","DimensionsTool","ResolutionTool","scaleOptions","value","label","help","Image","temporaryURL","attributes","setAttributes","isSelected","insertBlocksAfter","onReplace","onSelectImage","onSelectURL","onUploadError","containerRef","context","clientId","blockEditingMode","url","alt","align","id","href","rel","linkClass","linkDestination","title","width","height","aspectRatio","scale","linkTarget","sizeSlug","imageRef","prevCaption","showCaption","setShowCaption","allowResize","getBlock","image","multiImageSelection","select","getMedia","getMultiSelectedBlockClientIds","getBlockName","multiSelectedClientIds","length","every","_clientId","canInsertCover","imageEditing","imageSizes","maxWidth","mediaUpload","getBlockRootClientId","getSettings","canInsertBlockType","rootClientId","settings","replaceBlocks","toggleSelection","createErrorNotice","createSuccessNotice","isLargeViewport","isWideAligned","includes","loadedNaturalWidth","loadedNaturalHeight","setLoadedNaturalSize","isEditingImage","setIsEditingImage","externalBlob","setExternalBlob","clientWidth","hasNonContentControls","isResizable","imageSizeOptions","filter","slug","media_details","sizes","source_url","map","name","canUploadMedia","window","fetch","then","response","blob","catch","captionRef","node","focus","naturalWidth","naturalHeight","current","undefined","complete","onResizeStart","onResizeStop","onImageError","embedBlock","onSetHref","props","onSetTitle","updateAlt","newAlt","updateImage","newSizeSlug","newUrl","uploadExternal","filesList","onFileChange","img","type","allowedTypes","onError","message","updateAlignment","nextAlign","extraUpdatedAttributes","canEditImage","allowCrop","switchToCover","dimensionsUnitsOptions","availableUnits","controls","link","newValue","parseInt","filename","defaultedAlt","borderProps","isRounded","className","event","target","objectFit","style","fallbackClientWidth","imageAttributes","ratio","currentWidth","currentHeight","minWidth","minHeight","maxWidthBuffer","showRightHandle","showLeftHandle","display","top","right","bottom","left","direction","elt","offsetWidth","offsetHeight","isEmpty"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { isBlobURL } from '@wordpress/blob';\nimport {\n\tExternalLink,\n\tResizableBox,\n\tSpinner,\n\tTextareaControl,\n\tTextControl,\n\tToolbarButton,\n\tToolbarGroup,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalUseCustomUnits as useCustomUnits,\n} from '@wordpress/components';\nimport { useViewportMatch, usePrevious } from '@wordpress/compose';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport {\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n\t__experimentalImageURLInputUI as ImageURLInputUI,\n\tMediaReplaceFlow,\n\tstore as blockEditorStore,\n\tBlockAlignmentControl,\n\t__experimentalImageEditor as ImageEditor,\n\t__experimentalGetElementClassName,\n\t__experimentalUseBorderProps as useBorderProps,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\nimport {\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseRef,\n\tuseCallback,\n} from '@wordpress/element';\nimport { __, _x, sprintf, isRTL } from '@wordpress/i18n';\nimport { getFilename } from '@wordpress/url';\nimport {\n\tcreateBlock,\n\tgetDefaultBlockName,\n\tswitchToBlockType,\n} from '@wordpress/blocks';\nimport {\n\tcrop,\n\toverlayText,\n\tupload,\n\tcaption as captionIcon,\n} from '@wordpress/icons';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\nimport { createUpgradedEmbedBlock } from '../embed/util';\nimport useClientWidth from './use-client-width';\nimport { isExternalImage } from './edit';\n\n/**\n * Module constants\n */\nimport { MIN_SIZE, ALLOWED_MEDIA_TYPES } from './constants';\nimport { evalAspectRatio } from './utils';\n\nconst { DimensionsTool, ResolutionTool } = unlock( blockEditorPrivateApis );\n\nconst scaleOptions = [\n\t{\n\t\tvalue: 'cover',\n\t\tlabel: _x( 'Cover', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Image covers the space evenly.' ),\n\t},\n\t{\n\t\tvalue: 'contain',\n\t\tlabel: _x( 'Contain', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Image is contained without distortion.' ),\n\t},\n];\n\nexport default function Image( {\n\ttemporaryURL,\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tinsertBlocksAfter,\n\tonReplace,\n\tonSelectImage,\n\tonSelectURL,\n\tonUploadError,\n\tcontainerRef,\n\tcontext,\n\tclientId,\n\tblockEditingMode,\n} ) {\n\tconst {\n\t\turl = '',\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\tid,\n\t\thref,\n\t\trel,\n\t\tlinkClass,\n\t\tlinkDestination,\n\t\ttitle,\n\t\twidth,\n\t\theight,\n\t\taspectRatio,\n\t\tscale,\n\t\tlinkTarget,\n\t\tsizeSlug,\n\t} = attributes;\n\tconst imageRef = useRef();\n\tconst prevCaption = usePrevious( caption );\n\tconst [ showCaption, setShowCaption ] = useState( !! caption );\n\tconst { allowResize = true } = context;\n\tconst { getBlock } = useSelect( blockEditorStore );\n\n\tconst { image, multiImageSelection } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getMedia } = select( coreStore );\n\t\t\tconst { getMultiSelectedBlockClientIds, getBlockName } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst multiSelectedClientIds = getMultiSelectedBlockClientIds();\n\t\t\treturn {\n\t\t\t\timage:\n\t\t\t\t\tid && isSelected\n\t\t\t\t\t\t? getMedia( id, { context: 'view' } )\n\t\t\t\t\t\t: null,\n\t\t\t\tmultiImageSelection:\n\t\t\t\t\tmultiSelectedClientIds.length &&\n\t\t\t\t\tmultiSelectedClientIds.every(\n\t\t\t\t\t\t( _clientId ) =>\n\t\t\t\t\t\t\tgetBlockName( _clientId ) === 'core/image'\n\t\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ id, isSelected ]\n\t);\n\tconst { canInsertCover, imageEditing, imageSizes, maxWidth, mediaUpload } =\n\t\tuseSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetBlockRootClientId,\n\t\t\t\t\tgetSettings,\n\t\t\t\t\tcanInsertBlockType,\n\t\t\t\t} = select( blockEditorStore );\n\n\t\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\t\tconst settings = getSettings();\n\n\t\t\t\treturn {\n\t\t\t\t\timageEditing: settings.imageEditing,\n\t\t\t\t\timageSizes: settings.imageSizes,\n\t\t\t\t\tmaxWidth: settings.maxWidth,\n\t\t\t\t\tmediaUpload: settings.mediaUpload,\n\t\t\t\t\tcanInsertCover: canInsertBlockType(\n\t\t\t\t\t\t'core/cover',\n\t\t\t\t\t\trootClientId\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\tconst { replaceBlocks, toggleSelection } = useDispatch( blockEditorStore );\n\tconst { createErrorNotice, createSuccessNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst isLargeViewport = useViewportMatch( 'medium' );\n\tconst isWideAligned = [ 'wide', 'full' ].includes( align );\n\tconst [\n\t\t{ loadedNaturalWidth, loadedNaturalHeight },\n\t\tsetLoadedNaturalSize,\n\t] = useState( {} );\n\tconst [ isEditingImage, setIsEditingImage ] = useState( false );\n\tconst [ externalBlob, setExternalBlob ] = useState();\n\tconst clientWidth = useClientWidth( containerRef, [ align ] );\n\tconst hasNonContentControls = blockEditingMode === 'default';\n\tconst isResizable =\n\t\tallowResize &&\n\t\thasNonContentControls &&\n\t\t! ( isWideAligned && isLargeViewport );\n\tconst imageSizeOptions = imageSizes\n\t\t.filter(\n\t\t\t( { slug } ) => image?.media_details?.sizes?.[ slug ]?.source_url\n\t\t)\n\t\t.map( ( { name, slug } ) => ( { value: slug, label: name } ) );\n\tconst canUploadMedia = !! mediaUpload;\n\n\t// If an image is externally hosted, try to fetch the image data. This may\n\t// fail if the image host doesn't allow CORS with the domain. If it works,\n\t// we can enable a button in the toolbar to upload the image.\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! isExternalImage( id, url ) ||\n\t\t\t! isSelected ||\n\t\t\t! canUploadMedia\n\t\t) {\n\t\t\tsetExternalBlob();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( externalBlob ) return;\n\n\t\twindow\n\t\t\t// Avoid cache, which seems to help avoid CORS problems.\n\t\t\t.fetch( url.includes( '?' ) ? url : url + '?' )\n\t\t\t.then( ( response ) => response.blob() )\n\t\t\t.then( ( blob ) => setExternalBlob( blob ) )\n\t\t\t// Do nothing, cannot upload.\n\t\t\t.catch( () => {} );\n\t}, [ id, url, isSelected, externalBlob, canUploadMedia ] );\n\n\t// We need to show the caption when changes come from\n\t// history navigation(undo/redo).\n\tuseEffect( () => {\n\t\tif ( caption && ! prevCaption ) {\n\t\t\tsetShowCaption( true );\n\t\t}\n\t}, [ caption, prevCaption ] );\n\n\t// Focus the caption when we click to add one.\n\tconst captionRef = useCallback(\n\t\t( node ) => {\n\t\t\tif ( node && ! caption ) {\n\t\t\t\tnode.focus();\n\t\t\t}\n\t\t},\n\t\t[ caption ]\n\t);\n\n\t// Get naturalWidth and naturalHeight from image ref, and fall back to loaded natural\n\t// width and height. This resolves an issue in Safari where the loaded natural\n\t// width and height is otherwise lost when switching between alignments.\n\t// See: https://github.com/WordPress/gutenberg/pull/37210.\n\tconst { naturalWidth, naturalHeight } = useMemo( () => {\n\t\treturn {\n\t\t\tnaturalWidth:\n\t\t\t\timageRef.current?.naturalWidth ||\n\t\t\t\tloadedNaturalWidth ||\n\t\t\t\tundefined,\n\t\t\tnaturalHeight:\n\t\t\t\timageRef.current?.naturalHeight ||\n\t\t\t\tloadedNaturalHeight ||\n\t\t\t\tundefined,\n\t\t};\n\t}, [\n\t\tloadedNaturalWidth,\n\t\tloadedNaturalHeight,\n\t\timageRef.current?.complete,\n\t] );\n\n\tfunction onResizeStart() {\n\t\ttoggleSelection( false );\n\t}\n\n\tfunction onResizeStop() {\n\t\ttoggleSelection( true );\n\t}\n\n\tfunction onImageError() {\n\t\t// Check if there's an embed block that handles this URL, e.g., instagram URL.\n\t\t// See: https://github.com/WordPress/gutenberg/pull/11472\n\t\tconst embedBlock = createUpgradedEmbedBlock( { attributes: { url } } );\n\n\t\tif ( undefined !== embedBlock ) {\n\t\t\tonReplace( embedBlock );\n\t\t}\n\t}\n\n\tfunction onSetHref( props ) {\n\t\tsetAttributes( props );\n\t}\n\n\tfunction onSetTitle( value ) {\n\t\t// This is the HTML title attribute, separate from the media object\n\t\t// title.\n\t\tsetAttributes( { title: value } );\n\t}\n\n\tfunction updateAlt( newAlt ) {\n\t\tsetAttributes( { alt: newAlt } );\n\t}\n\n\tfunction updateImage( newSizeSlug ) {\n\t\tconst newUrl = image?.media_details?.sizes?.[ newSizeSlug ]?.source_url;\n\t\tif ( ! newUrl ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tsetAttributes( {\n\t\t\turl: newUrl,\n\t\t\tsizeSlug: newSizeSlug,\n\t\t} );\n\t}\n\n\tfunction uploadExternal() {\n\t\tmediaUpload( {\n\t\t\tfilesList: [ externalBlob ],\n\t\t\tonFileChange( [ img ] ) {\n\t\t\t\tonSelectImage( img );\n\n\t\t\t\tif ( isBlobURL( img.url ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetExternalBlob();\n\t\t\t\tcreateSuccessNotice( __( 'Image uploaded.' ), {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t} );\n\t\t\t},\n\t\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\t\tonError( message ) {\n\t\t\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t\t\t},\n\t\t} );\n\t}\n\n\tfunction updateAlignment( nextAlign ) {\n\t\tconst extraUpdatedAttributes = [ 'wide', 'full' ].includes( nextAlign )\n\t\t\t? { width: undefined, height: undefined }\n\t\t\t: {};\n\t\tsetAttributes( {\n\t\t\t...extraUpdatedAttributes,\n\t\t\talign: nextAlign,\n\t\t} );\n\t}\n\n\tuseEffect( () => {\n\t\tif ( ! isSelected ) {\n\t\t\tsetIsEditingImage( false );\n\t\t\tif ( ! caption ) {\n\t\t\t\tsetShowCaption( false );\n\t\t\t}\n\t\t}\n\t}, [ isSelected, caption ] );\n\n\tconst canEditImage = id && naturalWidth && naturalHeight && imageEditing;\n\tconst allowCrop = ! multiImageSelection && canEditImage && ! isEditingImage;\n\n\tfunction switchToCover() {\n\t\treplaceBlocks(\n\t\t\tclientId,\n\t\t\tswitchToBlockType( getBlock( clientId ), 'core/cover' )\n\t\t);\n\t}\n\n\t// TODO: Can allow more units after figuring out how they should interact\n\t// with the ResizableBox and ImageEditor components. Calculations later on\n\t// for those components are currently assuming px units.\n\tconst dimensionsUnitsOptions = useCustomUnits( {\n\t\tavailableUnits: [ 'px' ],\n\t} );\n\n\tconst controls = (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<BlockAlignmentControl\n\t\t\t\t\t\tvalue={ align }\n\t\t\t\t\t\tonChange={ updateAlignment }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tsetShowCaption( ! showCaption );\n\t\t\t\t\t\t\tif ( showCaption && caption ) {\n\t\t\t\t\t\t\t\tsetAttributes( { caption: undefined } );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} }\n\t\t\t\t\t\ticon={ captionIcon }\n\t\t\t\t\t\tisPressed={ showCaption }\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\tshowCaption\n\t\t\t\t\t\t\t\t? __( 'Remove caption' )\n\t\t\t\t\t\t\t\t: __( 'Add caption' )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t\t<ImageURLInputUI\n\t\t\t\t\t\turl={ href || '' }\n\t\t\t\t\t\tonChangeUrl={ onSetHref }\n\t\t\t\t\t\tlinkDestination={ linkDestination }\n\t\t\t\t\t\tmediaUrl={ ( image && image.source_url ) || url }\n\t\t\t\t\t\tmediaLink={ image && image.link }\n\t\t\t\t\t\tlinkTarget={ linkTarget }\n\t\t\t\t\t\tlinkClass={ linkClass }\n\t\t\t\t\t\trel={ rel }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ allowCrop && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => setIsEditingImage( true ) }\n\t\t\t\t\t\ticon={ crop }\n\t\t\t\t\t\tlabel={ __( 'Crop' ) }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && canInsertCover && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\ticon={ overlayText }\n\t\t\t\t\t\tlabel={ __( 'Add text over image' ) }\n\t\t\t\t\t\tonClick={ switchToCover }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</BlockControls>\n\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t<BlockControls group=\"other\">\n\t\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\t\tmediaId={ id }\n\t\t\t\t\t\tmediaURL={ url }\n\t\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\t\tonSelect={ onSelectImage }\n\t\t\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ ! multiImageSelection && externalBlob && (\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ uploadExternal }\n\t\t\t\t\t\t\ticon={ upload }\n\t\t\t\t\t\t\tlabel={ __( 'Upload external image' ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t<InspectorControls>\n\t\t\t\t<ToolsPanel\n\t\t\t\t\tlabel={ __( 'Settings' ) }\n\t\t\t\t\tresetAll={ () =>\n\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\twidth: undefined,\n\t\t\t\t\t\t\theight: undefined,\n\t\t\t\t\t\t\tscale: undefined,\n\t\t\t\t\t\t\taspectRatio: undefined,\n\t\t\t\t\t\t} )\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{ ! multiImageSelection && (\n\t\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\tisShownByDefault={ true }\n\t\t\t\t\t\t\thasValue={ () => alt !== '' }\n\t\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\t\tsetAttributes( { alt: undefined } )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<TextareaControl\n\t\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\t\tvalue={ alt }\n\t\t\t\t\t\t\t\tonChange={ updateAlt }\n\t\t\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/WAI/tutorials/images/decision-tree\">\n\t\t\t\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t\t\t\t'Describe the purpose of the image.'\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t{ __( 'Leave empty if decorative.' ) }\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t) }\n\t\t\t\t\t<DimensionsTool\n\t\t\t\t\t\tvalue={ {\n\t\t\t\t\t\t\twidth: width && `${ width }px`,\n\t\t\t\t\t\t\theight: height && `${ height }px`,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\taspectRatio,\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonChange={ ( newValue ) => {\n\t\t\t\t\t\t\t// Rebuilding the object forces setting `undefined`\n\t\t\t\t\t\t\t// for values that are removed since setAttributes\n\t\t\t\t\t\t\t// doesn't do anything with keys that aren't set.\n\t\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\t\twidth:\n\t\t\t\t\t\t\t\t\tnewValue.width &&\n\t\t\t\t\t\t\t\t\tparseInt( newValue.width, 10 ),\n\t\t\t\t\t\t\t\theight:\n\t\t\t\t\t\t\t\t\tnewValue.height &&\n\t\t\t\t\t\t\t\t\tparseInt( newValue.height, 10 ),\n\t\t\t\t\t\t\t\tscale: newValue.scale,\n\t\t\t\t\t\t\t\taspectRatio: newValue.aspectRatio,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tdefaultScale=\"cover\"\n\t\t\t\t\t\tdefaultAspectRatio=\"auto\"\n\t\t\t\t\t\tscaleOptions={ scaleOptions }\n\t\t\t\t\t\tunitsOptions={ dimensionsUnitsOptions }\n\t\t\t\t\t/>\n\t\t\t\t\t<ResolutionTool\n\t\t\t\t\t\tvalue={ sizeSlug }\n\t\t\t\t\t\tonChange={ updateImage }\n\t\t\t\t\t\toptions={ imageSizeOptions }\n\t\t\t\t\t/>\n\t\t\t\t</ToolsPanel>\n\t\t\t</InspectorControls>\n\t\t\t<InspectorControls group=\"advanced\">\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Title attribute' ) }\n\t\t\t\t\tvalue={ title || '' }\n\t\t\t\t\tonChange={ onSetTitle }\n\t\t\t\t\thelp={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Describe the role of this image on the page.'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/TR/html52/dom.html#the-title-attribute\">\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'(Note: many devices and browsers do not display this text.)'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</InspectorControls>\n\t\t</>\n\t);\n\n\tconst filename = getFilename( url );\n\tlet defaultedAlt;\n\n\tif ( alt ) {\n\t\tdefaultedAlt = alt;\n\t} else if ( filename ) {\n\t\tdefaultedAlt = sprintf(\n\t\t\t/* translators: %s: file name */\n\t\t\t__( 'This image has an empty alt attribute; its file name is %s' ),\n\t\t\tfilename\n\t\t);\n\t} else {\n\t\tdefaultedAlt = __( 'This image has an empty alt attribute' );\n\t}\n\n\tconst borderProps = useBorderProps( attributes );\n\tconst isRounded = attributes.className?.includes( 'is-style-rounded' );\n\n\tlet img = (\n\t\t// Disable reason: Image itself is not meant to be interactive, but\n\t\t// should direct focus to block.\n\t\t/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t\t<>\n\t\t\t<img\n\t\t\t\tsrc={ temporaryURL || url }\n\t\t\t\talt={ defaultedAlt }\n\t\t\t\tonError={ () => onImageError() }\n\t\t\t\tonLoad={ ( event ) => {\n\t\t\t\t\tsetLoadedNaturalSize( {\n\t\t\t\t\t\tloadedNaturalWidth: event.target?.naturalWidth,\n\t\t\t\t\t\tloadedNaturalHeight: event.target?.naturalHeight,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tref={ imageRef }\n\t\t\t\tclassName={ borderProps.className }\n\t\t\t\tstyle={ {\n\t\t\t\t\twidth:\n\t\t\t\t\t\t( width && height ) || aspectRatio ? '100%' : 'inherit',\n\t\t\t\t\theight:\n\t\t\t\t\t\t( width && height ) || aspectRatio ? '100%' : 'inherit',\n\t\t\t\t\tobjectFit: scale,\n\t\t\t\t\t...borderProps.style,\n\t\t\t\t} }\n\t\t\t/>\n\t\t\t{ temporaryURL && <Spinner /> }\n\t\t</>\n\t\t/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t);\n\n\t// clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0\n\t// So we try using the imageRef width first and fallback to clientWidth.\n\tconst fallbackClientWidth = imageRef.current?.width || clientWidth;\n\n\tif ( canEditImage && isEditingImage ) {\n\t\timg = (\n\t\t\t<ImageEditor\n\t\t\t\tid={ id }\n\t\t\t\turl={ url }\n\t\t\t\twidth={ width }\n\t\t\t\theight={ height }\n\t\t\t\tclientWidth={ fallbackClientWidth }\n\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t\tonSaveImage={ ( imageAttributes ) =>\n\t\t\t\t\tsetAttributes( imageAttributes )\n\t\t\t\t}\n\t\t\t\tonFinishEditing={ () => {\n\t\t\t\t\tsetIsEditingImage( false );\n\t\t\t\t} }\n\t\t\t\tborderProps={ isRounded ? undefined : borderProps }\n\t\t\t/>\n\t\t);\n\t} else if ( ! isResizable ) {\n\t\timg = <div style={ { width, height, aspectRatio } }>{ img }</div>;\n\t} else {\n\t\tconst ratio =\n\t\t\t( aspectRatio && evalAspectRatio( aspectRatio ) ) ||\n\t\t\t( width && height && width / height ) ||\n\t\t\tnaturalWidth / naturalHeight ||\n\t\t\t1;\n\n\t\tconst currentWidth = ! width && height ? height * ratio : width;\n\t\tconst currentHeight = ! height && width ? width / ratio : height;\n\n\t\tconst minWidth =\n\t\t\tnaturalWidth < naturalHeight ? MIN_SIZE : MIN_SIZE * ratio;\n\t\tconst minHeight =\n\t\t\tnaturalHeight < naturalWidth ? MIN_SIZE : MIN_SIZE / ratio;\n\n\t\t// With the current implementation of ResizableBox, an image needs an\n\t\t// explicit pixel value for the max-width. In absence of being able to\n\t\t// set the content-width, this max-width is currently dictated by the\n\t\t// vanilla editor style. The following variable adds a buffer to this\n\t\t// vanilla style, so 3rd party themes have some wiggleroom. This does,\n\t\t// in most cases, allow you to scale the image beyond the width of the\n\t\t// main column, though not infinitely.\n\t\t// @todo It would be good to revisit this once a content-width variable\n\t\t// becomes available.\n\t\tconst maxWidthBuffer = maxWidth * 2.5;\n\n\t\tlet showRightHandle = false;\n\t\tlet showLeftHandle = false;\n\n\t\t/* eslint-disable no-lonely-if */\n\t\t// See https://github.com/WordPress/gutenberg/issues/7584.\n\t\tif ( align === 'center' ) {\n\t\t\t// When the image is centered, show both handles.\n\t\t\tshowRightHandle = true;\n\t\t\tshowLeftHandle = true;\n\t\t} else if ( isRTL() ) {\n\t\t\t// In RTL mode the image is on the right by default.\n\t\t\t// Show the right handle and hide the left handle only when it is\n\t\t\t// aligned left. Otherwise always show the left handle.\n\t\t\tif ( align === 'left' ) {\n\t\t\t\tshowRightHandle = true;\n\t\t\t} else {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// Show the left handle and hide the right handle only when the\n\t\t\t// image is aligned right. Otherwise always show the right handle.\n\t\t\tif ( align === 'right' ) {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t} else {\n\t\t\t\tshowRightHandle = true;\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-lonely-if */\n\n\t\timg = (\n\t\t\t<ResizableBox\n\t\t\t\tstyle={ {\n\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\tobjectFit: scale,\n\t\t\t\t\taspectRatio:\n\t\t\t\t\t\t! width && ! height && aspectRatio\n\t\t\t\t\t\t\t? aspectRatio\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t} }\n\t\t\t\tsize={ {\n\t\t\t\t\twidth: currentWidth ?? 'auto',\n\t\t\t\t\theight: currentHeight ?? 'auto',\n\t\t\t\t} }\n\t\t\t\tshowHandle={ isSelected }\n\t\t\t\tminWidth={ minWidth }\n\t\t\t\tmaxWidth={ maxWidthBuffer }\n\t\t\t\tminHeight={ minHeight }\n\t\t\t\tmaxHeight={ maxWidthBuffer / ratio }\n\t\t\t\tlockAspectRatio={ ratio }\n\t\t\t\tenable={ {\n\t\t\t\t\ttop: false,\n\t\t\t\t\tright: showRightHandle,\n\t\t\t\t\tbottom: true,\n\t\t\t\t\tleft: showLeftHandle,\n\t\t\t\t} }\n\t\t\t\tonResizeStart={ onResizeStart }\n\t\t\t\tonResizeStop={ ( event, direction, elt ) => {\n\t\t\t\t\tonResizeStop();\n\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\twidth: elt.offsetWidth,\n\t\t\t\t\t\theight: elt.offsetHeight,\n\t\t\t\t\t\taspectRatio: undefined,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tresizeRatio={ align === 'center' ? 2 : 1 }\n\t\t\t>\n\t\t\t\t{ img }\n\t\t\t</ResizableBox>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ /* Hide controls during upload to avoid component remount,\n\t\t\t\twhich causes duplicated image upload. */ }\n\t\t\t{ ! temporaryURL && controls }\n\t\t\t{ img }\n\t\t\t{ showCaption &&\n\t\t\t\t( ! RichText.isEmpty( caption ) || isSelected ) && (\n\t\t\t\t\t<RichText\n\t\t\t\t\t\tidentifier=\"caption\"\n\t\t\t\t\t\tclassName={ __experimentalGetElementClassName(\n\t\t\t\t\t\t\t'caption'\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tref={ captionRef }\n\t\t\t\t\t\ttagName=\"figcaption\"\n\t\t\t\t\t\taria-label={ __( 'Image caption text' ) }\n\t\t\t\t\t\tplaceholder={ __( 'Add caption' ) }\n\t\t\t\t\t\tvalue={ caption }\n\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\tsetAttributes( { caption: value } )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinlineToolbar\n\t\t\t\t\t\t__unstableOnSplitAtEnd={ () =>\n\t\t\t\t\t\t\tinsertBlocksAfter(\n\t\t\t\t\t\t\t\tcreateBlock( getDefaultBlockName() )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/image/image.js"],"names":["isBlobURL","ExternalLink","ResizableBox","Spinner","TextareaControl","TextControl","ToolbarButton","ToolbarGroup","__experimentalToolsPanel","ToolsPanel","__experimentalToolsPanelItem","ToolsPanelItem","__experimentalUseCustomUnits","useCustomUnits","useViewportMatch","usePrevious","useSelect","useDispatch","BlockControls","InspectorControls","RichText","__experimentalImageURLInputUI","ImageURLInputUI","MediaReplaceFlow","store","blockEditorStore","BlockAlignmentControl","__experimentalImageEditor","ImageEditor","__experimentalGetElementClassName","__experimentalUseBorderProps","useBorderProps","privateApis","blockEditorPrivateApis","useEffect","useMemo","useState","useRef","useCallback","__","_x","sprintf","isRTL","getFilename","createBlock","getDefaultBlockName","switchToBlockType","crop","overlayText","upload","caption","captionIcon","noticesStore","coreStore","unlock","createUpgradedEmbedBlock","useClientWidth","isExternalImage","MIN_SIZE","ALLOWED_MEDIA_TYPES","evalAspectRatio","DimensionsTool","ResolutionTool","scaleOptions","value","label","help","Image","temporaryURL","attributes","setAttributes","isSelected","insertBlocksAfter","onReplace","onSelectImage","onSelectURL","onUploadError","containerRef","context","clientId","blockEditingMode","url","alt","align","id","href","rel","linkClass","linkDestination","title","width","height","aspectRatio","scale","linkTarget","sizeSlug","imageRef","prevCaption","showCaption","setShowCaption","allowResize","getBlock","image","multiImageSelection","select","getMedia","getMultiSelectedBlockClientIds","getBlockName","multiSelectedClientIds","length","every","_clientId","canInsertCover","imageEditing","imageSizes","maxWidth","mediaUpload","getBlockRootClientId","getSettings","canInsertBlockType","rootClientId","settings","replaceBlocks","toggleSelection","createErrorNotice","createSuccessNotice","isLargeViewport","isWideAligned","includes","loadedNaturalWidth","loadedNaturalHeight","setLoadedNaturalSize","isEditingImage","setIsEditingImage","externalBlob","setExternalBlob","clientWidth","hasNonContentControls","isResizable","imageSizeOptions","filter","slug","media_details","sizes","source_url","map","name","canUploadMedia","window","fetch","then","response","blob","catch","captionRef","node","focus","naturalWidth","naturalHeight","current","undefined","complete","onResizeStart","onResizeStop","onImageError","embedBlock","onSetHref","props","onSetTitle","updateAlt","newAlt","updateImage","newSizeSlug","newUrl","uploadExternal","filesList","onFileChange","img","type","allowedTypes","onError","message","updateAlignment","nextAlign","extraUpdatedAttributes","canEditImage","allowCrop","switchToCover","dimensionsUnitsOptions","availableUnits","controls","link","newValue","parseInt","filename","defaultedAlt","borderProps","isRounded","className","event","target","objectFit","style","fallbackClientWidth","imageAttributes","ratio","currentWidth","currentHeight","minWidth","minHeight","maxWidthBuffer","showRightHandle","showLeftHandle","display","top","right","bottom","left","direction","elt","offsetWidth","offsetHeight","isEmpty"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { isBlobURL } from '@wordpress/blob';\nimport {\n\tExternalLink,\n\tResizableBox,\n\tSpinner,\n\tTextareaControl,\n\tTextControl,\n\tToolbarButton,\n\tToolbarGroup,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalUseCustomUnits as useCustomUnits,\n} from '@wordpress/components';\nimport { useViewportMatch, usePrevious } from '@wordpress/compose';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport {\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n\t__experimentalImageURLInputUI as ImageURLInputUI,\n\tMediaReplaceFlow,\n\tstore as blockEditorStore,\n\tBlockAlignmentControl,\n\t__experimentalImageEditor as ImageEditor,\n\t__experimentalGetElementClassName,\n\t__experimentalUseBorderProps as useBorderProps,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\nimport {\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseRef,\n\tuseCallback,\n} from '@wordpress/element';\nimport { __, _x, sprintf, isRTL } from '@wordpress/i18n';\nimport { getFilename } from '@wordpress/url';\nimport {\n\tcreateBlock,\n\tgetDefaultBlockName,\n\tswitchToBlockType,\n} from '@wordpress/blocks';\nimport {\n\tcrop,\n\toverlayText,\n\tupload,\n\tcaption as captionIcon,\n} from '@wordpress/icons';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\nimport { createUpgradedEmbedBlock } from '../embed/util';\nimport useClientWidth from './use-client-width';\nimport { isExternalImage } from './edit';\n\n/**\n * Module constants\n */\nimport { MIN_SIZE, ALLOWED_MEDIA_TYPES } from './constants';\nimport { evalAspectRatio } from './utils';\n\nconst { DimensionsTool, ResolutionTool } = unlock( blockEditorPrivateApis );\n\nconst scaleOptions = [\n\t{\n\t\tvalue: 'cover',\n\t\tlabel: _x( 'Cover', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Image covers the space evenly.' ),\n\t},\n\t{\n\t\tvalue: 'contain',\n\t\tlabel: _x( 'Contain', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Image is contained without distortion.' ),\n\t},\n];\n\nexport default function Image( {\n\ttemporaryURL,\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tinsertBlocksAfter,\n\tonReplace,\n\tonSelectImage,\n\tonSelectURL,\n\tonUploadError,\n\tcontainerRef,\n\tcontext,\n\tclientId,\n\tblockEditingMode,\n} ) {\n\tconst {\n\t\turl = '',\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\tid,\n\t\thref,\n\t\trel,\n\t\tlinkClass,\n\t\tlinkDestination,\n\t\ttitle,\n\t\twidth,\n\t\theight,\n\t\taspectRatio,\n\t\tscale,\n\t\tlinkTarget,\n\t\tsizeSlug,\n\t} = attributes;\n\tconst imageRef = useRef();\n\tconst prevCaption = usePrevious( caption );\n\tconst [ showCaption, setShowCaption ] = useState( !! caption );\n\tconst { allowResize = true } = context;\n\tconst { getBlock } = useSelect( blockEditorStore );\n\n\tconst { image, multiImageSelection } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getMedia } = select( coreStore );\n\t\t\tconst { getMultiSelectedBlockClientIds, getBlockName } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst multiSelectedClientIds = getMultiSelectedBlockClientIds();\n\t\t\treturn {\n\t\t\t\timage:\n\t\t\t\t\tid && isSelected\n\t\t\t\t\t\t? getMedia( id, { context: 'view' } )\n\t\t\t\t\t\t: null,\n\t\t\t\tmultiImageSelection:\n\t\t\t\t\tmultiSelectedClientIds.length &&\n\t\t\t\t\tmultiSelectedClientIds.every(\n\t\t\t\t\t\t( _clientId ) =>\n\t\t\t\t\t\t\tgetBlockName( _clientId ) === 'core/image'\n\t\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ id, isSelected ]\n\t);\n\tconst { canInsertCover, imageEditing, imageSizes, maxWidth, mediaUpload } =\n\t\tuseSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetBlockRootClientId,\n\t\t\t\t\tgetSettings,\n\t\t\t\t\tcanInsertBlockType,\n\t\t\t\t} = select( blockEditorStore );\n\n\t\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\t\tconst settings = getSettings();\n\n\t\t\t\treturn {\n\t\t\t\t\timageEditing: settings.imageEditing,\n\t\t\t\t\timageSizes: settings.imageSizes,\n\t\t\t\t\tmaxWidth: settings.maxWidth,\n\t\t\t\t\tmediaUpload: settings.mediaUpload,\n\t\t\t\t\tcanInsertCover: canInsertBlockType(\n\t\t\t\t\t\t'core/cover',\n\t\t\t\t\t\trootClientId\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\tconst { replaceBlocks, toggleSelection } = useDispatch( blockEditorStore );\n\tconst { createErrorNotice, createSuccessNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst isLargeViewport = useViewportMatch( 'medium' );\n\tconst isWideAligned = [ 'wide', 'full' ].includes( align );\n\tconst [\n\t\t{ loadedNaturalWidth, loadedNaturalHeight },\n\t\tsetLoadedNaturalSize,\n\t] = useState( {} );\n\tconst [ isEditingImage, setIsEditingImage ] = useState( false );\n\tconst [ externalBlob, setExternalBlob ] = useState();\n\tconst clientWidth = useClientWidth( containerRef, [ align ] );\n\tconst hasNonContentControls = blockEditingMode === 'default';\n\tconst isResizable =\n\t\tallowResize &&\n\t\thasNonContentControls &&\n\t\t! ( isWideAligned && isLargeViewport );\n\tconst imageSizeOptions = imageSizes\n\t\t.filter(\n\t\t\t( { slug } ) => image?.media_details?.sizes?.[ slug ]?.source_url\n\t\t)\n\t\t.map( ( { name, slug } ) => ( { value: slug, label: name } ) );\n\tconst canUploadMedia = !! mediaUpload;\n\n\t// If an image is externally hosted, try to fetch the image data. This may\n\t// fail if the image host doesn't allow CORS with the domain. If it works,\n\t// we can enable a button in the toolbar to upload the image.\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! isExternalImage( id, url ) ||\n\t\t\t! isSelected ||\n\t\t\t! canUploadMedia\n\t\t) {\n\t\t\tsetExternalBlob();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( externalBlob ) return;\n\n\t\twindow\n\t\t\t// Avoid cache, which seems to help avoid CORS problems.\n\t\t\t.fetch( url.includes( '?' ) ? url : url + '?' )\n\t\t\t.then( ( response ) => response.blob() )\n\t\t\t.then( ( blob ) => setExternalBlob( blob ) )\n\t\t\t// Do nothing, cannot upload.\n\t\t\t.catch( () => {} );\n\t}, [ id, url, isSelected, externalBlob, canUploadMedia ] );\n\n\t// We need to show the caption when changes come from\n\t// history navigation(undo/redo).\n\tuseEffect( () => {\n\t\tif ( caption && ! prevCaption ) {\n\t\t\tsetShowCaption( true );\n\t\t}\n\t}, [ caption, prevCaption ] );\n\n\t// Focus the caption when we click to add one.\n\tconst captionRef = useCallback(\n\t\t( node ) => {\n\t\t\tif ( node && ! caption ) {\n\t\t\t\tnode.focus();\n\t\t\t}\n\t\t},\n\t\t[ caption ]\n\t);\n\n\t// Get naturalWidth and naturalHeight from image ref, and fall back to loaded natural\n\t// width and height. This resolves an issue in Safari where the loaded natural\n\t// width and height is otherwise lost when switching between alignments.\n\t// See: https://github.com/WordPress/gutenberg/pull/37210.\n\tconst { naturalWidth, naturalHeight } = useMemo( () => {\n\t\treturn {\n\t\t\tnaturalWidth:\n\t\t\t\timageRef.current?.naturalWidth ||\n\t\t\t\tloadedNaturalWidth ||\n\t\t\t\tundefined,\n\t\t\tnaturalHeight:\n\t\t\t\timageRef.current?.naturalHeight ||\n\t\t\t\tloadedNaturalHeight ||\n\t\t\t\tundefined,\n\t\t};\n\t}, [\n\t\tloadedNaturalWidth,\n\t\tloadedNaturalHeight,\n\t\timageRef.current?.complete,\n\t] );\n\n\tfunction onResizeStart() {\n\t\ttoggleSelection( false );\n\t}\n\n\tfunction onResizeStop() {\n\t\ttoggleSelection( true );\n\t}\n\n\tfunction onImageError() {\n\t\t// Check if there's an embed block that handles this URL, e.g., instagram URL.\n\t\t// See: https://github.com/WordPress/gutenberg/pull/11472\n\t\tconst embedBlock = createUpgradedEmbedBlock( { attributes: { url } } );\n\n\t\tif ( undefined !== embedBlock ) {\n\t\t\tonReplace( embedBlock );\n\t\t}\n\t}\n\n\tfunction onSetHref( props ) {\n\t\tsetAttributes( props );\n\t}\n\n\tfunction onSetTitle( value ) {\n\t\t// This is the HTML title attribute, separate from the media object\n\t\t// title.\n\t\tsetAttributes( { title: value } );\n\t}\n\n\tfunction updateAlt( newAlt ) {\n\t\tsetAttributes( { alt: newAlt } );\n\t}\n\n\tfunction updateImage( newSizeSlug ) {\n\t\tconst newUrl = image?.media_details?.sizes?.[ newSizeSlug ]?.source_url;\n\t\tif ( ! newUrl ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tsetAttributes( {\n\t\t\turl: newUrl,\n\t\t\tsizeSlug: newSizeSlug,\n\t\t} );\n\t}\n\n\tfunction uploadExternal() {\n\t\tmediaUpload( {\n\t\t\tfilesList: [ externalBlob ],\n\t\t\tonFileChange( [ img ] ) {\n\t\t\t\tonSelectImage( img );\n\n\t\t\t\tif ( isBlobURL( img.url ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetExternalBlob();\n\t\t\t\tcreateSuccessNotice( __( 'Image uploaded.' ), {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t} );\n\t\t\t},\n\t\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\t\tonError( message ) {\n\t\t\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t\t\t},\n\t\t} );\n\t}\n\n\tfunction updateAlignment( nextAlign ) {\n\t\tconst extraUpdatedAttributes = [ 'wide', 'full' ].includes( nextAlign )\n\t\t\t? { width: undefined, height: undefined }\n\t\t\t: {};\n\t\tsetAttributes( {\n\t\t\t...extraUpdatedAttributes,\n\t\t\talign: nextAlign,\n\t\t} );\n\t}\n\n\tuseEffect( () => {\n\t\tif ( ! isSelected ) {\n\t\t\tsetIsEditingImage( false );\n\t\t\tif ( ! caption ) {\n\t\t\t\tsetShowCaption( false );\n\t\t\t}\n\t\t}\n\t}, [ isSelected, caption ] );\n\n\tconst canEditImage = id && naturalWidth && naturalHeight && imageEditing;\n\tconst allowCrop = ! multiImageSelection && canEditImage && ! isEditingImage;\n\n\tfunction switchToCover() {\n\t\treplaceBlocks(\n\t\t\tclientId,\n\t\t\tswitchToBlockType( getBlock( clientId ), 'core/cover' )\n\t\t);\n\t}\n\n\t// TODO: Can allow more units after figuring out how they should interact\n\t// with the ResizableBox and ImageEditor components. Calculations later on\n\t// for those components are currently assuming px units.\n\tconst dimensionsUnitsOptions = useCustomUnits( {\n\t\tavailableUnits: [ 'px' ],\n\t} );\n\n\tconst controls = (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<BlockAlignmentControl\n\t\t\t\t\t\tvalue={ align }\n\t\t\t\t\t\tonChange={ updateAlignment }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tsetShowCaption( ! showCaption );\n\t\t\t\t\t\t\tif ( showCaption && caption ) {\n\t\t\t\t\t\t\t\tsetAttributes( { caption: undefined } );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} }\n\t\t\t\t\t\ticon={ captionIcon }\n\t\t\t\t\t\tisPressed={ showCaption }\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\tshowCaption\n\t\t\t\t\t\t\t\t? __( 'Remove caption' )\n\t\t\t\t\t\t\t\t: __( 'Add caption' )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t\t<ImageURLInputUI\n\t\t\t\t\t\turl={ href || '' }\n\t\t\t\t\t\tonChangeUrl={ onSetHref }\n\t\t\t\t\t\tlinkDestination={ linkDestination }\n\t\t\t\t\t\tmediaUrl={ ( image && image.source_url ) || url }\n\t\t\t\t\t\tmediaLink={ image && image.link }\n\t\t\t\t\t\tlinkTarget={ linkTarget }\n\t\t\t\t\t\tlinkClass={ linkClass }\n\t\t\t\t\t\trel={ rel }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ allowCrop && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => setIsEditingImage( true ) }\n\t\t\t\t\t\ticon={ crop }\n\t\t\t\t\t\tlabel={ __( 'Crop' ) }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && canInsertCover && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\ticon={ overlayText }\n\t\t\t\t\t\tlabel={ __( 'Add text over image' ) }\n\t\t\t\t\t\tonClick={ switchToCover }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</BlockControls>\n\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t<BlockControls group=\"other\">\n\t\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\t\tmediaId={ id }\n\t\t\t\t\t\tmediaURL={ url }\n\t\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\t\tonSelect={ onSelectImage }\n\t\t\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ ! multiImageSelection && externalBlob && (\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ uploadExternal }\n\t\t\t\t\t\t\ticon={ upload }\n\t\t\t\t\t\t\tlabel={ __( 'Upload external image' ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t<InspectorControls>\n\t\t\t\t<ToolsPanel\n\t\t\t\t\tlabel={ __( 'Settings' ) }\n\t\t\t\t\tresetAll={ () =>\n\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\twidth: undefined,\n\t\t\t\t\t\t\theight: undefined,\n\t\t\t\t\t\t\tscale: undefined,\n\t\t\t\t\t\t\taspectRatio: undefined,\n\t\t\t\t\t\t} )\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{ ! multiImageSelection && (\n\t\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\tisShownByDefault={ true }\n\t\t\t\t\t\t\thasValue={ () => alt !== '' }\n\t\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\t\tsetAttributes( { alt: undefined } )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<TextareaControl\n\t\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\t\tvalue={ alt }\n\t\t\t\t\t\t\t\tonChange={ updateAlt }\n\t\t\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/WAI/tutorials/images/decision-tree\">\n\t\t\t\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t\t\t\t'Describe the purpose of the image.'\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t{ __( 'Leave empty if decorative.' ) }\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t) }\n\t\t\t\t\t<DimensionsTool\n\t\t\t\t\t\tvalue={ {\n\t\t\t\t\t\t\twidth: width && `${ width }px`,\n\t\t\t\t\t\t\theight: height && `${ height }px`,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\taspectRatio,\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonChange={ ( newValue ) => {\n\t\t\t\t\t\t\t// Rebuilding the object forces setting `undefined`\n\t\t\t\t\t\t\t// for values that are removed since setAttributes\n\t\t\t\t\t\t\t// doesn't do anything with keys that aren't set.\n\t\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\t\twidth:\n\t\t\t\t\t\t\t\t\tnewValue.width &&\n\t\t\t\t\t\t\t\t\tparseInt( newValue.width, 10 ),\n\t\t\t\t\t\t\t\theight:\n\t\t\t\t\t\t\t\t\tnewValue.height &&\n\t\t\t\t\t\t\t\t\tparseInt( newValue.height, 10 ),\n\t\t\t\t\t\t\t\tscale: newValue.scale,\n\t\t\t\t\t\t\t\taspectRatio: newValue.aspectRatio,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tdefaultScale=\"cover\"\n\t\t\t\t\t\tdefaultAspectRatio=\"auto\"\n\t\t\t\t\t\tscaleOptions={ scaleOptions }\n\t\t\t\t\t\tunitsOptions={ dimensionsUnitsOptions }\n\t\t\t\t\t/>\n\t\t\t\t\t<ResolutionTool\n\t\t\t\t\t\tvalue={ sizeSlug }\n\t\t\t\t\t\tonChange={ updateImage }\n\t\t\t\t\t\toptions={ imageSizeOptions }\n\t\t\t\t\t/>\n\t\t\t\t</ToolsPanel>\n\t\t\t</InspectorControls>\n\t\t\t<InspectorControls group=\"advanced\">\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Title attribute' ) }\n\t\t\t\t\tvalue={ title || '' }\n\t\t\t\t\tonChange={ onSetTitle }\n\t\t\t\t\thelp={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Describe the role of this image on the page.'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/TR/html52/dom.html#the-title-attribute\">\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'(Note: many devices and browsers do not display this text.)'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</InspectorControls>\n\t\t</>\n\t);\n\n\tconst filename = getFilename( url );\n\tlet defaultedAlt;\n\n\tif ( alt ) {\n\t\tdefaultedAlt = alt;\n\t} else if ( filename ) {\n\t\tdefaultedAlt = sprintf(\n\t\t\t/* translators: %s: file name */\n\t\t\t__( 'This image has an empty alt attribute; its file name is %s' ),\n\t\t\tfilename\n\t\t);\n\t} else {\n\t\tdefaultedAlt = __( 'This image has an empty alt attribute' );\n\t}\n\n\tconst borderProps = useBorderProps( attributes );\n\tconst isRounded = attributes.className?.includes( 'is-style-rounded' );\n\n\tlet img = (\n\t\t// Disable reason: Image itself is not meant to be interactive, but\n\t\t// should direct focus to block.\n\t\t/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t\t<>\n\t\t\t<img\n\t\t\t\tsrc={ temporaryURL || url }\n\t\t\t\talt={ defaultedAlt }\n\t\t\t\tonError={ () => onImageError() }\n\t\t\t\tonLoad={ ( event ) => {\n\t\t\t\t\tsetLoadedNaturalSize( {\n\t\t\t\t\t\tloadedNaturalWidth: event.target?.naturalWidth,\n\t\t\t\t\t\tloadedNaturalHeight: event.target?.naturalHeight,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tref={ imageRef }\n\t\t\t\tclassName={ borderProps.className }\n\t\t\t\tstyle={ {\n\t\t\t\t\twidth:\n\t\t\t\t\t\t( width && height ) || aspectRatio ? '100%' : undefined,\n\t\t\t\t\theight:\n\t\t\t\t\t\t( width && height ) || aspectRatio ? '100%' : undefined,\n\t\t\t\t\tobjectFit: scale,\n\t\t\t\t\t...borderProps.style,\n\t\t\t\t} }\n\t\t\t/>\n\t\t\t{ temporaryURL && <Spinner /> }\n\t\t</>\n\t\t/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t);\n\n\t// clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0\n\t// So we try using the imageRef width first and fallback to clientWidth.\n\tconst fallbackClientWidth = imageRef.current?.width || clientWidth;\n\n\tif ( canEditImage && isEditingImage ) {\n\t\timg = (\n\t\t\t<ImageEditor\n\t\t\t\tid={ id }\n\t\t\t\turl={ url }\n\t\t\t\twidth={ width }\n\t\t\t\theight={ height }\n\t\t\t\tclientWidth={ fallbackClientWidth }\n\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t\tonSaveImage={ ( imageAttributes ) =>\n\t\t\t\t\tsetAttributes( imageAttributes )\n\t\t\t\t}\n\t\t\t\tonFinishEditing={ () => {\n\t\t\t\t\tsetIsEditingImage( false );\n\t\t\t\t} }\n\t\t\t\tborderProps={ isRounded ? undefined : borderProps }\n\t\t\t/>\n\t\t);\n\t} else if ( ! isResizable ) {\n\t\timg = <div style={ { width, height, aspectRatio } }>{ img }</div>;\n\t} else {\n\t\tconst ratio =\n\t\t\t( aspectRatio && evalAspectRatio( aspectRatio ) ) ||\n\t\t\t( width && height && width / height ) ||\n\t\t\tnaturalWidth / naturalHeight ||\n\t\t\t1;\n\n\t\tconst currentWidth = ! width && height ? height * ratio : width;\n\t\tconst currentHeight = ! height && width ? width / ratio : height;\n\n\t\tconst minWidth =\n\t\t\tnaturalWidth < naturalHeight ? MIN_SIZE : MIN_SIZE * ratio;\n\t\tconst minHeight =\n\t\t\tnaturalHeight < naturalWidth ? MIN_SIZE : MIN_SIZE / ratio;\n\n\t\t// With the current implementation of ResizableBox, an image needs an\n\t\t// explicit pixel value for the max-width. In absence of being able to\n\t\t// set the content-width, this max-width is currently dictated by the\n\t\t// vanilla editor style. The following variable adds a buffer to this\n\t\t// vanilla style, so 3rd party themes have some wiggleroom. This does,\n\t\t// in most cases, allow you to scale the image beyond the width of the\n\t\t// main column, though not infinitely.\n\t\t// @todo It would be good to revisit this once a content-width variable\n\t\t// becomes available.\n\t\tconst maxWidthBuffer = maxWidth * 2.5;\n\n\t\tlet showRightHandle = false;\n\t\tlet showLeftHandle = false;\n\n\t\t/* eslint-disable no-lonely-if */\n\t\t// See https://github.com/WordPress/gutenberg/issues/7584.\n\t\tif ( align === 'center' ) {\n\t\t\t// When the image is centered, show both handles.\n\t\t\tshowRightHandle = true;\n\t\t\tshowLeftHandle = true;\n\t\t} else if ( isRTL() ) {\n\t\t\t// In RTL mode the image is on the right by default.\n\t\t\t// Show the right handle and hide the left handle only when it is\n\t\t\t// aligned left. Otherwise always show the left handle.\n\t\t\tif ( align === 'left' ) {\n\t\t\t\tshowRightHandle = true;\n\t\t\t} else {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// Show the left handle and hide the right handle only when the\n\t\t\t// image is aligned right. Otherwise always show the right handle.\n\t\t\tif ( align === 'right' ) {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t} else {\n\t\t\t\tshowRightHandle = true;\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-lonely-if */\n\n\t\timg = (\n\t\t\t<ResizableBox\n\t\t\t\tstyle={ {\n\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\tobjectFit: scale,\n\t\t\t\t\taspectRatio:\n\t\t\t\t\t\t! width && ! height && aspectRatio\n\t\t\t\t\t\t\t? aspectRatio\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t} }\n\t\t\t\tsize={ {\n\t\t\t\t\twidth: currentWidth ?? 'auto',\n\t\t\t\t\theight: currentHeight ?? 'auto',\n\t\t\t\t} }\n\t\t\t\tshowHandle={ isSelected }\n\t\t\t\tminWidth={ minWidth }\n\t\t\t\tmaxWidth={ maxWidthBuffer }\n\t\t\t\tminHeight={ minHeight }\n\t\t\t\tmaxHeight={ maxWidthBuffer / ratio }\n\t\t\t\tlockAspectRatio={ ratio }\n\t\t\t\tenable={ {\n\t\t\t\t\ttop: false,\n\t\t\t\t\tright: showRightHandle,\n\t\t\t\t\tbottom: true,\n\t\t\t\t\tleft: showLeftHandle,\n\t\t\t\t} }\n\t\t\t\tonResizeStart={ onResizeStart }\n\t\t\t\tonResizeStop={ ( event, direction, elt ) => {\n\t\t\t\t\tonResizeStop();\n\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\twidth: elt.offsetWidth,\n\t\t\t\t\t\theight: elt.offsetHeight,\n\t\t\t\t\t\taspectRatio: undefined,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tresizeRatio={ align === 'center' ? 2 : 1 }\n\t\t\t>\n\t\t\t\t{ img }\n\t\t\t</ResizableBox>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ /* Hide controls during upload to avoid component remount,\n\t\t\t\twhich causes duplicated image upload. */ }\n\t\t\t{ ! temporaryURL && controls }\n\t\t\t{ img }\n\t\t\t{ showCaption &&\n\t\t\t\t( ! RichText.isEmpty( caption ) || isSelected ) && (\n\t\t\t\t\t<RichText\n\t\t\t\t\t\tidentifier=\"caption\"\n\t\t\t\t\t\tclassName={ __experimentalGetElementClassName(\n\t\t\t\t\t\t\t'caption'\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tref={ captionRef }\n\t\t\t\t\t\ttagName=\"figcaption\"\n\t\t\t\t\t\taria-label={ __( 'Image caption text' ) }\n\t\t\t\t\t\tplaceholder={ __( 'Add caption' ) }\n\t\t\t\t\t\tvalue={ caption }\n\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\tsetAttributes( { caption: value } )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinlineToolbar\n\t\t\t\t\t\t__unstableOnSplitAtEnd={ () =>\n\t\t\t\t\t\t\tinsertBlocksAfter(\n\t\t\t\t\t\t\t\tcreateBlock( getDefaultBlockName() )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
@@ -7,6 +7,11 @@ import { cloneBlock } from '@wordpress/blocks';
7
7
  import { useSelect, useDispatch } from '@wordpress/data';
8
8
  import { useEffect } from '@wordpress/element';
9
9
  import { store as blockEditorStore, useBlockProps } from '@wordpress/block-editor';
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+
14
+ import { unlock } from '../lock-unlock';
10
15
 
11
16
  const PatternEdit = ({
12
17
  attributes,
@@ -16,7 +21,14 @@ const PatternEdit = ({
16
21
  const {
17
22
  replaceBlocks,
18
23
  __unstableMarkNextChangeAsNotPersistent
19
- } = useDispatch(blockEditorStore); // Run this effect when the component loads.
24
+ } = useDispatch(blockEditorStore);
25
+ const {
26
+ setBlockEditingMode
27
+ } = unlock(useDispatch(blockEditorStore));
28
+ const {
29
+ getBlockRootClientId,
30
+ getBlockEditingMode
31
+ } = unlock(useSelect(blockEditorStore)); // Run this effect when the component loads.
20
32
  // This adds the Pattern's contents to the post.
21
33
  // This change won't be saved.
22
34
  // It will continue to pull from the pattern file unless changes are made to its respective template part.
@@ -29,16 +41,27 @@ const PatternEdit = ({
29
41
  // because nested pattern blocks cannot be inserted if the parent block supports
30
42
  // inner blocks but doesn't have blockSettings in the state.
31
43
  window.queueMicrotask(() => {
32
- // Clone blocks from the pattern before insertion to ensure they receive
44
+ const rootClientId = getBlockRootClientId(clientId); // Clone blocks from the pattern before insertion to ensure they receive
33
45
  // distinct client ids. See https://github.com/WordPress/gutenberg/issues/50628.
46
+
34
47
  const clonedBlocks = selectedPattern.blocks.map(block => cloneBlock(block));
48
+ const rootEditingMode = getBlockEditingMode(rootClientId); // Temporarily set the root block to default mode to allow replacing the pattern.
49
+ // This could happen when the page is disabling edits of non-content blocks.
50
+
51
+ __unstableMarkNextChangeAsNotPersistent();
52
+
53
+ setBlockEditingMode(rootClientId, 'default');
54
+
55
+ __unstableMarkNextChangeAsNotPersistent();
56
+
57
+ replaceBlocks(clientId, clonedBlocks); // Restore the root block's original mode.
35
58
 
36
59
  __unstableMarkNextChangeAsNotPersistent();
37
60
 
38
- replaceBlocks(clientId, clonedBlocks);
61
+ setBlockEditingMode(rootClientId, rootEditingMode);
39
62
  });
40
63
  }
41
- }, [clientId, selectedPattern?.blocks, __unstableMarkNextChangeAsNotPersistent, replaceBlocks]);
64
+ }, [clientId, selectedPattern?.blocks, __unstableMarkNextChangeAsNotPersistent, replaceBlocks, getBlockEditingMode, setBlockEditingMode, getBlockRootClientId]);
42
65
  const props = useBlockProps();
43
66
  return createElement("div", { ...props
44
67
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/pattern/edit.js"],"names":["cloneBlock","useSelect","useDispatch","useEffect","store","blockEditorStore","useBlockProps","PatternEdit","attributes","clientId","selectedPattern","select","__experimentalGetParsedPattern","slug","replaceBlocks","__unstableMarkNextChangeAsNotPersistent","blocks","window","queueMicrotask","clonedBlocks","map","block","props"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,UAAT,QAA2B,mBAA3B;AACA,SAASC,SAAT,EAAoBC,WAApB,QAAuC,iBAAvC;AACA,SAASC,SAAT,QAA0B,oBAA1B;AACA,SACCC,KAAK,IAAIC,gBADV,EAECC,aAFD,QAGO,yBAHP;;AAKA,MAAMC,WAAW,GAAG,CAAE;AAAEC,EAAAA,UAAF;AAAcC,EAAAA;AAAd,CAAF,KAAgC;AACnD,QAAMC,eAAe,GAAGT,SAAS,CAC9BU,MAAF,IACCA,MAAM,CAAEN,gBAAF,CAAN,CAA2BO,8BAA3B,CACCJ,UAAU,CAACK,IADZ,CAF+B,EAKhC,CAAEL,UAAU,CAACK,IAAb,CALgC,CAAjC;AAQA,QAAM;AAAEC,IAAAA,aAAF;AAAiBC,IAAAA;AAAjB,MACLb,WAAW,CAAEG,gBAAF,CADZ,CATmD,CAYnD;AACA;AACA;AACA;;AACAF,EAAAA,SAAS,CAAE,MAAM;AAChB,QAAKO,eAAe,EAAEM,MAAtB,EAA+B;AAC9B;AACA;AACA;AACA;AACA;AACAC,MAAAA,MAAM,CAACC,cAAP,CAAuB,MAAM;AAC5B;AACA;AACA,cAAMC,YAAY,GAAGT,eAAe,CAACM,MAAhB,CAAuBI,GAAvB,CAA8BC,KAAF,IAChDrB,UAAU,CAAEqB,KAAF,CADU,CAArB;;AAGAN,QAAAA,uCAAuC;;AACvCD,QAAAA,aAAa,CAAEL,QAAF,EAAYU,YAAZ,CAAb;AACA,OARD;AASA;AACD,GAjBQ,EAiBN,CACFV,QADE,EAEFC,eAAe,EAAEM,MAFf,EAGFD,uCAHE,EAIFD,aAJE,CAjBM,CAAT;AAwBA,QAAMQ,KAAK,GAAGhB,aAAa,EAA3B;AAEA,SAAO,0BAAUgB;AAAV,IAAP;AACA,CA3CD;;AA6CA,eAAef,WAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { cloneBlock } from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useEffect } from '@wordpress/element';\nimport {\n\tstore as blockEditorStore,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\n\nconst PatternEdit = ( { attributes, clientId } ) => {\n\tconst selectedPattern = useSelect(\n\t\t( select ) =>\n\t\t\tselect( blockEditorStore ).__experimentalGetParsedPattern(\n\t\t\t\tattributes.slug\n\t\t\t),\n\t\t[ attributes.slug ]\n\t);\n\n\tconst { replaceBlocks, __unstableMarkNextChangeAsNotPersistent } =\n\t\tuseDispatch( blockEditorStore );\n\n\t// Run this effect when the component loads.\n\t// This adds the Pattern's contents to the post.\n\t// This change won't be saved.\n\t// It will continue to pull from the pattern file unless changes are made to its respective template part.\n\tuseEffect( () => {\n\t\tif ( selectedPattern?.blocks ) {\n\t\t\t// We batch updates to block list settings to avoid triggering cascading renders\n\t\t\t// for each container block included in a tree and optimize initial render.\n\t\t\t// Since the above uses microtasks, we need to use a microtask here as well,\n\t\t\t// because nested pattern blocks cannot be inserted if the parent block supports\n\t\t\t// inner blocks but doesn't have blockSettings in the state.\n\t\t\twindow.queueMicrotask( () => {\n\t\t\t\t// Clone blocks from the pattern before insertion to ensure they receive\n\t\t\t\t// distinct client ids. See https://github.com/WordPress/gutenberg/issues/50628.\n\t\t\t\tconst clonedBlocks = selectedPattern.blocks.map( ( block ) =>\n\t\t\t\t\tcloneBlock( block )\n\t\t\t\t);\n\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\treplaceBlocks( clientId, clonedBlocks );\n\t\t\t} );\n\t\t}\n\t}, [\n\t\tclientId,\n\t\tselectedPattern?.blocks,\n\t\t__unstableMarkNextChangeAsNotPersistent,\n\t\treplaceBlocks,\n\t] );\n\n\tconst props = useBlockProps();\n\n\treturn <div { ...props } />;\n};\n\nexport default PatternEdit;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/pattern/edit.js"],"names":["cloneBlock","useSelect","useDispatch","useEffect","store","blockEditorStore","useBlockProps","unlock","PatternEdit","attributes","clientId","selectedPattern","select","__experimentalGetParsedPattern","slug","replaceBlocks","__unstableMarkNextChangeAsNotPersistent","setBlockEditingMode","getBlockRootClientId","getBlockEditingMode","blocks","window","queueMicrotask","rootClientId","clonedBlocks","map","block","rootEditingMode","props"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,UAAT,QAA2B,mBAA3B;AACA,SAASC,SAAT,EAAoBC,WAApB,QAAuC,iBAAvC;AACA,SAASC,SAAT,QAA0B,oBAA1B;AACA,SACCC,KAAK,IAAIC,gBADV,EAECC,aAFD,QAGO,yBAHP;AAKA;AACA;AACA;;AACA,SAASC,MAAT,QAAuB,gBAAvB;;AAEA,MAAMC,WAAW,GAAG,CAAE;AAAEC,EAAAA,UAAF;AAAcC,EAAAA;AAAd,CAAF,KAAgC;AACnD,QAAMC,eAAe,GAAGV,SAAS,CAC9BW,MAAF,IACCA,MAAM,CAAEP,gBAAF,CAAN,CAA2BQ,8BAA3B,CACCJ,UAAU,CAACK,IADZ,CAF+B,EAKhC,CAAEL,UAAU,CAACK,IAAb,CALgC,CAAjC;AAQA,QAAM;AAAEC,IAAAA,aAAF;AAAiBC,IAAAA;AAAjB,MACLd,WAAW,CAAEG,gBAAF,CADZ;AAEA,QAAM;AAAEY,IAAAA;AAAF,MAA0BV,MAAM,CAAEL,WAAW,CAAEG,gBAAF,CAAb,CAAtC;AACA,QAAM;AAAEa,IAAAA,oBAAF;AAAwBC,IAAAA;AAAxB,MAAgDZ,MAAM,CAC3DN,SAAS,CAAEI,gBAAF,CADkD,CAA5D,CAZmD,CAgBnD;AACA;AACA;AACA;;AACAF,EAAAA,SAAS,CAAE,MAAM;AAChB,QAAKQ,eAAe,EAAES,MAAtB,EAA+B;AAC9B;AACA;AACA;AACA;AACA;AACAC,MAAAA,MAAM,CAACC,cAAP,CAAuB,MAAM;AAC5B,cAAMC,YAAY,GAAGL,oBAAoB,CAAER,QAAF,CAAzC,CAD4B,CAE5B;AACA;;AACA,cAAMc,YAAY,GAAGb,eAAe,CAACS,MAAhB,CAAuBK,GAAvB,CAA8BC,KAAF,IAChD1B,UAAU,CAAE0B,KAAF,CADU,CAArB;AAGA,cAAMC,eAAe,GAAGR,mBAAmB,CAAEI,YAAF,CAA3C,CAP4B,CAQ5B;AACA;;AACAP,QAAAA,uCAAuC;;AACvCC,QAAAA,mBAAmB,CAAEM,YAAF,EAAgB,SAAhB,CAAnB;;AACAP,QAAAA,uCAAuC;;AACvCD,QAAAA,aAAa,CAAEL,QAAF,EAAYc,YAAZ,CAAb,CAb4B,CAc5B;;AACAR,QAAAA,uCAAuC;;AACvCC,QAAAA,mBAAmB,CAAEM,YAAF,EAAgBI,eAAhB,CAAnB;AACA,OAjBD;AAkBA;AACD,GA1BQ,EA0BN,CACFjB,QADE,EAEFC,eAAe,EAAES,MAFf,EAGFJ,uCAHE,EAIFD,aAJE,EAKFI,mBALE,EAMFF,mBANE,EAOFC,oBAPE,CA1BM,CAAT;AAoCA,QAAMU,KAAK,GAAGtB,aAAa,EAA3B;AAEA,SAAO,0BAAUsB;AAAV,IAAP;AACA,CA3DD;;AA6DA,eAAepB,WAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { cloneBlock } from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useEffect } from '@wordpress/element';\nimport {\n\tstore as blockEditorStore,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\n\nconst PatternEdit = ( { attributes, clientId } ) => {\n\tconst selectedPattern = useSelect(\n\t\t( select ) =>\n\t\t\tselect( blockEditorStore ).__experimentalGetParsedPattern(\n\t\t\t\tattributes.slug\n\t\t\t),\n\t\t[ attributes.slug ]\n\t);\n\n\tconst { replaceBlocks, __unstableMarkNextChangeAsNotPersistent } =\n\t\tuseDispatch( blockEditorStore );\n\tconst { setBlockEditingMode } = unlock( useDispatch( blockEditorStore ) );\n\tconst { getBlockRootClientId, getBlockEditingMode } = unlock(\n\t\tuseSelect( blockEditorStore )\n\t);\n\n\t// Run this effect when the component loads.\n\t// This adds the Pattern's contents to the post.\n\t// This change won't be saved.\n\t// It will continue to pull from the pattern file unless changes are made to its respective template part.\n\tuseEffect( () => {\n\t\tif ( selectedPattern?.blocks ) {\n\t\t\t// We batch updates to block list settings to avoid triggering cascading renders\n\t\t\t// for each container block included in a tree and optimize initial render.\n\t\t\t// Since the above uses microtasks, we need to use a microtask here as well,\n\t\t\t// because nested pattern blocks cannot be inserted if the parent block supports\n\t\t\t// inner blocks but doesn't have blockSettings in the state.\n\t\t\twindow.queueMicrotask( () => {\n\t\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\t\t// Clone blocks from the pattern before insertion to ensure they receive\n\t\t\t\t// distinct client ids. See https://github.com/WordPress/gutenberg/issues/50628.\n\t\t\t\tconst clonedBlocks = selectedPattern.blocks.map( ( block ) =>\n\t\t\t\t\tcloneBlock( block )\n\t\t\t\t);\n\t\t\t\tconst rootEditingMode = getBlockEditingMode( rootClientId );\n\t\t\t\t// Temporarily set the root block to default mode to allow replacing the pattern.\n\t\t\t\t// This could happen when the page is disabling edits of non-content blocks.\n\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\tsetBlockEditingMode( rootClientId, 'default' );\n\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\treplaceBlocks( clientId, clonedBlocks );\n\t\t\t\t// Restore the root block's original mode.\n\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\tsetBlockEditingMode( rootClientId, rootEditingMode );\n\t\t\t} );\n\t\t}\n\t}, [\n\t\tclientId,\n\t\tselectedPattern?.blocks,\n\t\t__unstableMarkNextChangeAsNotPersistent,\n\t\treplaceBlocks,\n\t\tgetBlockEditingMode,\n\t\tsetBlockEditingMode,\n\t\tgetBlockRootClientId,\n\t] );\n\n\tconst props = useBlockProps();\n\n\treturn <div { ...props } />;\n};\n\nexport default PatternEdit;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/block-library",
3
- "version": "8.12.12",
3
+ "version": "8.12.14",
4
4
  "description": "Block library for the WordPress editor.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -37,11 +37,11 @@
37
37
  "@wordpress/api-fetch": "^6.32.1",
38
38
  "@wordpress/autop": "^3.35.1",
39
39
  "@wordpress/blob": "^3.35.1",
40
- "@wordpress/block-editor": "^12.3.10",
41
- "@wordpress/blocks": "^12.12.6",
42
- "@wordpress/components": "^25.1.9",
40
+ "@wordpress/block-editor": "^12.3.12",
41
+ "@wordpress/blocks": "^12.12.7",
42
+ "@wordpress/components": "^25.1.10",
43
43
  "@wordpress/compose": "^6.12.2",
44
- "@wordpress/core-data": "^6.12.10",
44
+ "@wordpress/core-data": "^6.12.12",
45
45
  "@wordpress/data": "^9.5.5",
46
46
  "@wordpress/date": "^4.35.1",
47
47
  "@wordpress/deprecated": "^3.35.1",
@@ -56,9 +56,9 @@
56
56
  "@wordpress/notices": "^4.3.5",
57
57
  "@wordpress/primitives": "^3.33.1",
58
58
  "@wordpress/private-apis": "^0.17.2",
59
- "@wordpress/reusable-blocks": "^4.12.10",
60
- "@wordpress/rich-text": "^6.12.6",
61
- "@wordpress/server-side-render": "^4.12.10",
59
+ "@wordpress/reusable-blocks": "^4.12.12",
60
+ "@wordpress/rich-text": "^6.12.7",
61
+ "@wordpress/server-side-render": "^4.12.12",
62
62
  "@wordpress/url": "^3.36.1",
63
63
  "@wordpress/viewport": "^5.12.5",
64
64
  "@wordpress/wordcount": "^3.35.1",
@@ -83,5 +83,5 @@
83
83
  "publishConfig": {
84
84
  "access": "public"
85
85
  },
86
- "gitHead": "609a9df27d25e3d224dd1e2b97beb1bc02693255"
86
+ "gitHead": "53cd9574a54a643c73e76fe1abaa8d1be489f8f7"
87
87
  }
@@ -17,6 +17,18 @@ export default function FootnotesEdit( { context: { postType, postId } } ) {
17
17
  const footnotes = meta?.footnotes ? JSON.parse( meta.footnotes ) : [];
18
18
  const blockProps = useBlockProps();
19
19
 
20
+ if ( postType !== 'post' && postType !== 'page' ) {
21
+ return (
22
+ <div { ...blockProps }>
23
+ <Placeholder
24
+ icon={ <BlockIcon icon={ icon } /> }
25
+ label={ __( 'Footnotes' ) }
26
+ // To do: add instructions. We can't add new string in RC.
27
+ />
28
+ </div>
29
+ );
30
+ }
31
+
20
32
  if ( ! footnotes.length ) {
21
33
  return (
22
34
  <div { ...blockProps }>