gutenberg icon indicating copy to clipboard operation
gutenberg copied to clipboard

Add template revision button

Open georgeh opened this issue 3 years ago â€ĸ 17 comments

What?

Adds a button to templates and template parts to get to the revision compare screen

Why?

Closes #44503

How?

This adds a button to the site editor for Templates and Template Parts that links to the revision viewer for that template.

It adds 2 new fields to the REST response for /wp/v2/template/{theme}//{part} and /wp/v2/template-part/{theme}//{part} routes: 'revision_count' and latest_revision_id. The Posts REST controller uses the _links section to expose these and links to routes for the Revisions REST controller. I chose to add these to the body because the Revisions REST routes assume numeric IDs with /revisions at the end, and the existing template routes receive everything in their namespace. Adding /revisions routes for templates and template-parts would require complex RegExes that could potentially lead to a DoS attack. However if someone can get the routes on the Revisions REST controller to work with Template IDs, I would be happy to add them.

Testing Instructions

  1. Open the Site Editor
  2. Edit a Template or Template Part
  3. Save to create a custom template
  4. Make another change and save again, to create a second custom template
  5. Confirm that the revision button appears in the Template sidebar and links to the revision viewer

Screenshots or screencast

https://user-images.githubusercontent.com/128240/197264906-70610dbc-ffbb-466e-982e-8f7d16ff49fa.mov

georgeh avatar Oct 21 '22 18:10 georgeh

Size Change: +600 B (0%)

Total Size: 1.32 MB

Filename Size Change
build/edit-site/index.min.js 64.8 kB +585 B (+1%)
build/edit-site/style-rtl.css 9.7 kB +7 B (0%)
build/edit-site/style.css 9.7 kB +8 B (0%)
â„šī¸ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/index.min.js 192 kB
build/block-editor/style-rtl.css 14.4 kB
build/block-editor/style.css 14.4 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 265 B
build/block-library/blocks/file/style.css 265 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 298 B
build/block-library/blocks/latest-comments/style.css 298 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 376 B
build/block-library/blocks/page-list/editor.css 376 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 458 B
build/block-library/blocks/query/editor.css 457 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.6 kB
build/block-library/editor.css 11.6 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 199 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.6 kB
build/block-library/style.css 12.6 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51 kB
build/components/index.min.js 204 kB
build/components/style-rtl.css 11.6 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.3 kB
build/core-data/index.min.js 15.9 kB
build/customize-widgets/index.min.js 11.8 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.57 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.5 kB
build/edit-post/style-rtl.css 7.5 kB
build/edit-post/style.css 7.5 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/index.min.js 45.4 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.93 kB
build/escape-html/index.min.js 548 B
build/experiments/index.min.js 938 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.92 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.8 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.69 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.31 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

github-actions[bot] avatar Oct 24 '22 18:10 github-actions[bot]

Thinking more about the REST routes in this, I think I can use the revisions REST controller, but only add the links when there are 2 or more custom versions of a template.

As a follow-up it would also be good to let the revision viewer load theme templates from the filesystem as a kind of revision 0

georgeh avatar Oct 25 '22 16:10 georgeh

This button could probably use some design help too:

image

georgeh avatar Oct 25 '22 17:10 georgeh

Thinking more about the REST routes in this, I think I can use the revisions REST controller, but only add the links when there are 2 or more custom versions of a template.

No, it won't work with the routes as they are currently set up. I've learned this twice now so I'm writing it down here for the next time I attempt this.

WP_REST_Templates_Controller registers a route for

// The route.
sprintf(
	'/%s/(?P<id>%s%s)',
	$this->rest_base,
	// Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
	// Excludes invalid directory name characters: `/:<>*?"|`.
	'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
	// Matches the template name.
	'[\/\w-]+'
)

which expands to something like /wp/v2/templates/twentytwentytwo//footer

WP_REST_Revisions_Controller registers a route for every post type that supports revisions for

// $this->rest_base = 'revisions'
'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base;
// ... and ....
'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base . '/(?P<id>[\d]+)',

which expands to something like /wp/v2/templates/123/revisions and /wp/v2/templates/123/revisions/456

