@wordpress/editor 13.28.5 → 13.30.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 (144) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/components/block-removal-warnings/index.js +70 -0
  3. package/build/components/block-removal-warnings/index.js.map +1 -0
  4. package/build/components/commands/index.js +209 -0
  5. package/build/components/commands/index.js.map +1 -0
  6. package/build/components/commands/index.native.js +9 -0
  7. package/build/components/commands/index.native.js.map +1 -0
  8. package/build/components/document-bar/index.js +78 -67
  9. package/build/components/document-bar/index.js.map +1 -1
  10. package/build/components/document-outline/check.js +8 -7
  11. package/build/components/document-outline/check.js.map +1 -1
  12. package/build/components/document-outline/index.js +26 -27
  13. package/build/components/document-outline/index.js.map +1 -1
  14. package/build/components/document-tools/index.js +5 -3
  15. package/build/components/document-tools/index.js.map +1 -1
  16. package/build/components/editor-help/intro-to-blocks.native.js.map +1 -1
  17. package/build/components/entities-saved-states/entity-type-list.js.map +1 -1
  18. package/build/components/global-keyboard-shortcuts/index.js +20 -2
  19. package/build/components/global-keyboard-shortcuts/index.js.map +1 -1
  20. package/build/components/global-keyboard-shortcuts/register-shortcuts.js +18 -0
  21. package/build/components/global-keyboard-shortcuts/register-shortcuts.js.map +1 -1
  22. package/build/components/list-view-sidebar/index.js +1 -1
  23. package/build/components/list-view-sidebar/index.js.map +1 -1
  24. package/build/components/mode-switcher/index.js +86 -0
  25. package/build/components/mode-switcher/index.js.map +1 -0
  26. package/build/components/post-locked-modal/index.js.map +1 -1
  27. package/build/components/post-preview-button/index.js +2 -1
  28. package/build/components/post-preview-button/index.js.map +1 -1
  29. package/build/components/post-publish-button/index.js +2 -1
  30. package/build/components/post-publish-button/index.js.map +1 -1
  31. package/build/components/post-publish-panel/index.js.map +1 -1
  32. package/build/components/post-publish-panel/maybe-upload-media.js.map +1 -1
  33. package/build/components/post-taxonomies/hierarchical-term-selector.js +3 -0
  34. package/build/components/post-taxonomies/hierarchical-term-selector.js.map +1 -1
  35. package/build/components/post-title/index.js +0 -5
  36. package/build/components/post-title/index.js.map +1 -1
  37. package/build/components/post-title/index.native.js.map +1 -1
  38. package/build/components/post-title/post-title-raw.js.map +1 -1
  39. package/build/components/post-view-link/index.js +2 -1
  40. package/build/components/post-view-link/index.js.map +1 -1
  41. package/build/components/provider/index.js +8 -1
  42. package/build/components/provider/index.js.map +1 -1
  43. package/build/components/provider/index.native.js +4 -9
  44. package/build/components/provider/index.native.js.map +1 -1
  45. package/build/components/provider/use-block-editor-settings.js +1 -1
  46. package/build/components/provider/use-block-editor-settings.js.map +1 -1
  47. package/build/components/provider/use-hide-blocks-from-inserter.js +53 -0
  48. package/build/components/provider/use-hide-blocks-from-inserter.js.map +1 -0
  49. package/build/private-apis.js +2 -0
  50. package/build/private-apis.js.map +1 -1
  51. package/build/store/actions.js +69 -2
  52. package/build/store/actions.js.map +1 -1
  53. package/build/store/selectors.js +13 -1
  54. package/build/store/selectors.js.map +1 -1
  55. package/build-module/components/block-removal-warnings/index.js +64 -0
  56. package/build-module/components/block-removal-warnings/index.js.map +1 -0
  57. package/build-module/components/commands/index.js +202 -0
  58. package/build-module/components/commands/index.js.map +1 -0
  59. package/build-module/components/commands/index.native.js +3 -0
  60. package/build-module/components/commands/index.native.js.map +1 -0
  61. package/build-module/components/document-bar/index.js +81 -70
  62. package/build-module/components/document-bar/index.js.map +1 -1
  63. package/build-module/components/document-outline/check.js +9 -8
  64. package/build-module/components/document-outline/check.js.map +1 -1
  65. package/build-module/components/document-outline/index.js +26 -26
  66. package/build-module/components/document-outline/index.js.map +1 -1
  67. package/build-module/components/document-tools/index.js +5 -3
  68. package/build-module/components/document-tools/index.js.map +1 -1
  69. package/build-module/components/editor-help/intro-to-blocks.native.js.map +1 -1
  70. package/build-module/components/entities-saved-states/entity-type-list.js.map +1 -1
  71. package/build-module/components/global-keyboard-shortcuts/index.js +20 -2
  72. package/build-module/components/global-keyboard-shortcuts/index.js.map +1 -1
  73. package/build-module/components/global-keyboard-shortcuts/register-shortcuts.js +18 -0
  74. package/build-module/components/global-keyboard-shortcuts/register-shortcuts.js.map +1 -1
  75. package/build-module/components/list-view-sidebar/index.js +1 -1
  76. package/build-module/components/list-view-sidebar/index.js.map +1 -1
  77. package/build-module/components/mode-switcher/index.js +80 -0
  78. package/build-module/components/mode-switcher/index.js.map +1 -0
  79. package/build-module/components/post-locked-modal/index.js.map +1 -1
  80. package/build-module/components/post-preview-button/index.js +2 -1
  81. package/build-module/components/post-preview-button/index.js.map +1 -1
  82. package/build-module/components/post-publish-button/index.js +2 -1
  83. package/build-module/components/post-publish-button/index.js.map +1 -1
  84. package/build-module/components/post-publish-panel/index.js.map +1 -1
  85. package/build-module/components/post-publish-panel/maybe-upload-media.js.map +1 -1
  86. package/build-module/components/post-taxonomies/hierarchical-term-selector.js +3 -0
  87. package/build-module/components/post-taxonomies/hierarchical-term-selector.js.map +1 -1
  88. package/build-module/components/post-title/index.js +0 -5
  89. package/build-module/components/post-title/index.js.map +1 -1
  90. package/build-module/components/post-title/index.native.js.map +1 -1
  91. package/build-module/components/post-title/post-title-raw.js.map +1 -1
  92. package/build-module/components/post-view-link/index.js +2 -1
  93. package/build-module/components/post-view-link/index.js.map +1 -1
  94. package/build-module/components/provider/index.js +8 -1
  95. package/build-module/components/provider/index.js.map +1 -1
  96. package/build-module/components/provider/index.native.js +4 -10
  97. package/build-module/components/provider/index.native.js.map +1 -1
  98. package/build-module/components/provider/use-block-editor-settings.js +1 -1
  99. package/build-module/components/provider/use-block-editor-settings.js.map +1 -1
  100. package/build-module/components/provider/use-hide-blocks-from-inserter.js +47 -0
  101. package/build-module/components/provider/use-hide-blocks-from-inserter.js.map +1 -0
  102. package/build-module/private-apis.js +2 -0
  103. package/build-module/private-apis.js.map +1 -1
  104. package/build-module/store/actions.js +66 -0
  105. package/build-module/store/actions.js.map +1 -1
  106. package/build-module/store/selectors.js +12 -0
  107. package/build-module/store/selectors.js.map +1 -1
  108. package/build-style/style-rtl.css +4 -47
  109. package/build-style/style.css +4 -47
  110. package/package.json +32 -32
  111. package/src/components/block-removal-warnings/index.js +92 -0
  112. package/src/components/commands/index.js +210 -0
  113. package/src/components/commands/index.native.js +2 -0
  114. package/src/components/document-bar/index.js +115 -94
  115. package/src/components/document-bar/style.scss +4 -37
  116. package/src/components/document-outline/check.js +8 -10
  117. package/src/components/document-outline/index.js +18 -23
  118. package/src/components/document-outline/test/index.js +26 -7
  119. package/src/components/document-tools/index.js +3 -3
  120. package/src/components/editor-help/intro-to-blocks.native.js +1 -1
  121. package/src/components/entities-saved-states/entity-type-list.js +1 -1
  122. package/src/components/global-keyboard-shortcuts/index.js +35 -4
  123. package/src/components/global-keyboard-shortcuts/register-shortcuts.js +20 -0
  124. package/src/components/list-view-sidebar/index.js +1 -1
  125. package/src/components/mode-switcher/index.js +90 -0
  126. package/src/components/post-locked-modal/index.js +1 -1
  127. package/src/components/post-preview-button/index.js +1 -0
  128. package/src/components/post-publish-button/index.js +1 -0
  129. package/src/components/post-publish-panel/index.js +1 -1
  130. package/src/components/post-publish-panel/maybe-upload-media.js +1 -1
  131. package/src/components/post-publish-panel/test/__snapshots__/index.js.snap +3 -3
  132. package/src/components/post-taxonomies/hierarchical-term-selector.js +3 -0
  133. package/src/components/post-title/index.js +0 -3
  134. package/src/components/post-title/index.native.js +2 -2
  135. package/src/components/post-title/post-title-raw.js +1 -1
  136. package/src/components/post-view-link/index.js +1 -0
  137. package/src/components/provider/index.js +9 -0
  138. package/src/components/provider/index.native.js +7 -6
  139. package/src/components/provider/use-block-editor-settings.js +0 -3
  140. package/src/components/provider/use-hide-blocks-from-inserter.js +81 -0
  141. package/src/private-apis.js +2 -0
  142. package/src/store/actions.js +95 -0
  143. package/src/store/selectors.js +12 -0
  144. package/src/store/test/actions.js +82 -0
