From 277a884585af7af71048f6ec290585c659ca81a6 Mon Sep 17 00:00:00 2001 From: Riad Benguella Date: Mon, 8 Jul 2024 17:47:52 +0200 Subject: [PATCH] Make all combined fields mandatory --- packages/dataviews/src/layouts.ts | 27 +++++++++++++++++++++++++ packages/dataviews/src/types.ts | 5 ----- packages/dataviews/src/view-actions.tsx | 6 ++++-- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/packages/dataviews/src/layouts.ts b/packages/dataviews/src/layouts.ts index 0d00263b6fbc55..f8339c0a6b83f7 100644 --- a/packages/dataviews/src/layouts.ts +++ b/packages/dataviews/src/layouts.ts @@ -16,6 +16,7 @@ import ViewTable from './view-table'; import ViewGrid from './view-grid'; import ViewList from './view-list'; import { LAYOUT_GRID, LAYOUT_LIST, LAYOUT_TABLE } from './constants'; +import type { View } from './types'; export const VIEW_LAYOUTS = [ { @@ -37,3 +38,29 @@ export const VIEW_LAYOUTS = [ icon: isRTL() ? formatListBulletsRTL : formatListBullets, }, ]; + +export function getMandatoryFields( view: View ): string[] { + if ( view.type === 'table' ) { + return [ view.layout?.primaryField ] + .concat( + view.layout?.combinedFields?.flatMap( + ( field ) => field.children + ) ?? [] + ) + .filter( ( item ): item is string => !! item ); + } + + if ( view.type === 'grid' ) { + return [ view.layout?.primaryField, view.layout?.mediaField ].filter( + ( item ): item is string => !! item + ); + } + + if ( view.type === 'list' ) { + return [ view.layout?.primaryField, view.layout?.mediaField ].filter( + ( item ): item is string => !! item + ); + } + + return []; +} diff --git a/packages/dataviews/src/types.ts b/packages/dataviews/src/types.ts index 91cc6a0923f20e..36f70cc383c621 100644 --- a/packages/dataviews/src/types.ts +++ b/packages/dataviews/src/types.ts @@ -279,11 +279,6 @@ export interface ViewTable extends ViewBase { */ primaryField?: string; - /** - * The field to use as the media field. - */ - mediaField?: string; - /** * The fields to use as columns. */ diff --git a/packages/dataviews/src/view-actions.tsx b/packages/dataviews/src/view-actions.tsx index 20e55db03459a4..daac45cd9ef24c 100644 --- a/packages/dataviews/src/view-actions.tsx +++ b/packages/dataviews/src/view-actions.tsx @@ -19,7 +19,7 @@ import { cog } from '@wordpress/icons'; */ import { unlock } from './lock-unlock'; import { SORTING_DIRECTIONS, sortLabels } from './constants'; -import { VIEW_LAYOUTS } from './layouts'; +import { VIEW_LAYOUTS, getMandatoryFields } from './layouts'; import type { NormalizedField, View } from './types'; const { @@ -166,9 +166,11 @@ function FieldsVisibilityMenu< Item >( { onChangeView, fields, }: FieldsVisibilityMenuProps< Item > ) { + const mandatoryFields = getMandatoryFields( view ); const hidableFields = fields.filter( ( field ) => - field.enableHiding !== false && field.id !== view.layout.mediaField + field.enableHiding !== false && + ! mandatoryFields.includes( field.id ) ); const viewFields = view.fields || fields.map( ( field ) => field.id ); if ( ! hidableFields?.length ) {