/**
* WordPress dependencies
*/
import {
__experimentalItemGroup as ItemGroup,
__experimentalItem as Item,
BaseControl,
Icon,
} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import { useContext } from '@wordpress/element';
import { check } from '@wordpress/icons';
import { Stack } from '@wordpress/ui';
/**
* Internal dependencies
*/
import type { NormalizedField } from '../../types';
import DataViewsContext from '../dataviews-context';
import getHideableFields from '../../utils/get-hideable-fields';
function FieldItem( {
field,
isVisible,
onToggleVisibility,
}: {
field: NormalizedField< any >;
isVisible: boolean;
onToggleVisibility?: () => void;
} ) {
return (
-
{ isVisible && }
{ field.label }
);
}
function isDefined< T >( item: T | undefined ): item is T {
return !! item;
}
export function PropertiesSection( {
showLabel = true,
}: {
showLabel?: boolean;
} ) {
const { view, fields, onChangeView } = useContext( DataViewsContext );
// Get all regular fields (non-locked) in their original order from fields prop
const regularFields = getHideableFields( view, fields );
if ( ! regularFields?.length ) {
return null;
}
const titleField = fields.find( ( f ) => f.id === view.titleField );
const previewField = fields.find( ( f ) => f.id === view.mediaField );
const descriptionField = fields.find(
( f ) => f.id === view.descriptionField
);
const lockedFields = [
{
field: titleField,
isVisibleFlag: 'showTitle',
},
{
field: previewField,
isVisibleFlag: 'showMedia',
},
{
field: descriptionField,
isVisibleFlag: 'showDescription',
},
].filter( ( { field } ) => isDefined( field ) ) as Array< {
field: NormalizedField< any >;
isVisibleFlag: string;
} >;
const visibleFieldIds = view.fields ?? [];
const visibleRegularFieldsCount = regularFields.filter( ( f ) =>
visibleFieldIds.includes( f.id )
).length;
const visibleLockedFields = lockedFields.filter(
( { isVisibleFlag } ) =>
// @ts-expect-error
view[ isVisibleFlag ] ?? true
);
// If only one field (locked or regular) is visible, prevent it from being hidden
const totalVisibleFields =
visibleLockedFields.length + visibleRegularFieldsCount;
const isSingleVisibleLockedField =
totalVisibleFields === 1 && visibleLockedFields.length === 1;
return (
{ showLabel && (
{ __( 'Properties' ) }
) }
{ lockedFields.map( ( { field, isVisibleFlag } ) => {
// @ts-expect-error
const isVisible = view[ isVisibleFlag ] ?? true;
const fieldToRender =
isSingleVisibleLockedField && isVisible
? { ...field, enableHiding: false }
: field;
return (
{
onChangeView( {
...view,
[ isVisibleFlag ]: ! isVisible,
} );
} }
/>
);
} ) }
{ regularFields.map( ( field ) => {
// Check if this is the last visible field to prevent hiding
const isVisible = visibleFieldIds.includes( field.id );
const fieldToRender =
totalVisibleFields === 1 && isVisible
? { ...field, enableHiding: false }
: field;
return (
{
onChangeView( {
...view,
fields: isVisible
? visibleFieldIds.filter(
( fieldId ) =>
fieldId !== field.id
)
: [ ...visibleFieldIds, field.id ],
} );
} }
/>
);
} ) }
);
}