Загрузка данных
import React from 'react';
import { Icon } from '@uikit/Icon';
import { BUTTON_MORE_ROW_KEY } from '@widgets/TradingResult/components/Repo/constants';
import { LoadMoreButton } from '@widgets/TradingResult/components/Repo/repo-table/component/loadMoreButton';
import { DataInfoByGroup } from '@widgets/TradingResult/components/Repo/repo-table/logic/table/useLoadGroupSubRowsData';
import { GroupFiltersStruct } from '@widgets/TradingResult/components/Repo/types/group';
import { Group } from 'types/MonitorRepo';
import repoTableStyles from '../styles/repoTable.module.scss';
export const createInitialGroupFilters = (record: any): GroupFiltersStruct => {
const initialGroupFilters = Object.keys(record.rowData)?.reduce((acc, dataKey) => {
const dataValue = record.rowData[dataKey];
const isObject = typeof dataValue === 'object' && !Array.isArray(dataValue);
if (isObject) {
const groupValue = record.key;
const filterName = dataKey;
const filterValue = record.rowData?.[filterName]?.value;
return {
...acc,
[groupValue]: {
...acc?.[groupValue],
[filterName]: filterValue,
},
};
}
return acc;
}, {} as GroupFiltersStruct);
return initialGroupFilters as GroupFiltersStruct;
};
export const ExpandIcon = ({ onExpand, record }: any) =>
record.children && (
<div
className={repoTableStyles.expandIconWrapper}
onClick={(e: React.MouseEvent<HTMLElement>) => onExpand(record, e)}
>
<Icon variant="chevron-down" />
</div>
);
export const unifyGroupAndChildrenRows = (
groupSubRowsData: Record<string, DataInfoByGroup>,
groupsData: any[] | Record<string, any>[],
buttonMargin: number,
loadMore: (groupValue: string) => Promise<void>,
) => {
// ищем значения групп по которым существуют данные подстрок
const groupValues = Object.keys(groupSubRowsData);
if (groupValues.length === 0) {
return groupsData;
}
groupValues?.forEach((groupValue) => {
const searchedGroup = groupsData?.find((groupData: any) => groupData.key === groupValue);
if (searchedGroup) {
const isEmptyChildrenRows = groupSubRowsData?.[groupValue]?.data?.length === 0;
const loadedRowsNumber = (groupSubRowsData?.[groupValue]?.page + 1) * groupSubRowsData?.[groupValue]?.size;
const itemsCount = groupSubRowsData?.[groupValue]?.data?.length;
const totalValues = groupSubRowsData?.[groupValue]?.total || 0;
// подгруженные данные репо по группировке заносим в общую структуру групп как children
searchedGroup.children = [
...groupSubRowsData[groupValue]?.data,
{
key: `${BUTTON_MORE_ROW_KEY}${groupValue}`,
forceToSort: true,
secId: (
<LoadMoreButton
styles={{ marginLeft: buttonMargin }}
onClick={() => loadMore(groupValue)}
loaded={!isEmptyChildrenRows ? Math.min(loadedRowsNumber, totalValues, itemsCount) : 0}
shouldDisplayButton={itemsCount === loadedRowsNumber}
total={!isEmptyChildrenRows ? totalValues || loadedRowsNumber : 0}
/>
),
},
];
}
});
return [...(groupsData || [])];
};
/** Обновляем только пересчитываемые значения */
export const refreshRowAggValues = (oldGroup: Group, newGroup: Group): Group => {
const valuesToNeedRefresh = ['aggPrice', 'aggQuantity', 'aggAccint', 'aggValue', 'aggRepoRate', 'aggRepoValue'];
let refreshRow = oldGroup;
for (const key of Object.keys(refreshRow)) {
const typedKey = key as keyof Group;
if (valuesToNeedRefresh.includes(typedKey)) {
const refreshedValue = newGroup[typedKey];
refreshRow = { ...refreshRow, [typedKey]: refreshedValue };
}
}
return refreshRow;
};