diff --git a/src/js/_enqueues/lib/nav-menu.js b/src/js/_enqueues/lib/nav-menu.js index d3b9663487..b8dbd40ad6 100644 --- a/src/js/_enqueues/lib/nav-menu.js +++ b/src/js/_enqueues/lib/nav-menu.js @@ -45,6 +45,11 @@ this.attachMenuEditListeners(); + this.attachBulkSelectButtonListeners(); + this.attachMenuCheckBoxListeners(); + this.attachMenuItemDeleteButton(); + this.attachPendingMenuItemsListForDeletion(); + this.attachQuickSearchListeners(); this.attachThemeLocationsListeners(); this.attachMenuSaveSubmitListeners(); @@ -862,6 +867,183 @@ }); }, + /** + * Handle toggling bulk selection checkboxes for menu items. + * + * @since 5.8.0 + */ + attachBulkSelectButtonListeners : function() { + var that = this; + + $('.bulk-select-switcher').on( 'change', function(){ + if( this.checked ){ + $('.bulk-select-switcher').prop('checked',true); + that.enableBulkSelection(); + }else{ + $('.bulk-select-switcher').prop('checked',false); + that.disableBulkSelection(); + } + }); + }, + + /** + * Enable bulk selection checkboxes for menu items. + * + * @since 5.8.0 + */ + enableBulkSelection : function() { + $('#menu-to-edit').addClass('bulk-selection'); + $('#nav-menu-bulk-actions-top').addClass('bulk-selection'); + $('#nav-menu-bulk-actions-bottom').addClass('bulk-selection'); + + var checkbox = $('#menu-to-edit .menu-item-checkbox'); + $.each( checkbox, function(){ + $(this).prop('disabled',false); + }); + }, + + /** + * Disable bulk selection checkboxes for menu items. + * + * @since 5.8.0 + */ + disableBulkSelection : function() { + $('#menu-to-edit').removeClass('bulk-selection'); + $('#nav-menu-bulk-actions-top').removeClass('bulk-selection'); + $('#nav-menu-bulk-actions-bottom').removeClass('bulk-selection'); + + if ( $('.menu-items-delete').is('[aria-describedby="pending-menu-items-to-delete"]') ) { + $('.menu-items-delete').removeAttr( 'aria-describedby' ); + } + + var checkbox = $('#menu-to-edit .menu-item-checkbox'); + $.each( checkbox, function(){ + $(this).prop('disabled',true).prop('checked',false); + }); + $('.menu-items-delete').addClass('disabled'); + $('#pending-menu-items-to-delete ul').empty(); + }, + + /** + * Listen for state changes on bulk action checkboxes. + * + * @since 5.8.0 + */ + attachMenuCheckBoxListeners : function() { + var that = this; + + $( '#menu-to-edit' ).on( 'change', '.menu-item-checkbox', function(){ + that.setRemoveSelectedButtonStatus(); + }); + }, + + /** + * Create delete button to remove menu items from collection. + * + * @since 5.8.0 + */ + attachMenuItemDeleteButton : function() { + var that = this; + + $( document ).on('click', '.menu-items-delete', function(e){ + e.preventDefault(); + + if( ! $(this).hasClass('disabled') ){ + $.each( $('.menu-item-checkbox:checked'), function( index, element ) { + $( element ).parents( 'li' ).find( 'a.item-delete' ).trigger( 'click' ); + }); + + $('.menu-items-delete').addClass('disabled'); + $('.bulk-select-switcher').prop('checked',false); + + var itemsPendingDeletion = ''; + var itemsPendingDeletionList = $('#pending-menu-items-to-delete ul li'); + + $.each( itemsPendingDeletionList, function( index, element ) { + var itemName = $( element ).find( '.pending-menu-item-name' ).text(); + var itemSpeech = menus.menuItemDeletion.replace( '%s', itemName ); + itemsPendingDeletion += itemSpeech ; + if( ( index + 1 ) < itemsPendingDeletionList.length ){ + itemsPendingDeletion += ', ' ; + } + }); + + var deletionSpeech = menus.itemsDeleted.replace( '%s', itemsPendingDeletion ); + wp.a11y.speak( deletionSpeech, 'polite' ); + that.disableBulkSelection(); + } + }); + }, + + /** + * List menu items awaiting deletion. + * + * @since 5.8.0 + */ + attachPendingMenuItemsListForDeletion : function(){ + $('#post-body-content').on( 'change', '.menu-item-checkbox', function(){ + + if( ! $('.menu-items-delete').is('[aria-describedby="pending-menu-items-to-delete"]') ){ $('.menu-items-delete').attr( 'aria-describedby', 'pending-menu-items-to-delete' ); } + + var menuItemName = $(this).next().text(); + var menuItemType = $(this).parent().next('.item-controls').find('.item-type').text(); + var menuItemID = $(this).attr('data-menu-item-id') ; + + var ListedMenuItem = $('#pending-menu-items-to-delete ul').find('[data-menu-item-id=' + menuItemID + ']') ; + if( ListedMenuItem.length > 0 ){ + ListedMenuItem.remove(); + } + if( this.checked === true ){ + $('#pending-menu-items-to-delete ul').append( '