From 1b3bbbc71b0f0b2a98b158aa48512c678b8d3f7d Mon Sep 17 00:00:00 2001 From: Jorge Costa Date: Wed, 10 Jul 2024 16:36:52 +0100 Subject: [PATCH] Update: Data views grid layout: Allow users to adjust grid density, and consumers to set default density --- .../src/hooks/use-viewport-match/index.js | 3 +- packages/dataviews/src/dataviews.tsx | 9 +++ packages/dataviews/src/density-picker.tsx | 67 +++++++++++++++++++ packages/dataviews/src/layouts/grid/index.tsx | 6 ++ packages/dataviews/src/style.scss | 33 +++++---- packages/dataviews/src/types.ts | 1 + 6 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 packages/dataviews/src/density-picker.tsx diff --git a/packages/compose/src/hooks/use-viewport-match/index.js b/packages/compose/src/hooks/use-viewport-match/index.js index ebec934b480123..70b215fc38cec6 100644 --- a/packages/compose/src/hooks/use-viewport-match/index.js +++ b/packages/compose/src/hooks/use-viewport-match/index.js @@ -9,7 +9,7 @@ import { createContext, useContext } from '@wordpress/element'; import useMediaQuery from '../use-media-query'; /** - * @typedef {"huge" | "wide" | "large" | "medium" | "small" | "mobile"} WPBreakpoint + * @typedef {"huge" | "wide" | "xlarge" | "large" | "medium" | "small" | "mobile"} WPBreakpoint */ /** @@ -22,6 +22,7 @@ import useMediaQuery from '../use-media-query'; const BREAKPOINTS = { huge: 1440, wide: 1280, + xlarge: 1080, large: 960, medium: 782, small: 600, diff --git a/packages/dataviews/src/dataviews.tsx b/packages/dataviews/src/dataviews.tsx index d6a1d5194ba9d1..2420a47da48a3f 100644 --- a/packages/dataviews/src/dataviews.tsx +++ b/packages/dataviews/src/dataviews.tsx @@ -32,6 +32,7 @@ import type { SupportedLayouts, } from './types'; import type { SetSelection, SelectionOrUpdater } from './private-types'; +import DensityPicker from './density-picker'; type ItemWithId = { id: string }; @@ -77,6 +78,7 @@ export default function DataViews< Item >( { onSelectionChange = defaultOnSelectionChange, }: DataViewsProps< Item > ) { const [ selectionState, setSelectionState ] = useState< string[] >( [] ); + const [ densityDelta, setDensityDelta ] = useState< number >( 0 ); const isUncontrolled = selectionProperty === undefined || setSelectionProperty === undefined; const selection = isUncontrolled ? selectionState : selectionProperty; @@ -134,6 +136,12 @@ export default function DataViews< Item >( { setOpenedFilter={ setOpenedFilter } /> + { view.type === LAYOUT_GRID && ( + + ) } { [ LAYOUT_TABLE, LAYOUT_GRID ].includes( view.type ) && hasPossibleBulkAction && ( ( { selection={ _selection } setOpenedFilter={ setOpenedFilter } view={ view } + densityDelta={ densityDelta } /> =' ); + const isXlarge = useViewportMatch( 'xlarge', '>=' ); + const isMobile = useViewportMatch( 'mobile', '>=' ); + if ( isHuge ) { + return 4 + densityDelta; + } + if ( isXlarge ) { + return 3 + densityDelta; + } + if ( isMobile ) { + return 2 + densityDelta; + } + return 1 + densityDelta; +} + +export default function DensityPicker( { + densityDelta, + setDensityDelta, +}: { + densityDelta: number; + setDensityDelta: ( delta: number ) => void; +} ) { + const densityValue = useDensityValue( densityDelta ); + const sumValue = densityValue - densityDelta; + return ( + <> +