WordPress.org

Make WordPress Core

Ticket #16029: 16029.patch

File 16029.patch, 16.3 KB (added by ocean90, 6 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>