@wordpress/editor 13.24.1 → 13.26.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 (307) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE.md +1 -1
  3. package/build/components/document-bar/index.js +164 -0
  4. package/build/components/document-bar/index.js.map +1 -0
  5. package/build/components/document-outline/index.js +82 -1
  6. package/build/components/document-outline/index.js.map +1 -1
  7. package/build/components/document-tools/index.js +160 -0
  8. package/build/components/document-tools/index.js.map +1 -0
  9. package/build/components/editor-canvas/edit-template-blocks-notification.js +106 -0
  10. package/build/components/editor-canvas/edit-template-blocks-notification.js.map +1 -0
  11. package/build/components/editor-canvas/index.js +298 -0
  12. package/build/components/editor-canvas/index.js.map +1 -0
  13. package/build/components/entities-saved-states/index.js +3 -1
  14. package/build/components/entities-saved-states/index.js.map +1 -1
  15. package/build/components/global-keyboard-shortcuts/index.js +12 -2
  16. package/build/components/global-keyboard-shortcuts/index.js.map +1 -1
  17. package/build/components/global-keyboard-shortcuts/register-shortcuts.js +9 -0
  18. package/build/components/global-keyboard-shortcuts/register-shortcuts.js.map +1 -1
  19. package/build/components/index.js +72 -8
  20. package/build/components/index.js.map +1 -1
  21. package/build/components/index.native.js +9 -1
  22. package/build/components/index.native.js.map +1 -1
  23. package/build/components/inserter-sidebar/index.js +77 -0
  24. package/build/components/inserter-sidebar/index.js.map +1 -0
  25. package/build/components/list-view-sidebar/index.js +150 -0
  26. package/build/components/list-view-sidebar/index.js.map +1 -0
  27. package/build/components/list-view-sidebar/list-view-outline.js +28 -0
  28. package/build/components/list-view-sidebar/list-view-outline.js.map +1 -0
  29. package/build/components/offline-status/index.native.js +85 -0
  30. package/build/components/offline-status/index.native.js.map +1 -0
  31. package/build/components/page-attributes/panel.js +63 -0
  32. package/build/components/page-attributes/panel.js.map +1 -0
  33. package/build/components/post-discussion/panel.js +59 -0
  34. package/build/components/post-discussion/panel.js.map +1 -0
  35. package/build/components/post-excerpt/check.js +19 -0
  36. package/build/components/post-excerpt/check.js.map +1 -1
  37. package/build/components/post-excerpt/panel.js +55 -0
  38. package/build/components/post-excerpt/panel.js.map +1 -0
  39. package/build/components/post-excerpt/plugin.js +72 -0
  40. package/build/components/post-excerpt/plugin.js.map +1 -0
  41. package/build/components/post-featured-image/index.js +5 -8
  42. package/build/components/post-featured-image/index.js.map +1 -1
  43. package/build/components/post-featured-image/panel.js +60 -0
  44. package/build/components/post-featured-image/panel.js.map +1 -0
  45. package/build/components/post-last-revision/panel.js +27 -0
  46. package/build/components/post-last-revision/panel.js.map +1 -0
  47. package/build/components/post-publish-button/index.js +1 -0
  48. package/build/components/post-publish-button/index.js.map +1 -1
  49. package/build/components/post-publish-panel/maybe-upload-media.js +2 -4
  50. package/build/components/post-publish-panel/maybe-upload-media.js.map +1 -1
  51. package/build/components/post-saved-state/index.js +13 -8
  52. package/build/components/post-saved-state/index.js.map +1 -1
  53. package/build/components/post-schedule/panel.js +1 -1
  54. package/build/components/post-schedule/panel.js.map +1 -1
  55. package/build/components/post-taxonomies/panel.js +68 -0
  56. package/build/components/post-taxonomies/panel.js.map +1 -0
  57. package/build/components/post-template/block-theme.js +100 -0
  58. package/build/components/post-template/block-theme.js.map +1 -0
  59. package/build/components/post-template/classic-theme.js +171 -0
  60. package/build/components/post-template/classic-theme.js.map +1 -0
  61. package/build/components/post-template/create-new-template-modal.js +98 -0
  62. package/build/components/post-template/create-new-template-modal.js.map +1 -0
  63. package/build/components/post-template/create-new-template.js +55 -0
  64. package/build/components/post-template/create-new-template.js.map +1 -0
  65. package/build/components/post-template/hooks.js +88 -0
  66. package/build/components/post-template/hooks.js.map +1 -0
  67. package/build/components/post-template/panel.js +70 -0
  68. package/build/components/post-template/panel.js.map +1 -0
  69. package/build/components/post-template/reset-default-template.js +48 -0
  70. package/build/components/post-template/reset-default-template.js.map +1 -0
  71. package/build/components/post-template/swap-template-button.js +86 -0
  72. package/build/components/post-template/swap-template-button.js.map +1 -0
  73. package/build/components/post-title/index.native.js +25 -15
  74. package/build/components/post-title/index.native.js.map +1 -1
  75. package/build/components/post-view-link/index.js +58 -0
  76. package/build/components/post-view-link/index.js.map +1 -0
  77. package/build/components/post-visibility/check.js +5 -17
  78. package/build/components/post-visibility/check.js.map +1 -1
  79. package/build/components/preview-dropdown/index.js +118 -0
  80. package/build/components/preview-dropdown/index.js.map +1 -0
  81. package/build/components/provider/index.js +24 -82
  82. package/build/components/provider/index.js.map +1 -1
  83. package/build/components/provider/index.native.js +36 -8
  84. package/build/components/provider/index.native.js.map +1 -1
  85. package/build/components/provider/navigation-block-editing-mode.js +40 -0
  86. package/build/components/provider/navigation-block-editing-mode.js.map +1 -0
  87. package/build/components/provider/use-block-editor-settings.js +38 -15
  88. package/build/components/provider/use-block-editor-settings.js.map +1 -1
  89. package/build/hooks/index.js +1 -0
  90. package/build/hooks/index.js.map +1 -1
  91. package/build/hooks/pattern-partial-syncing.js +49 -0
  92. package/build/hooks/pattern-partial-syncing.js.map +1 -0
  93. package/build/private-apis.js +14 -0
  94. package/build/private-apis.js.map +1 -1
  95. package/build/store/actions.js +161 -13
  96. package/build/store/actions.js.map +1 -1
  97. package/build/store/defaults.js +2 -1
  98. package/build/store/defaults.js.map +1 -1
  99. package/build/store/index.js +5 -0
  100. package/build/store/index.js.map +1 -1
  101. package/build/store/private-actions.js +52 -0
  102. package/build/store/private-actions.js.map +1 -0
  103. package/build/store/private-selectors.js +52 -0
  104. package/build/store/private-selectors.js.map +1 -0
  105. package/build/store/reducer.js +109 -27
  106. package/build/store/reducer.js.map +1 -1
  107. package/build/store/reducer.native.js +0 -1
  108. package/build/store/reducer.native.js.map +1 -1
  109. package/build/store/selectors.js +104 -9
  110. package/build/store/selectors.js.map +1 -1
  111. package/build/utils/media-upload/index.js +8 -2
  112. package/build/utils/media-upload/index.js.map +1 -1
  113. package/build-module/components/document-bar/index.js +156 -0
  114. package/build-module/components/document-bar/index.js.map +1 -0
  115. package/build-module/components/document-outline/index.js +82 -1
  116. package/build-module/components/document-outline/index.js.map +1 -1
  117. package/build-module/components/document-tools/index.js +151 -0
  118. package/build-module/components/document-tools/index.js.map +1 -0
  119. package/build-module/components/editor-canvas/edit-template-blocks-notification.js +100 -0
  120. package/build-module/components/editor-canvas/edit-template-blocks-notification.js.map +1 -0
  121. package/build-module/components/editor-canvas/index.js +289 -0
  122. package/build-module/components/editor-canvas/index.js.map +1 -0
  123. package/build-module/components/entities-saved-states/index.js +3 -1
  124. package/build-module/components/entities-saved-states/index.js.map +1 -1
  125. package/build-module/components/global-keyboard-shortcuts/index.js +12 -2
  126. package/build-module/components/global-keyboard-shortcuts/index.js.map +1 -1
  127. package/build-module/components/global-keyboard-shortcuts/register-shortcuts.js +9 -0
  128. package/build-module/components/global-keyboard-shortcuts/register-shortcuts.js.map +1 -1
  129. package/build-module/components/index.js +9 -1
  130. package/build-module/components/index.js.map +1 -1
  131. package/build-module/components/index.native.js +1 -0
  132. package/build-module/components/index.native.js.map +1 -1
  133. package/build-module/components/inserter-sidebar/index.js +70 -0
  134. package/build-module/components/inserter-sidebar/index.js.map +1 -0
  135. package/build-module/components/list-view-sidebar/index.js +142 -0
  136. package/build-module/components/list-view-sidebar/index.js.map +1 -0
  137. package/build-module/components/list-view-sidebar/list-view-outline.js +20 -0
  138. package/build-module/components/list-view-sidebar/list-view-outline.js.map +1 -0
  139. package/build-module/components/offline-status/index.native.js +77 -0
  140. package/build-module/components/offline-status/index.native.js.map +1 -0
  141. package/build-module/components/page-attributes/panel.js +53 -0
  142. package/build-module/components/page-attributes/panel.js.map +1 -0
  143. package/build-module/components/post-discussion/panel.js +50 -0
  144. package/build-module/components/post-discussion/panel.js.map +1 -0
  145. package/build-module/components/post-excerpt/check.js +19 -0
  146. package/build-module/components/post-excerpt/check.js.map +1 -1
  147. package/build-module/components/post-excerpt/panel.js +48 -0
  148. package/build-module/components/post-excerpt/panel.js.map +1 -0
  149. package/build-module/components/post-excerpt/plugin.js +64 -0
  150. package/build-module/components/post-excerpt/plugin.js.map +1 -0
  151. package/build-module/components/post-featured-image/index.js +5 -8
  152. package/build-module/components/post-featured-image/index.js.map +1 -1
  153. package/build-module/components/post-featured-image/panel.js +51 -0
  154. package/build-module/components/post-featured-image/panel.js.map +1 -0
  155. package/build-module/components/post-last-revision/panel.js +18 -0
  156. package/build-module/components/post-last-revision/panel.js.map +1 -0
  157. package/build-module/components/post-publish-button/index.js +1 -0
  158. package/build-module/components/post-publish-button/index.js.map +1 -1
  159. package/build-module/components/post-publish-panel/maybe-upload-media.js +2 -4
  160. package/build-module/components/post-publish-panel/maybe-upload-media.js.map +1 -1
  161. package/build-module/components/post-saved-state/index.js +13 -8
  162. package/build-module/components/post-saved-state/index.js.map +1 -1
  163. package/build-module/components/post-schedule/panel.js +1 -1
  164. package/build-module/components/post-schedule/panel.js.map +1 -1
  165. package/build-module/components/post-taxonomies/panel.js +59 -0
  166. package/build-module/components/post-taxonomies/panel.js.map +1 -0
  167. package/build-module/components/post-template/block-theme.js +92 -0
  168. package/build-module/components/post-template/block-theme.js.map +1 -0
  169. package/build-module/components/post-template/classic-theme.js +162 -0
  170. package/build-module/components/post-template/classic-theme.js.map +1 -0
  171. package/build-module/components/post-template/create-new-template-modal.js +91 -0
  172. package/build-module/components/post-template/create-new-template-modal.js.map +1 -0
  173. package/build-module/components/post-template/create-new-template.js +47 -0
  174. package/build-module/components/post-template/create-new-template.js.map +1 -0
  175. package/build-module/components/post-template/hooks.js +78 -0
  176. package/build-module/components/post-template/hooks.js.map +1 -0
  177. package/build-module/components/post-template/panel.js +62 -0
  178. package/build-module/components/post-template/panel.js.map +1 -0
  179. package/build-module/components/post-template/reset-default-template.js +41 -0
  180. package/build-module/components/post-template/reset-default-template.js.map +1 -0
  181. package/build-module/components/post-template/swap-template-button.js +79 -0
  182. package/build-module/components/post-template/swap-template-button.js.map +1 -0
  183. package/build-module/components/post-title/index.native.js +26 -16
  184. package/build-module/components/post-title/index.native.js.map +1 -1
  185. package/build-module/components/post-view-link/index.js +51 -0
  186. package/build-module/components/post-view-link/index.js.map +1 -0
  187. package/build-module/components/post-visibility/check.js +6 -16
  188. package/build-module/components/post-visibility/check.js.map +1 -1
  189. package/build-module/components/preview-dropdown/index.js +110 -0
  190. package/build-module/components/preview-dropdown/index.js.map +1 -0
  191. package/build-module/components/provider/index.js +25 -83
  192. package/build-module/components/provider/index.js.map +1 -1
  193. package/build-module/components/provider/index.native.js +37 -9
  194. package/build-module/components/provider/index.native.js.map +1 -1
  195. package/build-module/components/provider/navigation-block-editing-mode.js +34 -0
  196. package/build-module/components/provider/navigation-block-editing-mode.js.map +1 -0
  197. package/build-module/components/provider/use-block-editor-settings.js +38 -15
  198. package/build-module/components/provider/use-block-editor-settings.js.map +1 -1
  199. package/build-module/hooks/index.js +1 -0
  200. package/build-module/hooks/index.js.map +1 -1
  201. package/build-module/hooks/pattern-partial-syncing.js +46 -0
  202. package/build-module/hooks/pattern-partial-syncing.js.map +1 -0
  203. package/build-module/private-apis.js +14 -0
  204. package/build-module/private-apis.js.map +1 -1
  205. package/build-module/store/actions.js +147 -9
  206. package/build-module/store/actions.js.map +1 -1
  207. package/build-module/store/defaults.js +2 -1
  208. package/build-module/store/defaults.js.map +1 -1
  209. package/build-module/store/index.js +5 -0
  210. package/build-module/store/index.js.map +1 -1
  211. package/build-module/store/private-actions.js +44 -0
  212. package/build-module/store/private-actions.js.map +1 -0
  213. package/build-module/store/private-selectors.js +43 -0
  214. package/build-module/store/private-selectors.js.map +1 -0
  215. package/build-module/store/reducer.js +103 -26
  216. package/build-module/store/reducer.js.map +1 -1
  217. package/build-module/store/reducer.native.js +1 -2
  218. package/build-module/store/reducer.native.js.map +1 -1
  219. package/build-module/store/selectors.js +93 -6
  220. package/build-module/store/selectors.js.map +1 -1
  221. package/build-module/utils/media-upload/index.js +8 -2
  222. package/build-module/utils/media-upload/index.js.map +1 -1
  223. package/build-style/style-rtl.css +433 -0
  224. package/build-style/style.css +433 -0
  225. package/package.json +32 -31
  226. package/src/components/document-bar/index.js +193 -0
  227. package/src/components/document-bar/style.scss +130 -0
  228. package/src/components/document-outline/index.js +48 -1
  229. package/src/components/document-outline/style.scss +12 -0
  230. package/src/components/document-tools/index.js +177 -0
  231. package/src/components/document-tools/style.scss +98 -0
  232. package/src/components/editor-canvas/edit-template-blocks-notification.js +108 -0
  233. package/src/components/editor-canvas/index.js +386 -0
  234. package/src/components/editor-canvas/style.scss +5 -0
  235. package/src/components/entities-saved-states/index.js +3 -1
  236. package/src/components/entities-saved-states/style.scss +4 -0
  237. package/src/components/global-keyboard-shortcuts/index.js +12 -2
  238. package/src/components/global-keyboard-shortcuts/register-shortcuts.js +10 -0
  239. package/src/components/index.js +9 -1
  240. package/src/components/index.native.js +1 -0
  241. package/src/components/inserter-sidebar/index.js +73 -0
  242. package/src/components/inserter-sidebar/style.scss +22 -0
  243. package/src/components/list-view-sidebar/index.js +169 -0
  244. package/src/components/list-view-sidebar/list-view-outline.js +37 -0
  245. package/src/components/list-view-sidebar/style.scss +84 -0
  246. package/src/components/offline-status/index.native.js +101 -0
  247. package/src/components/offline-status/style.native.scss +28 -0
  248. package/src/components/offline-status/test/index.native.js +108 -0
  249. package/src/components/page-attributes/panel.js +62 -0
  250. package/src/components/post-discussion/panel.js +57 -0
  251. package/src/components/post-excerpt/check.js +18 -0
  252. package/src/components/post-excerpt/panel.js +57 -0
  253. package/src/components/post-excerpt/plugin.js +61 -0
  254. package/src/components/post-excerpt/test/plugin.js +36 -0
  255. package/src/components/post-featured-image/index.js +3 -7
  256. package/src/components/post-featured-image/panel.js +55 -0
  257. package/src/components/post-last-revision/panel.js +22 -0
  258. package/src/components/post-last-revision/style.scss +10 -0
  259. package/src/components/post-publish-button/index.js +1 -0
  260. package/src/components/post-publish-panel/maybe-upload-media.js +3 -8
  261. package/src/components/post-saved-state/index.js +9 -8
  262. package/src/components/post-saved-state/test/__snapshots__/index.js.snap +2 -2
  263. package/src/components/post-schedule/panel.js +1 -1
  264. package/src/components/post-taxonomies/panel.js +66 -0
  265. package/src/components/post-template/block-theme.js +110 -0
  266. package/src/components/post-template/classic-theme.js +213 -0
  267. package/src/components/post-template/create-new-template-modal.js +139 -0
  268. package/src/components/post-template/create-new-template.js +50 -0
  269. package/src/components/post-template/hooks.js +95 -0
  270. package/src/components/post-template/panel.js +66 -0
  271. package/src/components/post-template/reset-default-template.js +43 -0
  272. package/src/components/post-template/style.scss +52 -0
  273. package/src/components/post-template/swap-template-button.js +86 -0
  274. package/src/components/post-title/index.native.js +32 -18
  275. package/src/components/post-title/style.scss +1 -0
  276. package/src/components/post-title/test/__snapshots__/index.native.js.snap +25 -0
  277. package/src/components/post-title/test/index.native.js +78 -0
  278. package/src/components/post-view-link/index.js +47 -0
  279. package/src/components/post-visibility/check.js +10 -15
  280. package/src/components/post-visibility/test/check.js +24 -13
  281. package/src/components/preview-dropdown/index.js +133 -0
  282. package/src/components/preview-dropdown/style.scss +5 -0
  283. package/src/components/provider/index.js +28 -118
  284. package/src/components/provider/index.native.js +55 -14
  285. package/src/components/provider/navigation-block-editing-mode.js +37 -0
  286. package/src/components/provider/use-block-editor-settings.js +42 -17
  287. package/src/hooks/index.js +1 -0
  288. package/src/hooks/pattern-partial-syncing.js +73 -0
  289. package/src/private-apis.js +14 -0
  290. package/src/store/actions.js +160 -9
  291. package/src/store/defaults.js +1 -0
  292. package/src/store/index.js +5 -0
  293. package/src/store/private-actions.js +61 -0
  294. package/src/store/private-selectors.js +51 -0
  295. package/src/store/reducer.js +103 -26
  296. package/src/store/reducer.native.js +0 -2
  297. package/src/store/selectors.js +144 -42
  298. package/src/store/test/actions.js +56 -0
  299. package/src/store/test/reducer.js +98 -0
  300. package/src/store/test/selectors.js +137 -147
  301. package/src/style.scss +7 -0
  302. package/src/utils/media-upload/index.js +9 -2
  303. package/build/components/post-template/index.js +0 -66
  304. package/build/components/post-template/index.js.map +0 -1
  305. package/build-module/components/post-template/index.js +0 -57
  306. package/build-module/components/post-template/index.js.map +0 -1
  307. package/src/components/post-template/index.js +0 -64
