diff --git a/packages/block-library/src/video/editor.scss b/packages/block-library/src/video/editor.scss
index dd50ecc6c066f..03e1c116cccb7 100644
--- a/packages/block-library/src/video/editor.scss
+++ b/packages/block-library/src/video/editor.scss
@@ -37,6 +37,7 @@
max-width: 240px;
}
+.block-library-video-tracks-editor__tracks-informative-message-title,
.block-library-video-tracks-editor__single-track-editor-edit-track-label {
margin-top: $grid-unit-05;
color: $gray-700;
@@ -56,3 +57,11 @@
padding: 0;
}
}
+
+.block-library-video-tracks-editor__tracks-informative-message {
+ padding: $grid-unit-10;
+
+ &-description {
+ margin-bottom: 0;
+ }
+}
diff --git a/packages/block-library/src/video/tracks-editor.js b/packages/block-library/src/video/tracks-editor.js
index e23d1c93378a6..33036a14f1fec 100644
--- a/packages/block-library/src/video/tracks-editor.js
+++ b/packages/block-library/src/video/tracks-editor.js
@@ -24,7 +24,7 @@ import {
} from '@wordpress/block-editor';
import { upload, media } from '@wordpress/icons';
import { useSelect } from '@wordpress/data';
-import { useState } from '@wordpress/element';
+import { useState, useRef, useEffect } from '@wordpress/element';
import { getFilename } from '@wordpress/url';
const ALLOWED_TYPES = [ 'text/vtt' ];
@@ -40,39 +40,29 @@ const KIND_OPTIONS = [
];
function TrackList( { tracks, onEditPress } ) {
- let content;
- if ( tracks.length === 0 ) {
- content = (
-
- { __(
- 'Tracks can be subtitles, captions, chapters, or descriptions. They help make your content more accessible to a wider range of users.'
- ) }
-
- );
- } else {
- content = tracks.map( ( track, index ) => {
- return (
- {
+ return (
+
+ { track.label }
+ onEditPress( index ) }
+ aria-label={ sprintf(
+ /* translators: %s: Label of the video text track e.g: "French subtitles". */
+ _x( 'Edit %s', 'text tracks' ),
+ track.label
+ ) }
>
- { track.label }
- onEditPress( index ) }
- aria-label={ sprintf(
- /* translators: %s: Label of the video text track e.g: "French subtitles" */
- _x( 'Edit %s', 'text tracks' ),
- track.label
- ) }
- >
- { __( 'Edit' ) }
-
-
- );
- } );
- }
+ { __( 'Edit' ) }
+
+
+ );
+ } );
+
return (
-
-
- { __( 'Edit track' ) }
-
-
- { __( 'File' ) }: { fileName }
-
-
-
- onChange( {
- ...track,
- label: newLabel,
- } )
- }
- label={ __( 'Label' ) }
- value={ label }
- help={ __( 'Title of track' ) }
- />
-
+
+ { __( 'Edit track' ) }
+
+
+ { __( 'File' ) }: { fileName }
+
+
+
+ onChange( {
+ ...track,
+ label: newLabel,
+ } )
+ }
+ label={ __( 'Label' ) }
+ value={ label }
+ help={ __( 'Title of track' ) }
+ />
+
+ onChange( {
+ ...track,
+ srcLang: newSrcLang,
+ } )
+ }
+ label={ __( 'Source language' ) }
+ value={ srcLang }
+ help={ __( 'Language tag (en, fr, etc.)' ) }
+ />
+
+
+ {
+ onChange( {
+ ...track,
+ kind: newKind,
+ } );
+ } }
+ />
+
+
- onChange( {
- ...track,
- srcLang: newSrcLang,
- } )
- }
- label={ __( 'Source language' ) }
- value={ srcLang }
- help={ __( 'Language tag (en, fr, etc.)' ) }
- />
-
-
-
+ { __( 'Remove track' ) }
+
+ {
- onChange( {
- ...track,
- kind: newKind,
- } );
+ variant="primary"
+ onClick={ () => {
+ const changes = {};
+ let hasChanges = false;
+ if ( label === '' ) {
+ changes.label = __( 'English' );
+ hasChanges = true;
+ }
+ if ( srcLang === '' ) {
+ changes.srcLang = 'en';
+ hasChanges = true;
+ }
+ if ( track.kind === undefined ) {
+ changes.kind = DEFAULT_KIND;
+ hasChanges = true;
+ }
+ if ( hasChanges ) {
+ onChange( {
+ ...track,
+ ...changes,
+ } );
+ }
+ onClose();
} }
- />
-
- {
- const changes = {};
- let hasChanges = false;
- if ( label === '' ) {
- changes.label = __( 'English' );
- hasChanges = true;
- }
- if ( srcLang === '' ) {
- changes.srcLang = 'en';
- hasChanges = true;
- }
- if ( track.kind === undefined ) {
- changes.kind = DEFAULT_KIND;
- hasChanges = true;
- }
- if ( hasChanges ) {
- onChange( {
- ...track,
- ...changes,
- } );
- }
- onClose();
- } }
- >
- { __( 'Close' ) }
-
-
- { __( 'Remove track' ) }
-
-
-
+ >
+ { __( 'Apply' ) }
+
+
-
+
);
}
@@ -194,6 +179,11 @@ export default function TracksEditor( { tracks = [], onChange } ) {
return select( blockEditorStore ).getSettings().mediaUpload;
}, [] );
const [ trackBeingEdited, setTrackBeingEdited ] = useState( null );
+ const dropdownPopoverRef = useRef();
+
+ useEffect( () => {
+ dropdownPopoverRef.current?.focus();
+ }, [ trackBeingEdited ] );
if ( ! mediaUpload ) {
return null;
@@ -201,17 +191,32 @@ export default function TracksEditor( { tracks = [], onChange } ) {
return (
(
-
-
- { __( 'Text tracks' ) }
-
-
- ) }
+ focusOnMount
+ popoverProps={ {
+ ref: dropdownPopoverRef,
+ } }
+ renderToggle={ ( { isOpen, onToggle } ) => {
+ const handleOnToggle = () => {
+ if ( ! isOpen ) {
+ // When the Popover opens make sure the initial view is
+ // always the track list rather than the edit track UI.
+ setTrackBeingEdited( null );
+ }
+ onToggle();
+ };
+
+ return (
+
+
+ { __( 'Text tracks' ) }
+
+
+ );
+ } }
renderContent={ () => {
if ( trackBeingEdited !== null ) {
return (
@@ -235,8 +240,21 @@ export default function TracksEditor( { tracks = [], onChange } ) {
/>
);
}
+
return (
<>
+ { tracks.length === 0 && (
+
+
+ { __( 'Text tracks' ) }
+
+
+ { __(
+ 'Tracks can be subtitles, captions, chapters, or descriptions. They help make your content more accessible to a wider range of users.'
+ ) }
+
+
+ ) }