wp/wp-admin/js/inline-edit-post.js
changeset 21 48c4eec2b7e6
parent 19 3d72ae0968f4
child 22 8c2e4d02f4ef
--- a/wp/wp-admin/js/inline-edit-post.js	Thu Sep 29 08:06:27 2022 +0200
+++ b/wp/wp-admin/js/inline-edit-post.js	Fri Sep 05 18:40:08 2025 +0200
@@ -178,6 +178,8 @@
 	 */
 	setBulk : function(){
 		var te = '', type = this.type, c = true;
+		var checkedPosts = $( 'tbody th.check-column input[type="checkbox"]:checked' );
+		var categories = {};
 		this.revert();
 
 		$( '#bulk-edit td' ).attr( 'colspan', $( 'th:visible, td:visible', '.widefat:first thead' ).length );
@@ -217,6 +219,44 @@
 		// Populate the list of items to bulk edit.
 		$( '#bulk-titles' ).html( '<ul id="bulk-titles-list" role="list">' + te + '</ul>' );
 
+		// Gather up some statistics on which of these checked posts are in which categories.
+		checkedPosts.each( function() {
+			var id      = $( this ).val();
+			var checked = $( '#category_' + id ).text().split( ',' );
+
+			checked.map( function( cid ) {
+				categories[ cid ] || ( categories[ cid ] = 0 );
+				// Just record that this category is checked.
+				categories[ cid ]++;
+			} );
+		} );
+
+		// Compute initial states.
+		$( '.inline-edit-categories input[name="post_category[]"]' ).each( function() {
+			if ( categories[ $( this ).val() ] == checkedPosts.length ) {
+				// If the number of checked categories matches the number of selected posts, then all posts are in this category.
+				$( this ).prop( 'checked', true );
+			} else if ( categories[ $( this ).val() ] > 0 ) {
+				// If the number is less than the number of selected posts, then it's indeterminate.
+				$( this ).prop( 'indeterminate', true );
+				if ( ! $( this ).parent().find( 'input[name="indeterminate_post_category[]"]' ).length ) {
+					// Get the term label text.
+					var label = $( this ).parent().text();
+					// Set indeterminate states for the backend. Add accessible text for indeterminate inputs. 
+					$( this ).after( '<input type="hidden" name="indeterminate_post_category[]" value="' + $( this ).val() + '">' ).attr( 'aria-label', label.trim() + ': ' + wp.i18n.__( 'Some selected posts have this category' ) );
+				}
+			}
+		} );
+
+		$( '.inline-edit-categories input[name="post_category[]"]:indeterminate' ).on( 'change', function() {
+			// Remove accessible label text. Remove the indeterminate flags as there was a specific state change.
+			$( this ).removeAttr( 'aria-label' ).parent().find( 'input[name="indeterminate_post_category[]"]' ).remove();
+		} );
+
+		$( '.inline-edit-save button' ).on( 'click', function() {
+			$( '.inline-edit-categories input[name="post_category[]"]' ).prop( 'indeterminate', false );
+		} );
+
 		/**
 		 * Binds on click events to handle the list of items to bulk edit.
 		 *
@@ -228,6 +268,7 @@
 				$prev = $this.parent().prev().children( '.ntdelbutton' ),
 				$next = $this.parent().next().children( '.ntdelbutton' );
 
+			$( 'input#cb-select-all-1, input#cb-select-all-2' ).prop( 'checked', false );
 			$( 'table.widefat input[value="' + id + '"]' ).prop( 'checked', false );
 			$( '#_' + id ).parent().remove();
 			wp.a11y.speak( wp.i18n.__( 'Item removed.' ), 'assertive' );
@@ -305,7 +346,7 @@
 		if ( !$(':input[name="post_author"] option[value="' + $('.post_author', rowData).text() + '"]', editRow).val() ) {
 
 			// The post author no longer has edit capabilities, so we need to add them to the list of authors.
-			$(':input[name="post_author"]', editRow).prepend('<option value="' + $('.post_author', rowData).text() + '">' + $('#' + t.type + '-' + id + ' .author').text() + '</option>');
+			$(':input[name="post_author"]', editRow).prepend('<option value="' + $('.post_author', rowData).text() + '">' + $('#post-' + id + ' .author').text() + '</option>');
 		}
 		if ( $( ':input[name="post_author"] option', editRow ).length === 1 ) {
 			$('label.inline-edit-author', editRow).hide();
@@ -376,9 +417,14 @@
 		});
 
 		// Handle the post status.
+		var post_date_string = $(':input[name="aa"]').val() + '-' + $(':input[name="mm"]').val() + '-' + $(':input[name="jj"]').val();
+		post_date_string += ' ' + $(':input[name="hh"]').val() + ':' + $(':input[name="mn"]').val() + ':' + $(':input[name="ss"]').val();
+		var post_date = new Date( post_date_string );
 		status = $('._status', rowData).text();
-		if ( 'future' !== status ) {
+		if ( 'future' !== status && Date.now() > post_date ) {
 			$('select[name="_status"] option[value="future"]', editRow).remove();
+		} else {
+			$('select[name="_status"] option[value="publish"]', editRow).remove();
 		}
 
 		pw = $( '.inline-edit-password-input' ).prop( 'disabled', false );