import { Button } from '@affine/admin/components/ui/button'; import { Input } from '@affine/admin/components/ui/input'; import type { FeatureType } from '@affine/graphql'; import { ExportIcon, ImportIcon, PlusIcon } from '@blocksuite/icons/rc'; import type { Table } from '@tanstack/react-table'; import { type ChangeEvent, type Dispatch, type SetStateAction, useCallback, useEffect, useState, } from 'react'; import { DiscardChanges } from '../../../components/shared/discard-changes'; import { FeatureFilterPopover } from '../../../components/shared/feature-filter-popover'; import { useDebouncedValue } from '../../../hooks/use-debounced-value'; import { useServerConfig } from '../../common'; import { useRightPanel } from '../../panel/context'; import type { UserType } from '../schema'; import { ExportUsersDialog } from './export-users-dialog'; import { ImportUsersDialog } from './import-users'; import { CreateUserForm } from './user-form'; interface DataTableToolbarProps { selectedUsers: UserType[]; table?: Table; keyword: string; onKeywordChange: Dispatch>; selectedFeatures: FeatureType[]; onFeaturesChange: Dispatch>; } export function DataTableToolbar({ selectedUsers, table, keyword, onKeywordChange, selectedFeatures, onFeaturesChange, }: DataTableToolbarProps) { const [value, setValue] = useState(keyword); const [dialogOpen, setDialogOpen] = useState(false); const [exportDialogOpen, setExportDialogOpen] = useState(false); const [importDialogOpen, setImportDialogOpen] = useState(false); const debouncedValue = useDebouncedValue(value, 500); const { setPanelContent, openPanel, closePanel, isOpen, hasDirtyChanges, setHasDirtyChanges, } = useRightPanel(); const serverConfig = useServerConfig(); const availableFeatures = serverConfig.availableUserFeatures ?? []; const handleConfirm = useCallback(() => { setPanelContent( ); if (dialogOpen) { setDialogOpen(false); } if (!isOpen) { openPanel(); } }, [ setPanelContent, closePanel, dialogOpen, isOpen, openPanel, setHasDirtyChanges, ]); useEffect(() => { setValue(keyword); }, [keyword]); useEffect(() => { onKeywordChange(debouncedValue.trim()); }, [debouncedValue, onKeywordChange]); const onValueChange = useCallback((e: ChangeEvent) => { setValue(e.currentTarget.value); }, []); const handleFeatureToggle = useCallback( (features: FeatureType[]) => { onFeaturesChange(features); }, [onFeaturesChange] ); const handleCancel = useCallback(() => { setDialogOpen(false); }, []); const handleOpenConfirm = useCallback(() => { if (hasDirtyChanges) { return setDialogOpen(true); } return handleConfirm(); }, [handleConfirm, hasDirtyChanges]); const handleExportUsers = useCallback(() => { if (!table) return; const selectedRows = table.getFilteredSelectedRowModel().rows; if (selectedRows.length === 0) { alert('Please select at least one user to export'); return; } setExportDialogOpen(true); }, [table]); const handleImportUsers = useCallback(() => { setImportDialogOpen(true); }, []); return (
{table && ( )}
); }