@wordpress/block-editor 8.3.1 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -0
  3. package/build/components/block-list/block-html.js +4 -1
  4. package/build/components/block-list/block-html.js.map +1 -1
  5. package/build/components/block-list/block.js +4 -1
  6. package/build/components/block-list/block.js.map +1 -1
  7. package/build/components/block-list/use-block-props/use-focus-first-element.js +19 -0
  8. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  9. package/build/components/block-lock/index.js +32 -0
  10. package/build/components/block-lock/index.js.map +1 -0
  11. package/build/components/block-lock/menu-item.js +58 -0
  12. package/build/components/block-lock/menu-item.js.map +1 -0
  13. package/build/components/block-lock/modal.js +143 -0
  14. package/build/components/block-lock/modal.js.map +1 -0
  15. package/build/components/block-lock/toolbar.js +70 -0
  16. package/build/components/block-lock/toolbar.js.map +1 -0
  17. package/build/components/block-settings-menu/block-settings-dropdown.js +26 -6
  18. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  19. package/build/components/block-settings-menu-controls/index.js +19 -9
  20. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  21. package/build/components/block-title/use-block-display-title.js +7 -5
  22. package/build/components/block-title/use-block-display-title.js.map +1 -1
  23. package/build/components/block-toolbar/index.js +4 -0
  24. package/build/components/block-toolbar/index.js.map +1 -1
  25. package/build/components/border-radius-control/index.js +0 -1
  26. package/build/components/border-radius-control/index.js.map +1 -1
  27. package/build/components/border-radius-control/utils.js +1 -1
  28. package/build/components/border-radius-control/utils.js.map +1 -1
  29. package/build/components/colors-gradients/control.js +3 -1
  30. package/build/components/colors-gradients/control.js.map +1 -1
  31. package/build/components/date-format-picker/index.js +132 -0
  32. package/build/components/date-format-picker/index.js.map +1 -0
  33. package/build/components/index.js +9 -0
  34. package/build/components/index.js.map +1 -1
  35. package/build/components/line-height-control/index.js +5 -3
  36. package/build/components/line-height-control/index.js.map +1 -1
  37. package/build/components/list-view/block-select-button.js +4 -22
  38. package/build/components/list-view/block-select-button.js.map +1 -1
  39. package/build/components/list-view/block.js +33 -12
  40. package/build/components/list-view/block.js.map +1 -1
  41. package/build/components/list-view/branch.js +16 -13
  42. package/build/components/list-view/branch.js.map +1 -1
  43. package/build/components/list-view/index.js +7 -1
  44. package/build/components/list-view/index.js.map +1 -1
  45. package/build/components/list-view/use-block-selection.js +9 -2
  46. package/build/components/list-view/use-block-selection.js.map +1 -1
  47. package/build/components/rich-text/index.js +2 -2
  48. package/build/components/rich-text/index.js.map +1 -1
  49. package/build/components/rich-text/index.native.js +13 -9
  50. package/build/components/rich-text/index.native.js.map +1 -1
  51. package/build/components/url-popover/image-url-input-ui.js +11 -27
  52. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  53. package/build/hooks/anchor.js +7 -6
  54. package/build/hooks/anchor.js.map +1 -1
  55. package/build/hooks/gap.js +70 -5
  56. package/build/hooks/gap.js.map +1 -1
  57. package/build/layouts/flex.js +8 -5
  58. package/build/layouts/flex.js.map +1 -1
  59. package/build/layouts/flow.js +16 -12
  60. package/build/layouts/flow.js.map +1 -1
  61. package/build/store/defaults.js +1 -0
  62. package/build/store/defaults.js.map +1 -1
  63. package/build/store/selectors.js +29 -3
  64. package/build/store/selectors.js.map +1 -1
  65. package/build-module/components/block-list/block-html.js +5 -2
  66. package/build-module/components/block-list/block-html.js.map +1 -1
  67. package/build-module/components/block-list/block.js +5 -2
  68. package/build-module/components/block-list/block.js.map +1 -1
  69. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +18 -0
  70. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  71. package/build-module/components/block-lock/index.js +4 -0
  72. package/build-module/components/block-lock/index.js.map +1 -0
  73. package/build-module/components/block-lock/menu-item.js +44 -0
  74. package/build-module/components/block-lock/menu-item.js.map +1 -0
  75. package/build-module/components/block-lock/modal.js +128 -0
  76. package/build-module/components/block-lock/modal.js.map +1 -0
  77. package/build-module/components/block-lock/toolbar.js +55 -0
  78. package/build-module/components/block-lock/toolbar.js.map +1 -0
  79. package/build-module/components/block-settings-menu/block-settings-dropdown.js +26 -6
  80. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  81. package/build-module/components/block-settings-menu-controls/index.js +18 -9
  82. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  83. package/build-module/components/block-title/use-block-display-title.js +7 -5
  84. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  85. package/build-module/components/block-toolbar/index.js +3 -0
  86. package/build-module/components/block-toolbar/index.js.map +1 -1
  87. package/build-module/components/border-radius-control/index.js +0 -1
  88. package/build-module/components/border-radius-control/index.js.map +1 -1
  89. package/build-module/components/border-radius-control/utils.js +1 -1
  90. package/build-module/components/border-radius-control/utils.js.map +1 -1
  91. package/build-module/components/colors-gradients/control.js +3 -1
  92. package/build-module/components/colors-gradients/control.js.map +1 -1
  93. package/build-module/components/date-format-picker/index.js +122 -0
  94. package/build-module/components/date-format-picker/index.js.map +1 -0
  95. package/build-module/components/index.js +1 -0
  96. package/build-module/components/index.js.map +1 -1
  97. package/build-module/components/line-height-control/index.js +5 -3
  98. package/build-module/components/line-height-control/index.js.map +1 -1
  99. package/build-module/components/list-view/block-select-button.js +5 -20
  100. package/build-module/components/list-view/block-select-button.js.map +1 -1
  101. package/build-module/components/list-view/block.js +31 -12
  102. package/build-module/components/list-view/block.js.map +1 -1
  103. package/build-module/components/list-view/branch.js +16 -13
  104. package/build-module/components/list-view/branch.js.map +1 -1
  105. package/build-module/components/list-view/index.js +7 -1
  106. package/build-module/components/list-view/index.js.map +1 -1
  107. package/build-module/components/list-view/use-block-selection.js +10 -3
  108. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  109. package/build-module/components/rich-text/index.js +2 -2
  110. package/build-module/components/rich-text/index.js.map +1 -1
  111. package/build-module/components/rich-text/index.native.js +13 -9
  112. package/build-module/components/rich-text/index.native.js.map +1 -1
  113. package/build-module/components/url-popover/image-url-input-ui.js +12 -28
  114. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  115. package/build-module/hooks/anchor.js +7 -6
  116. package/build-module/hooks/anchor.js.map +1 -1
  117. package/build-module/hooks/gap.js +68 -7
  118. package/build-module/hooks/gap.js.map +1 -1
  119. package/build-module/layouts/flex.js +7 -5
  120. package/build-module/layouts/flex.js.map +1 -1
  121. package/build-module/layouts/flow.js +15 -12
  122. package/build-module/layouts/flow.js.map +1 -1
  123. package/build-module/store/defaults.js +1 -0
  124. package/build-module/store/defaults.js.map +1 -1
  125. package/build-module/store/selectors.js +24 -1
  126. package/build-module/store/selectors.js.map +1 -1
  127. package/build-style/style-rtl.css +157 -0
  128. package/build-style/style.css +157 -0
  129. package/package.json +28 -27
  130. package/src/components/block-list/block-html.js +8 -4
  131. package/src/components/block-list/block.js +5 -1
  132. package/src/components/block-list/use-block-props/use-focus-first-element.js +28 -0
  133. package/src/components/block-lock/index.js +3 -0
  134. package/src/components/block-lock/menu-item.js +52 -0
  135. package/src/components/block-lock/modal.js +165 -0
  136. package/src/components/block-lock/style.scss +67 -0
  137. package/src/components/block-lock/toolbar.js +58 -0
  138. package/src/components/block-settings-menu/block-settings-dropdown.js +47 -5
  139. package/src/components/block-settings-menu-controls/index.js +33 -12
  140. package/src/components/block-title/README.md +6 -1
  141. package/src/components/block-title/test/index.js +43 -1
  142. package/src/components/block-title/use-block-display-title.js +9 -6
  143. package/src/components/block-toolbar/index.js +6 -0
  144. package/src/components/block-toolbar/style.scss +4 -0
  145. package/src/components/block-tools/style.scss +29 -0
  146. package/src/components/border-radius-control/index.js +0 -1
  147. package/src/components/border-radius-control/test/utils.js +4 -0
  148. package/src/components/border-radius-control/utils.js +2 -1
  149. package/src/components/color-palette/test/__snapshots__/control.js.snap +70 -4
  150. package/src/components/colors-gradients/control.js +1 -1
  151. package/src/components/colors-gradients/style.scss +6 -0
  152. package/src/components/date-format-picker/README.md +58 -0
  153. package/src/components/date-format-picker/index.js +161 -0
  154. package/src/components/date-format-picker/style.scss +31 -0
  155. package/src/components/index.js +1 -0
  156. package/src/components/line-height-control/index.js +3 -3
  157. package/src/components/link-control/README.md +1 -1
  158. package/src/components/list-view/block-select-button.js +2 -29
  159. package/src/components/list-view/block.js +47 -12
  160. package/src/components/list-view/branch.js +37 -15
  161. package/src/components/list-view/index.js +6 -0
  162. package/src/components/list-view/use-block-selection.js +15 -2
  163. package/src/components/rich-text/index.js +1 -1
  164. package/src/components/rich-text/index.native.js +24 -8
  165. package/src/components/url-popover/image-url-input-ui.js +16 -29
  166. package/src/hooks/anchor.js +8 -6
  167. package/src/hooks/gap.js +83 -12
  168. package/src/hooks/test/gap.js +42 -0
  169. package/src/layouts/flex.js +6 -3
  170. package/src/layouts/flow.js +16 -11
  171. package/src/store/defaults.js +1 -0
  172. package/src/store/selectors.js +26 -1
  173. package/src/store/test/selectors.js +63 -0
  174. package/src/style.scss +2 -0
@@ -10,7 +10,7 @@ import TextareaAutosize from 'react-autosize-textarea';
10
10
 
11
11
  import { useEffect, useState } from '@wordpress/element';
12
12
  import { useSelect, useDispatch } from '@wordpress/data';
13
- import { getBlockAttributes, getBlockContent, getBlockType, isValidBlockContent, getSaveContent } from '@wordpress/blocks';
13
+ import { getBlockAttributes, getBlockContent, getBlockType, getSaveContent, validateBlock } from '@wordpress/blocks';
14
14
  /**
15
15
  * Internal dependencies
16
16
  */
