WordPress.org

Make WordPress Core

Ticket #27055: 27055.38.diff

File 27055.38.diff, 6.7 KB (added by matveb, 5 years ago)
  • wp-admin/css/themes.css

     
    216216 * Displays a theme update notice
    217217 * when an update is available.
    218218 */
    219 .theme-browser .theme .theme-update {
     219.theme-browser .theme .theme-update,
     220.theme-browser .theme .theme-installed {
    220221        background: #d54e21;
    221222        background: rgba(213, 78, 33, 0.95);
    222223        color: #fff;
     
    234235        overflow: hidden;
    235236}
    236237
    237 .theme-browser .theme .theme-update:before {
     238.theme-browser .theme .theme-update:before,
     239.theme-browser .theme .theme-installed:before {
    238240        content: '\f463';
    239241        display: inline-block;
    240242        font: normal 20px/1 'dashicons';
     
    10741076  16.2 - Install Themes
    10751077------------------------------------------------------------------------------*/
    10761078
     1079/* Already installed theme */
     1080.theme-browser .theme.is-installed {
     1081        cursor: default;
     1082}
     1083.theme-browser .theme .theme-installed {
     1084        background: #0074a2;
     1085}
     1086.theme-browser .theme .theme-installed:before {
     1087        content: '\f147';
     1088}
     1089.theme-browser .theme.is-installed .theme-actions,
     1090.theme-browser.rendered .theme.is-installed .more-details {
     1091        display: none !important;
     1092}
     1093.theme-browser.rendered .theme.is-installed:hover .theme-screenshot img,
     1094.theme-browser.rendered .theme.is-installed:focus .theme-screenshot img {
     1095        opacity: 1 !important;
     1096}
     1097
    10771098.theme-navigation {
    10781099        background: #fff;
    10791100        -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
  • 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, preview;
     25                var install, installed;
    2626
    2727                // Install url for the theme
    2828                // using the install nonce
     
    3535                // Build the url query
    3636                install = themes.data.settings.updateURI + '?' + $.param( install );
    3737
    38                 // Preview url for the theme
    39                 preview = {
    40                         tab: 'theme-information',
    41                         theme: this.get( 'slug' )
    42                 };
     38                // If theme is already installed, set an attribute.
     39                if ( _.indexOf( themes.data.installedThemes, this.get( 'slug' ) ) !== -1 ) {
     40                        this.set({ installed: true });
     41                }
    4342
    44                 preview = themes.data.settings.installURI + '?' + $.param( preview );
    45 
    4643                // Set the attributes
    4744                this.set({
    48                         installURI: install,
    49                         previewURI: preview,
     45                        installURI: ( this.get( 'slug' ) ) ? install : false,
    5046                        // slug is for installation, id is for existing.
    5147                        id: this.get( 'slug' ) || this.get( 'id' )
    5248                });
     
    391387                if ( this.model.get( 'displayAuthor' ) ) {
    392388                        this.$el.addClass( 'display-author' );
    393389                }
     390
     391                if ( this.model.get( 'installed' ) ) {
     392                        this.$el.addClass( 'is-installed' );
     393                        this.$el.unbind();
     394                }
    394395        },
    395396
    396397        // Adds a class to the currently active theme
     
    451452                        return this.touchDrag = false;
    452453                }
    453454
     455                // Allow direct link path to installing a theme.
     456                if ( $( event.target ).hasClass( 'button-primary' ) ) {
     457                        return;
     458                }
     459
    454460                // 'enter' and 'space' keys expand the details view when a theme is :focused
    455461                if ( event.type === 'keydown' && ( event.which !== 13 && event.which !== 32 ) ) {
    456462                        return;
     
    494500
    495501                        // If we have no more themes, bail.
    496502                        if ( _.isUndefined( self.current ) ) {
     503                                self.options.parent.parent.trigger( 'theme:end' );
    497504                                return self.current = current;
    498505                        }
    499506
     
    505512                        // Render and append.
    506513                        preview.render();
    507514                        $( 'div.wrap' ).append( preview.el );
     515                        $( '.next-theme' ).focus();
    508516                })
    509517                .listenTo( preview, 'theme:previous', function() {
    510518
     
    532540                        // Render and append.
    533541                        preview.render();
    534542                        $( 'div.wrap' ).append( preview.el );
     543                        $( '.previous-theme' ).focus();
    535544                });
    536545        }
    537546});
     
    882891                // Loop through the themes and setup each theme view
    883892                self.instance.each( function( theme ) {
    884893                        self.theme = new themes.view.Theme({
    885                                 model: theme
     894                                model: theme,
     895                                parent: self
    886896                        });
    887897
    888898                        // Render the views...
     
    12241234                // Get the themes by sending Ajax POST request to api.wordpress.org/themes
    12251235                // or searching the local cache
    12261236                this.collection.query( request );
     1237
     1238                // Set route
     1239                themes.router.navigate( themes.router.baseUrl( '?search=' + value ), { replace: true } );
    12271240        }, 300 )
    12281241});
    12291242
     
    13291342        },
    13301343
    13311344        sort: function( sort ) {
    1332                 $( '#theme-search-input' ).val( '' );
     1345                this.clearSearch();
    13331346
    13341347                $( '.theme-section, .theme-filter' ).removeClass( this.activeClass );
    13351348                $( '[data-sort="' + sort + '"]' ).addClass( this.activeClass );
     
    14501463                        return this.addFilter();
    14511464                }
    14521465
     1466                this.clearSearch();
     1467
     1468                themes.router.navigate( themes.router.baseUrl( '' ) );
    14531469                $( 'body' ).toggleClass( 'more-filters-opened' );
    14541470        },
    14551471
     
    14741490
    14751491        backToFilters: function() {
    14761492                $( 'body' ).removeClass( 'filters-applied' );
     1493        },
     1494
     1495        clearSearch: function() {
     1496                $( '#theme-search-input').val( '' );
    14771497        }
    14781498});
    14791499
  • wp-admin/theme-install.php

     
    3333        'new'      => __( 'Newest Themes' ),
    3434);
    3535
     36$installed_themes = search_theme_directories();
     37foreach ( $installed_themes as $k => $v ) {
     38        if ( false !== strpos( $k, '/' ) ) {
     39                unset( $installed_themes[ $k ] );
     40        }
     41}
     42
    3643wp_localize_script( 'theme', '_wpThemeSettings', array(
    3744        'themes'   => false,
    3845        'settings' => array(
     
    5158                'back'   => __( 'Back' ),
    5259                'error'  => ( 'There was a problem trying to load the themes. Please, try again.' ), // @todo improve
    5360        ),
     61        'installedThemes' => array_keys( $installed_themes ),
    5462        'browse' => array(
    5563                'sections' => $sections,
    5664        ),
     
    190198                <a class="button button-primary" href="{{ data.installURI }}"><?php esc_html_e( 'Install' ); ?></a>
    191199                <a class="button button-secondary preview install-theme-preview" href="#"><?php esc_html_e( 'Preview' ); ?></a>
    192200        </div>
     201
     202        <# if ( data.installed ) { #>
     203                <div class="theme-installed"><?php _e( 'Already Installed' ); ?></div>
     204        <# } #>
    193205</script>
    194206
    195207<script id="tmpl-theme-preview" type="text/template">
    196208        <div class="wp-full-overlay-sidebar">
    197209                <div class="wp-full-overlay-header">
    198210                        <a href="#" class="close-full-overlay button-secondary"><?php _e( 'Close' ); ?></a>
    199                         <a href="{{ data.installURI }}" class="button button-primary theme-install"><?php _e( 'Install' ); ?></a>
     211                <# if ( data.installed ) { #>
     212                        <a href="#" class="button button-primary theme-install disabled"><?php _e( 'Installed' ); ?></a>
     213                <# } #>
    200214                </div>
    201215                <div class="wp-full-overlay-sidebar-content">
    202216                        <div class="install-theme-info">