@wordpress/block-library 9.26.1-next.719a03cbe.0 → 9.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/cover/edit/block-controls.js +4 -2
  3. package/build/cover/edit/block-controls.js.map +1 -1
  4. package/build/cover/edit/index.js +6 -3
  5. package/build/cover/edit/index.js.map +1 -1
  6. package/build/cover/edit/inspector-controls.js +11 -4
  7. package/build/cover/edit/inspector-controls.js.map +1 -1
  8. package/build/cover/edit/poster-image.js +81 -0
  9. package/build/cover/edit/poster-image.js.map +1 -0
  10. package/build/cover/index.js +6 -0
  11. package/build/cover/index.js.map +1 -1
  12. package/build/cover/save.js +3 -1
  13. package/build/cover/save.js.map +1 -1
  14. package/build/media-text/edit.js +2 -2
  15. package/build/media-text/edit.js.map +1 -1
  16. package/build/navigation-link/edit.js +32 -15
  17. package/build/navigation-link/edit.js.map +1 -1
  18. package/build/navigation-link/update-attributes.js +112 -14
  19. package/build/navigation-link/update-attributes.js.map +1 -1
  20. package/build/navigation-submenu/edit.js +19 -2
  21. package/build/navigation-submenu/edit.js.map +1 -1
  22. package/build/post-content/edit.js +78 -16
  23. package/build/post-content/edit.js.map +1 -1
  24. package/build/post-content/index.js +6 -0
  25. package/build/post-content/index.js.map +1 -1
  26. package/build/separator/edit.js +5 -30
  27. package/build/separator/edit.js.map +1 -1
  28. package/build/site-tagline/index.js +1 -1
  29. package/build/video/edit.js +2 -5
  30. package/build/video/edit.js.map +1 -1
  31. package/build/video/poster-image.js +25 -25
  32. package/build/video/poster-image.js.map +1 -1
  33. package/build/video/tracks-editor.js +95 -104
  34. package/build/video/tracks-editor.js.map +1 -1
  35. package/build/video/tracks.js +6 -2
  36. package/build/video/tracks.js.map +1 -1
  37. package/build-module/cover/edit/block-controls.js +4 -2
  38. package/build-module/cover/edit/block-controls.js.map +1 -1
  39. package/build-module/cover/edit/index.js +6 -3
  40. package/build-module/cover/edit/index.js.map +1 -1
  41. package/build-module/cover/edit/inspector-controls.js +10 -4
  42. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  43. package/build-module/cover/edit/poster-image.js +74 -0
  44. package/build-module/cover/edit/poster-image.js.map +1 -0
  45. package/build-module/cover/index.js +6 -0
  46. package/build-module/cover/index.js.map +1 -1
  47. package/build-module/cover/save.js +3 -1
  48. package/build-module/cover/save.js.map +1 -1
  49. package/build-module/media-text/edit.js +2 -2
  50. package/build-module/media-text/edit.js.map +1 -1
  51. package/build-module/navigation-link/edit.js +32 -15
  52. package/build-module/navigation-link/edit.js.map +1 -1
  53. package/build-module/navigation-link/update-attributes.js +113 -15
  54. package/build-module/navigation-link/update-attributes.js.map +1 -1
  55. package/build-module/navigation-submenu/edit.js +20 -3
  56. package/build-module/navigation-submenu/edit.js.map +1 -1
  57. package/build-module/post-content/edit.js +80 -18
  58. package/build-module/post-content/edit.js.map +1 -1
  59. package/build-module/post-content/index.js +6 -0
  60. package/build-module/post-content/index.js.map +1 -1
  61. package/build-module/separator/edit.js +6 -31
  62. package/build-module/separator/edit.js.map +1 -1
  63. package/build-module/site-tagline/index.js +1 -1
  64. package/build-module/video/edit.js +2 -5
  65. package/build-module/video/edit.js.map +1 -1
  66. package/build-module/video/poster-image.js +26 -26
  67. package/build-module/video/poster-image.js.map +1 -1
  68. package/build-module/video/tracks-editor.js +96 -105
  69. package/build-module/video/tracks-editor.js.map +1 -1
  70. package/build-module/video/tracks.js +6 -2
  71. package/build-module/video/tracks.js.map +1 -1
  72. package/build-style/archives/editor-rtl.css +0 -4
  73. package/build-style/archives/editor.css +0 -4
  74. package/build-style/editor-rtl.css +0 -8
  75. package/build-style/editor.css +0 -8
  76. package/build-style/file/style-rtl.css +1 -1
  77. package/build-style/file/style.css +1 -1
  78. package/build-style/navigation/style-rtl.css +1 -0
  79. package/build-style/navigation/style.css +1 -0
  80. package/build-style/style-rtl.css +2 -1
  81. package/build-style/style.css +2 -1
  82. package/build-style/video/editor-rtl.css +0 -4
  83. package/build-style/video/editor.css +0 -4
  84. package/package.json +35 -35
  85. package/src/archives/editor.scss +0 -4
  86. package/src/comments-pagination/index.php +7 -2
  87. package/src/cover/block.json +6 -0
  88. package/src/cover/edit/block-controls.js +22 -17
  89. package/src/cover/edit/index.js +4 -1
  90. package/src/cover/edit/inspector-controls.js +11 -2
  91. package/src/cover/edit/poster-image.js +91 -0
  92. package/src/cover/save.js +2 -0
  93. package/src/file/style.scss +1 -1
  94. package/src/media-text/edit.js +1 -1
  95. package/src/navigation/style.scss +1 -0
  96. package/src/navigation-link/edit.js +28 -16
  97. package/src/navigation-link/test/edit.js +738 -6
  98. package/src/navigation-link/update-attributes.js +125 -12
  99. package/src/navigation-submenu/edit.js +21 -1
  100. package/src/post-content/block.json +6 -0
  101. package/src/post-content/edit.js +71 -19
  102. package/src/post-content/index.php +11 -4
  103. package/src/post-featured-image/index.php +3 -2
  104. package/src/separator/edit.js +8 -43
  105. package/src/site-tagline/block.json +1 -1
  106. package/src/video/edit.js +1 -4
  107. package/src/video/editor.scss +0 -6
  108. package/src/video/poster-image.js +29 -24
  109. package/src/video/tracks-editor.js +93 -103
  110. package/src/video/tracks.js +2 -1
