@wordpress/edit-site 5.12.7 → 5.12.9

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 (166) hide show
  1. package/build/components/block-editor/editor-canvas.js +1 -1
  2. package/build/components/block-editor/editor-canvas.js.map +1 -1
  3. package/build/components/block-editor/index.js +0 -4
  4. package/build/components/block-editor/index.js.map +1 -1
  5. package/build/components/block-editor/use-site-editor-settings.js +12 -6
  6. package/build/components/block-editor/use-site-editor-settings.js.map +1 -1
  7. package/build/components/create-pattern-modal/index.js +7 -3
  8. package/build/components/create-pattern-modal/index.js.map +1 -1
  9. package/build/components/page-patterns/duplicate-menu-item.js +163 -0
  10. package/build/components/page-patterns/duplicate-menu-item.js.map +1 -0
  11. package/build/components/page-patterns/grid-item.js +83 -59
  12. package/build/components/page-patterns/grid-item.js.map +1 -1
  13. package/build/components/page-patterns/grid.js +81 -13
  14. package/build/components/page-patterns/grid.js.map +1 -1
  15. package/build/components/page-patterns/header.js +69 -0
  16. package/build/components/page-patterns/header.js.map +1 -0
  17. package/build/components/page-patterns/index.js +3 -1
  18. package/build/components/page-patterns/index.js.map +1 -1
  19. package/build/components/page-patterns/patterns-list.js +66 -27
  20. package/build/components/page-patterns/patterns-list.js.map +1 -1
  21. package/build/components/page-patterns/rename-menu-item.js +109 -0
  22. package/build/components/page-patterns/rename-menu-item.js.map +1 -0
  23. package/build/components/page-patterns/use-patterns.js +99 -118
  24. package/build/components/page-patterns/use-patterns.js.map +1 -1
  25. package/build/components/page-template-parts/add-new-template-part.js +74 -0
  26. package/build/components/page-template-parts/add-new-template-part.js.map +1 -0
  27. package/build/components/page-template-parts/index.js +2 -23
  28. package/build/components/page-template-parts/index.js.map +1 -1
  29. package/build/components/resizable-frame/index.js +75 -32
  30. package/build/components/resizable-frame/index.js.map +1 -1
  31. package/build/components/sidebar-navigation-screen/index.js +14 -8
  32. package/build/components/sidebar-navigation-screen/index.js.map +1 -1
  33. package/build/components/sidebar-navigation-screen-main/template-part-hint.js +1 -1
  34. package/build/components/sidebar-navigation-screen-main/template-part-hint.js.map +1 -1
  35. package/build/components/sidebar-navigation-screen-navigation-menu/more-menu.js +1 -0
  36. package/build/components/sidebar-navigation-screen-navigation-menu/more-menu.js.map +1 -1
  37. package/build/components/sidebar-navigation-screen-navigation-menu/single-navigation-menu.js +3 -3
  38. package/build/components/sidebar-navigation-screen-navigation-menu/single-navigation-menu.js.map +1 -1
  39. package/build/components/sidebar-navigation-screen-page/status-label.js +1 -34
  40. package/build/components/sidebar-navigation-screen-page/status-label.js.map +1 -1
  41. package/build/components/sidebar-navigation-screen-pages/index.js +33 -25
  42. package/build/components/sidebar-navigation-screen-pages/index.js.map +1 -1
  43. package/build/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js +3 -2
  44. package/build/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js.map +1 -1
  45. package/build/components/sidebar-navigation-screen-pattern/template-part-navigation-menus.js +3 -2
  46. package/build/components/sidebar-navigation-screen-pattern/template-part-navigation-menus.js.map +1 -1
  47. package/build/components/sidebar-navigation-screen-patterns/index.js +5 -6
  48. package/build/components/sidebar-navigation-screen-patterns/index.js.map +1 -1
  49. package/build/components/sidebar-navigation-screen-patterns/use-my-patterns.js +9 -5
  50. package/build/components/sidebar-navigation-screen-patterns/use-my-patterns.js.map +1 -1
  51. package/build/components/site-hub/index.js +4 -2
  52. package/build/components/site-hub/index.js.map +1 -1
  53. package/build/components/sync-state-with-url/use-sync-path-with-url.js +15 -12
  54. package/build/components/sync-state-with-url/use-sync-path-with-url.js.map +1 -1
  55. package/build/components/template-actions/index.js +3 -1
  56. package/build/components/template-actions/index.js.map +1 -1
  57. package/build/components/template-actions/rename-menu-item.js +9 -6
  58. package/build/components/template-actions/rename-menu-item.js.map +1 -1
  59. package/build/hooks/push-changes-to-global-styles/index.js +3 -1
  60. package/build/hooks/push-changes-to-global-styles/index.js.map +1 -1
  61. package/build/utils/use-activate-theme.js +1 -1
  62. package/build/utils/use-activate-theme.js.map +1 -1
  63. package/build-module/components/block-editor/editor-canvas.js +1 -1
  64. package/build-module/components/block-editor/editor-canvas.js.map +1 -1
  65. package/build-module/components/block-editor/index.js +0 -4
  66. package/build-module/components/block-editor/index.js.map +1 -1
  67. package/build-module/components/block-editor/use-site-editor-settings.js +13 -7
  68. package/build-module/components/block-editor/use-site-editor-settings.js.map +1 -1
  69. package/build-module/components/create-pattern-modal/index.js +6 -3
  70. package/build-module/components/create-pattern-modal/index.js.map +1 -1
  71. package/build-module/components/page-patterns/duplicate-menu-item.js +147 -0
  72. package/build-module/components/page-patterns/duplicate-menu-item.js.map +1 -0
  73. package/build-module/components/page-patterns/grid-item.js +84 -65
  74. package/build-module/components/page-patterns/grid-item.js.map +1 -1
  75. package/build-module/components/page-patterns/grid.js +82 -15
  76. package/build-module/components/page-patterns/grid.js.map +1 -1
  77. package/build-module/components/page-patterns/header.js +54 -0
  78. package/build-module/components/page-patterns/header.js.map +1 -0
  79. package/build-module/components/page-patterns/index.js +3 -1
  80. package/build-module/components/page-patterns/index.js.map +1 -1
  81. package/build-module/components/page-patterns/patterns-list.js +68 -30
  82. package/build-module/components/page-patterns/patterns-list.js.map +1 -1
  83. package/build-module/components/page-patterns/rename-menu-item.js +97 -0
  84. package/build-module/components/page-patterns/rename-menu-item.js.map +1 -0
  85. package/build-module/components/page-patterns/use-patterns.js +100 -119
  86. package/build-module/components/page-patterns/use-patterns.js.map +1 -1
  87. package/build-module/components/page-template-parts/add-new-template-part.js +58 -0
  88. package/build-module/components/page-template-parts/add-new-template-part.js.map +1 -0
  89. package/build-module/components/page-template-parts/index.js +3 -22
  90. package/build-module/components/page-template-parts/index.js.map +1 -1
  91. package/build-module/components/resizable-frame/index.js +76 -35
  92. package/build-module/components/resizable-frame/index.js.map +1 -1
  93. package/build-module/components/sidebar-navigation-screen/index.js +15 -9
  94. package/build-module/components/sidebar-navigation-screen/index.js.map +1 -1
  95. package/build-module/components/sidebar-navigation-screen-main/template-part-hint.js +1 -1
  96. package/build-module/components/sidebar-navigation-screen-main/template-part-hint.js.map +1 -1
  97. package/build-module/components/sidebar-navigation-screen-navigation-menu/more-menu.js +1 -0
  98. package/build-module/components/sidebar-navigation-screen-navigation-menu/more-menu.js.map +1 -1
  99. package/build-module/components/sidebar-navigation-screen-navigation-menu/single-navigation-menu.js +3 -3
  100. package/build-module/components/sidebar-navigation-screen-navigation-menu/single-navigation-menu.js.map +1 -1
  101. package/build-module/components/sidebar-navigation-screen-page/status-label.js +1 -32
  102. package/build-module/components/sidebar-navigation-screen-page/status-label.js.map +1 -1
  103. package/build-module/components/sidebar-navigation-screen-pages/index.js +33 -25
  104. package/build-module/components/sidebar-navigation-screen-pages/index.js.map +1 -1
  105. package/build-module/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js +3 -2
  106. package/build-module/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js.map +1 -1
  107. package/build-module/components/sidebar-navigation-screen-pattern/template-part-navigation-menus.js +3 -2
  108. package/build-module/components/sidebar-navigation-screen-pattern/template-part-navigation-menus.js.map +1 -1
  109. package/build-module/components/sidebar-navigation-screen-patterns/index.js +5 -6
  110. package/build-module/components/sidebar-navigation-screen-patterns/index.js.map +1 -1
  111. package/build-module/components/sidebar-navigation-screen-patterns/use-my-patterns.js +9 -5
  112. package/build-module/components/sidebar-navigation-screen-patterns/use-my-patterns.js.map +1 -1
  113. package/build-module/components/site-hub/index.js +4 -2
  114. package/build-module/components/site-hub/index.js.map +1 -1
  115. package/build-module/components/sync-state-with-url/use-sync-path-with-url.js +16 -12
  116. package/build-module/components/sync-state-with-url/use-sync-path-with-url.js.map +1 -1
  117. package/build-module/components/template-actions/index.js +2 -1
  118. package/build-module/components/template-actions/index.js.map +1 -1
  119. package/build-module/components/template-actions/rename-menu-item.js +8 -6
  120. package/build-module/components/template-actions/rename-menu-item.js.map +1 -1
  121. package/build-module/hooks/push-changes-to-global-styles/index.js +4 -2
  122. package/build-module/hooks/push-changes-to-global-styles/index.js.map +1 -1
  123. package/build-module/utils/use-activate-theme.js +1 -1
  124. package/build-module/utils/use-activate-theme.js.map +1 -1
  125. package/build-style/style-rtl.css +150 -54
  126. package/build-style/style.css +150 -54
  127. package/package.json +14 -14
  128. package/src/components/block-editor/editor-canvas.js +1 -1
  129. package/src/components/block-editor/index.js +0 -4
  130. package/src/components/block-editor/use-site-editor-settings.js +16 -11
  131. package/src/components/create-pattern-modal/index.js +5 -2
  132. package/src/components/header-edit-mode/document-actions/style.scss +4 -0
  133. package/src/components/layout/style.scss +1 -0
  134. package/src/components/page-patterns/duplicate-menu-item.js +196 -0
  135. package/src/components/page-patterns/grid-item.js +187 -137
  136. package/src/components/page-patterns/grid.js +118 -20
  137. package/src/components/page-patterns/header.js +69 -0
  138. package/src/components/page-patterns/index.js +6 -1
  139. package/src/components/page-patterns/patterns-list.js +87 -46
  140. package/src/components/page-patterns/rename-menu-item.js +115 -0
  141. package/src/components/page-patterns/style.scss +106 -26
  142. package/src/components/page-patterns/use-patterns.js +96 -167
  143. package/src/components/page-template-parts/add-new-template-part.js +57 -0
  144. package/src/components/page-template-parts/index.js +3 -22
  145. package/src/components/resizable-frame/index.js +100 -31
  146. package/src/components/resizable-frame/style.scss +26 -9
  147. package/src/components/sidebar-navigation-item/style.scss +10 -1
  148. package/src/components/sidebar-navigation-screen/index.js +14 -7
  149. package/src/components/sidebar-navigation-screen-main/template-part-hint.js +1 -3
  150. package/src/components/sidebar-navigation-screen-navigation-menu/more-menu.js +1 -0
  151. package/src/components/sidebar-navigation-screen-navigation-menu/single-navigation-menu.js +1 -1
  152. package/src/components/sidebar-navigation-screen-page/status-label.js +1 -35
  153. package/src/components/sidebar-navigation-screen-pages/index.js +39 -29
  154. package/src/components/sidebar-navigation-screen-pattern/template-part-navigation-menu.js +2 -1
  155. package/src/components/sidebar-navigation-screen-pattern/template-part-navigation-menus.js +2 -1
  156. package/src/components/sidebar-navigation-screen-patterns/index.js +20 -24
  157. package/src/components/sidebar-navigation-screen-patterns/style.scss +0 -3
  158. package/src/components/sidebar-navigation-screen-patterns/use-my-patterns.js +7 -6
  159. package/src/components/site-hub/index.js +6 -2
  160. package/src/components/site-hub/style.scss +5 -0
  161. package/src/components/sync-state-with-url/use-sync-path-with-url.js +73 -66
  162. package/src/components/template-actions/index.js +2 -1
  163. package/src/components/template-actions/rename-menu-item.js +8 -6
  164. package/src/hooks/push-changes-to-global-styles/index.js +8 -1
  165. package/src/style.scss +10 -12
  166. package/src/utils/use-activate-theme.js +1 -1
