@wordpress/edit-site 5.19.1 → 5.19.3

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 (120) hide show
  1. package/build/components/add-new-pattern/index.js +5 -9
  2. package/build/components/add-new-pattern/index.js.map +1 -1
  3. package/build/components/global-styles/font-families.js +2 -1
  4. package/build/components/global-styles/font-families.js.map +1 -1
  5. package/build/components/global-styles/font-library-modal/collection-font-details.js +3 -1
  6. package/build/components/global-styles/font-library-modal/collection-font-details.js.map +1 -1
  7. package/build/components/global-styles/font-library-modal/context.js +26 -30
  8. package/build/components/global-styles/font-library-modal/context.js.map +1 -1
  9. package/build/components/global-styles/font-library-modal/font-collection.js +31 -11
  10. package/build/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  11. package/build/components/global-styles/font-library-modal/index.js +10 -3
  12. package/build/components/global-styles/font-library-modal/index.js.map +1 -1
  13. package/build/components/global-styles/font-library-modal/installed-fonts.js +27 -7
  14. package/build/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  15. package/build/components/global-styles/font-library-modal/local-fonts.js +35 -8
  16. package/build/components/global-styles/font-library-modal/local-fonts.js.map +1 -1
  17. package/build/components/global-styles/font-library-modal/upload-fonts.js +26 -0
  18. package/build/components/global-styles/font-library-modal/upload-fonts.js.map +1 -0
  19. package/build/components/global-styles/font-library-modal/utils/fonts-outline.js +4 -1
  20. package/build/components/global-styles/font-library-modal/utils/fonts-outline.js.map +1 -1
  21. package/build/components/global-styles/font-library-modal/utils/get-notice-from-response.js +71 -0
  22. package/build/components/global-styles/font-library-modal/utils/get-notice-from-response.js.map +1 -0
  23. package/build/components/global-styles/font-library-modal/utils/index.js +3 -0
  24. package/build/components/global-styles/font-library-modal/utils/index.js.map +1 -1
  25. package/build/components/global-styles/screen-typography.js +1 -1
  26. package/build/components/global-styles/screen-typography.js.map +1 -1
  27. package/build/components/page-patterns/grid.js +0 -1
  28. package/build/components/page-patterns/grid.js.map +1 -1
  29. package/build/components/page-patterns/patterns-list.js +1 -1
  30. package/build/components/page-patterns/patterns-list.js.map +1 -1
  31. package/build/components/page-patterns/use-patterns.js +5 -1
  32. package/build/components/page-patterns/use-patterns.js.map +1 -1
  33. package/build/components/page-template-parts/index.js +12 -1
  34. package/build/components/page-template-parts/index.js.map +1 -1
  35. package/build/components/sidebar-edit-mode/page-panels/reset-default-template.js +1 -1
  36. package/build/components/sidebar-edit-mode/page-panels/reset-default-template.js.map +1 -1
  37. package/build/components/sidebar-edit-mode/template-panel/pattern-categories.js +2 -2
  38. package/build/components/sidebar-edit-mode/template-panel/pattern-categories.js.map +1 -1
  39. package/build/components/sidebar-edit-mode/template-panel/template-areas.js +1 -1
  40. package/build/components/sidebar-edit-mode/template-panel/template-areas.js.map +1 -1
  41. package/build/components/sidebar-navigation-screen-patterns/index.js +14 -2
  42. package/build/components/sidebar-navigation-screen-patterns/index.js.map +1 -1
  43. package/build/components/sidebar-navigation-screen-template/home-template-details.js +13 -18
  44. package/build/components/sidebar-navigation-screen-template/home-template-details.js.map +1 -1
  45. package/build/components/sidebar-navigation-screen-templates-browse/index.js +16 -4
  46. package/build/components/sidebar-navigation-screen-templates-browse/index.js.map +1 -1
  47. package/build-module/components/add-new-pattern/index.js +5 -9
  48. package/build-module/components/add-new-pattern/index.js.map +1 -1
  49. package/build-module/components/global-styles/font-families.js +3 -2
  50. package/build-module/components/global-styles/font-families.js.map +1 -1
  51. package/build-module/components/global-styles/font-library-modal/collection-font-details.js +3 -1
  52. package/build-module/components/global-styles/font-library-modal/collection-font-details.js.map +1 -1
  53. package/build-module/components/global-styles/font-library-modal/context.js +26 -30
  54. package/build-module/components/global-styles/font-library-modal/context.js.map +1 -1
  55. package/build-module/components/global-styles/font-library-modal/font-collection.js +32 -12
  56. package/build-module/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  57. package/build-module/components/global-styles/font-library-modal/index.js +10 -3
  58. package/build-module/components/global-styles/font-library-modal/index.js.map +1 -1
  59. package/build-module/components/global-styles/font-library-modal/installed-fonts.js +28 -8
  60. package/build-module/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  61. package/build-module/components/global-styles/font-library-modal/local-fonts.js +38 -11
  62. package/build-module/components/global-styles/font-library-modal/local-fonts.js.map +1 -1
  63. package/build-module/components/global-styles/font-library-modal/upload-fonts.js +17 -0
  64. package/build-module/components/global-styles/font-library-modal/upload-fonts.js.map +1 -0
  65. package/build-module/components/global-styles/font-library-modal/utils/fonts-outline.js +4 -1
  66. package/build-module/components/global-styles/font-library-modal/utils/fonts-outline.js.map +1 -1
  67. package/build-module/components/global-styles/font-library-modal/utils/get-notice-from-response.js +63 -0
  68. package/build-module/components/global-styles/font-library-modal/utils/get-notice-from-response.js.map +1 -0
  69. package/build-module/components/global-styles/font-library-modal/utils/index.js +3 -0
  70. package/build-module/components/global-styles/font-library-modal/utils/index.js.map +1 -1
  71. package/build-module/components/global-styles/screen-typography.js +1 -1
  72. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  73. package/build-module/components/page-patterns/grid.js +0 -1
  74. package/build-module/components/page-patterns/grid.js.map +1 -1
  75. package/build-module/components/page-patterns/patterns-list.js +1 -1
  76. package/build-module/components/page-patterns/patterns-list.js.map +1 -1
  77. package/build-module/components/page-patterns/use-patterns.js +5 -1
  78. package/build-module/components/page-patterns/use-patterns.js.map +1 -1
  79. package/build-module/components/page-template-parts/index.js +12 -1
  80. package/build-module/components/page-template-parts/index.js.map +1 -1
  81. package/build-module/components/sidebar-edit-mode/page-panels/reset-default-template.js +1 -1
  82. package/build-module/components/sidebar-edit-mode/page-panels/reset-default-template.js.map +1 -1
  83. package/build-module/components/sidebar-edit-mode/template-panel/pattern-categories.js +3 -3
  84. package/build-module/components/sidebar-edit-mode/template-panel/pattern-categories.js.map +1 -1
  85. package/build-module/components/sidebar-edit-mode/template-panel/template-areas.js +1 -1
  86. package/build-module/components/sidebar-edit-mode/template-panel/template-areas.js.map +1 -1
  87. package/build-module/components/sidebar-navigation-screen-patterns/index.js +14 -2
  88. package/build-module/components/sidebar-navigation-screen-patterns/index.js.map +1 -1
  89. package/build-module/components/sidebar-navigation-screen-template/home-template-details.js +14 -19
  90. package/build-module/components/sidebar-navigation-screen-template/home-template-details.js.map +1 -1
  91. package/build-module/components/sidebar-navigation-screen-templates-browse/index.js +16 -4
  92. package/build-module/components/sidebar-navigation-screen-templates-browse/index.js.map +1 -1
  93. package/build-style/style-rtl.css +16 -2
  94. package/build-style/style.css +16 -2
  95. package/package.json +40 -40
  96. package/src/components/add-new-pattern/index.js +5 -8
  97. package/src/components/global-styles/font-families.js +5 -1
  98. package/src/components/global-styles/font-library-modal/collection-font-details.js +1 -1
  99. package/src/components/global-styles/font-library-modal/context.js +36 -38
  100. package/src/components/global-styles/font-library-modal/font-collection.js +41 -12
  101. package/src/components/global-styles/font-library-modal/index.js +16 -6
  102. package/src/components/global-styles/font-library-modal/installed-fonts.js +36 -6
  103. package/src/components/global-styles/font-library-modal/local-fonts.js +65 -23
  104. package/src/components/global-styles/font-library-modal/style.scss +18 -1
  105. package/src/components/global-styles/font-library-modal/upload-fonts.js +20 -0
  106. package/src/components/global-styles/font-library-modal/utils/fonts-outline.js +4 -3
  107. package/src/components/global-styles/font-library-modal/utils/get-notice-from-response.js +62 -0
  108. package/src/components/global-styles/font-library-modal/utils/index.js +4 -0
  109. package/src/components/global-styles/screen-typography.js +4 -3
  110. package/src/components/page-patterns/grid.js +1 -1
  111. package/src/components/page-patterns/patterns-list.js +1 -1
  112. package/src/components/page-patterns/use-patterns.js +7 -3
  113. package/src/components/page-template-parts/index.js +14 -1
  114. package/src/components/sidebar-edit-mode/page-panels/reset-default-template.js +1 -1
  115. package/src/components/sidebar-edit-mode/template-panel/pattern-categories.js +18 -16
  116. package/src/components/sidebar-edit-mode/template-panel/template-areas.js +1 -1
  117. package/src/components/sidebar-navigation-screen/style.scss +0 -1
  118. package/src/components/sidebar-navigation-screen-patterns/index.js +25 -4
  119. package/src/components/sidebar-navigation-screen-template/home-template-details.js +27 -35
  120. package/src/components/sidebar-navigation-screen-templates-browse/index.js +12 -4
