Skip to content

Commit b4e0504

Browse files
committed
Adopt responsive image changes
1 parent 6dbe93b commit b4e0504

File tree

4 files changed

+46
-29
lines changed

4 files changed

+46
-29
lines changed

packages/dataviews/src/components/datapicker/grid-layout.tsx

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import clsx from 'clsx';
88
*/
99
import {
1010
Composite,
11-
__experimentalGrid as Grid,
1211
__experimentalVStack as VStack,
1312
CheckboxControl,
1413
Spinner,
@@ -24,7 +23,8 @@ import type {
2423
ViewBaseProps,
2524
} from '../../types';
2625
import type { SetSelection } from '../../private-types';
27-
import { useUpdatedPreviewSizeOnViewportChange } from '../../dataviews-layouts/grid/preview-size-picker';
26+
import { useContext } from '@wordpress/element';
27+
import DataViewsContext from '../dataviews-context';
2828

2929
type DataPickerGridLayoutProps< Item > = {
3030
multiple: boolean;
@@ -54,6 +54,8 @@ export default function DataPickerGridLayout< Item >( {
5454
setSize,
5555
startPosition,
5656
}: DataPickerGridLayoutProps< Item > ) {
57+
const { resizeObserverRef } = useContext( DataViewsContext );
58+
5759
const hasData = !! data?.length;
5860

5961
const titleField = fields.find(
@@ -66,37 +68,39 @@ export default function DataPickerGridLayout< Item >( {
6668
( field ) => field.id === view?.descriptionField
6769
);
6870

69-
const updatedPreviewSize = useUpdatedPreviewSizeOnViewportChange();
70-
const usedPreviewSize = updatedPreviewSize || view.layout?.previewSize;
71-
const gridStyle = usedPreviewSize
72-
? {
73-
gridTemplateColumns: `repeat(${ usedPreviewSize }, minmax(0, 1fr))`,
74-
}
75-
: {};
71+
const usedPreviewSize = view.layout?.previewSize;
72+
/*
73+
* This is the maximum width that an image can achieve in the grid. The reasoning is:
74+
* The biggest min image width available is 430px (see /dataviews-layouts/grid/preview-size-picker.tsx).
75+
* Because the grid is responsive, once there is room for another column, the images shrink to accommodate it.
76+
* So each image will never grow past 2*430px plus a little more to account for the gaps.
77+
*/
78+
const size = '900px';
7679

7780
return (
7881
<>
7982
{ hasData && (
8083
<Composite
8184
virtualFocus
8285
orientation="horizontal"
83-
render={ ( props ) => (
84-
<Grid
85-
{ ...props }
86-
as="ul"
86+
render={
87+
<ul
88+
ref={
89+
resizeObserverRef as React.RefObject< HTMLUListElement >
90+
}
91+
style={ {
92+
gridTemplateColumns:
93+
usedPreviewSize &&
94+
`repeat(auto-fill, minmax(${ usedPreviewSize }px, 1fr))`,
95+
} }
8796
className="dataviews-picker-grid"
8897
aria-label={ label }
8998
role="listbox"
9099
aria-multiselectable={ multiple }
91100
tabIndex={ 0 }
92-
gap={ 8 }
93-
columns={ 2 }
94-
alignment="top"
95101
aria-busy={ isLoading }
96-
style={ gridStyle }
97-
children={ props.children }
98102
/>
99-
) }
103+
}
100104
>
101105
{ data.map( ( item, index ) => {
102106
const position = startPosition + index;
@@ -119,6 +123,9 @@ export default function DataPickerGridLayout< Item >( {
119123
descriptionField={ descriptionField }
120124
setSize={ setSize }
121125
position={ position }
126+
config={ {
127+
sizes: size,
128+
} }
122129
/>
123130
);
124131
} ) }
@@ -154,6 +161,9 @@ type GridItemProps< Item > = {
154161
descriptionField: NormalizedField< Item > | undefined;
155162
setSize: number;
156163
position: number;
164+
config: {
165+
sizes: string;
166+
};
157167
};
158168

159169
function GridItem< Item >( {
@@ -169,11 +179,16 @@ function GridItem< Item >( {
169179
descriptionField,
170180
setSize,
171181
position,
182+
config,
172183
}: GridItemProps< Item > ) {
173184
const { showTitle = true, showMedia = true, showDescription = true } = view;
174185
const renderedMediaField =
175186
showMedia && mediaField?.render ? (
176-
<mediaField.render item={ item } field={ mediaField } />
187+
<mediaField.render
188+
item={ item }
189+
field={ mediaField }
190+
config={ config }
191+
/>
177192
) : null;
178193
const renderedTitleField =
179194
showTitle && titleField?.render ? (

packages/dataviews/src/components/datapicker/index.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
useState,
99
useMemo,
1010
} from '@wordpress/element';
11-
import { useMergeRefs, useResizeObserver } from '@wordpress/compose';
11+
import { useResizeObserver } from '@wordpress/compose';
1212
import {
1313
__experimentalHStack as HStack,
1414
Button,
@@ -133,12 +133,10 @@ export default function DataPicker< Item >( {
133133
containerRef,
134134
isShowingFilter,
135135
setIsShowingFilter,
136+
resizeObserverRef,
136137
} }
137138
>
138-
<div
139-
className="dataviews-wrapper"
140-
ref={ useMergeRefs( [ containerRef, resizeObserverRef ] ) }
141-
>
139+
<div className="dataviews-wrapper" ref={ containerRef }>
142140
<HStack
143141
alignment="top"
144142
justify="space-between"

packages/dataviews/src/components/dataviews-context/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ type DataViewsContextType< Item > = {
4848
containerWidth: number;
4949
containerRef: React.MutableRefObject< HTMLDivElement | null >;
5050
resizeObserverRef:
51-
| ( ( element?: HTMLDivElement | null ) => void )
52-
| React.RefObject< HTMLDivElement >;
51+
| ( ( element?: HTMLElement | null ) => void )
52+
| React.RefObject< HTMLElement >;
5353
defaultLayouts: SupportedLayouts;
5454
filters: NormalizedFilter[];
5555
isShowingFilter: boolean;

packages/dataviews/src/dataviews-layouts/grid/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,9 @@ function ViewGrid< Item >( {
349349
`repeat(auto-fill, minmax(${ usedPreviewSize }px, 1fr))`,
350350
} }
351351
aria-busy={ isLoading }
352-
ref={ resizeObserverRef }
352+
ref={
353+
resizeObserverRef as React.RefObject< HTMLDivElement >
354+
}
353355
>
354356
{ groupItems.map( ( item ) => {
355357
return (
@@ -407,7 +409,9 @@ function ViewGrid< Item >( {
407409
`repeat(auto-fill, minmax(${ usedPreviewSize }px, 1fr))`,
408410
} }
409411
aria-busy={ isLoading }
410-
ref={ resizeObserverRef }
412+
ref={
413+
resizeObserverRef as React.RefObject< HTMLDivElement >
414+
}
411415
>
412416
{ data.map( ( item ) => {
413417
return (

0 commit comments

Comments
 (0)