WordPress.org

Make WordPress Core

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

File 13204.ajax.improvements.1.patch, 9.6 KB (added by koopersmith, 8 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.