tanstak-table: add select all, change listner area for select checkbox
This commit is contained in:
@@ -199,22 +199,6 @@ export default function TanstakFilesTable({ fileType }: { fileType: string }) {
|
|||||||
placeholderData: (previousData) => previousData // для оптимистичных обновлений
|
placeholderData: (previousData) => previousData // для оптимистичных обновлений
|
||||||
});
|
});
|
||||||
|
|
||||||
const {
|
|
||||||
data: referralLink
|
|
||||||
} = useQuery({
|
|
||||||
queryKey: ['referralUserStats'],
|
|
||||||
queryFn: () => {
|
|
||||||
return fetchReferralUserStats();
|
|
||||||
},
|
|
||||||
select: (data) => {
|
|
||||||
if (data?.referralLink) {
|
|
||||||
return data?.referralLink;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
// Данные для таблицы
|
// Данные для таблицы
|
||||||
@@ -276,26 +260,63 @@ export default function TanstakFilesTable({ fileType }: { fileType: string }) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const selectAllHandler = useCallback(() => {
|
||||||
|
if (!apiResponse?.items?.length) return;
|
||||||
|
|
||||||
|
setSelectedFiles((prev) => {
|
||||||
|
const allIds = new Set(apiResponse.items.map(item => item.id));
|
||||||
|
|
||||||
|
const isAllSelected = Array.from(allIds).every(id => prev.has(id));
|
||||||
|
|
||||||
|
if (isAllSelected) {
|
||||||
|
const newSet = new Set(prev);
|
||||||
|
allIds.forEach(id => newSet.delete(id));
|
||||||
|
return newSet;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
return new Set([...prev, ...allIds]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, [apiResponse]);
|
||||||
|
|
||||||
|
const isAllSelected = useMemo(() => {
|
||||||
|
if (!apiResponse?.items?.length) return false;
|
||||||
|
const allIds = new Set(apiResponse.items.map(item => item.id));
|
||||||
|
return Array.from(allIds).every(id => selectedFiles.has(id));
|
||||||
|
}, [apiResponse, selectedFiles]);
|
||||||
|
|
||||||
// Определение колонок
|
// Определение колонок
|
||||||
const columns = useMemo<ColumnDef<FileItem>[]>(
|
const columns = useMemo<ColumnDef<FileItem>[]>(
|
||||||
() => [
|
() => [
|
||||||
{
|
{
|
||||||
accessorKey: 'selectd',
|
accessorKey: 'selectd',
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<div className="column">
|
<div
|
||||||
|
className="column"
|
||||||
|
onClick={() => {
|
||||||
|
selectAllHandler();
|
||||||
|
}}
|
||||||
|
>
|
||||||
<span>
|
<span>
|
||||||
|
<button
|
||||||
|
className={`table-item-checkbox ${isAllSelected ? 'selected' : ''}`}
|
||||||
|
>
|
||||||
|
{isAllSelected && <IconCheck />}
|
||||||
|
</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
return (
|
return (
|
||||||
<div className="text-center table-item table-item-id">
|
<div
|
||||||
<button
|
className="text-center table-item table-item-id"
|
||||||
className={`table-item-checkbox ${selectedFiles.has(row.original.id) ? 'selected' : ''}`}
|
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
selectHandler(row.original.id);
|
selectHandler(row.original.id);
|
||||||
}}
|
}}
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
className={`table-item-checkbox ${selectedFiles.has(row.original.id) ? 'selected' : ''}`}
|
||||||
>
|
>
|
||||||
{selectedFiles.has(row.original.id) && (
|
{selectedFiles.has(row.original.id) && (
|
||||||
<IconCheck />
|
<IconCheck />
|
||||||
@@ -557,7 +578,7 @@ export default function TanstakFilesTable({ fileType }: { fileType: string }) {
|
|||||||
enableColumnFilter: false,
|
enableColumnFilter: false,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[viewport.device, selectedFiles]
|
[viewport.device, selectedFiles, selectAllHandler]
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleView = async (file: FileItem) => {
|
const handleView = async (file: FileItem) => {
|
||||||
|
|||||||
@@ -785,6 +785,14 @@
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|
||||||
|
&:has(.table-item-checkbox) {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.column {
|
||||||
|
padding: 15px 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.column {
|
.column {
|
||||||
@@ -844,6 +852,14 @@
|
|||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&:has(.table-item-checkbox) {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.table-item {
|
||||||
|
padding: 15px 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-item {
|
.table-item {
|
||||||
|
|||||||
Reference in New Issue
Block a user