@wordpress/editor 14.15.1 → 14.16.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 (123) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -1
  3. package/build/bindings/pattern-overrides.js +1 -1
  4. package/build/bindings/pattern-overrides.js.map +1 -1
  5. package/build/components/collab-sidebar/index.js +1 -4
  6. package/build/components/collab-sidebar/index.js.map +1 -1
  7. package/build/components/document-outline/index.js +2 -2
  8. package/build/components/document-outline/index.js.map +1 -1
  9. package/build/components/header/index.js +3 -2
  10. package/build/components/header/index.js.map +1 -1
  11. package/build/components/post-excerpt/index.js +1 -1
  12. package/build/components/post-excerpt/index.js.map +1 -1
  13. package/build/components/post-preview-button/index.js +7 -1
  14. package/build/components/post-preview-button/index.js.map +1 -1
  15. package/build/components/post-publish-button/index.js +2 -2
  16. package/build/components/post-publish-button/index.js.map +1 -1
  17. package/build/components/post-publish-button/post-publish-button-or-toggle.js +1 -1
  18. package/build/components/post-publish-button/post-publish-button-or-toggle.js.map +1 -1
  19. package/build/components/post-schedule/index.js +1 -1
  20. package/build/components/post-schedule/index.js.map +1 -1
  21. package/build/components/post-template/swap-template-button.js +1 -1
  22. package/build/components/post-template/swap-template-button.js.map +1 -1
  23. package/build/components/provider/index.js +25 -17
  24. package/build/components/provider/index.js.map +1 -1
  25. package/build/components/sidebar/post-summary.js +1 -1
  26. package/build/components/sidebar/post-summary.js.map +1 -1
  27. package/build/components/visual-editor/edit-template-blocks-notification.js +1 -1
  28. package/build/components/visual-editor/edit-template-blocks-notification.js.map +1 -1
  29. package/build/components/visual-editor/index.js +2 -2
  30. package/build/components/visual-editor/index.js.map +1 -1
  31. package/build/dataviews/fields/content-preview/content-preview-view.js +101 -0
  32. package/build/dataviews/fields/content-preview/content-preview-view.js.map +1 -0
  33. package/build/dataviews/fields/content-preview/index.js +26 -0
  34. package/build/dataviews/fields/content-preview/index.js.map +1 -0
  35. package/build/dataviews/store/private-actions.js +3 -1
  36. package/build/dataviews/store/private-actions.js.map +1 -1
  37. package/build/store/private-actions.js +1 -1
  38. package/build/store/private-actions.js.map +1 -1
  39. package/build/store/private-selectors.js +7 -1
  40. package/build/store/private-selectors.js.map +1 -1
  41. package/build-module/bindings/pattern-overrides.js +1 -1
  42. package/build-module/bindings/pattern-overrides.js.map +1 -1
  43. package/build-module/components/collab-sidebar/index.js +1 -4
  44. package/build-module/components/collab-sidebar/index.js.map +1 -1
  45. package/build-module/components/document-outline/index.js +2 -2
  46. package/build-module/components/document-outline/index.js.map +1 -1
  47. package/build-module/components/header/index.js +3 -2
  48. package/build-module/components/header/index.js.map +1 -1
  49. package/build-module/components/post-excerpt/index.js +1 -1
  50. package/build-module/components/post-excerpt/index.js.map +1 -1
  51. package/build-module/components/post-preview-button/index.js +7 -1
  52. package/build-module/components/post-preview-button/index.js.map +1 -1
  53. package/build-module/components/post-publish-button/index.js +2 -2
  54. package/build-module/components/post-publish-button/index.js.map +1 -1
  55. package/build-module/components/post-publish-button/post-publish-button-or-toggle.js +1 -1
  56. package/build-module/components/post-publish-button/post-publish-button-or-toggle.js.map +1 -1
  57. package/build-module/components/post-schedule/index.js +1 -1
  58. package/build-module/components/post-schedule/index.js.map +1 -1
  59. package/build-module/components/post-template/swap-template-button.js +1 -1
  60. package/build-module/components/post-template/swap-template-button.js.map +1 -1
  61. package/build-module/components/provider/index.js +25 -17
  62. package/build-module/components/provider/index.js.map +1 -1
  63. package/build-module/components/sidebar/post-summary.js +1 -1
  64. package/build-module/components/sidebar/post-summary.js.map +1 -1
  65. package/build-module/components/visual-editor/edit-template-blocks-notification.js +1 -1
  66. package/build-module/components/visual-editor/edit-template-blocks-notification.js.map +1 -1
  67. package/build-module/components/visual-editor/index.js +2 -2
  68. package/build-module/components/visual-editor/index.js.map +1 -1
  69. package/build-module/dataviews/fields/content-preview/content-preview-view.js +95 -0
  70. package/build-module/dataviews/fields/content-preview/content-preview-view.js.map +1 -0
  71. package/build-module/dataviews/fields/content-preview/index.js +19 -0
  72. package/build-module/dataviews/fields/content-preview/index.js.map +1 -0
  73. package/build-module/dataviews/store/private-actions.js +2 -1
  74. package/build-module/dataviews/store/private-actions.js.map +1 -1
  75. package/build-module/store/private-actions.js +1 -1
  76. package/build-module/store/private-actions.js.map +1 -1
  77. package/build-module/store/private-selectors.js +7 -1
  78. package/build-module/store/private-selectors.js.map +1 -1
  79. package/build-style/style-rtl.css +24 -8
  80. package/build-style/style.css +24 -8
  81. package/build-types/components/autocompleters/user.d.ts +5 -1
  82. package/build-types/components/collab-sidebar/index.d.ts.map +1 -1
  83. package/build-types/components/header/index.d.ts.map +1 -1
  84. package/build-types/components/post-author/hook.d.ts +1 -1
  85. package/build-types/components/post-preview-button/index.d.ts.map +1 -1
  86. package/build-types/components/post-taxonomies/index.d.ts +1 -1
  87. package/build-types/components/post-taxonomies/index.d.ts.map +1 -1
  88. package/build-types/components/post-template/hooks.d.ts +1 -1
  89. package/build-types/components/post-template/hooks.d.ts.map +1 -1
  90. package/build-types/components/provider/index.d.ts +9 -9
  91. package/build-types/components/provider/index.d.ts.map +1 -1
  92. package/build-types/components/visual-editor/edit-template-blocks-notification.d.ts +1 -1
  93. package/build-types/dataviews/fields/content-preview/content-preview-view.d.ts +5 -0
  94. package/build-types/dataviews/fields/content-preview/content-preview-view.d.ts.map +1 -0
  95. package/build-types/dataviews/fields/content-preview/index.d.ts +8 -0
  96. package/build-types/dataviews/fields/content-preview/index.d.ts.map +1 -0
  97. package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
  98. package/build-types/store/private-selectors.d.ts.map +1 -1
  99. package/build-types/store/selectors.d.ts +1 -1
  100. package/package.json +37 -37
  101. package/src/bindings/pattern-overrides.js +1 -1
  102. package/src/components/autocompleters/style.scss +1 -1
  103. package/src/components/collab-sidebar/index.js +1 -4
  104. package/src/components/document-outline/index.js +2 -2
  105. package/src/components/header/index.js +8 -2
  106. package/src/components/post-excerpt/index.js +1 -1
  107. package/src/components/post-preview-button/index.js +5 -1
  108. package/src/components/post-publish-button/index.js +2 -2
  109. package/src/components/post-publish-button/post-publish-button-or-toggle.js +1 -1
  110. package/src/components/post-schedule/index.js +1 -1
  111. package/src/components/post-template/swap-template-button.js +1 -1
  112. package/src/components/provider/index.js +32 -20
  113. package/src/components/sidebar/post-summary.js +1 -1
  114. package/src/components/visual-editor/edit-template-blocks-notification.js +1 -1
  115. package/src/components/visual-editor/index.js +2 -2
  116. package/src/dataviews/fields/content-preview/content-preview-view.tsx +108 -0
  117. package/src/dataviews/fields/content-preview/index.tsx +21 -0
  118. package/src/dataviews/fields/content-preview/style.scss +21 -0
  119. package/src/dataviews/store/private-actions.ts +4 -0
  120. package/src/store/private-actions.js +1 -1
  121. package/src/store/private-selectors.js +15 -8
  122. package/src/style.scss +1 -0
  123. package/tsconfig.tsbuildinfo +1 -1
