Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gallery: Convert Gallery block to use Image blocks instead of having its own nested image format #25940

Merged
merged 158 commits into from
Aug 19, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
158 commits
Select commit Hold shift + click to select a range
c01bbfb
Refactor gallery to nested image blocks
Apr 11, 2021
038b22d
Fix issue with images not loading on first selection from media gallery
Nov 4, 2020
331c302
Remove the default columns setting as we don't have access to innerBl…
Nov 4, 2020
ee7da0a
Revert "Remove the default columns setting as we don't have access to…
Nov 4, 2020
c9fe911
Add image count so we can work out default columns as innerBlocks not…
Nov 4, 2020
a00a544
Disable the innerBlocks dropzones so drag drop works same as existing…
Nov 5, 2020
0c8742f
Lint changes
Nov 5, 2020
a77854c
Revert "Lint changes"
Nov 6, 2020
1965514
Revert "Disable the innerBlocks dropzones so drag drop works same as …
Nov 6, 2020
e5e1420
Suggested solution for handling multiple file drop into gallery
Nov 6, 2020
1d6c559
Remove non image files from drag and drop and disable individual imag…
Jan 21, 2021
39cecec
Fix transform to individual images
Nov 8, 2020
d9ec2b0
Fix transform from individual images
Nov 8, 2020
3742af8
Revert drag and drop transform changes
Nov 9, 2020
3acb223
Add gallery transform to image block to override the default gallery …
Nov 9, 2020
084e6c7
Move handling of file uploads to Gallery from media placeholder
Apr 11, 2021
cff6727
split innerblocks mapping into separate effect to reduce chatter
Nov 17, 2020
f1606cc
Add useMemo to currentImageOptions
Nov 17, 2020
1140646
reuse existing innerBlocks rather than recreating with every new imag…
Nov 17, 2020
6d23628
Switch to useMemo for updating local image const instead of local com…
Nov 17, 2020
f7a1ff4
Fix issue with image sizing not being available on initial load of co…
Nov 17, 2020
974ad90
Memoise the useImageSizes hook
Nov 17, 2020
5ac143b
Fix issue with media browser defaulting to edit gallery view
Nov 17, 2020
8ceaa3d
Fix missed incorrect use of addToGallery
Nov 17, 2020
8d7159b
Add some extra effects for getting the imageData as the getMedia call…
Nov 18, 2020
dbda7e9
Simplify the imageData by using a useSelect
Nov 19, 2020
342695e
Another optimisation - only return a new imageData reference if all i…
Nov 19, 2020
0744b59
Refactored Gallery: Add loading state to gallery image size options (…
aaronrobertshaw Nov 19, 2020
dad1b0b
Initial deprecations commit
Jan 13, 2021
bcf6664
Fix issue with linkDestination not being applied in migration
Nov 19, 2020
921fecc
Refactor gallery deprecations
aaronrobertshaw Nov 20, 2020
7920a45
Fix missing attributes from migration
aaronrobertshaw Nov 20, 2020
c97630c
Update deprecation to set allowResize
aaronrobertshaw Nov 22, 2020
2724965
Fix issue with crop not working when certain plugins are loaded
Mar 22, 2021
098ba86
Fix SCSS lint errors
aaronrobertshaw Nov 22, 2020
49f9d6b
Update the block example
Nov 23, 2020
88c096b
Linting fixes
Nov 23, 2020
37b4b4e
Fix the e2e test and the accessibility issue with having aria group r…
Mar 22, 2021
0c5e720
Fix the e2e test and the accessibility issue with having aria group r…
Mar 22, 2021
5840a1c
Fix frontend omission of wp-block-image class
aaronrobertshaw Nov 24, 2020
e1e6a8a
change deprecation to use imageCount as isEligible check as it seems …
Nov 25, 2020
d7187b4
Move back to a single deprecations file and reorder in array
Nov 26, 2020
b648b10
Remove additional check in v5 isEligible
Nov 26, 2020
f1454f2
Fix the v4 migration
Nov 26, 2020
e76bb06
Fix styles for Safari compatibility
aaronrobertshaw Nov 30, 2020
b969e3f
Remove unnecessary gallery editor styles
aaronrobertshaw Nov 30, 2020
0ff156a
Fix typo in deprecations
aaronrobertshaw Nov 30, 2020
309f9f0
Restore styles to render deprecated gallery versions
Mar 22, 2021
e6d1301
Avoid applying flex styles to IE11
aaronrobertshaw Dec 1, 2020
4953a0c
Add additional selector to prevent the hidden individual image drop z…
Mar 22, 2021
d259127
IE11 styling improvements
aaronrobertshaw Dec 2, 2020
1a16354
Apply default style class to new images added to gallery
Dec 11, 2020
9aadf8f
fix linting issues
Dec 11, 2020
e879978
Move block props to the outer wrapper
Dec 13, 2020
f072943
Revert "Move block props to the outer wrapper"
Dec 13, 2020
c4d06ee
Revert "Revert "Move block props to the outer wrapper""
Dec 13, 2020
82eee6e
Fetch media if isListItem is true
Apr 11, 2021
601119c
Change context from isListItem to isGrouped
Apr 11, 2021
4f1ddb4
Remove wrapper div
Mar 22, 2021
a6603cf
remove extra wrapper around media placeholder and caption and use fle…
Jan 13, 2021
9b8d498
Revert "remove extra wrapper around media placeholder and caption and…
Jan 13, 2021
bd88cb2
Revert "Remove external div wrapper by moving InnerBlocks to a fragment"
Mar 22, 2021
abcb029
another update to image wrapper
Jan 13, 2021
939456d
put media uploader outside figure so structure matches front end
Dec 17, 2020
bf0aec2
Replace div with View for the sake of native code
Dec 17, 2020
0938b5e
Move setting of attributes to the child images
Apr 11, 2021
94d9877
Gallery Block Refactor: Account for null image ids in gallery migrati…
glendaviesnz Dec 22, 2020
17ca088
Remove the gradient and put caption under image if is-rounded style a…
glendaviesnz Dec 24, 2020
2c2b38e
Remove outer div wrapper
Mar 22, 2021
82ef52a
Keep image margins while dragging sibling
aaronrobertshaw Jan 14, 2021
bc61288
Fix e2e test expected markup to match new structure
Jan 18, 2021
7af15db
Gallery Block Refactor: Add handling of short code transforms
Feb 15, 2021
1e1752e
Removed unused prop
Jan 20, 2021
726e48c
Account for undefined block and innerblocks in conversion to reusable…
Apr 11, 2021
21bd032
Add custom gutter sizes to refactored gallery (#28377)
aaronrobertshaw Jan 21, 2021
a9453d2
Adjust editor styles to match new dom structure
Mar 22, 2021
83b9074
Remove redundant styles that are duplicated in nested image blocks
Jan 21, 2021
e3a6c29
Fix issue with Image block dragged out of Gallery still having inheri…
Jan 22, 2021
d34dcdb
When dragging an image block into a gallery make sure we don't wipe a…
Jan 25, 2021
72e9c2b
fix issue with variable declaration order
Jan 25, 2021
e291f91
Fix bug with custom link being overwritten by gallery linkTo changes
Jan 26, 2021
795a568
Fix application of gutter size CSS var (#28759)
aaronrobertshaw Feb 5, 2021
9580649
Fix mobile width for gallery images
aaronrobertshaw Feb 10, 2021
74072f0
Add missing dependency to inner images selector
aaronrobertshaw Feb 10, 2021
cf4dc34
remove conversion to cover block if image in gallery
Mar 22, 2021
f90965c
Add fallback to old gallery edit and save for existing gallery (#28961)
glendaviesnz Feb 15, 2021
be75a36
Remove duplicate import
Feb 15, 2021
780e9e7
Remove need for temporary imageUploads attribute as we can just creat…
Feb 15, 2021
fd1e27d
Remove handling of gallery attribute updates from child images
Feb 16, 2021
652557e
Move updating of attributes back to gallery and show snackbar to indi…
Feb 16, 2021
1da955d
Update transforms to work with both versions of gallery
Feb 16, 2021
5b809d5
Remove redundant changes
Feb 16, 2021
b3fb72c
Remove redundant changes
Feb 16, 2021
b5ca5ef
Remove unused method
Feb 16, 2021
d5f5cba
Merge similar Image transforms.
Feb 16, 2021
82b97b8
Fix some issues missed when moving attribute setting back to gallery.
Feb 18, 2021
d9b1733
Simplify handling of images from media placeholder now that drag and …
Feb 19, 2021
ee6bef7
Fix typo
aaronrobertshaw Feb 19, 2021
9e0b05c
Fix broken upload from media placeholder
Feb 19, 2021
f27e872
Fix issue with new file uploads overwriting existing blocks
Feb 19, 2021
30dc02f
Remove isGrouped dependency from call to get image as not needed now …
Feb 22, 2021
3d47210
Remove custom gutter size feature
aaronrobertshaw Feb 22, 2021
fd56523
Use getMediaItems instead of getMedia for getting image data for all …
Feb 23, 2021
657ba78
Add back missing context prop from rebase conflict
Feb 23, 2021
a111532
Make use of new uniqueByBlock flag on updateBlockAttributes to batch …
Feb 23, 2021
6370194
Move the setting of the default attributes on new blocks to a single …
glendaviesnz Mar 1, 2021
e23ddb0
Add snackbar notice ids (#29364)
aaronrobertshaw Mar 1, 2021
fc2b2a0
Account for people adding and removing images from media browser so …
Mar 1, 2021
716ea1b
Changes from PR feedback
Mar 1, 2021
44df5dd
Fix issue with deprecated constants
Mar 3, 2021
3a75fb0
Fix linting and e2e test failures
Mar 3, 2021
84ebe2e
Some more e2e fixes
Mar 4, 2021
6b06732
Add transform from old gallery to new format
Mar 4, 2021
6caef45
Memoize the allowedBlocks
aaronrobertshaw Mar 8, 2021
8eceac7
Add warning about image formats required if uploading to gallery
Mar 8, 2021
efd0705
Move allowedBlocks outside of component to avoid useMemo use
aaronrobertshaw Mar 8, 2021
82cf526
Re-apply uncropped alignment changes lost in rebase
Mar 9, 2021
d133db7
Fix issue with non-cropped images in deprecated gallery
Mar 9, 2021
651ff59
Don't show media library buttons while images are still uploading as …
Apr 11, 2021
6209e6e
Remove gallerRef that was no longer doing anything
Mar 9, 2021
eaa0c7a
Respect sort order from Media Library (#30070)
glendaviesnz Mar 22, 2021
20477de
Gallery block refactor: make invalid file type errors consistent (#30…
glendaviesnz Mar 31, 2021
6195768
Fix issue with invalid type message when adding files via media brows…
Apr 6, 2021
9cfb170
Gallery block refactor: check for new images by clientId instead of i…
glendaviesnz Apr 8, 2021
772691d
Apply changes from rebase to deprecated gallery
Apr 11, 2021
d71011b
Apply patch from rebase to not select all items in media library when…
Apr 12, 2021
991437d
Copy caption across from image selected from media library (#30784)
glendaviesnz Apr 13, 2021
a2253ec
Add data-id to image to help with compatibility of refactored gallery…
glendaviesnz Apr 22, 2021
d225aca
Revert "Add data-id to image to help with compatibility of refactored…
Apr 23, 2021
fc06639
fix bug with image style being lost when gallery grouped (#31068)
glendaviesnz Apr 23, 2021
1067a0c
Only add RichText component if the figcaption is clicked to prevent i…
glendaviesnz Apr 28, 2021
ff4fadc
Fix bug with alt text not being copied from media library (#31066)
glendaviesnz Apr 30, 2021
b976235
Merge branch 'trunk' of github.com:WordPress/gutenberg into refactor/…
May 19, 2021
1a4345a
Gallery refactor - Infer version from existing content (#32270)
mkevins May 30, 2021
e5420c6
Merge branch 'trunk' into refactor/gallery-to-nested-image-blocks-ups…
mkevins Jun 3, 2021
e183dcb
Resolve merge conflicts
mkevins Jun 3, 2021
b2031f2
Use non-deprecated hook when possible
mkevins Jun 4, 2021
71b249c
Merge branch 'trunk' into refactor/gallery-to-nested-image-blocks-ups…
mkevins Jun 16, 2021
c72984f
Resolve conflict in block editor default settings
mkevins Jun 16, 2021
7da0c1b
Merge branch 'trunk' into refactor/gallery-to-nested-image-blocks-ups…
mkevins Jul 8, 2021
797cb28
Resolve conflict in image.js
mkevins Jul 8, 2021
fad851a
Minor changes from code review:
Jul 16, 2021
a83b106
Improve naming of save and deprecated save methods
Jul 19, 2021
a424509
Rename __experimentalGalleryRefactor flag to __unstableGalleryWithInn…
Jul 19, 2021
c69f2d5
Remove the isGrouped context as no longer needed.
Jul 20, 2021
887b6b4
Rename __unstableGalleryWithInnerBlocks to _unstableGalleryWithImageB…
Jul 22, 2021
c4eb362
Gallery block refactor: remove the imageCount attribute (#33677)
glendaviesnz Jul 26, 2021
55e8bf6
Merge branch 'trunk' of github.com:WordPress/gutenberg into refactor/…
Jul 27, 2021
8b1bd7d
Fix broken scss
Jul 28, 2021
0b9d8b2
Fix php linting error
Jul 28, 2021
6a58538
Merge mobile refactor of gallery to nested image blocks into desktop …
mkevins Aug 3, 2021
8529284
Merge branch 'trunk' of github.com:WordPress/gutenberg into refactor/…
Aug 3, 2021
a41edeb
Fix issue with upload spinner not displaying correctly on v1 gallery …
Aug 9, 2021
0273b7b
Gallery block: Add a filter to automatically convert transforms to an…
glendaviesnz Aug 12, 2021
5cbaedd
Merge branch 'trunk' of github.com:WordPress/gutenberg into refactor/…
Aug 16, 2021
78472d9
Fix issue with image to cover block conversion
Aug 16, 2021
fd0f7ec
Add imageCrop to gallery context
mkevins Aug 17, 2021
d55be9e
Fix exceptions caused by useBlocksProps running after block has been …
glendaviesnz Aug 19, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fetch media if isListItem is true
  • Loading branch information
Glen Davies committed Apr 11, 2021
commit 82eee6e6f6f11614bf04fe15a2666033c8c7edf8
5 changes: 4 additions & 1 deletion packages/block-library/src/gallery/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@
},
"providesContext": {
"allowResize": "allowResize",
"isListItem": "isListItem"
"isListItem": "isListItem",
"linkTo": "linkTo",
"linkTarget": "linkTarget",
"sizeSlug": "sizeSlug"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess these are meant to be passed down to the images to keep the same value for all images? Can't we start simpler instead and just let the images handle these. On the UI we can still target the children blocks and call their own setAttributes instead of setting the attribute on the Gallery block instead.

I'd love if this PR to be as impact less as possible on the image block.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have been through quite a few iterations of this, and this seems to be the least impactful way on the image block while still providing the UX that uses expect based on our first round of testing, ie. users want to:

  • Add a gallery and expect that by default any changes to the gallery image settings will be applied to all the children
  • If they edit a setting for an individual image, eg. give it a custom link, and then at the gallery level set the default link to attachment, they don't expect that to wipe the custom link in the single image, only affect images they haven't specifically changed.

While point one is possible by setting the child attributes from the parent, point two is difficult as it is impossible to know from the parent which of the children might have had their settings manually toggled. We spent a bit of time working with @jasmussen on the UX around this ... but open to suggestions on alternatives.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If they edit a setting for an individual image, eg. give it a custom link, and then at the gallery level set the default link to attachment, they don't expect that to wipe the custom link in the single image, only affect images they haven't specifically changed.

This is actually something I want to challenge. If you multiselect something (regardless of the context), say "text", and you remove "bold", it's going to make everything "bold" not just what was edited globally before. So it seems to me that overriding the single image choice should be the best way to go here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jasmussen did you have any thoughts of this from our previous discussions about the new gallery settings. You may remember that we did have a prompt on the gallery settings to confirm that that user wanted to overwrite all child settings, but you saw that as an antipattern, so we moved to moved tp the child images only applying gallery settings if they hadn't been individually set.

I see it being a gotcha for users who may set custom urls on a large number of images, and then maybe toggle the linkTo select at the gallery level maybe thinking it will only affect new images but it in fact wipes all their custom settings.

Very happy to discuss the options and approaches further though.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I definitely think any blanket overwriting of custom urls on inner image blocks would be a bad experience for our users. Not only would it be unexpected but they might not even notice it right away, increasing the frustration.

Perhaps the distinction here is that the user isn't actively multi-selecting images. Therefore they aren't making the choice to alter those inner images directly.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a key discussion, with trade-offs on both sides. Thanks for the ping again, and thanks also for refreshing my memory:

You may remember that we did have a prompt on the gallery settings to confirm that that user wanted to overwrite all child settings, but you saw that as an antipattern, so we moved to moved tp the child images only applying gallery settings if they hadn't been individually set

Yes, moving the logic to the image itself seemed like the best alternative to a "confirm" prompt.

On the flipside, Riad makes a good point:

If you multiselect something (regardless of the context), say "text", and you remove "bold", it's going to make everything "bold" not just what was edited globally before.

This is a "destructive" change in the same way as overriding link destinations on images in a gallery would be. The key difference is the bold toggle is very visual, whereas the gallery change is mostly invisible. You wouldn't necessarily know that this one image in the corner, which you linked to a rickroll video, had its URL changed.

But to Riad's point again — maybe you should have assumed this because it's the same as the "bold" behavior. And maybe it is correct behavior after all. And maybe linking just one image is an edgecase not worth adding undue complexity for. And maybe we should embrace that there are highly visible undo/redo buttons in the toolbar.

Because I argued for the opposite, I refreshed the branch and took it for a spin to get a feel for it again:

gallery

So good. The fact that I can click an image to select it, press Delete to remove it directly. That I can rearrange these? This is all so good. And the "select parent" change really benefits this.

I tend to still think it would be nice to inform the user, somehow, that these gallery-level link changes might override that carefully constructed URL. But given we have undo, and version history, I do see where Riad is coming from.

Could a compromise be to go with Riad's approach, but to throw up a snackbar notice when you make a URL change? "All images in gallery now link to Media File"?

Copy link
Contributor Author

@glendaviesnz glendaviesnz Feb 16, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jasmussen, @youknowriad I have refactored in line with your suggestion Joen and the update now is handled by the gallery with a snackbar to indicate that all images were affected. The only issue is that each image update is a separate entry in the undo stack, so to undo the change in gallery with 3 images you need to hit undo 3 times. Do either of you know if there is a way to batch a series of changes so they can be undone in one go? I ran out of time to explore the code for any examples of this today.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so to undo the change in gallery with 3 images you need to hit undo 3 times. Do either of you know if there is a way to batch a series of changes so they can be undone in one go?

I think we do support multiselection of blocks and changing attributes for all these blocks at the same time, so it seems both these two things should work the same way. I'm not sure whether this use-case creates a single undo or not though. If not, it should be as easy as having a new action on the block-editor package to update all the blocks in one go.

Copy link
Contributor Author

@glendaviesnz glendaviesnz Feb 17, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we do support multiselection of blocks and changing attributes for all these blocks at the same time

Yeh, it turns out you can update multiple blocks with updateBlockAttributes by passing an array of clientIds, and it gets added as a single event in undo stack ... but all the attributes have to be the same, and unfortunately with the likes of linkTo changes the href attrib is different for every nested image block so updateBlockAttributes has to be run separately for each block.

I will take a look at the option of adding a new action to the block-editor package tomorrow ... I assume that would be better as a standalone PR? New area for me so not sure how far I will get with that.

Copy link
Contributor Author

@glendaviesnz glendaviesnz Feb 18, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@youknowriad it looks like this could be as easy as extending updateBlockAttributes to allow a clientId keyed object of attributes as an alternative to a flat object of attributes. I have a prototype of this at #29099, and this works when tested with gallery PR to allow all gallery level attribute changes to be undone in one go. If you think this looks like a way forward I will do some more testing and add some additional unit tests to the PR.

},
"supports": {
"anchor": true,
Expand Down
4 changes: 2 additions & 2 deletions packages/block-library/src/gallery/constants.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export const LINK_DESTINATION_NONE = 'none';
export const LINK_DESTINATION_MEDIA = 'file';
export const LINK_DESTINATION_ATTACHMENT = 'post';
export const LINK_DESTINATION_MEDIA = 'media';
export const LINK_DESTINATION_ATTACHMENT = 'attachment';
70 changes: 61 additions & 9 deletions packages/block-library/src/gallery/deprecated.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@ import { createBlock } from '@wordpress/blocks';
/**
* Internal dependencies
*/
import { getHrefAndDestination } from './utils';
import {
LINK_DESTINATION_ATTACHMENT,
LINK_DESTINATION_MEDIA,
LINK_DESTINATION_NONE,
} from './constants';

const DEPRECATED_LINK_DESTINATION_MEDIA = 'file';
const DEPRECATED_LINK_DESTINATION_ATTACHMENT = 'post';

/**
* Original function to determine default number of columns from a block's
* attributes.
Expand All @@ -32,6 +35,51 @@ export function defaultColumnsNumberV1( attributes ) {
return Math.min( 3, attributes.images.length );
}

/**
* Original function to determines new href and linkDestination values for an image block from the
* supplied Gallery link destination.
*
* Used in deprecations: v1-6.
*
* @param {Object} image Gallery image.
* @param {string} destination Gallery's selected link destination.
* @return {Object} New attributes to assign to image block.
*/
export function getHrefAndDestination( image, destination ) {
// Need to determine the URL that the selected destination maps to.
// Gutenberg and WordPress use different constants so the new link
// destination also needs to be tweaked.
switch ( destination ) {
case DEPRECATED_LINK_DESTINATION_MEDIA:
return {
href: image?.source_url || image?.url, // eslint-disable-line camelcase
linkDestination: LINK_DESTINATION_MEDIA,
};
case DEPRECATED_LINK_DESTINATION_ATTACHMENT:
return {
href: image?.link,
linkDestination: LINK_DESTINATION_ATTACHMENT,
};
case LINK_DESTINATION_MEDIA:
return {
href: image?.source_url || image?.url, // eslint-disable-line camelcase
linkDestination: LINK_DESTINATION_MEDIA,
};
case LINK_DESTINATION_ATTACHMENT:
return {
href: image?.link,
linkDestination: LINK_DESTINATION_ATTACHMENT,
};
case LINK_DESTINATION_NONE:
return {
href: undefined,
linkDestination: LINK_DESTINATION_NONE,
};
}

return {};
}

const v1 = {
attributes: {
images: {
Expand Down Expand Up @@ -683,17 +731,16 @@ const v5 = {
supports: {
align: true,
},
isEligible( { linkTo } ) {
return ! linkTo || linkTo === 'attachment' || linkTo === 'media';
isEligible( { linkTo, imageCount } ) {
return (
! imageCount &&
( ! linkTo || linkTo === 'attachment' || linkTo === 'media' )
);
},
migrate( attributes ) {
let linkTo = attributes.linkTo;
if ( ! attributes.linkTo ) {
linkTo = 'none';
} else if ( attributes.linkTo === 'attachment' ) {
linkTo = 'post';
} else if ( attributes.linkTo === 'media' ) {
linkTo = 'file';
}
const imageBlocks = attributes.images.map( ( image ) => {
return createBlock( 'core/image', {
Expand Down Expand Up @@ -893,10 +940,10 @@ const v6 = {
let href;

switch ( linkTo ) {
case LINK_DESTINATION_MEDIA:
case DEPRECATED_LINK_DESTINATION_MEDIA:
href = image.fullUrl || image.url;
break;
case LINK_DESTINATION_ATTACHMENT:
case DEPRECATED_LINK_DESTINATION_ATTACHMENT:
href = image.link;
break;
}
Expand Down Expand Up @@ -951,6 +998,11 @@ const v6 = {
return ! imageCount;
},
migrate( { images, imageCrop, linkTo, sizeSlug, columns, caption } ) {
if ( linkTo === 'post' ) {
linkTo = 'attachment';
} else if ( linkTo === 'file' ) {
linkTo = 'media';
}
const imageBlocks = images.map( ( image ) => {
return createBlock( 'core/image', {
id: parseInt( image.id ),
Expand Down
80 changes: 10 additions & 70 deletions packages/block-library/src/gallery/edit.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,14 @@
* External dependencies
*/
import classnames from 'classnames';
import {
isEqual,
isEmpty,
find,
concat,
differenceBy,
some,
every,
} from 'lodash';
import { isEmpty, concat, differenceBy, some, every } from 'lodash';

/**
* WordPress dependencies
*/
import { compose } from '@wordpress/compose';
import {
BaseControl,
Button,
PanelBody,
SelectControl,
ToggleControl,
Expand All @@ -32,7 +23,7 @@ import {
useBlockProps,
store as blockEditorStore,
} from '@wordpress/block-editor';
import { Platform, useEffect, useState } from '@wordpress/element';
import { Platform, useEffect, useMemo } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { useSelect, useDispatch } from '@wordpress/data';
import { withViewportMatch } from '@wordpress/viewport';
Expand All @@ -45,7 +36,7 @@ import { createBlobURL } from '@wordpress/blob';
*/
import { sharedIcon } from './shared-icon';
import { defaultColumnsNumber, pickRelevantMediaFiles } from './shared';
import { getHrefAndDestination, getImageSizeAttributes } from './utils';
import { getHrefAndDestination } from './utils';
import { getUpdatedLinkTargetSettings } from '../image/utils';
import Gallery from './gallery';
import {
Expand Down Expand Up @@ -101,28 +92,7 @@ function GalleryEdit( props ) {
blockEditorStore
);

const currentImageOptions = useMemo(
() => ( {
linkTarget,
linkTo,
sizeSlug,
} ),
[ linkTarget, linkTo, sizeSlug ]
);
const [ imageSettings, setImageSettings ] = useState( currentImageOptions );
const [ dirtyImageOptions, setDirtyImageOptions ] = useState( false );

useEffect( () => {
const currentOptionsState = ! isEqual(
currentImageOptions,
imageSettings
);
if ( currentOptionsState !== dirtyImageOptions ) {
setDirtyImageOptions( currentOptionsState );
}
}, [ currentImageOptions, imageSettings ] );

const { getBlock, getSettings, preferredStyle } = useSelect( ( select ) => {
const { getSettings, preferredStyle } = useSelect( ( select ) => {
const settings = select( 'core/block-editor' ).getSettings();
const preferredStyleVariations =
settings.__experimentalPreferredStyleVariations;
Expand Down Expand Up @@ -188,9 +158,7 @@ function GalleryEdit( props ) {
getSettings
);

const { replaceInnerBlocks, updateBlockAttributes } = useDispatch(
'core/block-editor'
);
const { replaceInnerBlocks } = useDispatch( 'core/block-editor' );

/**
* Determines the image attributes that should be applied to an image block
Expand Down Expand Up @@ -263,6 +231,11 @@ function GalleryEdit( props ) {
const newBlocks = newImages.map( ( image ) => {
return createBlock( 'core/image', {
...buildImageAttributes( false, image ),
inheritedAttributes: {
linkDestination: true,
linkTarget: true,
sizeSlug: true,
},
id: image.id,
} );
} );
Expand Down Expand Up @@ -300,25 +273,6 @@ function GalleryEdit( props ) {
setAttributes( { linkTarget: linkTarget ? undefined : '_blank' } );
}

function applyImageOptions() {
getBlock( clientId ).innerBlocks.forEach( ( block ) => {
const image = block.attributes.id
? find( imageData, { id: block.attributes.id } )
: null;
updateBlockAttributes( block.clientId, {
...getHrefAndDestination( image.data, linkTo ),
...getUpdatedLinkTargetSettings( linkTarget, block.attributes ),
...getImageSizeAttributes( image.data, sizeSlug ),
} );
} );
setDirtyImageOptions( false );
setImageSettings( currentImageOptions );
}

function cancelImageOptions() {
setAttributes( imageSettings );
}

function updateImagesSize( newSizeSlug ) {
setAttributes( { sizeSlug: newSizeSlug } );
}
Expand Down Expand Up @@ -435,20 +389,6 @@ function GalleryEdit( props ) {
</View>
</BaseControl>
) }
{ dirtyImageOptions && (
<View className={ 'gallery-settings-buttons' }>
<Button isPrimary onClick={ applyImageOptions }>
{ __( 'Apply to all images' ) }
</Button>
<Button
className={ 'cancel-apply-to-images' }
isLink
onClick={ cancelImageOptions }
>
{ __( 'Cancel' ) }
</Button>
</View>
) }
</PanelBody>
</InspectorControls>
{ noticeUI }
Expand Down
22 changes: 0 additions & 22 deletions packages/block-library/src/gallery/utils.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/**
* External dependencies
*/
import { get } from 'lodash';

/**
* Internal dependencies
*/
Expand Down Expand Up @@ -49,20 +44,3 @@ export function getHrefAndDestination( image, destination ) {

return {};
}

/**
* Determines new Image block attributes affected by a change in Gallery image
* size selection.
*
* @param {Object} image Media file object for gallery image.
* @param {string} size Gallery's selected size slug to apply.
*/
export function getImageSizeAttributes( image, size ) {
const url = get( image, [ 'media_details', 'sizes', size, 'source_url' ] );

if ( url ) {
return { url, width: undefined, height: undefined, sizeSlug: size };
}

return {};
}
16 changes: 15 additions & 1 deletion packages/block-library/src/image/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@
"apiVersion": 2,
"name": "core/image",
"category": "media",
"usesContext": [ "allowResize", "isListItem" ],
"usesContext": [
"allowResize",
"isListItem",
"linkTo",
"linkTarget",
"sizeSlug"
],
"attributes": {
"align": {
"type": "string"
Expand Down Expand Up @@ -73,6 +79,14 @@
"isListItem": {
"type": "boolean",
"default": false
},
"inheritedAttributes": {
"type": "object",
"default": {
"linkTo": false,
"linkTarget": false,
"sizeSlug": false
}
}
},
"supports": {
Expand Down
Loading