@wordpress/edit-site 4.0.1 → 4.1.0-next.e230fbab09.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/build/components/add-new-template/new-template-part.js +4 -1
  2. package/build/components/add-new-template/new-template-part.js.map +1 -1
  3. package/build/components/app/index.js +20 -0
  4. package/build/components/app/index.js.map +1 -1
  5. package/build/components/editor/global-styles-renderer.js +7 -3
  6. package/build/components/editor/global-styles-renderer.js.map +1 -1
  7. package/build/components/editor/index.js +3 -18
  8. package/build/components/editor/index.js.map +1 -1
  9. package/build/components/error-boundary/index.js +11 -27
  10. package/build/components/error-boundary/index.js.map +1 -1
  11. package/build/components/error-boundary/warning.js +70 -0
  12. package/build/components/error-boundary/warning.js.map +1 -0
  13. package/build/components/global-styles/navigation-button.js +7 -27
  14. package/build/components/global-styles/navigation-button.js.map +1 -1
  15. package/build/components/global-styles/screen-block-list.js +31 -1
  16. package/build/components/global-styles/screen-block-list.js.map +1 -1
  17. package/build/components/global-styles/screen-typography.js.map +1 -1
  18. package/build/components/global-styles/typography-panel.js +5 -2
  19. package/build/components/global-styles/typography-panel.js.map +1 -1
  20. package/build/components/global-styles/use-global-styles-output.js +21 -4
  21. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  22. package/build/components/global-styles/utils.js +2 -2
  23. package/build/components/global-styles/utils.js.map +1 -1
  24. package/build/components/header/index.js +1 -1
  25. package/build/components/header/index.js.map +1 -1
  26. package/build/components/header/more-menu/index.js +9 -21
  27. package/build/components/header/more-menu/index.js.map +1 -1
  28. package/build/components/header/more-menu/site-export.js +1 -1
  29. package/build/components/header/more-menu/site-export.js.map +1 -1
  30. package/build/components/header/more-menu/welcome-guide-menu-item.js +4 -8
  31. package/build/components/header/more-menu/welcome-guide-menu-item.js.map +1 -1
  32. package/build/components/keyboard-shortcuts/index.js +1 -1
  33. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  34. package/build/components/list/table.js +9 -20
  35. package/build/components/list/table.js.map +1 -1
  36. package/build/components/navigation-sidebar/navigation-panel/index.js +9 -3
  37. package/build/components/navigation-sidebar/navigation-panel/index.js.map +1 -1
  38. package/build/components/navigation-sidebar/navigation-toggle/index.js +15 -4
  39. package/build/components/navigation-sidebar/navigation-toggle/index.js.map +1 -1
  40. package/build/components/secondary-sidebar/list-view-sidebar.js +0 -11
  41. package/build/components/secondary-sidebar/list-view-sidebar.js.map +1 -1
  42. package/build/components/sidebar/global-styles-sidebar.js +5 -5
  43. package/build/components/sidebar/global-styles-sidebar.js.map +1 -1
  44. package/build/components/template-part-converter/convert-to-template-part.js +4 -1
  45. package/build/components/template-part-converter/convert-to-template-part.js.map +1 -1
  46. package/build/components/welcome-guide/editor.js +6 -6
  47. package/build/components/welcome-guide/editor.js.map +1 -1
  48. package/build/components/welcome-guide/styles.js +6 -4
  49. package/build/components/welcome-guide/styles.js.map +1 -1
  50. package/build/index.js +22 -7
  51. package/build/index.js.map +1 -1
  52. package/build/store/actions.js +203 -163
  53. package/build/store/actions.js.map +1 -1
  54. package/build/store/index.js +3 -9
  55. package/build/store/index.js.map +1 -1
  56. package/build/store/reducer.js +0 -44
  57. package/build/store/reducer.js.map +1 -1
  58. package/build/store/selectors.js +33 -10
  59. package/build/store/selectors.js.map +1 -1
  60. package/build-module/components/add-new-template/new-template-part.js +4 -1
  61. package/build-module/components/add-new-template/new-template-part.js.map +1 -1
  62. package/build-module/components/app/index.js +16 -0
  63. package/build-module/components/app/index.js.map +1 -1
  64. package/build-module/components/editor/global-styles-renderer.js +6 -3
  65. package/build-module/components/editor/global-styles-renderer.js.map +1 -1
  66. package/build-module/components/editor/index.js +4 -17
  67. package/build-module/components/editor/index.js.map +1 -1
  68. package/build-module/components/error-boundary/index.js +9 -26
  69. package/build-module/components/error-boundary/index.js.map +1 -1
  70. package/build-module/components/error-boundary/warning.js +60 -0
  71. package/build-module/components/error-boundary/warning.js.map +1 -0
  72. package/build-module/components/global-styles/navigation-button.js +8 -28
  73. package/build-module/components/global-styles/navigation-button.js.map +1 -1
  74. package/build-module/components/global-styles/screen-block-list.js +31 -2
  75. package/build-module/components/global-styles/screen-block-list.js.map +1 -1
  76. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  77. package/build-module/components/global-styles/typography-panel.js +6 -3
  78. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  79. package/build-module/components/global-styles/use-global-styles-output.js +20 -4
  80. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  81. package/build-module/components/global-styles/utils.js +2 -2
  82. package/build-module/components/global-styles/utils.js.map +1 -1
  83. package/build-module/components/header/index.js +1 -1
  84. package/build-module/components/header/index.js.map +1 -1
  85. package/build-module/components/header/more-menu/index.js +11 -22
  86. package/build-module/components/header/more-menu/index.js.map +1 -1
  87. package/build-module/components/header/more-menu/site-export.js +1 -1
  88. package/build-module/components/header/more-menu/site-export.js.map +1 -1
  89. package/build-module/components/header/more-menu/welcome-guide-menu-item.js +4 -8
  90. package/build-module/components/header/more-menu/welcome-guide-menu-item.js.map +1 -1
  91. package/build-module/components/keyboard-shortcuts/index.js +1 -1
  92. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  93. package/build-module/components/list/table.js +9 -21
  94. package/build-module/components/list/table.js.map +1 -1
  95. package/build-module/components/navigation-sidebar/navigation-panel/index.js +9 -3
  96. package/build-module/components/navigation-sidebar/navigation-panel/index.js.map +1 -1
  97. package/build-module/components/navigation-sidebar/navigation-toggle/index.js +12 -4
  98. package/build-module/components/navigation-sidebar/navigation-toggle/index.js.map +1 -1
  99. package/build-module/components/secondary-sidebar/list-view-sidebar.js +1 -12
  100. package/build-module/components/secondary-sidebar/list-view-sidebar.js.map +1 -1
  101. package/build-module/components/sidebar/global-styles-sidebar.js +4 -4
  102. package/build-module/components/sidebar/global-styles-sidebar.js.map +1 -1
  103. package/build-module/components/template-part-converter/convert-to-template-part.js +4 -1
  104. package/build-module/components/template-part-converter/convert-to-template-part.js.map +1 -1
  105. package/build-module/components/welcome-guide/editor.js +5 -5
  106. package/build-module/components/welcome-guide/editor.js.map +1 -1
  107. package/build-module/components/welcome-guide/styles.js +5 -4
  108. package/build-module/components/welcome-guide/styles.js.map +1 -1
  109. package/build-module/index.js +20 -7
  110. package/build-module/index.js.map +1 -1
  111. package/build-module/store/actions.js +181 -154
  112. package/build-module/store/actions.js.map +1 -1
  113. package/build-module/store/index.js +4 -9
  114. package/build-module/store/index.js.map +1 -1
  115. package/build-module/store/reducer.js +0 -40
  116. package/build-module/store/reducer.js.map +1 -1
  117. package/build-module/store/selectors.js +28 -10
  118. package/build-module/store/selectors.js.map +1 -1
  119. package/build-style/style-rtl.css +102 -39
  120. package/build-style/style.css +102 -39
  121. package/package.json +33 -27
  122. package/src/components/add-new-template/new-template-part.js +7 -1
  123. package/src/components/app/index.js +19 -0
  124. package/src/components/editor/global-styles-renderer.js +7 -1
  125. package/src/components/editor/index.js +2 -20
  126. package/src/components/error-boundary/index.js +11 -28
  127. package/src/components/error-boundary/warning.js +59 -0
  128. package/src/components/global-styles/navigation-button.js +6 -25
  129. package/src/components/global-styles/screen-block-list.js +27 -2
  130. package/src/components/global-styles/screen-typography.js +1 -2
  131. package/src/components/global-styles/typography-panel.js +12 -5
  132. package/src/components/global-styles/use-global-styles-output.js +19 -3
  133. package/src/components/global-styles/utils.js +2 -2
  134. package/src/components/header/index.js +1 -1
  135. package/src/components/header/more-menu/index.js +12 -29
  136. package/src/components/header/more-menu/site-export.js +1 -1
  137. package/src/components/header/more-menu/welcome-guide-menu-item.js +3 -7
  138. package/src/components/keyboard-shortcuts/index.js +1 -1
  139. package/src/components/list/table.js +18 -23
  140. package/src/components/navigation-sidebar/navigation-panel/index.js +16 -11
  141. package/src/components/navigation-sidebar/navigation-toggle/index.js +13 -4
  142. package/src/components/navigation-sidebar/navigation-toggle/style.scss +32 -31
  143. package/src/components/navigation-sidebar/navigation-toggle/test/index.js +1 -1
  144. package/src/components/secondary-sidebar/list-view-sidebar.js +1 -11
  145. package/src/components/sidebar/global-styles-sidebar.js +6 -3
  146. package/src/components/sidebar/style.scss +1 -1
  147. package/src/components/template-part-converter/convert-to-template-part.js +6 -1
  148. package/src/components/welcome-guide/editor.js +8 -4
  149. package/src/components/welcome-guide/styles.js +5 -3
  150. package/src/index.js +25 -7
  151. package/src/store/actions.js +180 -215
  152. package/src/store/index.js +2 -8
  153. package/src/store/reducer.js +0 -30
  154. package/src/store/selectors.js +37 -10
  155. package/src/store/test/actions.js +203 -92
  156. package/src/store/test/reducer.js +0 -22
  157. package/src/store/test/selectors.js +22 -53
  158. package/src/style.scss +0 -1
  159. package/build/components/header/feature-toggle/index.js +0 -66
  160. package/build/components/header/feature-toggle/index.js.map +0 -1
  161. package/build/components/routes/redirect-to-homepage.js +0 -87
  162. package/build/components/routes/redirect-to-homepage.js.map +0 -1
  163. package/build/store/defaults.js +0 -15
  164. package/build/store/defaults.js.map +0 -1
  165. package/build-module/components/header/feature-toggle/index.js +0 -52
  166. package/build-module/components/header/feature-toggle/index.js.map +0 -1
  167. package/build-module/components/routes/redirect-to-homepage.js +0 -75
  168. package/build-module/components/routes/redirect-to-homepage.js.map +0 -1
  169. package/build-module/store/defaults.js +0 -8
  170. package/build-module/store/defaults.js.map +0 -1
  171. package/src/components/header/feature-toggle/index.js +0 -55
  172. package/src/components/header/more-menu/style.scss +0 -29
  173. package/src/components/routes/redirect-to-homepage.js +0 -71
  174. package/src/store/defaults.js +0 -7
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { get, map, keyBy } from 'lodash';
4
+ import { map, keyBy } from 'lodash';
5
5
  import createSelector from 'rememo';
