Загрузка данных
import { NothingFoundBox } from '@/components/UI/NothingFoundBox';
import { DeleteTypeModal } from '@/features/Settings/modals';
import {
UpdateControllerTypeDrawer,
UpdateDeviceTypeDrawer,
UpdatePadletTypeDrawer,
} from '@/features/drawers';
import { DEFAULT_TABLE_PAGINATION_LIMIT } from '@/shared/consts/constants';
import { Helpers } from '@/shared/lib';
import { Edit2Icon, Trash2Icon } from '@sber-friend/flamingo-icons';
import {
Box,
ColumnsProps,
IconButton,
Loader,
PaginationWithInput,
Row,
SortTypeDropdown,
Table,
} from '@shared/components';
import { SettingsPageTypes } from '@widgets/Settings/types';
import { useTranslation } from 'react-i18next';
import { useTypeTableState } from '../controller';
type Props = {
pageType: SettingsPageTypes;
searchName?: string;
};
export const TypeTable = ({ pageType, searchName }: Props) => {
const { t } = useTranslation('common');
const {
types,
count,
isDataFetching,
page,
sortType,
handleSwitchBackPage,
handleSortTypeChange,
handleOpenDeleteModal,
handleOpenUpdateModelDrawer,
isActionsVisible,
onPageChange,
customPageValue,
setCustomPageValue,
applyCustomPage,
type,
isDeleteModalOpen,
setIsDeleteModalOpen,
} = useTypeTableState({ pageType, searchName });
const columns: ColumnsProps[] = [
{
field: 'name',
headerName: t('type'),
icon: (
<SortTypeDropdown sortType={sortType} onChange={handleSortTypeChange} />
),
visibleIcon: true,
},
{
field: 'actions',
headerName: t('actions'),
width: 100,
},
];
const dataWithActions =
types.get(pageType)?.map((type) => ({
...type,
id: type.id ?? '',
actions: isActionsVisible(type) ? (
<Row>
<IconButton
variant='square'
size='small'
contained
onClick={() => {
handleOpenUpdateModelDrawer(type);
}}
>
<Edit2Icon />
</IconButton>
<IconButton
variant='square'
size='small'
contained
onClick={() => {
console.log(123123)
handleOpenDeleteModal(type);
}}
>
<Trash2Icon />
</IconButton>
</Row>
) : (
<Box textAlign='center'>-</Box>
),
})) ?? [];
if (Helpers.isEmpty(types.get(pageType))) {
return <NothingFoundBox />;
}
return (
<>
{isDataFetching.get(pageType) ? (
<Loader isLoading size='large' />
) : (
<>
<Table rows={dataWithActions} columns={columns} autoColumnWidth />
<PaginationWithInput
count={count}
onChange={onPageChange}
page={page}
limit={DEFAULT_TABLE_PAGINATION_LIMIT}
customPageValue={customPageValue}
setCustomPageValue={setCustomPageValue}
applyFn={applyCustomPage}
/>
</>
)}
<DeleteTypeModal
type={type}
isOpen={isDeleteModalOpen}
setIsOpen={setIsDeleteModalOpen}
pageType={pageType}
onDelete={handleSwitchBackPage}
/>
<UpdateDeviceTypeDrawer type={type} />
<UpdateControllerTypeDrawer type={type} />
<UpdatePadletTypeDrawer type={type} />
</>
);
};
import { DEFAULT_TABLE_PAGINATION_LIMIT } from '@/shared/consts/constants';
import {
DeviceType,
SortType,
useGetControllerTypeV2Query,
useGetDeviceTypeV2Query,
useGetPadletTypesQuery,
} from '@shared/api/controller/client';
import { useSetDrawerType } from '@shared/hooks/drawer/useSetDrawerType';
import { DrawerType, DrawerTypes } from '@shared/model/drawer/drawer.types';
import { SettingsPageTypes } from '@widgets/Settings/types';
import { ChangeEvent, MouseEvent, useEffect, useState } from 'react';
const updateDrawerTypes = new Map([
[SettingsPageTypes.device, DrawerTypes.updateDeviceType],
[SettingsPageTypes.controller, DrawerTypes.updateControllerType],
[SettingsPageTypes.padlet, DrawerTypes.updatePadletType],
]);
type Props = {
pageType: SettingsPageTypes;
searchName?: string;
};
const DEFAULT_PAGE = 1;
export const useTypeTableState = ({ pageType, searchName }: Props) => {
const setDrawerType = useSetDrawerType();
const [page, setPage] = useState(DEFAULT_PAGE);
const [sortType, setSortType] = useState<SortType>('asc');
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
const [type, setType] = useState<DeviceType | undefined>(undefined);
const [customPageValue, setCustomPageValue] = useState(String(page));
const offset = page > 0 ? (page - 1) * DEFAULT_TABLE_PAGINATION_LIMIT : 0;
const handleSortTypeChange = (e: MouseEvent<HTMLElement>) => {
// @ts-ignore
setSortType(e.target.dataset.value as SortType);
};
const { data: deviceData, isFetching: isDeviceDataFetching } =
useGetDeviceTypeV2Query(
{
sortColumn: 'name',
sortType,
limit: DEFAULT_TABLE_PAGINATION_LIMIT,
offset,
name: searchName,
},
{ skip: pageType !== SettingsPageTypes.device },
);
const { data: controllerData, isFetching: isControllerDataFetching } =
useGetControllerTypeV2Query(
{
sortColumn: 'name',
sortType,
limit: DEFAULT_TABLE_PAGINATION_LIMIT,
offset,
name: searchName,
},
{ skip: pageType !== SettingsPageTypes.controller },
);
const { data: padletData, isFetching: isPadletDataFetching } =
useGetPadletTypesQuery(
{
sortColumn: 'name',
sortType,
limit: DEFAULT_TABLE_PAGINATION_LIMIT,
offset,
name: searchName,
},
{ skip: pageType !== SettingsPageTypes.padlet },
);
const deviceTypes = deviceData?.deviceTypes || [];
const controllerTypes = controllerData?.controllerTypes || [];
const padletTypes = padletData?.padletTypes || [];
const types = new Map([
[SettingsPageTypes.device, deviceTypes],
[SettingsPageTypes.controller, controllerTypes],
[SettingsPageTypes.padlet, padletTypes],
]);
const paginationCount = new Map([
[
SettingsPageTypes.device,
deviceData?.total
? Math.ceil(deviceData.total / DEFAULT_TABLE_PAGINATION_LIMIT)
: 0,
],
[
SettingsPageTypes.controller,
controllerData?.total
? Math.ceil(controllerData.total / DEFAULT_TABLE_PAGINATION_LIMIT)
: 0,
],
[
SettingsPageTypes.padlet,
padletData?.total
? Math.ceil(padletData.total / DEFAULT_TABLE_PAGINATION_LIMIT)
: 0,
],
]);
const isDataFetching = new Map([
[SettingsPageTypes.device, isDeviceDataFetching],
[SettingsPageTypes.controller, isControllerDataFetching],
[SettingsPageTypes.padlet, isPadletDataFetching],
]);
const count = paginationCount.get(pageType) || 0;
const applyCustomPage = () => {
setPage(Number(customPageValue));
};
const onPageChange = (_: ChangeEvent<unknown>, page: number) => {
setPage(page);
};
const handleResetPagination = () => {
setPage(1);
setCustomPageValue(String(1));
};
const handleSwitchBackPage = () => {
if (types?.get(pageType)?.length === 1) {
setPage((prev) => prev - 1);
setCustomPageValue((prev) => String(Number(prev) - 1));
}
};
const handleOpenUpdateModelDrawer = (type: DeviceType) => {
setType(type);
setDrawerType(updateDrawerTypes.get(pageType) as DrawerType);
};
const handleOpenDeleteModal = (type: DeviceType) => {
console.log('hit');
setType(type);
setIsDeleteModalOpen(true);
};
console.log(isDeleteModalOpen);
const isActionsVisible = (type: DeviceType): boolean => {
if (
(pageType === SettingsPageTypes.device ||
pageType === SettingsPageTypes.padlet) &&
type.pinned
) {
return false;
}
return true;
};
useEffect(() => {
setCustomPageValue(String(page));
}, [page]);
useEffect(() => {
handleResetPagination();
}, [searchName]);
return {
types,
count,
isDataFetching,
page,
sortType,
handleSwitchBackPage,
handleSortTypeChange,
handleOpenDeleteModal,
handleOpenUpdateModelDrawer,
isActionsVisible,
onPageChange,
customPageValue,
setCustomPageValue,
applyCustomPage,
type,
isDeleteModalOpen,
setIsDeleteModalOpen,
};
};