@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,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { useSelect, useDispatch } from '@wordpress/data';
|
|
5
|
+
import { useEffect, useMemo, useRef, useState } from '@wordpress/element';
|
|
6
|
+
import { __, sprintf } from '@wordpress/i18n';
|
|
7
|
+
import { speak } from '@wordpress/a11y';
|
|
8
|
+
import { store as uploadStore } from '@wordpress/upload-media';
|
|
9
|
+
import { store as noticesStore } from '@wordpress/notices';
|
|
10
|
+
import { Icon as WCIcon, Spinner } from '@wordpress/components';
|
|
11
|
+
import { check } from '@wordpress/icons';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Internal dependencies
|
|
15
|
+
*/
|
|
16
|
+
import { useTracker } from './tracker';
|
|
17
|
+
|
|
18
|
+
const NOTICE_ID = 'upload-progress';
|
|
19
|
+
|
|
20
|
+
// How long the completion checkmark is shown before the snackbar dismisses.
|
|
21
|
+
const COMPLETION_DISPLAY_MS = 3000;
|
|
22
|
+
|
|
23
|
+
// Longest filename shown before it is middle-truncated. Long names (e.g. the
|
|
24
|
+
// UUID-style names some sources produce) would otherwise stretch the snackbar.
|
|
25
|
+
const MAX_FILENAME_LENGTH = 40;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Middle-truncates a filename that exceeds `MAX_FILENAME_LENGTH`, keeping the
|
|
29
|
+
* start and the end (so the file extension stays visible).
|
|
30
|
+
*
|
|
31
|
+
* @param {string} filename The filename to truncate.
|
|
32
|
+
* @return {string} The original or middle-truncated filename.
|
|
33
|
+
*/
|
|
34
|
+
function truncateFilename( filename ) {
|
|
35
|
+
if ( filename.length <= MAX_FILENAME_LENGTH ) {
|
|
36
|
+
return filename;
|
|
37
|
+
}
|
|
38
|
+
const ellipsis = '…';
|
|
39
|
+
const visible = MAX_FILENAME_LENGTH - ellipsis.length;
|
|
40
|
+
const front = Math.ceil( visible / 2 );
|
|
41
|
+
const back = Math.floor( visible / 2 );
|
|
42
|
+
return (
|
|
43
|
+
filename.slice( 0, front ) +
|
|
44
|
+
ellipsis +
|
|
45
|
+
filename.slice( filename.length - back )
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Exported so the Storybook story can render the exact icon markup the notice
|
|
50
|
+
// uses, keeping the visual review faithful to what ships.
|
|
51
|
+
export const UPLOAD_SPINNER = (
|
|
52
|
+
<span
|
|
53
|
+
className="editor-upload-progress-snackbar__spinner"
|
|
54
|
+
aria-hidden="true"
|
|
55
|
+
>
|
|
56
|
+
<Spinner />
|
|
57
|
+
</span>
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
export const UPLOAD_DONE = (
|
|
61
|
+
<span className="editor-upload-progress-snackbar__check" aria-hidden="true">
|
|
62
|
+
<WCIcon icon={ check } />
|
|
63
|
+
</span>
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Manages a snackbar notice that shows media upload progress while uploads are
|
|
68
|
+
* in progress. It creates/updates a notice via the notices store so that it
|
|
69
|
+
* positions and stacks with every other snackbar in the editor.
|
|
70
|
+
*
|
|
71
|
+
* Reads from two sources to cover both upload paths:
|
|
72
|
+
* - `@wordpress/upload-media` store (client-side media processing path).
|
|
73
|
+
* - An editor-local tracker populated by the traditional `mediaUpload`
|
|
74
|
+
* wrapper (non-CSM path — e.g. Safari, or when a filter disables CSM).
|
|
75
|
+
*
|
|
76
|
+
* Only counts original user-uploaded files (items without a `parentId`),
|
|
77
|
+
* ignoring generated subsizes/thumbnails.
|
|
78
|
+
*
|
|
79
|
+
* @return {null} This component renders nothing — it only manages a notice.
|
|
80
|
+
*/
|
|
81
|
+
export default function UploadProgressSnackbar() {
|
|
82
|
+
const items = useSelect(
|
|
83
|
+
( select ) => select( uploadStore ).getItems(),
|
|
84
|
+
[]
|
|
85
|
+
);
|
|
86
|
+
const tracker = useTracker();
|
|
87
|
+
|
|
88
|
+
// CSM path: originals in the upload-media queue (subsizes excluded). Memoized
|
|
89
|
+
// so its reference is stable across renders where `items` is unchanged, since
|
|
90
|
+
// it's a dependency of the effect below.
|
|
91
|
+
const csmOriginals = useMemo(
|
|
92
|
+
() => items.filter( ( item ) => ! item.parentId ),
|
|
93
|
+
[ items ]
|
|
94
|
+
);
|
|
95
|
+
const csmRemaining = csmOriginals.length;
|
|
96
|
+
|
|
97
|
+
// Non-CSM path: files tracked by the editor's mediaUpload wrapper.
|
|
98
|
+
const trackedRemaining = tracker ? tracker.total - tracker.completed : 0;
|
|
99
|
+
|
|
100
|
+
const remaining = csmRemaining + trackedRemaining;
|
|
101
|
+
|
|
102
|
+
// Track peak total across sources during a session. The CSM queue removes
|
|
103
|
+
// items on completion, and the tracker tops out at its recorded total, so
|
|
104
|
+
// `total` has to be tracked as the high-water mark.
|
|
105
|
+
const [ peak, setPeak ] = useState( 0 );
|
|
106
|
+
const sessionTotal = csmRemaining + ( tracker ? tracker.total : 0 );
|
|
107
|
+
if ( sessionTotal > peak ) {
|
|
108
|
+
setPeak( sessionTotal );
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const { createNotice, removeNotice } = useDispatch( noticesStore );
|
|
112
|
+
|
|
113
|
+
// Track whether the user has dismissed the notice. If so, don't re-create
|
|
114
|
+
// it until the current batch finishes and a new one starts.
|
|
115
|
+
const dismissedRef = useRef( false );
|
|
116
|
+
const wasUploadingRef = useRef( false );
|
|
117
|
+
|
|
118
|
+
// Timeout that removes the completion-state (checkmark) notice after a
|
|
119
|
+
// brief display. Held so a new upload can cancel it.
|
|
120
|
+
const completionTimeoutRef = useRef( null );
|
|
121
|
+
useEffect( () => {
|
|
122
|
+
return () => {
|
|
123
|
+
if ( completionTimeoutRef.current ) {
|
|
124
|
+
clearTimeout( completionTimeoutRef.current );
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}, [] );
|
|
128
|
+
|
|
129
|
+
useEffect( () => {
|
|
130
|
+
const isUploading = remaining > 0;
|
|
131
|
+
|
|
132
|
+
if ( isUploading && ! wasUploadingRef.current ) {
|
|
133
|
+
dismissedRef.current = false;
|
|
134
|
+
speak( __( 'Media upload started' ), 'polite' );
|
|
135
|
+
// A new batch started during the completion display: cancel the
|
|
136
|
+
// pending dismissal so the snackbar transitions straight back
|
|
137
|
+
// into the uploading state, and reset the peak so the new batch
|
|
138
|
+
// counts from `1 of N` rather than resuming the previous total.
|
|
139
|
+
if ( completionTimeoutRef.current ) {
|
|
140
|
+
clearTimeout( completionTimeoutRef.current );
|
|
141
|
+
completionTimeoutRef.current = null;
|
|
142
|
+
setPeak( 0 );
|
|
143
|
+
}
|
|
144
|
+
} else if ( ! isUploading && wasUploadingRef.current ) {
|
|
145
|
+
speak( __( 'Media upload complete' ), 'polite' );
|
|
146
|
+
|
|
147
|
+
if ( ! dismissedRef.current ) {
|
|
148
|
+
createNotice( 'info', __( 'Upload complete' ), {
|
|
149
|
+
id: NOTICE_ID,
|
|
150
|
+
type: 'snackbar',
|
|
151
|
+
isDismissible: false,
|
|
152
|
+
explicitDismiss: false,
|
|
153
|
+
speak: false,
|
|
154
|
+
icon: UPLOAD_DONE,
|
|
155
|
+
onDismiss: () => {
|
|
156
|
+
dismissedRef.current = true;
|
|
157
|
+
},
|
|
158
|
+
} );
|
|
159
|
+
|
|
160
|
+
completionTimeoutRef.current = setTimeout( () => {
|
|
161
|
+
removeNotice( NOTICE_ID );
|
|
162
|
+
completionTimeoutRef.current = null;
|
|
163
|
+
setPeak( 0 );
|
|
164
|
+
}, COMPLETION_DISPLAY_MS );
|
|
165
|
+
} else {
|
|
166
|
+
setPeak( 0 );
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
wasUploadingRef.current = isUploading;
|
|
171
|
+
|
|
172
|
+
if ( ! isUploading || dismissedRef.current ) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const total = peak;
|
|
177
|
+
const current = total - remaining + 1;
|
|
178
|
+
|
|
179
|
+
// Prefer the CSM queue's first original filename, then fall back to
|
|
180
|
+
// the tracker's first pending filename.
|
|
181
|
+
const filename = truncateFilename(
|
|
182
|
+
csmOriginals[ 0 ]?.sourceFile?.name ||
|
|
183
|
+
tracker?.pending[ 0 ] ||
|
|
184
|
+
__( 'Uploading' )
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
const content =
|
|
188
|
+
total === 1
|
|
189
|
+
? sprintf(
|
|
190
|
+
/* translators: %s: filename. */
|
|
191
|
+
__( 'Uploading — %s' ),
|
|
192
|
+
filename
|
|
193
|
+
)
|
|
194
|
+
: sprintf(
|
|
195
|
+
/* translators: 1: current upload number, 2: total uploads, 3: filename. */
|
|
196
|
+
__( 'Uploading %1$d of %2$d — %3$s' ),
|
|
197
|
+
current,
|
|
198
|
+
total,
|
|
199
|
+
filename
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
createNotice( 'info', content, {
|
|
203
|
+
id: NOTICE_ID,
|
|
204
|
+
type: 'snackbar',
|
|
205
|
+
isDismissible: false,
|
|
206
|
+
explicitDismiss: true,
|
|
207
|
+
speak: false,
|
|
208
|
+
icon: UPLOAD_SPINNER,
|
|
209
|
+
onDismiss: () => {
|
|
210
|
+
dismissedRef.current = true;
|
|
211
|
+
},
|
|
212
|
+
} );
|
|
213
|
+
}, [ remaining, peak, csmOriginals, tracker, createNotice, removeNotice ] );
|
|
214
|
+
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* WordPress dependencies
|
|
8
|
+
*/
|
|
9
|
+
import { Snackbar } from '@wordpress/components';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Internal dependencies
|
|
13
|
+
*/
|
|
14
|
+
import { UPLOAD_DONE, UPLOAD_SPINNER } from '../index';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The `UploadProgressSnackbar` component itself renders no UI: it manages a
|
|
18
|
+
* snackbar notice via the notices store while media uploads are in progress.
|
|
19
|
+
*
|
|
20
|
+
* These stories render the `Snackbar` with the same icon markup and text the
|
|
21
|
+
* notice produces, so the in-progress and completed states can be reviewed
|
|
22
|
+
* visually without running an actual upload.
|
|
23
|
+
*/
|
|
24
|
+
const meta: Meta< typeof Snackbar > = {
|
|
25
|
+
title: 'Editor/UploadProgressSnackbar',
|
|
26
|
+
component: Snackbar,
|
|
27
|
+
parameters: {
|
|
28
|
+
docs: { canvas: { sourceState: 'shown' } },
|
|
29
|
+
},
|
|
30
|
+
argTypes: {
|
|
31
|
+
icon: { control: false },
|
|
32
|
+
children: { control: false },
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
export default meta;
|
|
36
|
+
|
|
37
|
+
type Story = StoryObj< typeof Snackbar >;
|
|
38
|
+
|
|
39
|
+
export const Uploading: Story = {
|
|
40
|
+
args: {
|
|
41
|
+
icon: UPLOAD_SPINNER,
|
|
42
|
+
children: 'Uploading — sunset-over-the-bay.jpg',
|
|
43
|
+
explicitDismiss: true,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const UploadingMultiple: Story = {
|
|
48
|
+
args: {
|
|
49
|
+
icon: UPLOAD_SPINNER,
|
|
50
|
+
children: 'Uploading 1 of 3 — sunset-over-the-bay.jpg',
|
|
51
|
+
explicitDismiss: true,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export const Complete: Story = {
|
|
56
|
+
args: {
|
|
57
|
+
icon: UPLOAD_DONE,
|
|
58
|
+
children: 'Upload complete',
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* All states shown together for quick comparison of the icon alignment and
|
|
64
|
+
* sizing between the spinner and the completion checkmark.
|
|
65
|
+
*/
|
|
66
|
+
export const AllStates: Story = {
|
|
67
|
+
render: () => (
|
|
68
|
+
<div
|
|
69
|
+
style={ {
|
|
70
|
+
display: 'flex',
|
|
71
|
+
flexDirection: 'column',
|
|
72
|
+
alignItems: 'flex-start',
|
|
73
|
+
gap: '12px',
|
|
74
|
+
} }
|
|
75
|
+
>
|
|
76
|
+
<Snackbar icon={ UPLOAD_SPINNER } explicitDismiss>
|
|
77
|
+
Uploading — sunset-over-the-bay.jpg
|
|
78
|
+
</Snackbar>
|
|
79
|
+
<Snackbar icon={ UPLOAD_SPINNER } explicitDismiss>
|
|
80
|
+
Uploading 1 of 3 — sunset-over-the-bay.jpg
|
|
81
|
+
</Snackbar>
|
|
82
|
+
<Snackbar icon={ UPLOAD_DONE }>Upload complete</Snackbar>
|
|
83
|
+
</div>
|
|
84
|
+
),
|
|
85
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
@use "@wordpress/base-styles/variables" as *;
|
|
2
|
+
|
|
3
|
+
.editor-upload-progress-snackbar__spinner,
|
|
4
|
+
.editor-upload-progress-snackbar__check {
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
justify-content: center;
|
|
8
|
+
// Size the slot to $icon-size to match the icon dimensions the Snackbar's
|
|
9
|
+
// absolute positioning is tuned for, so the spinner and checkmark sit
|
|
10
|
+
// vertically centered against the notice text.
|
|
11
|
+
width: $icon-size;
|
|
12
|
+
height: $icon-size;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.editor-upload-progress-snackbar__spinner .components-spinner {
|
|
16
|
+
// The Spinner ships with an asymmetric default margin (top, not bottom),
|
|
17
|
+
// which offsets it within the centered icon slot. Reset it so the flex
|
|
18
|
+
// centering above keeps the spinner vertically centered against the text.
|
|
19
|
+
margin: 0;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.editor-upload-progress-snackbar__check svg {
|
|
23
|
+
// Render at the full icon size: the check glyph only occupies the center of
|
|
24
|
+
// its viewBox, so a smaller size makes the mark look faint next to the text.
|
|
25
|
+
width: $icon-size;
|
|
26
|
+
height: $icon-size;
|
|
27
|
+
// The icon ships without a fill, which renders black and disappears against
|
|
28
|
+
// the dark snackbar. Inherit the snackbar's white text color instead.
|
|
29
|
+
fill: currentColor;
|
|
30
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { render, act } from '@testing-library/react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* WordPress dependencies
|
|
8
|
+
*/
|
|
9
|
+
import { useSelect } from '@wordpress/data';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Internal dependencies
|
|
13
|
+
*/
|
|
14
|
+
import UploadProgressSnackbar from '../';
|
|
15
|
+
import { addFiles, advance, reset } from '../tracker';
|
|
16
|
+
|
|
17
|
+
jest.mock( '@wordpress/data/src/components/use-select', () => {
|
|
18
|
+
const mock = jest.fn();
|
|
19
|
+
return mock;
|
|
20
|
+
} );
|
|
21
|
+
|
|
22
|
+
const mockCreateNotice = jest.fn();
|
|
23
|
+
const mockRemoveNotice = jest.fn();
|
|
24
|
+
|
|
25
|
+
jest.mock( '@wordpress/data/src/components/use-dispatch', () => {
|
|
26
|
+
return {
|
|
27
|
+
useDispatch: jest.fn( () => ( {
|
|
28
|
+
createNotice: mockCreateNotice,
|
|
29
|
+
removeNotice: mockRemoveNotice,
|
|
30
|
+
} ) ),
|
|
31
|
+
useDispatchWithMap: jest.fn(),
|
|
32
|
+
};
|
|
33
|
+
} );
|
|
34
|
+
|
|
35
|
+
jest.mock( '@wordpress/a11y', () => ( {
|
|
36
|
+
speak: jest.fn(),
|
|
37
|
+
} ) );
|
|
38
|
+
|
|
39
|
+
function mockQueue( items ) {
|
|
40
|
+
useSelect.mockImplementation( ( mapSelect ) =>
|
|
41
|
+
mapSelect( () => ( {
|
|
42
|
+
getItems: () => items,
|
|
43
|
+
isUploading: () => items.length > 0,
|
|
44
|
+
} ) )
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function makeItem( id, name, { parentId } = {} ) {
|
|
49
|
+
return {
|
|
50
|
+
id,
|
|
51
|
+
sourceFile: { name },
|
|
52
|
+
status: 'PROCESSING',
|
|
53
|
+
parentId,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
describe( 'UploadProgressSnackbar', () => {
|
|
58
|
+
beforeEach( () => {
|
|
59
|
+
jest.clearAllMocks();
|
|
60
|
+
reset();
|
|
61
|
+
} );
|
|
62
|
+
|
|
63
|
+
it( 'does not create a notice when both sources are empty', () => {
|
|
64
|
+
mockQueue( [] );
|
|
65
|
+
render( <UploadProgressSnackbar /> );
|
|
66
|
+
expect( mockCreateNotice ).not.toHaveBeenCalled();
|
|
67
|
+
} );
|
|
68
|
+
|
|
69
|
+
it( 'creates a notice with the filename when a single CSM upload is in progress', () => {
|
|
70
|
+
mockQueue( [ makeItem( '1', 'photo.jpg' ) ] );
|
|
71
|
+
render( <UploadProgressSnackbar /> );
|
|
72
|
+
expect( mockCreateNotice ).toHaveBeenCalledWith(
|
|
73
|
+
'info',
|
|
74
|
+
expect.stringContaining( 'photo.jpg' ),
|
|
75
|
+
expect.objectContaining( {
|
|
76
|
+
id: 'upload-progress',
|
|
77
|
+
type: 'snackbar',
|
|
78
|
+
} )
|
|
79
|
+
);
|
|
80
|
+
expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toBe(
|
|
81
|
+
'Uploading — photo.jpg'
|
|
82
|
+
);
|
|
83
|
+
} );
|
|
84
|
+
|
|
85
|
+
it( 'shows batch count for CSM uploads', () => {
|
|
86
|
+
mockQueue( [
|
|
87
|
+
makeItem( '1', 'a.jpg' ),
|
|
88
|
+
makeItem( '2', 'b.jpg' ),
|
|
89
|
+
makeItem( '3', 'c.jpg' ),
|
|
90
|
+
] );
|
|
91
|
+
render( <UploadProgressSnackbar /> );
|
|
92
|
+
expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toMatch( /1 of 3/ );
|
|
93
|
+
} );
|
|
94
|
+
|
|
95
|
+
it( 'excludes subsizes from the CSM count', () => {
|
|
96
|
+
mockQueue( [
|
|
97
|
+
makeItem( '1', 'photo.jpg' ),
|
|
98
|
+
makeItem( '1-thumb', 'photo-150x150.jpg', { parentId: '1' } ),
|
|
99
|
+
makeItem( '1-medium', 'photo-300x300.jpg', { parentId: '1' } ),
|
|
100
|
+
] );
|
|
101
|
+
render( <UploadProgressSnackbar /> );
|
|
102
|
+
expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toBe(
|
|
103
|
+
'Uploading — photo.jpg'
|
|
104
|
+
);
|
|
105
|
+
} );
|
|
106
|
+
|
|
107
|
+
it( 'shows non-CSM uploads tracked by the editor mediaUpload wrapper', () => {
|
|
108
|
+
mockQueue( [] );
|
|
109
|
+
act( () => {
|
|
110
|
+
addFiles( [ 'traditional.jpg' ] );
|
|
111
|
+
} );
|
|
112
|
+
render( <UploadProgressSnackbar /> );
|
|
113
|
+
expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toBe(
|
|
114
|
+
'Uploading — traditional.jpg'
|
|
115
|
+
);
|
|
116
|
+
} );
|
|
117
|
+
|
|
118
|
+
it( 'shows batch count for non-CSM uploads', () => {
|
|
119
|
+
mockQueue( [] );
|
|
120
|
+
act( () => {
|
|
121
|
+
addFiles( [ 'a.jpg', 'b.jpg', 'c.jpg' ] );
|
|
122
|
+
} );
|
|
123
|
+
render( <UploadProgressSnackbar /> );
|
|
124
|
+
expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toMatch( /1 of 3/ );
|
|
125
|
+
expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toMatch( /a\.jpg/ );
|
|
126
|
+
} );
|
|
127
|
+
|
|
128
|
+
it( 'shows a completion notice and then removes it when uploads finish', () => {
|
|
129
|
+
jest.useFakeTimers();
|
|
130
|
+
try {
|
|
131
|
+
mockQueue( [] );
|
|
132
|
+
act( () => {
|
|
133
|
+
addFiles( [ 'a.jpg' ] );
|
|
134
|
+
} );
|
|
135
|
+
render( <UploadProgressSnackbar /> );
|
|
136
|
+
expect( mockCreateNotice ).toHaveBeenCalled();
|
|
137
|
+
mockCreateNotice.mockClear();
|
|
138
|
+
|
|
139
|
+
act( () => {
|
|
140
|
+
advance( 1 );
|
|
141
|
+
} );
|
|
142
|
+
|
|
143
|
+
// Completion notice replaces the progress notice (same ID).
|
|
144
|
+
expect( mockCreateNotice ).toHaveBeenCalledWith(
|
|
145
|
+
'info',
|
|
146
|
+
'Upload complete',
|
|
147
|
+
expect.objectContaining( {
|
|
148
|
+
id: 'upload-progress',
|
|
149
|
+
type: 'snackbar',
|
|
150
|
+
icon: expect.anything(),
|
|
151
|
+
} )
|
|
152
|
+
);
|
|
153
|
+
expect( mockRemoveNotice ).not.toHaveBeenCalled();
|
|
154
|
+
|
|
155
|
+
act( () => {
|
|
156
|
+
jest.runAllTimers();
|
|
157
|
+
} );
|
|
158
|
+
|
|
159
|
+
expect( mockRemoveNotice ).toHaveBeenCalledWith(
|
|
160
|
+
'upload-progress'
|
|
161
|
+
);
|
|
162
|
+
} finally {
|
|
163
|
+
jest.useRealTimers();
|
|
164
|
+
}
|
|
165
|
+
} );
|
|
166
|
+
|
|
167
|
+
it( 'middle-truncates a long filename while keeping the extension', () => {
|
|
168
|
+
const longName =
|
|
169
|
+
'a-really-long-uuid-like-filename-1234567890-abcdefghij.jpg';
|
|
170
|
+
mockQueue( [ makeItem( '1', longName ) ] );
|
|
171
|
+
render( <UploadProgressSnackbar /> );
|
|
172
|
+
const content = mockCreateNotice.mock.calls[ 0 ][ 1 ];
|
|
173
|
+
// Truncated: shorter than the original, marked with an ellipsis, and the
|
|
174
|
+
// extension is still visible.
|
|
175
|
+
expect( content ).toContain( '…' );
|
|
176
|
+
expect( content ).not.toContain( longName );
|
|
177
|
+
expect( content ).toMatch( /\.jpg$/ );
|
|
178
|
+
} );
|
|
179
|
+
|
|
180
|
+
it( 'does not truncate a short filename', () => {
|
|
181
|
+
mockQueue( [ makeItem( '1', 'photo.jpg' ) ] );
|
|
182
|
+
render( <UploadProgressSnackbar /> );
|
|
183
|
+
expect( mockCreateNotice.mock.calls[ 0 ][ 1 ] ).toBe(
|
|
184
|
+
'Uploading — photo.jpg'
|
|
185
|
+
);
|
|
186
|
+
} );
|
|
187
|
+
|
|
188
|
+
it( 'includes a spinner icon on the in-progress notice', () => {
|
|
189
|
+
mockQueue( [ makeItem( '1', 'photo.jpg' ) ] );
|
|
190
|
+
render( <UploadProgressSnackbar /> );
|
|
191
|
+
expect( mockCreateNotice ).toHaveBeenCalledWith(
|
|
192
|
+
'info',
|
|
193
|
+
expect.any( String ),
|
|
194
|
+
expect.objectContaining( {
|
|
195
|
+
icon: expect.anything(),
|
|
196
|
+
} )
|
|
197
|
+
);
|
|
198
|
+
} );
|
|
199
|
+
} );
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { useSyncExternalStore } from '@wordpress/element';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A minimal in-memory tracker for in-flight media uploads that happen outside
|
|
8
|
+
* the `@wordpress/upload-media` store (i.e. the traditional / non-CSM upload
|
|
9
|
+
* path). The editor's `mediaUpload` wrapper writes to it; the
|
|
10
|
+
* `UploadProgressSnackbar` reads from it.
|
|
11
|
+
*
|
|
12
|
+
* State shape: { total, completed, pending: string[] }
|
|
13
|
+
* - `total`: total files registered in the current session.
|
|
14
|
+
* - `completed`: files that have finished (succeeded OR errored).
|
|
15
|
+
* - `pending`: remaining filenames in submission order.
|
|
16
|
+
*
|
|
17
|
+
* The tracker holds at most one "session" at a time — if a new batch starts
|
|
18
|
+
* while one is in progress, its files are appended to the existing session.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
let state = null;
|
|
22
|
+
const listeners = new Set();
|
|
23
|
+
|
|
24
|
+
function notify() {
|
|
25
|
+
listeners.forEach( ( listener ) => listener() );
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Registers a new batch of files that have started uploading.
|
|
30
|
+
*
|
|
31
|
+
* @param {string[]} filenames Filenames in submission order.
|
|
32
|
+
*/
|
|
33
|
+
export function addFiles( filenames ) {
|
|
34
|
+
if ( ! filenames.length ) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if ( ! state ) {
|
|
38
|
+
state = { total: 0, completed: 0, pending: [] };
|
|
39
|
+
}
|
|
40
|
+
state = {
|
|
41
|
+
total: state.total + filenames.length,
|
|
42
|
+
completed: state.completed,
|
|
43
|
+
pending: [ ...state.pending, ...filenames ],
|
|
44
|
+
};
|
|
45
|
+
notify();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Advances the tracker by a number of finished files (success or error).
|
|
50
|
+
*
|
|
51
|
+
* @param {number} count Number of files that finished since the last call.
|
|
52
|
+
*/
|
|
53
|
+
export function advance( count ) {
|
|
54
|
+
if ( ! state || count <= 0 ) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const completed = Math.min( state.total, state.completed + count );
|
|
58
|
+
const pending = state.pending.slice( count );
|
|
59
|
+
if ( completed >= state.total ) {
|
|
60
|
+
state = null;
|
|
61
|
+
} else {
|
|
62
|
+
state = { total: state.total, completed, pending };
|
|
63
|
+
}
|
|
64
|
+
notify();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Resets the tracker to its empty state.
|
|
69
|
+
*
|
|
70
|
+
* Test-only helper: `state` is a module-level singleton, so tests call this in
|
|
71
|
+
* `beforeEach` to isolate cases from one another. Not used in production -
|
|
72
|
+
* `advance` clears the state on its own once every file in a batch finishes.
|
|
73
|
+
*/
|
|
74
|
+
export function reset() {
|
|
75
|
+
if ( state === null ) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
state = null;
|
|
79
|
+
notify();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Returns the current tracker state, or `null` when idle.
|
|
84
|
+
*
|
|
85
|
+
* @return {?{total: number, completed: number, pending: string[]}} Tracker state.
|
|
86
|
+
*/
|
|
87
|
+
export function getState() {
|
|
88
|
+
return state;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function subscribe( listener ) {
|
|
92
|
+
listeners.add( listener );
|
|
93
|
+
return () => {
|
|
94
|
+
listeners.delete( listener );
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* React hook that subscribes to the tracker.
|
|
100
|
+
*
|
|
101
|
+
* @return {?{total: number, completed: number, pending: string[]}} Tracker state.
|
|
102
|
+
*/
|
|
103
|
+
export function useTracker() {
|
|
104
|
+
return useSyncExternalStore( subscribe, getState, getState );
|
|
105
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
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 RevisionsView from './revisions-view';
|
|
12
|
+
|
|
13
|
+
const revisionsField: Field< BasePost > = {
|
|
14
|
+
id: 'revisions',
|
|
15
|
+
label: __( 'Revisions' ),
|
|
16
|
+
readOnly: true,
|
|
17
|
+
enableSorting: false,
|
|
18
|
+
render: RevisionsView,
|
|
19
|
+
isVisible: ( item ) => {
|
|
20
|
+
const revisionsCount =
|
|
21
|
+
item._links?.[ 'version-history' ]?.[ 0 ]?.count ?? 0;
|
|
22
|
+
const lastRevisionId =
|
|
23
|
+
item._links?.[ 'predecessor-version' ]?.[ 0 ]?.id ?? null;
|
|
24
|
+
return !! lastRevisionId && revisionsCount >= 2;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default revisionsField;
|