diff --git src/js/_enqueues/wp/revisions.js src/js/_enqueues/wp/revisions.js
index 83c2641485..5ee2b58c27 100644
|
|
window.wp = window.wp || {}; |
628 | 628 | model: tooltip |
629 | 629 | }) ); |
630 | 630 | |
| 631 | // Add the visually hidden slider help view. |
| 632 | this.views.add( new revisions.view.SliderHelp() ); |
| 633 | |
631 | 634 | // Add the slider view. |
632 | 635 | this.views.add( new revisions.view.Slider({ |
633 | 636 | model: slider |
… |
… |
window.wp = window.wp || {}; |
729 | 732 | // Add the 'from' view. |
730 | 733 | this.views.add( new revisions.view.MetaFrom({ |
731 | 734 | model: this.model, |
732 | | className: 'diff-meta diff-meta-from' |
| 735 | className: 'diff-meta diff-meta-from', |
733 | 736 | }) ); |
734 | 737 | |
735 | 738 | // Add the 'to' view. |
… |
… |
window.wp = window.wp || {}; |
804 | 807 | } |
805 | 808 | }); |
806 | 809 | |
| 810 | // The slider visually hidden help view. |
| 811 | revisions.view.SliderHelp = wp.Backbone.View.extend({ |
| 812 | className: 'revisions-slider-hidden-help', |
| 813 | template: wp.template( 'revisions-slider-hidden-help' ) |
| 814 | }); |
| 815 | |
807 | 816 | // The tooltip view. |
808 | 817 | // Encapsulates the tooltip. |
809 | 818 | revisions.view.Tooltip = wp.Backbone.View.extend({ |
… |
… |
window.wp = window.wp || {}; |
943 | 952 | ready: function() { |
944 | 953 | this.$el.css('width', ( this.model.revisions.length * 50 ) + 'px'); |
945 | 954 | this.$el.slider( _.extend( this.model.toJSON(), { |
| 955 | create: function() { |
| 956 | var handles = $( '.ui-slider-handle' ); |
| 957 | handles.first().attr( { |
| 958 | role: 'button', |
| 959 | 'aria-labelledby': 'diff-title-from', |
| 960 | 'aria-describedby': 'revisions-slider-hidden-help', |
| 961 | } ); |
| 962 | handles.last().attr( { |
| 963 | role: 'button', |
| 964 | 'aria-labelledby': 'diff-title-to', |
| 965 | 'aria-describedby': 'revisions-slider-hidden-help', |
| 966 | } ); |
| 967 | }, |
946 | 968 | start: this.start, |
947 | 969 | slide: this.slide, |
948 | 970 | stop: this.stop |
diff --git src/wp-admin/css/revisions.css src/wp-admin/css/revisions.css
index 4b3a6e48d8..0fcb13efc8 100644
|
|
body.folded .revisions .loading-indicator { |
176 | 176 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); |
177 | 177 | } |
178 | 178 | |
179 | | .revisions-diff h3:first-child { |
| 179 | .revisions-diff .diff-field-heading { |
| 180 | margin-left: 6px; |
| 181 | } |
| 182 | |
| 183 | .revisions-diff .diff-field-heading:first-child { |
180 | 184 | margin-top: 0; |
181 | 185 | } |
182 | 186 | |
… |
… |
body.folded .revisions .loading-indicator { |
186 | 190 | vertical-align: middle; |
187 | 191 | } |
188 | 192 | |
189 | | table.diff tbody tr td:nth-child(2) { |
190 | | width: 4%; |
191 | | } |
192 | | |
193 | 193 | table.diff { |
194 | 194 | table-layout: fixed; |
195 | 195 | width: 100%; |
196 | 196 | white-space: pre-wrap; |
| 197 | border-collapse: collapse; |
197 | 198 | } |
198 | 199 | |
199 | | table.diff col.content { |
200 | | width: auto; |
201 | | } |
202 | | |
203 | | table.diff col.content.diffsplit { |
204 | | width: 48%; |
| 200 | table.diff .diff-sub-title { |
| 201 | font-size: 12px; |
205 | 202 | } |
206 | 203 | |
207 | | table.diff col.diffsplit.middle { |
| 204 | table.diff col.content { |
208 | 205 | width: auto; |
209 | 206 | } |
210 | 207 | |
211 | | table.diff col.ltype { |
212 | | width: 30px; |
213 | | } |
214 | | |
215 | 208 | table.diff tr { |
216 | 209 | background-color: transparent; |
217 | 210 | } |
218 | 211 | |
| 212 | table.diff td { |
| 213 | width: auto; |
| 214 | } |
| 215 | |
219 | 216 | table.diff td, |
220 | 217 | table.diff th { |
221 | 218 | font-family: Consolas, Monaco, monospace; |
222 | | font-size: 14px; |
223 | | line-height: 1.57142857; |
224 | | padding: 0.5em 0.5em 0.5em 2em; |
225 | | vertical-align: top; |
226 | 219 | word-wrap: break-word; |
| 220 | font-size: inherit; |
| 221 | line-height: inherit; |
| 222 | padding: 0 6px 1em; |
| 223 | text-align: left; |
| 224 | vertical-align: top; |
| 225 | } |
| 226 | |
| 227 | table.diff td { |
| 228 | line-height: 1.5714; |
| 229 | padding: 6px; |
| 230 | background-clip: padding-box; |
227 | 231 | } |
228 | 232 | |
229 | 233 | table.diff td h1, |
… |
… |
table.diff td h5, |
234 | 238 | table.diff td h6 { |
235 | 239 | margin: 0; |
236 | 240 | } |
| 241 | table.diff.is-split-view th:first-child, |
| 242 | table.diff.is-split-view td:first-child { |
| 243 | width: 50%; |
| 244 | border-right: 50px solid transparent; |
| 245 | padding-right: 50px; |
| 246 | |
| 247 | } |
| 248 | |
| 249 | table.diff.is-split-view th:last-child, |
| 250 | table.diff.is-split-view td:last-child { |
| 251 | width: 50%; |
| 252 | border-left: 50px solid transparent; |
| 253 | padding-left: 50px; |
| 254 | |
| 255 | } |
| 256 | |
237 | 257 | |
238 | 258 | table.diff .diff-deletedline del, |
239 | 259 | table.diff .diff-addedline ins { |
… |
… |
div.revisions-controls > .wp-slider > .ui-slider-handle { |
462 | 482 | touch-action: none; |
463 | 483 | } |
464 | 484 | |
465 | | .wp-slider .ui-slider-handle, |
466 | | .wp-slider .ui-slider-handle.focus { |
| 485 | .wp-slider .ui-slider-handle { |
467 | 486 | background: #f7f7f7; |
468 | 487 | border: 1px solid #ccc; |
469 | 488 | box-shadow: 0 1px 0 #cccccc; |
… |
… |
div.revisions-controls > .wp-slider > .ui-slider-handle { |
475 | 494 | border-color: #999; |
476 | 495 | } |
477 | 496 | |
| 497 | .wp-slider .ui-slider-handle:focus, |
| 498 | .wp-slider .ui-slider-handle.ui-state-focus { |
| 499 | background: #fafafa; |
| 500 | border-color: #999; |
| 501 | box-shadow: 0 0 0 2px #5b9dd9; |
| 502 | /* Only visible in Windows High Contrast mode */ |
| 503 | outline: 2px solid transparent; |
| 504 | } |
| 505 | |
478 | 506 | .wp-slider .ui-slider-handle:active, |
479 | 507 | .wp-slider .ui-slider-handle.ui-state-active { |
480 | 508 | background: #eee; |
diff --git src/wp-admin/includes/revision.php src/wp-admin/includes/revision.php
index 52600dce06..99f6b3b69d 100644
|
|
function wp_get_revision_ui_diff( $post, $compare_from, $compare_to ) { |
86 | 86 | |
87 | 87 | $args = array( |
88 | 88 | 'show_split_view' => true, |
| 89 | 'title_left' => __( 'Removed' ), |
| 90 | 'title_right' => __( 'Added' ), |
89 | 91 | ); |
90 | 92 | |
91 | 93 | /** |
… |
… |
function wp_get_revision_ui_diff( $post, $compare_from, $compare_to ) { |
109 | 111 | |
110 | 112 | $diff = wp_text_diff( $content_from, $content_to, $args ); |
111 | 113 | |
| 114 | $is_split_view = ! empty( $args['show_split_view'] ); |
| 115 | $is_split_view_class = $is_split_view ? ' is-split-view' : ''; |
| 116 | |
| 117 | // Handle the post title when there's no diff. |
112 | 118 | if ( ! $diff && 'post_title' === $field ) { |
113 | | // It's a better user experience to still show the Title, even if it didn't change. |
114 | | // No, you didn't see this. |
115 | | $diff = '<table class="diff"><colgroup><col class="content diffsplit left"><col class="content diffsplit middle"><col class="content diffsplit right"></colgroup><tbody><tr>'; |
| 119 | $diff = "<table class='diff$is_split_view_class'><tbody>"; |
| 120 | |
| 121 | if ( $args['title_left'] || $args['title_right'] ) { |
| 122 | $th_or_td_left = empty( $args['title_left'] ) ? 'td' : 'th'; |
| 123 | $th_or_td_right = empty( $args['title_right'] ) ? 'td' : 'th'; |
| 124 | |
| 125 | $diff .= "<tr class='diff-sub-title'>\n"; |
| 126 | $diff .= "\t<$th_or_td_left>$args[title_left]</$th_or_td_left>\n"; |
| 127 | if ( $is_split_view ) { |
| 128 | $diff .= "\t<$th_or_td_right>$args[title_right]</$th_or_td_right>\n"; |
| 129 | } |
| 130 | $diff .= "</tr>\n"; |
| 131 | } |
| 132 | |
| 133 | $diff .= "<tr>\n"; |
116 | 134 | |
117 | 135 | // In split screen mode, show the title before/after side by side. |
118 | 136 | if ( true === $args['show_split_view'] ) { |
119 | | $diff .= '<td>' . esc_html( $compare_from->post_title ) . '</td><td></td><td>' . esc_html( $compare_to->post_title ) . '</td>'; |
| 137 | $diff .= '<td>' . esc_html( $compare_from->post_title ) . '</td><td>' . esc_html( $compare_to->post_title ) . '</td>'; |
120 | 138 | } else { |
121 | 139 | $diff .= '<td>' . esc_html( $compare_from->post_title ) . '</td>'; |
122 | 140 | |
… |
… |
function wp_print_revision_templates() { |
367 | 385 | </div> |
368 | 386 | </script> |
369 | 387 | |
| 388 | <script id="tmpl-revisions-slider-hidden-help" type="text/html"> |
| 389 | <h2 class="screen-reader-text"><?php esc_html_e( 'Select a revision' ); ?></h2> |
| 390 | <p id="revisions-slider-hidden-help" hidden><?php esc_html_e( 'Change revision by using the left and arrow keys' ); ?></p> |
| 391 | </script> |
| 392 | |
370 | 393 | <script id="tmpl-revisions-checkbox" type="text/html"> |
371 | 394 | <div class="revision-toggle-compare-mode"> |
372 | 395 | <label> |
… |
… |
function wp_print_revision_templates() { |
384 | 407 | |
385 | 408 | <script id="tmpl-revisions-meta" type="text/html"> |
386 | 409 | <# if ( ! _.isUndefined( data.attributes ) ) { #> |
387 | | <div class="diff-title"> |
| 410 | <div class="diff-title" id="diff-title-{{ data.type }}"> |
388 | 411 | <# if ( 'from' === data.type ) { #> |
389 | 412 | <strong><?php _ex( 'From:', 'Followed by post revision info' ); ?></strong> |
390 | 413 | <# } else if ( 'to' === data.type ) { #> |
… |
… |
function wp_print_revision_templates() { |
402 | 425 | '<span class="author-name">{{ data.attributes.author.name }}</span>' |
403 | 426 | ); |
404 | 427 | ?> |
405 | | </span> |
| 428 | </span> |
406 | 429 | <# } else if ( data.attributes.current ) { #> |
407 | 430 | <span class="byline"> |
408 | 431 | <?php |
… |
… |
function wp_print_revision_templates() { |
412 | 435 | '<span class="author-name">{{ data.attributes.author.name }}</span>' |
413 | 436 | ); |
414 | 437 | ?> |
415 | | </span> |
| 438 | </span> |
416 | 439 | <# } else { #> |
417 | 440 | <span class="byline"> |
418 | 441 | <?php |
… |
… |
function wp_print_revision_templates() { |
422 | 445 | '<span class="author-name">{{ data.attributes.author.name }}</span>' |
423 | 446 | ); |
424 | 447 | ?> |
425 | | </span> |
| 448 | </span> |
426 | 449 | <# } #> |
427 | 450 | <span class="time-ago">{{ data.attributes.timeAgo }}</span> |
428 | 451 | <span class="date">({{ data.attributes.dateShort }})</span> |
429 | 452 | </div> |
430 | | <# if ( 'to' === data.type && data.attributes.restoreUrl ) { #> |
431 | | <input <?php if ( wp_check_post_lock( $post->ID ) ) { ?> |
| 453 | </div> |
| 454 | </div> |
| 455 | <# if ( 'to' === data.type && data.attributes.restoreUrl ) { #> |
| 456 | <input <?php if ( wp_check_post_lock( $post->ID ) ) { ?> |
| 457 | disabled="disabled" |
| 458 | <?php } else { ?> |
| 459 | <# if ( data.attributes.current ) { #> |
432 | 460 | disabled="disabled" |
433 | | <?php } else { ?> |
434 | | <# if ( data.attributes.current ) { #> |
435 | | disabled="disabled" |
436 | | <# } #> |
437 | | <?php } ?> |
438 | | <# if ( data.attributes.autosave ) { #> |
439 | | type="button" class="restore-revision button button-primary" value="<?php esc_attr_e( 'Restore This Autosave' ); ?>" /> |
440 | | <# } else { #> |
441 | | type="button" class="restore-revision button button-primary" value="<?php esc_attr_e( 'Restore This Revision' ); ?>" /> |
442 | 461 | <# } #> |
| 462 | <?php } ?> |
| 463 | <# if ( data.attributes.autosave ) { #> |
| 464 | type="button" class="restore-revision button button-primary" value="<?php esc_attr_e( 'Restore This Autosave' ); ?>" /> |
| 465 | <# } else { #> |
| 466 | type="button" class="restore-revision button button-primary" value="<?php esc_attr_e( 'Restore This Revision' ); ?>" /> |
443 | 467 | <# } #> |
444 | | </div> |
445 | | <# if ( 'tooltip' === data.type ) { #> |
446 | | <div class="revisions-tooltip-arrow"><span></span></div> |
| 468 | <# } #> |
| 469 | <# if ( 'tooltip' === data.type ) { #> |
| 470 | <div class="revisions-tooltip-arrow"><span></span></div> |
| 471 | <# } #> |
447 | 472 | <# } #> |
448 | | <# } #> |
449 | 473 | </script> |
450 | 474 | |
451 | 475 | <script id="tmpl-revisions-diff" type="text/html"> |
… |
… |
function wp_print_revision_templates() { |
453 | 477 | <div class="diff-error"><?php _e( 'Sorry, something went wrong. The requested comparison could not be loaded.' ); ?></div> |
454 | 478 | <div class="diff"> |
455 | 479 | <# _.each( data.fields, function( field ) { #> |
456 | | <h3>{{ field.name }}</h3> |
| 480 | <h2 class="diff-field-heading">{{ field.name }}</h2> |
457 | 481 | {{{ field.diff }}} |
458 | 482 | <# }); #> |
459 | 483 | </div> |
diff --git src/wp-includes/class-wp-text-diff-renderer-table.php src/wp-includes/class-wp-text-diff-renderer-table.php
index 4bc02d3750..2649886a02 100644
|
|
class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { |
176 | 176 | } |
177 | 177 | |
178 | 178 | if ( $this->_show_split_view ) { |
179 | | $r .= '<tr>' . $this->emptyLine() . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n"; |
| 179 | $r .= '<tr>' . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n"; |
180 | 180 | } else { |
181 | 181 | $r .= '<tr>' . $this->addedLine( $line ) . "</tr>\n"; |
182 | 182 | } |
… |
… |
class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { |
201 | 201 | $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'deleted' ); |
202 | 202 | } |
203 | 203 | if ( $this->_show_split_view ) { |
204 | | $r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . $this->emptyLine() . "</tr>\n"; |
| 204 | $r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . "</tr>\n"; |
205 | 205 | } else { |
206 | 206 | $r .= '<tr>' . $this->deletedLine( $line ) . "</tr>\n"; |
207 | 207 | } |
… |
… |
class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { |
226 | 226 | $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'unchanged' ); |
227 | 227 | } |
228 | 228 | if ( $this->_show_split_view ) { |
229 | | $r .= '<tr>' . $this->contextLine( $line ) . $this->emptyLine() . $this->contextLine( $line ) . "</tr>\n"; |
| 229 | $r .= '<tr>' . $this->contextLine( $line ) . $this->contextLine( $line ) . "</tr>\n"; |
230 | 230 | } else { |
231 | 231 | $r .= '<tr>' . $this->contextLine( $line ) . "</tr>\n"; |
232 | 232 | } |
… |
… |
class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { |
319 | 319 | $r .= $this->_deleted( array( $orig_line ), false ); |
320 | 320 | } else { // A true changed row. |
321 | 321 | if ( $this->_show_split_view ) { |
322 | | $r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->emptyLine() . $this->addedLine( $final_line ) . "</tr>\n"; |
| 322 | $r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->addedLine( $final_line ) . "</tr>\n"; |
323 | 323 | } else { |
324 | 324 | $r .= '<tr>' . $this->deletedLine( $orig_line ) . '</tr><tr>' . $this->addedLine( $final_line ) . "</tr>\n"; |
325 | 325 | } |
diff --git src/wp-includes/pluggable.php src/wp-includes/pluggable.php
index b2ed4642c5..f9f28853f8 100644
|
|
if ( ! function_exists( 'wp_text_diff' ) ) : |
2805 | 2805 | return ''; |
2806 | 2806 | } |
2807 | 2807 | |
2808 | | $r = "<table class='diff'>\n"; |
| 2808 | $is_split_view = ! empty( $args['show_split_view'] ); |
| 2809 | $is_split_view_class = $is_split_view ? ' is-split-view' : ''; |
2809 | 2810 | |
2810 | | if ( ! empty( $args['show_split_view'] ) ) { |
2811 | | $r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />"; |
2812 | | } else { |
2813 | | $r .= "<col class='content' />"; |
| 2811 | $r = "<table class='diff$is_split_view_class'>\n"; |
| 2812 | |
| 2813 | if ( $args['title'] ) { |
| 2814 | $r .= "<caption class='diff-title'>$args[title]</caption>\n"; |
2814 | 2815 | } |
2815 | 2816 | |
2816 | | if ( $args['title'] || $args['title_left'] || $args['title_right'] ) { |
| 2817 | if ( $args['title_left'] || $args['title_right'] ) { |
2817 | 2818 | $r .= '<thead>'; |
2818 | 2819 | } |
2819 | | if ( $args['title'] ) { |
2820 | | $r .= "<tr class='diff-title'><th colspan='4'>$args[title]</th></tr>\n"; |
2821 | | } |
| 2820 | |
2822 | 2821 | if ( $args['title_left'] || $args['title_right'] ) { |
| 2822 | $th_or_td_left = empty( $args['title_left'] ) ? 'td' : 'th'; |
| 2823 | $th_or_td_right = empty( $args['title_right'] ) ? 'td' : 'th'; |
| 2824 | |
2823 | 2825 | $r .= "<tr class='diff-sub-title'>\n"; |
2824 | | $r .= "\t<td></td><th>$args[title_left]</th>\n"; |
2825 | | $r .= "\t<td></td><th>$args[title_right]</th>\n"; |
| 2826 | $r .= "\t<$th_or_td_left>$args[title_left]</$th_or_td_left>\n"; |
| 2827 | if ( $is_split_view ) { |
| 2828 | $r .= "\t<$th_or_td_right>$args[title_right]</$th_or_td_right>\n"; |
| 2829 | } |
2826 | 2830 | $r .= "</tr>\n"; |
2827 | 2831 | } |
2828 | | if ( $args['title'] || $args['title_left'] || $args['title_right'] ) { |
| 2832 | |
| 2833 | if ( $args['title_left'] || $args['title_right'] ) { |
2829 | 2834 | $r .= "</thead>\n"; |
2830 | 2835 | } |
2831 | 2836 | |