@@ -92,11 +92,24 @@
92
92
  align-items: center;
93
93
  display: flex;
94
94
  justify-content: center;
95
- height: 100px;
95
+ height: 250px;
96
96
  width: 100%;
97
97
  background-color: #f0f0f0;
98
98
  }
99
99
 
100
+ .font-library-modal__local-fonts {
101
+ margin: 0 auto;
102
+ width: 80%;
103
+
104
+ .font-library-modal__upload-area__text {
105
+ color: #6e6e6e;
106
+ }
107
+
108
+ .font-library-modal__upload-area__notice {
109
+ margin: 0;
110
+ }
111
+ }
112
+
100
113
  .font-library-modal__font-name {
101
114
  font-weight: bold;
102
115
  }
@@ -137,3 +150,7 @@
137
150
  max-width: 350px;
138
151
  }
139
152
  }
153
+
154
+ .font-library-modal__font-collection__notice {
155
+ margin: 0;
156
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __experimentalSpacer as Spacer } from '@wordpress/components';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import LocalFonts from './local-fonts';
10
+
11
+ function UploadFonts() {
12
+ return (
13
+ <>
14
+ <Spacer margin={ 8 } />
15
+ <LocalFonts />
16
+ </>
17
+ );
18
+ }
19
+
20
+ export default UploadFonts;
@@ -15,7 +15,8 @@ export function getFontsOutline( fonts ) {
15
15
  }