@@ -37,7 +37,10 @@ function BlockHTML(_ref) {
37
37
  const attributes = getBlockAttributes(blockType, html, block.attributes); // If html is empty we reset the block to the default HTML and mark it as valid to avoid triggering an error
38
38
 
39
39
  const content = html ? html : getSaveContent(blockType, attributes);
40
- const isValid = html ? isValidBlockContent(blockType, attributes, content) : true;
40
+ const [isValid] = html ? validateBlock({ ...block,
41
+ attributes,
42
+ originalContent: content
43
+ }) : [true];
41
44
  updateBlock(clientId, {
42
45
  attributes,
43
46
  originalContent: content,
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/block-html.js"],"names":["TextareaAutosize","useEffect","useState","useSelect","useDispatch","getBlockAttributes","getBlockContent","getBlockType","isValidBlockContent","getSaveContent","store","blockEditorStore","BlockHTML","clientId","html","setHtml","block","select","getBlock","updateBlock","onChange","blockType","name","attributes","content","isValid","originalContent","event","target","value"],"mappings":";;AAAA;AACA;AACA;AACA,OAAOA,gBAAP,MAA6B,yBAA7B;AAEA;AACA;AACA;;AACA,SAASC,SAAT,EAAoBC,QAApB,QAAoC,oBAApC;AACA,SAASC,SAAT,EAAoBC,WAApB,QAAuC,iBAAvC;AACA,SACCC,kBADD,EAECC,eAFD,EAGCC,YAHD,EAICC,mBAJD,EAKCC,cALD,QAMO,mBANP;AAQA;AACA;AACA;;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;;AAEA,SAASC,SAAT,OAAmC;AAAA,MAAf;AAAEC,IAAAA;AAAF,GAAe;AAClC,QAAM,CAAEC,IAAF,EAAQC,OAAR,IAAoBb,QAAQ,CAAE,EAAF,CAAlC;AACA,QAAMc,KAAK,GAAGb,SAAS,CACpBc,MAAF,IAAcA,MAAM,CAAEN,gBAAF,CAAN,CAA2BO,QAA3B,CAAqCL,QAArC,CADQ,EAEtB,CAAEA,QAAF,CAFsB,CAAvB;AAIA,QAAM;AAAEM,IAAAA;AAAF,MAAkBf,WAAW,CAAEO,gBAAF,CAAnC;;AACA,QAAMS,QAAQ,GAAG,MAAM;AACtB,UAAMC,SAAS,GAAGd,YAAY,CAAES,KAAK,CAACM,IAAR,CAA9B;;AAEA,QAAK,CAAED,SAAP,EAAmB;AAClB;AACA;;AAED,UAAME,UAAU,GAAGlB,kBAAkB,CACpCgB,SADoC,EAEpCP,IAFoC,EAGpCE,KAAK,CAACO,UAH8B,CAArC,CAPsB,CAatB;;AACA,UAAMC,OAAO,GAAGV,IAAI,GAAGA,IAAH,GAAUL,cAAc,CAAEY,SAAF,EAAaE,UAAb,CAA5C;AACA,UAAME,OAAO,GAAGX,IAAI,GACjBN,mBAAmB,CAAEa,SAAF,EAAaE,UAAb,EAAyBC,OAAzB,CADF,GAEjB,IAFH;AAIAL,IAAAA,WAAW,CAAEN,QAAF,EAAY;AACtBU,MAAAA,UADsB;AAEtBG,MAAAA,eAAe,EAAEF,OAFK;AAGtBC,MAAAA;AAHsB,KAAZ,CAAX,CAnBsB,CAyBtB;;AACA,QAAK,CAAEX,IAAP,EAAc;AACbC,MAAAA,OAAO,CAAE;AAAES,QAAAA;AAAF,OAAF,CAAP;AACA;AACD,GA7BD;;AA+BAvB,EAAAA,SAAS,CAAE,MAAM;AAChBc,IAAAA,OAAO,CAAET,eAAe,CAAEU,KAAF,CAAjB,CAAP;AACA,GAFQ,EAEN,CAAEA,KAAF,CAFM,CAAT;AAIA,SACC,cAAC,gBAAD;AACC,IAAA,SAAS,EAAC,8CADX;AAEC,IAAA,KAAK,EAAGF,IAFT;AAGC,IAAA,MAAM,EAAGM,QAHV;AAIC,IAAA,QAAQ,EAAKO,KAAF,IAAaZ,OAAO,CAAEY,KAAK,CAACC,MAAN,CAAaC,KAAf;AAJhC,IADD;AAQA;;AAED,eAAejB,SAAf","sourcesContent":["/**\n * External dependencies\n */\nimport TextareaAutosize from 'react-autosize-textarea';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useState } from '@wordpress/element';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport {\n\tgetBlockAttributes,\n\tgetBlockContent,\n\tgetBlockType,\n\tisValidBlockContent,\n\tgetSaveContent,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\nfunction BlockHTML( { clientId } ) {\n\tconst [ html, setHtml ] = useState( '' );\n\tconst block = useSelect(\n\t\t( select ) => select( blockEditorStore ).getBlock( clientId ),\n\t\t[ clientId ]\n\t);\n\tconst { updateBlock } = useDispatch( blockEditorStore );\n\tconst onChange = () => {\n\t\tconst blockType = getBlockType( block.name );\n\n\t\tif ( ! blockType ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst attributes = getBlockAttributes(\n\t\t\tblockType,\n\t\t\thtml,\n\t\t\tblock.attributes\n\t\t);\n\n\t\t// If html is empty we reset the block to the default HTML and mark it as valid to avoid triggering an error\n\t\tconst content = html ? html : getSaveContent( blockType, attributes );\n\t\tconst isValid = html\n\t\t\t? isValidBlockContent( blockType, attributes, content )\n\t\t\t: true;\n\n\t\tupdateBlock( clientId, {\n\t\t\tattributes,\n\t\t\toriginalContent: content,\n\t\t\tisValid,\n\t\t} );\n\n\t\t// Ensure the state is updated if we reset so it displays the default content.\n\t\tif ( ! html ) {\n\t\t\tsetHtml( { content } );\n\t\t}\n\t};\n\n\tuseEffect( () => {\n\t\tsetHtml( getBlockContent( block ) );\n\t}, [ block ] );\n\n\treturn (\n\t\t<TextareaAutosize\n\t\t\tclassName=\"block-editor-block-list__block-html-textarea\"\n\t\t\tvalue={ html }\n\t\t\tonBlur={ onChange }\n\t\t\tonChange={ ( event ) => setHtml( event.target.value ) }\n\t\t/>\n\t);\n}\n\nexport default BlockHTML;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/block-html.js"],"names":["TextareaAutosize","useEffect","useState","useSelect","useDispatch","getBlockAttributes","getBlockContent","getBlockType","getSaveContent","validateBlock","store","blockEditorStore","BlockHTML","clientId","html","setHtml","block","select","getBlock","updateBlock","onChange","blockType","name","attributes","content","isValid","originalContent","event","target","value"],"mappings":";;AAAA;AACA;AACA;AACA,OAAOA,gBAAP,MAA6B,yBAA7B;AAEA;AACA;AACA;;AACA,SAASC,SAAT,EAAoBC,QAApB,QAAoC,oBAApC;AACA,SAASC,SAAT,EAAoBC,WAApB,QAAuC,iBAAvC;AACA,SACCC,kBADD,EAECC,eAFD,EAGCC,YAHD,EAICC,cAJD,EAKCC,aALD,QAMO,mBANP;AAQA;AACA;AACA;;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;;AAEA,SAASC,SAAT,OAAmC;AAAA,MAAf;AAAEC,IAAAA;AAAF,GAAe;AAClC,QAAM,CAAEC,IAAF,EAAQC,OAAR,IAAoBb,QAAQ,CAAE,EAAF,CAAlC;AACA,QAAMc,KAAK,GAAGb,SAAS,CACpBc,MAAF,IAAcA,MAAM,CAAEN,gBAAF,CAAN,CAA2BO,QAA3B,CAAqCL,QAArC,CADQ,EAEtB,CAAEA,QAAF,CAFsB,CAAvB;AAIA,QAAM;AAAEM,IAAAA;AAAF,MAAkBf,WAAW,CAAEO,gBAAF,CAAnC;;AACA,QAAMS,QAAQ,GAAG,MAAM;AACtB,UAAMC,SAAS,GAAGd,YAAY,CAAES,KAAK,CAACM,IAAR,CAA9B;;AAEA,QAAK,CAAED,SAAP,EAAmB;AAClB;AACA;;AAED,UAAME,UAAU,GAAGlB,kBAAkB,CACpCgB,SADoC,EAEpCP,IAFoC,EAGpCE,KAAK,CAACO,UAH8B,CAArC,CAPsB,CAatB;;AACA,UAAMC,OAAO,GAAGV,IAAI,GAAGA,IAAH,GAAUN,cAAc,CAAEa,SAAF,EAAaE,UAAb,CAA5C;AACA,UAAM,CAAEE,OAAF,IAAcX,IAAI,GACrBL,aAAa,CAAE,EACf,GAAGO,KADY;AAEfO,MAAAA,UAFe;AAGfG,MAAAA,eAAe,EAAEF;AAHF,KAAF,CADQ,GAMrB,CAAE,IAAF,CANH;AAQAL,IAAAA,WAAW,CAAEN,QAAF,EAAY;AACtBU,MAAAA,UADsB;AAEtBG,MAAAA,eAAe,EAAEF,OAFK;AAGtBC,MAAAA;AAHsB,KAAZ,CAAX,CAvBsB,CA6BtB;;AACA,QAAK,CAAEX,IAAP,EAAc;AACbC,MAAAA,OAAO,CAAE;AAAES,QAAAA;AAAF,OAAF,CAAP;AACA;AACD,GAjCD;;AAmCAvB,EAAAA,SAAS,CAAE,MAAM;AAChBc,IAAAA,OAAO,CAAET,eAAe,CAAEU,KAAF,CAAjB,CAAP;AACA,GAFQ,EAEN,CAAEA,KAAF,CAFM,CAAT;AAIA,SACC,cAAC,gBAAD;AACC,IAAA,SAAS,EAAC,8CADX;AAEC,IAAA,KAAK,EAAGF,IAFT;AAGC,IAAA,MAAM,EAAGM,QAHV;AAIC,IAAA,QAAQ,EAAKO,KAAF,IAAaZ,OAAO,CAAEY,KAAK,CAACC,MAAN,CAAaC,KAAf;AAJhC,IADD;AAQA;;AAED,eAAejB,SAAf","sourcesContent":["/**\n * External dependencies\n */\nimport TextareaAutosize from 'react-autosize-textarea';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useState } from '@wordpress/element';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport {\n\tgetBlockAttributes,\n\tgetBlockContent,\n\tgetBlockType,\n\tgetSaveContent,\n\tvalidateBlock,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\nfunction BlockHTML( { clientId } ) {\n\tconst [ html, setHtml ] = useState( '' );\n\tconst block = useSelect(\n\t\t( select ) => select( blockEditorStore ).getBlock( clientId ),\n\t\t[ clientId ]\n\t);\n\tconst { updateBlock } = useDispatch( blockEditorStore );\n\tconst onChange = () => {\n\t\tconst blockType = getBlockType( block.name );\n\n\t\tif ( ! blockType ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst attributes = getBlockAttributes(\n\t\t\tblockType,\n\t\t\thtml,\n\t\t\tblock.attributes\n\t\t);\n\n\t\t// If html is empty we reset the block to the default HTML and mark it as valid to avoid triggering an error\n\t\tconst content = html ? html : getSaveContent( blockType, attributes );\n\t\tconst [ isValid ] = html\n\t\t\t? validateBlock( {\n\t\t\t\t\t...block,\n\t\t\t\t\tattributes,\n\t\t\t\t\toriginalContent: content,\n\t\t\t } )\n\t\t\t: [ true ];\n\n\t\tupdateBlock( clientId, {\n\t\t\tattributes,\n\t\t\toriginalContent: content,\n\t\t\tisValid,\n\t\t} );\n\n\t\t// Ensure the state is updated if we reset so it displays the default content.\n\t\tif ( ! html ) {\n\t\t\tsetHtml( { content } );\n\t\t}\n\t};\n\n\tuseEffect( () => {\n\t\tsetHtml( getBlockContent( block ) );\n\t}, [ block ] );\n\n\treturn (\n\t\t<TextareaAutosize\n\t\t\tclassName=\"block-editor-block-list__block-html-textarea\"\n\t\t\tvalue={ html }\n\t\t\tonBlur={ onChange }\n\t\t\tonChange={ ( event ) => setHtml( event.target.value ) }\n\t\t/>\n\t);\n}\n\nexport default BlockHTML;\n"]}
@@ -10,7 +10,7 @@ import { omit } from 'lodash';
10
10
  */
11
11
 
12
12
  import { createContext, useMemo, useCallback, RawHTML } from '@wordpress/element';
13
- import { getBlockType, getSaveContent, isUnmodifiedDefaultBlock } from '@wordpress/blocks';
13
+ import { getBlockType, getSaveContent, isUnmodifiedDefaultBlock, serializeRawBlock } from '@wordpress/blocks';
14
14
  import { withFilters } from '@wordpress/components';
15
15
  import { withDispatch, withSelect, useDispatch, useSelect } from '@wordpress/data';
16
16
  import { compose, pure, ifCondition } from '@wordpress/compose';
@@ -69,6 +69,9 @@ function BlockListBlock(_ref2) {
69
69
  var _wrapperProps;
70
70
 
71
71
  let {
72
+ block: {
73
+ __unstableBlockSource
74
+ },
72
75
  mode,
73
76
  isLocked,
74
77
  canRemove,
@@ -138,7 +141,7 @@ function BlockListBlock(_ref2) {
138
141
  let block;
139
142
 
140
143
  if (!isValid) {
141
- const saveContent = getSaveContent(blockType, attributes);
144
+ const saveContent = __unstableBlockSource ? serializeRawBlock(__unstableBlockSource) : getSaveContent(blockType, attributes);
142
145
  block = createElement(Block, {
143
146
  className: "has-warning"
144
147
  }, createElement(BlockInvalidWarning, {
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/block.js"],"names":["classnames","omit","createContext","useMemo","useCallback","RawHTML","getBlockType","getSaveContent","isUnmodifiedDefaultBlock","withFilters","withDispatch","withSelect","useDispatch","useSelect","compose","pure","ifCondition","safeHTML","BlockEdit","BlockInvalidWarning","BlockCrashWarning","BlockCrashBoundary","BlockHtml","useBlockProps","store","blockEditorStore","BlockListBlockContext","mergeWrapperProps","propsA","propsB","newProps","className","style","Block","children","isHtml","props","__unstableIsHtml","BlockListBlock","mode","isLocked","canRemove","clientId","isSelected","isSelectionEnabled","name","isValid","attributes","wrapperProps","setAttributes","onReplace","onInsertBlocksAfter","onMerge","toggleSelection","themeSupportsLayout","select","getSettings","supportsLayout","removeBlock","onRemove","blockEdit","undefined","blockType","getEditWrapperProps","isAligned","block","saveContent","display","apiVersion","value","memoizedValue","Object","values","applyWithSelect","rootClientId","isBlockSelected","getBlockMode","getTemplateLock","__unstableGetBlockWithoutInnerBlocks","canRemoveBlock","canMoveBlock","templateLock","canMove","applyWithDispatch","dispatch","ownProps","updateBlockAttributes","insertBlocks","mergeBlocks","replaceBlocks","__unstableMarkLastChangeAsPersistent","newAttributes","getMultiSelectedBlockClientIds","multiSelectedBlockClientIds","clientIds","length","onInsertBlocks","blocks","index","getBlockIndex","forward","getPreviousBlockClientId","getNextBlockClientId","nextBlockClientId","previousBlockClientId","indexToSelect","initialPosition","selectionEnabled"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\nimport { omit } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tcreateContext,\n\tuseMemo,\n\tuseCallback,\n\tRawHTML,\n} from '@wordpress/element';\nimport {\n\tgetBlockType,\n\tgetSaveContent,\n\tisUnmodifiedDefaultBlock,\n} from '@wordpress/blocks';\nimport { withFilters } from '@wordpress/components';\nimport {\n\twithDispatch,\n\twithSelect,\n\tuseDispatch,\n\tuseSelect,\n} from '@wordpress/data';\nimport { compose, pure, ifCondition } from '@wordpress/compose';\nimport { safeHTML } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport BlockEdit from '../block-edit';\nimport BlockInvalidWarning from './block-invalid-warning';\nimport BlockCrashWarning from './block-crash-warning';\nimport BlockCrashBoundary from './block-crash-boundary';\nimport BlockHtml from './block-html';\nimport { useBlockProps } from './use-block-props';\nimport { store as blockEditorStore } from '../../store';\n\nexport const BlockListBlockContext = createContext();\n\n/**\n * Merges wrapper props with special handling for classNames and styles.\n *\n * @param {Object} propsA\n * @param {Object} propsB\n *\n * @return {Object} Merged props.\n */\nfunction mergeWrapperProps( propsA, propsB ) {\n\tconst newProps = {\n\t\t...propsA,\n\t\t...propsB,\n\t};\n\n\tif ( propsA && propsB && propsA.className && propsB.className ) {\n\t\tnewProps.className = classnames( propsA.className, propsB.className );\n\t}\n\tif ( propsA && propsB && propsA.style && propsB.style ) {\n\t\tnewProps.style = { ...propsA.style, ...propsB.style };\n\t}\n\n\treturn newProps;\n}\n\nfunction Block( { children, isHtml, ...props } ) {\n\treturn (\n\t\t<div { ...useBlockProps( props, { __unstableIsHtml: isHtml } ) }>\n\t\t\t{ children }\n\t\t</div>\n\t);\n}\n\nfunction BlockListBlock( {\n\tmode,\n\tisLocked,\n\tcanRemove,\n\tclientId,\n\tisSelected,\n\tisSelectionEnabled,\n\tclassName,\n\tname,\n\tisValid,\n\tattributes,\n\twrapperProps,\n\tsetAttributes,\n\tonReplace,\n\tonInsertBlocksAfter,\n\tonMerge,\n\ttoggleSelection,\n} ) {\n\tconst themeSupportsLayout = useSelect( ( select ) => {\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\treturn getSettings().supportsLayout;\n\t}, [] );\n\tconst { removeBlock } = useDispatch( blockEditorStore );\n\tconst onRemove = useCallback( () => removeBlock( clientId ), [ clientId ] );\n\n\t// We wrap the BlockEdit component in a div that hides it when editing in\n\t// HTML mode. This allows us to render all of the ancillary pieces\n\t// (InspectorControls, etc.) which are inside `BlockEdit` but not\n\t// `BlockHTML`, even in HTML mode.\n\tlet blockEdit = (\n\t\t<BlockEdit\n\t\t\tname={ name }\n\t\t\tisSelected={ isSelected }\n\t\t\tattributes={ attributes }\n\t\t\tsetAttributes={ setAttributes }\n\t\t\tinsertBlocksAfter={ isLocked ? undefined : onInsertBlocksAfter }\n\t\t\tonReplace={ canRemove ? onReplace : undefined }\n\t\t\tonRemove={ canRemove ? onRemove : undefined }\n\t\t\tmergeBlocks={ canRemove ? onMerge : undefined }\n\t\t\tclientId={ clientId }\n\t\t\tisSelectionEnabled={ isSelectionEnabled }\n\t\t\ttoggleSelection={ toggleSelection }\n\t\t/>\n\t);\n\n\tconst blockType = getBlockType( name );\n\n\t// Determine whether the block has props to apply to the wrapper.\n\tif ( blockType?.getEditWrapperProps ) {\n\t\twrapperProps = mergeWrapperProps(\n\t\t\twrapperProps,\n\t\t\tblockType.getEditWrapperProps( attributes )\n\t\t);\n\t}\n\n\tconst isAligned =\n\t\twrapperProps &&\n\t\t!! wrapperProps[ 'data-align' ] &&\n\t\t! themeSupportsLayout;\n\n\t// For aligned blocks, provide a wrapper element so the block can be\n\t// positioned relative to the block column.\n\t// This is only kept for classic themes that don't support layout\n\t// Historically we used to rely on extra divs and data-align to\n\t// provide the alignments styles in the editor.\n\t// Due to the differences between frontend and backend, we migrated\n\t// to the layout feature, and we're now aligning the markup of frontend\n\t// and backend.\n\tif ( isAligned ) {\n\t\tblockEdit = (\n\t\t\t<div\n\t\t\t\tclassName=\"wp-block\"\n\t\t\t\tdata-align={ wrapperProps[ 'data-align' ] }\n\t\t\t>\n\t\t\t\t{ blockEdit }\n\t\t\t</div>\n\t\t);\n\t}\n\n\tlet block;\n\n\tif ( ! isValid ) {\n\t\tconst saveContent = getSaveContent( blockType, attributes );\n\n\t\tblock = (\n\t\t\t<Block className=\"has-warning\">\n\t\t\t\t<BlockInvalidWarning clientId={ clientId } />\n\t\t\t\t<RawHTML>{ safeHTML( saveContent ) }</RawHTML>\n\t\t\t</Block>\n\t\t);\n\t} else if ( mode === 'html' ) {\n\t\t// Render blockEdit so the inspector controls don't disappear.\n\t\t// See #8969.\n\t\tblock = (\n\t\t\t<>\n\t\t\t\t<div style={ { display: 'none' } }>{ blockEdit }</div>\n\t\t\t\t<Block isHtml>\n\t\t\t\t\t<BlockHtml clientId={ clientId } />\n\t\t\t\t</Block>\n\t\t\t</>\n\t\t);\n\t} else if ( blockType?.apiVersion > 1 ) {\n\t\tblock = blockEdit;\n\t} else {\n\t\tblock = <Block { ...wrapperProps }>{ blockEdit }</Block>;\n\t}\n\n\tconst value = {\n\t\tclientId,\n\t\tclassName:\n\t\t\twrapperProps?.[ 'data-align' ] && themeSupportsLayout\n\t\t\t\t? classnames(\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t`align${ wrapperProps[ 'data-align' ] }`\n\t\t\t\t )\n\t\t\t\t: className,\n\t\twrapperProps: omit( wrapperProps, [ 'data-align' ] ),\n\t\tisAligned,\n\t};\n\tconst memoizedValue = useMemo( () => value, Object.values( value ) );\n\n\treturn (\n\t\t<BlockListBlockContext.Provider value={ memoizedValue }>\n\t\t\t<BlockCrashBoundary\n\t\t\t\tfallback={\n\t\t\t\t\t<Block className=\"has-warning\">\n\t\t\t\t\t\t<BlockCrashWarning />\n\t\t\t\t\t</Block>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{ block }\n\t\t\t</BlockCrashBoundary>\n\t\t</BlockListBlockContext.Provider>\n\t);\n}\n\nconst applyWithSelect = withSelect( ( select, { clientId, rootClientId } ) => {\n\tconst {\n\t\tisBlockSelected,\n\t\tgetBlockMode,\n\t\tisSelectionEnabled,\n\t\tgetTemplateLock,\n\t\t__unstableGetBlockWithoutInnerBlocks,\n\t\tcanRemoveBlock,\n\t\tcanMoveBlock,\n\t} = select( blockEditorStore );\n\tconst block = __unstableGetBlockWithoutInnerBlocks( clientId );\n\tconst isSelected = isBlockSelected( clientId );\n\tconst templateLock = getTemplateLock( rootClientId );\n\tconst canRemove = canRemoveBlock( clientId, rootClientId );\n\tconst canMove = canMoveBlock( clientId, rootClientId );\n\n\t// The fallback to `{}` is a temporary fix.\n\t// This function should never be called when a block is not present in\n\t// the state. It happens now because the order in withSelect rendering\n\t// is not correct.\n\tconst { name, attributes, isValid } = block || {};\n\n\t// Do not add new properties here, use `useSelect` instead to avoid\n\t// leaking new props to the public API (editor.BlockListBlock filter).\n\treturn {\n\t\tmode: getBlockMode( clientId ),\n\t\tisSelectionEnabled: isSelectionEnabled(),\n\t\tisLocked: !! templateLock,\n\t\tcanRemove,\n\t\tcanMove,\n\t\t// Users of the editor.BlockListBlock filter used to be able to\n\t\t// access the block prop.\n\t\t// Ideally these blocks would rely on the clientId prop only.\n\t\t// This is kept for backward compatibility reasons.\n\t\tblock,\n\t\tname,\n\t\tattributes,\n\t\tisValid,\n\t\tisSelected,\n\t};\n} );\n\nconst applyWithDispatch = withDispatch( ( dispatch, ownProps, { select } ) => {\n\tconst {\n\t\tupdateBlockAttributes,\n\t\tinsertBlocks,\n\t\tmergeBlocks,\n\t\treplaceBlocks,\n\t\ttoggleSelection,\n\t\t__unstableMarkLastChangeAsPersistent,\n\t} = dispatch( blockEditorStore );\n\n\t// Do not add new properties here, use `useDispatch` instead to avoid\n\t// leaking new props to the public API (editor.BlockListBlock filter).\n\treturn {\n\t\tsetAttributes( newAttributes ) {\n\t\t\tconst { getMultiSelectedBlockClientIds } = select(\n\t\t\t\tblockEditorStore\n\t\t\t);\n\t\t\tconst multiSelectedBlockClientIds = getMultiSelectedBlockClientIds();\n\t\t\tconst { clientId } = ownProps;\n\t\t\tconst clientIds = multiSelectedBlockClientIds.length\n\t\t\t\t? multiSelectedBlockClientIds\n\t\t\t\t: [ clientId ];\n\n\t\t\tupdateBlockAttributes( clientIds, newAttributes );\n\t\t},\n\t\tonInsertBlocks( blocks, index ) {\n\t\t\tconst { rootClientId } = ownProps;\n\t\t\tinsertBlocks( blocks, index, rootClientId );\n\t\t},\n\t\tonInsertBlocksAfter( blocks ) {\n\t\t\tconst { clientId, rootClientId } = ownProps;\n\t\t\tconst { getBlockIndex } = select( blockEditorStore );\n\t\t\tconst index = getBlockIndex( clientId );\n\t\t\tinsertBlocks( blocks, index + 1, rootClientId );\n\t\t},\n\t\tonMerge( forward ) {\n\t\t\tconst { clientId } = ownProps;\n\t\t\tconst { getPreviousBlockClientId, getNextBlockClientId } = select(\n\t\t\t\tblockEditorStore\n\t\t\t);\n\n\t\t\tif ( forward ) {\n\t\t\t\tconst nextBlockClientId = getNextBlockClientId( clientId );\n\t\t\t\tif ( nextBlockClientId ) {\n\t\t\t\t\tmergeBlocks( clientId, nextBlockClientId );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst previousBlockClientId = getPreviousBlockClientId(\n\t\t\t\t\tclientId\n\t\t\t\t);\n\t\t\t\tif ( previousBlockClientId ) {\n\t\t\t\t\tmergeBlocks( previousBlockClientId, clientId );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonReplace( blocks, indexToSelect, initialPosition ) {\n\t\t\tif (\n\t\t\t\tblocks.length &&\n\t\t\t\t! isUnmodifiedDefaultBlock( blocks[ blocks.length - 1 ] )\n\t\t\t) {\n\t\t\t\t__unstableMarkLastChangeAsPersistent();\n\t\t\t}\n\t\t\treplaceBlocks(\n\t\t\t\t[ ownProps.clientId ],\n\t\t\t\tblocks,\n\t\t\t\tindexToSelect,\n\t\t\t\tinitialPosition\n\t\t\t);\n\t\t},\n\t\ttoggleSelection( selectionEnabled ) {\n\t\t\ttoggleSelection( selectionEnabled );\n\t\t},\n\t};\n} );\n\nexport default compose(\n\tpure,\n\tapplyWithSelect,\n\tapplyWithDispatch,\n\t// Block is sometimes not mounted at the right time, causing it be undefined\n\t// see issue for more info\n\t// https://github.com/WordPress/gutenberg/issues/17013\n\tifCondition( ( { block } ) => !! block ),\n\twithFilters( 'editor.BlockListBlock' )\n)( BlockListBlock );\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/block.js"],"names":["classnames","omit","createContext","useMemo","useCallback","RawHTML","getBlockType","getSaveContent","isUnmodifiedDefaultBlock","serializeRawBlock","withFilters","withDispatch","withSelect","useDispatch","useSelect","compose","pure","ifCondition","safeHTML","BlockEdit","BlockInvalidWarning","BlockCrashWarning","BlockCrashBoundary","BlockHtml","useBlockProps","store","blockEditorStore","BlockListBlockContext","mergeWrapperProps","propsA","propsB","newProps","className","style","Block","children","isHtml","props","__unstableIsHtml","BlockListBlock","block","__unstableBlockSource","mode","isLocked","canRemove","clientId","isSelected","isSelectionEnabled","name","isValid","attributes","wrapperProps","setAttributes","onReplace","onInsertBlocksAfter","onMerge","toggleSelection","themeSupportsLayout","select","getSettings","supportsLayout","removeBlock","onRemove","blockEdit","undefined","blockType","getEditWrapperProps","isAligned","saveContent","display","apiVersion","value","memoizedValue","Object","values","applyWithSelect","rootClientId","isBlockSelected","getBlockMode","getTemplateLock","__unstableGetBlockWithoutInnerBlocks","canRemoveBlock","canMoveBlock","templateLock","canMove","applyWithDispatch","dispatch","ownProps","updateBlockAttributes","insertBlocks","mergeBlocks","replaceBlocks","__unstableMarkLastChangeAsPersistent","newAttributes","getMultiSelectedBlockClientIds","multiSelectedBlockClientIds","clientIds","length","onInsertBlocks","blocks","index","getBlockIndex","forward","getPreviousBlockClientId","getNextBlockClientId","nextBlockClientId","previousBlockClientId","indexToSelect","initialPosition","selectionEnabled"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\nimport { omit } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tcreateContext,\n\tuseMemo,\n\tuseCallback,\n\tRawHTML,\n} from '@wordpress/element';\nimport {\n\tgetBlockType,\n\tgetSaveContent,\n\tisUnmodifiedDefaultBlock,\n\tserializeRawBlock,\n} from '@wordpress/blocks';\nimport { withFilters } from '@wordpress/components';\nimport {\n\twithDispatch,\n\twithSelect,\n\tuseDispatch,\n\tuseSelect,\n} from '@wordpress/data';\nimport { compose, pure, ifCondition } from '@wordpress/compose';\nimport { safeHTML } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport BlockEdit from '../block-edit';\nimport BlockInvalidWarning from './block-invalid-warning';\nimport BlockCrashWarning from './block-crash-warning';\nimport BlockCrashBoundary from './block-crash-boundary';\nimport BlockHtml from './block-html';\nimport { useBlockProps } from './use-block-props';\nimport { store as blockEditorStore } from '../../store';\n\nexport const BlockListBlockContext = createContext();\n\n/**\n * Merges wrapper props with special handling for classNames and styles.\n *\n * @param {Object} propsA\n * @param {Object} propsB\n *\n * @return {Object} Merged props.\n */\nfunction mergeWrapperProps( propsA, propsB ) {\n\tconst newProps = {\n\t\t...propsA,\n\t\t...propsB,\n\t};\n\n\tif ( propsA && propsB && propsA.className && propsB.className ) {\n\t\tnewProps.className = classnames( propsA.className, propsB.className );\n\t}\n\tif ( propsA && propsB && propsA.style && propsB.style ) {\n\t\tnewProps.style = { ...propsA.style, ...propsB.style };\n\t}\n\n\treturn newProps;\n}\n\nfunction Block( { children, isHtml, ...props } ) {\n\treturn (\n\t\t<div { ...useBlockProps( props, { __unstableIsHtml: isHtml } ) }>\n\t\t\t{ children }\n\t\t</div>\n\t);\n}\n\nfunction BlockListBlock( {\n\tblock: { __unstableBlockSource },\n\tmode,\n\tisLocked,\n\tcanRemove,\n\tclientId,\n\tisSelected,\n\tisSelectionEnabled,\n\tclassName,\n\tname,\n\tisValid,\n\tattributes,\n\twrapperProps,\n\tsetAttributes,\n\tonReplace,\n\tonInsertBlocksAfter,\n\tonMerge,\n\ttoggleSelection,\n} ) {\n\tconst themeSupportsLayout = useSelect( ( select ) => {\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\treturn getSettings().supportsLayout;\n\t}, [] );\n\tconst { removeBlock } = useDispatch( blockEditorStore );\n\tconst onRemove = useCallback( () => removeBlock( clientId ), [ clientId ] );\n\n\t// We wrap the BlockEdit component in a div that hides it when editing in\n\t// HTML mode. This allows us to render all of the ancillary pieces\n\t// (InspectorControls, etc.) which are inside `BlockEdit` but not\n\t// `BlockHTML`, even in HTML mode.\n\tlet blockEdit = (\n\t\t<BlockEdit\n\t\t\tname={ name }\n\t\t\tisSelected={ isSelected }\n\t\t\tattributes={ attributes }\n\t\t\tsetAttributes={ setAttributes }\n\t\t\tinsertBlocksAfter={ isLocked ? undefined : onInsertBlocksAfter }\n\t\t\tonReplace={ canRemove ? onReplace : undefined }\n\t\t\tonRemove={ canRemove ? onRemove : undefined }\n\t\t\tmergeBlocks={ canRemove ? onMerge : undefined }\n\t\t\tclientId={ clientId }\n\t\t\tisSelectionEnabled={ isSelectionEnabled }\n\t\t\ttoggleSelection={ toggleSelection }\n\t\t/>\n\t);\n\n\tconst blockType = getBlockType( name );\n\n\t// Determine whether the block has props to apply to the wrapper.\n\tif ( blockType?.getEditWrapperProps ) {\n\t\twrapperProps = mergeWrapperProps(\n\t\t\twrapperProps,\n\t\t\tblockType.getEditWrapperProps( attributes )\n\t\t);\n\t}\n\n\tconst isAligned =\n\t\twrapperProps &&\n\t\t!! wrapperProps[ 'data-align' ] &&\n\t\t! themeSupportsLayout;\n\n\t// For aligned blocks, provide a wrapper element so the block can be\n\t// positioned relative to the block column.\n\t// This is only kept for classic themes that don't support layout\n\t// Historically we used to rely on extra divs and data-align to\n\t// provide the alignments styles in the editor.\n\t// Due to the differences between frontend and backend, we migrated\n\t// to the layout feature, and we're now aligning the markup of frontend\n\t// and backend.\n\tif ( isAligned ) {\n\t\tblockEdit = (\n\t\t\t<div\n\t\t\t\tclassName=\"wp-block\"\n\t\t\t\tdata-align={ wrapperProps[ 'data-align' ] }\n\t\t\t>\n\t\t\t\t{ blockEdit }\n\t\t\t</div>\n\t\t);\n\t}\n\n\tlet block;\n\n\tif ( ! isValid ) {\n\t\tconst saveContent = __unstableBlockSource\n\t\t\t? serializeRawBlock( __unstableBlockSource )\n\t\t\t: getSaveContent( blockType, attributes );\n\n\t\tblock = (\n\t\t\t<Block className=\"has-warning\">\n\t\t\t\t<BlockInvalidWarning clientId={ clientId } />\n\t\t\t\t<RawHTML>{ safeHTML( saveContent ) }</RawHTML>\n\t\t\t</Block>\n\t\t);\n\t} else if ( mode === 'html' ) {\n\t\t// Render blockEdit so the inspector controls don't disappear.\n\t\t// See #8969.\n\t\tblock = (\n\t\t\t<>\n\t\t\t\t<div style={ { display: 'none' } }>{ blockEdit }</div>\n\t\t\t\t<Block isHtml>\n\t\t\t\t\t<BlockHtml clientId={ clientId } />\n\t\t\t\t</Block>\n\t\t\t</>\n\t\t);\n\t} else if ( blockType?.apiVersion > 1 ) {\n\t\tblock = blockEdit;\n\t} else {\n\t\tblock = <Block { ...wrapperProps }>{ blockEdit }</Block>;\n\t}\n\n\tconst value = {\n\t\tclientId,\n\t\tclassName:\n\t\t\twrapperProps?.[ 'data-align' ] && themeSupportsLayout\n\t\t\t\t? classnames(\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t`align${ wrapperProps[ 'data-align' ] }`\n\t\t\t\t )\n\t\t\t\t: className,\n\t\twrapperProps: omit( wrapperProps, [ 'data-align' ] ),\n\t\tisAligned,\n\t};\n\tconst memoizedValue = useMemo( () => value, Object.values( value ) );\n\n\treturn (\n\t\t<BlockListBlockContext.Provider value={ memoizedValue }>\n\t\t\t<BlockCrashBoundary\n\t\t\t\tfallback={\n\t\t\t\t\t<Block className=\"has-warning\">\n\t\t\t\t\t\t<BlockCrashWarning />\n\t\t\t\t\t</Block>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{ block }\n\t\t\t</BlockCrashBoundary>\n\t\t</BlockListBlockContext.Provider>\n\t);\n}\n\nconst applyWithSelect = withSelect( ( select, { clientId, rootClientId } ) => {\n\tconst {\n\t\tisBlockSelected,\n\t\tgetBlockMode,\n\t\tisSelectionEnabled,\n\t\tgetTemplateLock,\n\t\t__unstableGetBlockWithoutInnerBlocks,\n\t\tcanRemoveBlock,\n\t\tcanMoveBlock,\n\t} = select( blockEditorStore );\n\tconst block = __unstableGetBlockWithoutInnerBlocks( clientId );\n\tconst isSelected = isBlockSelected( clientId );\n\tconst templateLock = getTemplateLock( rootClientId );\n\tconst canRemove = canRemoveBlock( clientId, rootClientId );\n\tconst canMove = canMoveBlock( clientId, rootClientId );\n\n\t// The fallback to `{}` is a temporary fix.\n\t// This function should never be called when a block is not present in\n\t// the state. It happens now because the order in withSelect rendering\n\t// is not correct.\n\tconst { name, attributes, isValid } = block || {};\n\n\t// Do not add new properties here, use `useSelect` instead to avoid\n\t// leaking new props to the public API (editor.BlockListBlock filter).\n\treturn {\n\t\tmode: getBlockMode( clientId ),\n\t\tisSelectionEnabled: isSelectionEnabled(),\n\t\tisLocked: !! templateLock,\n\t\tcanRemove,\n\t\tcanMove,\n\t\t// Users of the editor.BlockListBlock filter used to be able to\n\t\t// access the block prop.\n\t\t// Ideally these blocks would rely on the clientId prop only.\n\t\t// This is kept for backward compatibility reasons.\n\t\tblock,\n\t\tname,\n\t\tattributes,\n\t\tisValid,\n\t\tisSelected,\n\t};\n} );\n\nconst applyWithDispatch = withDispatch( ( dispatch, ownProps, { select } ) => {\n\tconst {\n\t\tupdateBlockAttributes,\n\t\tinsertBlocks,\n\t\tmergeBlocks,\n\t\treplaceBlocks,\n\t\ttoggleSelection,\n\t\t__unstableMarkLastChangeAsPersistent,\n\t} = dispatch( blockEditorStore );\n\n\t// Do not add new properties here, use `useDispatch` instead to avoid\n\t// leaking new props to the public API (editor.BlockListBlock filter).\n\treturn {\n\t\tsetAttributes( newAttributes ) {\n\t\t\tconst { getMultiSelectedBlockClientIds } = select(\n\t\t\t\tblockEditorStore\n\t\t\t);\n\t\t\tconst multiSelectedBlockClientIds = getMultiSelectedBlockClientIds();\n\t\t\tconst { clientId } = ownProps;\n\t\t\tconst clientIds = multiSelectedBlockClientIds.length\n\t\t\t\t? multiSelectedBlockClientIds\n\t\t\t\t: [ clientId ];\n\n\t\t\tupdateBlockAttributes( clientIds, newAttributes );\n\t\t},\n\t\tonInsertBlocks( blocks, index ) {\n\t\t\tconst { rootClientId } = ownProps;\n\t\t\tinsertBlocks( blocks, index, rootClientId );\n\t\t},\n\t\tonInsertBlocksAfter( blocks ) {\n\t\t\tconst { clientId, rootClientId } = ownProps;\n\t\t\tconst { getBlockIndex } = select( blockEditorStore );\n\t\t\tconst index = getBlockIndex( clientId );\n\t\t\tinsertBlocks( blocks, index + 1, rootClientId );\n\t\t},\n\t\tonMerge( forward ) {\n\t\t\tconst { clientId } = ownProps;\n\t\t\tconst { getPreviousBlockClientId, getNextBlockClientId } = select(\n\t\t\t\tblockEditorStore\n\t\t\t);\n\n\t\t\tif ( forward ) {\n\t\t\t\tconst nextBlockClientId = getNextBlockClientId( clientId );\n\t\t\t\tif ( nextBlockClientId ) {\n\t\t\t\t\tmergeBlocks( clientId, nextBlockClientId );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst previousBlockClientId = getPreviousBlockClientId(\n\t\t\t\t\tclientId\n\t\t\t\t);\n\t\t\t\tif ( previousBlockClientId ) {\n\t\t\t\t\tmergeBlocks( previousBlockClientId, clientId );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonReplace( blocks, indexToSelect, initialPosition ) {\n\t\t\tif (\n\t\t\t\tblocks.length &&\n\t\t\t\t! isUnmodifiedDefaultBlock( blocks[ blocks.length - 1 ] )\n\t\t\t) {\n\t\t\t\t__unstableMarkLastChangeAsPersistent();\n\t\t\t}\n\t\t\treplaceBlocks(\n\t\t\t\t[ ownProps.clientId ],\n\t\t\t\tblocks,\n\t\t\t\tindexToSelect,\n\t\t\t\tinitialPosition\n\t\t\t);\n\t\t},\n\t\ttoggleSelection( selectionEnabled ) {\n\t\t\ttoggleSelection( selectionEnabled );\n\t\t},\n\t};\n} );\n\nexport default compose(\n\tpure,\n\tapplyWithSelect,\n\tapplyWithDispatch,\n\t// Block is sometimes not mounted at the right time, causing it be undefined\n\t// see issue for more info\n\t// https://github.com/WordPress/gutenberg/issues/17013\n\tifCondition( ( { block } ) => !! block ),\n\twithFilters( 'editor.BlockListBlock' )\n)( BlockListBlock );\n"]}
@@ -48,6 +48,13 @@ function useInitialPosition(clientId) {
48
48
  return getSelectedBlocksInitialCaretPosition();
49
49
  }, [clientId]);
50
50
  }
51
+
52
+ function isFormElement(element) {
53
+ const {
54
+ tagName
55
+ } = element;
56
+ return tagName === 'INPUT' || tagName === 'BUTTON' || tagName === 'SELECT' || tagName === 'TEXTAREA';
57
+ }
51
58
  /**
52
59
  * Transitions focus to the block or inner tabbable when the block becomes
53
60
  * selected and an initial position is set.
@@ -88,6 +95,17 @@ export function useFocusFirstElement(clientId) {
88
95
  if (!isInsideRootBlock(ref.current, target)) {
89
96
  ref.current.focus();
90
97
  return;
98
+ } // Check to see if element is focussable before a generic caret insert.
99
+
100
+
101
+ if (!target.getAttribute('contenteditable')) {
102
+ const focusElement = focus.tabbable.findNext(target); // Make sure focusElement is valid, form field, and within the current target element.
103
+ // Ensure is not block inserter trigger, don't want to focus that in the event of the group block which doesn't contain any other focussable elements.
104
+
105
+ if (focusElement && isFormElement(focusElement) && target.contains(focusElement) && !focusElement.classList.contains('block-editor-button-block-appender')) {
106
+ focusElement.focus();
107
+ return;
108
+ }
91
109
  }
92
110
 
93
111
  setContentEditableWrapper(ref.current, false);
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/use-block-props/use-focus-first-element.js"],"names":["first","last","useEffect","useRef","focus","isTextField","placeCaretAtHorizontalEdge","useSelect","isInsideRootBlock","store","blockEditorStore","setContentEditableWrapper","useInitialPosition","clientId","select","getSelectedBlocksInitialCaretPosition","isMultiSelecting","isNavigationMode","isBlockSelected","useFocusFirstElement","ref","initialPosition","undefined","current","ownerDocument","contains","activeElement","textInputs","tabbable","find","filter","node","isReverse","target"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,KAAT,EAAgBC,IAAhB,QAA4B,QAA5B;AAEA;AACA;AACA;;AACA,SAASC,SAAT,EAAoBC,MAApB,QAAkC,oBAAlC;AACA,SAASC,KAAT,EAAgBC,WAAhB,EAA6BC,0BAA7B,QAA+D,gBAA/D;AACA,SAASC,SAAT,QAA0B,iBAA1B;AAEA;AACA;AACA;;AACA,SAASC,iBAAT,QAAkC,oBAAlC;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,gBAA1C;AACA,SAASC,yBAAT,QAA0C,uBAA1C;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASC,kBAAT,CAA6BC,QAA7B,EAAwC;AACvC,SAAON,SAAS,CACbO,MAAF,IAAc;AACb,UAAM;AACLC,MAAAA,qCADK;AAELC,MAAAA,gBAFK;AAGLC,MAAAA,gBAHK;AAILC,MAAAA;AAJK,QAKFJ,MAAM,CAAEJ,gBAAF,CALV;;AAOA,QAAK,CAAEQ,eAAe,CAAEL,QAAF,CAAtB,EAAqC;AACpC;AACA;;AAED,QAAKG,gBAAgB,MAAMC,gBAAgB,EAA3C,EAAgD;AAC/C;AACA,KAdY,CAgBb;;;AACA,WAAOF,qCAAqC,EAA5C;AACA,GAnBc,EAoBf,CAAEF,QAAF,CApBe,CAAhB;AAsBA;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,OAAO,SAASM,oBAAT,CAA+BN,QAA/B,EAA0C;AAChD,QAAMO,GAAG,GAAGjB,MAAM,EAAlB;AACA,QAAMkB,eAAe,GAAGT,kBAAkB,CAAEC,QAAF,CAA1C;AAEAX,EAAAA,SAAS,CAAE,MAAM;AAChB,QAAKmB,eAAe,KAAKC,SAApB,IAAiCD,eAAe,KAAK,IAA1D,EAAiE;AAChE;AACA;;AAED,QAAK,CAAED,GAAG,CAACG,OAAX,EAAqB;AACpB;AACA;;AAED,UAAM;AAAEC,MAAAA;AAAF,QAAoBJ,GAAG,CAACG,OAA9B,CATgB,CAWhB;;AACA,QAAKH,GAAG,CAACG,OAAJ,CAAYE,QAAZ,CAAsBD,aAAa,CAACE,aAApC,CAAL,EAA2D;AAC1D;AACA,KAde,CAgBhB;;;AACA,UAAMC,UAAU,GAAGvB,KAAK,CAACwB,QAAN,CACjBC,IADiB,CACXT,GAAG,CAACG,OADO,EAEjBO,MAFiB,CAEPC,IAAF,IAAY1B,WAAW,CAAE0B,IAAF,CAFd,CAAnB,CAjBgB,CAqBhB;AACA;;AACA,UAAMC,SAAS,GAAG,CAAC,CAAD,KAAOX,eAAzB;AACA,UAAMY,MAAM,GACX,CAAED,SAAS,GAAG/B,IAAH,GAAUD,KAArB,EAA8B2B,UAA9B,KAA8CP,GAAG,CAACG,OADnD;;AAGA,QAAK,CAAEf,iBAAiB,CAAEY,GAAG,CAACG,OAAN,EAAeU,MAAf,CAAxB,EAAkD;AACjDb,MAAAA,GAAG,CAACG,OAAJ,CAAYnB,KAAZ;AACA;AACA;;AAEDO,IAAAA,yBAAyB,CAAES,GAAG,CAACG,OAAN,EAAe,KAAf,CAAzB;AAEAjB,IAAAA,0BAA0B,CAAE2B,MAAF,EAAUD,SAAV,CAA1B;AACA,GAnCQ,EAmCN,CAAEX,eAAF,CAnCM,CAAT;AAqCA,SAAOD,GAAP;AACA","sourcesContent":["/**\n * External dependencies\n */\nimport { first, last } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useRef } from '@wordpress/element';\nimport { focus, isTextField, placeCaretAtHorizontalEdge } from '@wordpress/dom';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { isInsideRootBlock } from '../../../utils/dom';\nimport { store as blockEditorStore } from '../../../store';\nimport { setContentEditableWrapper } from './use-multi-selection';\n\n/** @typedef {import('@wordpress/element').RefObject} RefObject */\n\n/**\n * Returns the initial position if the block needs to be focussed, `undefined`\n * otherwise. The initial position is either 0 (start) or -1 (end).\n *\n * @param {string} clientId Block client ID.\n *\n * @return {number} The initial position, either 0 (start) or -1 (end).\n */\nfunction useInitialPosition( clientId ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetSelectedBlocksInitialCaretPosition,\n\t\t\t\tisMultiSelecting,\n\t\t\t\tisNavigationMode,\n\t\t\t\tisBlockSelected,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tif ( ! isBlockSelected( clientId ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isMultiSelecting() || isNavigationMode() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there's no initial position, return 0 to focus the start.\n\t\t\treturn getSelectedBlocksInitialCaretPosition();\n\t\t},\n\t\t[ clientId ]\n\t);\n}\n\n/**\n * Transitions focus to the block or inner tabbable when the block becomes\n * selected and an initial position is set.\n *\n * @param {string} clientId Block client ID.\n *\n * @return {RefObject} React ref with the block element.\n */\nexport function useFocusFirstElement( clientId ) {\n\tconst ref = useRef();\n\tconst initialPosition = useInitialPosition( clientId );\n\n\tuseEffect( () => {\n\t\tif ( initialPosition === undefined || initialPosition === null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! ref.current ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { ownerDocument } = ref.current;\n\n\t\t// Do not focus the block if it already contains the active element.\n\t\tif ( ref.current.contains( ownerDocument.activeElement ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find all tabbables within node.\n\t\tconst textInputs = focus.tabbable\n\t\t\t.find( ref.current )\n\t\t\t.filter( ( node ) => isTextField( node ) );\n\n\t\t// If reversed (e.g. merge via backspace), use the last in the set of\n\t\t// tabbables.\n\t\tconst isReverse = -1 === initialPosition;\n\t\tconst target =\n\t\t\t( isReverse ? last : first )( textInputs ) || ref.current;\n\n\t\tif ( ! isInsideRootBlock( ref.current, target ) ) {\n\t\t\tref.current.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tsetContentEditableWrapper( ref.current, false );\n\n\t\tplaceCaretAtHorizontalEdge( target, isReverse );\n\t}, [ initialPosition ] );\n\n\treturn ref;\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-list/use-block-props/use-focus-first-element.js"],"names":["first","last","useEffect","useRef","focus","isTextField","placeCaretAtHorizontalEdge","useSelect","isInsideRootBlock","store","blockEditorStore","setContentEditableWrapper","useInitialPosition","clientId","select","getSelectedBlocksInitialCaretPosition","isMultiSelecting","isNavigationMode","isBlockSelected","isFormElement","element","tagName","useFocusFirstElement","ref","initialPosition","undefined","current","ownerDocument","contains","activeElement","textInputs","tabbable","find","filter","node","isReverse","target","getAttribute","focusElement","findNext","classList"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { first, last } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useRef } from '@wordpress/element';\nimport { focus, isTextField, placeCaretAtHorizontalEdge } from '@wordpress/dom';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { isInsideRootBlock } from '../../../utils/dom';\nimport { store as blockEditorStore } from '../../../store';\nimport { setContentEditableWrapper } from './use-multi-selection';\n\n/** @typedef {import('@wordpress/element').RefObject} RefObject */\n\n/**\n * Returns the initial position if the block needs to be focussed, `undefined`\n * otherwise. The initial position is either 0 (start) or -1 (end).\n *\n * @param {string} clientId Block client ID.\n *\n * @return {number} The initial position, either 0 (start) or -1 (end).\n */\nfunction useInitialPosition( clientId ) {\n\treturn useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetSelectedBlocksInitialCaretPosition,\n\t\t\t\tisMultiSelecting,\n\t\t\t\tisNavigationMode,\n\t\t\t\tisBlockSelected,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tif ( ! isBlockSelected( clientId ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isMultiSelecting() || isNavigationMode() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there's no initial position, return 0 to focus the start.\n\t\t\treturn getSelectedBlocksInitialCaretPosition();\n\t\t},\n\t\t[ clientId ]\n\t);\n}\n\nfunction isFormElement( element ) {\n\tconst { tagName } = element;\n\treturn (\n\t\ttagName === 'INPUT' ||\n\t\ttagName === 'BUTTON' ||\n\t\ttagName === 'SELECT' ||\n\t\ttagName === 'TEXTAREA'\n\t);\n}\n\n/**\n * Transitions focus to the block or inner tabbable when the block becomes\n * selected and an initial position is set.\n *\n * @param {string} clientId Block client ID.\n *\n * @return {RefObject} React ref with the block element.\n */\nexport function useFocusFirstElement( clientId ) {\n\tconst ref = useRef();\n\tconst initialPosition = useInitialPosition( clientId );\n\n\tuseEffect( () => {\n\t\tif ( initialPosition === undefined || initialPosition === null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! ref.current ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { ownerDocument } = ref.current;\n\n\t\t// Do not focus the block if it already contains the active element.\n\t\tif ( ref.current.contains( ownerDocument.activeElement ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find all tabbables within node.\n\t\tconst textInputs = focus.tabbable\n\t\t\t.find( ref.current )\n\t\t\t.filter( ( node ) => isTextField( node ) );\n\n\t\t// If reversed (e.g. merge via backspace), use the last in the set of\n\t\t// tabbables.\n\t\tconst isReverse = -1 === initialPosition;\n\t\tconst target =\n\t\t\t( isReverse ? last : first )( textInputs ) || ref.current;\n\n\t\tif ( ! isInsideRootBlock( ref.current, target ) ) {\n\t\t\tref.current.focus();\n\t\t\treturn;\n\t\t}\n\n\t\t// Check to see if element is focussable before a generic caret insert.\n\t\tif ( ! target.getAttribute( 'contenteditable' ) ) {\n\t\t\tconst focusElement = focus.tabbable.findNext( target );\n\t\t\t// Make sure focusElement is valid, form field, and within the current target element.\n\t\t\t// Ensure is not block inserter trigger, don't want to focus that in the event of the group block which doesn't contain any other focussable elements.\n\t\t\tif (\n\t\t\t\tfocusElement &&\n\t\t\t\tisFormElement( focusElement ) &&\n\t\t\t\ttarget.contains( focusElement ) &&\n\t\t\t\t! focusElement.classList.contains(\n\t\t\t\t\t'block-editor-button-block-appender'\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tfocusElement.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tsetContentEditableWrapper( ref.current, false );\n\n\t\tplaceCaretAtHorizontalEdge( target, isReverse );\n\t}, [ initialPosition ] );\n\n\treturn ref;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { default as BlockLockMenuItem } from './menu-item';
2
+ export { default as BlockLockModal } from './modal';
3
+ export { default as BlockLockToolbar } from './toolbar';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/index.js"],"names":["default","BlockLockMenuItem","BlockLockModal","BlockLockToolbar"],"mappings":"AAAA,SAASA,OAAO,IAAIC,iBAApB,QAA6C,aAA7C;AACA,SAASD,OAAO,IAAIE,cAApB,QAA0C,SAA1C;AACA,SAASF,OAAO,IAAIG,gBAApB,QAA4C,WAA5C","sourcesContent":["export { default as BlockLockMenuItem } from './menu-item';\nexport { default as BlockLockModal } from './modal';\nexport { default as BlockLockToolbar } from './toolbar';\n"]}
@@ -0,0 +1,44 @@
1
+ import { createElement, Fragment } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { __ } from '@wordpress/i18n';
7
+ import { useReducer } from '@wordpress/element';
8
+ import { MenuItem } from '@wordpress/components';
9
+ import { useSelect } from '@wordpress/data';
10
+ import { lock, unlock } from '@wordpress/icons';
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+
15
+ import BlockLockModal from './modal';
16
+ import { store as blockEditorStore } from '../../store';
17
+ export default function BlockLockMenuItem(_ref) {
18
+ let {
19
+ clientId
20
+ } = _ref;
21
+ const {
22
+ isLocked
23
+ } = useSelect(select => {
24
+ const {
25
+ canMoveBlock,
26
+ canRemoveBlock,
27
+ getBlockRootClientId
28
+ } = select(blockEditorStore);
29
+ const rootClientId = getBlockRootClientId(clientId);
30
+ return {
31
+ isLocked: !canMoveBlock(clientId, rootClientId) || !canRemoveBlock(clientId, rootClientId)
32
+ };
33
+ }, [clientId]);
34
+ const [isModalOpen, toggleModal] = useReducer(isActive => !isActive, false);
35
+ const label = isLocked ? __('Unlock') : __('Lock');
36
+ return createElement(Fragment, null, createElement(MenuItem, {
37
+ icon: isLocked ? unlock : lock,
38
+ onClick: toggleModal
39
+ }, label), isModalOpen && createElement(BlockLockModal, {
40
+ clientId: clientId,
41
+ onClose: toggleModal
42
+ }));
43
+ }
44
+ //# sourceMappingURL=menu-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/menu-item.js"],"names":["__","useReducer","MenuItem","useSelect","lock","unlock","BlockLockModal","store","blockEditorStore","BlockLockMenuItem","clientId","isLocked","select","canMoveBlock","canRemoveBlock","getBlockRootClientId","rootClientId","isModalOpen","toggleModal","isActive","label"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,QAAmB,iBAAnB;AACA,SAASC,UAAT,QAA2B,oBAA3B;AACA,SAASC,QAAT,QAAyB,uBAAzB;AACA,SAASC,SAAT,QAA0B,iBAA1B;AACA,SAASC,IAAT,EAAeC,MAAf,QAA6B,kBAA7B;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,SAA3B;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AAEA,eAAe,SAASC,iBAAT,OAA2C;AAAA,MAAf;AAAEC,IAAAA;AAAF,GAAe;AACzD,QAAM;AAAEC,IAAAA;AAAF,MAAeR,SAAS,CAC3BS,MAAF,IAAc;AACb,UAAM;AACLC,MAAAA,YADK;AAELC,MAAAA,cAFK;AAGLC,MAAAA;AAHK,QAIFH,MAAM,CAAEJ,gBAAF,CAJV;AAKA,UAAMQ,YAAY,GAAGD,oBAAoB,CAAEL,QAAF,CAAzC;AAEA,WAAO;AACNC,MAAAA,QAAQ,EACP,CAAEE,YAAY,CAAEH,QAAF,EAAYM,YAAZ,CAAd,IACA,CAAEF,cAAc,CAAEJ,QAAF,EAAYM,YAAZ;AAHX,KAAP;AAKA,GAd4B,EAe7B,CAAEN,QAAF,CAf6B,CAA9B;AAkBA,QAAM,CAAEO,WAAF,EAAeC,WAAf,IAA+BjB,UAAU,CAC5CkB,QAAF,IAAgB,CAAEA,QAD4B,EAE9C,KAF8C,CAA/C;AAKA,QAAMC,KAAK,GAAGT,QAAQ,GAAGX,EAAE,CAAE,QAAF,CAAL,GAAoBA,EAAE,CAAE,MAAF,CAA5C;AAEA,SACC,8BACC,cAAC,QAAD;AAAU,IAAA,IAAI,EAAGW,QAAQ,GAAGN,MAAH,GAAYD,IAArC;AAA4C,IAAA,OAAO,EAAGc;AAAtD,KACGE,KADH,CADD,EAIGH,WAAW,IACZ,cAAC,cAAD;AAAgB,IAAA,QAAQ,EAAGP,QAA3B;AAAsC,IAAA,OAAO,EAAGQ;AAAhD,IALF,CADD;AAUA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useReducer } from '@wordpress/element';\nimport { MenuItem } from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { lock, unlock } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport BlockLockModal from './modal';\nimport { store as blockEditorStore } from '../../store';\n\nexport default function BlockLockMenuItem( { clientId } ) {\n\tconst { isLocked } = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tcanMoveBlock,\n\t\t\t\tcanRemoveBlock,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\n\t\t\treturn {\n\t\t\t\tisLocked:\n\t\t\t\t\t! canMoveBlock( clientId, rootClientId ) ||\n\t\t\t\t\t! canRemoveBlock( clientId, rootClientId ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst [ isModalOpen, toggleModal ] = useReducer(\n\t\t( isActive ) => ! isActive,\n\t\tfalse\n\t);\n\n\tconst label = isLocked ? __( 'Unlock' ) : __( 'Lock' );\n\n\treturn (\n\t\t<>\n\t\t\t<MenuItem icon={ isLocked ? unlock : lock } onClick={ toggleModal }>\n\t\t\t\t{ label }\n\t\t\t</MenuItem>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<BlockLockModal clientId={ clientId } onClose={ toggleModal } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
@@ -0,0 +1,128 @@
1
+ import { createElement, Fragment } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { __, sprintf } from '@wordpress/i18n';
7
+ import { useEffect, useState } from '@wordpress/element';
8
+ import { Button, CheckboxControl, Flex, FlexItem, Icon, Modal } from '@wordpress/components';
9
+ import { dragHandle, trash } from '@wordpress/icons';
10
+ import { useInstanceId } from '@wordpress/compose';
11
+ import { useDispatch, useSelect } from '@wordpress/data';
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+
16
+ import useBlockDisplayInformation from '../use-block-display-information';
17
+ import { store as blockEditorStore } from '../../store';
18
+ export default function BlockLockModal(_ref) {
19
+ let {
20
+ clientId,
21
+ onClose
22
+ } = _ref;
23
+ const [lock, setLock] = useState({
24
+ move: false,
25
+ remove: false
26
+ });
27
+ const {
28
+ canMove,
29
+ canRemove
30
+ } = useSelect(select => {
31
+ const {
32
+ canMoveBlock,
33
+ canRemoveBlock,
34
+ getBlockRootClientId
35
+ } = select(blockEditorStore);
36
+ const rootClientId = getBlockRootClientId(clientId);
37
+ return {
38
+ canMove: canMoveBlock(clientId, rootClientId),
39
+ canRemove: canRemoveBlock(clientId, rootClientId)
40
+ };
41
+ }, [clientId]);
42
+ const {
43
+ updateBlockAttributes
44
+ } = useDispatch(blockEditorStore);
45
+ const blockInformation = useBlockDisplayInformation(clientId);
46
+ const instanceId = useInstanceId(BlockLockModal, 'block-editor-block-lock-modal__options-title');
47
+ useEffect(() => {
48
+ setLock({
49
+ move: !canMove,
50
+ remove: !canRemove
51
+ });
52
+ }, [canMove, canRemove]);
53
+ const isAllChecked = Object.values(lock).every(Boolean);
54
+ let ariaChecked;
55
+
56
+ if (isAllChecked) {
57
+ ariaChecked = 'true';
58
+ } else if (Object.values(lock).some(Boolean)) {
59
+ ariaChecked = 'mixed';
60
+ } else {
61
+ ariaChecked = 'false';
62
+ }
63
+
64
+ return createElement(Modal, {
65
+ title: sprintf(
66
+ /* translators: %s: Name of the block. */
67
+ __('Lock %s'), blockInformation.title),
68
+ overlayClassName: "block-editor-block-lock-modal",
69
+ closeLabel: __('Close'),
70
+ onRequestClose: onClose
71
+ }, createElement("form", {
72
+ onSubmit: event => {
73
+ event.preventDefault();
74
+ updateBlockAttributes([clientId], {
75
+ lock
76
+ });
77
+ onClose();
78
+ }
79
+ }, createElement("p", null, __('Choose specific attributes to restrict or lock all available options.')), createElement("div", {
80
+ role: "group",
81
+ "aria-labelledby": instanceId,
82
+ className: "block-editor-block-lock-modal__options"
83
+ }, createElement(CheckboxControl, {
84
+ className: "block-editor-block-lock-modal__options-title",
85
+ label: createElement("span", {
86
+ id: instanceId
87
+ }, __('Lock all')),
88
+ checked: isAllChecked,
89
+ "aria-checked": ariaChecked,
90
+ onChange: newValue => setLock({
91
+ move: newValue,
92
+ remove: newValue
93
+ })
94
+ }), createElement("ul", {
95
+ className: "block-editor-block-lock-modal__checklist"
96
+ }, createElement("li", {
97
+ className: "block-editor-block-lock-modal__checklist-item"
98
+ }, createElement(CheckboxControl, {
99
+ label: createElement(Fragment, null, __('Disable movement'), createElement(Icon, {
100
+ icon: dragHandle
101
+ })),
102
+ checked: lock.move,
103
+ onChange: move => setLock(prevLock => ({ ...prevLock,
104
+ move
105
+ }))
106
+ })), createElement("li", {
107
+ className: "block-editor-block-lock-modal__checklist-item"
108
+ }, createElement(CheckboxControl, {
109
+ label: createElement(Fragment, null, __('Prevent removal'), createElement(Icon, {
110
+ icon: trash
111
+ })),
112
+ checked: lock.remove,
113
+ onChange: remove => setLock(prevLock => ({ ...prevLock,
114
+ remove
115
+ }))
116
+ })))), createElement(Flex, {
117
+ className: "block-editor-block-lock-modal__actions",
118
+ justify: "flex-end",
119
+ expanded: false
120
+ }, createElement(FlexItem, null, createElement(Button, {
121
+ variant: "tertiary",
122
+ onClick: onClose
123
+ }, __('Cancel'))), createElement(FlexItem, null, createElement(Button, {
124
+ variant: "primary",
125
+ type: "submit"
126
+ }, __('Apply'))))));
127
+ }
128
+ //# sourceMappingURL=modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/modal.js"],"names":["__","sprintf","useEffect","useState","Button","CheckboxControl","Flex","FlexItem","Icon","Modal","dragHandle","trash","useInstanceId","useDispatch","useSelect","useBlockDisplayInformation","store","blockEditorStore","BlockLockModal","clientId","onClose","lock","setLock","move","remove","canMove","canRemove","select","canMoveBlock","canRemoveBlock","getBlockRootClientId","rootClientId","updateBlockAttributes","blockInformation","instanceId","isAllChecked","Object","values","every","Boolean","ariaChecked","some","title","event","preventDefault","newValue","prevLock"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { useEffect, useState } from '@wordpress/element';\nimport {\n\tButton,\n\tCheckboxControl,\n\tFlex,\n\tFlexItem,\n\tIcon,\n\tModal,\n} from '@wordpress/components';\nimport { dragHandle, trash } from '@wordpress/icons';\nimport { useInstanceId } from '@wordpress/compose';\nimport { useDispatch, useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport useBlockDisplayInformation from '../use-block-display-information';\nimport { store as blockEditorStore } from '../../store';\n\nexport default function BlockLockModal( { clientId, onClose } ) {\n\tconst [ lock, setLock ] = useState( { move: false, remove: false } );\n\tconst { canMove, canRemove } = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tcanMoveBlock,\n\t\t\t\tcanRemoveBlock,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\n\t\t\treturn {\n\t\t\t\tcanMove: canMoveBlock( clientId, rootClientId ),\n\t\t\t\tcanRemove: canRemoveBlock( clientId, rootClientId ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\tconst blockInformation = useBlockDisplayInformation( clientId );\n\tconst instanceId = useInstanceId(\n\t\tBlockLockModal,\n\t\t'block-editor-block-lock-modal__options-title'\n\t);\n\n\tuseEffect( () => {\n\t\tsetLock( {\n\t\t\tmove: ! canMove,\n\t\t\tremove: ! canRemove,\n\t\t} );\n\t}, [ canMove, canRemove ] );\n\n\tconst isAllChecked = Object.values( lock ).every( Boolean );\n\n\tlet ariaChecked;\n\tif ( isAllChecked ) {\n\t\tariaChecked = 'true';\n\t} else if ( Object.values( lock ).some( Boolean ) ) {\n\t\tariaChecked = 'mixed';\n\t} else {\n\t\tariaChecked = 'false';\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\ttitle={ sprintf(\n\t\t\t\t/* translators: %s: Name of the block. */\n\t\t\t\t__( 'Lock %s' ),\n\t\t\t\tblockInformation.title\n\t\t\t) }\n\t\t\toverlayClassName=\"block-editor-block-lock-modal\"\n\t\t\tcloseLabel={ __( 'Close' ) }\n\t\t\tonRequestClose={ onClose }\n\t\t>\n\t\t\t<form\n\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tupdateBlockAttributes( [ clientId ], { lock } );\n\t\t\t\t\tonClose();\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<p>\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'Choose specific attributes to restrict or lock all available options.'\n\t\t\t\t\t) }\n\t\t\t\t</p>\n\t\t\t\t<div\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\taria-labelledby={ instanceId }\n\t\t\t\t\tclassName=\"block-editor-block-lock-modal__options\"\n\t\t\t\t>\n\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\tclassName=\"block-editor-block-lock-modal__options-title\"\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t<span id={ instanceId }>{ __( 'Lock all' ) }</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchecked={ isAllChecked }\n\t\t\t\t\t\taria-checked={ ariaChecked }\n\t\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\t\tsetLock( {\n\t\t\t\t\t\t\t\tmove: newValue,\n\t\t\t\t\t\t\t\tremove: newValue,\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\t<ul className=\"block-editor-block-lock-modal__checklist\">\n\t\t\t\t\t\t<li className=\"block-editor-block-lock-modal__checklist-item\">\n\t\t\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Disable movement' ) }\n\t\t\t\t\t\t\t\t\t\t<Icon icon={ dragHandle } />\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\tchecked={ lock.move }\n\t\t\t\t\t\t\t\tonChange={ ( move ) =>\n\t\t\t\t\t\t\t\t\tsetLock( ( prevLock ) => ( {\n\t\t\t\t\t\t\t\t\t\t...prevLock,\n\t\t\t\t\t\t\t\t\t\tmove,\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/>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"block-editor-block-lock-modal__checklist-item\">\n\t\t\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Prevent removal' ) }\n\t\t\t\t\t\t\t\t\t\t<Icon icon={ trash } />\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\tchecked={ lock.remove }\n\t\t\t\t\t\t\t\tonChange={ ( remove ) =>\n\t\t\t\t\t\t\t\t\tsetLock( ( prevLock ) => ( {\n\t\t\t\t\t\t\t\t\t\t...prevLock,\n\t\t\t\t\t\t\t\t\t\tremove,\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/>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<Flex\n\t\t\t\t\tclassName=\"block-editor-block-lock-modal__actions\"\n\t\t\t\t\tjustify=\"flex-end\"\n\t\t\t\t\texpanded={ false }\n\t\t\t\t>\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<Button variant=\"tertiary\" onClick={ onClose }>\n\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<Button variant=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t{ __( 'Apply' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t</Flex>\n\t\t\t</form>\n\t\t</Modal>\n\t);\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import { createElement, Fragment } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { __, sprintf } from '@wordpress/i18n';
7
+ import { ToolbarButton, ToolbarGroup } from '@wordpress/components';
8
+ import { useReducer } from '@wordpress/element';
9
+ import { lock } from '@wordpress/icons';
10
+ import { useSelect } from '@wordpress/data';
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+
15
+ import BlockLockModal from './modal';
16
+ import useBlockDisplayInformation from '../use-block-display-information';
17
+ import { store as blockEditorStore } from '../../store';
18
+ export default function BlockLockToolbar(_ref) {
19
+ let {
20
+ clientId
21
+ } = _ref;
22
+ const blockInformation = useBlockDisplayInformation(clientId);
23
+ const {
24
+ canMove,
25
+ canRemove
26
+ } = useSelect(select => {
27
+ const {
28
+ canMoveBlock,
29
+ canRemoveBlock
30
+ } = select(blockEditorStore);
31
+ return {
32
+ canMove: canMoveBlock(clientId),
33
+ canRemove: canRemoveBlock(clientId)
34
+ };
35
+ }, [clientId]);
36
+ const [isModalOpen, toggleModal] = useReducer(isActive => !isActive, false);
37
+
38
+ if (canMove && canRemove) {
39
+ return null;
40
+ }
41
+
42
+ return createElement(Fragment, null, createElement(ToolbarGroup, {
43
+ className: "block-editor-block-lock-toolbar"
44
+ }, createElement(ToolbarButton, {
45
+ icon: lock,
46
+ label: sprintf(
47
+ /* translators: %s: block name */
48
+ __('Unlock %s'), blockInformation.title),
49
+ onClick: toggleModal
50
+ })), isModalOpen && createElement(BlockLockModal, {
51
+ clientId: clientId,
52
+ onClose: toggleModal
53
+ }));
54
+ }
55
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/toolbar.js"],"names":["__","sprintf","ToolbarButton","ToolbarGroup","useReducer","lock","useSelect","BlockLockModal","useBlockDisplayInformation","store","blockEditorStore","BlockLockToolbar","clientId","blockInformation","canMove","canRemove","select","canMoveBlock","canRemoveBlock","isModalOpen","toggleModal","isActive","title"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,EAAaC,OAAb,QAA4B,iBAA5B;AACA,SAASC,aAAT,EAAwBC,YAAxB,QAA4C,uBAA5C;AACA,SAASC,UAAT,QAA2B,oBAA3B;AACA,SAASC,IAAT,QAAqB,kBAArB;AACA,SAASC,SAAT,QAA0B,iBAA1B;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,SAA3B;AACA,OAAOC,0BAAP,MAAuC,kCAAvC;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AAEA,eAAe,SAASC,gBAAT,OAA0C;AAAA,MAAf;AAAEC,IAAAA;AAAF,GAAe;AACxD,QAAMC,gBAAgB,GAAGL,0BAA0B,CAAEI,QAAF,CAAnD;AACA,QAAM;AAAEE,IAAAA,OAAF;AAAWC,IAAAA;AAAX,MAAyBT,SAAS,CACrCU,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,YAAF;AAAgBC,MAAAA;AAAhB,QAAmCF,MAAM,CAAEN,gBAAF,CAA/C;AAEA,WAAO;AACNI,MAAAA,OAAO,EAAEG,YAAY,CAAEL,QAAF,CADf;AAENG,MAAAA,SAAS,EAAEG,cAAc,CAAEN,QAAF;AAFnB,KAAP;AAIA,GARsC,EASvC,CAAEA,QAAF,CATuC,CAAxC;AAYA,QAAM,CAAEO,WAAF,EAAeC,WAAf,IAA+BhB,UAAU,CAC5CiB,QAAF,IAAgB,CAAEA,QAD4B,EAE9C,KAF8C,CAA/C;;AAKA,MAAKP,OAAO,IAAIC,SAAhB,EAA4B;AAC3B,WAAO,IAAP;AACA;;AAED,SACC,8BACC,cAAC,YAAD;AAAc,IAAA,SAAS,EAAC;AAAxB,KACC,cAAC,aAAD;AACC,IAAA,IAAI,EAAGV,IADR;AAEC,IAAA,KAAK,EAAGJ,OAAO;AACd;AACAD,IAAAA,EAAE,CAAE,WAAF,CAFY,EAGda,gBAAgB,CAACS,KAHH,CAFhB;AAOC,IAAA,OAAO,EAAGF;AAPX,IADD,CADD,EAYGD,WAAW,IACZ,cAAC,cAAD;AAAgB,IAAA,QAAQ,EAAGP,QAA3B;AAAsC,IAAA,OAAO,EAAGQ;AAAhD,IAbF,CADD;AAkBA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { ToolbarButton, ToolbarGroup } from '@wordpress/components';\nimport { useReducer } from '@wordpress/element';\nimport { lock } from '@wordpress/icons';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport BlockLockModal from './modal';\nimport useBlockDisplayInformation from '../use-block-display-information';\nimport { store as blockEditorStore } from '../../store';\n\nexport default function BlockLockToolbar( { clientId } ) {\n\tconst blockInformation = useBlockDisplayInformation( clientId );\n\tconst { canMove, canRemove } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { canMoveBlock, canRemoveBlock } = select( blockEditorStore );\n\n\t\t\treturn {\n\t\t\t\tcanMove: canMoveBlock( clientId ),\n\t\t\t\tcanRemove: canRemoveBlock( clientId ),\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst [ isModalOpen, toggleModal ] = useReducer(\n\t\t( isActive ) => ! isActive,\n\t\tfalse\n\t);\n\n\tif ( canMove && canRemove ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<ToolbarGroup className=\"block-editor-block-lock-toolbar\">\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ticon={ lock }\n\t\t\t\t\tlabel={ sprintf(\n\t\t\t\t\t\t/* translators: %s: block name */\n\t\t\t\t\t\t__( 'Unlock %s' ),\n\t\t\t\t\t\tblockInformation.title\n\t\t\t\t\t) }\n\t\t\t\t\tonClick={ toggleModal }\n\t\t\t\t/>\n\t\t\t</ToolbarGroup>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<BlockLockModal clientId={ clientId } onClose={ toggleModal } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
@@ -56,13 +56,22 @@ export function BlockSettingsDropdown(_ref2) {
56
56
  const count = blockClientIds.length;
57
57
  const firstBlockClientId = blockClientIds[0];
58
58
  const {
59
- onlyBlock
59
+ onlyBlock,
60
+ previousBlockClientId,
61
+ nextBlockClientId,
62
+ selectedBlockClientIds
60
63
  } = useSelect(select => {
61
64
  const {
62
- getBlockCount
65
+ getBlockCount,
66
+ getPreviousBlockClientId,
67
+ getNextBlockClientId,
68
+ getSelectedBlockClientIds
63
69
  } = select(blockEditorStore);
64
70
  return {
65
- onlyBlock: 1 === getBlockCount()
71
+ onlyBlock: 1 === getBlockCount(),
72
+ previousBlockClientId: getPreviousBlockClientId(firstBlockClientId),
73
+ nextBlockClientId: getNextBlockClientId(firstBlockClientId),
74
+ selectedBlockClientIds: getSelectedBlockClientIds()
66
75
  };
67
76
  }, [firstBlockClientId]);
68
77
  const shortcuts = useSelect(select => {
@@ -76,7 +85,7 @@ export function BlockSettingsDropdown(_ref2) {
76
85
  insertBefore: getShortcutRepresentation('core/block-editor/insert-before')
77
86
  };
78
87
  }, []);
79
- const updateSelection = useCallback(__experimentalSelectBlock ? async clientIdsPromise => {
88
+ const updateSelectionAfterDuplicate = useCallback(__experimentalSelectBlock ? async clientIdsPromise => {
80
89
  const ids = await clientIdsPromise;
81
90
 
82
91
  if (ids && ids[0]) {
@@ -84,6 +93,17 @@ export function BlockSettingsDropdown(_ref2) {
84
93
  }
85
94
  } : noop, [__experimentalSelectBlock]);
86
95
  const blockTitle = useBlockDisplayTitle(firstBlockClientId, 25);
96
+ const updateSelectionAfterRemove = useCallback(__experimentalSelectBlock ? () => {
97
+ const blockToSelect = previousBlockClientId || nextBlockClientId;
98
+
99
+ if (blockToSelect && // From the block options dropdown, it's possible to remove a block that is not selected,
100
+ // in this case, it's not necessary to update the selection since the selected block wasn't removed.
101
+ selectedBlockClientIds.includes(firstBlockClientId) && // Don't update selection when next/prev block also is in the selection ( and gets removed ),
102
+ // In case someone selects all blocks and removes them at once.
103
+ !selectedBlockClientIds.includes(blockToSelect)) {
104
+ __experimentalSelectBlock(blockToSelect);
105
+ }
106
+ } : noop, [__experimentalSelectBlock, previousBlockClientId, nextBlockClientId, selectedBlockClientIds]);
87
107
  const label = sprintf(
88
108
  /* translators: %s: block name */
89
109
  __('Remove %s'), blockTitle);
@@ -125,7 +145,7 @@ export function BlockSettingsDropdown(_ref2) {
125
145
  blocks: blocks,
126
146
  onCopy: onCopy
127
147
  }), canDuplicate && createElement(MenuItem, {
128
- onClick: flow(onClose, onDuplicate, updateSelection),
148
+ onClick: flow(onClose, onDuplicate, updateSelectionAfterDuplicate),
129
149
  shortcut: shortcuts.duplicate
130
150
  }, __('Duplicate')), canInsertDefaultBlock && createElement(Fragment, null, createElement(MenuItem, {
131
151
  onClick: flow(onClose, onInsertBefore),
@@ -148,7 +168,7 @@ export function BlockSettingsDropdown(_ref2) {
148
168
  }) : Children.map(child => cloneElement(child, {
149
169
  onClose
150
170
  })), canRemove && createElement(MenuGroup, null, createElement(MenuItem, {
151
- onClick: flow(onClose, onRemove, updateSelection),
171
+ onClick: flow(onClose, onRemove, updateSelectionAfterRemove),
152
172
  shortcut: shortcuts.remove
153
173
  }, removeBlockLabel)));
154
174
  });