6
6
 
7
7
  /**
@@ -9,9 +9,11 @@ import createSelector from 'rememo';
9
9
  */
10
10
  import { store as coreDataStore } from '@wordpress/core-data';
11
11
  import { createRegistrySelector } from '@wordpress/data';
12
+ import deprecated from '@wordpress/deprecated';
12
13
  import { uploadMedia } from '@wordpress/media-utils';
13
14
  import { isTemplatePart } from '@wordpress/blocks';
14
15
  import { Platform } from '@wordpress/element';
16
+ import { store as preferencesStore } from '@wordpress/preferences';
15
17
 
16
18
  /**
17
19
  * Internal dependencies
@@ -31,16 +33,35 @@ import {
31
33
  * @typedef {'template'|'template_type'} TemplateType Template type.
32
34
  */
33
35
 
36
+ /**
37
+ * Helper for getting a preference from the preferences store.
38
+ *
39
+ * This is only present so that `getSettings` doesn't need to be made a
40
+ * registry selector.
41
+ *
42
+ * It's unstable because the selector needs to be exported and so part of the
43
+ * public API to work.
44
+ */
45
+ export const __unstableGetPreference = createRegistrySelector(
46
+ ( select ) => ( state, name ) =>
47
+ select( preferencesStore ).get( 'core/edit-site', name )
48
+ );
49
+
34
50
  /**
35
51
  * Returns whether the given feature is enabled or not.
36
52
  *
37
- * @param {Object} state Global application state.
38
- * @param {string} feature Feature slug.
53
+ * @param {Object} state Global application state.
54
+ * @param {string} featureName Feature slug.
39
55
  *
40
56
  * @return {boolean} Is active.
41
57
  */