16
16
 
17
17
  export function isFontFontFaceInOutline( slug, face, outline ) {
18
- return (
19
- outline[ slug ]?.[ `${ face.fontStyle }-${ face.fontWeight }` ] || false
20
- );
18
+ if ( ! face ) {
19
+ return !! outline[ slug ];
20
+ }
21
+ return !! outline[ slug ]?.[ `${ face.fontStyle }-${ face.fontWeight }` ];
21
22
  }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+
6
+ export function getNoticeFromInstallResponse( response ) {
7
+ const { errors = [], successes = [] } = response;
8
+ // Everything failed.
9
+ if ( errors.length && ! successes.length ) {
10
+ return {
11
+ type: 'error',
12
+ message: __( 'Error installing the fonts.' ),
13
+ };
14
+ }
15
+
16
+ // Eveerything succeeded.
17
+ if ( ! errors.length && successes.length ) {
18
+ return {
19
+ type: 'success',
20
+ message: __( 'Fonts were installed successfully.' ),
21
+ };
22
+ }
23
+
24
+ // Some succeeded, some failed.
25
+ if ( errors.length && successes.length ) {
26
+ return {
27
+ type: 'warning',
28
+ message: __(
29
+ 'Some fonts were installed successfully and some failed.'
30
+ ),
31
+ };
32
+ }
33
+ }
34
+
35
+ export function getNoticeFromUninstallResponse( response ) {
36
+ const { errors = [], successes = [] } = response;
37
+ // Everything failed.
38
+ if ( errors.length && ! successes.length ) {
39
+ return {
40
+ type: 'error',
41
+ message: __( 'Error uninstalling the fonts.' ),
42
+ };
43
+ }
44
+
45
+ // Everything succeeded.
46
+ if ( ! errors.length && successes.length ) {
47
+ return {
48
+ type: 'success',
49
+ message: __( 'Fonts were uninstalled successfully.' ),
50
+ };
51
+ }
52
+
53
+ // Some succeeded, some failed.
54
+ if ( errors.length && successes.length ) {
55
+ return {
56
+ type: 'warning',
57
+ message: __(
58
+ 'Some fonts were uninstalled successfully and some failed.'
59
+ ),
60
+ };
61
+ }
62
+ }
@@ -109,6 +109,10 @@ export async function loadFontFaceInBrowser( fontFace, source, addTo = 'all' ) {
109
109
  }
