Compare commits

...

3 Commits

4 changed files with 79 additions and 6 deletions

View File

@ -1,3 +1,51 @@
// Получение accessorKey колонки
export const getColumnKey = (node) => node?.accessorKey;
// Проверка, нужно ли скрыть колонку из дерева
export const shouldExcludeFromTree = (node, excludeSet) => {
if (node?.hideInTree) return true;
const key = getColumnKey(node);
return Boolean(key && excludeSet.has(key));
};
// Фильтрация дерева колонок по списку исключений
export const filterColumnTree = (nodes, excludeColumnKeys = []) => {
if (!nodes?.length) return [];
const excludeSet = new Set(excludeColumnKeys);
return nodes.flatMap((node) => {
if (shouldExcludeFromTree(node, excludeSet)) return [];
const hasChildren = Array.isArray(node.columns) && node.columns.length > 0;
if (!hasChildren) return [node];
const filteredChildren = filterColumnTree(node.columns, excludeColumnKeys);
if (filteredChildren.length === 0) return [];
return [{ ...node, columns: filteredChildren }];
});
};
// Получение accessorKey всех листовых колонок из дерева
export const getColumnTreeLeafKeys = (nodes) => {
const keys = [];
const collect = (cols) => {
for (const col of cols) {
if (col.columns?.length) {
collect(col.columns);
} else {
const key = getColumnKey(col);
if (key) keys.push(key);
}
}
};
collect(nodes);
return keys;
};
// Сбор листовых колонок // Сбор листовых колонок
export const getLeafColumns = (targetColumn) => { export const getLeafColumns = (targetColumn) => {
if (!targetColumn) return []; if (!targetColumn) return [];

View File

@ -23,6 +23,7 @@ import { Cancel } from '../common/icons/icons';
import { getStageStatus, getStatusColors } from './StagesTable/utils'; import { getStageStatus, getStatusColors } from './StagesTable/utils';
import { StageStatusChip } from './StageStatusChip'; import { StageStatusChip } from './StageStatusChip';
import { formatDateForApi } from '../../utils/formatDate'; import { formatDateForApi } from '../../utils/formatDate';
import { stageColumnsHiddenFromPicker } from './constants';
import CollapsibleTree from '../common/CollapsibleTree'; import CollapsibleTree from '../common/CollapsibleTree';
import { collectLeafColumns } from '../RealtimeTable/utils/columnUtils'; import { collectLeafColumns } from '../RealtimeTable/utils/columnUtils';
import { STAGE_ROLE_RUSSIAN_NAME } from '../../constants/constants'; import { STAGE_ROLE_RUSSIAN_NAME } from '../../constants/constants';
@ -223,6 +224,7 @@ export const AddStagesModal = ({
<CollapsibleTree <CollapsibleTree
columnTree={columnTree} columnTree={columnTree}
excludeColumnKeys={stageColumnsHiddenFromPicker}
placeholder="Выбрать столбцы" placeholder="Выбрать столбцы"
placeholderSelect="Выбрано столбцов: " placeholderSelect="Выбрано столбцов: "
selectedIds={selectedColumns} selectedIds={selectedColumns}

View File

@ -0,0 +1,8 @@
// Колонки, которые не показываются при выборе колонок этапа
export const stageColumnsHiddenFromPicker = [
'data.header.section',
'data.header.item_id',
'data.header.num_group',
'data.header.name',
'data.header.internal_order',
];

View File

@ -14,9 +14,11 @@ import {
CheckBox, CheckBox,
IndeterminateCheckBox, IndeterminateCheckBox,
} from '@mui/icons-material'; } from '@mui/icons-material';
import { filterColumnTree, getColumnTreeLeafKeys } from '../RealtimeTable/utils/columnUtils';
const CollapsibleTree = ({ const CollapsibleTree = ({
columnTree, columnTree,
excludeColumnKeys = [],
placeholder = 'Скрыть столбцы', placeholder = 'Скрыть столбцы',
placeholderSelect = 'Скрыто столбцов: ', placeholderSelect = 'Скрыто столбцов: ',
selectedIds = [], selectedIds = [],
@ -31,12 +33,22 @@ const CollapsibleTree = ({
setSelectedNodes(selectedIds); setSelectedNodes(selectedIds);
}, [selectedIds]); }, [selectedIds]);
const visibleColumnTree = useMemo(
() => filterColumnTree(columnTree, excludeColumnKeys),
[columnTree, excludeColumnKeys],
);
const visibleLeafKeys = useMemo(
() => getColumnTreeLeafKeys(visibleColumnTree),
[visibleColumnTree],
);
const handleExpandedItemsChange = (event, itemIds) => { const handleExpandedItemsChange = (event, itemIds) => {
setExpandedItems(itemIds); setExpandedItems(itemIds);
}; };
const handleSelectAll = (isSelected) => { const handleSelectAll = (isSelected) => {
for (const col of columnTree) { for (const col of visibleColumnTree) {
onSelectNode?.(col, !isSelected); onSelectNode?.(col, !isSelected);
} }
}; };
@ -134,8 +146,8 @@ const CollapsibleTree = ({
}; };
const treeElements = useMemo(() => { const treeElements = useMemo(() => {
return columnTree ? renderTree(columnTree) : null; return visibleColumnTree.length > 0 ? renderTree(visibleColumnTree) : null;
}, [columnTree, selectedNodes]); }, [visibleColumnTree, selectedNodes]);
const handleOpen = (event) => { const handleOpen = (event) => {
setAnchorEl(event.currentTarget); setAnchorEl(event.currentTarget);
@ -145,12 +157,15 @@ const CollapsibleTree = ({
setAnchorEl(null); setAnchorEl(null);
}; };
const selectedCount = forStage ? selectedNodes.length : selectedNodes.length - 1; //1 колонка всегда скрыта const visibleSelectedCount = selectedNodes.filter((id) =>
visibleLeafKeys.includes(id),
).length;
const selectedCount = forStage ? visibleSelectedCount : visibleSelectedCount - 1; //1 колонка всегда скрыта
const isAllSelected = () => { const isAllSelected = () => {
if (!columnTree) return false; if (!visibleColumnTree.length) return false;
let isSelect = true; let isSelect = true;
for (const col of columnTree) { for (const col of visibleColumnTree) {
const isChecked = isNodeChecked(col); const isChecked = isNodeChecked(col);
isSelect = isChecked === 'indeterminate' ? false : isChecked && isSelect; isSelect = isChecked === 'indeterminate' ? false : isChecked && isSelect;
} }