tanstak-table: add select all, change listner area for select checkbox

This commit is contained in:
smanylov
2026-04-01 13:34:50 +07:00
parent 45c5137565
commit 1d5925e178
2 changed files with 60 additions and 23 deletions
@@ -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
className="text-center table-item table-item-id"
onClick={() => {
selectHandler(row.original.id);
}}
>
<button <button
className={`table-item-checkbox ${selectedFiles.has(row.original.id) ? 'selected' : ''}`} className={`table-item-checkbox ${selectedFiles.has(row.original.id) ? 'selected' : ''}`}
onClick={() => {
selectHandler(row.original.id);
}}
> >
{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) => {
+16
View File
@@ -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 {