import { ArrowDownUp, ArrowUpDown, Check, File, Filter, Folder, Grid2x2, List, ListFilterPlus, SortDesc, Star, ZoomIn, ZoomOut, } from "lucide-react" import React from "react" import { useTranslation } from "react-i18next" import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" import { cn } from "@/lib/utils" import { ViewMode } from "@/shared/types/browser-context" // Конфигурация режимов просмотра export interface ViewModeConfig { value: ViewMode icon: React.ComponentType<{ size?: number }> label: string testId?: string } export interface MediaToolbarProps { // Состояние searchQuery: string sortBy: string sortOrder: "asc" | "desc" filterType: string viewMode: ViewMode groupBy: string availableExtensions: string[] showFavoritesOnly: boolean // Опции для сортировки sortOptions: Array<{ value: string label: string }> // Опции для группировки groupOptions: Array<{ value: string label: string }> // Опции для фильтрации (опционально, для медиа) filterOptions?: Array<{ value: string label: string }> // Доступные режимы просмотра (настраивается для каждой вкладки) availableViewModes?: ViewModeConfig[] // Колбэки onSearch: (query: string) => void onSort: (sortBy: string) => void onFilter: (filterType: string) => void onChangeOrder: () => void onChangeViewMode: (mode: ViewMode) => void onChangeGroupBy: (groupBy: string) => void onToggleFavorites: () => void // Импорт (опционально) onImportFile?: () => void onImportFolder?: () => void isImporting?: boolean // Зум (опционально, для медиа) onZoomIn?: () => void onZoomOut?: () => void canZoomIn?: boolean canZoomOut?: boolean // Настройки отображения showImport?: boolean showGroupBy?: boolean showZoom?: boolean className?: string // Дополнительные кнопки для конкретных вкладок extraButtons?: React.ReactNode } /** * Универсальный компонент тулбара для медиа и музыки * Предоставляет общую функциональность: поиск, сортировка, фильтрация, группировка */ export function MediaToolbar({ // Состояние searchQuery, sortBy, sortOrder, filterType, viewMode, groupBy, availableExtensions, showFavoritesOnly, // Опции sortOptions, groupOptions, filterOptions, availableViewModes, // Колбэки onSearch, onSort, onFilter, onChangeOrder, onChangeViewMode, onChangeGroupBy, onToggleFavorites, // Импорт onImportFile, onImportFolder, isImporting = false, // Зум onZoomIn, onZoomOut, canZoomIn = false, canZoomOut = false, // Настройки showImport = true, showGroupBy = true, showZoom = false, className, // Дополнительные кнопки extraButtons, }: MediaToolbarProps) { const { t } = useTranslation() // Дефолтные режимы просмотра (если не переданы) const defaultViewModes: ViewModeConfig[] = [ { value: "list", icon: List, label: "browser.toolbar.list", testId: "list-view-button", }, { value: "thumbnails", icon: Grid2x2, label: "browser.toolbar.thumbnails", testId: "thumbnails-view-button", }, ] // Используем переданные режимы или дефолтные const viewModes = availableViewModes || defaultViewModes const handleSearchChange = (e: React.ChangeEvent) => { onSearch(e.target.value) } return (
{/* Кнопка импорта */} {showImport && onImportFile && ( )} {/* Поле поиска */}
{/* Дополнительные кнопки для конкретных вкладок */} {extraButtons} {/* Кнопка избранного */} {t("browser.media.favorites")} {/* Кнопки режима отображения - показываем только если режимов больше одного */} {viewModes.length > 1 && (
{viewModes.map((mode, index) => { const IconComponent = mode.icon return ( {t(mode.label)} ) })}
)} {/* Dropdown сортировки */} {t("browser.toolbar.sort")} {sortOptions.map((option) => ( onSort(option.value)} >
{sortBy === option.value && } {t(option.label)}
))}
{/* Dropdown фильтрации */} {t("browser.toolbar.filter")} onFilter("all")}>
{filterType === "all" && } {t("browser.toolbar.filterBy.all")}
{/* Кастомные опции фильтров (для медиа) */} {filterOptions ? filterOptions.map((option) => ( onFilter(option.value)}>
{filterType === option.value && } {t(option.label)}
)) : /* Дефолтные фильтры по расширениям (для музыки) */ availableExtensions.map((extension) => ( onFilter(extension)}>
{filterType === extension && } {extension.toUpperCase()}
))}
{/* Dropdown группировки */} {showGroupBy && ( {t("browser.toolbar.group")} {groupOptions.map((option) => ( onChangeGroupBy(option.value)}>
{groupBy === option.value && } {t(option.label)}
))}
)} {/* Кнопки зума */} {showZoom && (
{t("browser.toolbar.zoomOut")} {t("browser.toolbar.zoomIn")}
)} {/* Кнопка изменения порядка сортировки */} {sortOrder === "asc" ? t("browser.toolbar.sortOrder.desc") : t("browser.toolbar.sortOrder.asc")}
) }