@@ -205,6 +205,17 @@ export function getCurrentPostId( state ) {
205
205
  return state.postId;
206
206
  }
207
207
 
208
+ /**
209
+ * Returns the template ID currently being rendered/edited
210
+ *
211
+ * @param {Object} state Global application state.
212
+ *
213
+ * @return {string?} Template ID.
214
+ */
215
+ export function getCurrentTemplateId( state ) {
216
+ return state.templateId;
217
+ }
218
+
208
219
  /**
209
220
  * Returns the number of revisions of the post currently being edited.
210
221
  *
@@ -819,54 +830,54 @@ export function getEditedPostPreviewLink( state ) {
819
830
  * is a single block within the post and it is of a type known to match a
820
831
  * default post format. Returns null if the format cannot be determined.
821
832
  *
822
- * @param {Object} state Global application state.
823
- *
824
833
  * @return {?string} Suggested post format.
825
834
  */
826
- export function getSuggestedPostFormat( state ) {
827
- const blocks = getEditorBlocks( state );
828
-
829
- if ( blocks.length > 2 ) return null;
830
-
831
- let name;
832
- // If there is only one block in the content of the post grab its name
833
- // so we can derive a suitable post format from it.
834
- if ( blocks.length === 1 ) {
835
- name = blocks[ 0 ].name;
836
- // Check for core/embed `video` and `audio` eligible suggestions.
837
- if ( name === 'core/embed' ) {
838
- const provider = blocks[ 0 ].attributes?.providerNameSlug;
839
- if ( [ 'youtube', 'vimeo' ].includes( provider ) ) {
840
- name = 'core/video';
841
- } else if ( [ 'spotify', 'soundcloud' ].includes( provider ) ) {
842
- name = 'core/audio';
835
+ export const getSuggestedPostFormat = createRegistrySelector(
836
+ ( select ) => () => {
837
+ const blocks = select( blockEditorStore ).getBlocks();
838
+
839
+ if ( blocks.length > 2 ) return null;
840
+
841
+ let name;
842
+ // If there is only one block in the content of the post grab its name
843
+ // so we can derive a suitable post format from it.
844
+ if ( blocks.length === 1 ) {
845
+ name = blocks[ 0 ].name;
846
+ // Check for core/embed `video` and `audio` eligible suggestions.
847
+ if ( name === 'core/embed' ) {
848
+ const provider = blocks[ 0 ].attributes?.providerNameSlug;
849
+ if ( [ 'youtube', 'vimeo' ].includes( provider ) ) {
850
+ name = 'core/video';
851
+ } else if ( [ 'spotify', 'soundcloud' ].includes( provider ) ) {
852
+ name = 'core/audio';
853
+ }
843
854
  }
844
855
  }
845
- }
846
856
 
847
- // If there are two blocks in the content and the last one is a text blocks
848
- // grab the name of the first one to also suggest a post format from it.
849
- if ( blocks.length === 2 && blocks[ 1 ].name === 'core/paragraph' ) {
850
- name = blocks[ 0 ].name;
851
- }
857
+ // If there are two blocks in the content and the last one is a text blocks
858
+ // grab the name of the first one to also suggest a post format from it.
859
+ if ( blocks.length === 2 && blocks[ 1 ].name === 'core/paragraph' ) {
860
+ name = blocks[ 0 ].name;
861
+ }
852
862
 
853
- // We only convert to default post formats in core.
854
- switch ( name ) {
855
- case 'core/image':
856
- return 'image';
857
- case 'core/quote':
858
- case 'core/pullquote':
859
- return 'quote';
860
- case 'core/gallery':
861
- return 'gallery';
862
- case 'core/video':
863
- return 'video';
864
- case 'core/audio':
865
- return 'audio';
866
- default:
867
- return null;
863
+ // We only convert to default post formats in core.
864
+ switch ( name ) {
865
+ case 'core/image':
866
+ return 'image';
867
+ case 'core/quote':
868
+ case 'core/pullquote':
869
+ return 'quote';
870
+ case 'core/gallery':
871
+ return 'gallery';
872
+ case 'core/video':
873
+ return 'video';
874
+ case 'core/audio':
875
+ return 'audio';
876
+ default:
877
+ return null;
878
+ }
868
879
  }
869
- }
880
+ );
870
881
 
871
882
  /**
872
883
  * Returns the content of the post being edited.
@@ -1114,6 +1125,64 @@ export const getEditorBlocks = createSelector(
1114
1125
  ]
1115
1126
  );
1116
1127
 
1128
+ /**
1129
+ * Returns true if the given panel was programmatically removed, or false otherwise.
1130
+ * All panels are not removed by default.
1131
+ *
1132
+ * @param {Object} state Global application state.
1133
+ * @param {string} panelName A string that identifies the panel.
1134
+ *
1135
+ * @return {boolean} Whether or not the panel is removed.
1136
+ */
1137
+ export function isEditorPanelRemoved( state, panelName ) {
1138
+ return state.removedPanels.includes( panelName );
1139
+ }
1140
+
1141
+ /**
1142
+ * Returns true if the given panel is enabled, or false otherwise. Panels are
1143
+ * enabled by default.
1144
+ *
1145
+ * @param {Object} state Global application state.
1146
+ * @param {string} panelName A string that identifies the panel.
1147
+ *
1148
+ * @return {boolean} Whether or not the panel is enabled.
1149
+ */
1150
+ export const isEditorPanelEnabled = createRegistrySelector(
1151
+ ( select ) => ( state, panelName ) => {
1152
+ // For backward compatibility, we check edit-post
1153
+ // even though now this is in "editor" package.
1154
+ const inactivePanels = select( preferencesStore ).get(
1155
+ 'core',
1156
+ 'inactivePanels'
1157
+ );
1158
+ return (
1159
+ ! isEditorPanelRemoved( state, panelName ) &&
1160
+ ! inactivePanels?.includes( panelName )
1161
+ );
1162
+ }
1163
+ );
1164
+
1165
+ /**
1166
+ * Returns true if the given panel is open, or false otherwise. Panels are
1167
+ * closed by default.
1168
+ *
1169
+ * @param {Object} state Global application state.
1170
+ * @param {string} panelName A string that identifies the panel.
1171
+ *
1172
+ * @return {boolean} Whether or not the panel is open.
1173
+ */
1174
+ export const isEditorPanelOpened = createRegistrySelector(
1175
+ ( select ) => ( state, panelName ) => {
1176
+ // For backward compatibility, we check edit-post
1177
+ // even though now this is in "editor" package.
1178
+ const openPanels = select( preferencesStore ).get(
1179
+ 'core',
1180
+ 'openPanels'
1181
+ );
1182
+ return !! openPanels?.includes( panelName );
1183
+ }
1184
+ );
1185
+
1117
1186
  /**
1118
1187
  * A block selection object.
1119
1188
  *
@@ -1174,7 +1243,7 @@ export function getEditorSelection( state ) {
1174
1243
  * @return {boolean} is Ready.
1175
1244
  */
1176
1245
  export function __unstableIsEditorReady( state ) {
1177
- return state.isReady;
1246
+ return !! state.postId;
1178
1247
  }
1179
1248
 
1180
1249
  /**
@@ -1199,6 +1268,39 @@ export function getRenderingMode( state ) {
1199
1268
  return state.renderingMode;
1200
1269
  }
1201
1270
 
1271
+ /**
1272
+ * Returns the current editing canvas device type.
1273
+ *
1274
+ * @param {Object} state Global application state.
1275
+ *
1276
+ * @return {string} Device type.
1277
+ */
1278
+ export function getDeviceType( state ) {
1279
+ return state.deviceType;
1280
+ }
1281
+
1282
+ /**
1283
+ * Returns true if the list view is opened.
1284
+ *
1285
+ * @param {Object} state Global application state.
1286
+ *
1287
+ * @return {boolean} Whether the list view is opened.
1288
+ */
1289
+ export function isListViewOpened( state ) {
1290
+ return state.listViewPanel;
1291
+ }
1292
+
1293
+ /**
1294
+ * Returns true if the inserter is opened.
1295
+ *
1296
+ * @param {Object} state Global application state.
1297
+ *
1298
+ * @return {boolean} Whether the inserter is opened.
1299
+ */
1300
+ export function isInserterOpened( state ) {
1301
+ return !! state.blockInserterPanel;
1302
+ }
1303
+
1202
1304
  /*
1203
1305
  * Backward compatibility
1204
1306
  */
@@ -432,4 +432,60 @@ describe( 'Editor actions', () => {
432
432
  ).toBe( false );
433
433
  } );
434
434
  } );