@@ -1,6 +1,15 @@
1
1
  .edit-site-patterns {
2
- background: rgba(0, 0, 0, 0.05);
2
+ border: 1px solid $gray-800;
3
+ background: none;
3
4
  margin: $header-height 0 0;
5
+ border-radius: 0;
6
+ .components-base-control {
7
+ width: 100%;
8
+ @include break-medium {
9
+ width: auto;
10
+ }
11
+ }
12
+
4
13
  .components-text {
5
14
  color: $gray-600;
6
15
  }
@@ -12,33 +21,99 @@
12
21
  @include break-medium {
13
22
  margin: 0;
14
23
  }
24
+
25
+ .edit-site-patterns__search-block {
26
+ min-width: fit-content;
27
+ flex-grow: 1;
28
+ }
29
+
30
+ // The increased specificity here is to overcome component styles
31
+ // without relying on internal component class names.
32
+ .edit-site-patterns__search {
33
+ input[type="search"] {
34
+ height: $button-size-next-default-40px;
35
+ background: $gray-800;
36
+ color: $gray-200;
37
+
38
+ &:focus {
39
+ background: $gray-800;
40
+ }
41
+ }
42
+
43
+ svg {
44
+ fill: $gray-600;
45
+ }
46
+ }
47
+
48
+ .edit-site-patterns__sync-status-filter {
49
+ background: $gray-800;
50
+ border: none;
51
+ height: $button-size-next-default-40px;
52
+ min-width: max-content;
53
+ width: 100%;
54
+ max-width: 100%;
55
+
56
+ @include break-medium {
57
+ width: 300px;
58
+ }
59
+ }
60
+ .edit-site-patterns__sync-status-filter-option:active {
61
+ background: $gray-700;
62
+ color: $gray-100;
63
+ }
64
+
65
+ .edit-site-patterns__grid-pagination {
66
+ width: fit-content;
67
+ .components-button.is-tertiary {
68
+ width: $button-size-compact;
69
+ height: $button-size-compact;
70
+ color: $gray-100;
71
+ background-color: $gray-800;
72
+ &:disabled {
73
+ color: $gray-600;
74
+ background: none;
75
+ }
76
+ &:hover:not(:disabled) {
77
+ background-color: $gray-700;
78
+ }
79
+ }
80
+ }
15
81
  }
