/** * External dependencies */ import type { ChangeEvent } from 'react'; /** * WordPress dependencies */ import { Button, __experimentalDropdownContentWrapper as DropdownContentWrapper, Dropdown, __experimentalToggleGroupControl as ToggleGroupControl, __experimentalToggleGroupControlOption as ToggleGroupControlOption, __experimentalToggleGroupControlOptionIcon as ToggleGroupControlOptionIcon, SelectControl, __experimentalHeading as Heading, privateApis as componentsPrivateApis, } from '@wordpress/components'; import { __, _x } from '@wordpress/i18n'; import { memo, useContext, useMemo } from '@wordpress/element'; import { cog } from '@wordpress/icons'; import warning from '@wordpress/warning'; import { useInstanceId } from '@wordpress/compose'; import { Stack } from '@wordpress/ui'; /** * Internal dependencies */ import { SORTING_DIRECTIONS, sortIcons, sortLabels } from '../../constants'; import { VIEW_LAYOUTS } from '../dataviews-layouts'; import type { View } from '../../types'; import DataViewsContext from '../dataviews-context'; import { PropertiesSection } from './properties-section'; import { unlock } from '../../lock-unlock'; const { Menu } = unlock( componentsPrivateApis ); const DATAVIEWS_CONFIG_POPOVER_PROPS = { className: 'dataviews-config__popover', placement: 'bottom-end', offset: 9, }; export function ViewTypeMenu() { const { view, onChangeView, defaultLayouts } = useContext( DataViewsContext ); const availableLayouts = Object.keys( defaultLayouts ); if ( availableLayouts.length <= 1 ) { return null; } const activeView = VIEW_LAYOUTS.find( ( v ) => view.type === v.type ); return ( } /> { availableLayouts.map( ( layout ) => { const config = VIEW_LAYOUTS.find( ( v ) => v.type === layout ); if ( ! config ) { return null; } return ( ) => { switch ( e.target.value ) { case 'list': case 'grid': case 'table': case 'pickerGrid': case 'pickerTable': case 'activity': const viewWithoutLayout = { ...view }; if ( 'layout' in viewWithoutLayout ) { delete viewWithoutLayout.layout; } return onChangeView( { ...viewWithoutLayout, type: e.target.value, ...defaultLayouts[ e.target.value ], } as View ); } warning( 'Invalid dataview' ); } } > { config.label } ); } ) } ); } function SortFieldControl() { const { view, fields, onChangeView } = useContext( DataViewsContext ); const orderOptions = useMemo( () => { const sortableFields = fields.filter( ( field ) => field.enableSorting !== false ); return sortableFields.map( ( field ) => { return { label: field.label, value: field.id, }; } ); }, [ fields ] ); return ( { onChangeView( { ...view, sort: { direction: view?.sort?.direction || 'desc', field: value, }, showLevels: false, } ); } } /> ); } function SortDirectionControl() { const { view, fields, onChangeView } = useContext( DataViewsContext ); const sortableFields = fields.filter( ( field ) => field.enableSorting !== false ); if ( sortableFields.length === 0 ) { return null; } let value = view.sort?.direction; if ( ! value && view.sort?.field ) { value = 'desc'; } return ( { if ( newDirection === 'asc' || newDirection === 'desc' ) { onChangeView( { ...view, sort: { direction: newDirection, field: view.sort?.field || // If there is no field assigned as the sorting field assign the first sortable field. fields.find( ( field ) => field.enableSorting !== false )?.id || '', }, showLevels: false, } ); return; } warning( 'Invalid direction' ); } } > { SORTING_DIRECTIONS.map( ( direction ) => { return ( ); } ) } ); } function ItemsPerPageControl() { const { view, config, onChangeView } = useContext( DataViewsContext ); const { infiniteScrollEnabled } = view; if ( ! config || ! config.perPageSizes || config.perPageSizes.length < 2 || config.perPageSizes.length > 6 || infiniteScrollEnabled ) { return null; } return ( { const newItemsPerPageNumber = typeof newItemsPerPage === 'number' || newItemsPerPage === undefined ? newItemsPerPage : parseInt( newItemsPerPage, 10 ); onChangeView( { ...view, perPage: newItemsPerPageNumber, page: 1, } ); } } > { config.perPageSizes.map( ( value ) => { return ( ); } ) } ); } function ResetViewButton() { const { onReset } = useContext( DataViewsContext ); // Don't render if no persistence support (onReset is undefined) if ( onReset === undefined ) { return null; } const isDisabled = onReset === false; return ( ); } export function DataviewsViewConfigDropdown() { const { view, onReset } = useContext( DataViewsContext ); const popoverId = useInstanceId( _DataViewsViewConfig, 'dataviews-view-config-dropdown' ); const activeLayout = VIEW_LAYOUTS.find( ( layout ) => layout.type === view.type ); const isModified = typeof onReset === 'function'; return ( { return (
); } } renderContent={ () => ( { __( 'Appearance' ) } { !! activeLayout?.viewConfigOptions && ( ) } ) } /> ); } function _DataViewsViewConfig() { return ( <> ); } const DataViewsViewConfig = memo( _DataViewsViewConfig ); export default DataViewsViewConfig;