Make WordPress Core

Changeset 56712


Ignore:
Timestamp:
09/26/2023 03:03:19 PM (5 months ago)
Author:
costdev
Message:

Quick/Bulk Edit: Pre-fill category fields with their status.

This pre-fills category fields in the Quick/Bulk Edit form with their current status.

When bulk editing, if only some of the selected items are in a given category, the category's checkbox will display a line to indicate an indeterminate status.

Props pavelevap, scribu, chasedsiedu, helen, joshcanhelp, ubernaut, Cyberchicken, laumindproductscomau, SergeyBiryukov, Marcoevich, tomybyte, thinkluke, virtality-marketing-solutions, Michalooki, dmsnell, itecrs, pannelars, WHSajid, samba45, Mte90, johnbillion, tomluckies, soulseekah, francina, oglekler, ajmcfadyen, mukesh27, costdev.
Fixes #11302.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/js/_enqueues/admin/inline-edit-post.js

    r56022 r56712  
    179179    setBulk : function(){
    180180        var te = '', type = this.type, c = true;
     181        var checkedPosts = $( 'tbody th.check-column input[type="checkbox"]:checked' );
     182        var categories = {};
     183        var indeterminatePostCategoryField = $( '<input type="hidden" name="indeterminate_post_category[]">' );
    181184        this.revert();
    182185
     
    217220        // Populate the list of items to bulk edit.
    218221        $( '#bulk-titles' ).html( '<ul id="bulk-titles-list" role="list">' + te + '</ul>' );
     222
     223        // Gather up some statistics on which of these checked posts are in which categories.
     224        checkedPosts.each( function() {
     225            var id      = $( this ).val();
     226            var checked = $( '#category_' + id ).text().split( ',' );
     227
     228            checked.map( function( cid ) {
     229                categories[ cid ] || ( categories[ cid ] = 0 );
     230                // Just record that this category is checked.
     231                categories[ cid ]++;
     232            } );
     233        } );
     234
     235        // Compute initial states.
     236        $( '.inline-edit-categories input[name="post_category[]"]' ).each( function() {
     237            // Clear indeterminate states.
     238            $( '<input type="hidden" name="indeterminate_post_category[]">' ).remove();
     239
     240            if ( categories[ $( this ).val() ] == checkedPosts.length ) {
     241                // If the number of checked categories matches the number of selected posts, then all posts are in this category.
     242                $( this ).prop( 'checked', true );
     243            } else if ( categories[ $( this ).val() ] > 0 ) {
     244                // If the number is less than the number of selected posts, then it's indeterminate.
     245                $( this ).prop( 'indeterminate', true );
     246
     247                // Set indeterminate states for the backend.
     248                indeterminatePostCategoryField.val( $( this ).val() );
     249                $( this ).after( indeterminatePostCategoryField );
     250            }
     251        } );
     252
     253        $( '.inline-edit-categories input[name="post_category[]"]' ).on( 'change', function() {
     254            // Remove the indeterminate flags as there was a specific state change.
     255            $( this ).parent().find( 'input[name="indeterminate_post_category[]"]' ).remove();
     256        } );
     257
     258        $( '.inline-edit-save button' ).on( 'click', function() {
     259            $( '.inline-edit-categories input[name="post_category[]"]' ).prop( 'indeterminate', false );
     260        } );
    219261
    220262        /**
  • trunk/src/wp-admin/css/list-tables.css

    r56665 r56712  
    11481148}
    11491149
     1150ul.cat-checklist input[name="post_category[]"]:indeterminate::before {
     1151    content: '';
     1152    border-top: 2px solid grey;
     1153    width: 65%;
     1154    height: 2px;
     1155    position: absolute;
     1156    top: calc( 50% + 1px );
     1157    left: 50%;
     1158    transform: translate( -50%, -50% );
     1159}
     1160
    11501161#bulk-titles .ntdelbutton,
    11511162#bulk-titles .ntdeltitle,
  • trunk/src/wp-admin/includes/post.php

    r56587 r56712  
    642642
    643643        if ( isset( $new_cats ) && in_array( 'category', $tax_names, true ) ) {
    644             $cats                       = (array) wp_get_post_categories( $post_id );
    645             $post_data['post_category'] = array_unique( array_merge( $cats, $new_cats ) );
     644            $cats = (array) wp_get_post_categories( $post_id );
     645
     646            if (
     647                isset( $post_data['indeterminate_post_category'] )
     648                && is_array( $post_data['indeterminate_post_category'] )
     649            ) {
     650                $indeterminate_post_category = $post_data['indeterminate_post_category'];
     651            } else {
     652                $indeterminate_post_category = array();
     653            }
     654
     655            $indeterminate_cats         = array_intersect( $cats, $indeterminate_post_category );
     656            $determinate_cats           = array_diff( $new_cats, $indeterminate_post_category );
     657            $post_data['post_category'] = array_unique( array_merge( $indeterminate_cats, $determinate_cats ) );
     658
    646659            unset( $post_data['tax_input']['category'] );
    647660        }
Note: See TracChangeset for help on using the changeset viewer.