@wordpress/block-library 10.1.1-next.v.202607070741.0 → 10.2.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.
- package/CHANGELOG.md +9 -0
- package/build/accordion/block.json +1 -0
- package/build/button/edit.cjs +18 -8
- package/build/button/edit.cjs.map +2 -2
- package/build/cover/block.json +11 -0
- package/build/cover/edit/block-controls.cjs +11 -4
- package/build/cover/edit/block-controls.cjs.map +2 -2
- package/build/cover/edit/embed-video-url-input.cjs +5 -3
- package/build/cover/edit/embed-video-url-input.cjs.map +3 -3
- package/build/cover/edit/index.cjs +1 -1
- package/build/cover/edit/index.cjs.map +2 -2
- package/build/cover/embed-video-utils.cjs +17 -7
- package/build/cover/embed-video-utils.cjs.map +2 -2
- package/build/details/transforms.cjs +1 -3
- package/build/details/transforms.cjs.map +2 -2
- package/build/embed/embed-placeholder.cjs +0 -1
- package/build/embed/embed-placeholder.cjs.map +2 -2
- package/build/file/edit.cjs +4 -3
- package/build/file/edit.cjs.map +2 -2
- package/build/file/transforms.cjs +25 -60
- package/build/file/transforms.cjs.map +2 -2
- package/build/gallery/block.json +4 -2
- package/build/gallery/edit.cjs +1 -1
- package/build/gallery/edit.cjs.map +3 -3
- package/build/gallery/gap-styles.cjs +49 -13
- package/build/gallery/gap-styles.cjs.map +3 -3
- package/build/group/transforms.cjs +1 -1
- package/build/group/transforms.cjs.map +2 -2
- package/build/icon/components/custom-inserter/icon-grid.cjs +25 -12
- package/build/icon/components/custom-inserter/icon-grid.cjs.map +2 -2
- package/build/icon/components/custom-inserter/index.cjs +100 -31
- package/build/icon/components/custom-inserter/index.cjs.map +3 -3
- package/build/icon/edit.cjs +11 -12
- package/build/icon/edit.cjs.map +2 -2
- package/build/image/block.json +1 -1
- package/build/image/edit.cjs +0 -34
- package/build/image/edit.cjs.map +2 -2
- package/build/image/image.cjs +4 -23
- package/build/image/image.cjs.map +3 -3
- package/build/image/transforms.cjs +78 -0
- package/build/image/transforms.cjs.map +3 -3
- package/build/index.cjs +18 -8
- package/build/index.cjs.map +2 -2
- package/build/latest-posts/edit.cjs +5 -8
- package/build/latest-posts/edit.cjs.map +2 -2
- package/build/list-item/edit.cjs +1 -1
- package/build/list-item/edit.cjs.map +2 -2
- package/build/list-item/hooks/use-enter.cjs +14 -17
- package/build/list-item/hooks/use-enter.cjs.map +3 -3
- package/build/list-item/hooks/use-space.cjs +3 -2
- package/build/list-item/hooks/use-space.cjs.map +3 -3
- package/build/paragraph/block.json +1 -0
- package/build/paragraph/use-enter.cjs +3 -7
- package/build/paragraph/use-enter.cjs.map +3 -3
- package/build/playlist/block.json +29 -10
- package/build/playlist/edit.cjs +216 -14
- package/build/playlist/edit.cjs.map +3 -3
- package/build/playlist/index.cjs +1 -1
- package/build/playlist/index.cjs.map +2 -2
- package/build/playlist/utils.cjs +19 -5
- package/build/playlist/utils.cjs.map +2 -2
- package/build/playlist/view.cjs +83 -13
- package/build/playlist/view.cjs.map +2 -2
- package/build/playlist-track/block.json +4 -2
- package/build/playlist-track/edit.cjs +94 -64
- package/build/playlist-track/edit.cjs.map +2 -2
- package/build/post-content/block.json +1 -0
- package/build/post-template/block.json +2 -1
- package/build/post-template/edit.cjs +10 -1
- package/build/post-template/edit.cjs.map +2 -2
- package/build/pullquote/block.json +3 -1
- package/build/query/block.json +3 -2
- package/build/query/edit/inspector-controls/index.cjs +38 -4
- package/build/query/edit/inspector-controls/index.cjs.map +2 -2
- package/build/query/edit/inspector-controls/offset-controls.cjs +0 -1
- package/build/query/edit/inspector-controls/offset-controls.cjs.map +2 -2
- package/build/query/edit/inspector-controls/pages-control.cjs +0 -1
- package/build/query/edit/inspector-controls/pages-control.cjs.map +2 -2
- package/build/query/edit/query-content.cjs +10 -3
- package/build/query/edit/query-content.cjs.map +2 -2
- package/build/query/index.cjs +2 -1
- package/build/query/index.cjs.map +2 -2
- package/build/quote/block.json +3 -1
- package/build/quote/transforms.cjs +1 -3
- package/build/quote/transforms.cjs.map +2 -2
- package/build/rss/edit.cjs +0 -1
- package/build/rss/edit.cjs.map +2 -2
- package/build/tab-list/block.json +2 -2
- package/build/tab-list/edit.cjs +65 -11
- package/build/tab-list/edit.cjs.map +3 -3
- package/build/tab-panel/block.json +1 -6
- package/build/tab-panel/edit.cjs +15 -15
- package/build/tab-panel/edit.cjs.map +2 -2
- package/build/tab-panels/block.json +0 -1
- package/build/tabs/block.json +0 -5
- package/build/tabs/edit.cjs +4 -39
- package/build/tabs/edit.cjs.map +3 -3
- package/build/tabs/use-tab-list-items-sync.cjs +19 -1
- package/build/tabs/use-tab-list-items-sync.cjs.map +2 -2
- package/build/term-name/block.json +1 -3
- package/build/term-name/deprecated.cjs +105 -0
- package/build/term-name/deprecated.cjs.map +7 -0
- package/build/term-name/edit.cjs +11 -37
- package/build/term-name/edit.cjs.map +3 -3
- package/build/term-name/index.cjs +3 -1
- package/build/term-name/index.cjs.map +3 -3
- package/build/utils/waveform-player.cjs +138 -22
- package/build/utils/waveform-player.cjs.map +2 -2
- package/build/utils/waveform-utils.cjs +315 -17
- package/build/utils/waveform-utils.cjs.map +2 -2
- package/build/video/edit.cjs +2 -11
- package/build/video/edit.cjs.map +3 -3
- package/build-module/accordion/block.json +1 -0
- package/build-module/button/edit.mjs +19 -14
- package/build-module/button/edit.mjs.map +2 -2
- package/build-module/cover/block.json +11 -0
- package/build-module/cover/edit/block-controls.mjs +11 -4
- package/build-module/cover/edit/block-controls.mjs.map +2 -2
- package/build-module/cover/edit/embed-video-url-input.mjs +5 -4
- package/build-module/cover/edit/embed-video-url-input.mjs.map +2 -2
- package/build-module/cover/edit/index.mjs +1 -1
- package/build-module/cover/edit/index.mjs.map +2 -2
- package/build-module/cover/embed-video-utils.mjs +16 -7
- package/build-module/cover/embed-video-utils.mjs.map +2 -2
- package/build-module/details/transforms.mjs +2 -7
- package/build-module/details/transforms.mjs.map +2 -2
- package/build-module/embed/embed-placeholder.mjs +0 -1
- package/build-module/embed/embed-placeholder.mjs.map +2 -2
- package/build-module/file/edit.mjs +4 -3
- package/build-module/file/edit.mjs.map +2 -2
- package/build-module/file/transforms.mjs +25 -60
- package/build-module/file/transforms.mjs.map +2 -2
- package/build-module/gallery/block.json +4 -2
- package/build-module/gallery/edit.mjs +3 -3
- package/build-module/gallery/edit.mjs.map +2 -2
- package/build-module/gallery/gap-styles.mjs +53 -14
- package/build-module/gallery/gap-styles.mjs.map +2 -2
- package/build-module/group/transforms.mjs +2 -5
- package/build-module/group/transforms.mjs.map +2 -2
- package/build-module/icon/components/custom-inserter/icon-grid.mjs +25 -12
- package/build-module/icon/components/custom-inserter/icon-grid.mjs.map +2 -2
- package/build-module/icon/components/custom-inserter/index.mjs +102 -33
- package/build-module/icon/components/custom-inserter/index.mjs.map +2 -2
- package/build-module/icon/edit.mjs +11 -12
- package/build-module/icon/edit.mjs.map +2 -2
- package/build-module/image/block.json +1 -1
- package/build-module/image/edit.mjs +0 -34
- package/build-module/image/edit.mjs.map +2 -2
- package/build-module/image/image.mjs +4 -13
- package/build-module/image/image.mjs.map +2 -2
- package/build-module/image/transforms.mjs +78 -0
- package/build-module/image/transforms.mjs.map +2 -2
- package/build-module/index.mjs +18 -8
- package/build-module/index.mjs.map +2 -2
- package/build-module/latest-posts/edit.mjs +5 -8
- package/build-module/latest-posts/edit.mjs.map +2 -2
- package/build-module/list-item/edit.mjs +1 -1
- package/build-module/list-item/edit.mjs.map +2 -2
- package/build-module/list-item/hooks/use-enter.mjs +15 -21
- package/build-module/list-item/hooks/use-enter.mjs.map +2 -2
- package/build-module/list-item/hooks/use-space.mjs +4 -6
- package/build-module/list-item/hooks/use-space.mjs.map +2 -2
- package/build-module/paragraph/block.json +1 -0
- package/build-module/paragraph/use-enter.mjs +4 -11
- package/build-module/paragraph/use-enter.mjs.map +2 -2
- package/build-module/playlist/block.json +29 -10
- package/build-module/playlist/edit.mjs +220 -16
- package/build-module/playlist/edit.mjs.map +2 -2
- package/build-module/playlist/index.mjs +1 -1
- package/build-module/playlist/index.mjs.map +2 -2
- package/build-module/playlist/utils.mjs +17 -4
- package/build-module/playlist/utils.mjs.map +2 -2
- package/build-module/playlist/view.mjs +89 -14
- package/build-module/playlist/view.mjs.map +2 -2
- package/build-module/playlist-track/block.json +4 -2
- package/build-module/playlist-track/edit.mjs +96 -65
- package/build-module/playlist-track/edit.mjs.map +2 -2
- package/build-module/post-content/block.json +1 -0
- package/build-module/post-template/block.json +2 -1
- package/build-module/post-template/edit.mjs +10 -1
- package/build-module/post-template/edit.mjs.map +2 -2
- package/build-module/pullquote/block.json +3 -1
- package/build-module/query/block.json +3 -2
- package/build-module/query/edit/inspector-controls/index.mjs +40 -5
- package/build-module/query/edit/inspector-controls/index.mjs.map +2 -2
- package/build-module/query/edit/inspector-controls/offset-controls.mjs +0 -1
- package/build-module/query/edit/inspector-controls/offset-controls.mjs.map +2 -2
- package/build-module/query/edit/inspector-controls/pages-control.mjs +0 -1
- package/build-module/query/edit/inspector-controls/pages-control.mjs.map +2 -2
- package/build-module/query/edit/query-content.mjs +10 -3
- package/build-module/query/edit/query-content.mjs.map +2 -2
- package/build-module/query/index.mjs +2 -1
- package/build-module/query/index.mjs.map +2 -2
- package/build-module/quote/block.json +3 -1
- package/build-module/quote/transforms.mjs +2 -4
- package/build-module/quote/transforms.mjs.map +2 -2
- package/build-module/rss/edit.mjs +0 -1
- package/build-module/rss/edit.mjs.map +2 -2
- package/build-module/tab-list/block.json +2 -2
- package/build-module/tab-list/edit.mjs +72 -13
- package/build-module/tab-list/edit.mjs.map +2 -2
- package/build-module/tab-panel/block.json +1 -6
- package/build-module/tab-panel/edit.mjs +16 -16
- package/build-module/tab-panel/edit.mjs.map +2 -2
- package/build-module/tab-panels/block.json +0 -1
- package/build-module/tabs/block.json +0 -5
- package/build-module/tabs/edit.mjs +5 -45
- package/build-module/tabs/edit.mjs.map +2 -2
- package/build-module/tabs/use-tab-list-items-sync.mjs +19 -1
- package/build-module/tabs/use-tab-list-items-sync.mjs.map +2 -2
- package/build-module/term-name/block.json +1 -3
- package/build-module/term-name/deprecated.mjs +74 -0
- package/build-module/term-name/deprecated.mjs.map +7 -0
- package/build-module/term-name/edit.mjs +11 -28
- package/build-module/term-name/edit.mjs.map +2 -2
- package/build-module/term-name/index.mjs +3 -1
- package/build-module/term-name/index.mjs.map +2 -2
- package/build-module/utils/waveform-player.mjs +144 -23
- package/build-module/utils/waveform-player.mjs.map +2 -2
- package/build-module/utils/waveform-utils.mjs +310 -16
- package/build-module/utils/waveform-utils.mjs.map +2 -2
- package/build-module/video/edit.mjs +2 -11
- package/build-module/video/edit.mjs.map +2 -2
- package/build-style/editor-rtl.css +46 -21
- package/build-style/editor.css +46 -21
- package/build-style/icon/editor-rtl.css +80 -7
- package/build-style/icon/editor.css +80 -7
- package/build-style/more/editor-rtl.css +2 -2
- package/build-style/more/editor.css +2 -2
- package/build-style/navigation/editor-rtl.css +3 -4
- package/build-style/navigation/editor.css +3 -4
- package/build-style/navigation-link/editor-rtl.css +1 -1
- package/build-style/navigation-link/editor.css +1 -1
- package/build-style/nextpage/editor-rtl.css +2 -2
- package/build-style/nextpage/editor.css +2 -2
- package/build-style/playlist/editor-rtl.css +6 -0
- package/build-style/playlist/editor.css +6 -0
- package/build-style/playlist/style-rtl.css +37 -1
- package/build-style/playlist/style.css +37 -1
- package/build-style/playlist-track/style-rtl.css +10 -0
- package/build-style/playlist-track/style.css +10 -0
- package/build-style/style-rtl.css +47 -1
- package/build-style/style.css +47 -1
- package/build-style/video/editor-rtl.css +1 -1
- package/build-style/video/editor.css +1 -1
- package/build-types/table-of-contents/list.d.ts +1 -1
- package/build-types/table-of-contents/list.d.ts.map +1 -1
- package/package.json +46 -44
- package/src/accordion/README.md +1 -0
- package/src/accordion/block.json +1 -0
- package/src/button/edit.js +21 -15
- package/src/cover/README.md +60 -0
- package/src/cover/block.json +11 -0
- package/src/cover/edit/block-controls.js +21 -11
- package/src/cover/edit/embed-video-url-input.js +5 -4
- package/src/cover/edit/index.js +9 -11
- package/src/cover/embed-video-utils.js +38 -13
- package/src/details/transforms.js +2 -7
- package/src/embed/embed-placeholder.js +0 -1
- package/src/file/edit.js +8 -8
- package/src/file/transforms.js +28 -60
- package/src/gallery/README.md +1 -1
- package/src/gallery/block.json +4 -2
- package/src/gallery/edit.js +3 -3
- package/src/gallery/gap-styles.js +79 -20
- package/src/gallery/index.php +103 -43
- package/src/group/transforms.js +2 -5
- package/src/icon/components/custom-inserter/icon-grid.js +40 -11
- package/src/icon/components/custom-inserter/index.js +98 -25
- package/src/icon/edit.js +11 -17
- package/src/icon/editor.scss +33 -8
- package/src/image/README.md +1 -1
- package/src/image/block.json +1 -1
- package/src/image/edit.js +0 -52
- package/src/image/editor.scss +2 -0
- package/src/image/image.js +19 -24
- package/src/image/transforms.js +128 -0
- package/src/index.js +19 -7
- package/src/latest-posts/edit.js +5 -8
- package/src/latest-posts/index.php +46 -16
- package/src/list-item/edit.js +1 -1
- package/src/list-item/hooks/use-enter.js +15 -22
- package/src/list-item/hooks/use-space.js +4 -6
- package/src/media-text/editor.scss +1 -0
- package/src/more/editor.scss +1 -1
- package/src/navigation/editor.scss +1 -2
- package/src/navigation-link/editor.scss +1 -1
- package/src/navigation-link/index.php +6 -3
- package/src/navigation-submenu/index.php +6 -3
- package/src/nextpage/editor.scss +1 -1
- package/src/paragraph/README.md +1 -0
- package/src/paragraph/block.json +1 -0
- package/src/paragraph/use-enter.js +4 -11
- package/src/playlist/README.md +17 -18
- package/src/playlist/block.json +29 -10
- package/src/playlist/edit.js +247 -15
- package/src/playlist/editor.scss +6 -0
- package/src/playlist/index.js +1 -1
- package/src/playlist/index.php +58 -14
- package/src/playlist/style.scss +51 -1
- package/src/playlist/test/edit.js +13 -2
- package/src/playlist/utils.js +25 -7
- package/src/playlist/view.js +97 -16
- package/src/playlist-track/README.md +3 -3
- package/src/playlist-track/block.json +4 -2
- package/src/playlist-track/edit.js +94 -70
- package/src/playlist-track/index.php +20 -6
- package/src/playlist-track/style.scss +10 -0
- package/src/playlist-track/test/edit.js +169 -0
- package/src/post-content/README.md +1 -0
- package/src/post-content/block.json +1 -0
- package/src/post-template/README.md +1 -0
- package/src/post-template/block.json +2 -1
- package/src/post-template/edit.js +9 -0
- package/src/pullquote/README.md +1 -0
- package/src/pullquote/block.json +3 -1
- package/src/query/README.md +2 -1
- package/src/query/block.json +3 -2
- package/src/query/edit/inspector-controls/index.js +43 -3
- package/src/query/edit/inspector-controls/offset-controls.js +0 -1
- package/src/query/edit/inspector-controls/pages-control.js +0 -1
- package/src/query/edit/query-content.js +19 -3
- package/src/query/index.js +1 -0
- package/src/quote/README.md +1 -0
- package/src/quote/block.json +3 -1
- package/src/quote/transforms.js +2 -4
- package/src/rss/edit.js +0 -1
- package/src/rss/index.php +1 -1
- package/src/tab-list/README.md +4 -5
- package/src/tab-list/block.json +2 -2
- package/src/tab-list/edit.js +90 -28
- package/src/tab-list/index.php +9 -4
- package/src/tab-panel/README.md +4 -6
- package/src/tab-panel/block.json +1 -6
- package/src/tab-panel/edit.js +19 -24
- package/src/tab-panels/README.md +5 -3
- package/src/tab-panels/block.json +0 -1
- package/src/tabs/README.md +18 -9
- package/src/tabs/block.json +0 -5
- package/src/tabs/edit.js +7 -64
- package/src/tabs/use-tab-list-items-sync.js +24 -4
- package/src/template-part/index.php +1 -16
- package/src/term-name/README.md +1 -1
- package/src/term-name/block.json +1 -3
- package/src/term-name/deprecated.js +74 -0
- package/src/term-name/edit.js +2 -18
- package/src/term-name/index.js +2 -0
- package/src/utils/media-control.scss +1 -5
- package/src/utils/test/waveform-player.js +297 -34
- package/src/utils/test/waveform-utils.js +410 -5
- package/src/utils/waveform-player.js +189 -59
- package/src/utils/waveform-utils.js +443 -40
- package/src/video/edit.js +0 -8
- package/src/video/editor.scss +1 -1
- package/build/image/animated-gif-convert-control.cjs +0 -105
- package/build/image/animated-gif-convert-control.cjs.map +0 -7
- package/build/utils/gif-conversion-attributes.cjs +0 -40
- package/build/utils/gif-conversion-attributes.cjs.map +0 -7
- package/build/video/gif-restore-control.cjs +0 -73
- package/build/video/gif-restore-control.cjs.map +0 -7
- package/build-module/image/animated-gif-convert-control.mjs +0 -87
- package/build-module/image/animated-gif-convert-control.mjs.map +0 -7
- package/build-module/utils/gif-conversion-attributes.mjs +0 -15
- package/build-module/utils/gif-conversion-attributes.mjs.map +0 -7
- package/build-module/video/gif-restore-control.mjs +0 -55
- package/build-module/video/gif-restore-control.mjs.map +0 -7
- package/src/image/animated-gif-convert-control.js +0 -135
- package/src/image/test/animated-gif-convert-control.js +0 -276
- package/src/utils/gif-conversion-attributes.js +0 -30
- package/src/utils/test/gif-conversion-attributes.js +0 -60
- package/src/video/gif-restore-control.js +0 -92
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* External dependencies
|
|
3
|
-
*/
|
|
4
|
-
import { render, screen } from '@testing-library/react';
|
|
5
|
-
import userEvent from '@testing-library/user-event';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* WordPress dependencies
|
|
9
|
-
*/
|
|
10
|
-
import { useSelect, useDispatch } from '@wordpress/data';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Internal dependencies
|
|
14
|
-
*/
|
|
15
|
-
import AnimatedGifConvertControl from '../animated-gif-convert-control';
|
|
16
|
-
|
|
17
|
-
jest.mock( '@wordpress/block-editor', () => ( {
|
|
18
|
-
store: 'core/block-editor',
|
|
19
|
-
BlockControls: ( { children } ) => <div>{ children }</div>,
|
|
20
|
-
} ) );
|
|
21
|
-
|
|
22
|
-
jest.mock( '@wordpress/core-data', () => ( {
|
|
23
|
-
store: 'core',
|
|
24
|
-
} ) );
|
|
25
|
-
|
|
26
|
-
jest.mock( '@wordpress/data', () => ( {
|
|
27
|
-
useSelect: jest.fn(),
|
|
28
|
-
useDispatch: jest.fn(),
|
|
29
|
-
/*
|
|
30
|
-
* Passthroughs needed because @wordpress/components transitively pulls in
|
|
31
|
-
* the rich-text store, which registers via these helpers at import time.
|
|
32
|
-
*/
|
|
33
|
-
combineReducers: jest.fn( ( reducers ) => ( state = {}, action ) => {
|
|
34
|
-
const newState = {};
|
|
35
|
-
Object.keys( reducers ).forEach( ( key ) => {
|
|
36
|
-
newState[ key ] = reducers[ key ]( state[ key ], action );
|
|
37
|
-
} );
|
|
38
|
-
return newState;
|
|
39
|
-
} ),
|
|
40
|
-
createSelector: jest.fn( ( fn ) => fn ),
|
|
41
|
-
createRegistrySelector: jest.fn( ( fn ) => fn ),
|
|
42
|
-
createReduxStore: jest.fn( () => ( {} ) ),
|
|
43
|
-
register: jest.fn(),
|
|
44
|
-
} ) );
|
|
45
|
-
|
|
46
|
-
/*
|
|
47
|
-
* core/video is not registered in this unit test, so stub createBlock with a
|
|
48
|
-
* lightweight factory that preserves the name and attributes for assertion.
|
|
49
|
-
*/
|
|
50
|
-
jest.mock( '@wordpress/blocks', () => ( {
|
|
51
|
-
createBlock: jest.fn( ( name, attributes ) => ( {
|
|
52
|
-
name,
|
|
53
|
-
attributes,
|
|
54
|
-
clientId: 'new-video-block',
|
|
55
|
-
} ) ),
|
|
56
|
-
} ) );
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Builds a `select` function that returns the given store mocks and records
|
|
60
|
-
* whether the attachment record was requested.
|
|
61
|
-
*
|
|
62
|
-
* @param {Object} options Options.
|
|
63
|
-
* @param {string} [options.rootBlockName] Block name of the block's root (e.g. 'core/gallery').
|
|
64
|
-
* @param {Function} options.getEntityRecord Spy used for getEntityRecord.
|
|
65
|
-
* @return {Function} A select() implementation.
|
|
66
|
-
*/
|
|
67
|
-
function makeSelect( { rootBlockName = undefined, getEntityRecord } ) {
|
|
68
|
-
return ( storeName ) => {
|
|
69
|
-
if ( storeName === 'core/block-editor' ) {
|
|
70
|
-
return {
|
|
71
|
-
getBlockRootClientId: () =>
|
|
72
|
-
rootBlockName ? 'root-client-id' : undefined,
|
|
73
|
-
getBlockName: () => rootBlockName,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
// core-data store.
|
|
77
|
-
return {
|
|
78
|
-
getEntityRecord: ( ...args ) => getEntityRecord( ...args ),
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
describe( 'AnimatedGifConvertControl', () => {
|
|
84
|
-
let replaceBlocks;
|
|
85
|
-
let getEntityRecord;
|
|
86
|
-
|
|
87
|
-
const companionRecord = {
|
|
88
|
-
source_url: 'https://example.com/wp-content/uploads/cat.gif',
|
|
89
|
-
media_details: {
|
|
90
|
-
animated_video: 'cat.mp4',
|
|
91
|
-
animated_video_poster: 'cat.jpg',
|
|
92
|
-
width: 320,
|
|
93
|
-
height: 240,
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
beforeEach( () => {
|
|
98
|
-
jest.clearAllMocks();
|
|
99
|
-
replaceBlocks = jest.fn();
|
|
100
|
-
getEntityRecord = jest.fn( () => companionRecord );
|
|
101
|
-
useDispatch.mockReturnValue( { replaceBlocks } );
|
|
102
|
-
} );
|
|
103
|
-
|
|
104
|
-
/*
|
|
105
|
-
* Renders the control, running the real selector against a controlled
|
|
106
|
-
* `select` so the gating logic (and any attachment fetch) is exercised.
|
|
107
|
-
*/
|
|
108
|
-
function renderControl( { attributes, select } ) {
|
|
109
|
-
useSelect.mockImplementation( ( mapSelect ) => mapSelect( select ) );
|
|
110
|
-
return render(
|
|
111
|
-
<AnimatedGifConvertControl
|
|
112
|
-
attributes={ attributes }
|
|
113
|
-
clientId="block-1"
|
|
114
|
-
/>
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
it( 'renders the "Display as video" button when a video companion exists', () => {
|
|
119
|
-
renderControl( {
|
|
120
|
-
attributes: {
|
|
121
|
-
id: 7,
|
|
122
|
-
url: 'https://example.com/wp-content/uploads/cat.gif',
|
|
123
|
-
},
|
|
124
|
-
select: makeSelect( { getEntityRecord } ),
|
|
125
|
-
} );
|
|
126
|
-
|
|
127
|
-
expect(
|
|
128
|
-
screen.getByRole( 'button', { name: 'Display as video' } )
|
|
129
|
-
).toBeVisible();
|
|
130
|
-
expect( getEntityRecord ).toHaveBeenCalledWith(
|
|
131
|
-
'postType',
|
|
132
|
-
'attachment',
|
|
133
|
-
7,
|
|
134
|
-
{ context: 'view' }
|
|
135
|
-
);
|
|
136
|
-
} );
|
|
137
|
-
|
|
138
|
-
it( 'still recognizes a GIF URL that carries a query string', () => {
|
|
139
|
-
renderControl( {
|
|
140
|
-
attributes: {
|
|
141
|
-
id: 7,
|
|
142
|
-
url: 'https://example.com/wp-content/uploads/cat.gif?ver=2',
|
|
143
|
-
},
|
|
144
|
-
select: makeSelect( { getEntityRecord } ),
|
|
145
|
-
} );
|
|
146
|
-
|
|
147
|
-
expect( getEntityRecord ).toHaveBeenCalledWith(
|
|
148
|
-
'postType',
|
|
149
|
-
'attachment',
|
|
150
|
-
7,
|
|
151
|
-
{ context: 'view' }
|
|
152
|
-
);
|
|
153
|
-
expect(
|
|
154
|
-
screen.getByRole( 'button', { name: 'Display as video' } )
|
|
155
|
-
).toBeVisible();
|
|
156
|
-
} );
|
|
157
|
-
|
|
158
|
-
it( 'does not fetch the attachment for a non-GIF image', () => {
|
|
159
|
-
const { container } = renderControl( {
|
|
160
|
-
attributes: {
|
|
161
|
-
id: 7,
|
|
162
|
-
url: 'https://example.com/wp-content/uploads/cat.jpg',
|
|
163
|
-
},
|
|
164
|
-
select: makeSelect( { getEntityRecord } ),
|
|
165
|
-
} );
|
|
166
|
-
|
|
167
|
-
expect( getEntityRecord ).not.toHaveBeenCalled();
|
|
168
|
-
expect( container ).toBeEmptyDOMElement();
|
|
169
|
-
} );
|
|
170
|
-
|
|
171
|
-
it( 'does not fetch the attachment when the block has no id', () => {
|
|
172
|
-
const { container } = renderControl( {
|
|
173
|
-
attributes: {
|
|
174
|
-
url: 'https://example.com/wp-content/uploads/cat.gif',
|
|
175
|
-
},
|
|
176
|
-
select: makeSelect( { getEntityRecord } ),
|
|
177
|
-
} );
|
|
178
|
-
|
|
179
|
-
expect( getEntityRecord ).not.toHaveBeenCalled();
|
|
180
|
-
expect( container ).toBeEmptyDOMElement();
|
|
181
|
-
} );
|
|
182
|
-
|
|
183
|
-
it( 'hides the control inside a gallery without fetching', () => {
|
|
184
|
-
const { container } = renderControl( {
|
|
185
|
-
attributes: {
|
|
186
|
-
id: 7,
|
|
187
|
-
url: 'https://example.com/wp-content/uploads/cat.gif',
|
|
188
|
-
},
|
|
189
|
-
select: makeSelect( {
|
|
190
|
-
rootBlockName: 'core/gallery',
|
|
191
|
-
getEntityRecord,
|
|
192
|
-
} ),
|
|
193
|
-
} );
|
|
194
|
-
|
|
195
|
-
expect( getEntityRecord ).not.toHaveBeenCalled();
|
|
196
|
-
expect( container ).toBeEmptyDOMElement();
|
|
197
|
-
} );
|
|
198
|
-
|
|
199
|
-
it( 'renders nothing when the attachment has no animated_video companion', () => {
|
|
200
|
-
const { container } = renderControl( {
|
|
201
|
-
attributes: {
|
|
202
|
-
id: 7,
|
|
203
|
-
url: 'https://example.com/wp-content/uploads/cat.gif',
|
|
204
|
-
},
|
|
205
|
-
select: makeSelect( {
|
|
206
|
-
getEntityRecord: jest.fn( () => ( {
|
|
207
|
-
source_url: 'https://example.com/x/cat.gif',
|
|
208
|
-
media_details: {},
|
|
209
|
-
} ) ),
|
|
210
|
-
} ),
|
|
211
|
-
} );
|
|
212
|
-
|
|
213
|
-
expect( container ).toBeEmptyDOMElement();
|
|
214
|
-
} );
|
|
215
|
-
|
|
216
|
-
it( 'replaces the image with a GIF-style video block built from the companion', async () => {
|
|
217
|
-
const user = userEvent.setup();
|
|
218
|
-
renderControl( {
|
|
219
|
-
attributes: {
|
|
220
|
-
id: 7,
|
|
221
|
-
url: 'https://example.com/wp-content/uploads/cat.gif',
|
|
222
|
-
caption: 'A cat',
|
|
223
|
-
},
|
|
224
|
-
select: makeSelect( { getEntityRecord } ),
|
|
225
|
-
} );
|
|
226
|
-
|
|
227
|
-
await user.click(
|
|
228
|
-
screen.getByRole( 'button', { name: 'Display as video' } )
|
|
229
|
-
);
|
|
230
|
-
|
|
231
|
-
expect( replaceBlocks ).toHaveBeenCalledTimes( 1 );
|
|
232
|
-
const [ replacedClientId, newBlock ] = replaceBlocks.mock.calls[ 0 ];
|
|
233
|
-
expect( replacedClientId ).toBe( 'block-1' );
|
|
234
|
-
expect( newBlock.name ).toBe( 'core/video' );
|
|
235
|
-
expect( newBlock.attributes ).toMatchObject( {
|
|
236
|
-
id: 7,
|
|
237
|
-
src: 'https://example.com/wp-content/uploads/cat.mp4',
|
|
238
|
-
poster: 'https://example.com/wp-content/uploads/cat.jpg',
|
|
239
|
-
caption: 'A cat',
|
|
240
|
-
controls: false,
|
|
241
|
-
loop: true,
|
|
242
|
-
autoplay: true,
|
|
243
|
-
muted: true,
|
|
244
|
-
playsInline: true,
|
|
245
|
-
width: 320,
|
|
246
|
-
height: 240,
|
|
247
|
-
} );
|
|
248
|
-
} );
|
|
249
|
-
|
|
250
|
-
it( 'carries align, anchor, className and margin onto the video block', async () => {
|
|
251
|
-
const user = userEvent.setup();
|
|
252
|
-
renderControl( {
|
|
253
|
-
attributes: {
|
|
254
|
-
id: 7,
|
|
255
|
-
url: 'https://example.com/wp-content/uploads/cat.gif',
|
|
256
|
-
align: 'wide',
|
|
257
|
-
anchor: 'cat-gif',
|
|
258
|
-
className: 'is-style-rounded',
|
|
259
|
-
style: { spacing: { margin: { top: '20px' } } },
|
|
260
|
-
},
|
|
261
|
-
select: makeSelect( { getEntityRecord } ),
|
|
262
|
-
} );
|
|
263
|
-
|
|
264
|
-
await user.click(
|
|
265
|
-
screen.getByRole( 'button', { name: 'Display as video' } )
|
|
266
|
-
);
|
|
267
|
-
|
|
268
|
-
const [ , newBlock ] = replaceBlocks.mock.calls[ 0 ];
|
|
269
|
-
expect( newBlock.attributes ).toMatchObject( {
|
|
270
|
-
align: 'wide',
|
|
271
|
-
anchor: 'cat-gif',
|
|
272
|
-
className: 'is-style-rounded',
|
|
273
|
-
style: { spacing: { margin: { top: '20px' } } },
|
|
274
|
-
} );
|
|
275
|
-
} );
|
|
276
|
-
} );
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns the subset of block attributes that should be carried over when
|
|
3
|
-
* converting between the animated-GIF Image block and its converted Video
|
|
4
|
-
* block (in either direction).
|
|
5
|
-
*
|
|
6
|
-
* The conversion swaps one block for another via `createBlock`, which would
|
|
7
|
-
* otherwise drop everything the author set on the original block. This carries
|
|
8
|
-
* the attributes both blocks support, so the conversion (and its reverse) keeps
|
|
9
|
-
* them: block alignment, the HTML anchor, custom class names, and margin
|
|
10
|
-
* spacing.
|
|
11
|
-
*
|
|
12
|
-
* Image-only attributes such as links (`href`/`linkDestination`), sizing
|
|
13
|
-
* (`sizeSlug`/`scale`), and `border`/`shadow` styles are intentionally not
|
|
14
|
-
* carried: the Video block has no equivalent, so copying them would leave
|
|
15
|
-
* attributes the target block cannot represent.
|
|
16
|
-
*
|
|
17
|
-
* @param {Object} attributes Source block attributes.
|
|
18
|
-
* @return {Object} Attributes to spread into the converted block.
|
|
19
|
-
*/
|
|
20
|
-
export function getCarriedGifConversionAttributes( attributes ) {
|
|
21
|
-
const { align, anchor, className, style } = attributes;
|
|
22
|
-
const margin = style?.spacing?.margin;
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
...( align && { align } ),
|
|
26
|
-
...( anchor && { anchor } ),
|
|
27
|
-
...( className && { className } ),
|
|
28
|
-
...( margin && { style: { spacing: { margin } } } ),
|
|
29
|
-
};
|
|
30
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Internal dependencies
|
|
3
|
-
*/
|
|
4
|
-
import { getCarriedGifConversionAttributes } from '../gif-conversion-attributes';
|
|
5
|
-
|
|
6
|
-
describe( 'getCarriedGifConversionAttributes', () => {
|
|
7
|
-
it( 'carries align, anchor, className and margin spacing', () => {
|
|
8
|
-
const result = getCarriedGifConversionAttributes( {
|
|
9
|
-
align: 'wide',
|
|
10
|
-
anchor: 'my-gif',
|
|
11
|
-
className: 'is-style-rounded',
|
|
12
|
-
style: { spacing: { margin: { top: '10px', bottom: '10px' } } },
|
|
13
|
-
} );
|
|
14
|
-
|
|
15
|
-
expect( result ).toEqual( {
|
|
16
|
-
align: 'wide',
|
|
17
|
-
anchor: 'my-gif',
|
|
18
|
-
className: 'is-style-rounded',
|
|
19
|
-
style: { spacing: { margin: { top: '10px', bottom: '10px' } } },
|
|
20
|
-
} );
|
|
21
|
-
} );
|
|
22
|
-
|
|
23
|
-
it( 'omits attributes that are not set', () => {
|
|
24
|
-
expect( getCarriedGifConversionAttributes( {} ) ).toEqual( {} );
|
|
25
|
-
expect(
|
|
26
|
-
getCarriedGifConversionAttributes( { align: 'full' } )
|
|
27
|
-
).toEqual( { align: 'full' } );
|
|
28
|
-
} );
|
|
29
|
-
|
|
30
|
-
it( 'carries only margin from style, dropping unsupported styles', () => {
|
|
31
|
-
const result = getCarriedGifConversionAttributes( {
|
|
32
|
-
style: {
|
|
33
|
-
spacing: {
|
|
34
|
-
margin: { top: '5px' },
|
|
35
|
-
padding: { top: '5px' },
|
|
36
|
-
},
|
|
37
|
-
border: { radius: '8px' },
|
|
38
|
-
shadow: 'var:preset|shadow|natural',
|
|
39
|
-
},
|
|
40
|
-
} );
|
|
41
|
-
|
|
42
|
-
// Only spacing.margin survives; padding/border/shadow are not carried
|
|
43
|
-
// because the converted block may not support them.
|
|
44
|
-
expect( result ).toEqual( {
|
|
45
|
-
style: { spacing: { margin: { top: '5px' } } },
|
|
46
|
-
} );
|
|
47
|
-
} );
|
|
48
|
-
|
|
49
|
-
it( 'does not carry image-only attributes such as links or sizing', () => {
|
|
50
|
-
const result = getCarriedGifConversionAttributes( {
|
|
51
|
-
align: 'center',
|
|
52
|
-
href: 'https://example.com',
|
|
53
|
-
linkDestination: 'custom',
|
|
54
|
-
sizeSlug: 'large',
|
|
55
|
-
scale: 'cover',
|
|
56
|
-
} );
|
|
57
|
-
|
|
58
|
-
expect( result ).toEqual( { align: 'center' } );
|
|
59
|
-
} );
|
|
60
|
-
} );
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WordPress dependencies
|
|
3
|
-
*/
|
|
4
|
-
import { ToolbarButton, ToolbarGroup } from '@wordpress/components';
|
|
5
|
-
import {
|
|
6
|
-
BlockControls,
|
|
7
|
-
store as blockEditorStore,
|
|
8
|
-
} from '@wordpress/block-editor';
|
|
9
|
-
import { store as coreStore } from '@wordpress/core-data';
|
|
10
|
-
import { createBlock } from '@wordpress/blocks';
|
|
11
|
-
import { useDispatch, useSelect } from '@wordpress/data';
|
|
12
|
-
import { image as imageIcon } from '@wordpress/icons';
|
|
13
|
-
import { __ } from '@wordpress/i18n';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Internal dependencies
|
|
17
|
-
*/
|
|
18
|
-
import { getCarriedGifConversionAttributes } from '../utils/gif-conversion-attributes';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Toolbar control that turns a converted GIF video block back into the original
|
|
22
|
-
* animated GIF Image block.
|
|
23
|
-
*
|
|
24
|
-
* An animated GIF uploaded through the editor is converted to a muted, looping
|
|
25
|
-
* video and presented as the Video block's "GIF" variation, while the original
|
|
26
|
-
* GIF stays the underlying image attachment. This control switches the block
|
|
27
|
-
* back to a `core/image` pointing at that GIF and opts the image out of being
|
|
28
|
-
* re-converted.
|
|
29
|
-
*
|
|
30
|
-
* It only renders when the block's media is an image attachment (i.e. an
|
|
31
|
-
* editor-converted GIF), so it never appears on regular videos that happen to
|
|
32
|
-
* be muted and looping.
|
|
33
|
-
*
|
|
34
|
-
* @param {Object} props Component props.
|
|
35
|
-
* @param {Object} props.attributes Video block attributes.
|
|
36
|
-
* @param {string} props.clientId Block client ID.
|
|
37
|
-
*
|
|
38
|
-
* @return {Component|null} The control, or null when restoring does not apply.
|
|
39
|
-
*/
|
|
40
|
-
export default function GifRestoreControl( { attributes, clientId } ) {
|
|
41
|
-
const { id, caption } = attributes;
|
|
42
|
-
const { replaceBlocks } = useDispatch( blockEditorStore );
|
|
43
|
-
|
|
44
|
-
// The original GIF is the underlying image attachment. Only offer the
|
|
45
|
-
// restore when the media resolves to an image (an editor-converted GIF),
|
|
46
|
-
// not when a regular video has simply been set to loop/autoplay/mute.
|
|
47
|
-
const gif = useSelect(
|
|
48
|
-
( select ) => {
|
|
49
|
-
if ( ! id ) {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
const record = select( coreStore ).getEntityRecord(
|
|
53
|
-
'postType',
|
|
54
|
-
'attachment',
|
|
55
|
-
id,
|
|
56
|
-
{ context: 'view' }
|
|
57
|
-
);
|
|
58
|
-
if ( ! record?.mime_type?.startsWith( 'image/' ) ) {
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
return record;
|
|
62
|
-
},
|
|
63
|
-
[ id ]
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
if ( ! gif?.source_url ) {
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function restoreToImage() {
|
|
71
|
-
replaceBlocks(
|
|
72
|
-
clientId,
|
|
73
|
-
createBlock( 'core/image', {
|
|
74
|
-
...getCarriedGifConversionAttributes( attributes ),
|
|
75
|
-
id,
|
|
76
|
-
url: gif.source_url,
|
|
77
|
-
alt: gif.alt_text || '',
|
|
78
|
-
caption,
|
|
79
|
-
} )
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return (
|
|
84
|
-
<BlockControls group="other">
|
|
85
|
-
<ToolbarGroup>
|
|
86
|
-
<ToolbarButton icon={ imageIcon } onClick={ restoreToImage }>
|
|
87
|
-
{ __( 'Display as GIF' ) }
|
|
88
|
-
</ToolbarButton>
|
|
89
|
-
</ToolbarGroup>
|
|
90
|
-
</BlockControls>
|
|
91
|
-
);
|
|
92
|
-
}
|