Make WordPress Core

Changeset 27797


Ignore:
Timestamp:
03/27/2014 10:40:06 PM (13 years ago)
Author:
azaozz
Message:

Edit Image modal:

  • Bring back some of the advanced settings.
  • Make the layout two-column for wider screens, remove the sidebar, and shrink the modal a bit.
  • The image reflects the size as inserted in the post as long as it doesn't overflow the column and is not too tall. Changing the size to another intermediate will also update the image "preview."
  • Rename "Edit Image" to "Edit Original" to try and better communicate that editing the image will modify the media library item not just the image inserted into the post that is being edited.

(updates two PNGs from precommit)
Props gcorne, see #27366

Location:
trunk/src/wp-includes
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/css/media-views.css

    r27773 r27797  
    14631463}
    14641464
     1465.media-frame .imgedit-wrap table {
     1466        width: 100%;
     1467}
     1468
    14651469.media-frame .imgedit-wrap table td {
    14661470        vertical-align: top;
    … …  
    15141518}
    15151519
     1520.image-details .media-modal {
     1521        left: 140px;
     1522        right: 140px;
     1523}
     1524
     1525.image-details .media-frame-menu {
     1526        display: none;
     1527}
     1528
     1529.image-details .media-frame-title,
     1530.image-details .media-frame-content,
     1531.image-details .media-frame-router {
     1532        left: 0;
     1533}
     1534
    15161535.image-details .embed-media-settings {
    15171536        top: 0;
    1518 }
     1537        overflow: visible;
     1538}
     1539
     1540.image-details .column-settings {
     1541        width: 44%;
     1542        float: left;
     1543        margin-right: 20px;
     1544}
     1545
     1546.image-details .column-image {
     1547        width: 53%;
     1548        float: left;
     1549}
     1550
     1551.image-details .column-image:after {
     1552    content: '';
     1553        display: table;
     1554    clear: both;
     1555}
     1556
     1557.image-details .image img {
     1558        max-width: 100%;
     1559        max-height: 500px;
     1560}
     1561
    15191562
    15201563.media-embed .thumbnail {
    … …  
    15301573}
    15311574
    1532 .media-embed .edit-attachment {
    1533         margin-left: 10px;
    1534 }
    1535 
    15361575.media-embed .thumbnail:after {
    15371576        content: '';
    … …  
    15491588.media-embed .setting {
    15501589        width: 100%;
    1551         margin-top: 10px;
     1590        margin: 10px 0;
    15521591        float: left;
    15531592        display: block;
    … …  
    15551594}
    15561595
    1557 .media-embed .setting .hidden {
     1596.image-details .setting {
     1597        float: none;
     1598}
     1599
     1600.image-details .actions {
     1601        margin: 10px 0;
     1602}
     1603
     1604.media-embed .setting input[type="text"],
     1605.media-embed .setting textarea {
     1606        display: block;
     1607        width: 100%;
     1608        max-width: 400px;
     1609        margin: 1px 0;
     1610}
     1611
     1612.image-details .setting input[type="text"],
     1613.image-details .setting textarea {
     1614        max-width: inherit;
     1615}
     1616
     1617.media-embed .setting input.hidden {
    15581618        display: none;
    15591619}
    … …  
    15711631}
    15721632
    1573 .media-embed .setting input[type="text"],
    1574 .media-embed .setting textarea {
    1575         display: block;
    1576         width: 100%;
    1577         max-width: 400px;
    1578         margin: 1px 0;
     1633.media-embed-sidebar {
     1634        position: absolute;
     1635        top: 0;
     1636        left: 440px;
     1637}
     1638
     1639.advanced,
     1640.link-settings {
     1641        margin-top: 10px;
     1642}
     1643
     1644.advanced .hidden {
     1645        display: none;
    15791646}
    15801647
    … …  
    17821849        }
    17831850
     1851        .image-details .media-modal {
     1852                left: 30px;
     1853                right: 30px;
     1854        }
     1855
    17841856        .media-selection {
    17851857                min-width: 120px;
    … …  
    18501922        }
    18511923
     1924        .image-details .media-frame-title {
     1925                display: block;
     1926                top: 0;
     1927                font-size: 14px;
     1928        }
     1929
    18521930        .media-frame-toolbar {
    18531931                position: absolute;
    … …  
    19061984        }
    19071985
     1986        .image-details .media-frame.hide-router .media-frame-content {
     1987                top: 40px;
     1988        }
     1989
    19081990        .media-frame .attachments-browser {
    19091991                padding-bottom: 300px;
    … …  
    19402022
    19412023        /* Full-bleed modal */
    1942         .media-modal {
     2024        .media-modal,
     2025        .image-details .media-modal {
    19432026                position: fixed;
    19442027                top: 0;
    … …  
    19742057        .embed-media-settings {
    19752058                padding-bottom: 52px;
     2059        }
     2060
     2061        .image-details .column-settings,
     2062        .image-details .column-image {
     2063                float: none;
     2064                width: 100%;
    19762065        }
    19772066
  • trunk/src/wp-includes/js/media-views.js

    r27789 r27797  
    762762                        this.image = options.image;
    763763                        media.controller.State.prototype.initialize.apply( this, arguments );
     764                },
     765
     766                activate: function() {
     767                        this.frame.modal.$el.addClass('image-details');
    764768                }
    765769        });
    … …  
    26232627                },
    26242628
    2625 
    26262629                renderMenu: function( view ) {
    26272630                        var lastState = this.lastState(),
    … …  
    26782681
    26792682                renderReplaceImageToolbar: function() {
     2683                        var frame = this,
     2684                                lastState = frame.lastState(),
     2685                                previous = lastState && lastState.id;
     2686
    26802687                        this.toolbar.set( new media.view.Toolbar({
    26812688                                controller: this,
    26822689                                items: {
     2690                                        back: {
     2691                                                text:     l10n.back,
     2692                                                priority: 20,
     2693                                                click:    function() {
     2694                                                        if ( previous ) {
     2695                                                                frame.setState( previous );
     2696                                                        } else {
     2697                                                                frame.close();
     2698                                                        }
     2699                                                }
     2700                                        },
     2701
    26832702                                        replace: {
    26842703                                                style:    'primary',
    … …  
    59715990                template:  media.template('image-details'),
    59725991                events: _.defaults( media.view.Settings.AttachmentDisplay.prototype.events, {
    5973                         'click .edit-attachment': 'editAttachment'
     5992                        'click .edit-attachment': 'editAttachment',
     5993                        'click .replace-attachment': 'replaceAttachment',
     5994                        'click .show-advanced': 'showAdvanced'
    59745995                } ),
    59755996                initialize: function() {
    … …  
    59775998                        this.options.attachment = this.model.attachment;
    59785999                        if ( this.model.attachment ) {
    5979                                 this.listenTo( this.model.attachment, 'change:url', this.updateUrl );
     6000                                this.listenTo( this.model, 'change:url', this.updateUrl );
     6001                                this.listenTo( this.model, 'change:link', this.toggleLinkSettings );
    59806002                        }
    59816003                        media.view.Settings.AttachmentDisplay.prototype.initialize.apply( this, arguments );
    … …  
    60026024                                        media.view.Settings.AttachmentDisplay.prototype.render.apply( self, args );
    60036025                                        self.resetFocus();
     6026                                        self.toggleLinkSettings();
    60046027                                } ).fail( function() {
    60056028                                        self.model.attachment = false;
    60066029                                        media.view.Settings.AttachmentDisplay.prototype.render.apply( self, args );
    60076030                                        self.resetFocus();
     6031                                        self.toggleLinkSettings();
    60086032                                } );
    60096033                        } else {
    60106034                                media.view.Settings.AttachmentDisplay.prototype.render.apply( this, arguments );
    60116035                                setTimeout( function() { self.resetFocus(); }, 10 );
     6036                                self.toggleLinkSettings();
    60126037                        }
    60136038
    … …  
    60166041
    60176042                resetFocus: function() {
    6018                         this.$( '.caption textarea' ).focus();
    6019                         this.$( '.embed-image-settings' ).scrollTop( 0 );
     6043                        this.$( '.link-to-custom' ).blur();
     6044                        this.$( '.embed-media-settings' ).scrollTop( 0 );
    60206045                },
    60216046
    60226047                updateUrl: function() {
    6023                         this.$( '.thumbnail img' ).attr( 'src', this.model.get('url' ) );
     6048                        this.$( '.image img' ).attr( 'src', this.model.get('url' ) );
    60246049                        this.$( '.url' ).val( this.model.get('url' ) );
     6050                },
     6051
     6052                toggleLinkSettings: function() {
     6053                        if ( this.model.get( 'link' ) === 'none' ) {
     6054                                this.$( '.link-settings' ).addClass('hidden');
     6055                        } else {
     6056                                this.$( '.link-settings' ).removeClass('hidden');
     6057                        }
     6058                },
     6059
     6060                showAdvanced: function( event ) {
     6061                        event.preventDefault();
     6062                        $( event.target ).closest('.advanced')
     6063                                .find( '.hidden' ).removeClass( 'hidden' );
     6064                        $( event.target ).remove();
    60256065                },
    60266066
    … …  
    60336073                                this.controller.setState( 'edit-image' );
    60346074                        }
     6075                },
     6076
     6077                replaceAttachment: function( event ) {
     6078                        event.preventDefault();
     6079                        this.controller.setState( 'replace-image' );
    60356080                }
    60366081        });
  • trunk/src/wp-includes/js/tinymce/plugins/wpeditimage/plugin.js

    r27786 r27797  
    115115
    116116        function extractImageData( imageNode ) {
    117                 var classes, metadata, captionBlock, caption,
     117                var classes, metadata, captionBlock, caption, link,
    118118                        dom = editor.dom;
    119119
    … …  
    124124                        height: '',
    125125                        width: '',
    126                         size: 'none',
     126                        size: false,
    127127                        caption: '',
    128128                        alt: '',
    129129                        align: 'none',
    130130                        link: false,
    131                         linkUrl: ''
     131                        linkUrl: '',
     132                        linkClassName: '',
     133                        linkTargetBlank: false,
     134                        linkRel: '',
     135                        title: '',
     136                        className: ''
    132137                };
    133138
    134139                metadata.url = dom.getAttrib( imageNode, 'src' );
    135140                metadata.alt = dom.getAttrib( imageNode, 'alt' );
     141                metadata.title = dom.getAttrib( imageNode, 'title' );
    136142                metadata.width = parseInt( dom.getAttrib( imageNode, 'width' ), 10 );
    137143                metadata.height = parseInt( dom.getAttrib( imageNode, 'height' ), 10 );
    138 
    139                 //TODO: probably should capture attributes on both the <img /> and the <a /> so that they can be restored
    140                 // when the image and/or caption are updated
    141                 // maybe use getAttribs()
    142 
    143                 // extract meta data from classes (candidate for turning into a method)
    144                 classes = imageNode.className.split( ' ' );
     144                metadata.className = imageNode.className;
     145
     146                classes = metadata.className.split( ' ' );
    145147                tinymce.each( classes, function( name ) {
    146148
    … …  
    158160                } );
    159161
    160                 // extract caption
     162                // Extract caption
    161163                captionBlock = dom.getParents( imageNode, '.wp-caption' );
    162164
    … …  
    174176                        if ( caption.length ) {
    175177                                caption = caption[0];
    176                                 // need to do some more thinking about this
     178
    177179                                metadata.caption = editor.serializer.serialize( caption )
    178180                                        .replace( /<br[^>]*>/g, '$&\n' ).replace( /^<p>/, '' ).replace( /<\/p>$/, '' );
    … …  
    180182                }
    181183
    182                 // extract linkTo
     184                // Extract linkTo
    183185                if ( imageNode.parentNode && imageNode.parentNode.nodeName === 'A' ) {
    184                         metadata.linkUrl = dom.getAttrib( imageNode.parentNode, 'href' );
     186                        link = imageNode.parentNode;
     187                        metadata.linkUrl = dom.getAttrib( link, 'href' );
     188                        metadata.linkTargetBlank = dom.getAttrib( link, 'target' ) === '_blank' ? true : false;
     189                        metadata.linkRel = dom.getAttrib( link, 'rel' );
     190                        metadata.linkClassName = link.className;
    185191                }
    186192
    … …  
    224230                        }
    225231                }
    226                 // uniqueId isn't super exciting, so maybe we want to use something else
     232
    227233                uid = editor.dom.uniqueId( 'wp_' );
    228234                editor.dom.setAttrib( node, 'data-wp-replace-id', uid );
    … …  
    247253        function createImageAndLink( imageData, mode ) {
    248254                var classes = [],
    249                         props;
     255                        attrs, linkAttrs;
    250256
    251257                mode = mode ? mode : 'node';
    … …  
    262268                }
    263269
    264                 props = {
     270                attrs = {
    265271                        src: imageData.url,
    266272                        width: imageData.width,
    267273                        height: imageData.height,
    268                         alt: imageData.alt
     274                        alt: imageData.alt,
     275                        title: imageData.title || null
    269276                };
    270277
    271278                if ( classes.length ) {
    272                         props['class'] = classes.join( ' ' );
     279                        attrs['class'] = classes.join( ' ' );
    273280                }
    274281
    275282                if ( imageData.linkUrl ) {
     283
     284                        linkAttrs = {
     285                                href: imageData.linkUrl
     286                        };
     287
     288                        if ( imageData.linkRel ) {
     289                                linkAttrs.rel = imageData.linkRel;
     290                        }
     291
     292                        if ( imageData.linkTargetBlank ) {
     293                                linkAttrs.target = '_blank';
     294                        }
     295
     296                        if ( imageData.linkClassName ) {
     297                                linkAttrs['class'] = imageData.linkClassName;
     298                        }
     299
    276300                        if ( mode === 'node' ) {
    277                                 return editor.dom.create( 'a', { href: imageData.linkUrl }, editor.dom.createHTML( 'img', props ) );
     301                                return editor.dom.create( 'a', linkAttrs, editor.dom.createHTML( 'img', attrs ) );
    278302                        } else if ( mode === 'html' ) {
    279                                 return editor.dom.createHTML( 'a', { href: imageData.linkUrl }, editor.dom.createHTML( 'img', props ) );
    280                         }
     303                                return editor.dom.createHTML( 'a', linkAttrs, editor.dom.createHTML( 'img', attrs ) );
     304                        }
     305
    281306                } else if ( mode === 'node' ) {
    282                         return editor.dom.create( 'img', props );
     307                        return editor.dom.create( 'img', attrs );
    283308                } else if ( mode === 'html' ) {
    284                         return editor.dom.createHTML( 'img', props );
     309                        return editor.dom.createHTML( 'img', attrs );
    285310                }
    286311        }
  • trunk/src/wp-includes/media-template.php

    r27796 r27797  
    639639
    640640        <script type="text/html" id="tmpl-image-details">
    641                 <?php // reusing .media-embed to pick up the styles for now ?>
    642641                <div class="media-embed">
    643642                        <div class="embed-media-settings">
    644                                 <div class="thumbnail">
    645                                         <img src="{{ data.model.url }}" draggable="false" />
    646                                 </div>
    647                                 <# if ( data.attachment && window.imageEdit ) { #>
    648                                         <input type="button" class="edit-attachment button" value="<?php esc_attr_e( 'Edit Image' ); ?>" />
    649                                 <# } #>
    650 
    651                                 <div class="setting url">
    652                                         <?php // might want to make the url editable if it isn't an attachment ?>
    653                                         <input type="text" disabled="disabled" value="{{ data.model.url }}" />
    654                                 </div>
    655 
    656                                 <?php
    657                                 /** This filter is documented in wp-admin/includes/media.php */
    658                                 if ( ! apply_filters( 'disable_captions', '' ) ) : ?>
    659                                         <label class="setting caption">
    660                                                 <span><?php _e('Caption'); ?></span>
    661                                                 <textarea data-setting="caption">{{ data.model.caption }}</textarea>
     643                                <div class="column-settings">
     644                                        <?php
     645                                        /** This filter is documented in wp-admin/includes/media.php */
     646                                        if ( ! apply_filters( 'disable_captions', '' ) ) : ?>
     647                                                <label class="setting caption">
     648                                                        <span><?php _e('Caption'); ?></span>
     649                                                        <textarea data-setting="caption">{{ data.model.caption }}</textarea>
     650                                                </label>
     651                                        <?php endif; ?>
     652
     653                                        <label class="setting alt-text">
     654                                                <span><?php _e('Alternative Text'); ?></span>
     655                                                <input type="text" data-setting="alt" value="{{ data.model.alt }}" />
    662656                                        </label>
    663                                 <?php endif; ?>
    664 
    665                                 <label class="setting alt-text">
    666                                         <span><?php _e('Alt Text'); ?></span>
    667                                         <input type="text" data-setting="alt" value="{{ data.model.alt }}" />
    668                                 </label>
    669 
    670                                 <div class="setting align">
    671                                         <span><?php _e('Align'); ?></span>
    672                                         <div class="button-group button-large" data-setting="align">
    673                                                 <button class="button" value="left">
    674                                                         <?php esc_attr_e('Left'); ?>
    675                                                 </button>
    676                                                 <button class="button" value="center">
    677                                                         <?php esc_attr_e('Center'); ?>
    678                                                 </button>
    679                                                 <button class="button" value="right">
    680                                                         <?php esc_attr_e('Right'); ?>
    681                                                 </button>
    682                                                 <button class="button active" value="none">
    683                                                         <?php esc_attr_e('None'); ?>
    684                                                 </button>
    685                                         </div>
    686                                 </div>
    687                                 <div class="setting link-to">
    688                                         <span><?php _e('Link To'); ?></span>
    689                                         <div class="button-group button-large" data-setting="link">
    690                                         <# if ( data.attachment ) { #>
    691                                                 <button class="button" value="file">
    692                                                         <?php esc_attr_e('Media File'); ?>
    693                                                 </button>
    694                                                 <button class="button" value="post">
    695                                                         <?php esc_attr_e('Attachment Page'); ?>
    696                                                 </button>
    697                                         <# } else { #>
    698                                                 <button class="button" value="file">
    699                                                         <?php esc_attr_e('Image URL'); ?>
    700                                                 </button>
    701                                         <# } #>
    702                                                 <button class="button" value="custom">
    703                                                         <?php esc_attr_e('Custom URL'); ?>
    704                                                 </button>
    705                                                 <button class="button active" value="none">
    706                                                         <?php esc_attr_e('None'); ?>
    707                                                 </button>
    708                                         </div>
    709                                         <input type="text" class="link-to-custom" data-setting="linkUrl" />
    710                                 </div>
    711 
    712                                 <# if ( data.attachment ) { #>
    713                                         <div class="setting size">
    714                                                 <span><?php _e('Size'); ?></span>
    715                                                 <div class="button-group button-large" data-setting="size">
    716                                                 <?php
    717                                                         /** This filter is documented in wp-admin/includes/media.php */
    718                                                         $sizes = apply_filters( 'image_size_names_choose', array(
    719                                                                 'thumbnail' => __('Thumbnail'),
    720                                                                 'medium'    => __('Medium'),
    721                                                                 'large'     => __('Large'),
    722                                                                 'full'      => __('Full Size'),
    723                                                         ) );
    724 
    725                                                         foreach ( $sizes as $value => $name ) : ?>
    726                                                                 <# var size = data.attachment.sizes['<?php echo esc_js( $value ); ?>'];
    727                                                                 if ( size ) { #>
    728                                                                         <button class="button" value="<?php echo esc_attr( $value ); ?>">
    729                                                                                 <?php echo esc_html( $name ); ?>
    730                                                                                 </button>
    731                                                                 <# } #>
    732                                                         <?php endforeach; ?>
     657
     658                                        <div class="setting advanced">
     659                                                <a class="show-advanced" href="#"><?php _e('show advanced'); ?></a>
     660                                                <div class="hidden">
     661                                                        <label class="setting title-text">
     662                                                                <span><?php _e('Title Attribute'); ?></span>
     663                                                                <input type="text" data-setting="title" value="{{ data.model.title }}" />
     664                                                        </label>
    733665                                                </div>
    734666                                        </div>
    735                                 <# } #>
     667
     668                                        <div class="setting align">
     669                                                <span><?php _e('Align'); ?></span>
     670                                                <div class="button-group button-large" data-setting="align">
     671                                                        <button class="button" value="left">
     672                                                                <?php esc_attr_e('Left'); ?>
     673                                                        </button>
     674                                                        <button class="button" value="center">
     675                                                                <?php esc_attr_e('Center'); ?>
     676                                                        </button>
     677                                                        <button class="button" value="right">
     678                                                                <?php esc_attr_e('Right'); ?>
     679                                                        </button>
     680                                                        <button class="button active" value="none">
     681                                                                <?php esc_attr_e('None'); ?>
     682                                                        </button>
     683                                                </div>
     684                                        </div>
     685
     686                                        <# if ( data.attachment ) { #>
     687                                                <div class="setting size">
     688                                                        <span><?php _e('Size'); ?></span>
     689                                                        <div class="button-group button-large" data-setting="size">
     690                                                        <?php
     691                                                                /** This filter is documented in wp-admin/includes/media.php */
     692                                                                $sizes = apply_filters( 'image_size_names_choose', array(
     693                                                                        'thumbnail' => __('Thumbnail'),
     694                                                                        'medium'    => __('Medium'),
     695                                                                        'large'     => __('Large'),
     696                                                                        'full'      => __('Full Size'),
     697                                                                ) );
     698
     699                                                                foreach ( $sizes as $value => $name ) : ?>
     700                                                                        <# var size = data.attachment.sizes['<?php echo esc_js( $value ); ?>'];
     701                                                                        if ( size ) { #>
     702                                                                                <button class="button" value="<?php echo esc_attr( $value ); ?>">
     703                                                                                        <?php echo esc_html( $name ); ?>
     704                                                                                        </button>
     705                                                                        <# } #>
     706                                                                <?php endforeach; ?>
     707                                                        </div>
     708                                                </div>
     709                                        <# } #>
     710
     711                                        <div class="setting link-to">
     712                                                <span><?php _e('Link To'); ?></span>
     713                                                <div class="button-group button-large" data-setting="link">
     714                                                <# if ( data.attachment ) { #>
     715                                                        <button class="button" value="file">
     716                                                                <?php esc_attr_e('Media File'); ?>
     717                                                        </button>
     718                                                        <button class="button" value="post">
     719                                                                <?php esc_attr_e('Attachment Page'); ?>
     720                                                        </button>
     721                                                <# } else { #>
     722                                                        <button class="button" value="file">
     723                                                                <?php esc_attr_e('Image URL'); ?>
     724                                                        </button>
     725                                                <# } #>
     726                                                        <button class="button" value="custom">
     727                                                                <?php esc_attr_e('Custom URL'); ?>
     728                                                        </button>
     729                                                        <button class="button active" value="none">
     730                                                                <?php esc_attr_e('None'); ?>
     731                                                        </button>
     732                                                </div>
     733                                                <input type="text" class="link-to-custom" data-setting="linkUrl" />
     734                                        </div>
     735
     736
     737                                        <div class="setting link-settings">
     738                                                <div class="setting link-target">
     739                                                        <label><input type="checkbox" data-setting="linkTargetBlank" value="_blank" <# if ( data.model.linkTargetBlank ) { #>checked="checked"<# } #>><?php _e( 'Open link in a new window/tab' ); ?></label>
     740                                                </div>
     741                                                <div class="advanced">
     742                                                        <a class="show-advanced" href="#"><?php _e('show advanced'); ?></a>
     743                                                        <div class="hidden">
     744                                                                <label class="setting link-rel">
     745                                                                        <span><?php _e('Link Rel'); ?></span>
     746                                                                        <input type="text" data-setting="linkRel" value="{{ data.model.linkClassName }}" />
     747                                                                </label>
     748                                                                <label class="setting link-class-name">
     749                                                                        <span><?php _e('CSS Class'); ?></span>
     750                                                                        <input type="text" data-setting="linkClassName" value="{{ data.model.linkClassName }}" />
     751                                                                </label>
     752                                                        </div>
     753                                                </div>
     754                                        </div>
     755
     756                                </div>
     757                                <div class="column-image">
     758                                        <div class="image">
     759                                                <img src="{{ data.model.url }}" draggable="false" />
     760                                        </div>
     761                                        <# if ( data.attachment && window.imageEdit ) { #>
     762                                                <div class="actions">
     763                                                        <input type="button" class="edit-attachment button" value="<?php esc_attr_e( 'Edit Original' ); ?>" />
     764                                                        <input type="button" class="replace-attachment button" value="<?php esc_attr_e( 'Replace' ); ?>" />
     765                                                </div>
     766                                        <# } #>
     767                                </div>
    736768                        </div>
    737769                </div>
Note: See TracChangeset for help on using the changeset viewer.