@wordpress/editor 14.48.0 → 14.48.2-next.v.202606191442.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.
- package/CHANGELOG.md +25 -1
- package/build/bindings/pattern-overrides.cjs +1 -1
- package/build/bindings/pattern-overrides.cjs.map +2 -2
- package/build/components/block-removal-warnings/index.cjs +0 -3
- package/build/components/block-removal-warnings/index.cjs.map +2 -2
- package/build/components/collab-sidebar/note-byline.cjs +1 -1
- package/build/components/collab-sidebar/note-byline.cjs.map +2 -2
- package/build/components/collab-sidebar/note-indicator-toolbar.cjs +49 -43
- package/build/components/collab-sidebar/note-indicator-toolbar.cjs.map +3 -3
- package/build/components/collab-sidebar/note.cjs +49 -17
- package/build/components/collab-sidebar/note.cjs.map +3 -3
- package/build/components/collab-sidebar/notes.cjs.map +1 -1
- package/build/components/collab-sidebar/utils.cjs +1 -1
- package/build/components/collab-sidebar/utils.cjs.map +2 -2
- package/build/components/collaborators-overlay/avatar-iframe-styles.cjs.map +1 -1
- package/build/components/collaborators-overlay/collaborator-styles.cjs.map +1 -1
- package/build/components/collaborators-overlay/compute-selection.cjs.map +1 -1
- package/build/components/collaborators-overlay/overlay-iframe-styles.cjs +1 -1
- package/build/components/collaborators-overlay/overlay-iframe-styles.cjs.map +1 -1
- package/build/components/collaborators-overlay/use-block-highlighting.cjs +1 -8
- package/build/components/collaborators-overlay/use-block-highlighting.cjs.map +3 -3
- package/build/components/collaborators-overlay/use-render-cursors.cjs +1 -7
- package/build/components/collaborators-overlay/use-render-cursors.cjs.map +3 -3
- package/build/components/collaborators-presence/avatar/component.cjs.map +2 -2
- package/build/components/collaborators-presence/avatar/use-image-loading-status.cjs.map +1 -1
- package/build/components/document-bar/index.cjs +7 -5
- package/build/components/document-bar/index.cjs.map +2 -2
- package/build/components/global-keyboard-shortcuts/index.cjs +3 -2
- package/build/components/global-keyboard-shortcuts/index.cjs.map +2 -2
- package/build/components/global-styles-sidebar/welcome-guide.cjs +3 -3
- package/build/components/global-styles-sidebar/welcome-guide.cjs.map +1 -1
- package/build/components/local-autosave-monitor/index.cjs +14 -15
- package/build/components/local-autosave-monitor/index.cjs.map +2 -2
- package/build/components/more-menu/view-more-menu-group.cjs +1 -2
- package/build/components/more-menu/view-more-menu-group.cjs.map +2 -2
- package/build/components/page-attributes/parent.cjs +2 -1
- package/build/components/page-attributes/parent.cjs.map +2 -2
- package/build/components/post-card-panel/index.cjs +1 -1
- package/build/components/post-card-panel/index.cjs.map +2 -2
- package/build/components/post-excerpt/panel.cjs +1 -1
- package/build/components/post-excerpt/panel.cjs.map +2 -2
- package/build/components/post-locked-modal/index.cjs +3 -3
- package/build/components/post-locked-modal/index.cjs.map +1 -1
- package/build/components/post-preview-button/index.cjs +2 -2
- package/build/components/post-preview-button/index.cjs.map +2 -2
- package/build/components/post-publish-button/index.cjs +115 -157
- package/build/components/post-publish-button/index.cjs.map +3 -3
- package/build/components/post-publish-button/label.cjs +2 -2
- package/build/components/post-publish-button/label.cjs.map +2 -2
- package/build/components/post-publish-panel/index.cjs.map +1 -1
- package/build/components/post-publish-panel/postpublish.cjs +1 -1
- package/build/components/post-publish-panel/postpublish.cjs.map +2 -2
- package/build/components/post-revisions-preview/block-diff.cjs +21 -9
- package/build/components/post-revisions-preview/block-diff.cjs.map +2 -2
- package/build/components/post-revisions-preview/diff-markers.cjs.map +2 -2
- package/build/components/post-revisions-preview/preserve-client-ids.cjs +2 -2
- package/build/components/post-revisions-preview/preserve-client-ids.cjs.map +2 -2
- package/build/components/post-revisions-preview/revisions-slider.cjs +1 -1
- package/build/components/post-revisions-preview/revisions-slider.cjs.map +2 -2
- package/build/components/post-revisions-timeline/index.cjs +173 -0
- package/build/components/post-revisions-timeline/index.cjs.map +7 -0
- package/build/components/post-saved-state/index.cjs +17 -26
- package/build/components/post-saved-state/index.cjs.map +2 -2
- package/build/components/post-schedule/label.cjs +5 -5
- package/build/components/post-schedule/label.cjs.map +1 -1
- package/build/components/post-taxonomies/flat-term-selector.cjs +2 -1
- package/build/components/post-taxonomies/flat-term-selector.cjs.map +3 -3
- package/build/components/post-taxonomies/hierarchical-term-selector.cjs +1 -1
- package/build/components/post-taxonomies/hierarchical-term-selector.cjs.map +2 -2
- package/build/components/post-text-editor/index.cjs +51 -0
- package/build/components/post-text-editor/index.cjs.map +2 -2
- package/build/components/post-text-editor/utils.cjs +150 -0
- package/build/components/post-text-editor/utils.cjs.map +7 -0
- package/build/components/post-url/index.cjs +1 -1
- package/build/components/post-url/index.cjs.map +2 -2
- package/build/components/post-view-link/index.cjs +1 -1
- package/build/components/post-view-link/index.cjs.map +2 -2
- package/build/components/provider/disable-non-page-content-blocks.cjs.map +1 -1
- package/build/components/provider/index.cjs +3 -1
- package/build/components/provider/index.cjs.map +3 -3
- package/build/components/provider/use-network-reconnect.cjs +51 -0
- package/build/components/provider/use-network-reconnect.cjs.map +7 -0
- package/build/components/resizable-editor/resize-handle.cjs.map +2 -2
- package/build/components/revision-diff-panel/index.cjs +7 -2
- package/build/components/revision-diff-panel/index.cjs.map +2 -2
- package/build/components/revision-fields-diff/index.cjs +8 -4
- package/build/components/revision-fields-diff/index.cjs.map +2 -2
- package/build/components/sidebar/dataform-post-summary.cjs +125 -20
- package/build/components/sidebar/dataform-post-summary.cjs.map +3 -3
- package/build/components/sidebar/index.cjs +2 -15
- package/build/components/sidebar/index.cjs.map +3 -3
- package/build/components/sidebar/post-revision-summary.cjs +11 -17
- package/build/components/sidebar/post-revision-summary.cjs.map +3 -3
- package/build/components/sidebar/post-summary.cjs +1 -1
- package/build/components/sidebar/post-summary.cjs.map +2 -2
- package/build/components/style-book/examples.cjs +1 -1
- package/build/components/style-book/examples.cjs.map +1 -1
- package/build/components/style-book/index.cjs +1 -1
- package/build/components/style-book/index.cjs.map +2 -2
- package/build/components/sync-connection-error-modal/index.cjs +3 -3
- package/build/components/sync-connection-error-modal/index.cjs.map +1 -1
- package/build/components/template-actions-panel/block-theme-content.cjs +7 -1
- package/build/components/template-actions-panel/block-theme-content.cjs.map +2 -2
- package/build/components/template-actions-panel/index.cjs +0 -9
- package/build/components/template-actions-panel/index.cjs.map +3 -3
- package/build/components/template-validation-notice/index.cjs +1 -1
- package/build/components/template-validation-notice/index.cjs.map +1 -1
- package/build/components/upload-progress-snackbar/index.cjs +161 -0
- package/build/components/upload-progress-snackbar/index.cjs.map +7 -0
- package/build/components/upload-progress-snackbar/tracker.cjs +90 -0
- package/build/components/upload-progress-snackbar/tracker.cjs.map +7 -0
- package/build/components/visual-editor/edit-template-blocks-notification.cjs +1 -1
- package/build/components/visual-editor/edit-template-blocks-notification.cjs.map +1 -1
- package/build/{components/revision-author-panel → dataviews/fields/revisions}/index.cjs +18 -26
- package/build/dataviews/fields/revisions/index.cjs.map +7 -0
- package/build/dataviews/fields/revisions/revisions-view.cjs +74 -0
- package/build/dataviews/fields/revisions/revisions-view.cjs.map +7 -0
- package/build/dataviews/store/private-actions.cjs +14 -4
- package/build/dataviews/store/private-actions.cjs.map +3 -3
- package/build/hooks/push-changes-to-global-styles/index.cjs +1 -1
- package/build/hooks/push-changes-to-global-styles/index.cjs.map +1 -1
- package/build/private-apis.cjs +2 -0
- package/build/private-apis.cjs.map +3 -3
- package/build/store/actions.cjs +1 -1
- package/build/store/actions.cjs.map +2 -2
- package/build/store/private-selectors.cjs +6 -1
- package/build/store/private-selectors.cjs.map +2 -2
- package/build/store/selectors.cjs +1 -2
- package/build/store/selectors.cjs.map +2 -2
- package/build/utils/media-upload/index.cjs +16 -0
- package/build/utils/media-upload/index.cjs.map +3 -3
- package/build/utils/set-nested-value.cjs.map +1 -1
- package/build-module/bindings/pattern-overrides.mjs +1 -1
- package/build-module/bindings/pattern-overrides.mjs.map +2 -2
- package/build-module/components/block-removal-warnings/index.mjs +0 -3
- package/build-module/components/block-removal-warnings/index.mjs.map +2 -2
- package/build-module/components/collab-sidebar/note-byline.mjs +1 -1
- package/build-module/components/collab-sidebar/note-byline.mjs.map +2 -2
- package/build-module/components/collab-sidebar/note-indicator-toolbar.mjs +53 -44
- package/build-module/components/collab-sidebar/note-indicator-toolbar.mjs.map +2 -2
- package/build-module/components/collab-sidebar/note.mjs +50 -18
- package/build-module/components/collab-sidebar/note.mjs.map +2 -2
- package/build-module/components/collab-sidebar/notes.mjs.map +1 -1
- package/build-module/components/collab-sidebar/utils.mjs +1 -1
- package/build-module/components/collab-sidebar/utils.mjs.map +2 -2
- package/build-module/components/collaborators-overlay/avatar-iframe-styles.mjs.map +1 -1
- package/build-module/components/collaborators-overlay/collaborator-styles.mjs.map +1 -1
- package/build-module/components/collaborators-overlay/compute-selection.mjs.map +1 -1
- package/build-module/components/collaborators-overlay/overlay-iframe-styles.mjs +1 -1
- package/build-module/components/collaborators-overlay/overlay-iframe-styles.mjs.map +1 -1
- package/build-module/components/collaborators-overlay/use-block-highlighting.mjs +1 -8
- package/build-module/components/collaborators-overlay/use-block-highlighting.mjs.map +2 -2
- package/build-module/components/collaborators-overlay/use-render-cursors.mjs +1 -7
- package/build-module/components/collaborators-overlay/use-render-cursors.mjs.map +2 -2
- package/build-module/components/collaborators-presence/avatar/component.mjs.map +2 -2
- package/build-module/components/collaborators-presence/avatar/use-image-loading-status.mjs.map +1 -1
- package/build-module/components/document-bar/index.mjs +7 -5
- package/build-module/components/document-bar/index.mjs.map +2 -2
- package/build-module/components/global-keyboard-shortcuts/index.mjs +3 -2
- package/build-module/components/global-keyboard-shortcuts/index.mjs.map +2 -2
- package/build-module/components/global-styles-sidebar/welcome-guide.mjs +3 -3
- package/build-module/components/global-styles-sidebar/welcome-guide.mjs.map +1 -1
- package/build-module/components/local-autosave-monitor/index.mjs +15 -16
- package/build-module/components/local-autosave-monitor/index.mjs.map +2 -2
- package/build-module/components/more-menu/view-more-menu-group.mjs +1 -2
- package/build-module/components/more-menu/view-more-menu-group.mjs.map +2 -2
- package/build-module/components/page-attributes/parent.mjs +2 -1
- package/build-module/components/page-attributes/parent.mjs.map +2 -2
- package/build-module/components/post-card-panel/index.mjs +1 -1
- package/build-module/components/post-card-panel/index.mjs.map +2 -2
- package/build-module/components/post-excerpt/panel.mjs +1 -1
- package/build-module/components/post-excerpt/panel.mjs.map +2 -2
- package/build-module/components/post-locked-modal/index.mjs +3 -3
- package/build-module/components/post-locked-modal/index.mjs.map +1 -1
- package/build-module/components/post-preview-button/index.mjs +2 -2
- package/build-module/components/post-preview-button/index.mjs.map +2 -2
- package/build-module/components/post-publish-button/index.mjs +117 -159
- package/build-module/components/post-publish-button/index.mjs.map +2 -2
- package/build-module/components/post-publish-button/label.mjs +2 -2
- package/build-module/components/post-publish-button/label.mjs.map +2 -2
- package/build-module/components/post-publish-panel/index.mjs.map +1 -1
- package/build-module/components/post-publish-panel/postpublish.mjs +1 -1
- package/build-module/components/post-publish-panel/postpublish.mjs.map +2 -2
- package/build-module/components/post-revisions-preview/block-diff.mjs +20 -8
- package/build-module/components/post-revisions-preview/block-diff.mjs.map +2 -2
- package/build-module/components/post-revisions-preview/diff-markers.mjs.map +2 -2
- package/build-module/components/post-revisions-preview/preserve-client-ids.mjs +1 -1
- package/build-module/components/post-revisions-preview/preserve-client-ids.mjs.map +1 -1
- package/build-module/components/post-revisions-preview/revisions-slider.mjs +1 -1
- package/build-module/components/post-revisions-preview/revisions-slider.mjs.map +2 -2
- package/build-module/components/post-revisions-timeline/index.mjs +152 -0
- package/build-module/components/post-revisions-timeline/index.mjs.map +7 -0
- package/build-module/components/post-saved-state/index.mjs +17 -26
- package/build-module/components/post-saved-state/index.mjs.map +2 -2
- package/build-module/components/post-schedule/label.mjs +5 -5
- package/build-module/components/post-schedule/label.mjs.map +1 -1
- package/build-module/components/post-taxonomies/flat-term-selector.mjs +3 -6
- package/build-module/components/post-taxonomies/flat-term-selector.mjs.map +2 -2
- package/build-module/components/post-taxonomies/hierarchical-term-selector.mjs +1 -1
- package/build-module/components/post-taxonomies/hierarchical-term-selector.mjs.map +2 -2
- package/build-module/components/post-text-editor/index.mjs +51 -0
- package/build-module/components/post-text-editor/index.mjs.map +2 -2
- package/build-module/components/post-text-editor/utils.mjs +123 -0
- package/build-module/components/post-text-editor/utils.mjs.map +7 -0
- package/build-module/components/post-url/index.mjs +1 -1
- package/build-module/components/post-url/index.mjs.map +2 -2
- package/build-module/components/post-view-link/index.mjs +1 -1
- package/build-module/components/post-view-link/index.mjs.map +2 -2
- package/build-module/components/provider/disable-non-page-content-blocks.mjs.map +1 -1
- package/build-module/components/provider/index.mjs +3 -1
- package/build-module/components/provider/index.mjs.map +2 -2
- package/build-module/components/provider/use-network-reconnect.mjs +30 -0
- package/build-module/components/provider/use-network-reconnect.mjs.map +7 -0
- package/build-module/components/resizable-editor/resize-handle.mjs.map +2 -2
- package/build-module/components/revision-diff-panel/index.mjs +7 -2
- package/build-module/components/revision-diff-panel/index.mjs.map +2 -2
- package/build-module/components/revision-fields-diff/index.mjs +8 -4
- package/build-module/components/revision-fields-diff/index.mjs.map +2 -2
- package/build-module/components/sidebar/dataform-post-summary.mjs +125 -20
- package/build-module/components/sidebar/dataform-post-summary.mjs.map +2 -2
- package/build-module/components/sidebar/index.mjs +3 -22
- package/build-module/components/sidebar/index.mjs.map +2 -2
- package/build-module/components/sidebar/post-revision-summary.mjs +11 -17
- package/build-module/components/sidebar/post-revision-summary.mjs.map +2 -2
- package/build-module/components/sidebar/post-summary.mjs +1 -1
- package/build-module/components/sidebar/post-summary.mjs.map +2 -2
- package/build-module/components/style-book/examples.mjs +1 -1
- package/build-module/components/style-book/examples.mjs.map +1 -1
- package/build-module/components/style-book/index.mjs +1 -1
- package/build-module/components/style-book/index.mjs.map +2 -2
- package/build-module/components/sync-connection-error-modal/index.mjs +3 -3
- package/build-module/components/sync-connection-error-modal/index.mjs.map +1 -1
- package/build-module/components/template-actions-panel/block-theme-content.mjs +7 -1
- package/build-module/components/template-actions-panel/block-theme-content.mjs.map +2 -2
- package/build-module/components/template-actions-panel/index.mjs +0 -9
- package/build-module/components/template-actions-panel/index.mjs.map +2 -2
- package/build-module/components/template-validation-notice/index.mjs +1 -1
- package/build-module/components/template-validation-notice/index.mjs.map +1 -1
- package/build-module/components/upload-progress-snackbar/index.mjs +135 -0
- package/build-module/components/upload-progress-snackbar/index.mjs.map +7 -0
- package/build-module/components/upload-progress-snackbar/tracker.mjs +61 -0
- package/build-module/components/upload-progress-snackbar/tracker.mjs.map +7 -0
- package/build-module/components/visual-editor/edit-template-blocks-notification.mjs +1 -1
- package/build-module/components/visual-editor/edit-template-blocks-notification.mjs.map +1 -1
- package/build-module/dataviews/fields/revisions/index.mjs +20 -0
- package/build-module/dataviews/fields/revisions/index.mjs.map +7 -0
- package/build-module/dataviews/fields/revisions/revisions-view.mjs +53 -0
- package/build-module/dataviews/fields/revisions/revisions-view.mjs.map +7 -0
- package/build-module/dataviews/store/private-actions.mjs +23 -7
- package/build-module/dataviews/store/private-actions.mjs.map +2 -2
- package/build-module/hooks/push-changes-to-global-styles/index.mjs +1 -1
- package/build-module/hooks/push-changes-to-global-styles/index.mjs.map +1 -1
- package/build-module/private-apis.mjs +2 -0
- package/build-module/private-apis.mjs.map +2 -2
- package/build-module/store/actions.mjs +1 -1
- package/build-module/store/actions.mjs.map +2 -2
- package/build-module/store/private-selectors.mjs +7 -1
- package/build-module/store/private-selectors.mjs.map +2 -2
- package/build-module/store/selectors.mjs +1 -2
- package/build-module/store/selectors.mjs.map +2 -2
- package/build-module/utils/media-upload/index.mjs +19 -0
- package/build-module/utils/media-upload/index.mjs.map +2 -2
- package/build-module/utils/set-nested-value.mjs.map +1 -1
- package/build-style/style-rtl.css +707 -270
- package/build-style/style.css +707 -270
- package/build-types/components/block-removal-warnings/index.d.ts.map +1 -1
- package/build-types/components/collab-sidebar/note-byline.d.ts +0 -3
- package/build-types/components/collab-sidebar/note-byline.d.ts.map +1 -1
- package/build-types/components/collab-sidebar/note-indicator-toolbar.d.ts.map +1 -1
- package/build-types/components/collab-sidebar/note.d.ts.map +1 -1
- package/build-types/components/collaborators-overlay/use-block-highlighting.d.ts +0 -3
- package/build-types/components/collaborators-overlay/use-block-highlighting.d.ts.map +1 -1
- package/build-types/components/collaborators-overlay/use-render-cursors.d.ts.map +1 -1
- package/build-types/components/collaborators-presence/avatar/component.d.ts.map +1 -1
- package/build-types/components/document-bar/index.d.ts.map +1 -1
- package/build-types/components/global-keyboard-shortcuts/index.d.ts.map +1 -1
- package/build-types/components/local-autosave-monitor/index.d.ts.map +1 -1
- package/build-types/components/more-menu/view-more-menu-group.d.ts.map +1 -1
- package/build-types/components/page-attributes/parent.d.ts.map +1 -1
- package/build-types/components/post-publish-button/index.d.ts +9 -9
- package/build-types/components/post-publish-button/index.d.ts.map +1 -1
- package/build-types/components/post-revisions-preview/block-diff.d.ts +3 -0
- package/build-types/components/post-revisions-preview/block-diff.d.ts.map +1 -1
- package/build-types/components/post-revisions-preview/diff-markers.d.ts.map +1 -1
- package/build-types/components/post-revisions-timeline/index.d.ts +2 -0
- package/build-types/components/post-revisions-timeline/index.d.ts.map +1 -0
- package/build-types/components/post-saved-state/index.d.ts.map +1 -1
- package/build-types/components/post-taxonomies/flat-term-selector.d.ts.map +1 -1
- package/build-types/components/post-text-editor/index.d.ts.map +1 -1
- package/build-types/components/post-text-editor/utils.d.ts +29 -0
- package/build-types/components/post-text-editor/utils.d.ts.map +1 -0
- package/build-types/components/provider/index.d.ts.map +1 -1
- package/build-types/components/provider/use-network-reconnect.d.ts +8 -0
- package/build-types/components/provider/use-network-reconnect.d.ts.map +1 -0
- package/build-types/components/resizable-editor/resize-handle.d.ts.map +1 -1
- package/build-types/components/revision-diff-panel/index.d.ts +3 -1
- package/build-types/components/revision-diff-panel/index.d.ts.map +1 -1
- package/build-types/components/revision-fields-diff/index.d.ts +3 -0
- package/build-types/components/revision-fields-diff/index.d.ts.map +1 -1
- package/build-types/components/sidebar/dataform-post-summary.d.ts.map +1 -1
- package/build-types/components/sidebar/index.d.ts.map +1 -1
- package/build-types/components/sidebar/post-revision-summary.d.ts.map +1 -1
- package/build-types/components/template-actions-panel/block-theme-content.d.ts.map +1 -1
- package/build-types/components/template-actions-panel/index.d.ts.map +1 -1
- package/build-types/components/upload-progress-snackbar/index.d.ts +19 -0
- package/build-types/components/upload-progress-snackbar/index.d.ts.map +1 -0
- package/build-types/components/upload-progress-snackbar/stories/index.story.d.ts +28 -0
- package/build-types/components/upload-progress-snackbar/stories/index.story.d.ts.map +1 -0
- package/build-types/components/upload-progress-snackbar/tracker.d.ts +41 -0
- package/build-types/components/upload-progress-snackbar/tracker.d.ts.map +1 -0
- package/build-types/dataviews/fields/revisions/index.d.ts +8 -0
- package/build-types/dataviews/fields/revisions/index.d.ts.map +1 -0
- package/build-types/dataviews/fields/revisions/revisions-view.d.ts +2 -0
- package/build-types/dataviews/fields/revisions/revisions-view.d.ts.map +1 -0
- package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
- package/build-types/private-apis.d.ts.map +1 -1
- package/build-types/store/private-selectors.d.ts +1 -1
- package/build-types/store/private-selectors.d.ts.map +1 -1
- package/build-types/store/selectors.d.ts +1 -1
- package/build-types/store/selectors.d.ts.map +1 -1
- package/build-types/utils/get-template-part-icon.d.ts.map +1 -1
- package/build-types/utils/media-upload/index.d.ts.map +1 -1
- package/package.json +59 -50
- package/src/bindings/pattern-overrides.js +1 -1
- package/src/bindings/test/pattern-overrides.js +65 -0
- package/src/components/README.md +1 -1
- package/src/components/block-removal-warnings/index.js +0 -7
- package/src/components/collab-sidebar/note-byline.js +0 -1
- package/src/components/collab-sidebar/note-indicator-toolbar.js +73 -60
- package/src/components/collab-sidebar/note.js +64 -29
- package/src/components/collab-sidebar/style.scss +20 -0
- package/src/components/collaborators-overlay/use-block-highlighting.ts +0 -9
- package/src/components/collaborators-overlay/use-render-cursors.ts +0 -8
- package/src/components/collaborators-presence/avatar/component.tsx +0 -1
- package/src/components/collaborators-presence/avatar/test/index.tsx +8 -4
- package/src/components/document-bar/index.js +8 -3
- package/src/components/document-bar/style.scss +4 -2
- package/src/components/global-keyboard-shortcuts/index.js +2 -1
- package/src/components/local-autosave-monitor/index.js +23 -21
- package/src/components/more-menu/view-more-menu-group.js +1 -2
- package/src/components/page-attributes/parent.js +1 -0
- package/src/components/post-card-panel/index.js +1 -1
- package/src/components/post-publish-button/index.js +146 -192
- package/src/components/post-publish-button/test/index.js +149 -113
- package/src/components/post-revisions-preview/block-diff.js +63 -19
- package/src/components/post-revisions-preview/diff-markers.js +0 -1
- package/src/components/post-revisions-preview/preserve-client-ids.js +1 -1
- package/src/components/post-revisions-preview/test/block-diff.js +109 -6
- package/src/components/post-revisions-timeline/index.js +186 -0
- package/src/components/post-revisions-timeline/style.scss +43 -0
- package/src/components/post-saved-state/index.js +23 -26
- package/src/components/post-saved-state/test/index.js +18 -0
- package/src/components/post-taxonomies/flat-term-selector.js +4 -7
- package/src/components/post-text-editor/index.js +65 -0
- package/src/components/post-text-editor/test/utils.js +210 -0
- package/src/components/post-text-editor/utils.js +204 -0
- package/src/components/post-type-support-check/test/index.js +11 -0
- package/src/components/post-url/index.js +1 -1
- package/src/components/post-view-link/index.js +1 -1
- package/src/components/post-view-link/test/index.js +71 -0
- package/src/components/provider/index.js +6 -1
- package/src/components/provider/test/use-network-reconnect.js +137 -0
- package/src/components/provider/use-network-reconnect.js +44 -0
- package/src/components/resizable-editor/resize-handle.js +0 -1
- package/src/components/revision-diff-panel/index.js +8 -2
- package/src/components/revision-fields-diff/index.js +19 -3
- package/src/components/sidebar/dataform-post-summary.js +196 -25
- package/src/components/sidebar/index.js +4 -23
- package/src/components/sidebar/post-revision-summary.js +8 -15
- package/src/components/sidebar/post-summary.js +1 -1
- package/src/components/style-book/index.js +1 -1
- package/src/components/template-actions-panel/block-theme-content.js +10 -2
- package/src/components/template-actions-panel/index.js +0 -15
- package/src/components/upload-progress-snackbar/README.md +26 -0
- package/src/components/upload-progress-snackbar/index.js +216 -0
- package/src/components/upload-progress-snackbar/stories/index.story.tsx +85 -0
- package/src/components/upload-progress-snackbar/style.scss +30 -0
- package/src/components/upload-progress-snackbar/test/index.js +199 -0
- package/src/components/upload-progress-snackbar/tracker.js +105 -0
- package/src/dataviews/fields/revisions/index.tsx +28 -0
- package/src/dataviews/fields/revisions/revisions-view.tsx +59 -0
- package/src/dataviews/store/private-actions.ts +27 -6
- package/src/private-apis.js +2 -0
- package/src/store/private-selectors.js +11 -1
- package/src/store/selectors.js +1 -3
- package/src/store/test/private-selectors.js +69 -0
- package/src/style.scss +2 -1
- package/src/utils/media-upload/index.js +27 -0
- package/build/components/post-revisions-panel/index.cjs +0 -173
- package/build/components/post-revisions-panel/index.cjs.map +0 -7
- package/build/components/revision-author-panel/index.cjs.map +0 -7
- package/build/components/revision-created-panel/index.cjs +0 -47
- package/build/components/revision-created-panel/index.cjs.map +0 -7
- package/build-module/components/post-revisions-panel/index.mjs +0 -148
- package/build-module/components/post-revisions-panel/index.mjs.map +0 -7
- package/build-module/components/revision-author-panel/index.mjs +0 -28
- package/build-module/components/revision-author-panel/index.mjs.map +0 -7
- package/build-module/components/revision-created-panel/index.mjs +0 -26
- package/build-module/components/revision-created-panel/index.mjs.map +0 -7
- package/build-types/components/post-revisions-panel/index.d.ts +0 -2
- package/build-types/components/post-revisions-panel/index.d.ts.map +0 -1
- package/build-types/components/revision-author-panel/index.d.ts +0 -2
- package/build-types/components/revision-author-panel/index.d.ts.map +0 -1
- package/build-types/components/revision-created-panel/index.d.ts +0 -2
- package/build-types/components/revision-created-panel/index.d.ts.map +0 -1
- package/src/components/commands/index.native.js +0 -2
- package/src/components/deprecated.native.js +0 -47
- package/src/components/editor-help/add-blocks.native.js +0 -40
- package/src/components/editor-help/customize-blocks.native.js +0 -40
- package/src/components/editor-help/help-detail-navigation-screen.native.js +0 -67
- package/src/components/editor-help/help-get-support-button.native.js +0 -38
- package/src/components/editor-help/help-section-title.native.js +0 -29
- package/src/components/editor-help/help-topic-row.native.js +0 -33
- package/src/components/editor-help/icon-move-blocks.native.js +0 -10
- package/src/components/editor-help/images/add-dark.png +0 -0
- package/src/components/editor-help/images/add-dark@2x.png +0 -0
- package/src/components/editor-help/images/add-dark@3x.png +0 -0
- package/src/components/editor-help/images/add-light.png +0 -0
- package/src/components/editor-help/images/add-light@2x.png +0 -0
- package/src/components/editor-help/images/add-light@3x.png +0 -0
- package/src/components/editor-help/images/block-layout-collage.png +0 -0
- package/src/components/editor-help/images/block-layout-collage@2x.png +0 -0
- package/src/components/editor-help/images/block-layout-collage@3x.png +0 -0
- package/src/components/editor-help/images/build-layouts-dark.png +0 -0
- package/src/components/editor-help/images/build-layouts-dark@2x.png +0 -0
- package/src/components/editor-help/images/build-layouts-dark@3x.png +0 -0
- package/src/components/editor-help/images/build-layouts-light.png +0 -0
- package/src/components/editor-help/images/build-layouts-light@2x.png +0 -0
- package/src/components/editor-help/images/build-layouts-light@3x.png +0 -0
- package/src/components/editor-help/images/drag-and-drop-dark.png +0 -0
- package/src/components/editor-help/images/drag-and-drop-dark@2x.png +0 -0
- package/src/components/editor-help/images/drag-and-drop-dark@3x.png +0 -0
- package/src/components/editor-help/images/drag-and-drop-light.png +0 -0
- package/src/components/editor-help/images/drag-and-drop-light@2x.png +0 -0
- package/src/components/editor-help/images/drag-and-drop-light@3x.png +0 -0
- package/src/components/editor-help/images/edit-media-dark.png +0 -0
- package/src/components/editor-help/images/edit-media-dark@2x.png +0 -0
- package/src/components/editor-help/images/edit-media-dark@3x.png +0 -0
- package/src/components/editor-help/images/edit-media-light.png +0 -0
- package/src/components/editor-help/images/edit-media-light@2x.png +0 -0
- package/src/components/editor-help/images/edit-media-light@3x.png +0 -0
- package/src/components/editor-help/images/embed-media-dark.png +0 -0
- package/src/components/editor-help/images/embed-media-dark@2x.png +0 -0
- package/src/components/editor-help/images/embed-media-dark@3x.png +0 -0
- package/src/components/editor-help/images/embed-media-light.png +0 -0
- package/src/components/editor-help/images/embed-media-light@2x.png +0 -0
- package/src/components/editor-help/images/embed-media-light@3x.png +0 -0
- package/src/components/editor-help/images/move-dark.png +0 -0
- package/src/components/editor-help/images/move-dark@2x.png +0 -0
- package/src/components/editor-help/images/move-dark@3x.png +0 -0
- package/src/components/editor-help/images/move-light.png +0 -0
- package/src/components/editor-help/images/move-light@2x.png +0 -0
- package/src/components/editor-help/images/move-light@3x.png +0 -0
- package/src/components/editor-help/images/options-dark.png +0 -0
- package/src/components/editor-help/images/options-dark@2x.png +0 -0
- package/src/components/editor-help/images/options-dark@3x.png +0 -0
- package/src/components/editor-help/images/options-light.png +0 -0
- package/src/components/editor-help/images/options-light@2x.png +0 -0
- package/src/components/editor-help/images/options-light@3x.png +0 -0
- package/src/components/editor-help/images/rich-text-dark.png +0 -0
- package/src/components/editor-help/images/rich-text-dark@2x.png +0 -0
- package/src/components/editor-help/images/rich-text-dark@3x.png +0 -0
- package/src/components/editor-help/images/rich-text-light.png +0 -0
- package/src/components/editor-help/images/rich-text-light@2x.png +0 -0
- package/src/components/editor-help/images/rich-text-light@3x.png +0 -0
- package/src/components/editor-help/images/settings-dark.png +0 -0
- package/src/components/editor-help/images/settings-dark@2x.png +0 -0
- package/src/components/editor-help/images/settings-dark@3x.png +0 -0
- package/src/components/editor-help/images/settings-light.png +0 -0
- package/src/components/editor-help/images/settings-light@2x.png +0 -0
- package/src/components/editor-help/images/settings-light@3x.png +0 -0
- package/src/components/editor-help/index.native.js +0 -208
- package/src/components/editor-help/intro-to-blocks.native.js +0 -91
- package/src/components/editor-help/move-blocks.native.js +0 -55
- package/src/components/editor-help/remove-blocks.native.js +0 -35
- package/src/components/editor-help/style.android.scss +0 -6
- package/src/components/editor-help/style.ios.scss +0 -6
- package/src/components/editor-help/style.scss +0 -123
- package/src/components/editor-help/test/index.native.js +0 -81
- package/src/components/editor-help/view-sections.native.js +0 -79
- package/src/components/error-boundary/index.native.js +0 -192
- package/src/components/error-boundary/style.native.scss +0 -116
- package/src/components/index.native.js +0 -15
- package/src/components/offline-status/index.native.js +0 -99
- package/src/components/offline-status/style.native.scss +0 -28
- package/src/components/offline-status/test/index.native.js +0 -108
- package/src/components/post-revisions-panel/index.js +0 -161
- package/src/components/post-revisions-panel/style.scss +0 -16
- package/src/components/post-title/index.native.js +0 -282
- package/src/components/post-title/style.native.scss +0 -13
- package/src/components/post-title/test/__snapshots__/index.native.js.snap +0 -25
- package/src/components/post-title/test/index.native.js +0 -78
- package/src/components/provider/index.native.js +0 -497
- package/src/components/provider/use-block-editor-settings.native.js +0 -48
- package/src/components/revision-author-panel/index.js +0 -36
- package/src/components/revision-created-panel/index.js +0 -36
- package/src/components/template-part-menu-items/index.native.js +0 -3
- package/src/hooks/index.native.js +0 -0
- package/src/index.native.js +0 -16
- package/src/private-apis.native.js +0 -33
- package/src/store/actions.native.js +0 -27
- package/src/store/reducer.native.js +0 -94
- package/src/store/selectors.native.js +0 -57
- package/src/store/test/actions.native.js +0 -16
- package/src/store/test/reducer.native.js +0 -36
- package/src/store/test/selectors.native.js +0 -28
- package/src/utils/index.native.js +0 -6
- package/src/utils/media-sideload/index.native.js +0 -1
- package/src/utils/media-upload/index.native.js +0 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { useSelect, useDispatch } from '@wordpress/data';
|
|
5
|
+
import { store as coreStore } from '@wordpress/core-data';
|
|
6
|
+
import { DataViewsPicker, filterSortAndPaginate } from '@wordpress/dataviews';
|
|
7
|
+
import { dateI18n, getDate, humanTimeDiff, getSettings } from '@wordpress/date';
|
|
8
|
+
import { useCallback, useEffect, useMemo, useState } from '@wordpress/element';
|
|
9
|
+
import { __ } from '@wordpress/i18n';
|
|
10
|
+
import { authorField } from '@wordpress/fields';
|
|
11
|
+
import { Text } from '@wordpress/ui';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Internal dependencies
|
|
15
|
+
*/
|
|
16
|
+
import { store as editorStore } from '../../store';
|
|
17
|
+
import { unlock } from '../../lock-unlock';
|
|
18
|
+
import { PostContentInformationUI } from '../post-content-information';
|
|
19
|
+
|
|
20
|
+
const PAGE_SIZE = 10;
|
|
21
|
+
const EMPTY_ARRAY = [];
|
|
22
|
+
const defaultLayouts = { pickerActivity: true };
|
|
23
|
+
const baseView = {
|
|
24
|
+
type: 'pickerActivity',
|
|
25
|
+
titleField: 'date',
|
|
26
|
+
descriptionField: 'details',
|
|
27
|
+
fields: [ 'author' ],
|
|
28
|
+
layout: { density: 'compact' },
|
|
29
|
+
page: 1,
|
|
30
|
+
perPage: PAGE_SIZE,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const DAY_IN_MILLISECONDS = 86400000;
|
|
34
|
+
|
|
35
|
+
function getDisplayDate( value ) {
|
|
36
|
+
const dateNowInMs = getDate( null ).getTime();
|
|
37
|
+
const date = getDate( value ?? null );
|
|
38
|
+
return dateNowInMs - date.getTime() > DAY_IN_MILLISECONDS
|
|
39
|
+
? dateI18n( getSettings().formats.datetimeAbbreviated, date )
|
|
40
|
+
: humanTimeDiff( date );
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default function PostRevisionsTimeline() {
|
|
44
|
+
const { setCurrentRevisionId } = unlock( useDispatch( editorStore ) );
|
|
45
|
+
const [ view, setView ] = useState( baseView );
|
|
46
|
+
|
|
47
|
+
const { revisions, revisionKey, currentRevisionId, currentRevision } =
|
|
48
|
+
useSelect( ( select ) => {
|
|
49
|
+
const { getCurrentPostType } = select( editorStore );
|
|
50
|
+
const {
|
|
51
|
+
getCurrentRevisionId: _getCurrentRevisionId,
|
|
52
|
+
getCurrentRevision,
|
|
53
|
+
getRevisionPage,
|
|
54
|
+
getPageRevisions,
|
|
55
|
+
} = unlock( select( editorStore ) );
|
|
56
|
+
const { getEntityConfig } = select( coreStore );
|
|
57
|
+
|
|
58
|
+
const _postType = getCurrentPostType();
|
|
59
|
+
const entityConfig = getEntityConfig( 'postType', _postType );
|
|
60
|
+
const _revisionKey = entityConfig?.revisionKey || 'id';
|
|
61
|
+
const _currentRevisionId = _getCurrentRevisionId();
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
// Same desc-ordered window the header slider renders (warm cache).
|
|
65
|
+
revisions: getPageRevisions( getRevisionPage() ),
|
|
66
|
+
revisionKey: _revisionKey,
|
|
67
|
+
currentRevisionId: _currentRevisionId,
|
|
68
|
+
currentRevision: _currentRevisionId
|
|
69
|
+
? getCurrentRevision()
|
|
70
|
+
: undefined,
|
|
71
|
+
};
|
|
72
|
+
}, [] );
|
|
73
|
+
|
|
74
|
+
const postContent = currentRevision?.content?.raw;
|
|
75
|
+
|
|
76
|
+
const isLoading = ! revisions;
|
|
77
|
+
|
|
78
|
+
const fields = useMemo(
|
|
79
|
+
() => [
|
|
80
|
+
{
|
|
81
|
+
id: 'date',
|
|
82
|
+
label: __( 'Date' ),
|
|
83
|
+
// Return the humanized label the row renders so the picker
|
|
84
|
+
// option's accessible name announces e.g. "5 minutes ago"
|
|
85
|
+
// instead of the raw ISO timestamp.
|
|
86
|
+
getValue: ( { item } ) => getDisplayDate( item.date ),
|
|
87
|
+
render: ( { item } ) => (
|
|
88
|
+
<Text
|
|
89
|
+
variant="heading-sm"
|
|
90
|
+
render={ <time dateTime={ item.date } /> }
|
|
91
|
+
>
|
|
92
|
+
{ getDisplayDate( item.date ) }
|
|
93
|
+
</Text>
|
|
94
|
+
),
|
|
95
|
+
enableSorting: false,
|
|
96
|
+
enableHiding: false,
|
|
97
|
+
},
|
|
98
|
+
authorField,
|
|
99
|
+
{
|
|
100
|
+
id: 'details',
|
|
101
|
+
label: __( 'Details' ),
|
|
102
|
+
render: ( { item } ) => {
|
|
103
|
+
if (
|
|
104
|
+
String( item[ revisionKey ] ) !==
|
|
105
|
+
String( currentRevisionId )
|
|
106
|
+
) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
return (
|
|
110
|
+
<PostContentInformationUI postContent={ postContent } />
|
|
111
|
+
);
|
|
112
|
+
},
|
|
113
|
+
enableSorting: false,
|
|
114
|
+
enableHiding: false,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
[ revisionKey, currentRevisionId, postContent ]
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const { data: shownRevisions, paginationInfo } = useMemo(
|
|
121
|
+
() => filterSortAndPaginate( revisions || EMPTY_ARRAY, view, fields ),
|
|
122
|
+
[ revisions, view, fields ]
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Keep the selected revision visible: when it changes (e.g. the slider
|
|
126
|
+
// scrubs), jump to the client-side page that contains it. Keyed on the
|
|
127
|
+
// selection/data, not view.page, so manual paging stays free browsing.
|
|
128
|
+
useEffect( () => {
|
|
129
|
+
if ( ! currentRevisionId || ! revisions ) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const index = revisions.findIndex(
|
|
133
|
+
( r ) => String( r[ revisionKey ] ) === String( currentRevisionId )
|
|
134
|
+
);
|
|
135
|
+
if ( index < 0 ) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const page = Math.floor( index / view.perPage ) + 1;
|
|
139
|
+
setView( ( v ) => ( v.page === page ? v : { ...v, page } ) );
|
|
140
|
+
}, [ currentRevisionId, revisions, revisionKey, view.perPage ] );
|
|
141
|
+
|
|
142
|
+
const selection = useMemo(
|
|
143
|
+
() =>
|
|
144
|
+
currentRevisionId ? [ String( currentRevisionId ) ] : EMPTY_ARRAY,
|
|
145
|
+
[ currentRevisionId ]
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
const onChangeSelection = useCallback(
|
|
149
|
+
( newSelection ) => {
|
|
150
|
+
// Revisions mode always keeps one revision selected. Clicking the
|
|
151
|
+
// active revision yields an empty selection, which we ignore so the
|
|
152
|
+
// timeline never ends up with nothing selected.
|
|
153
|
+
if ( newSelection.length === 0 ) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const selectedId = newSelection[ newSelection.length - 1 ];
|
|
157
|
+
setCurrentRevisionId( Number( selectedId ) );
|
|
158
|
+
},
|
|
159
|
+
[ setCurrentRevisionId ]
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
const getItemId = useCallback(
|
|
163
|
+
( item ) => String( item[ revisionKey ] ),
|
|
164
|
+
[ revisionKey ]
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<div className="editor-post-revisions-timeline">
|
|
169
|
+
<DataViewsPicker
|
|
170
|
+
view={ view }
|
|
171
|
+
onChangeView={ setView }
|
|
172
|
+
fields={ fields }
|
|
173
|
+
data={ shownRevisions }
|
|
174
|
+
isLoading={ isLoading }
|
|
175
|
+
paginationInfo={ paginationInfo }
|
|
176
|
+
defaultLayouts={ defaultLayouts }
|
|
177
|
+
getItemId={ getItemId }
|
|
178
|
+
selection={ selection }
|
|
179
|
+
onChangeSelection={ onChangeSelection }
|
|
180
|
+
>
|
|
181
|
+
<DataViewsPicker.Layout />
|
|
182
|
+
<DataViewsPicker.Footer />
|
|
183
|
+
</DataViewsPicker>
|
|
184
|
+
</div>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Give the revisions inspector a bounded height so the timeline scrolls
|
|
2
|
+
// internally and the picker's pagination stays pinned to the bottom.
|
|
3
|
+
//
|
|
4
|
+
// The timeline only renders in revisions mode, so its ancestors are scoped
|
|
5
|
+
// with `:has()` — keeping this layout out of the generic editor sidebar.
|
|
6
|
+
.interface-complementary-area:has(.editor-post-revisions-timeline) {
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
overflow: hidden;
|
|
10
|
+
|
|
11
|
+
// The tabs header keeps its natural height.
|
|
12
|
+
.editor-sidebar__panel-tabs {
|
|
13
|
+
flex-shrink: 0;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.editor-sidebar__panel:has(.editor-post-revisions-timeline) {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
flex: 1;
|
|
21
|
+
min-height: 0;
|
|
22
|
+
|
|
23
|
+
// The document tab panel hands its bounded height down to the timeline.
|
|
24
|
+
[role="tabpanel"]:has(.editor-post-revisions-timeline) {
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
flex: 1;
|
|
28
|
+
min-height: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Cap only the post-meta diff content so a large
|
|
32
|
+
// diff (e.g. footnotes) can't dominate the column.
|
|
33
|
+
.editor-revision-meta-diff__content {
|
|
34
|
+
max-height: 80px;
|
|
35
|
+
overflow-y: auto;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// timeline grows to fill the leftover space and scrolls internally.
|
|
39
|
+
.editor-post-revisions-timeline {
|
|
40
|
+
flex: 1;
|
|
41
|
+
min-height: 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -46,6 +46,7 @@ export default function PostSavedState( { forceIsDirty } ) {
|
|
|
46
46
|
isSaveable,
|
|
47
47
|
isSaving,
|
|
48
48
|
isSavingLocked,
|
|
49
|
+
isSavingNonPostEntityChanges,
|
|
49
50
|
isScheduled,
|
|
50
51
|
hasPublishAction,
|
|
51
52
|
showIconLabels,
|
|
@@ -54,35 +55,25 @@ export default function PostSavedState( { forceIsDirty } ) {
|
|
|
54
55
|
postType,
|
|
55
56
|
} = useSelect(
|
|
56
57
|
( select ) => {
|
|
57
|
-
const
|
|
58
|
-
isEditedPostNew,
|
|
59
|
-
isCurrentPostPublished,
|
|
60
|
-
isCurrentPostScheduled,
|
|
61
|
-
isEditedPostDirty,
|
|
62
|
-
isSavingPost,
|
|
63
|
-
isEditedPostSaveable,
|
|
64
|
-
isPostSavingLocked,
|
|
65
|
-
getCurrentPost,
|
|
66
|
-
isAutosavingPost,
|
|
67
|
-
getEditedPostAttribute,
|
|
68
|
-
getPostEdits,
|
|
69
|
-
} = select( editorStore );
|
|
58
|
+
const store = select( editorStore );
|
|
70
59
|
const { get } = select( preferencesStore );
|
|
71
60
|
return {
|
|
72
|
-
isAutosaving: isAutosavingPost(),
|
|
73
|
-
isDirty: forceIsDirty || isEditedPostDirty(),
|
|
74
|
-
isNew: isEditedPostNew(),
|
|
75
|
-
isPublished: isCurrentPostPublished(),
|
|
76
|
-
isSaving: isSavingPost(),
|
|
77
|
-
isSaveable: isEditedPostSaveable(),
|
|
78
|
-
isSavingLocked: isPostSavingLocked(),
|
|
79
|
-
|
|
61
|
+
isAutosaving: store.isAutosavingPost(),
|
|
62
|
+
isDirty: forceIsDirty || store.isEditedPostDirty(),
|
|
63
|
+
isNew: store.isEditedPostNew(),
|
|
64
|
+
isPublished: store.isCurrentPostPublished(),
|
|
65
|
+
isSaving: store.isSavingPost(),
|
|
66
|
+
isSaveable: store.isEditedPostSaveable(),
|
|
67
|
+
isSavingLocked: store.isPostSavingLocked(),
|
|
68
|
+
isSavingNonPostEntityChanges:
|
|
69
|
+
store.isSavingNonPostEntityChanges(),
|
|
70
|
+
isScheduled: store.isCurrentPostScheduled(),
|
|
80
71
|
hasPublishAction:
|
|
81
|
-
getCurrentPost()?._links?.[ 'wp:action-publish' ]
|
|
72
|
+
!! store.getCurrentPost()?._links?.[ 'wp:action-publish' ],
|
|
82
73
|
showIconLabels: get( 'core', 'showIconLabels' ),
|
|
83
|
-
postStatus: getEditedPostAttribute( 'status' ),
|
|
84
|
-
postStatusHasChanged: !! getPostEdits()?.status,
|
|
85
|
-
postType:
|
|
74
|
+
postStatus: store.getEditedPostAttribute( 'status' ),
|
|
75
|
+
postStatusHasChanged: !! store.getPostEdits()?.status,
|
|
76
|
+
postType: store.getCurrentPostType(),
|
|
86
77
|
};
|
|
87
78
|
},
|
|
88
79
|
[ forceIsDirty ]
|
|
@@ -143,7 +134,13 @@ export default function PostSavedState( { forceIsDirty } ) {
|
|
|
143
134
|
|
|
144
135
|
const isSaved = forceSavedMessage || ( ! isNew && ! isDirty );
|
|
145
136
|
const isSavedState = isSaving || isSaved;
|
|
146
|
-
const isDisabled =
|
|
137
|
+
const isDisabled =
|
|
138
|
+
isSaving ||
|
|
139
|
+
isSaved ||
|
|
140
|
+
! isSaveable ||
|
|
141
|
+
isSavingLocked ||
|
|
142
|
+
// Disable while a non-post entity (e.g. a newly created term) is mid-save.
|
|
143
|
+
isSavingNonPostEntityChanges;
|
|
147
144
|
let text;
|
|
148
145
|
|
|
149
146
|
if ( isSaving ) {
|
|
@@ -71,6 +71,24 @@ describe( 'PostSavedState', () => {
|
|
|
71
71
|
expect( screen.getByRole( 'button' ) ).toMatchSnapshot();
|
|
72
72
|
} );
|
|
73
73
|
|
|
74
|
+
it( 'returns a disabled button while a non-post entity is being saved', () => {
|
|
75
|
+
useSelect.mockImplementation( () => ( {
|
|
76
|
+
isDirty: true,
|
|
77
|
+
isNew: false,
|
|
78
|
+
isSaveable: true,
|
|
79
|
+
isSaving: false,
|
|
80
|
+
isSavingNonPostEntityChanges: true,
|
|
81
|
+
postStatus: 'draft',
|
|
82
|
+
} ) );
|
|
83
|
+
|
|
84
|
+
render( <PostSavedState /> );
|
|
85
|
+
|
|
86
|
+
expect( screen.getByRole( 'button' ) ).toHaveAttribute(
|
|
87
|
+
'aria-disabled',
|
|
88
|
+
'true'
|
|
89
|
+
);
|
|
90
|
+
} );
|
|
91
|
+
|
|
74
92
|
it( 'should return Saved text if not new and not dirty', () => {
|
|
75
93
|
useSelect.mockImplementation( () => ( {
|
|
76
94
|
isDirty: false,
|
|
@@ -3,11 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { __, _x, sprintf } from '@wordpress/i18n';
|
|
5
5
|
import { useEffect, useMemo, useState } from '@wordpress/element';
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
withFilters,
|
|
9
|
-
__experimentalVStack as VStack,
|
|
10
|
-
} from '@wordpress/components';
|
|
6
|
+
import { FormTokenField, withFilters } from '@wordpress/components';
|
|
7
|
+
import { Stack } from '@wordpress/ui';
|
|
11
8
|
import { useSelect, useDispatch } from '@wordpress/data';
|
|
12
9
|
import { store as coreStore } from '@wordpress/core-data';
|
|
13
10
|
import { useDebounce } from '@wordpress/compose';
|
|
@@ -280,7 +277,7 @@ export function FlatTermSelector( { slug } ) {
|
|
|
280
277
|
);
|
|
281
278
|
|
|
282
279
|
return (
|
|
283
|
-
<
|
|
280
|
+
<Stack direction="column" gap="lg">
|
|
284
281
|
<FormTokenField
|
|
285
282
|
__next40pxDefaultSize
|
|
286
283
|
value={ values }
|
|
@@ -296,7 +293,7 @@ export function FlatTermSelector( { slug } ) {
|
|
|
296
293
|
} }
|
|
297
294
|
/>
|
|
298
295
|
<MostUsedTerms taxonomy={ taxonomy } onSelect={ appendTerm } />
|
|
299
|
-
</
|
|
296
|
+
</Stack>
|
|
300
297
|
);
|
|
301
298
|
}
|
|
302
299
|
|
|
@@ -6,6 +6,7 @@ import Textarea from 'react-autosize-textarea';
|
|
|
6
6
|
/**
|
|
7
7
|
* WordPress dependencies
|
|
8
8
|
*/
|
|
9
|
+
import { useLayoutEffect, useRef } from '@wordpress/element';
|
|
9
10
|
import { __ } from '@wordpress/i18n';
|
|
10
11
|
import { store as coreStore } from '@wordpress/core-data';
|
|
11
12
|
import { useDispatch, useSelect } from '@wordpress/data';
|
|
@@ -16,6 +17,7 @@ import { VisuallyHidden } from '@wordpress/ui';
|
|
|
16
17
|
* Internal dependencies
|
|
17
18
|
*/
|
|
18
19
|
import { store as editorStore } from '../../store';
|
|
20
|
+
import { adjustPosition, getDiff } from './utils';
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
23
|
* Displays the Post Text Editor along with content in Visual and Text mode.
|
|
@@ -24,6 +26,9 @@ import { store as editorStore } from '../../store';
|
|
|
24
26
|
*/
|
|
25
27
|
export default function PostTextEditor() {
|
|
26
28
|
const instanceId = useInstanceId( PostTextEditor );
|
|
29
|
+
const textareaRef = useRef();
|
|
30
|
+
const previousValueRef = useRef();
|
|
31
|
+
const selectionRef = useRef();
|
|
27
32
|
const { value, type, id } = useSelect( ( select ) => {
|
|
28
33
|
const { getCurrentPostType, getCurrentPostId, getEditedPostContent } =
|
|
29
34
|
select( editorStore );
|
|
@@ -35,6 +40,58 @@ export default function PostTextEditor() {
|
|
|
35
40
|
}, [] );
|
|
36
41
|
const { editEntityRecord } = useDispatch( coreStore );
|
|
37
42
|
|
|
43
|
+
useLayoutEffect( () => {
|
|
44
|
+
const textarea = textareaRef.current;
|
|
45
|
+
const previousValue = previousValueRef.current;
|
|
46
|
+
previousValueRef.current = value;
|
|
47
|
+
|
|
48
|
+
if (
|
|
49
|
+
! textarea ||
|
|
50
|
+
previousValue === undefined ||
|
|
51
|
+
previousValue === value ||
|
|
52
|
+
! selectionRef.current
|
|
53
|
+
) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const { selectionStart, selectionEnd, selectionDirection } =
|
|
58
|
+
selectionRef.current;
|
|
59
|
+
const changes = getDiff( previousValue, value );
|
|
60
|
+
const adjustedSelectionStart = adjustPosition(
|
|
61
|
+
selectionStart,
|
|
62
|
+
changes,
|
|
63
|
+
previousValue,
|
|
64
|
+
value
|
|
65
|
+
);
|
|
66
|
+
const adjustedSelectionEnd = adjustPosition(
|
|
67
|
+
selectionEnd,
|
|
68
|
+
changes,
|
|
69
|
+
previousValue,
|
|
70
|
+
value
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
textarea.setSelectionRange(
|
|
74
|
+
adjustedSelectionStart,
|
|
75
|
+
adjustedSelectionEnd,
|
|
76
|
+
selectionDirection
|
|
77
|
+
);
|
|
78
|
+
selectionRef.current = {
|
|
79
|
+
selectionStart: adjustedSelectionStart,
|
|
80
|
+
selectionEnd: adjustedSelectionEnd,
|
|
81
|
+
selectionDirection,
|
|
82
|
+
};
|
|
83
|
+
}, [ value ] );
|
|
84
|
+
|
|
85
|
+
const updateSelection = ( event ) => {
|
|
86
|
+
const { selectionStart, selectionEnd, selectionDirection } =
|
|
87
|
+
event.target;
|
|
88
|
+
selectionRef.current = {
|
|
89
|
+
selectionStart,
|
|
90
|
+
selectionEnd,
|
|
91
|
+
selectionDirection,
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
|
|
38
95
|
return (
|
|
39
96
|
<>
|
|
40
97
|
<VisuallyHidden
|
|
@@ -46,14 +103,22 @@ export default function PostTextEditor() {
|
|
|
46
103
|
<Textarea
|
|
47
104
|
autoComplete="off"
|
|
48
105
|
dir="auto"
|
|
106
|
+
ref={ textareaRef }
|
|
49
107
|
value={ value }
|
|
50
108
|
onChange={ ( event ) => {
|
|
109
|
+
updateSelection( event );
|
|
110
|
+
previousValueRef.current = event.target.value;
|
|
51
111
|
editEntityRecord( 'postType', type, id, {
|
|
52
112
|
content: event.target.value,
|
|
53
113
|
blocks: undefined,
|
|
54
114
|
selection: undefined,
|
|
55
115
|
} );
|
|
56
116
|
} }
|
|
117
|
+
onFocus={ updateSelection }
|
|
118
|
+
// A click or arrow-key caret move does not fire `select` (only
|
|
119
|
+
// range selections do), so track those moves via mouseup/keyup.
|
|
120
|
+
onMouseUp={ updateSelection }
|
|
121
|
+
onKeyUp={ updateSelection }
|
|
57
122
|
className="editor-post-text-editor"
|
|
58
123
|
id={ `post-content-${ instanceId }` }
|
|
59
124
|
placeholder={ __( 'Start writing with text or HTML' ) }
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { getAdjustedCursorPosition } from '../utils';
|
|
5
|
+
|
|
6
|
+
describe( 'PostTextEditor', () => {
|
|
7
|
+
describe( 'getAdjustedCursorPosition', () => {
|
|
8
|
+
it( 'keeps the cursor in place when text is inserted after it', () => {
|
|
9
|
+
expect(
|
|
10
|
+
getAdjustedCursorPosition( 3, 'foo bar', 'foo bar baz' )
|
|
11
|
+
).toBe( 3 );
|
|
12
|
+
} );
|
|
13
|
+
|
|
14
|
+
it( 'moves the cursor when text is inserted before it', () => {
|
|
15
|
+
expect( getAdjustedCursorPosition( 4, 'abcd', 'abXYcd' ) ).toBe(
|
|
16
|
+
6
|
|
17
|
+
);
|
|
18
|
+
} );
|
|
19
|
+
|
|
20
|
+
it( 'moves the cursor when text is deleted before it', () => {
|
|
21
|
+
expect( getAdjustedCursorPosition( 6, 'abcdef', 'abef' ) ).toBe(
|
|
22
|
+
4
|
|
23
|
+
);
|
|
24
|
+
} );
|
|
25
|
+
|
|
26
|
+
it( 'moves the cursor to the end of a replacement around it', () => {
|
|
27
|
+
expect( getAdjustedCursorPosition( 3, 'abcdef', 'abXYef' ) ).toBe(
|
|
28
|
+
4
|
|
29
|
+
);
|
|
30
|
+
} );
|
|
31
|
+
|
|
32
|
+
it( 'handles multiple separated changes in one update', () => {
|
|
33
|
+
expect(
|
|
34
|
+
getAdjustedCursorPosition( 7, 'abcdefghij', 'abXXcdefYYghij' )
|
|
35
|
+
).toBe( 11 );
|
|
36
|
+
} );
|
|
37
|
+
|
|
38
|
+
it( 'keeps the cursor in place when large text is inserted after it', () => {
|
|
39
|
+
const oldValue = `cursor\n${ 'a\n'.repeat( 6000 ) }`;
|
|
40
|
+
const newValue = `${ oldValue }remote\n`;
|
|
41
|
+
|
|
42
|
+
expect(
|
|
43
|
+
getAdjustedCursorPosition( 'cursor'.length, oldValue, newValue )
|
|
44
|
+
).toBe( 'cursor'.length );
|
|
45
|
+
} );
|
|
46
|
+
|
|
47
|
+
it( 'moves the cursor when large text is inserted before it', () => {
|
|
48
|
+
const oldValue = `cursor\n${ 'a\n'.repeat( 6000 ) }`;
|
|
49
|
+
const newValue = `remote\n${ oldValue }`;
|
|
50
|
+
|
|
51
|
+
expect(
|
|
52
|
+
getAdjustedCursorPosition( 'cursor'.length, oldValue, newValue )
|
|
53
|
+
).toBe( 'remote\n'.length + 'cursor'.length );
|
|
54
|
+
} );
|
|
55
|
+
|
|
56
|
+
it( 'moves the cursor when large text is deleted before it', () => {
|
|
57
|
+
const deletedPrefix = 'remote\n';
|
|
58
|
+
const newValue = `cursor\n${ 'a\n'.repeat( 6000 ) }`;
|
|
59
|
+
const oldValue = `${ deletedPrefix }${ newValue }`;
|
|
60
|
+
const position = deletedPrefix.length + 'cursor'.length;
|
|
61
|
+
|
|
62
|
+
expect(
|
|
63
|
+
getAdjustedCursorPosition( position, oldValue, newValue )
|
|
64
|
+
).toBe( 'cursor'.length );
|
|
65
|
+
} );
|
|
66
|
+
|
|
67
|
+
it( 'moves the cursor when large single-line HTML is inserted before it', () => {
|
|
68
|
+
const opening = '<!-- wp:paragraph -->\n<p>';
|
|
69
|
+
const closing = '</p>\n<!-- /wp:paragraph -->';
|
|
70
|
+
const content = 'a'.repeat( 120000 );
|
|
71
|
+
const insertedText = 'remote';
|
|
72
|
+
const tailText = 'tail';
|
|
73
|
+
const oldValue = `${ opening }${ content }${ closing }`;
|
|
74
|
+
const newValue = `${ opening }${ insertedText }${ content.slice(
|
|
75
|
+
0,
|
|
76
|
+
100000
|
|
77
|
+
) }${ tailText }${ content.slice( 100000 ) }${ closing }`;
|
|
78
|
+
const position = opening.length + 60000;
|
|
79
|
+
|
|
80
|
+
expect(
|
|
81
|
+
getAdjustedCursorPosition( position, oldValue, newValue )
|
|
82
|
+
).toBe( position + insertedText.length );
|
|
83
|
+
} );
|
|
84
|
+
|
|
85
|
+
it( 'moves the cursor when large single-line HTML is deleted before it', () => {
|
|
86
|
+
const opening = '<!-- wp:paragraph -->\n<p>';
|
|
87
|
+
const closing = '</p>\n<!-- /wp:paragraph -->';
|
|
88
|
+
const deletedText = 'remote'.repeat( 1000 );
|
|
89
|
+
const deletedTailText = 'tail';
|
|
90
|
+
const content = 'a'.repeat( 120000 );
|
|
91
|
+
const newValue = `${ opening }${ content }${ closing }`;
|
|
92
|
+
const oldValue = `${ opening }${ deletedText }${ content.slice(
|
|
93
|
+
0,
|
|
94
|
+
100000
|
|
95
|
+
) }${ deletedTailText }${ content.slice( 100000 ) }${ closing }`;
|
|
96
|
+
const position = opening.length + deletedText.length + 60000;
|
|
97
|
+
|
|
98
|
+
expect(
|
|
99
|
+
getAdjustedCursorPosition( position, oldValue, newValue )
|
|
100
|
+
).toBe( position - deletedText.length );
|
|
101
|
+
} );
|
|
102
|
+
|
|
103
|
+
it( 'keeps the cursor in an unchanged same-line prefix before a large replacement', () => {
|
|
104
|
+
const prefix = `${ 'a'.repeat( 300 ) }\n${ 'b'.repeat( 199 ) }`;
|
|
105
|
+
const suffix = 'tail';
|
|
106
|
+
const oldValue = `${ prefix }old${ 'x'.repeat(
|
|
107
|
+
11000
|
|
108
|
+
) }${ suffix }`;
|
|
109
|
+
const newValue = `${ prefix }new${ 'y'.repeat(
|
|
110
|
+
11000
|
|
111
|
+
) }${ suffix }`;
|
|
112
|
+
const position = 450;
|
|
113
|
+
|
|
114
|
+
expect(
|
|
115
|
+
getAdjustedCursorPosition( position, oldValue, newValue )
|
|
116
|
+
).toBe( position );
|
|
117
|
+
} );
|
|
118
|
+
|
|
119
|
+
it( 'moves the cursor when large same-line text is inserted before it and replaced after it', () => {
|
|
120
|
+
const opening = '<!-- wp:paragraph -->\n<p>';
|
|
121
|
+
const closing = '</p>\n<!-- /wp:paragraph -->';
|
|
122
|
+
const content = 'a'.repeat( 120000 );
|
|
123
|
+
const insertedText = 'remote';
|
|
124
|
+
const oldValue = `${ opening }${ content }${ closing }`;
|
|
125
|
+
const newValue = `${ opening }${ content.slice(
|
|
126
|
+
0,
|
|
127
|
+
50000
|
|
128
|
+
) }${ insertedText }${ content.slice(
|
|
129
|
+
50000,
|
|
130
|
+
100000
|
|
131
|
+
) }b${ content.slice( 100001 ) }${ closing }`;
|
|
132
|
+
const position = opening.length + 60000;
|
|
133
|
+
|
|
134
|
+
expect(
|
|
135
|
+
getAdjustedCursorPosition( position, oldValue, newValue )
|
|
136
|
+
).toBe( position + insertedText.length );
|
|
137
|
+
} );
|
|
138
|
+
|
|
139
|
+
it( 'moves the cursor when large same-line text is deleted before it and inserted after it', () => {
|
|
140
|
+
const opening = '<!-- wp:paragraph -->\n<p>';
|
|
141
|
+
const closing = '</p>\n<!-- /wp:paragraph -->';
|
|
142
|
+
const content = 'a'.repeat( 120000 );
|
|
143
|
+
const deletedText = 'remote'.repeat( 1000 );
|
|
144
|
+
const insertedTailText = 'tail';
|
|
145
|
+
const commonTextBeforeCursor = 500;
|
|
146
|
+
const oldValue = `${ opening }${ content.slice(
|
|
147
|
+
0,
|
|
148
|
+
50000
|
|
149
|
+
) }${ deletedText }${ content.slice( 50000 ) }${ closing }`;
|
|
150
|
+
const newValue = `${ opening }${ content.slice(
|
|
151
|
+
0,
|
|
152
|
+
100000
|
|
153
|
+
) }${ insertedTailText }${ content.slice( 100000 ) }${ closing }`;
|
|
154
|
+
const position =
|
|
155
|
+
opening.length +
|
|
156
|
+
50000 +
|
|
157
|
+
deletedText.length +
|
|
158
|
+
commonTextBeforeCursor;
|
|
159
|
+
|
|
160
|
+
expect(
|
|
161
|
+
getAdjustedCursorPosition( position, oldValue, newValue )
|
|
162
|
+
).toBe( position - deletedText.length );
|
|
163
|
+
} );
|
|
164
|
+
|
|
165
|
+
it( 'maps the cursor through a pure insertion in a large single line', () => {
|
|
166
|
+
// "HEAD"/"TAIL" wrap the unchanged content, so the new value contains
|
|
167
|
+
// the old changed window and it routes through the line-diff fallback.
|
|
168
|
+
const opening = '<!-- wp:paragraph -->\n<p>';
|
|
169
|
+
const closing = '</p>\n<!-- /wp:paragraph -->';
|
|
170
|
+
const content = 'a'.repeat( 120000 );
|
|
171
|
+
const oldValue = `${ opening }${ content }${ closing }`;
|
|
172
|
+
const newValue = `${ opening }HEAD${ content }TAIL${ closing }`;
|
|
173
|
+
const position = opening.length + 60000;
|
|
174
|
+
|
|
175
|
+
expect(
|
|
176
|
+
getAdjustedCursorPosition( position, oldValue, newValue )
|
|
177
|
+
).toBe( position + 'HEAD'.length );
|
|
178
|
+
} );
|
|
179
|
+
|
|
180
|
+
it( 'maps the cursor through a pure deletion in a large single line', () => {
|
|
181
|
+
const opening = '<!-- wp:paragraph -->\n<p>';
|
|
182
|
+
const closing = '</p>\n<!-- /wp:paragraph -->';
|
|
183
|
+
const content = 'a'.repeat( 120000 );
|
|
184
|
+
const oldValue = `${ opening }HEAD${ content }TAIL${ closing }`;
|
|
185
|
+
const newValue = `${ opening }${ content }${ closing }`;
|
|
186
|
+
const position = opening.length + 'HEAD'.length + 60000;
|
|
187
|
+
|
|
188
|
+
expect(
|
|
189
|
+
getAdjustedCursorPosition( position, oldValue, newValue )
|
|
190
|
+
).toBe( position - 'HEAD'.length );
|
|
191
|
+
} );
|
|
192
|
+
|
|
193
|
+
it( 'handles a large fully-divergent replacement without blocking', () => {
|
|
194
|
+
// Neither side contains the other and the changed window exceeds the
|
|
195
|
+
// diffChars threshold, so this routes to the line-diff fallback. A
|
|
196
|
+
// character diff here would be O(n^2) and freeze the main thread for
|
|
197
|
+
// seconds; completing within the test timeout guards that path.
|
|
198
|
+
const oldValue = 'a'.repeat( 8000 );
|
|
199
|
+
const newValue = 'b'.repeat( 8000 );
|
|
200
|
+
const result = getAdjustedCursorPosition(
|
|
201
|
+
4000,
|
|
202
|
+
oldValue,
|
|
203
|
+
newValue
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
expect( result ).toBeGreaterThanOrEqual( 0 );
|
|
207
|
+
expect( result ).toBeLessThanOrEqual( newValue.length );
|
|
208
|
+
} );
|
|
209
|
+
} );
|
|
210
|
+
} );
|