435
+
436
+ describe( 'toggleEditorPanelEnabled', () => {
437
+ it( 'toggles panels to be enabled and not enabled', () => {
438
+ const registry = createRegistryWithStores();
439
+
440
+ // This will switch it off, since the default is on.
441
+ registry
442
+ .dispatch( editorStore )
443
+ .toggleEditorPanelEnabled( 'control-panel' );
444
+
445
+ expect(
446
+ registry
447
+ .select( editorStore )
448
+ .isEditorPanelEnabled( 'control-panel' )
449
+ ).toBe( false );
450
+
451
+ // Switch it on again.
452
+ registry
453
+ .dispatch( editorStore )
454
+ .toggleEditorPanelEnabled( 'control-panel' );
455
+
456
+ expect(
457
+ registry
458
+ .select( editorStore )
459
+ .isEditorPanelEnabled( 'control-panel' )
460
+ ).toBe( true );
461
+ } );
462
+ } );
463
+
464
+ describe( 'toggleEditorPanelOpened', () => {
465
+ it( 'toggles panels open and closed', () => {
466
+ const registry = createRegistryWithStores();
467
+
468
+ // This will open it, since the default is closed.
469
+ registry
470
+ .dispatch( editorStore )
471
+ .toggleEditorPanelOpened( 'control-panel' );
472
+
473
+ expect(
474
+ registry
475
+ .select( editorStore )
476
+ .isEditorPanelOpened( 'control-panel' )
477
+ ).toBe( true );
478
+
479
+ // Close it.
480
+ registry
481
+ .dispatch( editorStore )
482
+ .toggleEditorPanelOpened( 'control-panel' );
483
+
484
+ expect(
485
+ registry
486
+ .select( editorStore )
487
+ .isEditorPanelOpened( 'control-panel' )
488
+ ).toBe( false );
489
+ } );
490
+ } );
435
491
  } );
