WordPress.org

Make WordPress Core

Ticket #13204: 13204.ajax.improvements.1.patch

File 13204.ajax.improvements.1.patch, 9.6 KB (added by koopersmith, 4 years ago)
  • wp-admin/js/nav-menu.dev.js

     
    8787                return Math.floor(px / menuItemDepthPerLevel); 
    8888        }, 
    8989 
    90         menuList, targetList; 
     90        menuList, targetList, api; 
    9191 
    9292        // jQuery extensions 
    9393        $.fn.extend({ 
     
    166166                                else 
    167167                                        t.selectItem(); 
    168168                        }); 
    169                 } 
     169                }, 
     170                /** 
     171                 * Adds selected menu items to the menu. 
     172                 * 
     173                 * @param jQuery metabox The metabox jQuery object. 
     174                 */ 
     175                addSelectedToMenu : function(processMethod) { 
     176                        return this.each(function() { 
     177                                var t = $(this), 
     178                                        checked = t.find('.tabs-panel-active .categorychecklist li input:checked'), 
     179                                        re = new RegExp('menu-item\\[(\[^\\]\]*)'); 
     180                         
     181                                processMethod = processMethod || api.addMenuItemToBottom; 
     182                         
     183                                // If no items are checked, bail. 
     184                                if ( !checked.length ) 
     185                                        return false; 
     186                         
     187                                // Show the ajax spinner 
     188                                t.find('img.waiting').show(); 
     189 
     190                                // Retrieve menu item data 
     191                                $(checked).each(function(){ 
     192                                        var checkbox = $(this), 
     193                                                item = checkbox.parent().prev(); 
     194                                        listItemDBIDMatch = re.exec( checkbox.attr('name') ); 
     195                                        listItemDBID = 'undefined' == typeof listItemDBIDMatch[1] ? 0 : parseInt(listItemDBIDMatch[1], 10); 
     196                                        listItemData = getListDataFromID(listItemDBID); 
     197 
     198                                        menuItem = {}; 
     199                                        menuItem[listItemDBID] = listItemData; 
     200 
     201                                        api.addItemToMenu(menuItem, processMethod, function(){ 
     202                                                item.deselectItem(); 
     203                                        }); 
     204                                }); 
     205 
     206                                // Remove the ajax spinner 
     207                                t.find('img.waiting').hide(); 
     208                        }); 
     209                }, 
    170210        }); 
    171211 
    172         return { 
     212        return api = { 
    173213 
    174214                // Functions that run on init. 
    175215                init : function() { 
     
    177217                        targetList = menuList; 
    178218 
    179219                        this.attachMenuEditListeners(); 
     220                         
     221                        this.setupInputWithDefaultTitle(); 
     222                        this.attachAddMenuItemListeners(); 
     223                        this.attachQuickSearchListeners(); 
    180224 
    181                         this.attachMenuMetaListeners(document.getElementById('nav-menu-meta')); 
    182  
    183225                        this.attachTabsPanelListeners(); 
    184226 
    185227                        this.attachHomeLinkListener(); 
     
    422464                        }).blur( function(){ 
    423465                                var $t = $(this); 
    424466                                if( '' == $t.val() ) 
    425                                         $t.val( $t.data(name) ).addClass( name ); 
     467                                        $t.addClass( name ).val( $t.data(name) ); 
    426468                        }); 
    427469                }, 
    428470 
    429                 attachMenuMetaListeners : function(formEL) { 
    430                         if ( ! formEL ) 
    431                                 return; 
    432  
    433                         var that = this; 
    434                         this.setupInputWithDefaultTitle(); 
    435  
     471                attachAddMenuItemListeners : function() { 
     472                        var form = $('#nav-menu-meta'); 
     473                         
     474                        form.find('.add-to-menu input').click(function(){ 
     475                                $(this).trigger('wp-add-menu-item', [api.addMenuItemToBottom]); 
     476                                return false; 
     477                        }); 
     478                        form.find('.customlinkdiv').bind('wp-add-menu-item', function(e, processMethod) { 
     479                                api.addCustomLink( processMethod ); 
     480                        }); 
     481                        form.find('.posttypediv, .taxonomydiv').bind('wp-add-menu-item', function(e, processMethod) { 
     482                                $(this).addSelectedToMenu( processMethod ); 
     483                        });      
     484                }, 
     485                 
     486                attachQuickSearchListeners : function() { 
     487                        var that = this, 
     488                                form = $('#nav-menu-meta'); 
     489                                 
    436490                        // auto-suggest for the quick-search boxes 
    437491                        $('input.quick-search').each(function(i, el) { 
    438492                                that.setupQuickSearchEventListeners(el); 
    439493                        }); 
    440  
    441                         // If a "Add to Menu" button was clicked, submit that metabox ajax style. 
    442                         $(formEL).click(function(e) { 
    443                                 // based on the input, call that function 
    444                                 var divcontainer = $(e.target).parent().parent().parent(); 
    445                          
    446                                 if ( $(e.target).is('input') && $(e.target).hasClass('button-secondary') && !$(e.target).hasClass('quick-search-submit') ) { 
    447                                         if ( $(divcontainer).hasClass('customlinkdiv') ) { 
    448                                                 that.addCustomLink(); 
    449                                         } else if ( $(divcontainer).hasClass('posttypediv') || $(divcontainer).hasClass('taxonomydiv') ) { 
    450                                                 that.addItemsToMenu( $(divcontainer).attr('id') ); 
    451                                         }; 
    452                                         return false; 
    453                                 } else if ( $(e.target).is('input') && $(e.target).hasClass('quick-search-submit') ) { 
    454                                         that.quickSearch( $(divcontainer).attr('id') ); 
    455                                         return false; 
    456                                 }; 
     494                        form.find('.quick-search-submit').click(function() { 
     495                                $(this).trigger('wp-quick-search'); 
     496                                return false; 
    457497                        }); 
     498                        form.find('.inside').children().bind('wp-quick-search', function() { 
     499                                that.quickSearch( $(this).attr('id') ); 
     500                        }); 
    458501                }, 
    459502                 
    460503                quickSearch : function(id) { 
     
    482525                        }); 
    483526                }, 
    484527                 
    485                 addCustomLink : function(url, label, addToTop) { 
    486                         var url = url || $('#custom-menu-item-url').val(), 
    487                         label = label || $('#custom-menu-item-name').val(), 
    488                         addToTop = addToTop || false, 
    489                         menu = $('#menu').val(), 
    490                         nonce = $('#menu-settings-column-nonce').val(), 
    491                         params = {}, 
    492                         that = this, 
    493                         processMethod = function(){}; 
     528                addCustomLink : function( processMethod ) { 
     529                        var url = $('#custom-menu-item-url').val(), 
     530                                label = $('#custom-menu-item-name').val(); 
     531                                 
     532                        processMethod = processMethod || api.addMenuItemToBottom; 
    494533                         
    495534                        if ( '' == url || 'http://' == url ) 
    496535                                return false; 
    497536                         
    498537                        // Show the ajax spinner 
    499538                        $('.customlinkdiv img.waiting').show(); 
     539                        this.addLinkToMenu( url, label, processMethod, function() { 
     540                                // Remove the ajax spinner 
     541                                $('.customlinkdiv img.waiting').hide(); 
     542                                // Set custom link form back to defaults 
     543                                $('#custom-menu-item-name').val('').blur(); 
     544                                $('#custom-menu-item-url').val('http://'); 
     545                        }); 
     546                }, 
     547                 
     548                addLinkToMenu : function(url, label, processMethod, callback) { 
     549                        processMethod = processMethod || api.addMenuItemToBottom; 
     550                        callback = callback || function(){}; 
    500551                         
     552                        api.addItemToMenu({ 
     553                                '-1': { 
     554                                        'menu-item-type': 'custom', 
     555                                        'menu-item-url': url, 
     556                                        'menu-item-title': label 
     557                                } 
     558                        }, processMethod, callback); 
     559                }, 
     560                 
     561                addItemToMenu : function(menuItem, processMethod, callback) { 
     562                        var menu = $('#menu').val(), 
     563                                nonce = $('#menu-settings-column-nonce').val(); 
     564                                 
     565                        processMethod = processMethod || function(){}; 
     566                        callback = callback || function(){}; 
     567                         
    501568                        params = { 
    502569                                'action': 'add-menu-item', 
    503570                                'menu': menu, 
    504571                                'menu-settings-column-nonce': nonce, 
    505                                 'menu-item': { 
    506                                         '-1': { 
    507                                                 'menu-item-type': 'custom', 
    508                                                 'menu-item-url': url, 
    509                                                 'menu-item-title': label 
    510                                         } 
    511                                 } 
     572                                'menu-item': menuItem, 
    512573                        }; 
    513574                         
    514                         processMethod = addToTop ? that.addMenuItemToTop : that.addMenuItemToBottom; 
    515  
    516575                        $.post( ajaxurl, params, function(menuMarkup) { 
    517                                 processMethod.call(that, menuMarkup, params); 
    518                                  
    519                                 // Remove the ajax spinner 
    520                                 $('.customlinkdiv img.waiting').hide(); 
    521  
    522                                 // Reset the form 
    523                                 wpNavMenu.resetCustomLinkForm(); 
     576                                processMethod(menuMarkup, params); 
     577                                callback(); 
    524578                        }); 
    525579                }, 
     580 
     581                /** 
     582                 * Process the add menu item request response into menu list item. 
     583                 * 
     584                 * @param string menuMarkup The text server response of menu item markup. 
     585                 * @param object req The request arguments. 
     586                 */ 
     587                addMenuItemToBottom : function( menuMarkup, req ) { 
     588                        $(menuMarkup).hideAdvancedMenuItemFields().appendTo( targetList ); 
     589                }, 
    526590                 
    527                 resetCustomLinkForm : function() { 
    528                         // set custom link form back to defaults 
    529                         $('#custom-menu-item-name').val('').blur(); 
    530                         $('#custom-menu-item-url').val('http://'); 
     591                addMenuItemToTop : function( menuMarkup, req ) { 
     592                        $(menuMarkup).hideAdvancedMenuItemFields().prependTo( targetList ); 
    531593                }, 
    532594                 
    533595                attachHomeLinkListener : function() { 
    534596                        $('.add-home-link', '.customlinkdiv').click(function(e) { 
    535                                 wpNavMenu.addCustomLink( navMenuL10n.homeurl, navMenuL10n.home, true); 
     597                                api.addLinkToMenu( navMenuL10n.homeurl, navMenuL10n.home, api.addMenuItemToTop, recalculateMenuItemPositions ); 
    536598                                return false; 
    537599                        }); 
    538600                }, 
     
    784846                }, 
    785847 
    786848                /** 
    787                  * Adds menu items to the menu. 
    788                  * 
    789                  * @param string id The id of the metabox 
    790                  */ 
    791                 addItemsToMenu : function(id, addToTop) { 
    792                         var items = $( '.tabs-panel-active .categorychecklist li input:checked', '#' + id), 
    793                         menu = $('#menu').val(), 
    794                         nonce = $('#menu-settings-column-nonce').val(), 
    795                         params = {}, 
    796                         that = this, 
    797                         addToTop = addToTop || false, 
    798                         processMethod = function(){}, 
    799                         re = new RegExp('menu-item\\[(\[^\\]\]*)'); 
    800                          
    801                         processMethod = addToTop ? that.addMenuItemToTop : that.addMenuItemToBottom; 
    802                          
    803                         // If no items are checked, bail. 
    804                         if ( !items.length ) 
    805                                 return false; 
    806                          
    807                         // Show the ajax spinner 
    808                         $('#' + id + ' img.waiting').show(); 
    809  
    810                         // do stuff 
    811                         $(items).each(function(){ 
    812                                 listItemDBIDMatch = re.exec( $(this).attr('name') ); 
    813                                 listItemDBID = 'undefined' == typeof listItemDBIDMatch[1] ? 0 : parseInt(listItemDBIDMatch[1], 10); 
    814                                 listItemData = getListDataFromID(listItemDBID); 
    815  
    816                                 params = { 
    817                                         'action': 'add-menu-item', 
    818                                         'menu': menu, 
    819                                         'menu-settings-column-nonce': nonce, 
    820                                         'menu-item': {} 
    821                                 }; 
    822  
    823                                 params['menu-item'][listItemDBID] = listItemData; 
    824  
    825                                 $.post( ajaxurl, params, function(menuMarkup) { 
    826                                         processMethod.call(that, menuMarkup, params); 
    827                                 }); 
    828  
    829                                 // Uncheck the item 
    830                                 $(this).parent().prev().deselectItem(); 
    831                         }); 
    832  
    833                         // Remove the ajax spinner 
    834                         $('#' + id + ' img.waiting').hide(); 
    835                 }, 
    836  
    837                 /** 
    838                  * Process the add menu item request response into menu list item. 
    839                  * 
    840                  * @param string menuMarkup The text server response of menu item markup. 
    841                  * @param object req The request arguments. 
    842                  */ 
    843                 addMenuItemToBottom : function( menuMarkup, req ) { 
    844                         $(menuMarkup).hideAdvancedMenuItemFields().appendTo( targetList ); 
    845                 }, 
    846                  
    847                 addMenuItemToTop : function( menuMarkup, req ) { 
    848                         $(menuMarkup).hideAdvancedMenuItemFields().prependTo( targetList ); 
    849                 }, 
    850  
    851                 /** 
    852849                 * Process the quick search response into a search result 
    853850                 * 
    854851                 * @param string resp The server response to the query.