16
82
 
17
- .edit-site-patterns__grid {
18
- column-gap: $grid-unit-30;
19
- @include break-large() {
20
- column-count: 2;
83
+ .edit-site-patterns__section-header {
84
+ .screen-reader-shortcut:focus {
85
+ top: 0;
21
86
  }
87
+ }
22
88
 
89
+ .edit-site-patterns__grid {
90
+ display: grid;
91
+ grid-template-columns: 1fr;
92
+ gap: $grid-unit-40;
23
93
  // Small top padding required to avoid cutting off the visible outline
24
94
  // when hovering items.
25
95
  padding-top: $border-width-focus-fallback;
96
+ margin-top: 0;
26
97
  margin-bottom: $grid-unit-40;
27
-
98
+ @include break-large {
99
+ grid-template-columns: 1fr 1fr;
100
+ }
28
101
  .edit-site-patterns__pattern {
29
102
  break-inside: avoid-column;
30
103
  display: flex;
31
104
  flex-direction: column;
32
- margin-bottom: $grid-unit-60;
33
-
34
105
  .edit-site-patterns__preview {
35
- border-radius: $radius-block-ui;
106
+ box-shadow: none;
107
+ border: none;
108
+ padding: 0;
109
+ background-color: unset;
110
+ box-sizing: border-box;
111
+ border-radius: 4px;
36
112
  cursor: pointer;
37
113
  overflow: hidden;
38
114
 
39
115
  &:focus {
40
- box-shadow: inset 0 0 0 2px $white, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
41
-
116
+ box-shadow: inset 0 0 0 0 $white, 0 0 0 2px var(--wp-admin-theme-color);
42
117
  // Windows High Contrast mode will show this outline, but not the box-shadow.
43
118
  outline: 2px solid transparent;
44
119
  }
@@ -46,6 +121,10 @@
46
121
  &.is-inactive {
47
122
  cursor: default;
48
123
  }
124
+ &.is-inactive:focus {
125
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) $gray-800;
126
+ opacity: 0.8;
127
+ }
49
128
  }
50
129
 
51
130
  .edit-site-patterns__footer,
@@ -68,31 +147,28 @@
68
147
  }
69
148
 
70
149
  .edit-site-patterns__preview {
71
- flex: 1;
150
+ flex: 0 1 auto;
72
151
  margin-bottom: $grid-unit-20;
73
152
  }
74
153
  }
75
154
 
76
- // The increased specificity here is to overcome component styles
77
- // without relying on internal component class names.
78
- .edit-site-patterns__search {
79
- &#{&} input[type="search"] {
80
- background: $gray-800;
155
+ .edit-site-patterns__load-more {
156
+ align-self: center;
157
+ }
158
+
159
+ .edit-site-patterns__pattern-title {
160
+ color: $gray-200;
161
+
162
+ .is-link {
163
+ text-decoration: none;
81
164
  color: $gray-200;
82
165
 
166
+ &:hover,
83
167
  &:focus {
84
- background: $gray-800;
168
+ color: $white;
85
169
  }
86
170
  }
87
171
 
88
- svg {
89
- fill: $gray-600;
90
- }
91
- }
92
-
93
- .edit-site-patterns__pattern-title {
94
- color: $gray-600;
95
-
96
172
  .edit-site-patterns__pattern-icon {
97
173
  border-radius: $grid-unit-05;
98
174
  background: var(--wp-block-synced-color);
@@ -101,6 +177,10 @@
101
177
 
102
178
  .edit-site-patterns__pattern-lock-icon {
103
179
  display: inline-flex;
180
+
181
+ svg {
182
+ fill: currentcolor;
183
+ }
104
184
  }
105
185
  }
106
186
 
@@ -4,7 +4,7 @@
4
4
  import { parse } from '@wordpress/blocks';
5
5
  import { useSelect } from '@wordpress/data';
6
6
  import { store as coreStore } from '@wordpress/core-data';
7
- import { useMemo } from '@wordpress/element';
7
+ import { decodeEntities } from '@wordpress/html-entities';
8
8
 
9
9
  /**
10
10
  * Internal dependencies
@@ -15,7 +15,6 @@ import {
15
15
  SYNC_TYPES,
16
16
  TEMPLATE_PARTS,
17
17
  USER_PATTERNS,
18
- USER_PATTERN_CATEGORY,
19
18
  filterOutDuplicatesByName,
20
19
  } from './utils';
21
20
  import { unlock } from '../../lock-unlock';
@@ -31,9 +30,11 @@ const templatePartToPattern = ( templatePart ) => ( {
31
30
  blocks: parse( templatePart.content.raw ),
32
31
  categories: [ templatePart.area ],
33
32
  description: templatePart.description || '',
33
+ isCustom: templatePart.source === 'custom',
34
34
  keywords: templatePart.keywords || [],
35
+ id: createTemplatePartId( templatePart.theme, templatePart.slug ),
35
36
  name: createTemplatePartId( templatePart.theme, templatePart.slug ),
36
- title: templatePart.title.rendered,
37
+ title: decodeEntities( templatePart.title.rendered ),
37
38
  type: templatePart.type,
38
39
  templatePart,
39
40
  } );
@@ -41,106 +42,64 @@ const templatePartToPattern = ( templatePart ) => ( {
41
42
  const templatePartHasCategory = ( item, category ) =>
42
43
  item.templatePart.area === category;
43
44
 
44
- const useTemplatePartsAsPatterns = (
45
- categoryId,
46
- postType = TEMPLATE_PARTS,
47
- filterValue = ''
45
+ const selectTemplatePartsAsPatterns = (
46
+ select,
47
+ { categoryId, search = '' } = {}
48
48
  ) => {
49
- const { templateParts, isResolving } = useSelect(
50
- ( select ) => {
51
- if ( postType !== TEMPLATE_PARTS ) {
52
- return {
53
- templateParts: EMPTY_PATTERN_LIST,
54
- isResolving: false,
55
- };
56
- }
57
-
58
- const { getEntityRecords, isResolving: _isResolving } =
59
- select( coreStore );
60
- const query = { per_page: -1 };
61
- const rawTemplateParts = getEntityRecords(
62
- 'postType',
63
- postType,
64
- query
65
- );
66
- const partsAsPatterns = rawTemplateParts?.map( ( templatePart ) =>
67
- templatePartToPattern( templatePart )
68
- );
69
-
70
- return {
71
- templateParts: partsAsPatterns,
72
- isResolving: _isResolving( 'getEntityRecords', [
73
- 'postType',
74
- 'wp_template_part',
75
- query,
76
- ] ),
77
- };
78
- },
79
- [ postType ]
49
+ const { getEntityRecords, getIsResolving } = select( coreStore );
50
+ const query = { per_page: -1 };
51
+ const rawTemplateParts =
52
+ getEntityRecords( 'postType', TEMPLATE_PARTS, query ) ??
53
+ EMPTY_PATTERN_LIST;
54
+ const templateParts = rawTemplateParts.map( ( templatePart ) =>
55
+ templatePartToPattern( templatePart )
80
56
  );
81
57
 
82
- const filteredTemplateParts = useMemo( () => {
83
- if ( ! templateParts ) {
84
- return EMPTY_PATTERN_LIST;
85
- }
58
+ const isResolving = getIsResolving( 'getEntityRecords', [
59
+ 'postType',
60
+ 'wp_template_part',
61
+ query,
62
+ ] );
86
63
 
87
- return searchItems( templateParts, filterValue, {
88
- categoryId,
89
- hasCategory: templatePartHasCategory,
90
- } );
91
- }, [ templateParts, filterValue, categoryId ] );
64
+ const patterns = searchItems( templateParts, search, {
65
+ categoryId,
66
+ hasCategory: templatePartHasCategory,
67
+ } );
92
68
 
93
- return { templateParts: filteredTemplateParts, isResolving };
69
+ return { patterns, isResolving };
94
70
  };
95
71
 
96
- const useThemePatterns = (
97
- categoryId,
98
- postType = PATTERNS,
99
- filterValue = ''
100
- ) => {
101
- const blockPatterns = useSelect( ( select ) => {
102
- const { getSettings } = unlock( select( editSiteStore ) );
103
- const settings = getSettings();
104
- return (
105
- settings.__experimentalAdditionalBlockPatterns ??
106
- settings.__experimentalBlockPatterns
107
- );
72
+ const selectThemePatterns = ( select, { categoryId, search = '' } = {} ) => {
73
+ const { getSettings } = unlock( select( editSiteStore ) );
74
+ const settings = getSettings();
75
+ const blockPatterns =
76
+ settings.__experimentalAdditionalBlockPatterns ??
77
+ settings.__experimentalBlockPatterns;
78
+
79
+ const restBlockPatterns = select( coreStore ).getBlockPatterns();
80
+
81
+ let patterns = [
82
+ ...( blockPatterns || [] ),
83
+ ...( restBlockPatterns || [] ),
84
+ ]
85
+ .filter(
86
+ ( pattern ) => ! CORE_PATTERN_SOURCES.includes( pattern.source )
87
+ )
88
+ .filter( filterOutDuplicatesByName )
89
+ .map( ( pattern ) => ( {
90
+ ...pattern,
91
+ keywords: pattern.keywords || [],
92
+ type: 'pattern',
93
+ blocks: parse( pattern.content ),
94
+ } ) );
95
+
96
+ patterns = searchItems( patterns, search, {
97
+ categoryId,
98
+ hasCategory: ( item, currentCategory ) =>
99
+ item.categories?.includes( currentCategory ),
108
100
  } );
109
101
 
110
- const restBlockPatterns = useSelect( ( select ) =>
111
- select( coreStore ).getBlockPatterns()
112
- );
113
-
114
- const patterns = useMemo(
115
- () =>
116
- [ ...( blockPatterns || [] ), ...( restBlockPatterns || [] ) ]
117
- .filter(
118
- ( pattern ) =>
119
- ! CORE_PATTERN_SOURCES.includes( pattern.source )
120
- )
121
- .filter( filterOutDuplicatesByName )
122
- .map( ( pattern ) => ( {
123
- ...pattern,
124
- keywords: pattern.keywords || [],
125
- type: 'pattern',
126
- blocks: parse( pattern.content ),
127
- } ) ),
128
- [ blockPatterns, restBlockPatterns ]
129
- );
130
-
131
- const filteredPatterns = useMemo( () => {
132
- if ( postType !== PATTERNS ) {
133
- return EMPTY_PATTERN_LIST;
134
- }
135
-
136
- return searchItems( patterns, filterValue, {
137
- categoryId,
138
- hasCategory: ( item, currentCategory ) =>
139
- item.categories?.includes( currentCategory ),
140
- } );
141
- }, [ patterns, filterValue, categoryId, postType ] );
142
-
143
- return filteredPatterns;
102
+ return { patterns, isResolving: false };
144
103
  };
145
104
 
146
105
  const reusableBlockToPattern = ( reusableBlock ) => ( {
@@ -154,88 +113,58 @@ const reusableBlockToPattern = ( reusableBlock ) => ( {
154
113
  reusableBlock,
155
114
  } );
156
115
 
157
- const useUserPatterns = (
158
- categoryId,
159
- categoryType = PATTERNS,
160
- filterValue = ''
161
- ) => {
162
- const postType = categoryType === PATTERNS ? USER_PATTERNS : categoryType;
163
- const unfilteredPatterns = useSelect(
164
- ( select ) => {
165
- if (
166
- postType !== USER_PATTERNS ||
167
- categoryId !== USER_PATTERN_CATEGORY
168
- ) {
169
- return EMPTY_PATTERN_LIST;
170
- }
116
+ const selectUserPatterns = ( select, { search = '', syncStatus } = {} ) => {
117
+ const { getEntityRecords, getIsResolving } = select( coreStore );
171
118
 
172
- const { getEntityRecords } = select( coreStore );
173
- const records = getEntityRecords( 'postType', postType, {
174
- per_page: -1,
175
- } );
119
+ const query = { per_page: -1 };
120
+ const records = getEntityRecords( 'postType', USER_PATTERNS, query );
176
121
 
177
- if ( ! records ) {
178
- return EMPTY_PATTERN_LIST;
179
- }
122
+ let patterns = records
123
+ ? records.map( ( record ) => reusableBlockToPattern( record ) )
124
+ : EMPTY_PATTERN_LIST;
125
+ const isResolving = getIsResolving( 'getEntityRecords', [
126
+ 'postType',
127
+ USER_PATTERNS,
128
+ query,
129
+ ] );
180
130
 
181
- return records.map( ( record ) =>
182
- reusableBlockToPattern( record )
183
- );
184
- },
185
- [ postType, categoryId ]
186
- );
131
+ if ( syncStatus ) {
132
+ patterns = patterns.filter(
133
+ ( pattern ) => pattern.syncStatus === syncStatus
134
+ );
135
+ }
187
136
 
188
- const filteredPatterns = useMemo( () => {
189
- if ( ! unfilteredPatterns.length ) {
190
- return EMPTY_PATTERN_LIST;
191
- }
192
-
193
- return searchItems( unfilteredPatterns, filterValue, {
194
- // We exit user pattern retrieval early if we aren't in the
195
- // catch-all category for user created patterns, so it has
196
- // to be in the category.
197
- hasCategory: () => true,
198
- } );
199
- }, [ unfilteredPatterns, filterValue ] );
200
-
201
- const patterns = { syncedPatterns: [], unsyncedPatterns: [] };
202
-
203
- filteredPatterns.forEach( ( pattern ) => {
204
- if ( pattern.syncStatus === SYNC_TYPES.full ) {
205
- patterns.syncedPatterns.push( pattern );
206
- } else {
207
- patterns.unsyncedPatterns.push( pattern );
208
- }
137
+ patterns = searchItems( patterns, search, {
138
+ // We exit user pattern retrieval early if we aren't in the
139
+ // catch-all category for user created patterns, so it has
140
+ // to be in the category.
141
+ hasCategory: () => true,
209
142
  } );
210
143
 
211
- return patterns;
144
+ return { patterns, isResolving };
212
145
  };
213
146
 
214
- export const usePatterns = ( categoryType, categoryId, filterValue ) => {
215
- const blockPatterns = useThemePatterns(
216
- categoryId,
217
- categoryType,
218
- filterValue
219
- );
220
-
221
- const { syncedPatterns = [], unsyncedPatterns = [] } = useUserPatterns(
222
- categoryId,
223
- categoryType,
224
- filterValue
225
- );
226
-
227
- const { templateParts, isResolving } = useTemplatePartsAsPatterns(
228
- categoryId,
229
- categoryType,
230
- filterValue
147
+ export const usePatterns = (
148
+ categoryType,
149
+ categoryId,
150
+ { search = '', syncStatus }
151
+ ) => {
152
+ return useSelect(
153
+ ( select ) => {
154
+ if ( categoryType === TEMPLATE_PARTS ) {
155
+ return selectTemplatePartsAsPatterns( select, {
156
+ categoryId,
157
+ search,
158
+ } );
159
+ } else if ( categoryType === PATTERNS ) {
160
+ return selectThemePatterns( select, { categoryId, search } );
161
+ } else if ( categoryType === USER_PATTERNS ) {
162
+ return selectUserPatterns( select, { search, syncStatus } );
163
+ }
164
+ return { patterns: EMPTY_PATTERN_LIST, isResolving: false };
165
+ },
166
+ [ categoryId, categoryType, search, syncStatus ]
231
167
  );
232
-
233
- const patterns = {
234
- syncedPatterns: [ ...templateParts, ...syncedPatterns ],
235
- unsyncedPatterns: [ ...blockPatterns, ...unsyncedPatterns ],
236
- };
237
-
238
- return [ patterns, isResolving ];
239
168
  };
240
169
 
241
170
  export default usePatterns;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { privateApis as routerPrivateApis } from '@wordpress/router';
5
+ import { useSelect } from '@wordpress/data';
6
+ import { store as coreStore } from '@wordpress/core-data';
7
+ import { useState } from '@wordpress/element';
8
+ import { Button } from '@wordpress/components';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import { unlock } from '../../lock-unlock';
14
+ import { store as editSiteStore } from '../../store';
15
+ import CreateTemplatePartModal from '../create-template-part-modal';
16
+
17
+ const { useHistory } = unlock( routerPrivateApis );
18
+
19
+ export default function AddNewTemplatePart() {
20
+ const { canCreate, postType } = useSelect( ( select ) => {
21
+ const { supportsTemplatePartsMode } =
22
+ select( editSiteStore ).getSettings();
23
+ return {
24
+ canCreate: ! supportsTemplatePartsMode,
25
+ postType: select( coreStore ).getPostType( 'wp_template_part' ),
26
+ };
27
+ }, [] );
28
+ const [ isModalOpen, setIsModalOpen ] = useState( false );
29
+ const history = useHistory();
30
+
31
+ if ( ! canCreate || ! postType ) {
32
+ return null;
33
+ }
34
+
35
+ return (
36
+ <>
37
+ <Button variant="primary" onClick={ () => setIsModalOpen( true ) }>
38
+ { postType.labels.add_new_item }
39
+ </Button>
40
+ { isModalOpen && (
41
+ <CreateTemplatePartModal
42
+ closeModal={ () => setIsModalOpen( false ) }
43
+ blocks={ [] }
44
+ onCreate={ ( templatePart ) => {
45
+ setIsModalOpen( false );
46
+ history.push( {
47
+ postId: templatePart.id,
48
+ postType: 'wp_template_part',
49
+ canvas: 'edit',
50
+ } );
51
+ } }
52
+ onError={ () => setIsModalOpen( false ) }
53
+ />
54
+ ) }
55
+ </>
56
+ );
57
+ }
@@ -7,8 +7,7 @@ import {
7
7
  __experimentalVStack as VStack,
8
8
  } from '@wordpress/components';
9
9
  import { __ } from '@wordpress/i18n';
10
- import { useSelect } from '@wordpress/data';
11
- import { store as coreStore, useEntityRecords } from '@wordpress/core-data';
10
+ import { useEntityRecords } from '@wordpress/core-data';
12
11
  import { decodeEntities } from '@wordpress/html-entities';
13
12
 
14
13
  /**
@@ -19,8 +18,7 @@ import Table from '../table';
19
18
  import Link from '../routes/link';
20
19
  import AddedBy from '../list/added-by';
21
20
  import TemplateActions from '../template-actions';
22
- import AddNewTemplate from '../add-new-template';
23
- import { store as editSiteStore } from '../../store';
21
+ import AddNewTemplatePart from './add-new-template-part';
24
22
 
25
23
  export default function PageTemplateParts() {
26
24
  const { records: templateParts } = useEntityRecords(
@@ -31,15 +29,6 @@ export default function PageTemplateParts() {
31
29
  }
32
30
  );
33
31
 
34
- const { canCreate } = useSelect( ( select ) => {
35
- const { supportsTemplatePartsMode } =
36
- select( editSiteStore ).getSettings();
37
- return {
38
- postType: select( coreStore ).getPostType( 'wp_template_part' ),
39
- canCreate: ! supportsTemplatePartsMode,
40
- };
41
- } );
42
-
43
32
  const columns = [
44
33
  {
45
34
  header: __( 'Template Part' ),
@@ -87,15 +76,7 @@ export default function PageTemplateParts() {
87
76
  return (
88
77
  <Page
89
78
  title={ __( 'Template Parts' ) }
90
- actions={
91
- canCreate && (
92
- <AddNewTemplate
93
- templateType={ 'wp_template_part' }
94
- showIcon={ false }
95
- toggleProps={ { variant: 'primary' } }
96
- />
97
- )
98
- }
79
+ actions={ <AddNewTemplatePart /> }
99
80
  >
100
81
  { templateParts && (
101
82
  <Table data={ templateParts } columns={ columns } />