import { Divider, IconButton, Stack, Tooltip } from '@mui/material'; import { memo, useCallback, useMemo, useState } from 'react'; import { FORM_TYPE_OPTIONS } from '../../../constants/constants'; import { exportSheet, exportSheetProject } from '../../../utils/exportFile'; import { stageColumnsHiddenFromPicker } from '../../Stages/constants'; import { ExportDefaultButton } from '../../common/Buttons/ButtonsActions'; import CollapsibleTree from '../../common/CollapsibleTree'; import SearchComponent from '../../common/SearchComponent'; import { AddLine, AllStageColumns, CurrentStageColumns, HiddenExpenseItems, Minus, Pin, Plus, Program, Project, RemoveLine, Search, VisibleExpenseItems, } from '../../common/icons/icons'; import { collectLeafColumns } from '../utils/columnUtils'; import { GroupByObject } from './GroupByObject/GroupByObject'; import { Panel } from './SettingPanel.style'; import ValidationErrorsAlert from './ValidationErrorsAlert'; import ZoomSlider from './ZoomSlider'; const controlSx = { minHeight: '2.5rem', flex: '0 0 2.5rem', }; const searchSx = { height: '2.5rem' }; const searchNavigationSx = { display: 'inline-flex', alignItems: 'center', height: '2rem', border: '1px solid rgba(0, 0, 0, 0.12)', borderRadius: '0.4rem', overflow: 'hidden', backgroundColor: '#fff', }; const searchNavigationButtonSx = { width: '1.65rem', height: '2rem', minWidth: '1.65rem', padding: 0, borderRadius: 0, fontSize: '0.95rem', }; const searchMatchCounterSx = { minWidth: '2.7rem', padding: '0 0.3rem', fontSize: '0.7rem', lineHeight: 1, textAlign: 'center', whiteSpace: 'nowrap', color: 'rgba(0, 0, 0, 0.65)', }; const exportButtonSx = { height: '2.5rem', minHeight: '2.5rem' }; const SettingPanel = ({ selectedColumnId, columnPinning, columns, onPinColumn, onUnpinColumn, onToggleColumnVisibility, onSetColumnsVisibility, columnVisibility, columnsCurStage, onChangeSizeMult, onGlobalFilterChange, globalFilter, onSearchKeyDown, onSearchNext, onSearchPrevious, searchMatchCount, searchMatchIndex, sizeMult, onChangeShowColumnFilters, showColumnFilters, onAddRow, onAddProgram, onAddProject, onDeleteRow, formId, sheetName, direction, year, isFormNoCanAddRow, canModifyRows, formType, validationErrors = [], onNavigateToColumn, expenseItemsVisibilityAction, onToggleDepthVisibility, }) => { const [isExporting, setIsExporting] = useState(false); const isPinned = useMemo( () => Boolean(selectedColumnId && columnPinning?.left?.includes(selectedColumnId)), [columnPinning, selectedColumnId], ); const selectedColumnIds = useMemo(() => Object.keys(columnVisibility).filter((key) => !columnVisibility[key]), [columnVisibility]); const handleChangeShowColumnFilters = useCallback(() => { onChangeShowColumnFilters(!showColumnFilters); }, [onChangeShowColumnFilters, showColumnFilters]); const handleExport = useCallback(async () => { if (isExporting) return; if (!formId || !sheetName || (formType === 'PROJECT' && !year)) return; setIsExporting(true); try { if (formType === 'PROJECT') { await exportSheetProject(formId, sheetName, year); } else { await exportSheet(formId, sheetName, direction); } } finally { setIsExporting(false); } }, [direction, formId, formType, isExporting, sheetName, year]); const handleTogglePin = useCallback(() => { if (!selectedColumnId) return; isPinned ? onUnpinColumn?.(selectedColumnId) : onPinColumn?.(selectedColumnId); }, [isPinned, onPinColumn, onUnpinColumn, selectedColumnId]); const leafColumns = useMemo(() => collectLeafColumns({ columns }), [columns]); const stageColumnIds = useMemo(() => new Set([...stageColumnsHiddenFromPicker, ...(columnsCurStage || [])]), [columnsCurStage]); const showOnlyCurrentStageColumns = useMemo(() => { if (!columnsCurStage?.length || !leafColumns.length) return false; return leafColumns.every((column) => stageColumnIds.has(column.id) ? columnVisibility[column.id] !== false : columnVisibility[column.id] === false, ); }, [columnVisibility, columnsCurStage, leafColumns, stageColumnIds]); const handleToggleCurrentStageColumns = useCallback(() => { if (!columnsCurStage?.length) { console.warn('Нет столбцов для текущего этапа'); return; } const visibilityByColumnId = {}; for (const column of leafColumns) { visibilityByColumnId[column.id] = showOnlyCurrentStageColumns || stageColumnIds.has(column.id); } onSetColumnsVisibility(visibilityByColumnId); }, [columnsCurStage, leafColumns, onSetColumnsVisibility, showOnlyCurrentStageColumns, stageColumnIds]); const handleSetAllColumnsVisibility = useCallback( (columnIds, isVisible) => { const visibilityByColumnId = Object.fromEntries(columnIds.map((columnId) => [columnId, isVisible])); onSetColumnsVisibility(visibilityByColumnId); }, [onSetColumnsVisibility], ); return ( <> {/* */} e.stopPropagation()} onClick={handleTogglePin}> {!isFormNoCanAddRow && canModifyRows && ( <> {/* проверяем на 4 форму */} {formType === FORM_TYPE_OPTIONS[2] && ( <> )} )} {expenseItemsVisibilityAction === 'show' ? : } {columns ? ( ) : ( '' )} {showOnlyCurrentStageColumns ? : } {searchMatchCount ? `${Math.max(searchMatchIndex + 1, 1)}/${searchMatchCount}` : '0/0'} ); }; export default memo(SettingPanel);