Excluding routes that end in /revisions[/\d]* is difficult and has the potential to introduce a ReDoS vulnerability. Still, if someone has suggestions on how to make the routes on both of those classes compatible, I would love to use the same response format as posts.

georgeh avatar Oct 25 '22 17:10 georgeh

Working on the revisions, thanks for the review @spacedmonkey. Also I opened #45290 as a possible follow-up to make template revisions clearer

georgeh avatar Oct 26 '22 14:10 georgeh

Does this PR provide an alternative to https://github.com/WordPress/wordpress-develop/pull/3476, or does it depend on it?

priethor avatar Oct 26 '22 17:10 priethor

Does this PR provide an alternative to WordPress/wordpress-develop#3476, or does it depend on it?

@priethor That was an earlier attempt on adding to the REST API and this is a better place for that change. I'll close that and we can merge the changes to core using the usual Gutenberg merge process.

georgeh avatar Oct 26 '22 17:10 georgeh

Thinking more about the REST routes in this, I think I can use the revisions REST controller, but only add the links when there are 2 or more custom versions of a template.

No, it won't work with the routes as they are currently set up. I've learned this twice now so I'm writing it down here for the next time I attempt this.

WP_REST_Templates_Controller registers a route for

// The route.
sprintf(
	'/%s/(?P<id>%s%s)',
	$this->rest_base,
	// Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
	// Excludes invalid directory name characters: `/:<>*?"|`.
	'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
	// Matches the template name.
	'[\/\w-]+'
)

which expands to something like /wp/v2/templates/twentytwentytwo//footer

WP_REST_Revisions_Controller registers a route for every post type that supports revisions for

// $this->rest_base = 'revisions'
'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base;
// ... and ....
'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base . '/(?P<id>[\d]+)',

which expands to something like /wp/v2/templates/123/revisions and /wp/v2/templates/123/revisions/456

Excluding routes that end in /revisions[/\d]* is difficult and has the potential to introduce a ReDoS vulnerability. Still, if someone has suggestions on how to make the routes on both of those classes compatible, I would love to use the same response format as posts.

I have reported this issue upstream here - https://core.trac.wordpress.org/ticket/56922. It will hopefully be fixed in WordPress 6.2.

spacedmonkey avatar Oct 27 '22 18:10 spacedmonkey

I have reported this issue upstream here - https://core.trac.wordpress.org/ticket/56922. It will hopefully be fixed in WordPress 6.2.

Thanks @spacedmonkey - I'll get this PR ready for when that gets fixed and hopefully we can backport the fix to this as well.

georgeh avatar Oct 27 '22 18:10 georgeh

@georgeh I have pushed some changes to this PR, with a fix. Let me know what you think.

spacedmonkey avatar Oct 27 '22 19:10 spacedmonkey

@spacedmonkey thanks, that's about what I was coming up with so it lgtm. How do we feel about merging this when the _links section points to URLs that don't work yet?

georgeh avatar Oct 27 '22 19:10 georgeh

@spacedmonkey thanks, that's about what I was coming up with so it lgtm. How do we feel about merging this when the _links section points to URLs that don't work yet?

We can fix the issue in core or guternberg PR.

spacedmonkey avatar Oct 27 '22 19:10 spacedmonkey

This is looking good. Let's ensure that unit tests / linting are passing. Then we can merge.

spacedmonkey avatar Nov 04 '22 15:11 spacedmonkey

@spacedmonkey I'd like to merge this with the version information in _links but without the hrefs until the core ticket is resolved. I don't know what @TimothyBJacobs availability is to look at that ticket.

{
  "id": "twentytwentythree//home",
  "theme": "twentytwentythree",
  ...
  "_links": {
    ...
    "version-history": [
      {
        "count": 1,
      }
    ],
    "predecessor-version": [
      {
        "id": 17,
      }
    ],
  ...
  }
}

This would put the revision data we need in the same place as other post types, but would not advertise URLs that don't work. Once the REST routes are added, we can add the hrefs to the response.

That would allow us to get this feature to users without incurring technical debt for the placement of the data.

georgeh avatar Nov 04 '22 15:11 georgeh

