WordPress.org

Make WordPress Core

Ticket #23560: 23560.13.diff

File 23560.13.diff, 6.6 KB (added by celloexpressions, 5 years ago)

Focus states for selected (but inactive) attachments, ability to remove items from the selection.

  • src/wp-includes/css/media-views.css

     
    723723                0 0 0 3px #ccc;
    724724}
    725725
     726.selected.attachment:focus {
     727        -webkit-box-shadow: 0 0 0 1px #fff,
     728         0 0 0 5px #1e8cbe;
     729        box-shadow: 0 0 0 1px #fff,
     730         0 0 0 5px #1e8cbe;
     731}
     732
    726733.attachment-preview {
    727734        position: relative;
    728735        width: 199px;
     
    913920}
    914921
    915922.attachment.details .check,
     923.attachment.selected .check:focus,
    916924.media-grid-view .attachment.selected .check {
    917925        background-color: #1e8cbe;
    918926        -webkit-box-shadow: 0 0 0 1px #fff,
     
    935943}
    936944
    937945.attachment.details .check:hover div,
     946.attachment.selected .check:focus div,
    938947.media-grid-view .attachment.selected .check:hover div {
    939948        background-position: -60px 0;
    940949}
     
    14781487        box-shadow: none;
    14791488}
    14801489
     1490.attachment.selection.selected:focus {
     1491        webkit-box-shadow: 0 0 0 1px #5b9dd9,
     1492         0 0 2px 2px #5b9dd9;
     1493        box-shadow: 0 0 0 1px #5b9dd9,
     1494         0 0 2px 2px #5b9dd9;
     1495        outline: none;
     1496}
     1497
    14811498.attachment.selection.details {
    14821499        -webkit-box-shadow:
    14831500                0 0 0 1px #fff,
  • src/wp-includes/js/media-views.js

     
    32213221                                };
    32223222                        }
    32233223
    3224                         $el.show().focus();
     3224                        $el.show().find( '.media-modal-close' ).focus();
    32253225                        return this.propagate('open');
    32263226                },
    32273227
     
    33023302                        if ( 27 === event.which && this.$el.is(':visible') ) {
    33033303                                this.escape();
    33043304                                event.stopImmediatePropagation();
    3305                         } else {
    3306                                 // Keep focus inside the media modal
    3307                                 this.focusManager;
    33083305                        }
    33093306                }
    33103307        });
     
    44044401                        } else {
    44054402                                this.click();
    44064403                        }
     4404                       
     4405                        // When selecting a tab along the left side,
     4406                        // focus should be transferred into the main panel
     4407                        $('.media-frame-content').find( ':focusable' ).first().focus();
    44074408                },
    44084409
    44094410                click: function() {
     
    47354736                 */
    47364737                toggleSelectionHandler: function( event ) {
    47374738                        var method;
     4739                       
     4740                        // Catch arrow events
     4741                        if ( 37 === event.keyCode || 38 === event.keyCode || 39 === event.keyCode || 40 === event.keyCode ) {
     4742                                this.arrowEvent(event);
     4743                                return;
     4744                        }
     4745                       
    47384746                        // Catch enter and space events
    47394747                        if ( 'keydown' === event.type && 13 !== event.keyCode && 32 !== event.keyCode ) {
    47404748                                return;
     
    47574765                        });
    47584766                },
    47594767                /**
     4768                 * @param {Object} event
     4769                 */
     4770                arrowEvent: function( event ) {
     4771                        var attachment = $('.attachments-browser .attachment'),
     4772                                attachmentsWidth = $('.attachments-browser .attachments').width(),
     4773                                thumbnailWidth = attachment.first().innerWidth() + 16,
     4774                                thumbnailsPerRow = Math.floor(attachmentsWidth/thumbnailWidth),
     4775                                totalThumnails = attachment.length,
     4776                                totalRows = Math.ceil(totalThumnails/thumbnailsPerRow),
     4777                                thisIndex = attachment.filter( ':focus' ).index(),
     4778                                thisIndexAdjusted = thisIndex + 1,
     4779                                thisRow = thisIndexAdjusted <= thumbnailsPerRow ? 1 : Math.ceil(thisIndexAdjusted/thumbnailsPerRow);
     4780                               
     4781                                // Left arrow
     4782                                if ( 37 === event.keyCode ) {
     4783                                        if ( 0 === thisIndex ) {
     4784                                                return;
     4785                                        }
     4786                                        attachment.eq( thisIndex - 1 ).focus();
     4787                                }
     4788                               
     4789                                // Up arrow
     4790                                if ( 38 === event.keyCode ) {
     4791                                        if ( 1 === thisRow ) {
     4792                                                return;
     4793                                        }
     4794                                        attachment.eq( thisIndex - thumbnailsPerRow ).focus();
     4795                                }
     4796                               
     4797                                // Right arrow
     4798                                if ( 39 === event.keyCode ) {
     4799                                        if ( totalThumnails === thisIndex ) {
     4800                                                return;
     4801                                        }
     4802                                        attachment.eq( thisIndex + 1 ).focus();
     4803                                }
     4804                               
     4805                                // Down arrow
     4806                                if ( 40 === event.keyCode ) {
     4807                                        if ( totalRows === thisRow ) {
     4808                                                return;
     4809                                        }
     4810                                        attachment.eq( thisIndex + thumbnailsPerRow ).focus();
     4811                                }
     4812                               
     4813                                return false;
     4814                },
     4815                /**
    47604816                 * @param {Object} options
    47614817                 */
    47624818                toggleSelection: function( options ) {
     
    47924848
    47934849                                selection.add( models );
    47944850                                selection.single( model );
     4851
     4852                                // When selecting attachments, focus should be transferred to the right details panel
     4853                                $('.attachment-details').find( ':focusable' ).first().focus();
     4854
    47954855                                return;
    47964856
    47974857                        // If the `method` is set to `toggle`, just flip the selection
     
    47994859                        } else if ( 'toggle' === method ) {
    48004860                                selection[ this.selected() ? 'remove' : 'add' ]( model );
    48014861                                selection.single( model );
     4862                               
     4863                                if ( this.selected() ) {
     4864                                        // When selecting an attachment, focus should be transferred to the right details panel
     4865                                        $('.attachment-details').find( ':focusable' ).first().focus();
     4866                                }
     4867
    48024868                                return;
    48034869                        }
    48044870
     
    48504916                                return;
    48514917                        }
    48524918
    4853                         this.$el.addClass('selected').attr('aria-checked', true);
     4919                        this.$el.addClass( 'selected' ).attr( 'aria-checked', true )
     4920                                        .find( '.check' ).attr( 'tabindex', '0' );
     4921
     4922                        // When selecting an attachment, focus should be transferred to the right details panel
     4923                        $('.attachment-details').find( ':focusable' ).first().focus();
    48544924                },
    48554925                /**
    48564926                 * @param {Backbone.Model} model
     
    48654935                        if ( ! selection || ( collection && collection !== selection ) ) {
    48664936                                return;
    48674937                        }
    4868                         this.$el.removeClass('selected').attr('aria-checked', false);
     4938                        this.$el.removeClass( 'selected' ).attr( 'aria-checked', false )
     4939                                        .find( '.check' ).attr( 'tabindex', '-1' );
    48694940                },
    48704941                /**
    48714942                 * @param {Backbone.Model} model
     
    50275098                        event.stopPropagation();
    50285099                        if ( selection.where( { id: this.model.get( 'id' ) } ).length ) {
    50295100                                selection.remove( this.model );
     5101                                // Move focus back to the attachment tile (from the check).
     5102                                this.$el.focus();
    50305103                        } else {
    50315104                                selection.add( this.model );
    50325105                        }
     
    62376310                        'click .delete-attachment':       'deleteAttachment',
    62386311                        'click .trash-attachment':        'trashAttachment',
    62396312                        'click .edit-attachment':         'editAttachment',
    6240                         'click .refresh-attachment':      'refreshAttachment'
     6313                        'click .refresh-attachment':      'refreshAttachment',
     6314                        'keydown':                        'toggleSelectionHandler'
    62416315                },
    62426316
    62436317                initialize: function() {
     
    63006374                        this.$el.removeClass('needs-refresh');
    63016375                        event.preventDefault();
    63026376                        this.model.fetch();
     6377                },
     6378                /**
     6379                 * @param {Object} event
     6380                 */
     6381                toggleSelectionHandler: function( event ) {
     6382                        // Reverse tabbing out of the right details panel
     6383                        // should take me back to the item in the list that was being edited.
     6384                        if ( 'keydown' === event.type && 9 === event.keyCode && event.shiftKey && event.target === $( ':tabbable', this.$el ).filter( ':first' )[0] ) {
     6385                                $('.attachments-browser .details').focus();
     6386                                return false;
     6387                        }
    63036388                }
    63046389
    63056390        });