import { isMobileLayout, useAdaptiveLayout } from '@cloud-ru/ds-adaptive'; import { Button } from '@cloud-ru/ds-button'; import { ChipChoiceRow, FiltersState } from '@cloud-ru/ds-chips'; import { UpdateSVG } from '@cloud-ru/ds-icons/interface/system'; import { useThemeClassnames } from '@cloud-ru/ds-theme'; import { extractSupportProps } from '@cloud-ru/ds-utils'; import cn from 'classnames'; import { useMemo, useRef } from 'react'; import { BulkActions, DataView, FilterButton, MoreActions, Search, Separator } from '../../helperComponents'; import { toolbarLocale } from '../../locale'; import { TEST_IDS } from '../../testIds'; import { extractBulkActionsProps, isBulkActionsProps } from './helpers'; import { useFilters, usePersistState } from './hooks'; import styles from './styles.module.scss'; import { ToolbarProps } from './types'; import { buildMobileOverflowActions } from './utils/buildMobileOverflowActions'; export function Toolbar>({ className, after, dataView, outline = true, moreActions, onRefresh, search, filterRow: filterRowProps, persist, ...rest }: ToolbarProps) { const { layoutType } = useAdaptiveLayout(); const { t } = toolbarLocale.useTranslations(); const supportProps = extractSupportProps(rest); const needsBulkActions = isBulkActionsProps(rest); const isMobile = isMobileLayout(layoutType); const containerWrapperRef = useRef(null); const { filterButton, filterRow } = useFilters({ filterRow: filterRowProps }); usePersistState({ persist, filter: filterRow?.value, search: search?.value }); const mobileOverflowActions = useMemo( () => isMobile ? buildMobileOverflowActions({ onRefresh, after, moreActions, refreshLabel: t('refresh'), }) : undefined, [isMobile, onRefresh, after, moreActions, t], ); const effectiveMoreActions = isMobile ? mobileOverflowActions : moreActions; const showMoreActionsMenu = Boolean(effectiveMoreActions?.length); const showRefreshButton = Boolean(onRefresh) && !isMobile; const showAfterSlot = Boolean(after) && !isMobile; const hasLeftSideElements = showRefreshButton; const showDataView = Boolean(dataView?.show); const hasRightSideElements = Boolean(showAfterSlot || showDataView || showMoreActionsMenu || filterRowProps); const showSeparatorAfterExtra = Boolean(showAfterSlot && (showDataView || filterButton || showMoreActionsMenu)); // Фиксируем density, остальные оси (colorScheme/brand/…) наследуем из контекста темы. const themeClassName = useThemeClassnames({ density: isMobile ? 'comfort' : 'compact' }); return (
{outline &&
}
{hasLeftSideElements && (
)} {hasLeftSideElements && }
{search && }
{hasRightSideElements && ( <> {showAfterSlot && (
{after}
)} {showSeparatorAfterExtra && } {showDataView && dataView && (
)} {filterButton && (
)} {showMoreActionsMenu && effectiveMoreActions && (
)} )}
{filterRow && {...filterRow} size='s' data-test-id={TEST_IDS.filterRow} />} {needsBulkActions && ( )}
); }