2026-08-06 17:44:49 +03:00

185 lines
5.6 KiB
JavaScript

import { Divider, IconButton, Stack, Tooltip } from '@mui/material';
import { useEffect, useState } from 'react';
import { FORM_TYPE_OPTIONS } from '../../../constants/constants';
import { exportSheet, exportSheetProject } from '../../../utils/exportFile';
import { ExportDefaultButton } from '../../common/Buttons/ButtonsActions';
import CollapsibleTree from '../../common/CollapsibleTree';
import SearchComponent from '../../common/SearchComponent';
import { AddLine, Minus, Pin, Plus, Program, Project, RemoveLine, Search } from '../../common/icons/icons';
import { GroupByObject } from './GroupByObject/GroupByObject';
import { Panel } from './SettingPanel.style';
import ValidationErrorsAlert from './ValidationErrorsAlert';
import ZoomSlider from './ZoomSlider';
const SettingPanel = ({
selectedColumnId,
columnPinning,
table,
columns,
onPinColumn,
onUnpinColumn,
onToggleColumnVisibility,
columnVisibility,
onChangeSizeMult,
onGlobalFilterChange,
sizeMult,
onChangeShowColumnFilters,
onAddRow,
onAddProgram,
onAddProject,
onDeleteRow,
isLoadingData,
formId,
sheetName,
direction,
year,
isProject,
formType,
validationErrors = [],
onNavigateToColumn,
}) => {
const [isPinned, setIsPinned] = useState(false);
const [isExporting, setIsExporting] = useState(false);
const [selectedColumnIds, setSelectedColumnIds] = useState();
const [showColumnFilters, setShowColumnFilters] = useState(false);
useEffect(() => {
if (!selectedColumnId) {
setIsPinned(false);
return;
}
const pinningColumn = columnPinning?.left || table.getState().columnPinning.left || [];
const pinned = pinningColumn.includes(selectedColumnId);
setIsPinned(pinned);
}, [selectedColumnId, columnPinning, table]);
useEffect(() => {
setSelectedColumnIds(Object.keys(columnVisibility).filter((key) => !columnVisibility[key]));
}, [columnVisibility]);
//TO DO: сделать
const { addColorForCells } = {};
const handleChangeShowColumnFilters = () => {
const show = table.getState().showColumnFilters;
setShowColumnFilters(!show);
onChangeShowColumnFilters(!show);
};
const handleExport = async () => {
if (isExporting) return;
if (isProject) {
if (!formId || !sheetName || !year) return;
setIsExporting(true);
await exportSheetProject(formId, sheetName, year);
setIsExporting(false);
return;
}
if (!formId || !sheetName) return;
setIsExporting(true);
await exportSheet(formId, sheetName, direction);
setIsExporting(false);
};
return (
<>
<Panel data-pin-panel>
<Stack direction='row' sx={{ gap: '1.25rem' }}>
<GroupByObject title='Отображение'>
{/* <ColorPickerButton onColorApply={addColorForCells} /> */}
<Tooltip title='Закрепить область'>
<IconButton
variant='outlined'
data-active={isPinned}
disabled={!selectedColumnId}
onMouseDown={(e) => e.stopPropagation()}
onClick={() => {
if (!selectedColumnId) {
console.warn('[ColumnPin] клик Pin: selectedColumnId пустой');
return;
}
isPinned ? onUnpinColumn?.(selectedColumnId) : onPinColumn?.(selectedColumnId);
}}>
<Pin />
</IconButton>
</Tooltip>
</GroupByObject>
{!isProject && (
<>
<Divider orientation='vertical' flexItem />
<GroupByObject title='Строки'>
<Tooltip title='Добавить строку'>
<IconButton onClick={onAddRow} variant='outlined'>
<Plus />
<AddLine />
</IconButton>
</Tooltip>
<Tooltip title='Удалить строку'>
<IconButton onClick={onDeleteRow} variant='outlined'>
<Minus />
<RemoveLine />
</IconButton>
</Tooltip>
{/* проверяем на 4 форму */}
{formType == FORM_TYPE_OPTIONS[3] && (
<>
<Tooltip title='Добавить программу'>
<IconButton onClick={onAddProgram} variant='outlined'>
<Plus />
<Program />
</IconButton>
</Tooltip>
<Tooltip title='Добавить проект'>
<IconButton onClick={onAddProject} variant='outlined'>
<Plus />
<Project />
</IconButton>
</Tooltip>
</>
)}
</GroupByObject>
</>
)}
<Divider orientation='vertical' flexItem />
<GroupByObject title='Столбцы'>
{columns ? (
<CollapsibleTree columnTree={columns} onSelectNode={onToggleColumnVisibility} selectedIds={selectedColumnIds} />
) : (
''
)}
</GroupByObject>
<Divider orientation='vertical' flexItem />
<ZoomSlider onChange={onChangeSizeMult} curScale={sizeMult} />
<Divider orientation='vertical' flexItem />
<GroupByObject title='Поиск'>
<SearchComponent onChange={onGlobalFilterChange} height='2.5rem' />
<Tooltip title='Поиск по колонкам'>
<IconButton variant='outlined' color='success' data-active={showColumnFilters} onClick={handleChangeShowColumnFilters}>
<Search />
</IconButton>
</Tooltip>
</GroupByObject>
<Divider orientation='vertical' flexItem />
<GroupByObject title='Экспорт'>
<ExportDefaultButton
onClick={handleExport}
disabled={!formId || !sheetName || isExporting}
text={isExporting ? 'Экспорт...' : 'Экспорт'}
/>
</GroupByObject>
</Stack>
<ValidationErrorsAlert errors={validationErrors} onNavigateToColumn={onNavigateToColumn} />
</Panel>
</>
);
};
export default SettingPanel;