@@ -24,9 +24,8 @@ import {
24
24
  MediaUploadCheck,
25
25
  store as blockEditorStore,
26
26
  } from '@wordpress/block-editor';
27
- import { store as noticesStore } from '@wordpress/notices';
28
27
  import { upload, media } from '@wordpress/icons';
29
- import { useSelect, useDispatch } from '@wordpress/data';
28
+ import { useSelect } from '@wordpress/data';
30
29
  import { useState, useRef, useEffect } from '@wordpress/element';
31
30
  import { getFilename } from '@wordpress/url';
32
31
 
@@ -49,11 +48,19 @@ const KIND_OPTIONS = [
49
48
  { label: __( 'Metadata' ), value: 'metadata' },
50
49
  ];
51
50
 
51
+ const DEFAULT_TRACK = {
52
+ src: '',
53
+ label: '',
54
+ srcLang: 'en',
55
+ kind: DEFAULT_KIND,
56
+ default: false,
57
+ };
58
+
52
59
  function TrackList( { tracks, onEditPress } ) {
53
60
  const content = tracks.map( ( track, index ) => {
54
61
  return (
55
62
  <HStack
56
- key={ track.src }
63
+ key={ track.id ?? track.src }
57
64
  className="block-library-video-tracks-editor__track-list-track"
58
65
  >
59
66
  <span>{ track.label }</span>
@@ -93,13 +100,12 @@ function SingleTrackEditor( {
93
100
  onRemove,
94
101
  allowSettingDefault,
95
102
  } ) {
96
- const {
97
- src = '',
98
- label = '',
99
- srcLang = '',
100
- kind = DEFAULT_KIND,
101
- default: isDefaultTrack = false,
102
- } = track;
103
+ const [ trackState, setTrackState ] = useState( {
104
+ ...DEFAULT_TRACK,
105
+ ...track,
106
+ } );
107
+
108
+ const { src, label, srcLang, kind, default: isDefaultTrack } = trackState;
103
109
  const fileName = src.startsWith( 'blob:' ) ? '' : getFilename( src ) || '';
104
110
  return (
105
111
  <VStack
@@ -117,10 +123,10 @@ function SingleTrackEditor( {
117
123
  __next40pxDefaultSize
118
124
  __nextHasNoMarginBottom
119
125
  onChange={ ( newLabel ) =>
120
- onChange( {
121
- ...track,
126
+ setTrackState( ( prevTrackState ) => ( {
127
+ ...prevTrackState,
122
128
  label: newLabel,
123
- } )
129
+ } ) )
124
130
  }
125
131
  label={ __( 'Label' ) }
126
132
  value={ label }
@@ -130,10 +136,10 @@ function SingleTrackEditor( {
130
136
  __next40pxDefaultSize
131
137
  __nextHasNoMarginBottom
132
138
  onChange={ ( newSrcLang ) =>
133
- onChange( {
134
- ...track,
139
+ setTrackState( ( prevTrackState ) => ( {
140
+ ...prevTrackState,
135
141
  srcLang: newSrcLang,
136
- } )
142
+ } ) )
137
143
  }
138
144
  label={ __( 'Source language' ) }
139
145
  value={ srcLang }
@@ -148,12 +154,12 @@ function SingleTrackEditor( {
148
154
  options={ KIND_OPTIONS }
149
155
  value={ kind }
150
156
  label={ __( 'Kind' ) }
151
- onChange={ ( newKind ) => {
152
- onChange( {
153
- ...track,
157
+ onChange={ ( newKind ) =>
158
+ setTrackState( ( prevTrackState ) => ( {
159
+ ...prevTrackState,
154
160
  kind: newKind,
155
- } );
156
- } }
161
+ } ) )
162
+ }
157
163
  />
158
164
  <ToggleControl
159
165
  __next40pxDefaultSize
@@ -161,12 +167,12 @@ function SingleTrackEditor( {
161
167
  label={ __( 'Set as default track' ) }
162
168
  checked={ isDefaultTrack }
163
169
  disabled={ ! allowSettingDefault }
164
- onChange={ ( defaultTrack ) => {
165
- onChange( {
166
- ...track,
170
+ onChange={ ( defaultTrack ) =>
171
+ setTrackState( ( prevTrackState ) => ( {
172
+ ...prevTrackState,
167
173
  default: defaultTrack,
168
- } );
169
- } }
174
+ } ) )
175
+ }
170
176
  />
171
177
  <HStack className="block-library-video-tracks-editor__single-track-editor-buttons-container">
172
178
  <Button
@@ -181,26 +187,7 @@ function SingleTrackEditor( {
181
187
  __next40pxDefaultSize
182
188
  variant="primary"
183
189
  onClick={ () => {
184
- const changes = {};
185
- let hasChanges = false;
186
- if ( label === '' ) {
187
- changes.label = __( 'English' );
188
- hasChanges = true;
189
- }
190
- if ( srcLang === '' ) {
191
- changes.srcLang = 'en';
192
- hasChanges = true;
193
- }
194
- if ( track.kind === undefined ) {
195
- changes.kind = DEFAULT_KIND;
196
- hasChanges = true;
197
- }
198
- if ( hasChanges ) {
199
- onChange( {
200
- ...track,
201
- ...changes,
202
- } );
203
- }
190
+ onChange( trackState );
204
191
  onClose();
205
192
  } }
206
193
  >
@@ -213,27 +200,60 @@ function SingleTrackEditor( {
213
200
  }
214
201
 
215
202
  export default function TracksEditor( { tracks = [], onChange } ) {
216
- const { createNotice } = useDispatch( noticesStore );
217
203
  const mediaUpload = useSelect( ( select ) => {
218
204
  return select( blockEditorStore ).getSettings().mediaUpload;
219
205
  }, [] );
220
206
  const [ trackBeingEdited, setTrackBeingEdited ] = useState( null );
221
207
  const dropdownPopoverRef = useRef();
222
208
 
223
- const handleTrackSelect = ( { title, url } ) => {
224
- if ( tracks.some( ( track ) => track.src === url ) ) {
225
- createNotice( 'error', __( 'This track already exists.' ), {
226
- isDismissible: true,
227
- type: 'snackbar',
228
- } );
209
+ const handleTrackSelect = ( selectedTracks = [], appendTracks = false ) => {
210
+ const existingTracksMap = new Map(
211
+ tracks.map( ( track ) => [ track.id, track ] )
212
+ );
213
+ const tracksToAdd = selectedTracks.map( ( { id, title, url } ) => {
214
+ // Reuse existing tracks to preserve user-configured metadata.
215
+ if ( existingTracksMap.has( id ) ) {
216
+ return existingTracksMap.get( id );
217
+ }
218
+
219
+ return {
220
+ ...DEFAULT_TRACK,
221
+ id,
222
+ label: title || '',
223
+ src: url,
224
+ };
225
+ } );
226
+
227
+ if ( tracksToAdd.length === 0 ) {
229
228
  return;
230
229
  }
231
230
 
232
- const trackIndex = tracks.length;
233
- onChange( [ ...tracks, { label: title || '', src: url } ] );
234
- setTrackBeingEdited( trackIndex );
231
+ onChange( [ ...( appendTracks ? tracks : [] ), ...tracksToAdd ] );
235
232
  };
236
233
 
234
+ function uploadFiles( event ) {
235
+ const files = event.target.files;
236
+ mediaUpload( {
237
+ allowedTypes: ALLOWED_TYPES,
238
+ filesList: files,
239
+ onFileChange: ( selectedTracks ) => {
240
+ if ( ! Array.isArray( selectedTracks ) ) {
241
+ return;
242
+ }
243
+
244
+ // Wait until the track has been uploaded.
245
+ const uploadedTracks = selectedTracks.filter(
246
+ ( track ) => !! track?.id
247
+ );
248
+
249
+ if ( ! uploadedTracks.length ) {
250
+ return;
251
+ }
252
+ handleTrackSelect( uploadedTracks, true );
253
+ },
254
+ } );
255
+ }
256
+
237
257
  useEffect( () => {
238
258
  dropdownPopoverRef.current?.focus();
239
259
  }, [ trackBeingEdited ] );
@@ -321,60 +341,30 @@ export default function TracksEditor( { tracks = [], onChange } ) {
321
341
  className="block-library-video-tracks-editor__add-tracks-container"
322
342
  label={ __( 'Add tracks' ) }
323
343
  >
324
- <MediaUpload
325
- onSelect={ handleTrackSelect }
326
- allowedTypes={ ALLOWED_TYPES }
327
- render={ ( { open } ) => (
328
- <MenuItem
329
- icon={ media }
330
- onClick={ open }
331
- >
332
- { __( 'Open Media Library' ) }
333
- </MenuItem>
334
- ) }
335
- />
336
344
  <MediaUploadCheck>
345
+ <MediaUpload
346
+ onSelect={ handleTrackSelect }
347
+ allowedTypes={ ALLOWED_TYPES }
348
+ value={ tracks.map( ( { id } ) => id ) }
349
+ multiple
350
+ render={ ( { open } ) => (
351
+ <MenuItem
352
+ icon={ media }
353
+ onClick={ open }
354
+ >
355
+ { __( 'Open Media Library' ) }
356
+ </MenuItem>
357
+ ) }
358
+ />
337
359
  <FormFileUpload
338
- onChange={ ( event ) => {
339
- const files = event.target.files;
340
- const trackIndex = tracks.length;
341
- mediaUpload( {
342
- allowedTypes: ALLOWED_TYPES,
343
- filesList: files,
344
- onFileChange: ( [
345
- { url },
346
- ] ) => {
347
- const newTracks = [
348
- ...tracks,
349
- ];
350
- if (
351
- ! newTracks[
352
- trackIndex
353
- ]
354
- ) {
355
- newTracks[
356
- trackIndex
357
- ] = {};
358
- }
359
- newTracks[ trackIndex ] = {
360
- ...tracks[ trackIndex ],
361
- src: url,
362
- };
363
- onChange( newTracks );
364
- setTrackBeingEdited(
365
- trackIndex
366
- );
367
- },
368
- } );
369
- } }
360
+ onChange={ uploadFiles }
370
361
  accept=".vtt,text/vtt"
362
+ multiple
371
363
  render={ ( { openFileDialog } ) => {
372
364
  return (
373
365
  <MenuItem
374
366
  icon={ upload }
375
- onClick={ () => {
376
- openFileDialog();
377
- } }
367
+ onClick={ openFileDialog }
378
368
  >
379
369
  { _x( 'Upload', 'verb' ) }
380
370
  </MenuItem>
@@ -1,5 +1,6 @@
1
1
  export default function Tracks( { tracks = [] } ) {
2
2
  return tracks.map( ( track ) => {
3
- return <track key={ track.src } { ...track } />;
3
+ const { id, ...trackAttrs } = track;
4
+ return <track key={ id ?? trackAttrs.src } { ...trackAttrs } />;
4
5
  } );
5
6
  }