/**
* 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 (
);
}
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 (
{ isModified && (
) }
);
} }
renderContent={ () => (
{ __( 'Appearance' ) }
{ !! activeLayout?.viewConfigOptions && (
) }
) }
/>
);
}
function _DataViewsViewConfig() {
return (
<>
>
);
}
const DataViewsViewConfig = memo( _DataViewsViewConfig );
export default DataViewsViewConfig;