WordPress.org

Make WordPress Core

Ticket #15761: garyc40-15761.patch

File garyc40-15761.patch, 14.5 KB (added by garyc40, 9 years ago)

UI for bulk edit (JS disabled), javascript fix for checkbox behavior during bulk edit

  • wp-admin/edit.php

    diff --git wp-admin/edit.php wp-admin/edit.php
    index 883cb5d..3b72564 100644
     
    88
    99/** WordPress Administration Bootstrap */
    1010require_once( './admin.php' );                 
     11
    1112$wp_list_table = get_list_table('WP_Posts_List_Table');
    1213$wp_list_table->check_permissions();
    1314$pagenum = $wp_list_table->get_pagenum();
    unset( $_redirect ); 
    2324
    2425$doaction = $wp_list_table->current_action();
    2526
    26 if ( $doaction ) {
     27if ( $doaction && ! $wp_list_table->is_bulk_edit_form() ) {
    2728        check_admin_referer('bulk-posts');
    2829
    2930        $sendback = remove_query_arg( array('trashed', 'untrashed', 'deleted', 'ids'), wp_get_referer() );
    if ( $doaction ) { 
    4243                $post_ids = explode( ',', $_REQUEST['ids'] );
    4344        } elseif ( !empty( $_REQUEST['post'] ) ) {
    4445                $post_ids = array_map('intval', $_REQUEST['post']);
     46        } elseif ( ! empty( $_REQUEST['bulk_post'] ) ) {
     47                $post_ids = array_map( 'intval', $_REQUEST['bulk_post'] );
    4548        }
    46 
     49       
    4750        if ( !isset( $post_ids ) ) {
    4851                wp_redirect( admin_url("edit.php?post_type=$post_type") );
    4952                exit;
    if ( $doaction ) { 
    6265                                $trashed++;
    6366                        }
    6467                        $sendback = add_query_arg( array('trashed' => $trashed, 'ids' => join(',', $post_ids) ), $sendback );
     68                        $sendback = remove_query_arg( array( 'updated' ), $sendback );
    6569                        break;
    6670                case 'untrash':
    6771                        $untrashed = 0;
    if ( $doaction ) { 
    103107                                $done['skipped'] = count( $done['skipped'] );
    104108                                $done['locked'] = count( $done['locked'] );
    105109                                $sendback = add_query_arg( $done, $sendback );
     110                                $sendback = remove_query_arg( array( 'bulk_post' ), $sendback );
    106111                        }
     112
    107113                        break;
    108114        }
    109115
    110116        $sendback = remove_query_arg( array('action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status',  'post', 'bulk_edit', 'post_view'), $sendback );
    111 
    112117        wp_redirect($sendback);
    113118        exit();
    114119} elseif ( ! empty($_REQUEST['_wp_http_referer']) ) {
    $_SERVER['REQUEST_URI'] = remove_query_arg( array('locked', 'skipped', 'updated' 
    247252
    248253<?php
    249254if ( $wp_list_table->has_items() )
    250         $wp_list_table->inline_edit();
     255        if ( $wp_list_table->is_bulk_edit_form() ) {
     256                $wp_list_table->inline_edit( 'inline' );
     257        } else {
     258                $wp_list_table->inline_edit();
     259        }
    251260?>
    252261
    253262<div id="ajax-response"></div>
  • wp-admin/includes/class-wp-list-table.php

    diff --git wp-admin/includes/class-wp-list-table.php wp-admin/includes/class-wp-list-table.php
    index 5a3fd00..920f16c 100644
    class WP_List_Table { 
    700700        </tr>
    701701        </tfoot>
    702702
     703        <?php do_action( 'wp_list_table_tbody' ); ?>
     704
    703705        <tbody id="the-list"<?php if ( $singular ) echo " class='list:$singular'"; ?>>
    704706                <?php $this->display_rows(); ?>
    705707        </tbody>
  • wp-admin/includes/class-wp-posts-list-table.php

    diff --git wp-admin/includes/class-wp-posts-list-table.php wp-admin/includes/class-wp-posts-list-table.php
    index 696b911..8dbc4e3 100644
    class WP_Posts_List_Table extends WP_List_Table { 
    1616         * @access protected
    1717         */
    1818        var $hierarchical_display;
     19       
     20        /**
     21         * Whether the bulk edit form should be displayed (when JavaScript is disabled)
     22         *
     23         * @since 3.1.0
     24         * @var bool
     25         * @access protected
     26         */
     27        var $bulk_edit_display = false;
    1928
    2029        /**
    2130         * Holds the number of pending comments for each post
    class WP_Posts_List_Table extends WP_List_Table { 
    8493                if ( !current_user_can( $post_type_object->cap->edit_posts ) )
    8594                        wp_die( __( 'Cheatin&#8217; uh?' ) );
    8695        }
     96       
     97        function is_bulk_edit_form() {
     98                return $this->bulk_edit_display;
     99        }
     100       
     101        function display_bulk_edit_form() {
     102                $this->inline_edit( 'bulk' );
     103        }
    87104
    88105        function prepare_items() {
    89106                global $post_type_object, $post_type, $avail_post_stati, $wp_query, $per_page, $mode;
    class WP_Posts_List_Table extends WP_List_Table { 
    237254                if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )
    238255                        return 'delete_all';
    239256
    240                 return parent::current_action();
     257                if ( isset( $_REQUEST['bulk_post'] ) ) {
     258                        return 'edit';
     259                }
     260
     261                $action = parent::current_action();
     262
     263                if ( $action == 'edit' && ! isset( $_REQUEST['bulk_edit']) ) {                 
     264                        $this->bulk_edit_display = true;
     265                        add_action( 'wp_list_table_tbody', array( &$this, 'display_bulk_edit_form' ) );
     266                }
     267               
     268                return $action;
    241269        }
    242270
    243271        function pagination( $which ) {
    class WP_Posts_List_Table extends WP_List_Table { 
    496524                        switch ( $column_name ) {
    497525
    498526                        case 'cb':
     527                                $checked = ( isset( $_REQUEST['post'] ) && in_array( $post->ID, $_REQUEST['post'] ) ) ? ' checked="checked"' : '';
    499528                        ?>
    500                         <th scope="row" class="check-column"><?php if ( $can_edit_post ) { ?><input type="checkbox" name="post[]" value="<?php the_ID(); ?>" /><?php } ?></th>
     529                        <th scope="row" class="check-column"><?php if ( $can_edit_post ) { ?><input type="checkbox" name="post[]" value="<?php the_ID(); ?>"<?php echo $checked; ?> /><?php } ?></th>
    501530                        <?php
    502531                        break;
    503532
    class WP_Posts_List_Table extends WP_List_Table { 
    684713        }
    685714
    686715        /**
    687          * Outputs the hidden row displayed when inline editing
     716         * Outputs inline editing forms
    688717         *
    689718         * @since 3.1.0
     719         *
     720         * @param string $which Specify which form to be output. Can be one of the following: 'inline', 'bulk', or 'both'
    690721         */
    691         function inline_edit() {
     722        function inline_edit( $which = 'both' ) {
    692723                global $mode;
    693724
    694725                $screen = get_current_screen();
    class WP_Posts_List_Table extends WP_List_Table { 
    714745                $m = ( isset( $mode ) && 'excerpt' == $mode ) ? 'excerpt' : 'list';
    715746                $can_publish = current_user_can( $post_type_object->cap->publish_posts );
    716747                $core_columns = array( 'cb' => true, 'date' => true, 'title' => true, 'categories' => true, 'tags' => true, 'comments' => true, 'author' => true );
    717 
     748                $as_tbody = ( $which == 'bulk' && $this->bulk_edit_display );
     749               
     750                if ( $as_tbody && empty( $_REQUEST['post'] ) ) {
     751                        return;
     752                }
     753               
     754                $style = ( $as_tbody ) ? '' : ' style="display:none;"';
    718755        ?>
    719756
    720         <form method="get" action=""><table style="display: none"><tbody id="inlineedit">
     757        <?php if ( ! $as_tbody ): ?>
     758        <form method="get" action=""><table<?php echo $style; ?>><?php endif; ?>
     759                <tbody id="inlineedit">
    721760                <?php
    722761                $hclass = count( $hierarchical_taxonomies ) ? 'post' : 'page';
    723762                $bulk = 0;
    724                 while ( $bulk < 2 ) { ?>
     763                $max = 2;
     764               
     765                if ( $which == 'bulk' ) {
     766                        $bulk = 1;
     767                }
     768               
     769                if ( $which == 'inline' ) {
     770                        $max = 1;
     771                }
     772               
     773                while ( $bulk < $max ) { ?>
    725774
    726                 <tr id="<?php echo $bulk ? 'bulk-edit' : 'inline-edit'; ?>" class="inline-edit-row inline-edit-row-<?php echo "$hclass inline-edit-$screen->post_type ";
     775                <tr id="<?php echo $bulk ? 'bulk-edit' : 'inline-edit'; ?>" class="inline-editor inline-edit-row inline-edit-row-<?php echo "$hclass inline-edit-$screen->post_type ";
    727776                        echo $bulk ? "bulk-edit-row bulk-edit-row-$hclass bulk-edit-$screen->post_type" : "quick-edit-row quick-edit-row-$hclass inline-edit-$screen->post_type";
    728                 ?>" style="display: none"><td colspan="<?php echo $this->get_column_count(); ?>" class="colspanchange">
     777                ?>"<?php echo $style; ?>><td colspan="<?php echo $this->get_column_count(); ?>" class="colspanchange">
    729778
    730779                <fieldset class="inline-edit-col-left"><div class="inline-edit-col">
    731780                        <h4><?php echo $bulk ? __( 'Bulk Edit' ) : __( 'Quick Edit' ); ?></h4>
    class WP_Posts_List_Table extends WP_List_Table { 
    734783        if ( post_type_supports( $screen->post_type, 'title' ) ) :
    735784                if ( $bulk ) : ?>
    736785                        <div id="bulk-title-div">
    737                                 <div id="bulk-titles"></div>
     786                                <div id="bulk-titles">
     787                                        <?php
     788                                        if ( $as_tbody ) {
     789                                                $post_ids = $_REQUEST['post'];
     790                                               
     791                                                foreach ( $post_ids as $post_id ) {
     792                                                        $post = get_post( $post_id );
     793                                                        $title = esc_html( apply_filters( 'the_title', $post->post_title ) );
     794                                                        $temp_ids = array_diff( $post_ids, array( $post_id ) );
     795                                                        $delete_link = remove_query_arg( array( 'post' ), $_SERVER['REQUEST_URI'] );
     796                                                        $delete_link = add_query_arg( array( 'post' => $temp_ids ), $_SERVER['REQUEST_URI'] );
     797                                                        ?>
     798                                                                <div id="ttle<?php echo $post_id; ?>">
     799                                                                        <a id="_<?php echo $post_id; ?>" class="ntdelbutton" title="Remove From Bulk Edit" href="<?php echo $delete_link; ?>">X</a>
     800                                                                        <?php echo $title; ?>
     801                                                                        <input type="hidden" name="bulk_post[]" value="<?php echo $post_id; ?>" />
     802                                                                </div>
     803                                                        <?php
     804                                                }
     805                                        }
     806                                        ?>
     807                                </div>
    738808                        </div>
    739809
    740810        <?php else : // $bulk ?>
    class WP_Posts_List_Table extends WP_List_Table { 
    808878
    809879                </div></fieldset>
    810880
    811         <?php if ( count( $hierarchical_taxonomies ) && !$bulk ) : ?>
     881        <?php if ( count( $hierarchical_taxonomies ) && ( !$bulk || $as_tbody ) ) : ?>
    812882
    813883                <fieldset class="inline-edit-col-center inline-edit-categories"><div class="inline-edit-col">
    814884
    class WP_Posts_List_Table extends WP_List_Table { 
    827897
    828898                </div></fieldset>
    829899
    830         <?php endif; // count( $hierarchical_taxonomies ) && !$bulk ?>
     900        <?php endif; // count( $hierarchical_taxonomies ) && ( !$bulk || $as_tbody ) ?>
    831901
    832902                <fieldset class="inline-edit-col-right"><div class="inline-edit-col">
    833903
    834         <?php
    835                 if ( post_type_supports( $screen->post_type, 'author' ) && $bulk )
    836                         echo $authors_dropdown;
    837         ?>
    838 
    839904        <?php if ( $post_type_object->hierarchical ) : ?>
    840905
    841906                        <label>
    class WP_Posts_List_Table extends WP_List_Table { 
    874939                endif; // post_type_supports page-attributes
    875940        endif; // $post_type_object->hierarchical ?>
    876941
    877         <?php if ( count( $flat_taxonomies ) && !$bulk ) : ?>
     942        <?php if ( count( $flat_taxonomies ) && ( !$bulk || $as_tbody ) ) : ?>
    878943
    879944        <?php foreach ( $flat_taxonomies as $taxonomy ) : ?>
    880945
    class WP_Posts_List_Table extends WP_List_Table { 
    885950
    886951        <?php endforeach; //$flat_taxonomies as $taxonomy ?>
    887952
    888         <?php endif; // count( $flat_taxonomies ) && !$bulk  ?>
     953        <?php endif; // count( $flat_taxonomies ) && ( !$bulk || $as_tbody )  ?>
     954       
     955        <?php
     956                if ( post_type_supports( $screen->post_type, 'author' ) && $bulk )
     957                        echo $authors_dropdown;
     958        ?>
    889959
    890960        <?php if ( post_type_supports( $screen->post_type, 'comments' ) || post_type_supports( $screen->post_type, 'trackbacks' ) ) :
    891961                if ( $bulk ) : ?>
    class WP_Posts_List_Table extends WP_List_Table { 
    9981068                        <?php } else {
    9991069                                submit_button( __( 'Update' ), 'button-primary alignright', 'bulk_edit', false, array( 'accesskey' => 's' ) );
    10001070                        } ?>
     1071                       
    10011072                        <input type="hidden" name="post_view" value="<?php echo esc_attr( $m ); ?>" />
    10021073                        <input type="hidden" name="screen" value="<?php echo esc_attr( $screen->id ); ?>" />
    10031074                        <br class="clear" />
    class WP_Posts_List_Table extends WP_List_Table { 
    10071078                $bulk++;
    10081079                }
    10091080?>
    1010                 </tbody></table></form>
     1081                </tbody>
     1082                <?php if ( ! $as_tbody ): ?> </table></form> <?php endif; ?>
    10111083<?php
    10121084        }
    10131085}
  • wp-admin/includes/post.php

    diff --git wp-admin/includes/post.php wp-admin/includes/post.php
    index e445c1e..0de142f 100644
    function bulk_edit_posts( $post_data = null ) { 
    245245        if ( empty($post_data) )
    246246                $post_data = &$_POST;
    247247
     248        if ( isset( $post_data['bulk_post'] ) ) {
     249                $post_data['post'] = array_unique( array_merge( $post_data['post'], $post_data['bulk_post'] ) );
     250        }
     251
    248252        if ( isset($post_data['post_type']) )
    249253                $ptype = get_post_type_object($post_data['post_type']);
    250254        else
  • wp-admin/js/inline-edit-post.dev.js

    diff --git wp-admin/js/inline-edit-post.dev.js wp-admin/js/inline-edit-post.dev.js
    index 1a257c6..9ffb88c 100644
     
    11(function($) {
    22inlineEditPost = {
     3        bulkEditing : false,
    34
    45        init : function(){
    56                var t = this, qeRow = $('#inline-edit'), bulkRow = $('#bulk-edit');
    inlineEditPost = { 
    4647                        inlineEditPost.edit(this);
    4748                        return false;
    4849                });
     50               
     51                $('.check-column input').live('click', function(){
     52                        var id;
     53                        if (inlineEditPost.bulkEditing) {
     54                                id = $(this).val();
     55                                if ($(this).attr('checked')) {
     56                                        inlineEditPost.addToBulk(id);
     57                                } else {
     58                                        inlineEditPost.removeFromBulk(id);
     59                                }
     60                        }
     61                });
     62               
     63                $('#bulk-titles a').live('click', function(){
     64                        var id = $(this).attr('id').substr(1);
     65                        inlineEditPost.removeFromBulk(id);
     66                });
    4967
    5068                $('#bulk-title-div').parents('fieldset').after(
    5169                        $('#inline-edit fieldset.inline-edit-categories').clone()
    inlineEditPost = { 
    84102                var t = this;
    85103                $(t.what+t.getId(el)).css('display') == 'none' ? t.revert() : t.edit(el);
    86104        },
     105       
     106        addToBulk : function(id) {
     107                var theTitle, item;
     108                theTitle = $('#inline_'+id+' .post_title').text() || inlineEditL10n.notitle;
     109                item = '<div id="ttle'+id+'"><a id="_'+id+'" class="ntdelbutton" title="'+inlineEditL10n.ntdeltitle+'">X</a>'+theTitle+'</div>';
     110                $('#bulk-titles').append(item);
     111        },
     112       
     113        removeFromBulk : function(id) {
     114                $('table.widefat input[value="'+id+'"]').attr('checked', '');
     115                $('#ttle'+id).remove();
     116        },
    87117
    88118        setBulk : function(){
    89                 var te = '', type = this.type, tax, c = true;
     119                var type = this.type, tax, c = true;
    90120                this.revert();
     121                this.bulkEditing = true;
    91122
    92123                $('#bulk-edit td').attr('colspan', $('.widefat:first thead th:visible').length);
    93124                $('table.widefat tbody').prepend( $('#bulk-edit') );
    inlineEditPost = { 
    96127                $('tbody th.check-column input[type="checkbox"]').each(function(i){
    97128                        if ( $(this).attr('checked') ) {
    98129                                c = false;
    99                                 var id = $(this).val(), theTitle;
    100                                 theTitle = $('#inline_'+id+' .post_title').text() || inlineEditL10n.notitle;
    101                                 te += '<div id="ttle'+id+'"><a id="_'+id+'" class="ntdelbutton" title="'+inlineEditL10n.ntdeltitle+'">X</a>'+theTitle+'</div>';
     130                                var id = $(this).val();
     131                                inlineEditPost.addToBulk(id);
    102132                        }
    103133                });
    104134
    105135                if ( c )
    106136                        return this.revert();
    107137
    108                 $('#bulk-titles').html(te);
    109                 $('#bulk-titles a').click(function(){
    110                         var id = $(this).attr('id').substr(1);
    111 
    112                         $('table.widefat input[value="'+id+'"]').attr('checked', '');
    113                         $('#ttle'+id).remove();
    114                 });
     138//              $('#bulk-titles').html(te);
    115139
    116140                // enable autocomplete for tags
    117141                if ( 'post' == type ) {
    inlineEditPost = { 
    265289                                $('table.widefat #bulk-edit').removeClass('inline-editor').hide();
    266290                                $('#bulk-titles').html('');
    267291                                $('#inlineedit').append( $('#bulk-edit') );
     292                                this.bulkEditing = false;
    268293                        } else {
    269294                                $('#'+id).remove();
    270295                                id = id.substr( id.lastIndexOf('-') + 1 );
  • wp-admin/post.php

    diff --git wp-admin/post.php wp-admin/post.php
    index 883ec3f..21cfeeb 100644
    case 'trash': 
    218218
    219219        if ( ! wp_trash_post($post_id) )
    220220                wp_die( __('Error in moving to Trash.') );
     221        $sendback = remove_query_arg( 'updated', $sendback );
    221222
    222223        wp_redirect( add_query_arg( array('trashed' => 1, 'ids' => $post_id), $sendback ) );
    223224        exit();