WordPress.org

Make WordPress Core

Ticket #16029: 16029.patch

File 16029.patch, 16.3 KB (added by ocean90, 2 years ago)
  • wp-includes/script-loader.php

     
    417417 
    418418                $scripts->add( 'list-revisions', "/wp-includes/js/wp-list-revisions$suffix.js" ); 
    419419 
    420                 $scripts->add( 'media', "/wp-admin/js/media$suffix.js", array( 'jquery-ui-draggable' ), false, 1 ); 
     420                $scripts->add( 'media', "/wp-admin/js/media$suffix.js", array( 'jquery', 'wpdialogs' ), false, 1 ); 
     421                did_action( 'init' ) && $scripts->localize( 'media', 'wpAttachMediaL10n', array( 
     422                        'title' => __('Attach Media'), 
     423                        'save' => __('Attach'), 
     424                        'noMatchesFound' => __('No matches found.') 
     425                ) ); 
    421426 
    422427                $scripts->add( 'image-edit', "/wp-admin/js/image-edit$suffix.js", array('jquery', 'json2', 'imgareaselect'), false, 1 ); 
    423428                did_action( 'init' ) && $scripts->localize( 'image-edit', 'imageEditL10n', array( 
  • wp-admin/includes/template.php

     
    13111311 * 
    13121312 * @param unknown_type $found_action 
    13131313 */ 
    1314 function find_posts_div($found_action = '') { 
     1314/*function find_posts_div($found_action = '') { 
    13151315?> 
    13161316        <div id="find-posts" class="find-box" style="display:none;"> 
    13171317                <div id="find-posts-head" class="find-box-head"><?php _e('Find Posts or Pages'); ?></div> 
     
    13461346                </div> 
    13471347        </div> 
    13481348<?php 
     1349}*/ 
     1350 
     1351function wp_attach_media_dialog() { 
     1352?> 
     1353        <div style="display:block;"> 
     1354        <form id="wp-attach-media" tabindex="-1"> 
     1355        <?php wp_nonce_field( 'attach-media', '_ajax_attach_media_nonce', false ); ?> 
     1356        <div id="link-selector"> 
     1357                <div id="search-panel"> 
     1358                        <div class="link-search-wrapper"> 
     1359                                <label> 
     1360                                        <span><?php _e( 'Search' ); ?></span> 
     1361                                        <input type="search" id="search-field" class="link-search-field" autocomplete="off" /> 
     1362                                        <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 
     1363                                </label> 
     1364                        </div> 
     1365                        <div id="search-results" class="query-results"> 
     1366                                <ul></ul> 
     1367                                <div class="river-waiting"> 
     1368                                        <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 
     1369                                </div> 
     1370                        </div> 
     1371                        <div id="most-recent-results" class="query-results"> 
     1372                                <div class="query-notice"><em><?php _e( 'No search term specified. Showing recent items.' ); ?></em></div> 
     1373                                <ul></ul> 
     1374                                <div class="river-waiting"> 
     1375                                        <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 
     1376                                </div> 
     1377                        </div> 
     1378                </div> 
     1379        </div> 
     1380        <div class="submitbox"> 
     1381                <div id="wp-attach-media-cancel"> 
     1382                        <a class="submitdelete deletion" href="#"><?php _e( 'Cancel' ); ?></a> 
     1383                </div> 
     1384                <div id="wp-attach-media-attach"> 
     1385                        <input type="submit" value="<?php esc_attr_e( 'Attach' ); ?>" class="button-primary" id="wp-attach-media-submit" name="wp-attach-media-submit"> 
     1386                </div> 
     1387        </div> 
     1388        </form> 
     1389        </div> 
     1390<?php 
    13491391} 
    13501392 
     1393function wp_attach_media_query() { 
     1394        $pts = get_post_types( array( 'public' => true ), 'objects' ); 
     1395        $pt_names = array_keys( $pts ); 
     1396 
     1397        $query = array( 
     1398                'post_type' => $pt_names, 
     1399                'suppress_filters' => true, 
     1400                'update_post_term_cache' => false, 
     1401                'update_post_meta_cache' => false, 
     1402                'post_status' => 'any', 
     1403                'order' => 'DESC', 
     1404                'orderby' => 'post_date', 
     1405                'posts_per_page' => 20, 
     1406        ); 
     1407 
     1408        $args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1; 
     1409 
     1410        if ( isset( $args['s'] ) ) 
     1411                $query['s'] = $args['s']; 
     1412 
     1413        $query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0; 
     1414 
     1415        // Do main query. 
     1416        $get_posts = new WP_Query; 
     1417        $posts = $get_posts->query( $query ); 
     1418        // Check if any posts were found. 
     1419        if ( ! $get_posts->post_count ) 
     1420                return false; 
     1421 
     1422        // Build results. 
     1423        $results = array(); 
     1424        foreach ( $posts as $post ) { 
     1425                if ( 'post' == $post->post_type ) 
     1426                        $info = mysql2date( __( 'Y/m/d' ), $post->post_date ); 
     1427                else 
     1428                        $info = $pts[ $post->post_type ]->labels->singular_name; 
     1429 
     1430                $results[] = array( 
     1431                        'ID' => $post->ID, 
     1432                        'title' => trim( esc_html( strip_tags( get_the_title( $post ) ) ) ), 
     1433                        'permalink' => get_permalink( $post->ID ), 
     1434                        'info' => $info, 
     1435                ); 
     1436        } 
     1437 
     1438        return $results; 
     1439} 
     1440 
    13511441/** 
    13521442 * Display the post password. 
    13531443 * 
     
    16491739 */ 
    16501740function get_submit_button( $text = null, $type = 'primary', $name = 'submit', $wrap = true, $other_attributes = null ) { 
    16511741        if ( ! is_array( $type ) ) 
    1652                 $type = explode( ' ', $type );  
     1742                $type = explode( ' ', $type ); 
    16531743 
    16541744        $button_shorthand = array( 'primary', 'small', 'large' ); 
    16551745        $classes = array( 'button' ); 
  • wp-admin/includes/class-wp-media-list-table.php

     
    314314?> 
    315315                        <td <?php echo $attributes ?>><?php _e( '(Unattached)' ); ?><br /> 
    316316                        <?php if( $user_can_edit ) {?> 
    317                                 <a class="hide-if-no-js" 
    318                                         onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' ); return false;" 
    319                                         href="#the-list"> 
    320                                         <?php _e( 'Attach' ); ?></a> 
     317                                <a class="hide-if-no-js" href="#" id="attach-media-<?php echo $id; ?>"><?php _e( 'Attach' ); ?></a> 
    321318                        <?php } ?></td> 
    322319<?php 
    323320                } 
  • wp-admin/includes/ajax-actions.php

     
    14901490 
    14911491} 
    14921492 
     1493function wp_ajax_wp_attach_media() { 
     1494        check_ajax_referer( 'attach-media', '_ajax_reattach_media_nonce' ); 
     1495 
     1496        $args = array(); 
     1497 
     1498        if ( isset( $_POST['search'] ) ) 
     1499                $args['s'] = stripslashes( $_POST['search'] ); 
     1500        $args['pagenum'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1; 
     1501 
     1502        $results = wp_attach_media_query( $args ); 
     1503 
     1504        if ( ! isset( $results ) ) 
     1505                wp_die( 0 ); 
     1506 
     1507        echo json_encode( $results ); 
     1508        echo "\n"; 
     1509 
     1510        wp_die(); 
     1511} 
     1512 
    14931513function wp_ajax_widgets_order() { 
    14941514        check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' ); 
    14951515 
  • wp-admin/js/media.js

     
    1  
     1/* 
    22var findPosts; 
    33(function($){ 
    44        findPosts = { 
     
    9191                        }); 
    9292                }); 
    9393        }); 
     94})(jQuery);*/ 
     95 
     96var wpAttachMedia; 
     97 
     98(function($){ 
     99        var inputs = {}, rivers = {}, ed, River, Query; 
     100 
     101        wpAttachMedia = { 
     102                timeToTriggerRiver: 150, 
     103                minRiverAJAXDuration: 200, 
     104                riverBottomThreshold: 5, 
     105                keySensitivity: 100, 
     106                lastSearch: '', 
     107 
     108                init : function() { 
     109                        inputs.dialog = $('#wp-attach-media'); 
     110                        inputs.submit = $('#wp-attach-media-submit'); 
     111                        inputs.nonce = $('#_ajax_attach_media_nonce'); 
     112                        inputs.search = $('#search-field'); 
     113                        // Build Rivers 
     114                        rivers.search = new River( $('#search-results') ); 
     115                        rivers.recent = new River( $('#most-recent-results') ); 
     116                        rivers.elements = $('.query-results', inputs.dialog); 
     117 
     118                        // Bind event handlers 
     119                        inputs.dialog.keydown( wpAttachMedia.keydown ); 
     120                        inputs.dialog.keyup( wpAttachMedia.keyup ); 
     121                        inputs.submit.click( function(e){ 
     122                                e.preventDefault(); 
     123                                wpAttachMedia.update(); 
     124                        }); 
     125                        $('#wp-link-cancel').click( function(e){ 
     126                                e.preventDefault(); 
     127                                wpAttachMedia.close(); 
     128                        }); 
     129 
     130                        //rivers.elements.bind('river-select', wpAttachMedia.updateFields ); 
     131 
     132                        inputs.search.keyup( wpAttachMedia.searchMedia ); 
     133 
     134                        inputs.dialog.bind('wpdialogrefresh', wpAttachMedia.refresh); 
     135 
     136                        //inputs.dialog.bind('wpdialogbeforeopen', wpAttachMedia.beforeOpen); 
     137 
     138                        //inputs.dialog.bind('wpdialogclose', wpAttachMedia.onClose); 
     139 
     140                }, 
     141 
     142                beforeOpen : function() { 
     143 
     144                }, 
     145 
     146                open : function() { 
     147                        // Initialize the dialog if necessary (html mode). 
     148                        if ( ! inputs.dialog.data('wpdialog') ) { 
     149                                inputs.dialog.wpdialog({ 
     150                                        title: wpAttachMediaL10n.title, 
     151                                        width: 480, 
     152                                        height: 'auto', 
     153                                        modal: true, 
     154                                        dialogClass: 'wp-dialog', 
     155                                        zIndex: 300000 
     156                                }); 
     157                        } 
     158 
     159                        inputs.dialog.wpdialog('open'); 
     160                }, 
     161 
     162                refresh : function() { 
     163                        // Refresh rivers (clear links, check visibility) 
     164                        rivers.search.refresh(); 
     165                        rivers.recent.refresh(); 
     166 
     167                        // Load the most recent results if this is the first time opening the panel. 
     168                        if ( ! rivers.recent.ul.children().length ) 
     169                                rivers.recent.ajax(); 
     170                }, 
     171 
     172                close : function() { 
     173                        inputs.dialog.wpdialog('close'); 
     174                }, 
     175 
     176                onClose: function() { 
     177 
     178                }, 
     179 
     180                update : function() { 
     181                        wpAttachMedia.close(); 
     182                }, 
     183 
     184                setDefaultValues : function() { 
     185                        // Update save prompt. 
     186                        inputs.submit.val( wpAttachMediaL10n.save ); 
     187                }, 
     188 
     189                searchMedia : function() { 
     190                        var t = $(this), waiting, 
     191                                search = t.val(); 
     192 
     193                        if ( search.length > 2 ) { 
     194                                rivers.recent.hide(); 
     195                                rivers.search.show(); 
     196 
     197                                // Don't search if the keypress didn't change the title. 
     198                                if ( wpAttachMedia.lastSearch == search ) 
     199                                        return; 
     200 
     201                                wpAttachMedia.lastSearch = search; 
     202                                waiting = t.parent().find('img.waiting').show(); 
     203 
     204                                rivers.search.change( search ); 
     205                                rivers.search.ajax( function(){ waiting.hide(); }); 
     206                        } else { 
     207                                rivers.search.hide(); 
     208                                rivers.recent.show(); 
     209                        } 
     210                }, 
     211 
     212                next : function() { 
     213                        rivers.search.next(); 
     214                        rivers.recent.next(); 
     215                }, 
     216                prev : function() { 
     217                        rivers.search.prev(); 
     218                        rivers.recent.prev(); 
     219                }, 
     220 
     221                keydown : function( event ) { 
     222                        var fn, key = $.ui.keyCode; 
     223 
     224                        switch( event.which ) { 
     225                                case key.UP: 
     226                                        fn = 'prev'; 
     227                                case key.DOWN: 
     228                                        fn = fn || 'next'; 
     229                                        clearInterval( wpAttachMedia.keyInterval ); 
     230                                        wpAttachMedia[ fn ](); 
     231                                        wpAttachMedia.keyInterval = setInterval( wpAttachMedia[ fn ], wpAttachMedia.keySensitivity ); 
     232                                        break; 
     233                                default: 
     234                                        return; 
     235                        } 
     236                        event.preventDefault(); 
     237                }, 
     238                keyup: function( event ) { 
     239                        var key = $.ui.keyCode; 
     240 
     241                        switch( event.which ) { 
     242                                case key.ESCAPE: 
     243                                        event.stopImmediatePropagation(); 
     244                                        if ( ! $(document).triggerHandler( 'wp_CloseOnEscape', [{ event: event, what: 'wpAttachMedia', cb: wpAttachMedia.close }] ) ) 
     245                                                wpAttachMedia.close(); 
     246 
     247                                        return false; 
     248                                        break; 
     249                                case key.UP: 
     250                                case key.DOWN: 
     251                                        clearInterval( wpAttachMedia.keyInterval ); 
     252                                        break; 
     253                                default: 
     254                                        return; 
     255                        } 
     256                        event.preventDefault(); 
     257                }, 
     258 
     259                delayedCallback : function( func, delay ) { 
     260                        var timeoutTriggered, funcTriggered, funcArgs, funcContext; 
     261 
     262                        if ( ! delay ) 
     263                                return func; 
     264 
     265                        setTimeout( function() { 
     266                                if ( funcTriggered ) 
     267                                        return func.apply( funcContext, funcArgs ); 
     268                                // Otherwise, wait. 
     269                                timeoutTriggered = true; 
     270                        }, delay); 
     271 
     272                        return function() { 
     273                                if ( timeoutTriggered ) 
     274                                        return func.apply( this, arguments ); 
     275                                // Otherwise, wait. 
     276                                funcArgs = arguments; 
     277                                funcContext = this; 
     278                                funcTriggered = true; 
     279                        }; 
     280                }, 
     281 
     282        } 
     283 
     284        River = function( element, search ) { 
     285                var self = this; 
     286                this.element = element; 
     287                this.ul = element.children('ul'); 
     288                this.waiting = element.find('.river-waiting'); 
     289 
     290                this.change( search ); 
     291                this.refresh(); 
     292 
     293                element.scroll( function(){ self.maybeLoad(); }); 
     294                element.delegate('li', 'click', function(e){ self.select( $(this), e ); }); 
     295        }; 
     296 
     297        $.extend( River.prototype, { 
     298                refresh: function() { 
     299                        this.deselect(); 
     300                        this.visible = this.element.is(':visible'); 
     301                }, 
     302                show: function() { 
     303                        if ( ! this.visible ) { 
     304                                this.deselect(); 
     305                                this.element.show(); 
     306                                this.visible = true; 
     307                        } 
     308                }, 
     309                hide: function() { 
     310                        this.element.hide(); 
     311                        this.visible = false; 
     312                }, 
     313                // Selects a list item and triggers the river-select event. 
     314                select: function( li, event ) { 
     315                        var liHeight, elHeight, liTop, elTop; 
     316 
     317                        if ( li.hasClass('unselectable') || li == this.selected ) 
     318                                return; 
     319 
     320                        this.deselect(); 
     321                        this.selected = li.addClass('selected'); 
     322                        // Make sure the element is visible 
     323                        liHeight = li.outerHeight(); 
     324                        elHeight = this.element.height(); 
     325                        liTop = li.position().top; 
     326                        elTop = this.element.scrollTop(); 
     327 
     328                        if ( liTop < 0 ) // Make first visible element 
     329                                this.element.scrollTop( elTop + liTop ); 
     330                        else if ( liTop + liHeight > elHeight ) // Make last visible element 
     331                                this.element.scrollTop( elTop + liTop - elHeight + liHeight ); 
     332 
     333                        // Trigger the river-select event 
     334                        this.element.trigger('river-select', [ li, event, this ]); 
     335                }, 
     336                deselect: function() { 
     337                        if ( this.selected ) 
     338                                this.selected.removeClass('selected'); 
     339                        this.selected = false; 
     340                }, 
     341                prev: function() { 
     342                        if ( ! this.visible ) 
     343                                return; 
     344 
     345                        var to; 
     346                        if ( this.selected ) { 
     347                                to = this.selected.prev('li'); 
     348                                if ( to.length ) 
     349                                        this.select( to ); 
     350                        } 
     351                }, 
     352                next: function() { 
     353                        if ( ! this.visible ) 
     354                                return; 
     355 
     356                        var to = this.selected ? this.selected.next('li') : $('li:not(.unselectable):first', this.element); 
     357                        if ( to.length ) 
     358                                this.select( to ); 
     359                }, 
     360                ajax: function( callback ) { 
     361                        var self = this, 
     362                                delay = this.query.page == 1 ? 0 : wpAttachMedia.minRiverAJAXDuration, 
     363                                response = wpAttachMedia.delayedCallback( function( results, params ) { 
     364                                        self.process( results, params ); 
     365                                        if ( callback ) 
     366                                                callback( results, params ); 
     367                                }, delay ); 
     368 
     369                        this.query.ajax( response ); 
     370                }, 
     371                change: function( search ) { 
     372                        if ( this.query && this._search == search ) 
     373                                return; 
     374 
     375                        this._search = search; 
     376                        this.query = new Query( search ); 
     377                        this.element.scrollTop(0); 
     378                }, 
     379                process: function( results, params ) { 
     380                        var list = '', alt = true, classes = '', 
     381                                firstPage = params.page == 1; 
     382 
     383                        if ( !results ) { 
     384                                if ( firstPage ) { 
     385                                        list += '<li class="unselectable"><span class="item-title"><em>' 
     386                                        + wpAttachMediaL10n.noMatchesFound 
     387                                        + '</em></span></li>'; 
     388                                } 
     389                        } else { 
     390                                $.each( results, function() { 
     391                                        classes = alt ? 'alternate' : ''; 
     392                                        classes += this['title'] ? '' : ' no-title'; 
     393                                        list += classes ? '<li class="' + classes + '">' : '<li>'; 
     394                                        list += '<input type="hidden" class="item-permalink" value="' + this['permalink'] + '" />'; 
     395                                        list += '<span class="item-title">'; 
     396                                        list += this['title'] ? this['title'] : wpAttachMediaL10n.noTitle; 
     397                                        list += '</span><span class="item-info">' + this['info'] + '</span></li>'; 
     398                                        alt = ! alt; 
     399                                }); 
     400                        } 
     401 
     402                        this.ul[ firstPage ? 'html' : 'append' ]( list ); 
     403                }, 
     404                maybeLoad: function() { 
     405                        var self = this, 
     406                                el = this.element, 
     407                                bottom = el.scrollTop() + el.height(); 
     408 
     409                        if ( ! this.query.ready() || bottom < this.ul.height() - wpAttachMedia.riverBottomThreshold ) 
     410                                return; 
     411 
     412                        setTimeout(function() { 
     413                                var newTop = el.scrollTop(), 
     414                                        newBottom = newTop + el.height(); 
     415 
     416                                if ( ! self.query.ready() || newBottom < self.ul.height() - wpAttachMedia.riverBottomThreshold ) 
     417                                        return; 
     418 
     419                                self.waiting.show(); 
     420                                el.scrollTop( newTop + self.waiting.outerHeight() ); 
     421 
     422                                self.ajax( function() { self.waiting.hide(); }); 
     423                        }, wpAttachMedia.timeToTriggerRiver ); 
     424                } 
     425        }); 
     426 
     427        Query = function( search ) { 
     428                this.page = 1; 
     429                this.allLoaded = false; 
     430                this.querying = false; 
     431                this.search = search; 
     432        }; 
     433 
     434        $.extend( Query.prototype, { 
     435                ready: function() { 
     436                        return !( this.querying || this.allLoaded ); 
     437                }, 
     438                ajax: function( callback ) { 
     439                        var self = this, 
     440                                query = { 
     441                                        action : 'wp-attach-media', 
     442                                        page : this.page, 
     443                                        '_ajax_attach_media_nonce' : inputs.nonce.val() 
     444                                }; 
     445 
     446                        if ( this.search ) 
     447                                query.search = this.search; 
     448 
     449                        this.querying = true; 
     450 
     451                        $.post( ajaxurl, query, function(r) { 
     452                                self.page++; 
     453                                self.querying = false; 
     454                                self.allLoaded = !r; 
     455                                callback( r, query ); 
     456                        }, "json" ); 
     457                } 
     458        }); 
     459 
     460        $(document).ready( wpAttachMedia.init ); 
    94461})(jQuery); 
  • wp-admin/upload.php

     
    141141$title = __('Media Library'); 
    142142$parent_file = 'upload.php'; 
    143143 
    144 wp_enqueue_script( 'wp-ajax-response' ); 
    145 wp_enqueue_script( 'jquery-ui-draggable' ); 
    146144wp_enqueue_script( 'media' ); 
    147145 
    148146add_screen_option( 'per_page', array('label' => _x( 'Media items', 'items per page (screen options)' )) ); 
     
    240238<?php $wp_list_table->display(); ?> 
    241239 
    242240<div id="ajax-response"></div> 
    243 <?php find_posts_div(); ?> 
     241<?php wp_attach_media_dialog(); ?> 
    244242<br class="clear" /> 
    245243 
    246244</form>