42
- export function isFeatureActive( state, feature ) {
43
- return get( state.preferences.features, [ feature ], false );
58
+ export function isFeatureActive( state, featureName ) {
59
+ deprecated( `select( 'core/interface' ).isFeatureActive`, {
60
+ since: '6.0',
61
+ alternative: `select( 'core/preferences' ).get`,
62
+ } );
63
+
64
+ return !! __unstableGetPreference( state, featureName );
44
65
  }
45
66
 
46
67
  /**
@@ -94,10 +115,15 @@ export const getSettings = createSelector(
94
115
  const settings = {
95
116
  ...state.settings,
96
117
  outlineMode: true,
97
- focusMode: isFeatureActive( state, 'focusMode' ),
98
- hasFixedToolbar: isFeatureActive( state, 'fixedToolbar' ),
118
+ focusMode: !! __unstableGetPreference( state, 'focusMode' ),
119
+ hasFixedToolbar: !! __unstableGetPreference(
120
+ state,
121
+ 'fixedToolbar'
122
+ ),
99
123
  __experimentalSetIsInserterOpened: setIsInserterOpen,
100
124
  __experimentalReusableBlocks: getReusableBlocks( state ),
125
+ __experimentalPreferPatternsOnRoot:
126
+ 'wp_template' === getEditedPostType( state ),
101
127
  };
102
128
 
103
129
  const canUserCreateMedia = getCanUserCreateMedia( state );
@@ -117,9 +143,10 @@ export const getSettings = createSelector(
117
143
  ( state ) => [
118
144
  getCanUserCreateMedia( state ),
119
145
  state.settings,
120
- isFeatureActive( state, 'focusMode' ),
121
- isFeatureActive( state, 'fixedToolbar' ),
146
+ __unstableGetPreference( state, 'focusMode' ),
147
+ __unstableGetPreference( state, 'fixedToolbar' ),
122
148
  getReusableBlocks( state ),
149
+ getEditedPostType( state ),
123
150
  ]
124
151
  );
125
152
 
@@ -336,5 +363,5 @@ export const getCurrentTemplateTemplateParts = createRegistrySelector(
336
363
  * @return {string} Editing mode.
337
364
  */
338
365
  export function getEditorMode( state ) {
339
- return state.preferences.editorMode || 'visual';
366
+ return __unstableGetPreference( state, 'editorMode' );
340
367
  }
@@ -1,129 +1,240 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import apiFetch from '@wordpress/api-fetch';
5
+ import { store as blockEditorStore } from '@wordpress/block-editor';
6
+ import { store as coreStore } from '@wordpress/core-data';
7
+ import { createRegistry } from '@wordpress/data';
8
+ import { store as interfaceStore } from '@wordpress/interface';
9
+ import { store as noticesStore } from '@wordpress/notices';
10
+ import { store as preferencesStore } from '@wordpress/preferences';
11
+
1
12
  /**
2
13
  * Internal dependencies
3
14
  */
4
- import {
5
- toggleFeature,
6
- setTemplate,
7
- addTemplate,
8
- setTemplatePart,
9
- setPage,
10
- setHomeTemplateId,
11
- setIsListViewOpened,
12
- } from '../actions';
15
+ import { store as editSiteStore } from '..';
16
+
17
+ jest.useRealTimers();
18
+
19
+ const ENTITY_TYPES = {
20
+ wp_template: {
21
+ description: 'Templates to include in your theme.',
22
+ hierarchical: false,
23
+ name: 'Templates',
24
+ rest_base: 'templates',
25
+ rest_namespace: 'wp/v2',
26
+ slug: 'wp_template',
27
+ taxonomies: [],
28
+ },
29
+ };
30
+
31
+ function createRegistryWithStores() {
32
+ // create a registry
33
+ const registry = createRegistry();
34
+
35
+ // register stores
36
+ registry.register( blockEditorStore );
37
+ registry.register( coreStore );
38
+ registry.register( editSiteStore );
39
+ registry.register( interfaceStore );
40
+ registry.register( noticesStore );
41
+ registry.register( preferencesStore );
42
+
43
+ return registry;
44
+ }
13
45
 
14
46
  describe( 'actions', () => {
15
47
  describe( 'toggleFeature', () => {
16
- it( 'should return TOGGLE_FEATURE action', () => {
17
- const feature = 'name';
18
- expect( toggleFeature( feature ) ).toEqual( {
19
- type: 'TOGGLE_FEATURE',
20
- feature,
21
- } );
48
+ it( 'should toggle a feature flag', () => {
49
+ const registry = createRegistryWithStores();
50
+
51
+ // Should default to false.
52
+ expect(
53
+ registry.select( editSiteStore ).isFeatureActive( 'name' )
54
+ ).toBe( false );
55
+
56
+ // Toggle on.
57
+ registry.dispatch( editSiteStore ).toggleFeature( 'name' );
58
+ expect(
59
+ registry.select( editSiteStore ).isFeatureActive( 'name' )
60
+ ).toBe( true );
61
+
62
+ // Toggle off again.
63
+ registry.dispatch( editSiteStore ).toggleFeature( 'name' );
64
+ expect(
65
+ registry.select( editSiteStore ).isFeatureActive( 'name' )
66
+ ).toBe( false );
67
+
68
+ // Expect a deprecation warning.
69
+ expect( console ).toHaveWarned();
22
70
  } );
23
71
  } );
24
72
 
25
73
  describe( 'setTemplate', () => {
26
- it( 'should return the SET_TEMPLATE action when slug is provided', () => {
27
- const templateId = 1;
28
- const templateSlug = 'archive';
29
- const it = setTemplate( templateId, templateSlug );
30
- expect( it.next().value ).toEqual( {
31
- type: 'SET_TEMPLATE',
32
- templateId,
33
- page: { context: { templateSlug } },
34
- } );
74
+ const ID = 1;
75
+ const SLUG = 'archive';
76
+
77
+ it( 'should set the template when slug is provided', async () => {
78
+ const registry = createRegistryWithStores();
79
+
80
+ await registry.dispatch( editSiteStore ).setTemplate( ID, SLUG );
81
+
82
+ const select = registry.select( editSiteStore );
83
+ expect( select.getEditedPostId() ).toBe( ID );
84
+ expect( select.getPage().context.templateSlug ).toBe( SLUG );
35
85
  } );
36
- it( 'should return the SET_TEMPLATE by getting the template slug', () => {
37
- const templateId = 1;
38
- const template = { slug: 'index' };
39
- const it = setTemplate( templateId );
40
- expect( it.next().value ).toEqual( {
41
- type: '@@data/RESOLVE_SELECT',
42
- storeKey: 'core',
43
- selectorName: 'getEntityRecord',
44
- args: [ 'postType', 'wp_template', templateId ],
45
- } );
46
- expect( it.next( template ).value ).toEqual( {
47
- type: 'SET_TEMPLATE',
48
- templateId,
49
- page: { context: { templateSlug: template.slug } },
86
+
87
+ it( 'should set the template by fetching the template slug', async () => {
88
+ const registry = createRegistryWithStores();
89
+
90
+ apiFetch.setFetchHandler( async ( options ) => {
91
+ const { method = 'GET', path } = options;
92
+ if ( method === 'GET' ) {
93
+ if ( path.startsWith( '/wp/v2/types' ) ) {
94
+ return ENTITY_TYPES;
95
+ }
96
+
97
+ if ( path.startsWith( `/wp/v2/templates/${ ID }` ) ) {
98
+ return { id: ID, slug: SLUG };
99
+ }
100
+ }
101
+
102
+ throw {
103
+ code: 'unknown_path',
104
+ message: `Unknown path: ${ method } ${ path }`,
105
+ };
50
106
  } );
107
+
108
+ await registry.dispatch( editSiteStore ).setTemplate( ID );
109
+
110
+ const select = registry.select( editSiteStore );
111
+ expect( select.getEditedPostId() ).toBe( ID );
112
+ expect( select.getPage().context.templateSlug ).toBe( SLUG );
51
113
  } );
52
114
  } );
53
115
 
54
116
  describe( 'addTemplate', () => {
55
- it( 'should yield the DISPATCH control to create the template and return the SET_TEMPLATE action', () => {
56
- const template = { slug: 'index' };
57
- const newTemplate = { id: 1, slug: 'index' };
58
-
59
- const it = addTemplate( template );
60
- expect( it.next().value ).toEqual( {
61
- type: '@@data/DISPATCH',
62
- storeKey: 'core',
63
- actionName: 'saveEntityRecord',
64
- args: [ 'postType', 'wp_template', template ],
65
- } );
66
- expect( it.next( newTemplate ) ).toEqual( {
67
- value: {
68
- type: 'SET_TEMPLATE',
69
- templateId: newTemplate.id,
70
- page: { context: { templateSlug: newTemplate.slug } },
71
- },
72
- done: true,
117
+ it( 'should issue a REST request to create the template and then set it', async () => {
118
+ const registry = createRegistryWithStores();
119
+
120
+ const ID = 1;
121
+ const SLUG = 'index';
122
+
123
+ apiFetch.setFetchHandler( async ( options ) => {
124
+ const { method = 'GET', path, data } = options;
125
+
126
+ if ( method === 'GET' && path.startsWith( '/wp/v2/types' ) ) {
127
+ return ENTITY_TYPES;
128
+ }
129
+
130
+ if (
131
+ method === 'POST' &&
132
+ path.startsWith( '/wp/v2/templates' )
133
+ ) {
134
+ return { id: ID, slug: data.slug };
135
+ }
136
+
137
+ throw {
138
+ code: 'unknown_path',
139
+ message: `Unknown path: ${ method } ${ path }`,
140
+ };
73
141
  } );
142
+
143
+ await registry
144
+ .dispatch( editSiteStore )
145
+ .addTemplate( { slug: SLUG } );
146
+
147
+ const select = registry.select( editSiteStore );
148
+ expect( select.getEditedPostId() ).toBe( ID );
149
+ expect( select.getPage().context.templateSlug ).toBe( SLUG );
74
150
  } );
75
151
  } );
76
152
 
77
153
  describe( 'setTemplatePart', () => {
78
- it( 'should return the SET_TEMPLATE_PART action', () => {
79
- const templatePartId = 1;
80
- expect( setTemplatePart( templatePartId ) ).toEqual( {
81
- type: 'SET_TEMPLATE_PART',
82
- templatePartId,
83
- } );
154
+ it( 'should set template part', () => {
155
+ const registry = createRegistryWithStores();
156
+
157
+ const ID = 1;
158
+ registry.dispatch( editSiteStore ).setTemplatePart( ID );
159
+
160
+ const select = registry.select( editSiteStore );
161
+ expect( select.getEditedPostId() ).toBe( ID );
162
+ expect( select.getEditedPostType() ).toBe( 'wp_template_part' );
84
163
  } );
85
164
  } );
86
165
 
87
166
  describe( 'setPage', () => {
88
- it( 'should yield the FIND_TEMPLATE control and return the SET_PAGE action', () => {
89
- const page = { path: '/' };
90
-
91
- const it = setPage( page );
92
- expect( it.next().value ).toEqual( {
93
- type: '@@data/RESOLVE_SELECT',
94
- storeKey: 'core',
95
- selectorName: '__experimentalGetTemplateForLink',
96
- args: [ page.path ],
97
- } );
98
- expect( it.next( { id: 'emptytheme//single' } ).value ).toEqual( {
99
- type: 'SET_PAGE',
100
- page,
101
- templateId: 'emptytheme//single',
167
+ it( 'should find the template and then set the page', async () => {
168
+ const registry = createRegistryWithStores();
169
+
170
+ const ID = 'emptytheme//single';
171
+ const SLUG = 'single';
172
+
173
+ window.fetch = async ( path ) => {
174
+ if ( path === '/?_wp-find-template=true' ) {
175
+ return {
176
+ json: async () => ( { data: { id: ID, slug: SLUG } } ),
177
+ };
178
+ }
179
+
180
+ throw {
181
+ code: 'unknown_path',
182
+ message: `Unknown path: ${ path }`,
183
+ };
184
+ };
185
+
186
+ apiFetch.setFetchHandler( async ( options ) => {
187
+ const { method = 'GET', path } = options;
188
+
189
+ if ( method === 'GET' ) {
190
+ if ( path.startsWith( '/wp/v2/types' ) ) {
191
+ return ENTITY_TYPES;
192
+ }
193
+
194
+ if ( path.startsWith( `/wp/v2/templates/${ ID }` ) ) {
195
+ return { id: ID, slug: SLUG };
196
+ }
197
+ }
198
+
199
+ throw {
200
+ code: 'unknown_path',
201
+ message: `Unknown path: ${ method } ${ path }`,
202
+ };
102
203
  } );
103
- expect( it.next().done ).toBe( true );
204
+
205
+ await registry.dispatch( editSiteStore ).setPage( { path: '/' } );
206
+
207
+ const select = registry.select( editSiteStore );
208
+ expect( select.getEditedPostId() ).toBe( 'emptytheme//single' );
209
+ expect( select.getEditedPostType() ).toBe( 'wp_template' );
210
+ expect( select.getPage().path ).toBe( '/' );
104
211
  } );
105
212
  } );
106
213
 
107
214
  describe( 'setHomeTemplateId', () => {
108
- it( 'should return the SET_HOME_TEMPLATE action', () => {
109
- const homeTemplateId = 90;
110
- expect( setHomeTemplateId( homeTemplateId ) ).toEqual( {
111
- type: 'SET_HOME_TEMPLATE',
112
- homeTemplateId,
113
- } );
215
+ it( 'should set the home template ID', () => {
216
+ const registry = createRegistryWithStores();
217
+
218
+ registry.dispatch( editSiteStore ).setHomeTemplateId( 90 );
219
+ expect( registry.select( editSiteStore ).getHomeTemplateId() ).toBe(
220
+ 90
221
+ );
114
222
  } );
115
223
  } );
116
224
 
117
225
  describe( 'setIsListViewOpened', () => {
118
- it( 'should return the SET_IS_LIST_VIEW_OPENED action', () => {
119
- expect( setIsListViewOpened( true ) ).toEqual( {
120
- type: 'SET_IS_LIST_VIEW_OPENED',
121
- isOpen: true,
122
- } );
123
- expect( setIsListViewOpened( false ) ).toEqual( {
124
- type: 'SET_IS_LIST_VIEW_OPENED',
125
- isOpen: false,
126
- } );
226
+ it( 'should set the list view opened state', () => {
227
+ const registry = createRegistryWithStores();
228
+
229
+ registry.dispatch( editSiteStore ).setIsListViewOpened( true );
230
+ expect( registry.select( editSiteStore ).isListViewOpened() ).toBe(
231
+ true
232
+ );
233
+
234
+ registry.dispatch( editSiteStore ).setIsListViewOpened( false );
235
+ expect( registry.select( editSiteStore ).isListViewOpened() ).toBe(
236
+ false
237
+ );
127
238
  } );
128
239
  } );
129
240
  } );
@@ -7,7 +7,6 @@ import deepFreeze from 'deep-freeze';
7
7
  * Internal dependencies
8
8
  */
9
9
  import {
10
- preferences,
11
10
  settings,
12
11
  homeTemplateId,
13
12
  editedPost,
@@ -15,7 +14,6 @@ import {
15
14
  blockInserterPanel,
16
15
  listViewPanel,
17
16
  } from '../reducer';
18
- import { PREFERENCES_DEFAULTS } from '../defaults';
19
17
 
20
18
  import {
21
19
  setNavigationPanelActiveMenu,
@@ -26,26 +24,6 @@ import {
26
24
  } from '../actions';
27
25
 
28
26
  describe( 'state', () => {
29
- describe( 'preferences()', () => {
30
- it( 'should apply all defaults', () => {
31
- const state = preferences( undefined, {} );
32
-
33
- expect( state ).toEqual( PREFERENCES_DEFAULTS );
34
- } );
35
-
36
- it( 'should toggle a feature flag', () => {
37
- const state = preferences(
38
- deepFreeze( { features: { chicken: true } } ),
39
- {
40
- type: 'TOGGLE_FEATURE',
41
- feature: 'chicken',
42
- }
43
- );
44
-
45
- expect( state.features ).toEqual( { chicken: false } );
46
- } );
47
- } );
48
-
49
27
  describe( 'settings()', () => {
50
28
  it( 'should apply default state', () => {
51
29
  expect( settings( undefined, {} ) ).toEqual( {} );
@@ -7,7 +7,6 @@ import { store as coreDataStore } from '@wordpress/core-data';
7
7
  * Internal dependencies
8
8
  */
9
9
  import {
10
- isFeatureActive,
11
10
  getCanUserCreateMedia,
12
11
  getSettings,
13
12
  getHomeTemplateId,
@@ -19,62 +18,22 @@ import {
19
18
  isNavigationOpened,
20
19
  isInserterOpened,
21
20
  isListViewOpened,
21
+ __unstableGetPreference,
22
22
  } from '../selectors';
23
23
 
24
24
  describe( 'selectors', () => {
25
25
  const canUser = jest.fn( () => true );
26
26
  const getEntityRecords = jest.fn( () => [] );
27
+ const get = jest.fn();
27
28
  getCanUserCreateMedia.registry = {
28
29
  select: jest.fn( () => ( { canUser } ) ),
29
30
  };
30
31
  getReusableBlocks.registry = {
31
32
  select: jest.fn( () => ( { getEntityRecords } ) ),
32
33
  };
33
-
34
- describe( 'isFeatureActive', () => {
35
- it( 'is tolerant to an undefined features preference', () => {
36
- // See: https://github.com/WordPress/gutenberg/issues/14580
37
- const state = {
38
- preferences: {},
39
- };
40
-
41
- expect( isFeatureActive( state, 'chicken' ) ).toBe( false );
42
- } );
43
-
44
- it( 'should return true if feature is active', () => {
45
- const state = {
46
- preferences: {
47
- features: {
48
- chicken: true,
49
- },
50
- },
51
- };
52
-
53
- expect( isFeatureActive( state, 'chicken' ) ).toBe( true );
54
- } );
55
-
56
- it( 'should return false if feature is not active', () => {
57
- const state = {
58
- preferences: {
59
- features: {
60
- chicken: false,
61
- },
62
- },
63
- };
64
-
65
- expect( isFeatureActive( state, 'chicken' ) ).toBe( false );
66
- } );
67
-
68
- it( 'should return false if feature is not referred', () => {
69
- const state = {
70
- preferences: {
71
- features: {},
72
- },
73
- };
74
-
75
- expect( isFeatureActive( state, 'chicken' ) ).toBe( false );
76
- } );
77
- } );
34
+ __unstableGetPreference.registry = {
35
+ select: jest.fn( () => ( { get } ) ),
36
+ };
78
37
 
79
38
  describe( 'getCanUserCreateMedia', () => {
80
39
  it( "selects `canUser( 'create', 'media' )` from the core store", () => {
@@ -106,7 +65,15 @@ describe( 'selectors', () => {
106
65
  it( "returns the settings when the user can't create media", () => {
107
66
  canUser.mockReturnValueOnce( false );
108
67
  canUser.mockReturnValueOnce( false );
109
- const state = { settings: {}, preferences: {} };
68
+ get.mockImplementation( ( scope, name ) => {
69
+ if ( name === 'focusMode' ) return false;
70
+ if ( name === 'fixedToolbar' ) return false;
71
+ } );
72
+ const state = {
73
+ settings: {},
74
+ preferences: {},
75
+ editedPost: { type: 'wp_template' },
76
+ };
110
77
  const setInserterOpened = () => {};
111
78
  expect( getSettings( state, setInserterOpened ) ).toEqual( {
112
79
  outlineMode: true,
@@ -114,18 +81,19 @@ describe( 'selectors', () => {
114
81
  hasFixedToolbar: false,
115
82
  __experimentalSetIsInserterOpened: setInserterOpened,
116
83
  __experimentalReusableBlocks: [],
84
+ __experimentalPreferPatternsOnRoot: true,
117
85
  } );
118
86
  } );
119
87
 
120
88
  it( 'returns the extended settings when the user can create media', () => {
89
+ get.mockImplementation( ( scope, name ) => {
90
+ if ( name === 'focusMode' ) return true;
91
+ if ( name === 'fixedToolbar' ) return true;
92
+ } );
93
+
121
94
  const state = {
122
95
  settings: { key: 'value' },
123
- preferences: {
124
- features: {
125
- focusMode: true,
126
- fixedToolbar: true,
127
- },
128
- },
96
+ editedPost: { type: 'wp_template_part' },
129
97
  };
130
98
  const setInserterOpened = () => {};
131
99
 
@@ -137,6 +105,7 @@ describe( 'selectors', () => {
137
105
  __experimentalSetIsInserterOpened: setInserterOpened,
138
106
  __experimentalReusableBlocks: [],
139
107
  mediaUpload: expect.any( Function ),
108
+ __experimentalPreferPatternsOnRoot: false,
140
109
  } );
141
110
  } );
142
111
  } );
package/src/style.scss CHANGED
@@ -5,7 +5,6 @@
5
5
  @import "./components/global-styles/style.scss";
6
6
  @import "./components/header/style.scss";
7
7
  @import "./components/header/document-actions/style.scss";
8
- @import "./components/header/more-menu/style.scss";
9
8
  @import "./components/navigation-sidebar/navigation-toggle/style.scss";
10
9
  @import "./components/navigation-sidebar/navigation-panel/style.scss";
11
10
  @import "./components/list/style.scss";
@@ -1,66 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = FeatureToggle;
7
-
8
- var _element = require("@wordpress/element");
9
-
10
- var _lodash = require("lodash");
11
-
12
- var _data = require("@wordpress/data");
13
-
14
- var _components = require("@wordpress/components");
15
-
16
- var _i18n = require("@wordpress/i18n");
17
-
18
- var _icons = require("@wordpress/icons");
19
-
20
- var _a11y = require("@wordpress/a11y");
21
-
22
- var _store = require("../../../store");
23
-
24
- /**
25
- * External dependencies
26
- */
27
-
28
- /**
29
- * WordPress dependencies
30
- */
31
-
32
- /**
33
- * Internal dependencies
34
- */
35
- function FeatureToggle(_ref) {
36
- let {
37
- feature,
38
- label,
39
- info,
40
- messageActivated,
41
- messageDeactivated
42
- } = _ref;
43
-
44
- const speakMessage = () => {
45
- if (isActive) {
46
- (0, _a11y.speak)(messageDeactivated || (0, _i18n.__)('Feature deactivated'));
47
- } else {
48
- (0, _a11y.speak)(messageActivated || (0, _i18n.__)('Feature activated'));
49
- }
50
- };
51
-
52
- const isActive = (0, _data.useSelect)(select => {
53
- return select(_store.store).isFeatureActive(feature);
54
- }, []);
55
- const {
56
- toggleFeature
57
- } = (0, _data.useDispatch)(_store.store);
58
- return (0, _element.createElement)(_components.MenuItem, {
59
- icon: isActive && _icons.check,
60
- isSelected: isActive,
61
- onClick: (0, _lodash.flow)(toggleFeature.bind(null, feature), speakMessage),
62
- role: "menuitemcheckbox",
63
- info: info
64
- }, label);
65
- }
66
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["@wordpress/edit-site/src/components/header/feature-toggle/index.js"],"names":["FeatureToggle","feature","label","info","messageActivated","messageDeactivated","speakMessage","isActive","select","editSiteStore","isFeatureActive","toggleFeature","check","bind"],"mappings":";;;;;;;;;AAGA;;AAKA;;AACA;;AACA;;AACA;;AACA;;AAKA;;AAjBA;AACA;AACA;;AAGA;AACA;AACA;;AAOA;AACA;AACA;AAGe,SAASA,aAAT,OAMX;AAAA,MANmC;AACtCC,IAAAA,OADsC;AAEtCC,IAAAA,KAFsC;AAGtCC,IAAAA,IAHsC;AAItCC,IAAAA,gBAJsC;AAKtCC,IAAAA;AALsC,GAMnC;;AACH,QAAMC,YAAY,GAAG,MAAM;AAC1B,QAAKC,QAAL,EAAgB;AACf,uBAAOF,kBAAkB,IAAI,cAAI,qBAAJ,CAA7B;AACA,KAFD,MAEO;AACN,uBAAOD,gBAAgB,IAAI,cAAI,mBAAJ,CAA3B;AACA;AACD,GAND;;AAQA,QAAMG,QAAQ,GAAG,qBAAaC,MAAF,IAAc;AACzC,WAAOA,MAAM,CAAEC,YAAF,CAAN,CAAwBC,eAAxB,CAAyCT,OAAzC,CAAP;AACA,GAFgB,EAEd,EAFc,CAAjB;AAIA,QAAM;AAAEU,IAAAA;AAAF,MAAoB,uBAAaF,YAAb,CAA1B;AAEA,SACC,4BAAC,oBAAD;AACC,IAAA,IAAI,EAAGF,QAAQ,IAAIK,YADpB;AAEC,IAAA,UAAU,EAAGL,QAFd;AAGC,IAAA,OAAO,EAAG,kBACTI,aAAa,CAACE,IAAd,CAAoB,IAApB,EAA0BZ,OAA1B,CADS,EAETK,YAFS,CAHX;AAOC,IAAA,IAAI,EAAC,kBAPN;AAQC,IAAA,IAAI,EAAGH;AARR,KAUGD,KAVH,CADD;AAcA","sourcesContent":["/**\n * External dependencies\n */\nimport { flow } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { MenuItem } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { check } from '@wordpress/icons';\nimport { speak } from '@wordpress/a11y';\n\n/**\n * Internal dependencies\n */\nimport { store as editSiteStore } from '../../../store';\n\nexport default function FeatureToggle( {\n\tfeature,\n\tlabel,\n\tinfo,\n\tmessageActivated,\n\tmessageDeactivated,\n} ) {\n\tconst speakMessage = () => {\n\t\tif ( isActive ) {\n\t\t\tspeak( messageDeactivated || __( 'Feature deactivated' ) );\n\t\t} else {\n\t\t\tspeak( messageActivated || __( 'Feature activated' ) );\n\t\t}\n\t};\n\n\tconst isActive = useSelect( ( select ) => {\n\t\treturn select( editSiteStore ).isFeatureActive( feature );\n\t}, [] );\n\n\tconst { toggleFeature } = useDispatch( editSiteStore );\n\n\treturn (\n\t\t<MenuItem\n\t\t\ticon={ isActive && check }\n\t\t\tisSelected={ isActive }\n\t\t\tonClick={ flow(\n\t\t\t\ttoggleFeature.bind( null, feature ),\n\t\t\t\tspeakMessage\n\t\t\t) }\n\t\t\trole=\"menuitemcheckbox\"\n\t\t\tinfo={ info }\n\t\t>\n\t\t\t{ label }\n\t\t</MenuItem>\n\t);\n}\n"]}