110
110
 
111
111
  export function getDisplaySrcFromFontFace( input, urlPrefix ) {
112
+ if ( ! input ) {
113
+ return;
114
+ }
115
+
112
116
  let src;
113
117
  if ( Array.isArray( input ) ) {
114
118
  src = input[ 0 ];
@@ -22,9 +22,10 @@ function ScreenTypography() {
22
22
  />
23
23
  <div className="edit-site-global-styles-screen-typography">
24
24
  <VStack spacing={ 6 }>
25
- { ! window.__experimentalDisableFontLibrary && (
26
- <FontFamilies />
27
- ) }
25
+ { FontFamilies &&
26
+ ! window.__experimentalDisableFontLibrary && (
27
+ <FontFamilies />
28
+ ) }
28
29
  <TypographyElements />
29
30
  </VStack>
30
31
  </div>
@@ -9,7 +9,7 @@ export default function Grid( { categoryId, items, ...props } ) {
9
9
  }
10
10
 
11
11
  return (
12
- <ul role="listbox" className="edit-site-patterns__grid" { ...props }>
12
+ <ul className="edit-site-patterns__grid" { ...props }>
13
13
  { items.map( ( item ) => (
14
14
  <GridItem
15
15
  key={ item.name }
@@ -35,7 +35,7 @@ const { useLocation, useHistory } = unlock( routerPrivateApis );
35
35
  const SYNC_FILTERS = {
36
36
  all: __( 'All' ),
37
37
  [ PATTERN_SYNC_TYPES.full ]: __( 'Synced' ),
38
- [ PATTERN_SYNC_TYPES.unsynced ]: __( 'Standard' ),
38
+ [ PATTERN_SYNC_TYPES.unsynced ]: __( 'Not synced' ),
39
39
  };
40
40
 
41
41
  const SYNC_DESCRIPTIONS = {
@@ -155,9 +155,13 @@ const selectPatterns = createSelector(
155
155
  ];
156
156
 
157
157
  if ( syncStatus ) {
158
- patterns = patterns.filter(
159
- ( pattern ) => pattern.syncStatus === syncStatus
160
- );
158
+ // User patterns can have their sync statuses checked directly
159
+ // Non-user patterns are all unsynced for the time being.
160
+ patterns = patterns.filter( ( pattern ) => {
161
+ return pattern.id
162
+ ? pattern.syncStatus === syncStatus
163
+ : syncStatus === PATTERN_SYNC_TYPES.unsynced;
164
+ } );
161
165
  }
162
166
 
163
167
  if ( categoryId ) {
@@ -9,6 +9,7 @@ import {
9
9
  import { __ } from '@wordpress/i18n';
10
10
  import { useEntityRecords } from '@wordpress/core-data';
11
11
  import { decodeEntities } from '@wordpress/html-entities';
12
+ import { privateApis as routerPrivateApis } from '@wordpress/router';
12
13
 
13
14
  /**
14
15
  * Internal dependencies
@@ -20,8 +21,15 @@ import AddedBy from '../list/added-by';
20
21
  import TemplateActions from '../template-actions';
21
22
  import AddNewTemplatePart from './add-new-template-part';
22
23
  import { TEMPLATE_PART_POST_TYPE } from '../../utils/constants';
24
+ import { unlock } from '../../lock-unlock';
25
+
26
+ const { useLocation } = unlock( routerPrivateApis );
23
27
 
24
28
  export default function PageTemplateParts() {
29
+ const {
30
+ params: { didAccessPatternsPage },
31
+ } = useLocation();
32
+
25
33
  const { records: templateParts } = useEntityRecords(
26
34
  'postType',
27
35
  TEMPLATE_PART_POST_TYPE,
@@ -40,8 +48,13 @@ export default function PageTemplateParts() {
40
48
  params={ {
41
49
  postId: templatePart.id,
42
50
  postType: templatePart.type,
51
+ didAccessPatternsPage: !! didAccessPatternsPage
52
+ ? 1
53
+ : undefined,
54
+ } }
55
+ state={ {
56
+ backPath: '/wp_template_part/all',
43
57
  } }
44
- state={ { backPath: '/wp_template_part/all' } }
45
58
  >
46
59
  { decodeEntities(
47
60
  templatePart.title?.rendered ||
@@ -37,7 +37,7 @@ export default function ResetDefaultTemplate( { onClick } ) {
37
37
  } );
38
38
  } }
39
39
  >
40
- { __( 'Reset' ) }
40
+ { __( 'Use default template' ) }
41
41
  </MenuItem>
42
42
  </MenuGroup>
43
43
  );
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { __, _x, sprintf } from '@wordpress/i18n';
5
5
  import { useEffect, useMemo, useState } from '@wordpress/element';
6
- import { FormTokenField, PanelRow } from '@wordpress/components';
6
+ import { FormTokenField, FlexBlock, PanelRow } from '@wordpress/components';
7
7
  import { useSelect, useDispatch } from '@wordpress/data';
8
8
  import { store as coreStore } from '@wordpress/core-data';
9
9
  import { useDebounce } from '@wordpress/compose';
@@ -257,21 +257,23 @@ export default function PatternCategories( { post } ) {
257
257
 
258
258
  return (
259
259
  <PanelRow initialOpen={ true } title={ __( 'Categories' ) }>
260
- <FormTokenField
261
- __next40pxDefaultSize
262
- value={ values }
263
- suggestions={ suggestions }
264
- onChange={ onChange }
265
- onInputChange={ debouncedSearch }
266
- maxSuggestions={ MAX_TERMS_SUGGESTIONS }
267
- label={ __( 'Pattern categories' ) }
268
- messages={ {
269
- added: termAddedLabel,
270
- removed: termRemovedLabel,
271
- remove: removeTermLabel,
272
- } }
273
- tokenizeOnBlur
274
- />
260
+ <FlexBlock>
261
+ <FormTokenField
262
+ __next40pxDefaultSize
263
+ value={ values }
264
+ suggestions={ suggestions }
265
+ onChange={ onChange }
266
+ onInputChange={ debouncedSearch }
267
+ maxSuggestions={ MAX_TERMS_SUGGESTIONS }
268
+ label={ __( 'Pattern categories' ) }
269
+ messages={ {
270
+ added: termAddedLabel,
271
+ removed: termRemovedLabel,
272
+ remove: removeTermLabel,
273
+ } }
274
+ tokenizeOnBlur
275
+ />
276
+ </FlexBlock>
275
277
  </PanelRow>
276
278
  );
277
279
  }
@@ -73,7 +73,7 @@ export default function TemplateAreas() {
73
73
 
74
74
  <ul className="edit-site-template-card__template-areas-list">
75
75
  { templateParts.map( ( { templatePart, block } ) => (
76
- <li key={ templatePart.slug }>
76
+ <li key={ block.clientId }>
77
77
  <TemplateAreaItem
78
78
  area={ templatePart.area }
79
79
  clientId={ block.clientId }
@@ -68,7 +68,6 @@
68
68
  .edit-site-sidebar-navigation-screen__title {
69
69
  flex-grow: 1;
70
70
  padding: $grid-unit-15 * 0.5 0 0 0;
71
- overflow: hidden;
72
71
  overflow-wrap: break-word;
73
72
  }
74
73
 
@@ -10,6 +10,8 @@ import { useViewportMatch } from '@wordpress/compose';
10
10
  import { getTemplatePartIcon } from '@wordpress/editor';
11
11
  import { __ } from '@wordpress/i18n';
12
12
  import { getQueryArgs } from '@wordpress/url';
13
+ import { store as coreStore } from '@wordpress/core-data';
14
+ import { useSelect } from '@wordpress/data';
13
15
  import { file } from '@wordpress/icons';
14
16
 
15
17
  /**
@@ -27,6 +29,7 @@ import {
27
29
  import { useLink } from '../routes/link';
28
30
  import usePatternCategories from './use-pattern-categories';
29
31
  import useTemplatePartAreas from './use-template-part-areas';
32
+ import { store as editSiteStore } from '../../store';
30
33
 
31
34
  function TemplatePartGroup( { areas, currentArea, currentType } ) {
32
35
  return (
@@ -93,8 +96,23 @@ export default function SidebarNavigationScreenPatterns() {
93
96
  const { templatePartAreas, hasTemplateParts, isLoading } =
94
97
  useTemplatePartAreas();
95
98
  const { patternCategories, hasPatterns } = usePatternCategories();
99
+ const isBlockBasedTheme = useSelect(
100
+ ( select ) => select( coreStore ).getCurrentTheme()?.is_block_theme,
101
+ []
102
+ );
103
+ const isTemplatePartsMode = useSelect( ( select ) => {
104
+ const settings = select( editSiteStore ).getSettings();
105
+ return !! settings.supportsTemplatePartsMode;
106
+ }, [] );
107
+
108
+ const templatePartsLink = useLink( {
109
+ path: '/wp_template_part/all',
110
+ // If a classic theme that supports template parts accessed
111
+ // the Patterns page directly, preserve that state in the URL.
112
+ didAccessPatternsPage:
113
+ ! isBlockBasedTheme && isTemplatePartsMode ? 1 : undefined,
114
+ } );
96
115
 
97
- const templatePartsLink = useLink( { path: '/wp_template_part/all' } );
98
116
  const footer = ! isMobileViewport ? (
99
117
  <ItemGroup>
100
118
  <SidebarNavigationItem
@@ -104,14 +122,17 @@ export default function SidebarNavigationScreenPatterns() {
104
122
  >
105
123
  { __( 'Manage all of my patterns' ) }
106
124
  </SidebarNavigationItem>
107
- <SidebarNavigationItem withChevron { ...templatePartsLink }>
108
- { __( 'Manage all template parts' ) }
109
- </SidebarNavigationItem>
125
+ { ( isBlockBasedTheme || isTemplatePartsMode ) && (
126
+ <SidebarNavigationItem withChevron { ...templatePartsLink }>
127
+ { __( 'Manage all template parts' ) }
128
+ </SidebarNavigationItem>
129
+ ) }
110
130
  </ItemGroup>
111
131
  ) : undefined;
112
132
 
113
133
  return (
114
134
  <SidebarNavigationScreen
135
+ isRoot={ ! isBlockBasedTheme }
115
136
  title={ __( 'Patterns' ) }
116
137
  description={ __(
117
138
  'Manage what patterns are available when editing the site.'
@@ -7,7 +7,6 @@ import { useSelect, useDispatch } from '@wordpress/data';
7
7
  import { store as coreStore } from '@wordpress/core-data';
8
8
  import {
9
9
  CheckboxControl,
10
- __experimentalUseNavigator as useNavigator,
11
10
  __experimentalInputControl as InputControl,
12
11
  __experimentalNumberControl as NumberControl,
13
12
  __experimentalTruncate as Truncate,
@@ -62,10 +61,6 @@ function TemplateAreaButton( { postId, icon, title } ) {
62
61
  }
63
62
 
64
63
  export default function HomeTemplateDetails() {
65
- const navigator = useNavigator();
66
- const {
67
- params: { postType, postId },
68
- } = navigator;
69
64
  const { editEntityRecord } = useDispatch( coreStore );
70
65
 
71
66
  const {
@@ -75,34 +70,30 @@ export default function HomeTemplateDetails() {
75
70
  postsPageTitle,
76
71
  postsPageId,
77
72
  currentTemplateParts,
78
- } = useSelect(
79
- ( select ) => {
80
- const { getEntityRecord } = select( coreStore );
81
- const siteSettings = getEntityRecord( 'root', 'site' );
82
- const { getSettings } = unlock( select( editSiteStore ) );
83
- const _currentTemplateParts =
84
- select( editSiteStore ).getCurrentTemplateTemplateParts();
85
- const siteEditorSettings = getSettings();
86
- const _postsPageRecord = siteSettings?.page_for_posts
87
- ? select( coreStore ).getEntityRecord(
88
- 'postType',
89
- 'page',
90
- siteSettings?.page_for_posts
91
- )
92
- : EMPTY_OBJECT;
73
+ } = useSelect( ( select ) => {
74
+ const { getEntityRecord } = select( coreStore );
75
+ const { getSettings, getCurrentTemplateTemplateParts } = unlock(
76
+ select( editSiteStore )
77
+ );
78
+ const siteSettings = getEntityRecord( 'root', 'site' );
79
+ const _postsPageRecord = siteSettings?.page_for_posts
80
+ ? getEntityRecord(
81
+ 'postType',
82
+ 'page',
83
+ siteSettings?.page_for_posts
84
+ )
85
+ : EMPTY_OBJECT;
93
86
 
94
- return {
95
- allowCommentsOnNewPosts:
96
- siteSettings?.default_comment_status === 'open',
97
- postsPageTitle: _postsPageRecord?.title?.rendered,
98
- postsPageId: _postsPageRecord?.id,
99
- postsPerPage: siteSettings?.posts_per_page,
100
- templatePartAreas: siteEditorSettings?.defaultTemplatePartAreas,
101
- currentTemplateParts: _currentTemplateParts,
102
- };
103
- },
104
- [ postType, postId ]
105
- );
87
+ return {
88
+ allowCommentsOnNewPosts:
89
+ siteSettings?.default_comment_status === 'open',
90
+ postsPageTitle: _postsPageRecord?.title?.rendered,
91
+ postsPageId: _postsPageRecord?.id,
92
+ postsPerPage: siteSettings?.posts_per_page,
93
+ templatePartAreas: getSettings()?.defaultTemplatePartAreas,
94
+ currentTemplateParts: getCurrentTemplateTemplateParts(),
95
+ };
96
+ }, [] );
106
97
 
107
98
  const [ commentsOnNewPostsValue, setCommentsOnNewPostsValue ] =
108
99
  useState( '' );
@@ -126,11 +117,12 @@ export default function HomeTemplateDetails() {
126
117
  */
127
118
  const templateAreas = useMemo( () => {
128
119
  return currentTemplateParts.length && templatePartAreas
129
- ? currentTemplateParts.map( ( { templatePart } ) => ( {
120
+ ? currentTemplateParts.map( ( { templatePart, block } ) => ( {
130
121
  ...templatePartAreas?.find(
131
122
  ( { area } ) => area === templatePart?.area
132
123
  ),
133
124
  ...templatePart,
125
+ clientId: block.clientId,
134
126
  } ) )
135
127
  : [];
136
128
  }, [ currentTemplateParts, templatePartAreas ] );
@@ -214,9 +206,9 @@ export default function HomeTemplateDetails() {
214
206
  >
215
207
  <ItemGroup>
216
208
  { templateAreas.map(
217
- ( { label, icon, theme, slug, title } ) => (
209
+ ( { clientId, label, icon, theme, slug, title } ) => (
218
210
  <SidebarNavigationScreenDetailsPanelRow
219
- key={ slug }
211
+ key={ clientId }
220
212
  >
221
213
  <TemplateAreaButton
222
214
  postId={ `${ theme }//${ slug }` }
@@ -4,6 +4,7 @@
4
4
  import { __ } from '@wordpress/i18n';
5
5
  import { useSelect } from '@wordpress/data';
6
6
  import { __experimentalUseNavigator as useNavigator } from '@wordpress/components';
7
+ import { privateApis as routerPrivateApis } from '@wordpress/router';
7
8
 
8
9
  /**
9
10
  * Internal dependencies
@@ -14,6 +15,7 @@ import {
14
15
  TEMPLATE_POST_TYPE,
15
16
  TEMPLATE_PART_POST_TYPE,
16
17
  } from '../../utils/constants';
18
+ import { unlock } from '../../lock-unlock';
17
19
 
18
20
  const config = {
19
21
  [ TEMPLATE_POST_TYPE ]: {
@@ -31,20 +33,26 @@ const config = {
31
33
  },
32
34
  };
33
35
 
36
+ const { useLocation } = unlock( routerPrivateApis );
37
+
34
38
  export default function SidebarNavigationScreenTemplatesBrowse() {
35
39
  const {
36
40
  params: { postType },
37
41
  } = useNavigator();
42
+ const {
43
+ params: { didAccessPatternsPage },
44
+ } = useLocation();
38
45
 
39
46
  const isTemplatePartsMode = useSelect( ( select ) => {
40
- const settings = select( editSiteStore ).getSettings();
41
-
42
- return !! settings.supportsTemplatePartsMode;
47
+ return !! select( editSiteStore ).getSettings()
48
+ .supportsTemplatePartsMode;
43
49
  }, [] );
44
50
 
45
51
  return (
46
52
  <SidebarNavigationScreen
47
- isRoot={ isTemplatePartsMode }
53
+ // If a classic theme that supports template parts has never
54
+ // accessed the Patterns page, return to the dashboard.
55
+ isRoot={ isTemplatePartsMode && ! didAccessPatternsPage }
48
56
  title={ config[ postType ].title }
49
57
  description={ config[ postType ].description }
50
58
  backPath={ config[ postType ].backPath }