@@ -37,7 +37,7 @@ export default function SwapTemplateButton( { onClick } ) {
37
37
  return (
38
38
  <>
39
39
  <MenuItem onClick={ () => setShowModal( true ) }>
40
- { __( 'Swap template' ) }
40
+ { __( 'Change template' ) }
41
41
  </MenuItem>
42
42
  { showModal && (
43
43
  <Modal
@@ -56,6 +56,11 @@ const NON_CONTEXTUAL_POST_TYPES = [
56
56
  'wp_template_part',
57
57
  ];
58
58
 
59
+ /**
60
+ * These are rendering modes that the editor supports.
61
+ */
62
+ const RENDERING_MODES = [ 'post-only', 'template-locked' ];
63
+
59
64
  /**
60
65
  * Depending on the post, template and template mode,
61
66
  * returns the appropriate blocks and change handlers for the block editor provider.
@@ -171,7 +176,6 @@ export const ExperimentalEditorProvider = withRegistryProvider(
171
176
  mode,
172
177
  defaultMode,
173
178
  postTypeEntities,
174
- hasLoadedPostObject,
175
179
  } = useSelect(
176
180
  ( select ) => {
177
181
  const {
@@ -180,24 +184,32 @@ export const ExperimentalEditorProvider = withRegistryProvider(
180
184
  getRenderingMode,
181
185
  __unstableIsEditorReady,
182
186
  } = select( editorStore );
183
- const { getEntitiesConfig } = select( coreStore );
187
+ const {
188
+ getEntitiesConfig,
189
+ getPostType,
190
+ hasFinishedResolution,
191
+ } = select( coreStore );
184
192
 
185
- const postTypeObject = select( coreStore ).getPostType(
186
- post.type
193
+ const postTypeSupports = getPostType( post.type )?.supports;
194
+ const hasLoadedPostObject = hasFinishedResolution(
195
+ 'getPostType',
196
+ [ post.type ]
187
197
  );
188
198
 
189
- const _hasLoadedPostObject = select(
190
- coreStore
191
- ).hasFinishedResolution( 'getPostType', [ post.type ] );
199
+ const _defaultMode = Array.isArray( postTypeSupports?.editor )
200
+ ? postTypeSupports.editor.find(
201
+ ( features ) => 'default_mode' in features
202
+ )?.default_mode
203
+ : undefined;
204
+ const hasDefaultMode = RENDERING_MODES.includes( _defaultMode );
192
205
 
193
206
  return {
194
- hasLoadedPostObject: _hasLoadedPostObject,
195
207
  editorSettings: getEditorSettings(),
196
- isReady: __unstableIsEditorReady(),
208
+ isReady: __unstableIsEditorReady() && hasLoadedPostObject,
197
209
  mode: getRenderingMode(),
198
210
  defaultMode:
199
- hasTemplate && postTypeObject?.default_rendering_mode
200
- ? postTypeObject?.default_rendering_mode
211
+ hasTemplate && hasDefaultMode
212
+ ? _defaultMode
201
213
  : 'post-only',
202
214
  selection: getEditorSelection(),
203
215
  postTypeEntities:
@@ -334,7 +346,7 @@ export const ExperimentalEditorProvider = withRegistryProvider(
334
346
  // Register the editor commands.
335
347
  useCommands();
336
348
 
337
- if ( ! isReady || ! mode || ! hasLoadedPostObject ) {
349
+ if ( ! isReady || ! mode ) {
338
350
  return null;
339
351
  }
340
352
 
@@ -391,14 +403,14 @@ export const ExperimentalEditorProvider = withRegistryProvider(
391
403
  *
392
404
  * All modification and changes are performed to the `@wordpress/core-data` store.
393
405
  *
394
- * @param {Object} props The component props.
395
- * @param {Object} [props.post] The post object to edit. This is required.
396
- * @param {Object} [props.__unstableTemplate] The template object wrapper the edited post.
397
- * This is optional and can only be used when the post type supports templates (like posts and pages).
398
- * @param {Object} [props.settings] The settings object to use for the editor.
399
- * This is optional and can be used to override the default settings.
400
- * @param {Element} [props.children] Children elements for which the BlockEditorProvider context should apply.
401
- * This is optional.
406
+ * @param {Object} props The component props.
407
+ * @param {Object} [props.post] The post object to edit. This is required.
408
+ * @param {Object} [props.__unstableTemplate] The template object wrapper the edited post.
409
+ * This is optional and can only be used when the post type supports templates (like posts and pages).
410
+ * @param {Object} [props.settings] The settings object to use for the editor.
411
+ * This is optional and can be used to override the default settings.
412
+ * @param {React.ReactNode} [props.children] Children elements for which the BlockEditorProvider context should apply.
413
+ * This is optional.
402
414
  *
403
415
  * @example
404
416
  * ```jsx
@@ -38,7 +38,7 @@ const PANEL_NAME = 'post-status';
38
38
  export default function PostSummary( { onActionPerformed } ) {
39
39
  const { isRemovedPostStatusPanel, postType, postId } = useSelect(
40
40
  ( select ) => {
41
- // We use isEditorPanelRemoved to hide the panel if it was programatically removed. We do
41
+ // We use isEditorPanelRemoved to hide the panel if it was programmatically removed. We do
42
42
  // not use isEditorPanelEnabled since this panel should not be disabled through the UI.
43
43
  const {
44
44
  isEditorPanelRemoved,
@@ -19,7 +19,7 @@ import { store as editorStore } from '../../store';
19
19
  * user is focusing on editing page content and clicks on a disabled template
20
20
  * block.
21
21
  * - Displays a 'Edit your template to edit this block' dialog when the user
22
- * is focusing on editing page conetnt and double clicks on a disabled
22
+ * is focusing on editing page content and double clicks on a disabled
23
23
  * template block.
24
24
  *
25
25
  * @param {Object} props
@@ -337,7 +337,7 @@ function VisualEditor( {
337
337
  ! isPreview &&
338
338
  // Disable resizing in mobile viewport.
339
339
  ! isMobileViewport &&
340
- // Dsiable resizing in zoomed-out mode.
340
+ // Disable resizing in zoomed-out mode.
341
341
  ! isZoomedOut;
342
342
 
343
343
  const iframeStyles = useMemo( () => {
@@ -434,7 +434,7 @@ function VisualEditor( {
434
434
  <div
435
435
  className={ clsx(
436
436
  'editor-visual-editor__post-title-wrapper',
437
- // The following class is only here for backward comapatibility
437
+ // The following class is only here for backward compatibility
438
438
  // some themes might be using it to style the post title.
439
439
  'edit-post-visual-editor__post-title-wrapper',
440
440
  {
@@ -0,0 +1,108 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import {
6
+ BlockPreview,
7
+ privateApis as blockEditorPrivateApis,
8
+ // @ts-ignore
9
+ } from '@wordpress/block-editor';
10
+ import type { BasePost } from '@wordpress/fields';
11
+ import { useSelect } from '@wordpress/data';
12
+ import { useEntityBlockEditor, store as coreStore } from '@wordpress/core-data';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import { EditorProvider } from '../../../components/provider';
18
+ import { unlock } from '../../../lock-unlock';
19
+ // @ts-ignore
20
+ import { store as editorStore } from '../../../store';
21
+
22
+ const { useGlobalStyle } = unlock( blockEditorPrivateApis );
23
+
24
+ function PostPreviewContainer( {
25
+ template,
26
+ post,
27
+ }: {
28
+ template: any;
29
+ post: any;
30
+ } ) {
31
+ const [ backgroundColor = 'white' ] = useGlobalStyle( 'color.background' );
32
+ const [ postBlocks ] = useEntityBlockEditor( 'postType', post.type, {
33
+ id: post.id,
34
+ } );
35
+ const [ templateBlocks ] = useEntityBlockEditor(
36
+ 'postType',
37
+ template?.type,
38
+ {
39
+ id: template?.id,
40
+ }
41
+ );
42
+ const blocks = template && templateBlocks ? templateBlocks : postBlocks;
43
+ const isEmpty = ! blocks?.length;
44
+ return (
45
+ <div
46
+ className="editor-fields-content-preview"
47
+ style={ {
48
+ backgroundColor,
49
+ } }
50
+ >
51
+ { isEmpty && (
52
+ <span className="editor-fields-content-preview__empty">
53
+ { __( 'Empty content' ) }
54
+ </span>
55
+ ) }
56
+ { ! isEmpty && (
57
+ <BlockPreview.Async>
58
+ <BlockPreview blocks={ blocks } />
59
+ </BlockPreview.Async>
60
+ ) }
61
+ </div>
62
+ );
63
+ }
64
+
65
+ export default function PostPreviewView( { item }: { item: BasePost } ) {
66
+ const { settings, template } = useSelect(
67
+ ( select ) => {
68
+ const { canUser, getPostType, getTemplateId, getEntityRecord } =
69
+ unlock( select( coreStore ) );
70
+ const canViewTemplate = canUser( 'read', {
71
+ kind: 'postType',
72
+ name: 'wp_template',
73
+ } );
74
+ const _settings = select( editorStore ).getEditorSettings();
75
+ // @ts-ignore
76
+ const supportsTemplateMode = _settings.supportsTemplateMode;
77
+ const isViewable = getPostType( item.type )?.viewable ?? false;
78
+
79
+ const templateId =
80
+ supportsTemplateMode && isViewable && canViewTemplate
81
+ ? getTemplateId( item.type, item.id )
82
+ : null;
83
+ return {
84
+ settings: _settings,
85
+ template: templateId
86
+ ? getEntityRecord( 'postType', 'wp_template', templateId )
87
+ : undefined,
88
+ };
89
+ },
90
+ [ item.type, item.id ]
91
+ );
92
+ // Wrap everything in a block editor provider to ensure 'styles' that are needed
93
+ // for the previews are synced between the site editor store and the block editor store.
94
+ // Additionally we need to have the `__experimentalBlockPatterns` setting in order to
95
+ // render patterns inside the previews.
96
+ // TODO: Same approach is used in the patterns list and it becomes obvious that some of
97
+ // the block editor settings are needed in context where we don't have the block editor.
98
+ // Explore how we can solve this in a better way.
99
+ return (
100
+ <EditorProvider
101
+ post={ item }
102
+ settings={ settings }
103
+ __unstableTemplate={ template }
104
+ >
105
+ <PostPreviewContainer template={ template } post={ item } />
106
+ </EditorProvider>
107
+ );
108
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import type { Field } from '@wordpress/dataviews';
5
+ import type { BasePost } from '@wordpress/fields';
6
+ import { __ } from '@wordpress/i18n';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import PostPreviewView from './content-preview-view';
12
+
13
+ const postPreviewField: Field< BasePost > = {
14
+ type: 'media',
15
+ id: 'content-preview',
16
+ label: __( 'Content preview' ),
17
+ render: PostPreviewView,
18
+ enableSorting: false,
19
+ };
20
+
21
+ export default postPreviewField;
@@ -0,0 +1,21 @@
1
+ .editor-fields-content-preview {
2
+ display: flex;
3
+ flex-direction: column;
4
+ height: 100%;
5
+ border-radius: $radius-medium;
6
+
7
+ .dataviews-view-table & {
8
+ width: 96px;
9
+ flex-grow: 0;
10
+ }
11
+
12
+ .block-editor-block-preview__container,
13
+ .editor-fields-content-preview__empty {
14
+ margin-top: auto;
15
+ margin-bottom: auto;
16
+ }
17
+ }
18
+
19
+ .editor-fields-content-preview__empty {
20
+ text-align: center;
21
+ }
@@ -38,6 +38,7 @@ import {
38
38
  * Internal dependencies
39
39
  */
40
40
  import { store as editorStore } from '../../store';
41
+ import postPreviewField from '../fields/content-preview';
41
42
  import { unlock } from '../../lock-unlock';
42
43
 
43
44
  export function registerEntityAction< Item >(
@@ -175,6 +176,9 @@ export const registerPostTypeSchema =
175
176
  postTypeConfig.supports?.comments && commentStatusField,
176
177
  templateField,
177
178
  passwordField,
179
+ postTypeConfig.supports?.editor &&
180
+ postTypeConfig.viewable &&
181
+ postPreviewField,
178
182
  ].filter( Boolean );
179
183
  if ( postTypeConfig.supports?.title ) {
180
184
  let _titleField;
@@ -388,7 +388,7 @@ export const removeTemplates =
388
388
  } )
389
389
  );
390
390
 
391
- // If all the promises were fulfilled with sucess.
391
+ // If all the promises were fulfilled with success.
392
392
  if ( promiseResult.every( ( { status } ) => status === 'fulfilled' ) ) {
393
393
  let successMessage;
394
394
 
@@ -26,6 +26,7 @@ import {
26
26
  getEntityFields as _getEntityFields,
27
27
  isEntityReady as _isEntityReady,
28
28
  } from '../dataviews/store/private-selectors';
29
+ import { getTemplatePartIcon } from '../utils';
29
30
 
30
31
  const EMPTY_INSERTION_POINT = {
31
32
  rootClientId: undefined,
@@ -97,15 +98,21 @@ export const getPostIcon = createRegistrySelector(
97
98
  postType === 'wp_template_part' ||
98
99
  postType === 'wp_template'
99
100
  ) {
100
- return (
101
- (
102
- select( coreStore ).getEntityRecord(
103
- 'root',
104
- '__unstableBase'
105
- )?.default_template_part_areas || []
106
- ).find( ( item ) => options.area === item.area )?.icon ||
107
- layout
101
+ const templateAreas =
102
+ select( coreStore ).getEntityRecord(
103
+ 'root',
104
+ '__unstableBase'
105
+ )?.default_template_part_areas || [];
106
+
107
+ const areaData = templateAreas.find(
108
+ ( item ) => options.area === item.area
108
109
  );
110
+
111
+ if ( areaData?.icon ) {
112
+ return getTemplatePartIcon( areaData.icon );
113
+ }
114
+
115
+ return layout;
109
116
  }
110
117
  if ( CARD_ICONS[ postType ] ) {
111
118
  return CARD_ICONS[ postType ];
package/src/style.scss CHANGED
@@ -54,3 +54,4 @@
54
54
  @import "./components/table-of-contents/style.scss";
55
55
  @import "./components/text-editor/style.scss";
56
56
  @import "./components/visual-editor/style.scss";
57
+ @import "./dataviews/fields/content-preview/style.scss";