@@ -59,8 +59,6 @@ const postTypeEntities = [
59
59
  import { EditorHelpTopics, store as editorStore } from '@wordpress/editor';
60
60
  import { store as noticesStore } from '@wordpress/notices';
61
61
  import { store as coreStore } from '@wordpress/core-data';
62
- // eslint-disable-next-line no-restricted-imports
63
- import { store as editPostStore } from '@wordpress/edit-post';
64
62
 
65
63
  /**
66
64
  * Internal dependencies
@@ -392,8 +390,8 @@ const ComposedNativeProvider = compose( [
392
390
  getEditedPostAttribute,
393
391
  getEditedPostContent,
394
392
  getEditorSettings,
393
+ getEditorMode,
395
394
  } = select( editorStore );
396
- const { getEditorMode } = select( editPostStore );
397
395
 
398
396
  const { getBlockIndex, getSelectedBlockClientId, getGlobalBlockCount } =
399
397
  select( blockEditorStore );
@@ -417,15 +415,18 @@ const ComposedNativeProvider = compose( [
417
415
  };
418
416
  } ),
419
417
  withDispatch( ( dispatch ) => {
420
- const { editPost, resetEditorBlocks, updateEditorSettings } =
421
- dispatch( editorStore );
418
+ const {
419
+ editPost,
420
+ resetEditorBlocks,
421
+ updateEditorSettings,
422
+ switchEditorMode,
423
+ } = dispatch( editorStore );
422
424
  const {
423
425
  clearSelectedBlock,
424
426
  updateSettings,
425
427
  insertBlock,
426
428
  replaceBlock,
427
429
  } = dispatch( blockEditorStore );
428
- const { switchEditorMode } = dispatch( editPostStore );
429
430
  const { addEntities, receiveEntityRecords } = dispatch( coreStore );
430
431
  const { createSuccessNotice, createErrorNotice } =
431
432
  dispatch( noticesStore );
@@ -29,7 +29,6 @@ const BLOCK_EDITOR_SETTINGS = [
29
29
  '__experimentalDiscussionSettings',
30
30
  '__experimentalFeatures',
31
31
  '__experimentalGlobalStylesBaseStyles',
32
- '__experimentalPreferredStyleVariations',
33
32
  '__unstableGalleryWithImageBlocks',
34
33
  'alignWide',
35
34
  'blockInspectorTabs',
@@ -53,7 +52,6 @@ const BLOCK_EDITOR_SETTINGS = [
53
52
  'gradients',
54
53
  'generateAnchors',
55
54
  'onNavigateToEntityRecord',
56
- 'hasInlineToolbar',
57
55
  'imageDefaultSize',
58
56
  'imageDimensions',
59
57
  'imageEditing',
@@ -61,7 +59,6 @@ const BLOCK_EDITOR_SETTINGS = [
61
59
  'isRTL',
62
60
  'locale',
63
61
  'maxWidth',
64
- 'onUpdateDefaultBlockStyles',
65
62
  'postContentAttributes',
66
63
  'postsPerPage',
67
64
  'readOnly',
@@ -0,0 +1,81 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useEffect } from '@wordpress/element';
5
+ import { addFilter, removeFilter } from '@wordpress/hooks';
6
+
7
+ // These post types are "structural" block lists.
8
+ // We should be allowed to use
9
+ // the post content and template parts blocks within them.
10
+ const POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART = [
11
+ 'wp_block',
12
+ 'wp_template',
13
+ 'wp_template_part',
14
+ ];
15
+
16
+ /**
17
+ * In some specific contexts,
18
+ * the template part and post content blocks need to be hidden.
19
+ *
20
+ * @param {string} postType Post Type
21
+ */
22
+ export function useHideBlocksFromInserter( postType ) {
23
+ useEffect( () => {
24
+ /*
25
+ * Prevent adding template part in the editor.
26
+ */
27
+ addFilter(
28
+ 'blockEditor.__unstableCanInsertBlockType',
29
+ 'removeTemplatePartsFromInserter',
30
+ ( canInsert, blockType ) => {
31
+ if (
32
+ ! POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART.includes(
33
+ postType
34
+ ) &&
35
+ blockType.name === 'core/template-part'
36
+ ) {
37
+ return false;
38
+ }
39
+ return canInsert;
40
+ }
41
+ );
42
+
43
+ /*
44
+ * Prevent adding post content block (except in query block) in the editor.
45
+ */
46
+ addFilter(
47
+ 'blockEditor.__unstableCanInsertBlockType',
48
+ 'removePostContentFromInserter',
49
+ (
50
+ canInsert,
51
+ blockType,
52
+ rootClientId,
53
+ { getBlockParentsByBlockName }
54
+ ) => {
55
+ if (
56
+ ! POST_TYPES_ALLOWING_POST_CONTENT_TEMPLATE_PART.includes(
57
+ postType
58
+ ) &&
59
+ blockType.name === 'core/post-content'
60
+ ) {
61
+ return (
62
+ getBlockParentsByBlockName( rootClientId, 'core/query' )
63
+ .length > 0
64
+ );
65
+ }
66
+ return canInsert;
67
+ }
68
+ );
69
+
70
+ return () => {
71
+ removeFilter(
72
+ 'blockEditor.__unstableCanInsertBlockType',
73
+ 'removeTemplatePartsFromInserter'
74
+ );
75
+ removeFilter(
76
+ 'blockEditor.__unstableCanInsertBlockType',
77
+ 'removePostContentFromInserter'
78
+ );
79
+ };
80
+ }, [ postType ] );
81
+ }
@@ -10,6 +10,7 @@ import useBlockEditorSettings from './components/provider/use-block-editor-setti
10
10
  import DocumentTools from './components/document-tools';
11
11
  import InserterSidebar from './components/inserter-sidebar';
12
12
  import ListViewSidebar from './components/list-view-sidebar';
13
+ import ModeSwitcher from './components/mode-switcher';
13
14
  import PluginPostExcerpt from './components/post-excerpt/plugin';
14
15
  import PostPanelRow from './components/post-panel-row';
15
16
  import PostViewLink from './components/post-view-link';
@@ -25,6 +26,7 @@ lock( privateApis, {
25
26
  EntitiesSavedStatesExtensible,
26
27
  InserterSidebar,
27
28
  ListViewSidebar,
29
+ ModeSwitcher,
28
30
  PluginPostExcerpt,
29
31
  PostPanelRow,
30
32
  PostViewLink,
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
+ import { speak } from '@wordpress/a11y';
4
5
  import apiFetch from '@wordpress/api-fetch';
5
6
  import deprecated from '@wordpress/deprecated';
6
7
  import {
@@ -13,6 +14,7 @@ import { store as coreStore } from '@wordpress/core-data';
13
14
  import { store as blockEditorStore } from '@wordpress/block-editor';
14
15
  import { applyFilters } from '@wordpress/hooks';
15
16
  import { store as preferencesStore } from '@wordpress/preferences';
17
+ import { __ } from '@wordpress/i18n';
16
18
 
17
19
  /**
18
20
  * Internal dependencies
@@ -725,6 +727,99 @@ export function setIsListViewOpened( isOpen ) {
725
727
  };
726
728
  }
727
729
 
730
+ /**
731
+ * Action that toggles Distraction free mode.
732
+ * Distraction free mode expects there are no sidebars, as due to the
733
+ * z-index values set, you can't close sidebars.
734
+ */
735
+ export const toggleDistractionFree =
736
+ () =>
737
+ ( { dispatch, registry } ) => {
738
+ const isDistractionFree = registry
739
+ .select( preferencesStore )
740
+ .get( 'core', 'distractionFree' );
741
+ if ( isDistractionFree ) {
742
+ registry
743
+ .dispatch( preferencesStore )
744
+ .set( 'core', 'fixedToolbar', false );
745
+ }
746
+ if ( ! isDistractionFree ) {
747
+ registry.batch( () => {
748
+ registry
749
+ .dispatch( preferencesStore )
750
+ .set( 'core', 'fixedToolbar', true );
751
+ dispatch.setIsInserterOpened( false );
752
+ dispatch.setIsListViewOpened( false );
753
+ } );
754
+ }
755
+ registry.batch( () => {
756
+ registry
757
+ .dispatch( preferencesStore )
758
+ .set( 'core', 'distractionFree', ! isDistractionFree );
759
+ registry
760
+ .dispatch( noticesStore )
761
+ .createInfoNotice(
762
+ isDistractionFree
763
+ ? __( 'Distraction free off.' )
764
+ : __( 'Distraction free on.' ),
765
+ {
766
+ id: 'core/editor/distraction-free-mode/notice',
767
+ type: 'snackbar',
768
+ actions: [
769
+ {
770
+ label: __( 'Undo' ),
771
+ onClick: () => {
772
+ registry.batch( () => {
773
+ registry
774
+ .dispatch( preferencesStore )
775
+ .set(
776
+ 'core',
777
+ 'fixedToolbar',
778
+ isDistractionFree ? true : false
779
+ );
780
+ registry
781
+ .dispatch( preferencesStore )
782
+ .toggle(
783
+ 'core',
784
+ 'distractionFree'
785
+ );
786
+ } );
787
+ },
788
+ },
789
+ ],
790
+ }
791
+ );
792
+ } );
793
+ };
794
+
795
+ /**
796
+ * Triggers an action used to switch editor mode.
797
+ *
798
+ * @param {string} mode The editor mode.
799
+ */
800
+ export const switchEditorMode =
801
+ ( mode ) =>
802
+ ( { dispatch, registry } ) => {
803
+ registry.dispatch( preferencesStore ).set( 'core', 'editorMode', mode );
804
+
805
+ // Unselect blocks when we switch to a non visual mode.
806
+ if ( mode !== 'visual' ) {
807
+ registry.dispatch( blockEditorStore ).clearSelectedBlock();
808
+ }
809
+
810
+ if ( mode === 'visual' ) {
811
+ speak( __( 'Visual editor selected' ), 'assertive' );
812
+ } else if ( mode === 'text' ) {
813
+ const isDistractionFree = registry
814
+ .select( preferencesStore )
815
+ .get( 'core', 'distractionFree' );
816
+ if ( isDistractionFree ) {
817
+ dispatch.toggleDistractionFree();
818
+ }
819
+ speak( __( 'Code editor selected' ), 'assertive' );
820
+ }
821
+ };
822
+
728
823
  /**
729
824
  * Backward compatibility
730
825
  */
@@ -1313,6 +1313,18 @@ export function isInserterOpened( state ) {
1313
1313
  return !! state.blockInserterPanel;
1314
1314
  }
1315
1315
 
1316
+ /**
1317
+ * Returns the current editing mode.
1318
+ *
1319
+ * @param {Object} state Global application state.
1320
+ *
1321
+ * @return {string} Editing mode.
1322
+ */
1323
+ export const getEditorMode = createRegistrySelector(
1324
+ ( select ) => () =>
1325
+ select( preferencesStore ).get( 'core', 'editorMode' ) ?? 'visual'
1326
+ );
1327
+
1316
1328
  /*
1317
1329
  * Backward compatibility
1318
1330
  */
@@ -488,4 +488,86 @@ describe( 'Editor actions', () => {
488
488
  ).toBe( false );
489
489
  } );
490
490
  } );
491
+
492
+ describe( 'switchEditorMode', () => {
493
+ let registry;
494
+
495
+ beforeEach( () => {
496
+ registry = createRegistryWithStores();
497
+ } );
498
+
499
+ it( 'to visual', () => {
500
+ // Switch to text first, since the default is visual.
501
+ registry.dispatch( editorStore ).switchEditorMode( 'text' );
502
+ expect( registry.select( editorStore ).getEditorMode() ).toEqual(
503
+ 'text'
504
+ );
505
+ registry.dispatch( editorStore ).switchEditorMode( 'visual' );
506
+ expect( registry.select( editorStore ).getEditorMode() ).toEqual(
507
+ 'visual'
508
+ );
509
+ } );
510
+
511
+ it( 'to text', () => {
512
+ // It defaults to visual.
513
+ expect( registry.select( editorStore ).getEditorMode() ).toEqual(
514
+ 'visual'
515
+ );
516
+ // Add a selected client id and make sure it's there.
517
+ const clientId = 'clientId_1';
518
+ registry.dispatch( blockEditorStore ).selectionChange( clientId );
519
+ expect(
520
+ registry.select( blockEditorStore ).getSelectedBlockClientId()
521
+ ).toEqual( clientId );
522
+
523
+ registry.dispatch( editorStore ).switchEditorMode( 'text' );
524
+ expect(
525
+ registry.select( blockEditorStore ).getSelectedBlockClientId()
526
+ ).toBeNull();
527
+ expect( registry.select( editorStore ).getEditorMode() ).toEqual(
528
+ 'text'
529
+ );
530
+ } );
531
+ it( 'should turn off distraction free mode when switching to code editor', () => {
532
+ registry
533
+ .dispatch( preferencesStore )
534
+ .set( 'core', 'distractionFree', true );
535
+ registry.dispatch( editorStore ).switchEditorMode( 'text' );
536
+ expect(
537
+ registry
538
+ .select( preferencesStore )
539
+ .get( 'core', 'distractionFree' )
540
+ ).toBe( false );
541
+ } );
542
+ } );
543
+
544
+ describe( 'toggleDistractionFree', () => {
545
+ it( 'should properly update settings to prevent layout corruption when enabling distraction free mode', () => {
546
+ const registry = createRegistryWithStores();
547
+
548
+ // Enable everything that shouldn't be enabled in distraction free mode.
549
+ registry
550
+ .dispatch( preferencesStore )
551
+ .set( 'core', 'fixedToolbar', true );
552
+ registry.dispatch( editorStore ).setIsListViewOpened( true );
553
+ // Initial state is falsy.
554
+ registry.dispatch( editorStore ).toggleDistractionFree();
555
+ expect(
556
+ registry
557
+ .select( preferencesStore )
558
+ .get( 'core', 'fixedToolbar' )
559
+ ).toBe( true );
560
+ expect( registry.select( editorStore ).isListViewOpened() ).toBe(
561
+ false
562
+ );
563
+ expect( registry.select( editorStore ).isInserterOpened() ).toBe(
564
+ false
565
+ );
566
+ expect(
567
+ registry
568
+ .select( preferencesStore )
569
+ .get( 'core', 'distractionFree' )
570
+ ).toBe( true );
571
+ } );
572
+ } );
491
573
  } );