@@ -14,7 +14,11 @@ import {
14
14
  saving,
15
15
  postSavingLock,
16
16
  postAutosavingLock,
17
+ removedPanels,
18
+ blockInserterPanel,
19
+ listViewPanel,
17
20
  } from '../reducer';
21
+ import { setIsInserterOpened } from '../actions';
18
22
 
19
23
  describe( 'state', () => {
20
24
  describe( 'hasSameKeys()', () => {
@@ -264,4 +268,98 @@ describe( 'state', () => {
264
268
  expect( state ).toEqual( {} );
265
269
  } );
266
270
  } );
271
+
272
+ describe( 'removedPanels', () => {
273
+ it( 'should remove panel', () => {
274
+ const original = deepFreeze( [] );
275
+ const state = removedPanels( original, {
276
+ type: 'REMOVE_PANEL',
277
+ panelName: 'post-status',
278
+ } );
279
+ expect( state ).toEqual( [ 'post-status' ] );
280
+ } );
281
+
282
+ it( 'should not remove already removed panel', () => {
283
+ const original = deepFreeze( [ 'post-status' ] );
284
+ const state = removedPanels( original, {
285
+ type: 'REMOVE_PANEL',
286
+ panelName: 'post-status',
287
+ } );
288
+ expect( state ).toBe( original );
289
+ } );
290
+ } );
291
+
292
+ describe( 'blockInserterPanel()', () => {
293
+ it( 'should apply default state', () => {
294
+ expect( blockInserterPanel( undefined, {} ) ).toEqual( false );
295
+ } );
296
+
297
+ it( 'should default to returning the same state', () => {
298
+ expect( blockInserterPanel( true, {} ) ).toBe( true );
299
+ } );
300
+
301
+ it( 'should set the open state of the inserter panel', () => {
302
+ expect(
303
+ blockInserterPanel( false, setIsInserterOpened( true ) )
304
+ ).toBe( true );
305
+ expect(
306
+ blockInserterPanel( true, setIsInserterOpened( false ) )
307
+ ).toBe( false );
308
+ } );
309
+
310
+ it( 'should close the inserter when opening the list view panel', () => {
311
+ expect(
312
+ blockInserterPanel( true, {
313
+ type: 'SET_IS_LIST_VIEW_OPENED',
314
+ isOpen: true,
315
+ } )
316
+ ).toBe( false );
317
+ } );
318
+
319
+ it( 'should not change the state when closing the list view panel', () => {
320
+ expect(
321
+ blockInserterPanel( true, {
322
+ type: 'SET_IS_LIST_VIEW_OPENED',
323
+ isOpen: false,
324
+ } )
325
+ ).toBe( true );
326
+ } );
327
+ } );
328
+
329
+ describe( 'listViewPanel()', () => {
330
+ it( 'should apply default state', () => {
331
+ expect( listViewPanel( undefined, {} ) ).toEqual( false );
332
+ } );
333
+
334
+ it( 'should default to returning the same state', () => {
335
+ expect( listViewPanel( true, {} ) ).toBe( true );
336
+ } );
337
+
338
+ it( 'should set the open state of the list view panel', () => {
339
+ expect(
340
+ listViewPanel( false, {
341
+ type: 'SET_IS_LIST_VIEW_OPENED',
342
+ isOpen: true,
343
+ } )
344
+ ).toBe( true );
345
+ expect(
346
+ listViewPanel( true, {
347
+ type: 'SET_IS_LIST_VIEW_OPENED',
348
+ isOpen: false,
349
+ } )
350
+ ).toBe( false );
351
+ } );
352
+
353
+ it( 'should close the list view when opening the inserter panel', () => {
354
+ expect( listViewPanel( true, setIsInserterOpened( true ) ) ).toBe(
355
+ false
356
+ );
357
+ } );
358
+
359
+ it( 'should not change the state when closing the inserter panel', () => {
360
+ expect( listViewPanel( true, setIsInserterOpened( false ) ) ).toBe(
361
+ true
362
+ );
363
+ } );
364
+ } );
267
365
  } );