WordPress.org

Make WordPress Core

Ticket #14045: 14045.2.diff

File 14045.2.diff, 13.7 KB (added by lessbloat, 5 years ago)
  • wp-admin/includes/nav-menu.php

     
    8989                <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>">
    9090                        <dl class="menu-item-bar">
    9191                                <dt class="menu-item-handle">
    92                                         <span class="item-title"><?php echo esc_html( $title ); ?> <span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span></span>
     92                                        <span class="item-title"><span class="menu-item-title"><?php echo esc_html( $title ); ?></span> <span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span></span>
    9393                                        <span class="item-controls">
    9494                                                <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
    9595                                                <span class="item-order hide-if-js">
     
    173173                                        </label>
    174174                                </p>
    175175
     176                                <p class="field-move description description-wide">
     177                                        <label>
     178                                                <?php _e( 'Reorganize' ); ?>
     179                                                <a href="#" class="menus-move-up"><?php _e( 'Move up' ); ?></a>
     180                                                <a href="#" class="menus-move-down"><?php _e( 'Move down' ); ?></a>
     181                                                <a href="#" class="menus-move-left"><?php if ( is_rtl() ) { _e( 'Move Right' ); } else { _e( 'Move Left' ); } ?></a>
     182                                                <a href="#" class="menus-move-right"><?php if ( is_rtl() ) { _e( 'Move Left' ); } else { _e( 'Move Right' ); } ?></a>
     183                                        </label>
     184                                </p>
     185
    176186                                <div class="menu-item-actions description-wide submitbox">
    177187                                        <?php if( 'custom' != $item->type && $original_title !== false ) : ?>
    178188                                                <p class="link-to-original">
  • wp-admin/js/nav-menu.js

     
    262262                        });
    263263                },
    264264
     265                countMenuItems : function( depth ) {
     266                        return $( '.menu-item-depth-' + depth ).length;
     267                },
     268
     269                moveMenuItem : function( $this, dir ) {
     270
     271                        var menuItems = $('#menu-to-edit li');
     272                                menuItemsCount = menuItems.length,
     273                                thisItem = $this.parents( 'li.menu-item' ),
     274                                thisItemChildren = thisItem.childMenuItems(),
     275                                thisItemData = thisItem.getItemData(),
     276                                thisItemDepth = parseInt( thisItem.menuItemDepth() ),
     277                                thisItemPosition = parseInt( thisItem.index() ),
     278                                nextItem = thisItem.next(),
     279                                nextItemChildren = nextItem.childMenuItems(),
     280                                nextItemDepth = parseInt( nextItem.menuItemDepth() ) + 1,
     281                                prevItem = thisItem.prev(),
     282                                prevItemDepth = parseInt( prevItem.menuItemDepth() ),
     283                                prevItemId = prevItem.getItemData()['menu-item-db-id'];
     284
     285                        switch ( dir ) {
     286                        case 'up':
     287                                var newItemPosition = thisItemPosition - 1;
     288
     289                                // Already at top
     290                                if ( 0 === thisItemPosition )
     291                                        break;
     292
     293                                // If a sub item is moved to top, shift it to 0 depth
     294                                if ( 0 === newItemPosition && 0 !== thisItemDepth )
     295                                        thisItem.moveHorizontally( 0, thisItemDepth );
     296
     297                                // If prev item is sub item, shift to match depth
     298                                if ( 0 !== prevItemDepth )
     299                                        thisItem.moveHorizontally( prevItemDepth, thisItemDepth );
     300
     301                                // Does this item have sub items?
     302                                if ( thisItemChildren ) {
     303                                        var items = thisItem.add( thisItemChildren );
     304                                        // Move the entire block
     305                                        items.detach().insertBefore( menuItems.eq( newItemPosition ) ).updateParentMenuItemDBId();
     306                                } else {
     307                                        thisItem.detach().insertBefore( menuItems.eq( newItemPosition ) ).updateParentMenuItemDBId();
     308                                }
     309                                $this.focus();
     310                                break;
     311                        case 'down':
     312                                // Does this item have sub items?
     313                                if ( thisItemChildren ) {
     314                                        var items = thisItem.add( thisItemChildren ),
     315                                                nextItem = menuItems.eq( items.length + thisItemPosition ),
     316                                                nextItemChildren = 0 !== nextItem.childMenuItems().length;
     317
     318                                        if ( nextItemChildren ) {
     319                                                var newDepth = parseInt( nextItem.menuItemDepth() ) + 1;
     320                                                thisItem.moveHorizontally( newDepth, thisItemDepth );
     321                                        }
     322
     323                                        // Have we reached the bottom?
     324                                        if ( menuItemsCount === thisItemPosition + items.length )
     325                                                break;
     326
     327                                        items.detach().insertAfter( menuItems.eq( thisItemPosition + items.length ) ).updateParentMenuItemDBId();
     328                                } else {
     329                                        // If next item has sub items, shift depth
     330                                        if ( 0 !== nextItemChildren.length )
     331                                                thisItem.moveHorizontally( nextItemDepth, thisItemDepth );
     332
     333                                        // Have we reached the bottom
     334                                        if ( menuItemsCount === thisItemPosition + 1 )
     335                                                break;
     336                                        thisItem.detach().insertAfter( menuItems.eq( thisItemPosition + 1 ) ).updateParentMenuItemDBId();
     337                                }
     338                                $this.focus();
     339                                break;
     340                        case 'left':
     341                                // As far left as possible
     342                                if ( 0 === thisItemDepth )
     343                                        break;
     344                                thisItem.shiftHorizontally( -1 );
     345                                $this.focus();
     346                                break;
     347                        case 'right':
     348                                // Can't be sub item at top
     349                                if ( 0 === thisItemPosition )
     350                                        break;
     351                                // Already sub item of prevItem
     352                                if ( thisItemData['menu-item-parent-id'] === prevItemId )
     353                                        break;
     354                                thisItem.shiftHorizontally( 1 );
     355                                $this.focus();
     356                                break;
     357                        }
     358                        api.registerChange();
     359                        api.refreshKeyboardAccessibility();
     360                        api.refreshAdvancedAccessibility();
     361                },
     362
    265363                initAccessibility : function() {
     364                        api.refreshKeyboardAccessibility();
     365                        api.refreshAdvancedAccessibility();
     366
     367                        // Events
     368                        $( '.menus-move-up' ).on( 'click', function ( e ) {
     369                                api.moveMenuItem( $( this ).parents( 'li.menu-item' ).find( 'a.item-edit' ), 'up' );
     370                                e.preventDefault();
     371                        });
     372                        $( '.menus-move-down' ).on( 'click', function ( e ) {
     373                                api.moveMenuItem( $( this ).parents( 'li.menu-item' ).find( 'a.item-edit' ), 'down' );
     374                                e.preventDefault();
     375                        });
     376                        $( '.menus-move-left' ).on( 'click', function ( e ) {
     377                                api.moveMenuItem( $( this ).parents( 'li.menu-item' ).find( 'a.item-edit' ), 'left' );
     378                                e.preventDefault();
     379                        });
     380                        $( '.menus-move-right' ).on( 'click', function ( e ) {
     381                                api.moveMenuItem( $( this ).parents( 'li.menu-item' ).find( 'a.item-edit' ), 'right' );
     382                                e.preventDefault();
     383                        });
     384                },
     385
     386                refreshAdvancedAccessibility : function() {
     387
     388                        // Hide all links by default
     389                        $( '.menu-item-settings .field-move a' ).hide();
     390
     391                        $( '.item-edit' ).each( function() {
     392                                var $this = $(this),
     393                                        movement = [],
     394                                        availableMovement = '',
     395                                        menuItem = $this.parents( 'li.menu-item' ),
     396                                        depth = menuItem.menuItemDepth(),
     397                                        isPrimaryMenuItem = ( 0 === depth ),
     398                                        itemName = $this.parents( '.menu-item-handle' ).find( '.menu-item-title' ).text(),
     399                                        position = parseInt( menuItem.index() ),
     400                                        totalMenuItems = $('#menu-to-edit li').length,
     401                                        hasSameDepthSibling = menuItem.nextAll( '.menu-item-depth-' + depth ).length;
     402
     403                                // Where can they move this menu item?
     404                                if ( 0 !== position )
     405                                        menuItem.find( '.menus-move-up' ).show();
     406
     407                                if ( position + 1 !== totalMenuItems && 0 !== position )
     408                                        menuItem.find( '.menus-move-down' ).show();
     409
     410                                if ( 0 === position && 0 !== hasSameDepthSibling )
     411                                        menuItem.find( '.menus-move-down' ).show();
     412
     413                                if ( ! isPrimaryMenuItem )
     414                                        menuItem.find( '.menus-move-left' ).show();
     415
     416                                if ( 0 !== position ) {
     417                                        if ( menuItem.find( '.menu-item-data-parent-id' ).val() !== menuItem.prev().find( '.menu-item-data-db-id' ).val() )
     418                                                menuItem.find( '.menus-move-right' ).show();
     419                                }
     420
     421                                if ( isPrimaryMenuItem ) {
     422                                        var primaryItems = $( '.menu-item-depth-0' ),
     423                                                itemPosition = primaryItems.index( menuItem ) + 1,
     424                                                totalMenuItems = primaryItems.length,
     425
     426                                                // String together help text for primary menu items
     427                                                title = itemName + '. ' + l10nStrings.menuFocus.replace('%d', itemPosition).replace('%d', totalMenuItems) + '.';
     428                                } else {
     429                                        var parentItem = menuItem.prevAll( '.menu-item-depth-' + parseInt( depth - 1 ) ).first(),
     430                                                parentItemId = parentItem.find( '.menu-item-data-db-id' ).val(),
     431                                                parentItemName = parentItem.find( '.menu-item-title' ).text(),
     432                                                subItems = $( '.menu-item .menu-item-data-parent-id[value="' + parentItemId + '"]' ),
     433                                                itemPosition = $(subItems.parents('.menu-item').get().reverse()).index( menuItem ) + 1;
     434
     435                                                // String together help text for sub menu items
     436
     437                                                title = itemName + '. ' + l10nStrings.subMenuFocus.replace('%d', itemPosition) + parentItemName + '.';
     438                                }
     439
     440                                $this.prop('title', title).html( title );
     441                        });
     442                },
     443
     444                refreshKeyboardAccessibility : function() {
    266445                        $( '.item-edit' ).off( 'focus' ).on( 'focus', function(){
    267446                                $(this).on( 'keydown', function(e){
    268447
     
    275454                                        // Avoid multiple keydown events
    276455                                        $this.off('keydown');
    277456
    278                                         var menuItems = $('#menu-to-edit li');
    279                                                 menuItemsCount = menuItems.length,
    280                                                 thisItem = $this.parents( 'li.menu-item' ),
    281                                                 thisItemChildren = thisItem.childMenuItems(),
    282                                                 thisItemData = thisItem.getItemData(),
    283                                                 thisItemDepth = parseInt( thisItem.menuItemDepth() ),
    284                                                 thisItemPosition = parseInt( thisItem.index() ),
    285                                                 nextItem = thisItem.next(),
    286                                                 nextItemChildren = nextItem.childMenuItems(),
    287                                                 nextItemDepth = parseInt( nextItem.menuItemDepth() ) + 1,
    288                                                 prevItem = thisItem.prev(),
    289                                                 prevItemDepth = parseInt( prevItem.menuItemDepth() ),
    290                                                 prevItemId = prevItem.getItemData()['menu-item-db-id'];
    291 
    292457                                        // Bail if there is only one menu item
    293                                         if ( 1 === menuItemsCount )
     458                                        if ( 1 === $('#menu-to-edit li').length )
    294459                                                return;
    295460
    296461                                        // If RTL, swap left/right arrows
     
    300465
    301466                                        switch ( arrows[e.which] ) {
    302467                                        case 'up':
    303                                                 var newItemPosition = thisItemPosition - 1;
    304 
    305                                                 // Already at top
    306                                                 if ( 0 === thisItemPosition )
    307                                                         break;
    308 
    309                                                 // If a sub item is moved to top, shift it to 0 depth
    310                                                 if ( 0 === newItemPosition && 0 !== thisItemDepth )
    311                                                         thisItem.moveHorizontally( 0, thisItemDepth );
    312 
    313                                                 // If prev item is sub item, shift to match depth
    314                                                 if ( 0 !== prevItemDepth )
    315                                                         thisItem.moveHorizontally( prevItemDepth, thisItemDepth );
    316 
    317                                                 // Does this item have sub items?
    318                                                 if ( thisItemChildren ) {
    319                                                         var items = thisItem.add( thisItemChildren );
    320                                                         // Move the entire block
    321                                                         items.detach().insertBefore( menuItems.eq( newItemPosition ) );
    322                                                 } else {
    323                                                         thisItem.detach().insertBefore( menuItems.eq( newItemPosition ) );
    324                                                 }
     468                                                api.moveMenuItem( $this, 'up' );
    325469                                                break;
    326470                                        case 'down':
    327                                                 // Does this item have sub items?
    328                                                 if ( thisItemChildren ) {
    329                                                         var items = thisItem.add( thisItemChildren ),
    330                                                                 nextItem = menuItems.eq( items.length + thisItemPosition ),
    331                                                                 nextItemChildren = 0 !== nextItem.childMenuItems().length;
    332 
    333                                                         if ( nextItemChildren ) {
    334                                                                 var newDepth = parseInt( nextItem.menuItemDepth() ) + 1;
    335                                                                 thisItem.moveHorizontally( newDepth, thisItemDepth );
    336                                                         }
    337 
    338                                                         // Have we reached the bottom?
    339                                                         if ( menuItemsCount === thisItemPosition + items.length )
    340                                                                 break;
    341 
    342                                                         items.detach().insertAfter( menuItems.eq( thisItemPosition + items.length ) );
    343                                                 } else {
    344                                                         // If next item has sub items, shift depth
    345                                                         if ( 0 !== nextItemChildren.length )
    346                                                                 thisItem.moveHorizontally( nextItemDepth, thisItemDepth );
    347 
    348                                                         // Have we reached the bottom
    349                                                         if ( menuItemsCount === thisItemPosition + 1 )
    350                                                                 break;
    351                                                         thisItem.detach().insertAfter( menuItems.eq( thisItemPosition + 1 ) );
    352                                                 }
     471                                                api.moveMenuItem( $this, 'down' );
    353472                                                break;
    354473                                        case 'left':
    355                                                 // As far left as possible
    356                                                 if ( 0 === thisItemDepth )
    357                                                         break;
    358                                                 thisItem.shiftHorizontally( -1 );
     474                                                api.moveMenuItem( $this, 'left' );
    359475                                                break;
    360476                                        case 'right':
    361                                                 // Can't be sub item at top
    362                                                 if ( 0 === thisItemPosition )
    363                                                         break;
    364                                                 // Already sub item of prevItem
    365                                                 if ( thisItemData['menu-item-parent-id'] === prevItemId )
    366                                                         break;
    367                                                 thisItem.shiftHorizontally( 1 );
     477                                                api.moveMenuItem( $this, 'right' );
    368478                                                break;
    369479                                        }
    370                                         api.registerChange();
    371480                                        // Put focus back on same menu item
    372481                                        $( '#edit-' + thisItemData['menu-item-db-id'] ).focus();
    373482                                        return false;
     
    752861                 */
    753862                addMenuItemToBottom : function( menuMarkup, req ) {
    754863                        $(menuMarkup).hideAdvancedMenuItemFields().appendTo( api.targetList );
    755                         api.initAccessibility();
     864                        api.refreshKeyboardAccessibility();
     865                        api.refreshAdvancedAccessibility();
    756866                },
    757867
    758868                addMenuItemToTop : function( menuMarkup, req ) {
    759869                        $(menuMarkup).hideAdvancedMenuItemFields().prependTo( api.targetList );
    760                         api.initAccessibility();
     870                        api.refreshKeyboardAccessibility();
     871                        api.refreshAdvancedAccessibility();
    761872                },
    762873
    763874                attachUnsavedChangesListener : function() {
  • wp-admin/nav-menus.php

     
    611611        </div><!-- /#menu-management-liquid -->
    612612        </div><!-- /#nav-menus-frame -->
    613613</div><!-- /.wrap-->
    614 <script type="text/javascript">var oneThemeLocationNoMenus = <?php if ( $one_theme_location_no_menus ) echo 'true'; else echo 'false'; ?>;</script>
     614<script type="text/javascript">
     615        var oneThemeLocationNoMenus = <?php if ( $one_theme_location_no_menus ) echo 'true'; else echo 'false'; ?>,
     616                l10nStrings = {
     617                        "menuFocus" : "<?php _e( 'Menu item %d of %d' ); ?>",
     618                        "subMenuFocus" : "<?php _e( 'Sub item number %d under' ); ?>"
     619                };
     620</script>
    615621<?php include( './admin-footer.php' ); ?>
  • wp-admin/css/wp-admin.css

     
    77557755        border-bottom-right-radius: 3px;
    77567756}
    77577757
     7758.menu-item-settings .field-move a {
     7759        display: none;
     7760        margin: 0 2px;
     7761}
     7762
    77587763.menu-item-edit-active .menu-item-settings {
    77597764        display: block;
    77607765}