After trying this out without the hrefs, it seems that WP_REST_Server::get_response_links() really wants those hrefs. I re-added them and cleaned up the warnings. Once we get tests passing can I get a 👍đŸģ to merge?

georgeh avatar Nov 04 '22 20:11 georgeh

@spacedmonkey All green, can I get a 👍đŸģ to merge?

georgeh avatar Nov 07 '22 14:11 georgeh

@spacedmonkey I'm going to go ahead and merge tomorrow if I don't hear anything else, my read of your last comment is that we're good to go now that the tests are passing.

georgeh avatar Nov 15 '22 21:11 georgeh

I've rebased this.

draganescu avatar Feb 03 '23 10:02 draganescu

Flaky tests detected in a0ab799ae2039febb271cd856ced8364b5ab4464. Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4123834366 📝 Reported issues:

  • #47640 in specs/editor/various/block-hierarchy-navigation.test.js

github-actions[bot] avatar Feb 03 '23 10:02 github-actions[bot]

I noticed that the required fix for the core has no milestone. So we might have to punt this feature for 6.3.

Mamaduka avatar Feb 07 '23 05:02 Mamaduka

Let's ship this, as it's a much needed feature. Thank you George 🙏

However, let's follow up shortly thereafter with a couple of visual improvements. This is what it looks like at the moment:

Screenshot 2023-02-07 at 09 04 13

That's the cursor hovering over the panel.

The use of a panel component to wrap the button may not have been the best idea, since it appears this panel is nested inside the description. Either the panel should be placed similar to other panels in the document sidebar, go edge to edge and line up with margins and paddings, or it could be a much simpler link, like this:

Screenshot 2023-02-07 at 09 05 17

jasmussen avatar Feb 07 '23 08:02 jasmussen

@spacedmonkey, can we merge this feature without https://core.trac.wordpress.org/ticket/56922?

@jasmussen, I agree that Revisions are a needed feature for the Site Editor. However, if the required APIs aren't working correctly, introducing UI doesn't make much sense.

Mamaduka avatar Feb 07 '23 08:02 Mamaduka

However, if the required APIs aren't working correctly, introducing UI doesn't make much sense.

Oh I'll refer to you and others for the call here, I was commenting purely on the placement/feature side of things.

jasmussen avatar Feb 07 '23 08:02 jasmussen

I think reasonable people can disagree about this, but I'm fine with merging this as is. The PR doesn't make our existing bug in #56922 materially worse in my opinion.

TimothyBJacobs avatar Feb 07 '23 17:02 TimothyBJacobs

Excellent, I'll do the two updates mentioned above and merge!

draganescu avatar Feb 07 '23 17:02 draganescu

@jasmussen I've updated the PR description with the visual update to get it closer to your suggestion.

draganescu avatar Feb 08 '23 10:02 draganescu

@draganescu, @georgeh, this will require PHP backport. Since this is an enhancement, I believe it must be discussed with the rest of the release squad to get "blessed" status.

Can you create a new ticket on Trac, so we can start the process?

Mamaduka avatar Feb 09 '23 05:02 Mamaduka

@draganescu, @georgeh, this will require PHP backport. Since this is an enhancement, I believe it must be discussed with the rest of the release squad to get "blessed" status.

Can you create a new ticket on Trac, so we can start the process?

👋 any news on creating a trac ticket for this one?

FYI: I'll temporarily remove the back port label and re add it to use the cherry-pick script.

ntsekouras avatar Feb 13 '23 09:02 ntsekouras

@Mamaduka @ntsekouras for now I created Add revisions to the links of the template and template part REST endpoint

I am unclear if the bug in Template / Template parts revision / autosave REST API are broken has a mergeable solution in @spacedmonkey 's PR or if we should port over the controller decoration here as a fix for this problem - which we could revert later if the bug is fixed in a more general way (cc @TimothyBJacobs)

draganescu avatar Feb 13 '23 09:02 draganescu

This cannot be in 6.2 because once we land in the revision UI the links to take us back don't work and fixing that is not trivial.

draganescu avatar Feb 20 '23 16:02 draganescu