Compare commits
No commits in common. "b23f2d0d1c1414c58c0299b23d1d060bc35df1fc" and "17b848bd397c23828e7454bfab9b316a5d65ee17" have entirely different histories.
b23f2d0d1c
...
17b848bd39
@ -1,51 +1,3 @@
|
|||||||
// Получение 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 [];
|
||||||
|
|||||||
@ -23,7 +23,6 @@ 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';
|
||||||
@ -224,7 +223,6 @@ export const AddStagesModal = ({
|
|||||||
|
|
||||||
<CollapsibleTree
|
<CollapsibleTree
|
||||||
columnTree={columnTree}
|
columnTree={columnTree}
|
||||||
excludeColumnKeys={stageColumnsHiddenFromPicker}
|
|
||||||
placeholder="Выбрать столбцы"
|
placeholder="Выбрать столбцы"
|
||||||
placeholderSelect="Выбрано столбцов: "
|
placeholderSelect="Выбрано столбцов: "
|
||||||
selectedIds={selectedColumns}
|
selectedIds={selectedColumns}
|
||||||
|
|||||||
@ -1,8 +0,0 @@
|
|||||||
// Колонки, которые не показываются при выборе колонок этапа
|
|
||||||
export const stageColumnsHiddenFromPicker = [
|
|
||||||
'data.header.section',
|
|
||||||
'data.header.item_id',
|
|
||||||
'data.header.num_group',
|
|
||||||
'data.header.name',
|
|
||||||
'data.header.internal_order',
|
|
||||||
];
|
|
||||||
@ -14,11 +14,9 @@ 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 = [],
|
||||||
@ -33,22 +31,12 @@ 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 visibleColumnTree) {
|
for (const col of columnTree) {
|
||||||
onSelectNode?.(col, !isSelected);
|
onSelectNode?.(col, !isSelected);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -146,8 +134,8 @@ const CollapsibleTree = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const treeElements = useMemo(() => {
|
const treeElements = useMemo(() => {
|
||||||
return visibleColumnTree.length > 0 ? renderTree(visibleColumnTree) : null;
|
return columnTree ? renderTree(columnTree) : null;
|
||||||
}, [visibleColumnTree, selectedNodes]);
|
}, [columnTree, selectedNodes]);
|
||||||
|
|
||||||
const handleOpen = (event) => {
|
const handleOpen = (event) => {
|
||||||
setAnchorEl(event.currentTarget);
|
setAnchorEl(event.currentTarget);
|
||||||
@ -157,15 +145,12 @@ const CollapsibleTree = ({
|
|||||||
setAnchorEl(null);
|
setAnchorEl(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
const visibleSelectedCount = selectedNodes.filter((id) =>
|
const selectedCount = forStage ? selectedNodes.length : selectedNodes.length - 1; //1 колонка всегда скрыта
|
||||||
visibleLeafKeys.includes(id),
|
|
||||||
).length;
|
|
||||||
const selectedCount = forStage ? visibleSelectedCount : visibleSelectedCount - 1; //1 колонка всегда скрыта
|
|
||||||
|
|
||||||
const isAllSelected = () => {
|
const isAllSelected = () => {
|
||||||
if (!visibleColumnTree.length) return false;
|
if (!columnTree) return false;
|
||||||
let isSelect = true;
|
let isSelect = true;
|
||||||
for (const col of visibleColumnTree) {
|
for (const col of columnTree) {
|
||||||
const isChecked = isNodeChecked(col);
|
const isChecked = isNodeChecked(col);
|
||||||
isSelect = isChecked === 'indeterminate' ? false : isChecked && isSelect;
|
isSelect = isChecked === 'indeterminate' ? false : isChecked && isSelect;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user