WordPress.org

Make WordPress Core

Ticket #33301: 33301.6.patch

File 33301.6.patch, 10.7 KB (added by iseulde, 4 years ago)
  • src/wp-admin/includes/ajax-actions.php

     
    14771477
    14781478        $args = array();
    14791479
    1480         if ( isset( $_POST['search'] ) )
     1480        if ( isset( $_POST['search'] ) ) {
    14811481                $args['s'] = wp_unslash( $_POST['search'] );
     1482        }
     1483
     1484        if ( isset( $_POST['term'] ) ) {
     1485                $args['s'] = wp_unslash( $_POST['term'] );
     1486        }
     1487
    14821488        $args['pagenum'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1;
    14831489
    14841490        require(ABSPATH . WPINC . '/class-wp-editor.php');
  • src/wp-includes/class-wp-editor.php

     
    779779
    780780                if ( in_array('wplink', self::$plugins, true) || in_array('link', self::$qt_buttons, true) ) {
    781781                        wp_enqueue_script('wplink');
     782                        wp_enqueue_script( 'jquery-ui-autocomplete' );
    782783                }
    783784
    784785                if ( self::$old_dfw_compat ) {
  • src/wp-includes/css/editor.css

     
    451451        width: 20px;
    452452}
    453453
     454.mce-toolbar .mce-btn-group .mce-btn.mce-primary {
     455        min-width: auto;
     456
     457        background: #0085ba;
     458        border-color: #0073aa #006799 #006799;
     459        -webkit-box-shadow: 0 1px 0 #006799;
     460        box-shadow: 0 1px 0 #006799;
     461        color: #fff;
     462        text-decoration: none;
     463        text-shadow: 0 -1px 1px #006799,
     464                1px 0 1px #006799,
     465                0 1px 1px #006799,
     466                -1px 0 1px #006799;
     467}
     468
     469.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico {
     470        color: #fff;
     471}
     472
     473.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover,
     474.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus {
     475        background: #008ec2;
     476        border-color: #006799;
     477        color: #fff;
     478}
     479
     480.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus {
     481        -webkit-box-shadow: 0 1px 0 #0073aa,
     482                0 0 2px 1px #33b3db;
     483        box-shadow: 0 1px 0 #0073aa,
     484                0 0 2px 1px #33b3db;
     485}
     486
     487.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active {
     488        background: #0073aa;
     489        border-color: #006799;
     490        -webkit-box-shadow: inset 0 2px 0 #006799;
     491        box-shadow: inset 0 2px 0 #006799;
     492        vertical-align: top;
     493}
     494
    454495/* mce listbox */
    455496.mce-toolbar .mce-btn-group .mce-btn.mce-listbox {
    456497    -webkit-border-radius: 0;
     
    17091750        }
    17101751}
    17111752
     1753div.wp-link-preview input {
     1754        width: 300px;
     1755}
     1756
     1757.ui-autocomplete.mce-wp-autocomplete {
     1758        z-index: 100100;
     1759        margin-top: 10px;
     1760}
     1761
    17121762/* =Overlay Body
    17131763-------------------------------------------------------------- */
    17141764
  • src/wp-includes/js/tinymce/plugins/wordpress/plugin.js

     
    744744                                        top, left;
    745745
    746746                                if ( spaceTop >= editorHeight || spaceBottom >= editorHeight ) {
    747                                         return this.hide();
     747                                        this.scrolling = true;
     748                                        this.hide();
     749                                        this.scrolling = false;
     750                                        return this;
    748751                                }
    749752
    750753                                // Add offset in iOS to move the menu over the image, out of the way of the default iOS menu.
     
    850853
    851854                        currentSelection = args.selection || args.element;
    852855
    853                         if ( activeToolbar ) {
     856                        if ( activeToolbar && activeToolbar !== args.toolbar ) {
    854857                                activeToolbar.hide();
    855858                        }
    856859
    857860                        if ( args.toolbar ) {
    858                                 activeToolbar = args.toolbar;
    859                                 activeToolbar.show();
     861                                if ( activeToolbar !== args.toolbar ) {
     862                                        activeToolbar = args.toolbar;
     863                                        activeToolbar.show();
     864                                } else {
     865                                        activeToolbar.reposition();
     866                                }
    860867                        } else {
    861868                                activeToolbar = false;
    862869                        }
     
    870877
    871878                function hide( event ) {
    872879                        if ( activeToolbar ) {
    873                                 activeToolbar.hide();
    874 
    875880                                if ( event.type === 'hide' ) {
     881                                        activeToolbar.hide();
    876882                                        activeToolbar = false;
    877883                                } else if ( event.type === 'resize' || event.type === 'scroll' ) {
    878884                                        clearTimeout( timeout );
    879885
    880886                                        timeout = setTimeout( function() {
    881887                                                if ( activeToolbar && typeof activeToolbar.show === 'function' ) {
     888                                                        activeToolbar.scrolling = false;
    882889                                                        activeToolbar.show();
    883890                                                }
    884891                                        }, 250 );
     892
     893                                        activeToolbar.scrolling = true;
     894                                        activeToolbar.hide();
    885895                                }
    886896                        }
    887897                }
  • src/wp-includes/js/tinymce/plugins/wplink/plugin.js

     
    4747                }
    4848        } );
    4949
     50        tinymce.ui.WPLinkInput = tinymce.ui.Control.extend( {
     51                renderHtml: function() {
     52                        return (
     53                                '<div id="' + this._id + '" class="wp-link-preview">' +
     54                                        '<input type="text" value="" tabindex="-1" />' +
     55                                '</div>'
     56                        );
     57                },
     58                setURL: function( url ) {
     59                        this.getEl().firstChild.value = url;
     60                }
     61        } );
     62
    5063        tinymce.PluginManager.add( 'wplink', function( editor ) {
     64                var a;
    5165                var toolbar;
     66                var editToolbar;
     67                var previewInstance;
     68                var inputInstance;
     69
     70                editor.on( 'preinit', function() {
     71                        if ( editor.wp && editor.wp._createToolbar ) {
     72                                toolbar = editor.wp._createToolbar( [
     73                                        'wp_link_preview',
     74                                        'wp_link_edit',
     75                                        'wp_link_remove'
     76                                ], true );
     77
     78                                editToolbar = editor.wp._createToolbar( [
     79                                        'wp_link_input',
     80                                        'wp_link_advanced',
     81                                        'wp_link_apply'
     82                                ], true );
     83
     84                                editToolbar.on( 'show', function() {
     85                                        var node = editToolbar.find( 'toolbar' )[0];
     86                                        node && node.focus( true );
     87                                        a = editor.dom.getParent( editor.selection.getNode(), 'a' );
     88                                } );
     89
     90                                editToolbar.on( 'hide', function() {
     91                                        editToolbar.scrolling || editor.execCommand( 'wp_link_cancel' );
     92                                } );
     93                        }
     94                } );
    5295
    5396                editor.addCommand( 'WP_Link', function() {
    54                         window.wpLink && window.wpLink.open( editor.id );
    55                 });
     97                        var a = editor.dom.getParent( editor.selection.getNode(), 'a' );
     98
     99                        if ( a ) {
     100                                editor.dom.setAttribs( a, { 'data-wp-edit': true } );
     101                        } else {
     102                                editor.execCommand( 'mceInsertLink', false, { href: '_wp_link_placeholder' } );
     103                        }
     104
     105                        editor.nodeChanged();
     106                } );
     107
     108                editor.addCommand( 'wp_link_apply', function() {
     109                        if ( editToolbar.scrolling ) {
     110                                return;
     111                        }
     112
     113                        var href = tinymce.trim( inputInstance.getEl().firstChild.value );
     114
     115                        if ( href && ! /^(?:[a-z]+:|#|\?|\.|\/)/.test( href ) ) {
     116                                href = 'http://' + href;
     117                        }
     118
     119                        if ( ! href ) {
     120                                editor.dom.remove( a, true );
     121                                return;
     122                        }
     123
     124                        if ( a ) {
     125                                editor.dom.setAttribs( a, { href: href, 'data-wp-edit': null } );
     126                        }
     127
     128                        a = false;
     129
     130                        editor.nodeChanged();
     131                        editor.focus();
     132                } );
     133
     134                editor.addCommand( 'wp_link_cancel', function() {
     135                        if ( a ) {
     136                                if ( editor.$( a ).attr( 'href' ) === '_wp_link_placeholder' ) {
     137                                        editor.dom.remove( a, true );
     138                                } else {
     139                                        editor.dom.setAttribs( a, { 'data-wp-edit': null } );
     140                                }
     141                        }
     142
     143                        a = false;
     144
     145                        editor.nodeChanged();
     146                        editor.focus();
     147                } );
    56148
    57149                // WP default shortcut
    58150                editor.addShortcut( 'access+a', '', 'WP_Link' );
     
    102194                editor.addButton( 'wp_link_preview', {
    103195                        type: 'WPLinkPreview',
    104196                        onPostRender: function() {
    105                                 var self = this;
     197                                previewInstance = this;
     198                        }
     199                } );
     200
     201                editor.addButton( 'wp_link_input', {
     202                        type: 'WPLinkInput',
     203                        onPostRender: function() {
     204                                var input = this.getEl().firstChild;
     205                                var cache;
     206                                var last;
     207
     208                                inputInstance = this;
     209
     210                                jQuery( input ).autocomplete( {
     211                                        source: function( request, response ) {
     212                                                if ( last === request.term ) {
     213                                                        response( cache );
     214                                                        return;
     215                                                }
    106216
    107                                 editor.on( 'wptoolbar', function( event ) {
    108                                         var anchor = editor.dom.getParent( event.element, 'a' ),
    109                                                 $anchor,
    110                                                 href;
    111 
    112                                         if ( anchor ) {
    113                                                 $anchor = editor.$( anchor );
    114                                                 href = $anchor.attr( 'href' );
    115 
    116                                                 if ( href && ! $anchor.find( 'img' ).length ) {
    117                                                         self.setURL( href );
    118                                                         event.element = anchor;
    119                                                         event.toolbar = toolbar;
     217                                                if ( /^https?:/.test( request.term ) || request.term.indexOf( '.' ) !== -1 ) {
     218                                                        return response();
    120219                                                }
     220
     221                                                jQuery.post( window.ajaxurl, {
     222                                                        action: 'wp-link-ajax',
     223                                                        page: 1,
     224                                                        search: request.term,
     225                                                        _ajax_linking_nonce: jQuery( '#_ajax_linking_nonce' ).val()
     226                                                }, function( data ) {
     227                                                        cache = data;
     228                                                        response( data );
     229                                                }, 'json' );
     230
     231                                                last = request.term;
     232                                        },
     233                                        select: function( event, ui ) {
     234                                                jQuery( input ).val( ui.item.permalink );
     235                                                return false;
     236                                        },
     237                                        minLength: 2,
     238                                        position: {
     239                                                my: 'left top+10'
    121240                                        }
     241                                } ).autocomplete( 'instance' )._renderItem = function( ul, item ) {
     242                                        jQuery( ul ).addClass( 'mce-wp-autocomplete' );
     243
     244                                        return jQuery( '<li>' )
     245                                                .append( '<span>' + item.title + '</span><span>' + item.info + '</span>' )
     246                                                .appendTo( ul );
     247                                };
     248
     249                                jQuery( input ).on( 'focus', function() {
     250                                        jQuery( input ).autocomplete( 'search' );
     251                                } );
     252
     253                                tinymce.$( input ).on( 'keydown', function( event ) {
     254                                        event.keyCode === 13 && editor.execCommand( 'wp_link_apply' );
    122255                                } );
    123256                        }
    124257                } );
    125258
     259                editor.on( 'wptoolbar', function( event ) {
     260                        var anchor = editor.dom.getParent( event.element, 'a' ),
     261                                $anchor,
     262                                href, edit;
     263
     264                        if ( anchor ) {
     265                                $anchor = editor.$( anchor );
     266                                href = $anchor.attr( 'href' );
     267                                edit = $anchor.attr( 'data-wp-edit' );
     268
     269                                if ( href === '_wp_link_placeholder' || edit ) {
     270                                        inputInstance.setURL( edit ? href : '' );
     271                                        event.element = anchor;
     272                                        event.toolbar = editToolbar;
     273                                } else if ( href && ! $anchor.find( 'img' ).length ) {
     274                                        previewInstance.setURL( href );
     275                                        event.element = anchor;
     276                                        event.toolbar = toolbar;
     277                                }
     278                        }
     279                } );
     280
    126281                editor.addButton( 'wp_link_edit', {
    127282                        tooltip: 'Edit ', // trailing space is needed, used for context
    128283                        icon: 'dashicon dashicons-edit',
     
    135290                        cmd: 'unlink'
    136291                } );
    137292
    138                 editor.on( 'preinit', function() {
    139                         if ( editor.wp && editor.wp._createToolbar ) {
    140                                 toolbar = editor.wp._createToolbar( [
    141                                         'wp_link_preview',
    142                                         'wp_link_edit',
    143                                         'wp_link_remove'
    144                                 ], true );
     293                // Advanced, more, options?
     294                editor.addButton( 'wp_link_advanced', {
     295                        tooltip: 'Advanced',
     296                        icon: 'dashicon dashicons-admin-generic',
     297                        onclick: function() {
     298                                editor.execCommand( 'wp_link_apply' );
     299                                window.wpLink && window.wpLink.open( editor.id );
    145300                        }
    146301                } );
     302
     303                editor.addButton( 'wp_link_apply', {
     304                        tooltip: 'Apply',
     305                        icon: 'dashicon dashicons-editor-break',
     306                        cmd: 'wp_link_apply',
     307                        classes: 'widget btn primary'
     308                } );
    147309        } );
    148310} )( window.tinymce );