WordPress.org

Make WordPress Core

Ticket #27708: 27708.4.diff

File 27708.4.diff, 8.3 KB (added by matveb, 8 years ago)
  • wp-admin/css/themes.css

     
    17131713.wp-full-overlay .theme-navigation .next-theme {
    17141714        float: right;
    17151715}
     1716.wp-full-overlay.no-navigation .theme-navigation {
     1717        display: none;
     1718}
    17161719
    17171720/* Animations */
    17181721.wp-full-overlay,
  • wp-admin/js/theme.js

     
    2222        // Adds attributes to the default data coming through the .org themes api
    2323        // Map `id` to `slug` for shared code
    2424        initialize: function() {
    25                 var install;
     25                var install, description;
    2626
    2727                // Install url for the theme
    2828                // using the install nonce
     
    4646                        // slug is for installation, id is for existing.
    4747                        id: this.get( 'slug' ) || this.get( 'id' )
    4848                });
     49
     50                // Map `section.description` to `description`
     51                // as the API sometimes returns it differently
     52                if ( this.has( 'sections' ) ) {
     53                        description = this.get( 'sections' ).description;
     54                        this.set({ description: description });
     55                }
    4956        }
    5057});
    5158
     
    218225        //
    219226        // When we are missing a cache object we fire an apiCall()
    220227        // which triggers events of `query:success` or `query:fail`
    221         query: function( request ) {
     228        query: function( request, action ) {
    222229                /**
    223230                 * @static
    224231                 * @type Array
     
    247254
    248255                // Otherwise, send a new API call and add it to the cache.
    249256                if ( ! query && ! isPaginated ) {
    250                         query = this.apiCall( request ).done( function( data ) {
     257                        query = this.apiCall( request, action ).done( function( data ) {
     258
    251259                                // Update the collection with the queried data.
    252                                 self.reset( data.themes );
    253                                 count = data.info.results;
     260                                if ( data.themes ) {
     261                                        self.reset( data.themes );
     262                                        count = data.info.results;
     263                                        // Store the results and the query request
     264                                        queries.push( { themes: data.themes, request: request, total: count } );
    254265
     266                                } else if ( action ) {
     267                                        self.reset( data );
     268                                        count = 1;
     269                                        self.trigger( 'query:theme' );
     270                                }
     271
    255272                                // Trigger a collection refresh event
    256273                                // and a `query:success` event with a `count` argument.
    257274                                self.trigger( 'update' );
    258275                                self.trigger( 'query:success', count );
    259276
    260                                 if ( data.themes.length === 0 ) {
     277                                if ( data.themes && data.themes.length === 0 ) {
    261278                                        self.trigger( 'query:empty' );
    262279                                }
    263280
    264                                 // Store the results and the query request
    265                                 queries.push( { themes: data.themes, request: request, total: count } );
    266281                        }).fail( function() {
    267282                                self.trigger( 'query:fail' );
    268283                        });
    269284                } else {
    270285                        // If it's a paginated request we need to fetch more themes...
    271286                        if ( isPaginated ) {
    272                                 return this.apiCall( request, isPaginated ).done( function( data ) {
     287                                return this.apiCall( request, action, isPaginated ).done( function( data ) {
    273288                                        // Add the new themes to the current collection
    274289                                        // @todo update counter
    275290                                        self.add( data.themes );
     
    314329        },
    315330
    316331        // Send request to api.wordpress.org/themes
    317         apiCall: function( request, paginated ) {
     332        apiCall: function( request, action, paginated ) {
    318333
    319334                // Send tags (and fields) as comma-separated to keep the JSONP query string short.
    320335                if ( request.tag && _.isArray( request.tag ) ) {
    321336                        request.tag = request.tag.join( ',' );
    322337                }
    323338
     339                // Set request action
     340                if ( ! action ) {
     341                        action = 'query_themes'
     342                }
     343
    324344                // JSONP request to .org API
    325345                return $.ajax({
    326346                        url: 'https://api.wordpress.org/themes/info/1.1/?callback=?',
     
    329349
    330350                        // Request data
    331351                        data: {
    332                                 action: 'query_themes',
     352                                action: action,
    333353                                request: _.extend({
    334354                                        per_page: 72,
    335355                                        fields: 'description,tested,requires,rating,downloaded,downloadLink,last_updated,homepage,num_ratings'
     
    482502                // Render the view and append it.
    483503                preview.render();
    484504                this.setNavButtonsState();
     505
     506                // Hide previous/next navigation if there is only one theme
     507                if ( this.model.collection.length === 1 ) {
     508                        preview.$el.addClass( 'no-navigation' );
     509                } else {
     510                        preview.$el.removeClass( 'no-navigation' );
     511                }
     512
     513                // Apend preview
    485514                $( 'div.wrap' ).append( preview.el );
    486515
    487516                // Listen to our preview object
     
    780809
    781810                themes.router.navigate( themes.router.baseUrl( '' ) );
    782811                this.trigger( 'preview:close' );
     812                this.unbind();
    783813                return false;
    784814        },
    785815
     
    13051335                'click .filtering-by a': 'backToFilters'
    13061336        },
    13071337
    1308         // Handles all the rendering of the public theme directory
    1309         browse: function( section ) {
     1338        // Initial render method
     1339        render: function() {
    13101340                var self = this;
    13111341
     1342                this.search();
     1343                this.uploader();
     1344
    13121345                this.collection = new themes.Collection();
    13131346
    13141347                // Bump `collection.currentQuery.page` and request more themes if we hit the end of the page.
     
    13391372                        $( '.theme-browser' ).find( 'div.themes' ).before( '<div class="error"><p>' + l10n.error + '</p></div>' );
    13401373                });
    13411374
    1342                 // Create a new collection with the proper theme data
    1343                 // for each section
    1344                 this.collection.query( { browse: section } );
    1345 
    13461375                if ( this.view ) {
    13471376                        this.view.remove();
    13481377                }
     
    13501379                // Set ups the view and passes the section argument
    13511380                this.view = new themes.view.Themes({
    13521381                        collection: this.collection,
    1353                         section: section,
    13541382                        parent: this
    13551383                });
    13561384
     
    13631391                this.$el.find( '.theme-browser' ).append( this.view.el ).addClass( 'rendered' );
    13641392        },
    13651393
    1366         // Initial render method
    1367         render: function() {
    1368                 this.search();
    1369                 this.uploader();
    1370                 return this.browse( this.options.section );
     1394        // Handles all the rendering of the public theme directory
     1395        browse: function( section ) {
     1396                // Create a new collection with the proper theme data
     1397                // for each section
     1398                this.collection.query( { browse: section } );
    13711399        },
    13721400
    13731401        // Sorting navigation
     
    15521580        routes: {
    15531581                'theme-install.php?theme=:slug': 'preview',
    15541582                'theme-install.php?browse=:sort': 'sort',
     1583                'theme-install.php?sort=:sort': 'sort',
    15551584                'theme-install.php?upload': 'upload',
    15561585                'theme-install.php?search=:query': 'search',
    1557                 '': 'sort'
     1586                'theme-install.php': 'sort'
    15581587        },
    15591588
    15601589        baseUrl: function( url ) {
     
    15961625        },
    15971626
    15981627        routes: function() {
    1599                 var self = this;
    1600                 // Bind to our global thx object
    1601                 // so that the object is available to sub-views
     1628                var self = this,
     1629                        request = {};
     1630
     1631                // Bind to our global `wp.themes` object
     1632                // so that the router is available to sub-views
    16021633                themes.router = new themes.InstallerRouter();
    16031634
    1604                 // Handles theme details route event
    1605                 themes.router.on( 'route:theme', function( slug ) {
    1606                         self.view.view.expand( slug );
     1635                // Handles `theme` route event
     1636                // Queries the API for the passed theme slug
     1637                themes.router.on( 'route:preview', function( slug ) {
     1638                        request.slug = slug;
     1639                        self.view.collection.query( request, 'theme_information' );
     1640                        _.delay( function() {
     1641                                $( '.theme' ).trigger( 'click' );
     1642                        }, 200 );
    16071643                });
    16081644
     1645                // Handles sorting / browsing routes
     1646                // Also handles the root URL triggering a sort request
     1647                // for `featured`, the default view
    16091648                themes.router.on( 'route:sort', function( sort ) {
    16101649                        if ( ! sort ) {
    16111650                                sort = 'featured';
     
    16141653                        self.view.trigger( 'theme:close' );
    16151654                });
    16161655
     1656                // Support the `upload` route by going straight to upload section
    16171657                themes.router.on( 'route:upload', function() {
    16181658                        $( 'a.upload' ).trigger( 'click' );
    16191659                });
    16201660
    1621                 // Handles search route event
     1661                // The `search` route event. The router populates the input field.
    16221662                themes.router.on( 'route:search', function() {
    16231663                        $( '.theme-search' ).focus().trigger( 'keyup' );
    16241664                });
  • wp-admin/theme-install.php

     
    122122
    123123        <div class="theme-navigation">
    124124                <span class="theme-count"></span>
    125                 <a class="theme-section current" href="#" data-sort="featured"><?php _ex( 'Featured', 'themes' ); ?></a>
     125                <a class="theme-section" href="#" data-sort="featured"><?php _ex( 'Featured', 'themes' ); ?></a>
    126126                <a class="theme-section" href="#" data-sort="popular"><?php _ex( 'Popular', 'themes' ); ?></a>
    127127                <a class="theme-section" href="#" data-sort="new"><?php _ex( 'Latest', 'themes' ); ?></a>
    128128                <div class="theme-top-filters">