<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[53138] trunk/src/wp-includes: Editor: Add changes for new Comments Query Loop blocks</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/53138">53138</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/53138","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>gziolo</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2022-04-11 15:20:13 +0000 (Mon, 11 Apr 2022)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Editor: Add changes for new Comments Query Loop blocks

Backports changes from Gutenberg to add functions required by Comment Query Loop and related blocks. Related unit tests depends on the new blocks and they will get added seperately.

Props darerodz, timothyblynjacobs.
See <a href="https://core.trac.wordpress.org/ticket/55505">#55505</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesblockeditorphp">trunk/src/wp-includes/block-editor.php</a></li>
<li><a href="#trunksrcwpincludesblocksphp">trunk/src/wp-includes/blocks.php</a></li>
<li><a href="#trunksrcwpincludesrestapiendpointsclasswprestcommentscontrollerphp">trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludesblockeditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/block-editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/block-editor.php    2022-04-11 14:19:13 UTC (rev 53137)
+++ trunk/src/wp-includes/block-editor.php      2022-04-11 15:20:13 UTC (rev 53138)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -396,6 +396,23 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $editor_settings['localAutosaveInterval'] = 15;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $editor_settings['__experimentalDiscussionSettings'] = array(
+               'commentOrder'        => get_option( 'comment_order' ),
+               'commentsPerPage'     => get_option( 'comments_per_page' ),
+               'defaultCommentsPage' => get_option( 'default_comments_page' ),
+               'pageComments'        => get_option( 'page_comments' ),
+               'threadComments'      => get_option( 'thread_comments' ),
+               'threadCommentsDepth' => get_option( 'thread_comments_depth' ),
+               'avatarURL'           => get_avatar_url(
+                       '',
+                       array(
+                               'size'          => 96,
+                               'force_default' => true,
+                               'default'       => get_option( 'avatar_default' ),
+                       )
+               ),
+       );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Filters the settings to pass to the block editor for all editor type.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span></span></pre></div>
<a id="trunksrcwpincludesblocksphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/blocks.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/blocks.php  2022-04-11 14:19:13 UTC (rev 53137)
+++ trunk/src/wp-includes/blocks.php    2022-04-11 15:20:13 UTC (rev 53138)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1358,3 +1358,96 @@
</span><span class="cx" style="display: block; padding: 0 10px">        return $metadata;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> add_filter( 'block_type_metadata', '_wp_multiple_block_styles' );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+/**
+ * Helper function that constructs a comment query vars array from the passed
+ * block properties.
+ *
+ * It's used with the Comment Query Loop inner blocks.
+ *
+ * @since 6.0.0
+ *
+ * @param WP_Block $block Block instance.
+ *
+ * @return array Returns the comment query parameters to use with the
+ * WP_Comment_Query constructor.
+ */
+function build_comment_query_vars_from_block( $block ) {
+
+       $comment_args = array(
+               'orderby'                   => 'comment_date_gmt',
+               'order'                     => 'ASC',
+               'status'                    => 'approve',
+               'no_found_rows'             => false,
+               'update_comment_meta_cache' => false, // We lazy-load comment meta for performance.
+       );
+
+       if ( ! empty( $block->context['postId'] ) ) {
+               $comment_args['post_id'] = (int) $block->context['postId'];
+       }
+
+       if ( get_option( 'thread_comments' ) ) {
+               $comment_args['hierarchical'] = 'threaded';
+       } else {
+               $comment_args['hierarchical'] = false;
+       }
+
+       $per_page     = get_option( 'comments_per_page' );
+       $default_page = get_option( 'default_comments_page' );
+
+       if ( $per_page > 0 ) {
+               $comment_args['number'] = $per_page;
+
+               $page = (int) get_query_var( 'cpage' );
+               if ( $page ) {
+                       $comment_args['paged'] = $page;
+               } elseif ( 'oldest' === $default_page ) {
+                       $comment_args['paged'] = 1;
+               } elseif ( 'newest' === $default_page ) {
+                       $comment_args['paged'] = (int) ( new WP_Comment_Query( $comment_args ) )->max_num_pages;
+               }
+               // Set the `cpage` query var to ensure the previous and next pagination links are correct
+               // when inheriting the Discussion Settings.
+               if ( 0 === $page && isset( $comment_args['paged'] ) && $comment_args['paged'] > 0 ) {
+                       set_query_var( 'cpage', $comment_args['paged'] );
+               }
+       }
+
+       return $comment_args;
+}
+
+/**
+ * Helper function that returns the proper pagination arrow html for
+ * `CommentsPaginationNext` and `CommentsPaginationPrevious` blocks based on the
+ * provided `paginationArrow` from `CommentsPagination` context.
+ *
+ * It's used in CommentsPaginationNext and CommentsPaginationPrevious blocks.
+ *
+ * @since 6.0.0
+ *
+ * @param WP_Block $block           Block instance.
+ * @param string   $pagination_type Type of the arrow we will be rendering.
+ *                                  Default 'next'. Accepts 'next' or 'previous'.
+ *
+ * @return string|null Returns the constructed WP_Query arguments.
+ */
+function get_comments_pagination_arrow( $block, $pagination_type = 'next' ) {
+       $arrow_map = array(
+               'none'    => '',
+               'arrow'   => array(
+                       'next'     => '→',
+                       'previous' => '←',
+               ),
+               'chevron' => array(
+                       'next'     => '»',
+                       'previous' => '«',
+               ),
+       );
+       if ( ! empty( $block->context['comments/paginationArrow'] ) && ! empty( $arrow_map[ $block->context['comments/paginationArrow'] ][ $pagination_type ] ) ) {
+               $arrow_attribute = $block->context['comments/paginationArrow'];
+               $arrow           = $arrow_map[ $block->context['comments/paginationArrow'] ][ $pagination_type ];
+               $arrow_classes   = "wp-block-comments-pagination-$pagination_type-arrow is-arrow-$arrow_attribute";
+               return "<span class='$arrow_classes'>$arrow</span>";
+       }
+       return null;
+}
</ins></span></pre></div>
<a id="trunksrcwpincludesrestapiendpointsclasswprestcommentscontrollerphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php    2022-04-11 14:19:13 UTC (rev 53137)
+++ trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php      2022-04-11 15:20:13 UTC (rev 53138)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1196,7 +1196,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $rest_url = add_query_arg( $args, rest_url( $this->namespace . '/' . $this->rest_base ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        $links['children'] = array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'href' => $rest_url,
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'href'     => $rest_url,
+                               'embedded' => true,
</ins><span class="cx" style="display: block; padding: 0 10px">                         );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre>
</div>
</div>

</body>
</html>